UWVA#36431 Passend mandaat opzoeken in organisatieboom savepoint
svn path=/Database/trunk/; revision=34962
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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(+)
|
||||
|
||||
162
PRS/PRS_PAC.SRC
162
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
|
||||
|
||||
Reference in New Issue
Block a user