diff --git a/FIN/FIN_PAC.SRC b/FIN/FIN_PAC.SRC index e3de05fe..5c1ee2b9 100644 --- a/FIN/FIN_PAC.SRC +++ b/FIN/FIN_PAC.SRC @@ -40,6 +40,10 @@ AS FUNCTION getfactuurkostenplaats (pfactuur_key IN NUMBER) RETURN NUMBER; + FUNCTION getfiatteur (pfactuur_key IN NUMBER, + pexcludekey IN NUMBER DEFAULT NULL) + RETURN NUMBER; + FUNCTION sprintf (ps IN VARCHAR2 , p_factuur_key IN NUMBER) RETURN VARCHAR2; END fin; / @@ -904,6 +908,7 @@ AS END; -- zoek de kostenplaats van een (gekoppelde) factuur op + -- Bij voorkeur niet meer gebruiken sinds v2017.2 FUNCTION getfactuurkostenplaats (pfactuur_key IN NUMBER) RETURN NUMBER IS @@ -948,6 +953,62 @@ AS RETURN kpkey; END; + -- zoek de fiatteur van een (gekoppelde) factuur op + -- -1 als niet gevonden + FUNCTION getfiatteur (pfactuur_key IN NUMBER, + pexcludekey IN NUMBER DEFAULT NULL) + RETURN NUMBER + IS + c_key fin_factuur.cnt_contract_key%TYPE; + b_key fin_factuur.bes_bestelopdr_key%TYPE; + o_key fin_factuur.mld_opdr_key%TYPE; + ftot fin_factuur.fin_factuur_totaal%TYPE; + ftotb fin_factuur.fin_factuur_totaal_btw%TYPE; + kpkey prs_kostenplaats.prs_kostenplaats_key%TYPE; + ldisckey ins_tab_discipline.ins_discipline_key%TYPE; + kskey prs_kostensoort.prs_kostensoort_key%TYPE; + linclbtw prs_kostensoort.prs_kostensoort_btw%TYPE; + lbedrag fin_factuur.fin_factuur_totaal%TYPE; + BEGIN + SELECT mld_opdr_key, cnt_contract_key, bes_bestelopdr_key, fin_factuur_totaal, fin_factuur_totaal_btw + INTO o_key, c_key, b_key, ftot, ftotb + FROM fin_factuur + WHERE fin_factuur_key = pfactuur_key; + + CASE + WHEN b_key IS NOT NULL + THEN + SELECT MAX (b.prs_kostenplaats_key) + INTO kpkey + FROM bes_bestelopdr_item boi, bes_bestelling_item bbi, bes_bestelopdr bo, bes_bestelling b + WHERE bbi.bes_bestelling_key = b.bes_bestelling_key + AND boi.bes_bestelopdr_item_key = bbi.bes_bestelopdr_item_key + AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key + AND boi.bes_bestelopdr_key = b_key; + WHEN c_key IS NOT NULL + THEN + SELECT c.prs_kostenplaats_key + INTO kpkey + FROM cnt_contract c + WHERE cnt_contract_key = c_key; + WHEN o_key IS NOT NULL + THEN + SELECT COALESCE (o.prs_kostenplaats_key, m.prs_kostenplaats_key) + INTO kpkey + FROM mld_opdr o, mld_melding m + WHERE o.mld_melding_key = m.mld_melding_key AND mld_opdr_key = o_key; + ELSE + RETURN -1; + END CASE; + + IF linclbtw = 1 THEN + lbedrag := ftot + ftotb; + ELSE + lbedrag := ftot; + END IF; + + RETURN prs.getfiatteur(kpkey, pexcludekey, lbedrag, ldisckey); + END; FUNCTION sprintf (ps IN VARCHAR2 , p_factuur_key IN NUMBER) RETURN VARCHAR2 diff --git a/FIN/FIN_VIE.SRC b/FIN/FIN_VIE.SRC index ee82ce2b..47ac4356 100644 --- a/FIN/FIN_VIE.SRC +++ b/FIN/FIN_VIE.SRC @@ -36,7 +36,7 @@ CREATE_VIEW(fac_v_noti_finreminder,0) AS SELECT 'FININF', '', - prs.getkpverantwoordelijke (fin.getfactuurkostenplaats (f.fin_factuur_key), fac.getSetting('prs_approvemethod'), -1) budgethouder, + fin.getfiatteur(f.fin_factuur_key) budgethouder, 'Fiatteringsverzoek voor ' || COUNT (f.fin_factuur_key) || DECODE (COUNT (f.fin_factuur_key), 1, ' factuur.', ' facturen.'), @@ -45,10 +45,10 @@ AS NULL, NULL FROM fin_factuur f - WHERE prs.getkpverantwoordelijke (fin.getfactuurkostenplaats (f.fin_factuur_key), fac.getSetting('prs_approvemethod'), -1) <> -1 -- die kan ik geen bericht sturen + WHERE fin.getfiatteur(f.fin_factuur_key) <> -1 -- die kan ik geen bericht sturen AND f.fin_factuur_statuses_key = 2 AND f.fin_factuur_verwijder IS NULL - GROUP BY prs.getkpverantwoordelijke (fin.getfactuurkostenplaats (f.fin_factuur_key), fac.getSetting('prs_approvemethod'), -1); + GROUP BY fin.getfiatteur(f.fin_factuur_key); -- Vooralsnog placeholders, moeten aangepast worden CREATE_VIEW(fin_v_api_facturen, 1) AS SELECT * from fin_factuur; @@ -156,11 +156,9 @@ AS f.fin_factuur_opmerking, (SELECT p.prs_perslid_naam_full FROM prs_v_perslid_fullnames_all p - WHERE prs_perslid_key = budgethouder) + WHERE prs_perslid_key = fin.getfiatteur(f.fin_factuur_key)) budgethouder - FROM (SELECT prs.getkpverantwoordelijke (prs_kostenplaats_key, 2, -1) budgethouder, f.* - FROM (SELECT fin.getfactuurkostenplaats (f.fin_factuur_key) prs_kostenplaats_key, f.* - FROM fin_factuur f) f) f, + FROM fin_factuur f, prs_kostenplaats k, mld_opdr o, mld_melding m, @@ -172,7 +170,7 @@ AS bes_bestelopdr bo, prs_kostensoort ks, fin_factuur_statuses fs - WHERE f.prs_kostenplaats_key = k.prs_kostenplaats_key(+) + WHERE fin.getfactuurkostenplaats(f.fin_factuur_key) = k.prs_kostenplaats_key(+) AND f.prs_kostensoort_key = ks.prs_kostensoort_key(+) AND f.mld_opdr_key = o.mld_opdr_key(+) AND o.mld_melding_key = m.mld_melding_key(+) diff --git a/PRS/PRS_PAC.SRC b/PRS/PRS_PAC.SRC index 85a8eeb4..f5617482 100644 --- a/PRS/PRS_PAC.SRC +++ b/PRS/PRS_PAC.SRC @@ -66,7 +66,9 @@ END aut; /* Formatted on 3-11-2010 11:50:08 (QP5 v5.136.908.31019) */ CREATE OR REPLACE PACKAGE prs AS - FUNCTION getkpverantwoordelijke (pkostenplaats_key IN NUMBER, pmethode IN NUMBER, pexcludekey IN NUMBER) + FUNCTION getkpverantwoordelijke (pkostenplaats_key IN NUMBER, + pmethode IN NUMBER, + pexcludekey IN NUMBER) RETURN NUMBER; FUNCTION getkostenplaats (pperslid_key IN NUMBER, pmethode IN NUMBER, pexcludekey IN NUMBER) @@ -79,7 +81,6 @@ AS RETURN NUMBER; FUNCTION getfiatteur (pkostenplaats_key IN NUMBER, - pmethode IN NUMBER, pexcludekey IN NUMBER, pondergrens IN NUMBER, pdisckey IN NUMBER @@ -106,93 +107,21 @@ END prs; CREATE OR REPLACE PACKAGE BODY prs AS -- Levert de prs_perslid_key op van de budgethouder van een kostenplaats - -- Kijkt dus niet naar limiet oid, gewoon de budgethouder zoeken volgens - -- de door ons gedefinieerde regels. - -- Levert -1 op indien er geen gevonden wordt. - -- Controleert niet of de meegegeven kostenplaats nog wel actief is - -- pmethode geeft .. inderdaad, waarbij - -- methode 1 = 2-laagsmethode via kp - kpngroep - -- methode 2 = n-laagsmethode via afdelingsboom - -- Met pexcludekey kan een perslid_key worden opgegeven die je niet wilt - -- Dat leek me wel een aardige feature. Geef -1 mee als je niemand wilt excluden - FUNCTION getkpverantwoordelijke (pkostenplaats_key IN NUMBER, pmethode IN NUMBER, pexcludekey IN NUMBER) + -- Simpele versie van getfiatteur: hij negeert limieten + FUNCTION getkpverantwoordelijke (pkostenplaats_key IN NUMBER, + pmethode IN NUMBER, -- deze gebruiken we eigenlijk niet meer sinds 2017.2 + pexcludekey IN NUMBER) RETURN NUMBER IS - lkpverantwkey prs_perslid.prs_perslid_key%TYPE; - lexcludeisvervanger NUMBER; - afdkey prs_afdeling.prs_afdeling_key%TYPE; - parentafdkey prs_afdeling.prs_afdeling_parentkey%TYPE; BEGIN - BEGIN - SELECT COALESCE (prs_perslid_key, -1) - INTO lkpverantwkey - FROM prs_kostenplaats - WHERE prs_kostenplaats_key = pkostenplaats_key; - EXCEPTION - WHEN NO_DATA_FOUND - THEN - -- kostenplaats bestaat niet - RETURN -1; - END; - - -- Is de meegegeven pexcludekey wellicht een vervanger van kostenplaatsverantwoordelijke van de kostenplaats? - -- Zo ja, dan is in dat geval lkpverantwkey de pexcludekey - IF pexcludekey > 0 THEN - SELECT COUNT(prs_perslid_key) - INTO lexcludeisvervanger - FROM prs_collega - WHERE prs_perslid_key_alt = pexcludekey - AND prs_perslid_key = lkpverantwkey; - END IF; - - IF (lkpverantwkey = -1 OR lkpverantwkey = pexcludekey OR lexcludeisvervanger = 1) AND pmethode = 2 - -- doorloop de boom naar boven, met allerlei aannames - THEN - -- waar hoort deze kp bij? - BEGIN - SELECT prs_afdeling_key, prs_afdeling_parentkey - INTO afdkey, parentafdkey - FROM prs_afdeling - WHERE prs_kostenplaats_key = pkostenplaats_key AND prs_afdeling_verwijder IS NULL; - EXCEPTION - WHEN NO_DATA_FOUND - THEN - -- kp is niet aan een afdeling gerelateerd, dan weet ik het met deze methode niet - RETURN -1; - END; - - WHILE lkpverantwkey = -1 AND parentafdkey IS NOT NULL - LOOP - SELECT COALESCE (k.prs_perslid_key, -1), prs_afdeling_parentkey - INTO lkpverantwkey, parentafdkey - FROM prs_kostenplaats k, prs_afdeling a - WHERE k.prs_kostenplaats_key(+) = a.prs_kostenplaats_key - AND a.prs_afdeling_verwijder IS NULL - AND a.prs_afdeling_key = parentafdkey; - END LOOP; - -- nu heb ik er een of kan ik er geen vinden - END IF; - - -- Nu: als ik methode 1 heb, of methode 2 niemand opleverde (ondanks afdelingskostenplaats): de kpngroepverantwoordelijke - IF lkpverantwkey = -1 OR lkpverantwkey = pexcludekey OR lexcludeisvervanger = 1 - THEN - -- vindt de kostenplaatsGROEPverantwoordelijke van altijd de meegegeven kp - BEGIN - SELECT COALESCE (kg.prs_perslid_key, -1) - INTO lkpverantwkey - FROM prs_kostenplaats k, prs_kostenplaatsgrp kg - WHERE prs_kostenplaats_key = pkostenplaats_key - AND kg.prs_kostenplaatsgrp_key = k.prs_kostenplaatsgrp_key - AND kg.prs_perslid_key NOT IN (lkpverantwkey, pexcludekey); - EXCEPTION - WHEN NO_DATA_FOUND - THEN - -- er is geen kpgroep bij, of het is de excludekey - RETURN -1; - END; - END IF; - - RETURN lkpverantwkey; + IF pmethode = 3 THEN + raise_application_error (-20001, 'Cannot use prs.getkpverantwoordelijke with prs_approvemethod = 3'); + END IF; + RETURN getfiatteur (pkostenplaats_key, + pexcludekey, + NULL, + NULL + ); END; -- Levert de prs_kostenplaats_key op van de persoon volgens @@ -316,24 +245,18 @@ AS -- Levert de prs_perslid_key op van de perslid die een item (opdracht/bestelling) van -- discipline pdisckey boven bedrag pondergrens mag fiatteren -- volgens de door ons gedefinieerde regels. Werkt analoog aan getkpverantwoordelijke - -- Maar houdt hierbij rekening met de profielen van de budgethouders. - -- - -- NB: algorithme gaat binnenkort wijzigen. Levert op dit moment - -- de budgethouder (als die dat mag) of de kpgverantwoordelijke (anders) op - -- en is als zodanig ALLEEN ZINVOL bij bepaling van de EERSTE FIATTEUR - -- De evt tweede fiatteur is nl. altijd de kpgverantwoordelijke, ongeacht limiet. - -- WORDT NU DUS NOG NIET TOEGEPAST (beoogd 5.1.0) + -- Maar houdt hierbij rekening met de profielen van de budgethouders als prs_approvemethod==3 -- -- Levert de kostenplaatsgroepverantwoordelijke op indien geen goede budgethouder - -- wordt gevonden, negeert een eventueel profiel van die groepverantwoordelijke + -- wordt gevonden -- Levert -1 op indien er geen gevonden wordt. -- pmethode geeft .. inderdaad, waarbij -- methode 1 = 2-laagsmethode via kp - kpngroep -- methode 2 = n-laagsmethode via afdelingsboom + -- methode 3 = als 2 maar houd rekening met de profiel van de fiatteur -- Met pexcludekey kan een perslid_key worden opgegeven die je niet wilt - -- Dat leek me wel een aardige feature. Geef -1 mee als je niemand wilt excluden + -- Geef -1 mee als je niemand wilt excluden FUNCTION getfiatteur (pkostenplaats_key IN NUMBER, - pmethode IN NUMBER, pexcludekey IN NUMBER, pondergrens IN NUMBER, pdisckey IN NUMBER @@ -341,16 +264,38 @@ AS RETURN NUMBER IS lkpverantwkey prs_perslid.prs_perslid_key%TYPE; + lexcludeisvervanger NUMBER; lkpverantwlimiet fac_profiel.fac_profiel_limiet%TYPE; afdkey prs_afdeling.prs_afdeling_key%TYPE; parentafdkey prs_afdeling.prs_afdeling_parentkey%TYPE; + lmethode NUMBER; BEGIN - -- de eerste is makkelijk: - lkpverantwkey := prs.getkpverantwoordelijke (pkostenplaats_key, pmethode, pexcludekey); - lkpverantwlimiet := prs.getprofiellimiet (lkpverantwkey, pdisckey); + BEGIN + SELECT COALESCE (prs_perslid_key, -1) + INTO lkpverantwkey + FROM prs_kostenplaats + WHERE prs_kostenplaats_key = pkostenplaats_key; + EXCEPTION + WHEN NO_DATA_FOUND + THEN + -- kostenplaats bestaat niet + RETURN -1; + END; -/* NB: nu (nog) zoeken we NIET de boom omhoog naar hoger gelimiteerden, later misschien - IF (lkpverantwkey = -1 OR lkpverantwlimiet < pondergrens) AND pmethode = 2 + -- Is de meegegeven pexcludekey wellicht een vervanger van kostenplaatsverantwoordelijke van de kostenplaats? + -- Zo ja, dan is in dat geval lkpverantwkey de pexcludekey + IF pexcludekey > 0 THEN + SELECT COUNT(prs_perslid_key) + INTO lexcludeisvervanger + FROM prs_collega + WHERE prs_perslid_key_alt = pexcludekey + AND prs_perslid_key = lkpverantwkey; + END IF; + lmethode := fac.getSetting('prs_approvemethod'); + IF lmethode = 3 THEN + lkpverantwlimiet := prs.getprofiellimiet (lkpverantwkey, pdisckey); + END IF; + IF (lkpverantwkey = -1 OR lkpverantwkey = pexcludekey OR lexcludeisvervanger = 1) AND (lmethode = 2 OR lmethode = 3) -- doorloop de boom naar boven, met allerlei aannames THEN -- waar hoort deze kp bij? @@ -366,7 +311,7 @@ AS RETURN -1; END; - WHILE lkpverantwkey = -1 AND parentafdkey IS NOT NULL AND lkpverantwlimiet < pondergrens + WHILE lkpverantwkey = -1 AND parentafdkey IS NOT NULL AND (lmethode <> 3 OR lkpverantwlimiet < pondergrens) LOOP SELECT COALESCE (k.prs_perslid_key, -1), prs_afdeling_parentkey INTO lkpverantwkey, parentafdkey @@ -374,23 +319,24 @@ AS WHERE k.prs_kostenplaats_key(+) = a.prs_kostenplaats_key AND a.prs_afdeling_verwijder IS NULL AND a.prs_afdeling_key = parentafdkey; - - lkpverantwlimiet := prs.getprofiellimiet (lkpverantwkey, pdisckey); + IF lmethode = 3 THEN + lkpverantwlimiet := prs.getprofiellimiet (lkpverantwkey, pdisckey); + END IF; END LOOP; -- nu heb ik er een of kan ik er geen vinden END IF; -*/ + -- Nu: als ik methode 1 heb, of methode 2 niemand opleverde (ondanks afdelingskostenplaats): de kpngroepverantwoordelijke - IF lkpverantwkey = -1 OR lkpverantwkey = pexcludekey OR lkpverantwlimiet < pondergrens + IF lkpverantwkey = -1 OR lkpverantwkey = pexcludekey OR lexcludeisvervanger = 1 OR (lmethode = 3 AND lkpverantwlimiet < pondergrens) THEN - -- vindt de kostenplaatsGROEPverantwoordelijke + -- vindt de kostenplaatsGROEPverantwoordelijke van altijd de meegegeven kp BEGIN SELECT COALESCE (kg.prs_perslid_key, -1) INTO lkpverantwkey FROM prs_kostenplaats k, prs_kostenplaatsgrp kg WHERE prs_kostenplaats_key = pkostenplaats_key AND kg.prs_kostenplaatsgrp_key = k.prs_kostenplaatsgrp_key - AND kg.prs_perslid_key <> pexcludekey; + AND kg.prs_perslid_key NOT IN (lkpverantwkey, pexcludekey); EXCEPTION WHEN NO_DATA_FOUND THEN