UWVA#36431 Passend mandaat opzoeken in organisatieboom savepoint

svn path=/Database/trunk/; revision=34962
This commit is contained in:
Jos Groot Lipman
2017-08-16 14:01:38 +00:00
parent 2de38b9662
commit dbd008f16b
3 changed files with 121 additions and 116 deletions

View File

@@ -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

View File

@@ -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(+)

View File

@@ -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