diff --git a/BES/BES_PAC.SRC b/BES/BES_PAC.SRC index 736dbc47..f7162031 100644 --- a/BES/BES_PAC.SRC +++ b/BES/BES_PAC.SRC @@ -73,6 +73,10 @@ AS RETURN varchar2; PROCEDURE remove(p_bes_bestelling_key IN NUMBER); PROCEDURE remove_opdr(p_bes_opdr_key IN NUMBER); + FUNCTION bes_besteed_budget_pgb (p_prs_key IN NUMBER, p_disc_key IN NUMBER) + RETURN NUMBER; + FUNCTION bes_besteed_budget_agb (p_kp_key IN NUMBER) + RETURN NUMBER; END bes; / @@ -2244,6 +2248,120 @@ AS fac.remove_tracking('bestelopdr', p_bes_opdr_key); END; + FUNCTION bes_besteed_budget_pgb (p_prs_key IN NUMBER, p_disc_key IN NUMBER) + RETURN NUMBER + AS + l_budgetbesteld NUMBER := 0; + BEGIN + -- Besteed budget van meegegeven persoon dit jaar voor de meegegeven discipline i.v.m. Persoons Gebonden Budget (PGB). + -- Eventueel uitgezonderd (huidige) bestellingkey bes_key en meldingopdrachtkey opdr_key. + -- De discipline instelling disc_params_pgb moet 1 of 3 zijn. Afhankelijk van deze instelling roep je de pgb of agb versie aan. Hier opnieuw controleren is niet nodig. + -- Totaalbedrag van eerdere bestellingen en meldingopdrachten dit jaar van de besteller en behandelaar i.v.m. Persoons Gebonden Budget (PGB). + SELECT COALESCE(SUM(totaalbedrag), 0) - COALESCE(SUM(korting), 0) + COALESCE(SUM(levkosten), 0) budgetbesteld + INTO l_budgetbesteld + FROM (SELECT SUM(totaalbedrag) totaalbedrag + , SUM(b.bes_bestelling_korting) korting + , SUM(b.bes_bestelling_levkosten) levkosten + FROM (SELECT SUM (boi.bes_bestelopdr_item_aantal * boi.bes_bestelopdr_item_prijs) totaalbedrag + , b.bes_bestelling_key + FROM bes_bestelling b + , bes_bestelling_item bi + , bes_bestelopdr_item boi + , bes_bestelopdr bo + , bes_srtdeel isd + , bes_srtgroep isg + WHERE b.bes_bestelling_key = bi.bes_bestelling_key + AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key + AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key + AND bi.bes_srtdeel_key = isd.bes_srtdeel_key + AND isd.bes_srtgroep_key = isg.bes_srtgroep_key + AND b.prs_perslid_key = p_prs_key + AND isg.ins_discipline_key = p_disc_key + -- Alleen bestellingopdrachten in de behandelings fase (In bestelling (Bevestigd)(4)) en in de gereed fase (Geleverd(6) en Verwerkt(7)). + -- Afgewezen(1), In behandeling(3), Ter bevestiging(5) en Geannuleerd(8) doen niet mee in de bepaling van geraamde en definitieve kosten. + AND bo.bes_bestelopdr_status IN (4, 6, 7) + AND b.bes_bestelling_datum >= TRUNC (SYSDATE, 'YEAR') + GROUP BY b.bes_bestelling_key) tot + , bes_bestelling b + WHERE b.bes_bestelling_key = tot.bes_bestelling_key); + RETURN l_budgetbesteld; + END; + + FUNCTION bes_besteed_budget_agb (p_kp_key IN NUMBER) + RETURN NUMBER + AS + l_budgetbesteld NUMBER := 0; + l_kp_limietperiode NUMBER (1); + l_periode VARCHAR2 (4); + BEGIN + -- Besteed budget van meegegeven persoon afgelopen periode i.v.m. Afdelings Gebonden Budget (AGB). + -- Eventueel uitgezonderd (huidige) bestellingkey bes_key en meldingopdrachtkey opdr_key. + -- De discipline instelling disc_params_pgb moet 1 of 3 zijn. Afhankelijk van deze instelling roep je de pgb of agb versie aan. Hier opnieuw controleren is niet nodig. + -- Totaalbedrag van eerdere bestellingen en meldingopdrachten van afgelopen periode van de besteller en behandeaar i.v.m. Afdelings Gebonden Budget (AGB). + + -- Limietperiode kostenplaats (prs_kostenplaats_limietperiode): 0(of NULL)=geen(oneindig) (default), 1=maand, 2=jaar. + IF p_kp_key > 0 + THEN + -- Er is een kostenplaats gevonden. + -- De limiet periode van de kostenplaatsgroep overruled die van de kostenplaats indien ingevuld. + SELECT CASE COALESCE(kg.prs_kostenplaatsgrp_limperiode, 0) -- Indien kostenplaats geen kostenplaatsgroep heeft dan ook "Geen" en eigen limietperiode van de kostenplaats nemen. + WHEN 0 -- Geen. + THEN k.prs_kostenplaats_limietperiode + ELSE kg.prs_kostenplaatsgrp_limperiode -- Maand of Jaar. + END limietperiode + INTO l_kp_limietperiode + FROM prs_kostenplaats k + , prs_kostenplaatsgrp kg + WHERE k.prs_kostenplaatsgrp_key = kg.prs_kostenplaatsgrp_key(+) + AND k.prs_kostenplaats_key = p_kp_key; + + IF l_kp_limietperiode = 1 + THEN + l_periode := 'MM'; -- Maandelijks budget. + ELSIF l_kp_limietperiode = 2 + THEN + l_periode := 'YYYY'; -- Jaarlijks budget. + ELSE + l_periode := NULL; + END IF; + + SELECT COALESCE(SUM(totaalbedrag), 0) - COALESCE(SUM(korting), 0) + COALESCE(SUM(levkosten), 0) budgetbesteld + INTO l_budgetbesteld + FROM (SELECT SUM(totaalbedrag) totaalbedrag + , SUM(b.bes_bestelling_korting) korting + , SUM(b.bes_bestelling_levkosten) levkosten + FROM (SELECT SUM (boi.bes_bestelopdr_item_aantal * boi.bes_bestelopdr_item_prijs) totaalbedrag + , b.bes_bestelling_key + FROM bes_bestelling b + , bes_bestelling_item bi + , bes_bestelopdr_item boi + , bes_bestelopdr bo + , bes_srtdeel bsd + , bes_srtgroep bsg + , bes_discipline bd + , bes_disc_params bdp + WHERE b.bes_bestelling_key = bi.bes_bestelling_key + AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key + AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key + AND bi.bes_srtdeel_key = bsd.bes_srtdeel_key + AND bsd.bes_srtgroep_key = bsg.bes_srtgroep_key + AND bsg.ins_discipline_key = bd.ins_discipline_key + AND bsg.ins_discipline_key = bdp.bes_ins_discipline_key + AND bdp.bes_disc_params_pgb IN (2, 3) -- Alleenn agb meetellen: 2 = Alleen agb, 3 = Beiden, pgb en agb. + AND b.prs_kostenplaats_key = p_kp_key + -- Alleen bestellingopdrachten in de behandelings fase (In bestelling (Bevestigd)(4)) en in de gereed fase (Geleverd(6) en Verwerkt(7)). + -- Afgewezen(1), In behandeling(3), Ter bevestiging(5) en Geannuleerd(8) doen niet mee in de bepaling van geraamde en definitieve kosten. + AND bo.bes_bestelopdr_status IN (4, 6, 7) + AND ((l_kp_limietperiode IS NOT NULL AND b.bes_bestelling_datum >= TRUNC (SYSDATE, l_periode)) + OR (l_kp_limietperiode IS NULL)) -- De eerste van de deze maand of 1 januari dit jaar + GROUP BY b.bes_bestelling_key) tot + , bes_bestelling b + WHERE b.bes_bestelling_key = tot.bes_bestelling_key); + END IF; + + RETURN l_budgetbesteld; + END; + END bes; / diff --git a/FAC/FAC_PAC.SRC b/FAC/FAC_PAC.SRC index 215bbf4a..2382031f 100644 --- a/FAC/FAC_PAC.SRC +++ b/FAC/FAC_PAC.SRC @@ -117,7 +117,7 @@ CREATE OR REPLACE PACKAGE fac PROCEDURE clrnotifications (pcode VARCHAR2, pref NUMBER, psubject VARCHAR2, preceiver NUMBER, pextrakey NUMBER); PROCEDURE clrnotifications_xmlnode (pxmlnode VARCHAR2, prefkey NUMBER); PROCEDURE clrtracking_xmlnode (pxmlnode VARCHAR2, prefkey NUMBER); - PROCEDURE putnotificationjobs (pqueue VARCHAR2 DEFAULT 'DEFAULT'); + PROCEDURE putnotificationjobs (pqueue VARCHAR2 DEFAULT 'DEFAULT'); PROCEDURE putjobnotifications (pviewname VARCHAR2, pmode NUMBER, pflags NUMBER, pqueue VARCHAR DEFAULT 'DEFAULT'); FUNCTION getEmail ( pkey IN NUMBER ) RETURN VARCHAR2; FUNCTION getMobile ( pkey IN NUMBER ) RETURN VARCHAR2; @@ -151,6 +151,9 @@ CREATE OR REPLACE PACKAGE fac PROCEDURE createlikebookmark (pxmlnode VARCHAR2, prefkey NUMBER); PROCEDURE sequence_nextval(p_seqname IN VARCHAR2, p_initval IN NUMBER DEFAULT 1, p_initexpire IN DATE DEFAULT NULL); PROCEDURE remove_tracking(p_xmlnode IN VARCHAR2, p_refkey IN NUMBER); + FUNCTION exceeds_profiel (p_bestelbedrag IN NUMBER, p_prs_key IN NUMBER, p_disc_key IN NUMBER) RETURN BOOLEAN; + FUNCTION exceeds_pgb (p_opdrachtbedrag IN NUMBER, p_prs_key IN NUMBER, p_disc_key IN NUMBER, disc_params_pgb IN NUMBER) RETURN BOOLEAN; + FUNCTION exceeds_agb (p_opdrachtbedrag IN NUMBER, p_kp_key IN NUMBER, p_disc_key IN NUMBER, disc_params_pgb IN NUMBER) RETURN BOOLEAN; END fac; / @@ -2015,7 +2018,7 @@ CREATE OR REPLACE PACKAGE BODY fac AS -- In plaats van pto (een intern prs_perslid) kan optioneel ook expliciete adressering worden meegegeven. -- Bij een interne ontvanger wordt diens taal bijgezocht. PROCEDURE putnotificationprio (pfrom NUMBER, pto NUMBER, pmessage VARCHAR2, pmode NUMBER, - poptemail VARCHAR2, poptmobile VARCHAR2, pprio NUMBER, pattach VARCHAR2 DEFAULT NULL, + poptemail VARCHAR2, poptmobile VARCHAR2, pprio NUMBER, pattach VARCHAR2 DEFAULT NULL, pbedrijfadreskey NUMBER DEFAULT NULL, pqueue VARCHAR DEFAULT 'DEFAULT') AS lemail prs_perslid.prs_perslid_email%TYPE; @@ -2128,8 +2131,8 @@ CREATE OR REPLACE PACKAGE BODY fac AS pxref NUMBER, pprio NUMBER, psender VARCHAR2, - pattach VARCHAR2 DEFAULT NULL, - pbedrijfadreskey NUMBER DEFAULT NULL, + pattach VARCHAR2 DEFAULT NULL, + pbedrijfadreskey NUMBER DEFAULT NULL, pqueue VARCHAR DEFAULT 'DEFAULT') AS soms fac_srtnotificatie.fac_srtnotificatie_oms%TYPE; @@ -2399,7 +2402,7 @@ CREATE OR REPLACE PACKAGE BODY fac AS psender, llang, lsysteem, - pattach, + pattach, pqueue); END IF; END; @@ -2520,7 +2523,7 @@ CREATE OR REPLACE PACKAGE BODY fac AS COALESCE (fac_notificatie_job_nextrun, SYSDATE) + rec1.fac_notificatie_job_seconds / (24*60*60) WHERE fac_notificatie_job_key = rec1.fac_notificatie_job_key; - END IF; + END IF; SELECT fac_notificatie_job_nextrun INTO tnextrun @@ -2632,7 +2635,7 @@ CREATE OR REPLACE PACKAGE BODY fac AS lsender, ltext, lxkey); - + ELSIF lcode IS NULL THEN putnotificationprio (lsender, @@ -5403,6 +5406,75 @@ CREATE OR REPLACE PACKAGE BODY fac AS WHERE fac_srtnotificatie_xmlnode = p_xmlnode ); END; + + -- Geeft true als het bestelde bedrag boven de profiel-limiet van prs_key komt + -- en dus goedkeuring vereist zal zijn. + FUNCTION exceeds_profiel (p_bestelbedrag IN NUMBER, p_prs_key IN NUMBER, p_disc_key IN NUMBER) + RETURN BOOLEAN + AS + l_limiet NUMBER; + BEGIN + SELECT prs.getprofiellimiet(p_prs_key, p_disc_key) limiet + INTO l_limiet + FROM DUAL; + + IF l_limiet IS NOT NULL + THEN + RETURN l_limiet < p_bestelbedrag; + ELSE + RETURN TRUE; -- Geen profiel is altijd te hoog. + END IF; + END; + + -- Geeft true als het bestelde bedrag boven de PGB-limiet van prs_key uit komt + -- en dus (eventueel) goedkeuring vereist zal zijn. + FUNCTION exceeds_pgb (p_opdrachtbedrag IN NUMBER, p_prs_key IN NUMBER, p_disc_key IN NUMBER, disc_params_pgb IN NUMBER) + RETURN BOOLEAN + AS + l_limiet NUMBER; + BEGIN + IF disc_params_pgb = 1 OR disc_params_pgb = 3 + THEN + SELECT prs.getprofiellimiet(p_prs_key, p_disc_key) + INTO l_limiet + FROM DUAL; + IF l_limiet IS NOT NULL + THEN + RETURN l_limiet < (p_opdrachtbedrag + bes.bes_besteed_budget_pgb(p_prs_key, p_disc_key) + mld.mld_besteed_budget_pgb(p_prs_key, p_disc_key)); + ELSE + RETURN TRUE; -- Geen profiel is altijd te hoog. + END IF; + ELSE + -- Geen pgb. Dan kan je ook niet boven de pgb zitten. + RETURN FALSE; + END IF; + END; + + -- Geeft true als het bestelde bedrag boven de AGB-limiet van prs_key uit komt + -- en dus (eventueel) goedkeuring vereist zal zijn. + -- Negeer evt bestaand bestelbedrag van bes_key (indien > -1) + FUNCTION exceeds_agb (p_opdrachtbedrag IN NUMBER, p_kp_key IN NUMBER, p_disc_key IN NUMBER, disc_params_pgb IN NUMBER) + RETURN BOOLEAN + AS + l_limiet NUMBER; + BEGIN + IF disc_params_pgb = 2 OR disc_params_pgb = 3 + THEN + SELECT prs.getlimietagb(p_kp_key, fac.getsetting('prs_approvemethod'), p_disc_key) limiet + INTO l_limiet + FROM DUAL; + IF l_limiet IS NOT NULL + THEN + RETURN l_limiet < (p_opdrachtbedrag + bes.bes_besteed_budget_agb(p_kp_key) + mld.mld_besteed_budget_agb(p_kp_key)); + ELSE + RETURN TRUE; -- Geen profiel is altijd te hoog. + END IF; + ELSE + -- Geen agb. Dan kan je ook niet boven de agb zitten. + RETURN FALSE; + END IF; + END; + END fac; / diff --git a/MLD/MLD_PAC.SRC b/MLD/MLD_PAC.SRC index ded4dcee..d8fbee3d 100644 --- a/MLD/MLD_PAC.SRC +++ b/MLD/MLD_PAC.SRC @@ -19,6 +19,11 @@ CREATE OR REPLACE PACKAGE mld AS PROCEDURE notifybackoffice (pmeldingkey IN NUMBER, pcode IN VARCHAR2, pdisc_level IN NUMBER DEFAULT 1); PROCEDURE notifyprio (pmeldingkey IN NUMBER, prio IN NUMBER, pperslid_key IN NUMBER); PROCEDURE notifyopdrgoedkeurders (popdrkey IN NUMBER); + FUNCTION mld_besteed_budget_pgb (p_prs_key IN NUMBER, p_disc_key IN NUMBER) + RETURN NUMBER; + FUNCTION mld_besteed_budget_agb (p_kp_key IN NUMBER) + RETURN NUMBER; + PROCEDURE mld_addautoorder (p_melding_key IN NUMBER); PROCEDURE mld_nextworkflowstep (p_melding_key IN NUMBER ,p_success IN NUMBER); @@ -1254,6 +1259,730 @@ CREATE OR REPLACE PACKAGE BODY mld AS END; END; + FUNCTION mld_besteed_budget_pgb (p_prs_key IN NUMBER, p_disc_key IN NUMBER) + RETURN NUMBER + AS + l_budgetbesteld NUMBER := 0; + BEGIN + -- Besteed budget van meegegeven persoon dit jaar voor de meegegeven discipline i.v.m. Persoons Gebonden Budget (PGB). + -- Eventueel uitgezonderd (huidige) bestellingkey bes_key en meldingopdrachtkey opdr_key. + -- De discipline instelling disc_params_pgb moet 1 of 3 zijn. Afhankelijk van deze instelling roep je de pgb of agb versie aan. Hier opnieuw controleren is niet nodig. + -- Totaalbedrag van eerdere bestellingen en meldingopdrachten dit jaar van de besteller en behandelaar i.v.m. Persoons Gebonden Budget (PGB). + SELECT COALESCE(SUM(totaalbedrag), 0) budgetbesteld -- Korting en levkosten zijn 0. + INTO l_budgetbesteld + FROM (SELECT SUM (totaalbedrag) totaalbedrag + FROM (SELECT SUM (o.mld_opdr_kosten) totaalbedrag + , o.mld_opdr_key + FROM mld_opdr o + , mld_melding m + , mld_stdmelding sm + WHERE o.mld_melding_key = m.mld_melding_key + AND m.mld_stdmelding_key = sm.mld_stdmelding_key + AND o.prs_perslid_key = p_prs_key + AND sm.mld_ins_discipline_key = p_disc_key + -- Alleen meldingopdrachten in de actieve opdracht fase (Uitgegeven(5) en Geaccepteerd(8)), + -- in de afhandelings fase (Technisch voltooid(6) en Kosten voltooid(9)) en in de gereed fase (Verwerkt(7)). + AND o.mld_statusopdr_key IN (5, 6, 7, 8, 9) + AND o.mld_opdr_datumbegin >= TRUNC (SYSDATE, 'YEAR') + GROUP BY o.mld_opdr_key) tot + , mld_opdr o + WHERE o.mld_opdr_key = tot.mld_opdr_key); + RETURN l_budgetbesteld; + END; + + FUNCTION mld_besteed_budget_agb (p_kp_key IN NUMBER) + RETURN NUMBER + AS + l_budgetbesteld NUMBER := 0; + l_kp_limietperiode NUMBER (1); + l_periode VARCHAR2 (4); + BEGIN + -- Besteed budget van meegegeven persoon afgelopen periode i.v.m. Afdelings Gebonden Budget (AGB). + -- Eventueel uitgezonderd (huidige) bestellingkey bes_key en meldingopdrachtkey opdr_key. + -- De discipline instelling disc_params_pgb moet 1 of 3 zijn. Afhankelijk van deze instelling roep je de pgb of agb versie aan. Hier opnieuw controleren is niet nodig. + -- Totaalbedrag van eerdere bestellingen en meldingopdrachten van afgelopen periode van de besteller en behandeaar i.v.m. Afdelings Gebonden Budget (AGB). + + -- Limietperiode kostenplaats (prs_kostenplaats_limietperiode): 0(of NULL)=geen(oneindig) (default), 1=maand, 2=jaar. + IF p_kp_key > 0 + THEN + -- Er is een kostenplaats gevonden. + -- De limiet periode van de kostenplaatsgroep overruled die van de kostenplaats indien ingevuld. + SELECT CASE COALESCE(kg.prs_kostenplaatsgrp_limperiode, 0) -- Indien kostenplaats geen kostenplaatsgroep heeft dan ook "Geen" en eigen limietperiode van de kostenplaats nemen. + WHEN 0 -- Geen. + THEN k.prs_kostenplaats_limietperiode + ELSE kg.prs_kostenplaatsgrp_limperiode -- Maand of Jaar. + END limietperiode + INTO l_kp_limietperiode + FROM prs_kostenplaats k + , prs_kostenplaatsgrp kg + WHERE k.prs_kostenplaatsgrp_key = kg.prs_kostenplaatsgrp_key(+) + AND k.prs_kostenplaats_key = p_kp_key; + + IF l_kp_limietperiode = 1 + THEN + l_periode := 'MM'; -- Maandelijks budget. + ELSIF l_kp_limietperiode = 2 + THEN + l_periode := 'YYYY'; -- Jaarlijks budget. + ELSE + l_periode := NULL; + END IF; + + SELECT COALESCE(SUM(totaalbedrag), 0) budgetbesteld -- Korting en levkosten zijn 0. + INTO l_budgetbesteld + FROM (SELECT SUM (totaalbedrag) totaalbedrag + FROM (SELECT SUM (o.mld_opdr_kosten) totaalbedrag + , o.mld_opdr_key + FROM mld_opdr o + , mld_melding m + , mld_stdmelding sm + , mld_discipline md + , mld_disc_params mdp + WHERE o.mld_melding_key = m.mld_melding_key + AND m.mld_stdmelding_key = sm.mld_stdmelding_key + AND sm.mld_ins_discipline_key = md.ins_discipline_key + AND md.ins_discipline_key = mdp.mld_ins_discipline_key + AND mdp.mld_disc_params_pgb IN (2,3) -- Alleenn agb meetellen: 2 = Alleen agb, 3 = Beiden, pgb en agb. + AND o.prs_kostenplaats_key = p_kp_key + -- Alleen meldingopdrachten in de actieve opdracht fase (Uitgegeven(5) en Geaccepteerd(8)), + -- in de afhandelings fase (Technisch voltooid(6) en Kosten voltooid(9)) en in de gereed fase (Verwerkt(7)). + AND o.mld_statusopdr_key IN (5, 6, 7, 8, 9) + AND ((l_kp_limietperiode IS NOT NULL AND o.mld_opdr_datumbegin >= TRUNC (SYSDATE, l_periode)) -- De eerste van de deze maand of 1 januari dit jaar + OR (l_kp_limietperiode IS NULL)) + GROUP BY o.mld_opdr_key) tot + , mld_opdr o + WHERE o.mld_opdr_key = tot.mld_opdr_key); + END IF; + + RETURN l_budgetbesteld; + END; + + PROCEDURE mld_addautoorder (p_melding_key IN NUMBER) + AS + l_autoorder mld_stdmelding.mld_stdmelding_autoorder%TYPE; + l_prs_perslid_key prs_perslid.prs_perslid_key%TYPE; + l_mld_stdmelding_key mld_stdmelding.mld_stdmelding_key%TYPE; + l_mld_disc_params_opdr_kosten NUMBER; + l_mld_stdmelding_autoorderamount mld_stdmelding.mld_stdmelding_autoorderamount%TYPE; + l_mld_disc_params_pgb mld_disc_params.mld_disc_params_pgb%TYPE; + l_prs_kostenplaats_key prs_kostenplaats.prs_kostenplaats_key%TYPE; + l_prs_kostensoort_key prs_kostensoort.prs_kostensoort_key%TYPE; + l_ins_discipline_key mld_stdmelding.mld_ins_discipline_key%TYPE; + l_mld_melding_einddatum mld_melding.mld_melding_einddatum%TYPE; + l_mld_stdmelding_enddate_empty mld_stdmelding.mld_stdmelding_enddate_empty%TYPE; + l_mld_melding_omschrijving mld_melding.mld_melding_omschrijving%TYPE; + l_mld_melding_onderwerp mld_melding.mld_melding_onderwerp%TYPE; + l_prs_kostenplaats_fiat prs_kostenplaats.prs_kostenplaats_fiat%TYPE; + l_mld_disc_params_bestellimiet mld_disc_params.mld_disc_params_bestellimiet%TYPE; + l_mld_typeopdr_key mld_typeopdr.mld_typeopdr_key%TYPE; + l_for_approval BOOLEAN; + l_mld_typeopdr_fvs mld_typeopdr.mld_typeopdr_fvs%TYPE; + l_mld_typeopdr_gvs mld_typeopdr.mld_typeopdr_gvs%TYPE; + l_mld_typeopdr_isofferte mld_typeopdr.mld_typeopdr_isofferte%TYPE; + l_mld_typeopdr_kosten mld_typeopdr.mld_typeopdr_kosten%TYPE; + l_mld_typeopdr_kosten_verplicht NUMBER; + l_mld_typeopdr_slamode mld_typeopdr.mld_typeopdr_slamode%TYPE; + l_exceeds_pgb BOOLEAN; + l_exceeds_agb BOOLEAN; + l_mld_adres_key mld_melding.mld_adres_key%TYPE; + l_mld_alg_onroerendgoed_keys mld_melding.mld_alg_onroerendgoed_keys%TYPE; + l_mld_alg_locatie_key mld_melding.mld_alg_locatie_key%TYPE; + l_alg_gebouw_key alg_v_allonrgoed_gegevens.alg_gebouw_key%TYPE; + l_alg_verdieping_key alg_v_allonrgoed_gegevens.alg_verdieping_key %TYPE; + l_alg_ruimte_key alg_v_allonrgoed_gegevens.alg_ruimte_key%TYPE; + l_mld_stdmelding_vereisdienst mld_stdmelding.mld_stdmelding_vereisdienst%TYPE; + l_prs_dienst_key NUMBER; + l_prs_bedrijf_key prs_v_aanwezigbedrijf.prs_bedrijf_key%TYPE; + l_aantal NUMBER; + l_bdl_tijdsduur prs_bedrijfdienstlocatie.prs_bdl_t_uitvoertijd.tijdsduur%TYPE; + l_bdl_eenheid prs_bedrijfdienstlocatie.prs_bdl_t_uitvoertijd.eenheid%TYPE; + l_prs_bedrijf_uurloon prs_bedrijf.prs_bedrijf_uurloon%TYPE; + l_mld_opdr_einddatum mld_opdr.mld_opdr_einddatum%TYPE; + l_mld_opdr_omschrijving mld_opdr.mld_opdr_omschrijving%TYPE; + l_haswrite NUMBER (1); + l_new_opdr_key NUMBER (10); + l_approver_key NUMBER (10); + l_action VARCHAR2 (6); + BEGIN + BEGIN + SELECT sm.mld_stdmelding_autoorder + , m.prs_perslid_key + , sm.mld_stdmelding_key + , mdp.mld_disc_params_opdr_kosten + , sm.mld_stdmelding_autoorderamount + , mdp.mld_disc_params_pgb + , m.prs_kostenplaats_key + , sm.prs_kostensoort_key + , sm.mld_ins_discipline_key + , m.mld_melding_einddatum + , sm.mld_stdmelding_enddate_empty + , m.mld_melding_omschrijving + , m.mld_melding_onderwerp + , k.prs_kostenplaats_fiat + , mdp.mld_disc_params_bestellimiet + INTO l_autoorder + , l_prs_perslid_key + , l_mld_stdmelding_key + , l_mld_disc_params_opdr_kosten + , l_mld_stdmelding_autoorderamount + , l_mld_disc_params_pgb + , l_prs_kostenplaats_key + , l_prs_kostensoort_key + , l_ins_discipline_key + , l_mld_melding_einddatum + , l_mld_stdmelding_enddate_empty + , l_mld_melding_omschrijving + , l_mld_melding_onderwerp + , l_prs_kostenplaats_fiat + , l_mld_disc_params_bestellimiet + FROM mld_melding m + , mld_stdmelding sm + , ins_tab_discipline d + , mld_disc_params mdp + , prs_kostenplaats k + WHERE m.mld_stdmelding_key = sm.mld_stdmelding_key + AND sm.mld_ins_discipline_key = d.ins_discipline_key + AND d.ins_discipline_key = mdp.mld_ins_discipline_key + AND m.prs_kostenplaats_key = k.prs_kostenplaats_key + AND m.mld_melding_key = p_melding_key; + EXCEPTION + WHEN NO_DATA_FOUND + THEN + -- Internal error; mld_melding must exist. + RETURN; + END; + + -- Moet er bij deze melding automatisch een opdracht worden aangemaakt? + IF l_autoorder = 0 + THEN + -- No, done. + RETURN; + END IF; + + -- De behandelaar is initieel diegene die de opdracht aanmaakt (user). Hier nemen we dezelfde persoon als bij de (workflow) melding. + -- Deze persoon moet wel MLDBOF en/of MLDBO3 schrijfrechten hebben omdat we anders niet kunnen bepalen of goedgekeurd of gefiatteerd moet worden. + -- Als deze persoon geen MLDBOF en/of MLDBO3 schrijfrechten heeft dan maken we geen opdracht aan. + SELECT CASE + WHEN COALESCE(MIN(fac_gebruiker_prs_level_write), 9) < 9 OR COALESCE(MIN(fac_gebruiker_alg_level_write), 9) < 9 + THEN 1 + ELSE 0 + END + INTO l_haswrite + FROM fac_v_webgebruiker w, + fac_functie f + WHERE w.fac_functie_key = f.fac_functie_key + AND w.prs_perslid_key = l_prs_perslid_key + AND f.fac_functie_code IN ('WEB_MLDBOF', 'WEB_MLDBO3') + AND ((l_ins_discipline_key IS NOT NULL AND ins_discipline_key = l_ins_discipline_key) + OR l_ins_discipline_key IS NULL); + + IF l_haswrite = 0 + THEN + -- Internal error; Aanmaker opdracht heeft geen rechten om de opdracht aan te maken. + RETURN; + END IF; + + BEGIN + -- Bij automatische opdrachten pakken we per definitie de default opdracht type. We eisen dat die is ingevuld. + SELECT sm.mld_typeopdr_key + , mto.mld_typeopdr_fvs + , mto.mld_typeopdr_gvs + , mto.mld_typeopdr_isofferte + , mld_typeopdr_kosten + , mld_typeopdr_kosten_verplicht + , mld_typeopdr_slamode + INTO l_mld_typeopdr_key + , l_mld_typeopdr_fvs + , l_mld_typeopdr_gvs + , l_mld_typeopdr_isofferte + , l_mld_typeopdr_kosten + , l_mld_typeopdr_kosten_verplicht + , l_mld_typeopdr_slamode + FROM mld_stdmelding sm + , mld_typeopdr mto + WHERE sm.mld_typeopdr_key = mto.mld_typeopdr_key + AND sm.mld_typeopdr_key IS NOT NULL + AND sm.mld_stdmelding_key = l_mld_stdmelding_key; + EXCEPTION + WHEN NO_DATA_FOUND + THEN + -- Internal error; mld_typeopdr_key must exist. + RETURN; + END; + + -- Moet er gefiatteerd worden? + IF l_mld_stdmelding_autoorderamount < l_mld_typeopdr_fvs + THEN + l_for_approval := FALSE; + ELSIF l_mld_disc_params_pgb > 0 + THEN + -- Persoonlijk Gebonden Budget (PGB) en Afdeling Gebonden Budget (AGB) controle + -- Fiatteringsproces moet gevolgd worden op de naam van de user + -- var exceeds_pgb = mld.exceeds_pgb(tot_kosten, user_key, disc_key) + l_exceeds_pgb := fac.exceeds_pgb(l_mld_stdmelding_autoorderamount, l_prs_perslid_key, l_ins_discipline_key, l_mld_disc_params_pgb); + l_exceeds_agb := fac.exceeds_agb(l_mld_stdmelding_autoorderamount, l_prs_kostenplaats_key, l_ins_discipline_key, l_mld_disc_params_pgb); + IF l_exceeds_pgb OR l_exceeds_agb + THEN + -- Voor melding opdrachten heb je altijd BO rechten nodig. + -- Een opdracht kan dus nooit van een FE komen. Aan de setting "mld_pgb_fe_fiat" (zoals bes_pgb_fe_fiat) heb je hier dan niets. + IF fac.getsetting('mld_pgb_fiattering') = 1 + THEN + -- Algemene fiatterings proces noodzakelijk naast PGB fiatering. + l_for_approval := TRUE; + ELSE + -- Fiatteringsproces moet gevolgd worden op de naam van de user. + -- Persoonlijk Gebonden Budget (PGB) en/of Afdeling Gebonden Budget (AGB) wordt overschreden. + -- Opdracht kan dus niet aangemaakt worden. + RETURN; + END IF; + END IF; + + -- Wel even checken of er een fiatteur gevonden kan worden. + IF l_for_approval OR + (fac.getsetting('mld_use_order_approval') = 1 AND + l_mld_stdmelding_autoorderamount > 0 AND + (l_mld_stdmelding_autoorderamount > fac.getsetting('can_selfapprove'))) -- Ik kan niet zelf fiatteren of kosten overschrijden het profiel. + THEN + l_for_approval := TRUE; + -- Wie moet op verzoek goedkeuren voor deze kostenplaats, terwijl het bedrag wellicht onbekend is? + -- Eerste fiatteur (pkey) mag niet fiatteren want het zit boven zijn profiel limiet. + -- Alleen de melder van de melding mag niet zelf goedkeuren boven het bedrag can_selfapprove. + -- Bij een kpg fiatteur moeten we de volgende hebben en niet de laatste, daarom (fiatbedrag >= 0) meegeven. + -- prs.getfiatteur (pkostenplaats_key, pexcludekey, pondergrens, pdisckey, pfiatbedrag) + SELECT prs.getfiatteur (l_prs_kostenplaats_key, -1, l_mld_stdmelding_autoorderamount, l_ins_discipline_key, -1) + INTO l_approver_key + FROM DUAL; + END IF; + ELSE + -- Standaard fiatteringscontrole + -- De opdrachtaanmaker, Melder van de melding/BO-medewerker, contactpersoon enz, zijn allemaal de gelijk, namelijk de meldingaanmaker. + IF (fac.getsetting('mld_use_order_approval') = 1 AND + l_mld_stdmelding_autoorderamount > 0 AND + (l_mld_stdmelding_autoorderamount > fac.getsetting('can_selfapprove') OR + fac.exceeds_profiel(l_mld_stdmelding_autoorderamount, l_prs_perslid_key, l_ins_discipline_key))) -- Ik kan niet zelf fiatteren of kosten overschrijden het profiel. + THEN + l_for_approval := TRUE; + + -- prs.getfiatteur (pkostenplaats_key, pexcludekey, pondergrens, pdisckey, pfiatbedrag) + SELECT prs.getfiatteur (l_prs_kostenplaats_key, -1, l_mld_stdmelding_autoorderamount, l_ins_discipline_key, -1) + INTO l_approver_key + FROM DUAL; + END IF; + END IF; + + IF l_for_approval AND l_prs_kostenplaats_fiat = 1 + THEN + IF l_approver_key = -1 + THEN + -- Internal error; approver must exist. + RETURN; + --ELSE + -- Er is nu een altijd een eerste approver_key gevonden (met of zonder voldoende fiatteringsrechten). Anders al een abort. + -- approver_key is oke of indien -1 dan is er geen approval meer nodig (is al geabort hierboven anders) + END IF; + END IF; + + -- Zetten van de status van de melding naar geaccepteerd en afhandelen van de tracking. + mld.setmeldingstatus(p_melding_key, 4, NULL, 1); + -- (re)calculate the conditionscores of the releated objects + IF fac.getsetting('cnd_gebreken_srtdisc_key') > 0 + THEN + cnd.process_mjb_score_effects(p_melding_key, NULL); + END IF; + + -- Voor automatische opdrachten controleren of uitvoerende bepaald kan worden (niet voor offertes). + IF l_mld_typeopdr_isofferte = 0 + THEN + -- Daarvoor zijn plaatsgegevens relevant. + -- Eerst kijken of er een locatie key bepaald kan worden. + SELECT mld_alg_locatie_key + , mld_adres_key + , mld_alg_onroerendgoed_keys + INTO l_mld_alg_locatie_key + , l_mld_adres_key + , l_mld_alg_onroerendgoed_keys + FROM mld_melding + WHERE mld_melding_key = p_melding_key + AND (mld_alg_locatie_key IS NOT NULL OR mld_adres_key IS NOT NULL); + + IF l_mld_alg_locatie_key IS NULL AND l_mld_adres_key IS NOT NULL + THEN + -- Als we geen locatiekey hebben maar wel een afleveradres, kunnen we mogelijk ook een locatiekey bepalen. + SELECT alg_locatie_key + INTO l_mld_alg_locatie_key + FROM mld_adres + WHERE mld_adres_key = l_mld_adres_key; + END IF; + + IF l_mld_alg_onroerendgoed_keys > 0 + THEN + SELECT g.alg_gebouw_key + , g.alg_verdieping_key + , g.alg_ruimte_key + INTO l_alg_gebouw_key + , l_alg_verdieping_key + , l_alg_ruimte_key + FROM alg_v_allonrgoed_gegevens g + WHERE g.alg_onroerendgoed_keys = l_mld_alg_onroerendgoed_keys; + END IF; + + -- Dienst controle is bij het aanmaken van de start melding al gedaan. + -- Voor de opdracht wordt namelijk uit gegaan van dezelfde mld_stdmelding, mld_alg_onroerendgoed_keys (locatie, gebouw en ruimte) en prs_perslid_voor. + -- De controle zal dan dus hetzelfde zijn. + -- Dienst controle: stdmelding -> prs_dienst_key -> prs_bedrijf_key. + -- Controles: + -- 1) Er moet een bedrijf bij de dienst gevonden kunnen worden. + -- 2) Als de melding onderdeel is van *een* dienstniveau dan moet bij de ruimte + -- een niveau ingevuld zijn waar deze melding onderdeel van is. + -- 3) Als bij de melding is aangegeven dat hij alleen voor de eigen organisatie mag dan + -- moet die ruimte (via PRS_RUIMTEAFDELING) gehuurd worden door "eigen" afdeling + -- "eigen" is gedefinieerd als een afdeling die ons als parent heeft + -- of een afdeling die een parent van ons is. + -- De controles kunnen hier overgeslagen worden en kan de prs bedrijf_key direct bepalen. + + SELECT ms.mld_stdmelding_vereisdienst + , ms.prs_dienst_key + INTO l_mld_stdmelding_vereisdienst + , l_prs_dienst_key + FROM mld_stdmelding ms + , prs_dienst pd + WHERE mld_stdmelding_key = l_mld_stdmelding_key + AND pd.prs_dienst_key(+) = ms.prs_dienst_key; + + IF l_prs_dienst_key IS NOT NULL + THEN + -- Controleer of er een/één bedrijf is dat deze dienst levert op deze locatie/dit gebouw + IF l_alg_gebouw_key IS NOT NULL + THEN + SELECT MIN(bdl.prs_bedrijf_key) prs_bedrijf_key + , COUNT(DISTINCT bdl.prs_bedrijf_key) aantal + , MIN(bdl.prs_bdl_t_uitvoertijd.tijdsduur) tijdsduur + , MIN(bdl.prs_bdl_t_uitvoertijd.eenheid) eenheid + INTO l_prs_bedrijf_key + , l_aantal + , l_bdl_tijdsduur + , l_bdl_eenheid + FROM prs_bedrijfdienstlocatie bdl + , prs_v_aanwezigbedrijf b + WHERE bdl.prs_bedrijf_key = b.prs_bedrijf_key + AND bdl.prs_dienst_key = l_prs_dienst_key + AND ((bdl.alg_gebouw_key = l_alg_gebouw_key + OR bdl.alg_gebouw_key IS NULL) + AND (bdl.alg_locatie_key = l_mld_alg_locatie_key + OR bdl.alg_locatie_key IS NULL)); + ELSIF l_mld_alg_locatie_key IS NOT NULL + THEN + SELECT MIN(bdl.prs_bedrijf_key) prs_bedrijf_key + , COUNT(DISTINCT bdl.prs_bedrijf_key) aantal + , MIN(bdl.prs_bdl_t_uitvoertijd.tijdsduur) + , MIN(bdl.prs_bdl_t_uitvoertijd.eenheid) eenheid + INTO l_prs_bedrijf_key + , l_aantal + , l_bdl_tijdsduur + , l_bdl_eenheid + FROM prs_bedrijfdienstlocatie bdl + , prs_v_aanwezigbedrijf b + WHERE bdl.prs_bedrijf_key = b.prs_bedrijf_key + AND bdl.prs_dienst_key = l_prs_dienst_key + AND (bdl.alg_locatie_key = l_mld_alg_locatie_key + OR bdl.alg_locatie_key IS NULL); + END IF; + -- Indien dienst vereist en aantal is 0, dan is de dienst niet beschikbaar voor deze locatie/dit gebouw. + -- Indien aantal groter is dan 0, dan kan ik geen goede keuze maken. + IF l_aantal <> 1 + THEN + l_prs_bedrijf_key := NULL; + END IF; + END IF; + IF l_prs_bedrijf_key IS NULL + THEN + -- Internal error; prs_bedrijf_key must exist. + RETURN; + END IF; + END IF; + + -- Zijn de totale kosten verplicht en ingevuld? Hier gaat het om een nieuwe opdracht en moet dus gecontroleerd worden. + -- Opdrachttype: mld_typeopdr_kosten_verplicht (typeopdr kosten): 0 = Niet verplicht, 1 = Save + 2 = Afmelden, 4 = Afronden. + -- Vakgroep: mld_disc_params_opdr_kosten (opdracht kosten): 0 = Niet verplicht, 7 = Aanmaak, 6 = Afmelden, 4 = Afronden. + -- Nieuwe opdracht, dus ik hoef alleen te kijken naar Save (mld_typeopdr_kosten_verplicht) en Aanmaak (mld_disc_params_opdr_kosten). + IF ((BITAND(l_mld_typeopdr_kosten_verplicht, 1) = 1 + OR (l_mld_typeopdr_kosten_verplicht = 0 AND BITAND(l_mld_disc_params_opdr_kosten, 1) = 1)) -- Zijn de kosten verplicht voor nieuwe opdracht? + AND l_mld_stdmelding_autoorderamount IS NOT NULL) -- Totale kosten bij autoorder. + THEN + -- Internal error; The costs must be filled in. + RETURN; + END IF; + + -- Als kosten meegerekend moeten worden ("Kosten meerekenen") dan moet er wel een kostenplaats bekend zijn. + IF l_mld_typeopdr_kosten = 1 AND l_prs_kostenplaats_key IS NULL -- Kosten meerekenen? + THEN + -- Internal error; prs_kostenplaats_key must exist. + RETURN; + END IF; + + -- Combinatievalidatie + IF l_prs_kostenplaats_key IS NOT NULL AND NOT prs.combinatievalidatie(l_prs_kostenplaats_key, l_prs_kostensoort_key, l_ins_discipline_key) + THEN + -- Internal error; Combinatievalidatie: Dit product is niet toegestaan voor deze kostenplaats. + RETURN; + END IF; + + -- Uurloon + SELECT b.prs_bedrijf_uurloon + INTO l_prs_bedrijf_uurloon + FROM prs_bedrijf b + WHERE b.prs_bedrijf_key = l_prs_bedrijf_key; -- Er is een geldige uitvoerder. + + -- Einddatum bepalen + IF l_mld_typeopdr_slamode = 2 + THEN + -- Uitvoertijd opdracht is melding uitvoertijd. + SELECT m.mld_melding_t_uitvoertijd.tijdsduur tijdsduur + , m.mld_melding_t_uitvoertijd.eenheid eenheid + INTO l_bdl_tijdsduur + , l_bdl_eenheid + FROM mld_melding m + WHERE m.mld_melding_key = p_melding_key; + ELSE + -- Uitvoertijd opdracht is bedrijf uitvoertijd. + -- Als er een specifieke uitvoertijd voor ons gebouw is, dan zijn l_bdl_tijdsduur en l_bdl_eenheid hiermee gevuld. + IF l_bdl_tijdsduur IS NULL + THEN + SELECT b.prs_bedrijf_t_uitvoertijd.tijdsduur tijdsduur + , b.prs_bedrijf_t_uitvoertijd.eenheid eenheid + INTO l_bdl_tijdsduur + , l_bdl_eenheid + FROM prs_bedrijf b + WHERE b.prs_bedrijf_key = l_prs_bedrijf_key; -- Er is een geldige uitvoerder. + END IF; + END IF; + + IF l_bdl_tijdsduur IS NOT NULL + THEN + -- Bepaal/Bereken de SLA-einddatum. + IF l_mld_stdmelding_enddate_empty = 1 + THEN + l_mld_opdr_einddatum := NULL; + ELSE + -- l_bdl_tijdsduur en l_bdl_eenheid hebben een waarde. + SELECT mld.geteinddatum(p_melding_key, + MLD_T_UITVOERTIJD(l_bdl_tijdsduur, l_bdl_eenheid), + SYSDATE) + INTO l_mld_opdr_einddatum + FROM DUAL; + + -- Als setting mld_enforce_orderdates = 1, dan moeten de datums van de opdracht binnen de datums van de melding liggen. + IF l_mld_typeopdr_slamode = 1 AND + fac.getsetting('mld_enforce_orderdates') = 1 AND + TRUNC(l_mld_melding_einddatum, 'DDD') < TRUNC(l_mld_opdr_einddatum, 'DDD') + THEN + l_mld_opdr_einddatum := l_mld_melding_einddatum; + END IF; + END IF; + ELSE + l_mld_opdr_einddatum := l_mld_melding_einddatum; -- Einddatum melding; + END IF; + + -- Opdracht omschrijving. + IF l_mld_melding_onderwerp IS NOT NULL + THEN + l_mld_opdr_omschrijving := l_mld_melding_onderwerp; + END IF; + IF l_mld_melding_onderwerp IS NOT NULL AND l_mld_melding_omschrijving IS NOT NULL + THEN + l_mld_opdr_omschrijving := l_mld_opdr_omschrijving || CHR(10) || l_mld_melding_omschrijving; + END IF; + IF fac.getsetting('mld_ord_flexsummary') = 1 + THEN + l_mld_opdr_omschrijving := l_mld_opdr_omschrijving || mld.mldflexsummary(p_melding_key); + END IF; + + SELECT mld_s_mld_opdr_key.NEXTVAL INTO l_new_opdr_key FROM DUAL; + + -- Merk op: voor sommige velden laten we bewust de default nemen + INSERT INTO mld_opdr (mld_melding_key, + mld_opdr_key, + mld_opdr_bedrijfopdr_volgnr, + mld_typeopdr_key, + mld_uitvoerende_keys, + prs_perslid_key, + prs_kostenplaats_key, + prs_kostensoort_key, + mld_opdr_kosten, + mld_opdr_uurloon, + mld_opdr_uren, + mld_opdr_module, + mld_opdr_datumbegin, + mld_opdr_einddatum, + mld_opdr_omschrijving) + VALUES (p_melding_key, + l_new_opdr_key, + mld.bepaalopdrmeldingvolgnr(p_melding_key), + l_mld_typeopdr_key, + l_prs_bedrijf_key, + l_prs_perslid_key, + l_prs_kostenplaats_key, + l_prs_kostensoort_key, + l_mld_stdmelding_autoorderamount, + l_prs_bedrijf_uurloon, + 0, + 'MLD', + SYSDATE, -- Begindatum opdracht gelijk aan de melding datum (SYSDATE voor workflow melding). + l_mld_opdr_einddatum, + l_mld_opdr_omschrijving); + + -- Status en tracking altijd met de functie setopdrachtstatus + -- Zetten van de status van een nieuwe opdracht op nieuw en afhandelen van de tracking (status + uitvoerende tracking) en daarmee notificatie. + IF l_mld_stdmelding_autoorderamount > l_mld_disc_params_bestellimiet OR l_mld_stdmelding_autoorderamount > l_mld_typeopdr_gvs + THEN + mld.setopdrachtstatus(l_new_opdr_key, 10, NULL); -- Ter goedkeuring. + ELSE + IF l_mld_stdmelding_autoorderamount < l_mld_typeopdr_fvs -- fvs is eigenlijk al eerder afgehandeld + THEN + -- Hoge fiat vrijstelling, fiattering toch niet nodig. + mld.setopdrachtstatus(l_new_opdr_key, 5, NULL); -- Uitgegeven. + -- mld.trackuitvoerende(opdr_key, uitvoerende, opdr_status_key); + SELECT CASE + WHEN u.intern = 1 + THEN 'ORDMLI' + ELSE 'ORDMLE' + END action + INTO l_action + FROM mld_v_uitvoerende u + WHERE u.mld_uitvoerende_key = l_prs_bedrijf_key; + + -- Type "P" (persoon) is intern en type "B" (bedrijf) is afhankelijk van "prs_bedrijf_intern" intern of extern. + fac.trackaction(l_action, l_new_opdr_key, NULL, NULL, NULL); + -- In de database procedure doen we geen putorders.sendnotifications(pkey, paction). Dan moeten we maar iets langer wachten. + ELSE + mld.setopdrachtstatus(l_new_opdr_key, 3, NULL); -- Ter fiattering. + END IF; + END IF; + + -- Refresh meldingstatus zonodig als gevolg van een nieuw uitgegeven opdracht. + -- Als er open opdrachten zijn wordt de melding op Uitgegeven gezet als dat al niet zo was. + mld.updatemeldingstatus (p_melding_key, 0, NULL); + -- (Re)calculate the conditionscores of the releated objects + IF fac.getsetting('cnd_gebreken_srtdisc_key') > 0 + THEN + cnd.process_mjb_score_effects(p_melding_key, NULL); + END IF; + + -- Bij het automatisch aanmaken van een opdracht bij een melding is alleen de melding_key doorgegeven en dus niet de melding kenmerken. + -- Deze kenmerken zijn dus ook niet opgeslagen. + -- De melding kenmerken die overeenkomen met de opdracht kenmerken ophalen en opslaan voor de nieuwe opdracht. + INSERT INTO mld_kenmerkopdr (mld_opdr_key + , mld_kenmerk_key + , mld_kenmerkopdr_waarde) + SELECT l_new_opdr_key mld_opdr_key + , k.mld_kenmerk_key kenmerk_key + , COALESCE((SELECT v.mld_kenmerkmelding_waarde + FROM mld_kenmerkmelding v + , mld_kenmerk vk + , mld_srtkenmerk vt + WHERE v.mld_melding_key = p_melding_key + AND vk.mld_srtkenmerk_key = vt.mld_srtkenmerk_key + AND vk.mld_srtkenmerk_key = k.mld_srtkenmerk_key + AND vk.mld_kenmerk_groep = k.mld_kenmerk_groep + AND v.mld_kenmerk_key = vk.mld_kenmerk_key + AND v.mld_kenmerkmelding_verwijder IS NULL), + k.mld_kenmerk_default) kenmerk_waarde + FROM mld_srtkenmerk t + , mld_kenmerk k + , mld_typeopdr s + WHERE (s.mld_typeopdr_key = l_mld_typeopdr_key OR s.mld_typeopdr_key IS NULL) + AND k.mld_typeopdr_key = s.mld_typeopdr_key(+) + AND k.mld_kenmerk_niveau IN ('P', 'O') + AND k.mld_kenmerk_verwijder IS NULL + AND k.mld_srtkenmerk_key = t.mld_srtkenmerk_key + AND t.mld_srtkenmerk_verwijder IS NULL + AND t.mld_srtkenmerk_kenmerktype <> 'M' + AND (k.mld_kenmerk_volgnummer <= 100 + OR k.mld_kenmerk_volgnummer >= 900) -- Alleen bij of na afmelden mogen afmeld-kenmerken tussen de 100..900 + AND COALESCE((SELECT v.mld_kenmerkmelding_waarde + FROM mld_kenmerkmelding v + , mld_kenmerk vk + , mld_srtkenmerk vt + WHERE v.mld_melding_key = p_melding_key + AND vk.mld_srtkenmerk_key = vt.mld_srtkenmerk_key + AND vk.mld_srtkenmerk_key = k.mld_srtkenmerk_key + AND vk.mld_kenmerk_groep = k.mld_kenmerk_groep + AND v.mld_kenmerk_key = vk.mld_kenmerk_key + AND v.mld_kenmerkmelding_verwijder IS NULL), + k.mld_kenmerk_default) IS NOT NULL + AND COALESCE((SELECT v.mld_kenmerkmelding_waarde + FROM mld_kenmerkmelding v + , mld_kenmerk vk + , mld_srtkenmerk vt + WHERE v.mld_melding_key = p_melding_key + AND vk.mld_srtkenmerk_key = vt.mld_srtkenmerk_key + AND vk.mld_srtkenmerk_key = k.mld_srtkenmerk_key + AND vk.mld_kenmerk_groep = k.mld_kenmerk_groep + AND v.mld_kenmerk_key = vk.mld_kenmerk_key + AND v.mld_kenmerkmelding_verwijder IS NULL), + k.mld_kenmerk_default) NOT LIKE '%##EXPR##%'; + + + INSERT INTO fac_kenmwaarden(fac_kenmwaarden_module, + fac_kenmwaarden_refkey, + fac_kenmwaarden_kenmerk_key, + fac_kenmwaarden_waarde, + fac_kenmwaarden_kenmerktype, + fac_kenmwaarden_kenmerklen, + fac_kenmwaarden_kenmerkdec, + fac_kenmwaarden_isexpr, + prs_perslid_key) + SELECT 'OPD', + l_new_opdr_key, + k.mld_kenmerk_key, + COALESCE((SELECT v.mld_kenmerkmelding_waarde + FROM mld_kenmerkmelding v, + mld_kenmerk vk, + mld_srtkenmerk vt + WHERE v.mld_melding_key = 9067 --p_melding_key + AND vk.mld_srtkenmerk_key = vt.mld_srtkenmerk_key + AND vk.mld_srtkenmerk_key = k.mld_srtkenmerk_key + AND vk.mld_kenmerk_groep = k.mld_kenmerk_groep + AND v.mld_kenmerk_key = vk.mld_kenmerk_key + AND v.mld_kenmerkmelding_verwijder IS NULL), + k.mld_kenmerk_default) kenmerk_waarde, + t.mld_srtkenmerk_kenmerktype, + t.mld_srtkenmerk_lengte, + t.mld_srtkenmerk_dec, + CASE + WHEN k.mld_kenmerk_default LIKE '%##EXPR##%' + THEN 1 + ELSE 0 + END fac_kenmwaarden_isexpr, + l_prs_perslid_key + FROM mld_srtkenmerk t + , mld_kenmerk k + , mld_typeopdr s + WHERE (s.mld_typeopdr_key = l_mld_typeopdr_key OR s.mld_typeopdr_key IS NULL) + AND k.mld_typeopdr_key = s.mld_typeopdr_key(+) + AND k.mld_kenmerk_niveau IN ('P', 'O') + AND k.mld_kenmerk_verwijder IS NULL + AND k.mld_srtkenmerk_key = t.mld_srtkenmerk_key + AND t.mld_srtkenmerk_verwijder IS NULL + AND t.mld_srtkenmerk_kenmerktype <> 'M' + AND (k.mld_kenmerk_volgnummer <= 100 + OR k.mld_kenmerk_volgnummer >= 900) -- Alleen bij of na afmelden mogen afmeld-kenmerken tussen de 100..900 + AND COALESCE((SELECT v.mld_kenmerkmelding_waarde + FROM mld_kenmerkmelding v + , mld_kenmerk vk + , mld_srtkenmerk vt + WHERE v.mld_melding_key = p_melding_key + AND vk.mld_srtkenmerk_key = vt.mld_srtkenmerk_key + AND vk.mld_srtkenmerk_key = k.mld_srtkenmerk_key + AND vk.mld_kenmerk_groep = k.mld_kenmerk_groep + AND v.mld_kenmerk_key = vk.mld_kenmerk_key + AND v.mld_kenmerkmelding_verwijder IS NULL), + k.mld_kenmerk_default) IS NOT NULL; + + -- Evaluate flex expressions. + flx.evaluateflexexpressions('OPD', l_new_opdr_key, l_prs_perslid_key, 1); + END mld_addautoorder; + PROCEDURE mld_nextworkflowstep (p_melding_key IN NUMBER, p_success IN NUMBER) AS -- p_melding_key key of the call to be continued diff --git a/PRS/PRS_PAC.SRC b/PRS/PRS_PAC.SRC index 8858b179..f0b61a43 100644 --- a/PRS/PRS_PAC.SRC +++ b/PRS/PRS_PAC.SRC @@ -107,6 +107,8 @@ AS PROCEDURE update_perslid (p_import_key IN NUMBER, p_sleutelkolom IN VARCHAR2, p_alg_type IN VARCHAR2); PROCEDURE delete_perslid (p_import_key IN NUMBER, p_perslid_key IN NUMBER); + + FUNCTION combinatievalidatie (p_kp_key IN NUMBER, p_ksrt_key IN NUMBER, p_disc_key IN NUMBER) RETURN BOOLEAN; END prs; / @@ -2411,6 +2413,86 @@ AS END; END delete_perslid; + FUNCTION combinatievalidatie (p_kp_key IN NUMBER, p_ksrt_key IN NUMBER, p_disc_key IN NUMBER) + RETURN BOOLEAN + AS + l_dummy NUMBER(1); + l_kp_key prs_kostenplaats.prs_kostenplaats_key%TYPE; + l_ksrt_key prs_kostensoort.prs_kostensoort_key%TYPE; + l_disc_key mld_stdmelding.mld_ins_discipline_key%TYPE; + l_combination_OK BOOLEAN DEFAULT FALSE; -- Start de afvalrace met FALSE. + l_kpgrp_key prs_kostenplaatsgrp.prs_kostenplaatsgrp_key%TYPE DEFAULT -1; + BEGIN + l_kp_key := p_kp_key; + l_ksrt_key := p_ksrt_key; + l_disc_key := p_disc_key; + + -- Als de kostensoort niet werd meegegeven dan deze proberen zelf te bepalen. + IF l_ksrt_key IS NULL AND l_disc_key IS NOT NULL + THEN + SELECT prs_kostensoort_key + INTO l_ksrt_key + FROM ins_tab_discipline + WHERE ins_discipline_key = l_disc_key; + END IF; + + -- Start de afvalrace. + IF l_kp_key IS NULL OR l_ksrt_key IS NULL + THEN + l_combination_OK := TRUE; + END IF; + + IF NOT l_combination_OK + THEN + BEGIN + SELECT prs_kostenplaatsgrp_key + INTO l_kpgrp_key + FROM prs_kostenplaats + WHERE prs_kostenplaats_key = l_kp_key; + -- het is goed als er geen groep gedefinieerd is + l_combination_OK := l_kpgrp_key IS NULL; + EXCEPTION + WHEN NO_DATA_FOUND + THEN + NULL; + END; + END IF; + + IF NOT l_combination_OK + THEN + BEGIN + -- Geldt er uberhaupt een restrictie op deze kostensoort? + SELECT 1 + INTO l_dummy + FROM prs_kostencombinatie kc + WHERE kc.prs_kostensoort_key = l_ksrt_key; + EXCEPTION + WHEN NO_DATA_FOUND + THEN + l_combination_OK := TRUE; + END; + END IF; + + IF NOT l_combination_OK + THEN + BEGIN + SELECT prs_kostencombinatie_key + INTO l_dummy + FROM prs_kostencombinatie kc + WHERE kc.prs_kostenplaatsgrp_key = l_kpgrp_key + AND kc.prs_kostensoort_key = l_ksrt_key; + -- Er is een geldige combinatie gevonden. + l_combination_OK := TRUE; + EXCEPTION + WHEN NO_DATA_FOUND + THEN + NULL; + END; + END IF; + + RETURN l_combination_OK; + END; + END prs; /