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

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