1777 lines
85 KiB
Plaintext
1777 lines
85 KiB
Plaintext
#ifdef MLD
|
||
/*
|
||
* $Revision$
|
||
* $Id$
|
||
*/
|
||
|
||
#undef TRUNC
|
||
|
||
CREATE OR REPLACE PACKAGE mld AS
|
||
PROCEDURE updatemeldingstatus (meldingkey IN NUMBER,
|
||
closeit IN NUMBER,
|
||
user_key IN NUMBER);
|
||
PROCEDURE updatemeldingstatusAV (meldingkey IN number, closeit IN number, user_key IN number, autoav IN number);
|
||
FUNCTION getmeldingstatusdate (pmeldingkey IN number, pstatus IN number) RETURN date;
|
||
FUNCTION getmeldinguser (pmeldingkey IN number) RETURN NUMBER;
|
||
PROCEDURE setmeldingstatus (pmeldingkey IN NUMBER, pstatus IN NUMBER, puserkey IN NUMBER);
|
||
FUNCTION getopdrachtstatusdate (popdrkey IN number, pstatus IN number) RETURN date;
|
||
PROCEDURE setopdrachtstatus (popdrachtkey IN NUMBER, pstatus IN NUMBER, puserkey IN NUMBER);
|
||
PROCEDURE notifybackoffice (pmeldingkey IN NUMBER);
|
||
PROCEDURE notifyopdrgoedkeurders (popdrkey IN NUMBER);
|
||
|
||
PROCEDURE mld_nextworkflowstep (p_melding_key IN NUMBER
|
||
,p_success IN NUMBER);
|
||
FUNCTION getlowestobjectuitvoer (p_melding_key IN NUMBER) RETURN NUMBER;
|
||
FUNCTION geteinddatum (startdate IN DATE,
|
||
stdm_key IN NUMBER,
|
||
prio IN NUMBER,
|
||
alg_key IN NUMBER,
|
||
ins_key IN NUMBER,
|
||
uitvoertijd_object IN MLD_T_UITVOERTIJD DEFAULT MLD_T_UITVOERTIJD(NULL, NULL)) RETURN DATE;
|
||
FUNCTION geteinddatum (p_melding_key IN NUMBER,
|
||
p_uitvoertijd_object IN MLD_T_UITVOERTIJD DEFAULT MLD_T_UITVOERTIJD(NULL, NULL),
|
||
p_startdate IN DATE DEFAULT NULL) RETURN DATE;
|
||
FUNCTION getactualuitvoer (startdate IN DATE,
|
||
enddate IN DATE,
|
||
stdm_key IN NUMBER,
|
||
prio IN NUMBER,
|
||
alg_key IN NUMBER,
|
||
ins_key IN NUMBER) RETURN NUMBER;
|
||
FUNCTION getactualuitvoer (p_melding_key IN NUMBER) RETURN NUMBER;
|
||
FUNCTION getstduitvoer (stdm_key IN NUMBER,
|
||
prio IN NUMBER,
|
||
alg_key IN NUMBER,
|
||
ins_key IN NUMBER) RETURN MLD_T_UITVOERTIJD;
|
||
FUNCTION getstduitvoer (p_melding_key IN NUMBER) RETURN MLD_T_UITVOERTIJD;
|
||
PROCEDURE getSLAparams (stdm_key IN NUMBER,
|
||
prio IN NUMBER,
|
||
alg_key IN NUMBER, -- Altijd gebouw of hoger, locatie niet ondersteund
|
||
ins_key IN NUMBER,
|
||
v_mld_stdmelding_regime OUT NUMBER,
|
||
v_uitvoertijd_object OUT MLD_T_UITVOERTIJD,
|
||
v_beginuur OUT NUMBER,
|
||
v_einduur OUT NUMBER,
|
||
v_werkdagen OUT NUMBER
|
||
);
|
||
FUNCTION getacceptdatum (startdate IN DATE, stdm_key IN NUMBER, alg_key IN NUMBER) RETURN DATE;
|
||
FUNCTION bepaalopdrmeldingvolgnr (p_melding_key IN NUMBER) RETURN NUMBER;
|
||
FUNCTION bepaalopdrcontractvolgnr (p_contract_key IN NUMBER) RETURN NUMBER;
|
||
FUNCTION mldsprintf (ps IN VARCHAR2, p_melding_key IN NUMBER) RETURN VARCHAR2;
|
||
FUNCTION opdrsprintf (ps IN VARCHAR2, p_opdr_key IN NUMBER) RETURN VARCHAR2;
|
||
PROCEDURE upsertmeldingkenmerk (p_kenmerk_key IN NUMBER,
|
||
p_mld_key IN NUMBER,
|
||
p_waarde IN VARCHAR2);
|
||
PROCEDURE upsertopdrachtkenmerk (p_kenmerk_key IN NUMBER,
|
||
p_opdr_key IN NUMBER,
|
||
p_waarde IN VARCHAR2);
|
||
FUNCTION mldflexsummary (pmelding_key IN NUMBER) RETURN VARCHAR2;
|
||
END mld;
|
||
/
|
||
CREATE OR REPLACE PACKAGE BODY mld AS
|
||
PROCEDURE updatemeldingstatusAV (meldingkey IN number, closeit IN number, user_key IN number, autoav IN number)
|
||
AS
|
||
openopdrachten number;
|
||
opdrachten number;
|
||
nietavopdrachten number;
|
||
BEGIN
|
||
-- Als closeit=1 dan wordt de melding afgesloten als dat al niet zo was
|
||
-- Anders:
|
||
-- Als er open opdrachten zijn wordt de melding op Uitgegeven gezet als dat al niet zo was
|
||
-- Als er uitsluitend Verwerkte opdrachten zijn, dan worden de melding ook verwerkt als dat al niet zo was
|
||
-- maar alleen als autoav=1. Men kan er voor kiezen dat zelf te regelen (AAIT#24697)
|
||
-- It needs typically to be called after changes in mld_opdr.
|
||
IF closeit = 1
|
||
THEN
|
||
setmeldingstatus (meldingkey, 5, user_key);
|
||
ELSE
|
||
SELECT COUNT ( * )
|
||
INTO openopdrachten
|
||
FROM mld_opdr
|
||
WHERE mld_melding_key = meldingkey AND mld_statusopdr_key NOT IN (1, 2, 6, 7, 9);
|
||
|
||
IF openopdrachten > 0
|
||
THEN
|
||
-- als melding geaccepteerd was wordt deze nu (vanwege open opdrachten) uitgegeven
|
||
-- als melding al Uitgevoerd was wordt deze nu (met in behandeling opdrachten) NIET weer uitgegeven!
|
||
setmeldingstatus (meldingkey, 7, user_key);
|
||
ELSE
|
||
-- Er zijn dus geen actieve opdrachten, maar er zijn wellicht wel dichte opdrachten
|
||
-- Die hebben echter status 1 (Afgewezen), 6 (Afgemeld) of 7 (Verwerkt), 9 (Afgerond)
|
||
-- De melding mag dan naar AV indien er louter 7 (minstens 1) en 1 opdrachten zijn
|
||
SELECT COUNT ( * )
|
||
INTO opdrachten
|
||
FROM mld_opdr
|
||
WHERE mld_melding_key = meldingkey;
|
||
|
||
SELECT COUNT ( * )
|
||
INTO nietavopdrachten
|
||
FROM mld_opdr
|
||
WHERE mld_melding_key = meldingkey AND mld_statusopdr_key <> 7;
|
||
|
||
-- verwerkteopdrachten := opdrachten - nietavopdrachten;
|
||
IF nietavopdrachten = 0 AND opdrachten > 0
|
||
THEN
|
||
IF autoav = 1
|
||
THEN
|
||
-- There are only orders that are adm. closed, close the call (AV)
|
||
setmeldingstatus (meldingkey, 6, user_key);
|
||
END IF;
|
||
ELSE
|
||
-- Er zijn alleen opdrachten met status 1 (Afgewezen) of 6/9 (Afgemeld/Afgerond),
|
||
-- dan zetten we de Melding hier terug naar Geaccepteerd indien die Uitgegeven was
|
||
-- Zodat die bij de FO weer onder Inbehandeling valt.
|
||
setmeldingstatus (meldingkey, 4, user_key);
|
||
END IF;
|
||
END IF;
|
||
END IF;
|
||
END;
|
||
|
||
-- Om helemaal compatible te blijven
|
||
PROCEDURE updatemeldingstatus (meldingkey IN number, closeit IN number, user_key IN number)
|
||
AS
|
||
BEGIN
|
||
updatemeldingstatusAV (meldingkey, closeit, user_key, 1);
|
||
END;
|
||
|
||
-- Geef de datum waarop de melding op status pstatus is gezet
|
||
-- Alleen bedoeld voor secundaire statussen (datum van registratie is bv wel
|
||
-- direct te bepalen), dus alleen voor 1,4,5,6. Dit zijn tevens de
|
||
-- actions die eenmalig zijn. reden voor deze functie: Ik wil niet dat iedereen die
|
||
-- deze info wil zelf in de tracking moet gaan zoeken.
|
||
FUNCTION getmeldingstatusdate (pmeldingkey IN number, pstatus IN number) RETURN date
|
||
AS
|
||
eventcode fac_srtnotificatie.fac_srtnotificatie_code%TYPE := NULL;
|
||
retdatum date := NULL;
|
||
BEGIN
|
||
-- Welke tag hoort bij de gevraagde status?
|
||
CASE pstatus
|
||
WHEN 1 -- Afgewezen
|
||
THEN
|
||
eventcode := 'MLDREJ';
|
||
WHEN 4 -- Geaccepteerd (ongezien of gezien)
|
||
THEN
|
||
eventcode := 'MLDACP';
|
||
WHEN 5 -- Afgemeld
|
||
THEN
|
||
eventcode := 'MLDAFM';
|
||
WHEN 6 -- Verwerkt
|
||
THEN
|
||
eventcode := 'MLDVER';
|
||
ELSE NULL;
|
||
END CASE;
|
||
|
||
IF eventcode IS NOT NULL THEN
|
||
retdatum := fac.gettrackingdate(eventcode, pmeldingkey);
|
||
END IF;
|
||
RETURN retdatum;
|
||
END;
|
||
|
||
-- Niet veel gebruikt, maar voor compatibility gedefinieerd
|
||
-- wellicht nog uit te breiden tot de user per status, als wenselijk
|
||
FUNCTION getmeldinguser (pmeldingkey IN number) RETURN number
|
||
AS
|
||
perslid_key fac_tracking.prs_perslid_key%TYPE := NULL;
|
||
BEGIN
|
||
perslid_key := fac.gettrackinguserkey('MLDNEW', pmeldingkey);
|
||
RETURN perslid_key;
|
||
END;
|
||
|
||
-- Geef meldingkey, gewenste status en userkey, en de status wortdt
|
||
-- gezet, waarbij zonodig (indien verandering) een trackrecord wordt gemaakt
|
||
-- Als de status niet wijzigt, wordt ook geen trackrecord gemaakt
|
||
-- ZIE schema StateDiagramOpdrachten.vsd
|
||
-- Onderliggende childmeldingen krijgen dezelfde status, wat normaliter
|
||
-- zou moeten lukken
|
||
PROCEDURE setmeldingstatus (pmeldingkey IN NUMBER, pstatus IN NUMBER, puserkey IN NUMBER)
|
||
AS
|
||
currentstatus mld_melding.mld_melding_status%TYPE;
|
||
newstatus mld_melding.mld_melding_status%TYPE;
|
||
eventcode fac_srtnotificatie.fac_srtnotificatie_code%TYPE;
|
||
|
||
CURSOR c_mldchilderen
|
||
IS
|
||
SELECT mld_melding_key
|
||
FROM mld_melding
|
||
WHERE mld_melding_parentkey = pmeldingkey;
|
||
BEGIN
|
||
SELECT mld_melding_status
|
||
INTO currentstatus
|
||
FROM mld_melding
|
||
WHERE mld_melding_key = pmeldingkey;
|
||
|
||
CASE pstatus
|
||
WHEN 0 -- Pending
|
||
THEN
|
||
IF currentstatus IS NULL
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'MLDNEW';
|
||
ELSIF currentstatus = 2 OR currentstatus = 3 OR currentstatus = 4
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'MLDBWD';
|
||
END IF;
|
||
WHEN 1 -- Afgewezen
|
||
THEN
|
||
IF currentstatus IS NULL OR currentstatus = 0 OR currentstatus = 2 OR currentstatus = 3
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'MLDREJ';
|
||
END IF;
|
||
WHEN 2 -- Ingevoerd
|
||
THEN
|
||
IF currentstatus IS NULL OR currentstatus = 1
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'MLDNEW';
|
||
ELSIF currentstatus = 0
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'MLDDOO';
|
||
ELSIF currentstatus = 3
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'MLDFWD';
|
||
END IF;
|
||
WHEN 3 -- Ingezien (voor de eerste keer, voordat acceptatie)
|
||
THEN
|
||
IF currentstatus = 2
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'MLDING';
|
||
END IF;
|
||
WHEN 4 -- Geaccepteerd (ongezien of gezien)
|
||
THEN
|
||
IF currentstatus = 2 OR currentstatus = 3
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'MLDACP';
|
||
ELSIF currentstatus = 7
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := NULL; -- Terug van uitgegeven is geen meldingstatuswijziging
|
||
END IF;
|
||
WHEN 5 -- Afgemeld
|
||
THEN
|
||
IF currentstatus = 2 OR currentstatus = 0 OR currentstatus = 3 OR currentstatus = 4 OR currentstatus = 7
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'MLDAFM';
|
||
END IF;
|
||
WHEN 6 -- Verwerkt
|
||
THEN
|
||
IF currentstatus = 5
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'MLDVER';
|
||
END IF;
|
||
WHEN 7 -- Uitgegeven
|
||
THEN
|
||
IF currentstatus = 4
|
||
THEN
|
||
newstatus := pstatus;
|
||
-- eventcode := 'MLDUIT';
|
||
END IF;
|
||
ELSE
|
||
-- Invalid statuschange or no change
|
||
newstatus := NULL;
|
||
END CASE;
|
||
|
||
IF newstatus IS NOT NULL
|
||
THEN
|
||
-- vooralsnog lopen de notificaties 1-op-1 met de tracking
|
||
-- noticode := eventcode;
|
||
UPDATE mld_melding
|
||
SET mld_melding_status = newstatus
|
||
WHERE mld_melding_key = pmeldingkey;
|
||
|
||
-- We know that trackaction doesnt do tracking if eventcode is null
|
||
fac.trackaction (eventcode, pmeldingkey, puserkey, NULL, NULL);
|
||
|
||
FOR r IN c_mldchilderen
|
||
LOOP
|
||
UPDATE mld_melding
|
||
SET mld_melding_status = newstatus
|
||
WHERE mld_melding_key = r.mld_melding_key;
|
||
|
||
fac.trackaction (eventcode, r.mld_melding_key, puserkey, NULL, NULL);
|
||
END LOOP;
|
||
END IF;
|
||
END;
|
||
|
||
/* Deze functie is handig maar is amper toepasbaar bij intensieve queries */
|
||
FUNCTION getopdrachtstatusdate (popdrkey IN number, pstatus IN number) RETURN date
|
||
AS
|
||
eventcode fac_srtnotificatie.fac_srtnotificatie_code%TYPE := NULL;
|
||
retdatum date := NULL;
|
||
BEGIN
|
||
-- Welke tag hoort bij de gevraagde status?
|
||
CASE pstatus
|
||
WHEN 1
|
||
THEN
|
||
eventcode := 'ORDREJ';
|
||
WHEN 2
|
||
THEN
|
||
eventcode := 'ORDFNO'; -- of ORDFNGO of ORDOOK
|
||
WHEN 3
|
||
THEN
|
||
eventcode := 'ORDFIA';
|
||
WHEN 4
|
||
THEN
|
||
eventcode := 'ORDFOK';
|
||
WHEN 5
|
||
THEN
|
||
eventcode := 'ORDNEW';
|
||
WHEN 6 -- Afgemeld
|
||
THEN
|
||
eventcode := 'ORDAFM';
|
||
WHEN 7 -- Verwerkt
|
||
THEN
|
||
eventcode := 'ORDVER';
|
||
WHEN 9 -- Kosten Afgemeld
|
||
THEN
|
||
eventcode := 'ORDAFR'; -- of ORDOOK
|
||
WHEN 8
|
||
THEN
|
||
eventcode := 'ORDACP';
|
||
WHEN 10 -- Ter goedkeuring
|
||
THEN
|
||
eventcode := 'ORDGOE';
|
||
ELSE NULL;
|
||
END CASE;
|
||
|
||
IF eventcode IS NOT NULL THEN
|
||
retdatum := fac.gettrackingdate(eventcode, popdrkey);
|
||
END IF;
|
||
RETURN retdatum;
|
||
END;
|
||
|
||
-- Geef opdrachtkey, gewenste status en userkey, en de status wortdt
|
||
-- gezet, waarbij zonodig (indien verandering) een trackrecord wordt gemaakt
|
||
-- Als de status niet wijzigt, wordt ook geen trackrecord gemaakt
|
||
-- ZIE schema StateDiagramOpdrachten.vsd
|
||
PROCEDURE setopdrachtstatus (popdrachtkey IN NUMBER, pstatus IN NUMBER, puserkey IN NUMBER)
|
||
AS
|
||
currentstatus mld_opdr.mld_statusopdr_key%TYPE;
|
||
newstatus mld_opdr.mld_statusopdr_key%TYPE;
|
||
eventcode fac_srtnotificatie.fac_srtnotificatie_code%TYPE;
|
||
typeopdr_key mld_typeopdr.mld_typeopdr_key%TYPE;
|
||
typeopdr_isofferte mld_typeopdr.mld_typeopdr_isofferte%TYPE;
|
||
statusopdr_key_refiat mld_opdr.mld_statusopdr_key_refiat%TYPE;
|
||
BEGIN
|
||
SELECT mld_statusopdr_key, mld_typeopdr_key, mld_statusopdr_key_refiat
|
||
INTO currentstatus, typeopdr_key, statusopdr_key_refiat
|
||
FROM mld_opdr
|
||
WHERE mld_opdr_key = popdrachtkey;
|
||
CASE pstatus
|
||
WHEN 1 -- Verworpen
|
||
THEN
|
||
IF currentstatus = 2
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'ORDREJ';
|
||
ELSIF currentstatus = 5 OR currentstatus = 8
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'ORDCAN';
|
||
END IF;
|
||
WHEN 2 -- Niet gefiatteerd/niet goedgekeurd
|
||
THEN
|
||
IF currentstatus = 3
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'ORDFNO';
|
||
ELSIF currentstatus = 6
|
||
THEN
|
||
-- dit (van 6 naar 2) kan nu alleen igv offerte
|
||
-- bij uitbreiding zonodig gaan kijken naar isofferte
|
||
-- om het onderscheid te bepalen
|
||
newstatus := pstatus;
|
||
eventcode := 'ORDONO'; -- Offerte afgewezen
|
||
ELSIF currentstatus = 10
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'ORDGNO';
|
||
END IF;
|
||
WHEN 3 -- Ter fiattering
|
||
THEN
|
||
IF currentstatus IS NULL OR currentstatus = 10 OR
|
||
currentstatus = 5 OR currentstatus = 6 OR currentstatus = 8 OR currentstatus = 9 -- Hergoedkeuring/Herfiattering.
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'ORDFIA';
|
||
END IF;
|
||
WHEN 4 -- Gefiatteerd
|
||
THEN
|
||
IF currentstatus = 3
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'ORDFOK';
|
||
END IF;
|
||
WHEN 5 -- Uitgegeven
|
||
THEN
|
||
-- Eerste keer goedkeuren/fiateren komt van currentstatus NULL, 4 of 10.
|
||
-- Terugkomen van hergoedkeuring/herfiattering/ komt van currentstatus 3 (afgewezen), 4 of 10.
|
||
IF currentstatus IS NULL OR currentstatus = 3 OR currentstatus = 4 OR currentstatus = 10
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'ORDNEW';
|
||
END IF;
|
||
WHEN 6 -- Proces Technisch voltooid (TV) (Afgemeld)
|
||
THEN
|
||
-- Terugkomen van hergoedkeuring/herfiattering/ komt van currentstatus 3 (afgewezen), 4 of 10.
|
||
IF currentstatus = 3 OR currentstatus = 4 OR currentstatus = 5 OR currentstatus = 8 OR currentstatus = 10
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'ORDAFM';
|
||
END IF;
|
||
WHEN 7 -- Administratief voltooid (AV) (Verwerkt)
|
||
THEN
|
||
IF currentstatus = 6 OR currentstatus = 9
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'ORDVER';
|
||
END IF;
|
||
WHEN 8 -- Geaccepteerd door de uitvoerder
|
||
THEN
|
||
-- Terugkomen van hergoedkeuring/herfiattering/ komt van currentstatus 3 (afgewezen), 4 of 10.
|
||
IF currentstatus = 3 OR currentstatus = 4 OR currentstatus = 5 OR currentstatus = 10
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'ORDACP';
|
||
END IF;
|
||
WHEN 9 -- Kosten Voltooid (Afgerond) of Offerte Ok
|
||
THEN
|
||
-- Terugkomen van hergoedkeuring/herfiattering/ komt van currentstatus 3 (afgewezen), 4 of 10.
|
||
IF currentstatus = 3 OR currentstatus = 4 OR currentstatus = 6 OR currentstatus = 10
|
||
THEN
|
||
newstatus := pstatus;
|
||
-- CHECK OP OFFERTEAANVRAAG
|
||
SELECT mld_typeopdr_isofferte
|
||
INTO typeopdr_isofferte
|
||
FROM mld_typeopdr
|
||
WHERE mld_typeopdr_key = typeopdr_key;
|
||
-- exceptions? ik gok van niet.
|
||
IF typeopdr_isofferte = 1
|
||
THEN
|
||
eventcode := 'ORDOOK'; -- offerte ok
|
||
ELSE
|
||
eventcode := 'ORDAFR'; -- kosten voltooid
|
||
END IF;
|
||
END IF;
|
||
WHEN 10 -- Ter goedkeuring
|
||
THEN
|
||
IF currentstatus IS NULL OR
|
||
currentstatus = 5 OR currentstatus = 6 OR currentstatus = 8 OR currentstatus = 9 -- Hergoedkeuring/Herfiattering.
|
||
THEN
|
||
newstatus := pstatus;
|
||
eventcode := 'ORDGOE';
|
||
END IF;
|
||
ELSE
|
||
-- Invalid statuschange or no change
|
||
newstatus := NULL;
|
||
END CASE;
|
||
IF newstatus IS NOT NULL
|
||
THEN
|
||
-- vooralsnog lopen de notificaties 1-op-1 met de tracking
|
||
-- noticode := eventcode;
|
||
UPDATE mld_opdr
|
||
SET mld_statusopdr_key = newstatus
|
||
WHERE mld_opdr_key = popdrachtkey;
|
||
-- We know that trackaction doesnt do tracking if eventcode is null
|
||
IF statusopdr_key_refiat IS NULL -- Bij hergoedkeuring/herfiattering niets tracken.
|
||
THEN
|
||
fac.trackaction (eventcode, popdrachtkey, puserkey, NULL, NULL);
|
||
END IF;
|
||
END IF;
|
||
END;
|
||
|
||
-- Stuur alle mogelijke backofficemedewerkers een bericht als de
|
||
-- melding NIEUW is. Naar wie, wordt reversed opgezocht op basis van
|
||
-- toegekende autorisaties
|
||
-- (zoals bij de lijst van BO-behandelaars in suggest/persoonfilter.inc)
|
||
PROCEDURE notifybackoffice (pmeldingkey IN NUMBER)
|
||
AS
|
||
lloc_key mld_melding.mld_alg_locatie_key%TYPE;
|
||
lafd_key prs_perslid.prs_afdeling_key%TYPE;
|
||
ldisc_key mld_stdmelding.mld_ins_discipline_key%TYPE;
|
||
lspoed mld_melding.mld_melding_spoed%TYPE;
|
||
loms fac_srtnotificatie.fac_srtnotificatie_oms%TYPE;
|
||
bericht fac_srtnotificatie.fac_srtnotificatie_oms%TYPE; -- kan te kort zijn na substitutie
|
||
BEGIN
|
||
BEGIN
|
||
SELECT m.mld_alg_locatie_key, p.prs_afdeling_key, stdm.mld_ins_discipline_key, m.mld_melding_spoed
|
||
INTO lloc_key, lafd_key, ldisc_key, lspoed
|
||
FROM mld_melding m, prs_perslid p, mld_stdmelding stdm
|
||
WHERE m.prs_perslid_key = p.prs_perslid_key
|
||
AND stdm.mld_stdmelding_key = m.mld_stdmelding_key
|
||
AND (mld_melding_status = 2 OR mld_melding_status IS NULL)
|
||
AND mld_melding_key = pmeldingkey; -- op dit moment nog alleen voor NIEUWE meldingen
|
||
|
||
-- Als die er niet is sprongen we al naar de exception
|
||
-- Als die er wel is, gaan we verder
|
||
SELECT lcl.x('fac_srtnotificatie_oms', fac_srtnotificatie_key, fac_srtnotificatie_oms)
|
||
INTO loms
|
||
FROM fac_srtnotificatie
|
||
WHERE fac_srtnotificatie_code = 'MLD2BO';
|
||
|
||
-- Vertaal melding-spoed (1-4) naar email-spoed (1-3), 3=normaal
|
||
IF lspoed < 3
|
||
THEN
|
||
lspoed := 1;
|
||
ELSIF lspoed = 4
|
||
THEN
|
||
lspoed := 3;
|
||
ELSE
|
||
lspoed := 2;
|
||
END IF;
|
||
|
||
bericht := mld.mldsprintf (loms, pmeldingkey); -- de variabelen invullen
|
||
|
||
FOR boer
|
||
IN (SELECT g.prs_perslid_key
|
||
FROM fac_v_webgebruiker g, fac_functie f, prs_perslid p
|
||
WHERE g.fac_functie_key = f.fac_functie_key
|
||
AND g.ins_discipline_key = ldisc_key
|
||
AND g.prs_perslid_key = p.prs_perslid_key
|
||
AND (g.fac_gebruiker_prs_level_write = -1
|
||
OR (g.fac_gebruiker_prs_level_write < 9
|
||
AND p.prs_afdeling_key IN
|
||
(SELECT prs_afdeling_key
|
||
FROM prs_v_afdeling_familie a
|
||
WHERE a.prs_afdeling_elder_key IN
|
||
(SELECT aa.prs_afdeling_elder_key
|
||
FROM prs_v_afdeling_familie aa
|
||
WHERE aa.prs_afdeling_key = lafd_key
|
||
AND aa.niveau = g.fac_gebruiker_prs_level_write))))
|
||
-- in ASP: if (params.loc_key>0)
|
||
AND (g.fac_gebruiker_alg_level_write = -1
|
||
OR (g.fac_gebruiker_alg_level_write < 9
|
||
AND lloc_key IN
|
||
(SELECT alg_locatie_key
|
||
FROM fac_v_my_locations
|
||
WHERE prs_perslid_key = p.prs_perslid_key
|
||
AND niveau = fac_gebruiker_alg_level_write)))
|
||
AND fac_functie_code = 'WEB_MLDBOF')
|
||
LOOP
|
||
fac.putnotificationsrtprio (NULL,
|
||
boer.prs_perslid_key,
|
||
'MLD2BO',
|
||
pmeldingkey,
|
||
bericht,
|
||
NULL,
|
||
NULL,
|
||
NULL,
|
||
NULL,
|
||
lspoed, -- 1,2,3,4
|
||
NULL
|
||
);
|
||
END LOOP;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
RETURN;
|
||
END;
|
||
END;
|
||
|
||
-- Stuur alle mogelijke opdracht goedkeurders een bericht als de opdracht status 10 heeft.
|
||
-- Naar wie, wordt reversed opgezocht op basis van toegekende autorisaties.
|
||
-- Lijkt heel erg sterk op bovenstaande notifybackoffice
|
||
PROCEDURE notifyopdrgoedkeurders (popdrkey IN NUMBER)
|
||
AS
|
||
lloc_key mld_melding.mld_alg_locatie_key%TYPE;
|
||
lafd_key prs_perslid.prs_afdeling_key%TYPE;
|
||
ldisc_key mld_stdmelding.mld_ins_discipline_key%TYPE;
|
||
lspoed mld_melding.mld_melding_spoed%TYPE;
|
||
loms fac_srtnotificatie.fac_srtnotificatie_oms%TYPE;
|
||
lopdr_approved mld_opdr.mld_opdr_approved%TYPE;
|
||
lopdr_kosten mld_opdr.mld_opdr_kosten%TYPE;
|
||
lbestellimiet mld_disc_params.mld_disc_params_bestellimiet%TYPE;
|
||
lbestellimiet2 mld_disc_params.mld_disc_params_bestellimiet2%TYPE;
|
||
lbestellimiet3 mld_disc_params.mld_disc_params_bestellimiet3%TYPE;
|
||
lbestellimiet4 mld_disc_params.mld_disc_params_bestellimiet4%TYPE;
|
||
lbestellimiet5 mld_disc_params.mld_disc_params_bestellimiet5%TYPE;
|
||
lgvs mld_typeopdr.mld_typeopdr_gvs%TYPE;
|
||
lfunctiecode fac_functie.fac_functie_code%TYPE;
|
||
lsender mld_discipline.ins_discipline_email%TYPE;
|
||
bericht fac_srtnotificatie.fac_srtnotificatie_oms%TYPE; -- kan te kort zijn na substitutie
|
||
BEGIN
|
||
BEGIN
|
||
SELECT m.mld_alg_locatie_key, p.prs_afdeling_key, stdm.mld_ins_discipline_key, m.mld_melding_spoed,
|
||
COALESCE(o.mld_opdr_approved, -1), COALESCE(o.mld_opdr_kosten, 0), COALESCE(mdp.mld_disc_params_bestellimiet, 0),
|
||
COALESCE(mdp.mld_disc_params_bestellimiet2, 0), COALESCE(mdp.mld_disc_params_bestellimiet3, 0),
|
||
COALESCE(mdp.mld_disc_params_bestellimiet4, 0), COALESCE(mdp.mld_disc_params_bestellimiet5, 0),
|
||
mto.mld_typeopdr_gvs
|
||
INTO lloc_key, lafd_key, ldisc_key, lspoed,
|
||
lopdr_approved, lopdr_kosten, lbestellimiet, lbestellimiet2,
|
||
lbestellimiet3, lbestellimiet4, lbestellimiet5,
|
||
lgvs
|
||
FROM mld_melding m, prs_perslid p, mld_stdmelding stdm, mld_opdr o,
|
||
mld_typeopdr mto, ins_tab_discipline d, mld_disc_params mdp
|
||
WHERE m.prs_perslid_key = p.prs_perslid_key
|
||
AND stdm.mld_stdmelding_key = m.mld_stdmelding_key
|
||
AND stdm.mld_ins_discipline_key = d.ins_discipline_key
|
||
AND d.ins_discipline_key = mdp.mld_ins_discipline_key
|
||
AND o.mld_typeopdr_key = mto.mld_typeopdr_key
|
||
AND o.mld_statusopdr_key = 10
|
||
AND m.mld_melding_key = o.mld_melding_key
|
||
AND o.mld_opdr_key = popdrkey;
|
||
|
||
IF lopdr_kosten <= lbestellimiet -- Dit eerst testen i.v.m. Ter goedkeuring. Verder moet sowieso goedgekeurd worden.
|
||
THEN
|
||
RETURN; -- Het bedrag is lager als de eerste limiet. De opdracht hoeft niet goed gekeurd te worden, dus een lege fiatteurs array teruggeven.
|
||
ELSIF (((fac.getsetting ('mld_opdr_approval_all') = 0 AND (lopdr_kosten >= lbestellimiet OR lopdr_kosten >= lgvs)) OR
|
||
(fac.getsetting ('mld_opdr_approval_all') = 1 AND lopdr_kosten <= lbestellimiet2)) AND
|
||
(lopdr_approved <= lbestellimiet OR lopdr_approved <= lgvs))
|
||
THEN
|
||
lfunctiecode := 'WEB_ORDGOE';
|
||
ELSIF ((fac.getsetting ('mld_opdr_approval_all') = 0 AND lopdr_kosten >= lbestellimiet2 AND lopdr_approved = lbestellimiet2) OR
|
||
(fac.getsetting ('mld_opdr_approval_all') = 1 AND lopdr_kosten <= lbestellimiet3 AND lopdr_approved <= lbestellimiet2))
|
||
THEN
|
||
lfunctiecode := 'WEB_ORDGO2';
|
||
ELSIF ((fac.getsetting ('mld_opdr_approval_all') = 0 AND lopdr_kosten >= lbestellimiet3 AND lopdr_approved = lbestellimiet3) OR
|
||
(fac.getsetting ('mld_opdr_approval_all') = 1 AND lopdr_kosten <= lbestellimiet4 AND lopdr_approved <= lbestellimiet3))
|
||
THEN
|
||
lfunctiecode := 'WEB_ORDGO3';
|
||
ELSIF ((fac.getsetting ('mld_opdr_approval_all') = 0 AND lopdr_kosten >= lbestellimiet4 AND lopdr_approved = lbestellimiet4) OR
|
||
(fac.getsetting ('mld_opdr_approval_all') = 1 AND lopdr_kosten <= lbestellimiet5 AND lopdr_approved <= lbestellimiet4))
|
||
THEN
|
||
lfunctiecode := 'WEB_ORDGO4';
|
||
ELSIF((fac.getsetting ('mld_opdr_approval_all') = 0 AND lopdr_kosten >= lbestellimiet5 AND lopdr_approved >= lbestellimiet5) OR
|
||
(fac.getsetting ('mld_opdr_approval_all') = 1 AND lopdr_kosten > lbestellimiet5 AND lopdr_approved <= lbestellimiet5))
|
||
THEN
|
||
lfunctiecode := 'WEB_ORDGO5';
|
||
ELSE
|
||
RETURN; -- Het goedgekeurde bedrag zit al boven de vijfde limiet. Geen approval meer nodig.
|
||
END IF;
|
||
|
||
-- These notifications are now sent on behalf of the system, what might be the local FM organisation
|
||
SELECT MAX (COALESCE(cd.ins_discipline_email, l.alg_locatie_email)) email
|
||
INTO lsender
|
||
FROM mld_opdr o,
|
||
mld_melding m,
|
||
mld_stdmelding sm,
|
||
mld_discipline cd,
|
||
alg_locatie l
|
||
WHERE o.mld_melding_key = m.mld_melding_key
|
||
AND m.mld_stdmelding_key = sm.mld_stdmelding_key
|
||
AND sm.mld_ins_discipline_key = cd.ins_discipline_key
|
||
AND m.mld_alg_locatie_key = l.alg_locatie_key
|
||
AND o.mld_opdr_key = popdrkey;
|
||
|
||
-- Als die er niet is sprongen we al naar de exception
|
||
-- Als die er wel is, gaan we verder
|
||
SELECT lcl.x('fac_srtnotificatie_oms', fac_srtnotificatie_key, fac_srtnotificatie_oms)
|
||
INTO loms
|
||
FROM fac_srtnotificatie
|
||
WHERE fac_srtnotificatie_code = 'ORD2GO';
|
||
|
||
-- Vertaal melding-spoed (1-4) naar email-spoed (1-3), 3=normaal
|
||
IF lspoed < 3
|
||
THEN
|
||
lspoed := 1;
|
||
ELSIF lspoed = 4
|
||
THEN
|
||
lspoed := 3;
|
||
ELSE
|
||
lspoed := 2;
|
||
END IF;
|
||
|
||
bericht := mld.opdrsprintf (loms, popdrkey); -- de variabelen invullen
|
||
|
||
FOR boer
|
||
IN (SELECT g.prs_perslid_key
|
||
FROM fac_v_webgebruiker g, fac_functie f, prs_perslid p
|
||
WHERE g.fac_functie_key = f.fac_functie_key
|
||
AND g.ins_discipline_key = ldisc_key
|
||
AND g.prs_perslid_key = p.prs_perslid_key
|
||
AND (g.fac_gebruiker_prs_level_write = -1
|
||
OR (g.fac_gebruiker_prs_level_write < 9
|
||
AND p.prs_afdeling_key IN
|
||
(SELECT prs_afdeling_key
|
||
FROM prs_v_afdeling_familie a
|
||
WHERE a.prs_afdeling_elder_key IN
|
||
(SELECT aa.prs_afdeling_elder_key
|
||
FROM prs_v_afdeling_familie aa
|
||
WHERE aa.prs_afdeling_key = lafd_key
|
||
AND aa.niveau = g.fac_gebruiker_prs_level_write))))
|
||
-- in ASP: if (params.loc_key>0)
|
||
AND (g.fac_gebruiker_alg_level_write = -1
|
||
OR (g.fac_gebruiker_alg_level_write < 9
|
||
AND lloc_key IN
|
||
(SELECT alg_locatie_key
|
||
FROM fac_v_my_locations
|
||
WHERE prs_perslid_key = p.prs_perslid_key
|
||
AND niveau = fac_gebruiker_alg_level_write)))
|
||
AND fac_functie_code = lfunctiecode)
|
||
LOOP
|
||
fac.putnotificationsrtprio (NULL,
|
||
boer.prs_perslid_key,
|
||
'ORD2GO',
|
||
popdrkey,
|
||
bericht,
|
||
NULL,
|
||
NULL,
|
||
NULL,
|
||
NULL,
|
||
lspoed, -- 1,2,3,4
|
||
lsender
|
||
);
|
||
END LOOP;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
RETURN;
|
||
END;
|
||
END;
|
||
|
||
PROCEDURE mld_nextworkflowstep (p_melding_key IN NUMBER, p_success IN NUMBER)
|
||
AS
|
||
-- p_melding_key key of the call to be continued
|
||
-- p_success gives state of the executed call:
|
||
-- 0 = rejected (reinstated since DB8)
|
||
-- 1 = completed
|
||
-- -1 = initial (the originating call)
|
||
l_melding_start_key NUMBER (10);
|
||
l_workflowstep_key NUMBER (10);
|
||
l_stdmelding_key NUMBER (10);
|
||
l_workflowstep_next_key NUMBER (10);
|
||
l_new_melding_key NUMBER (10);
|
||
l_success NUMBER;
|
||
l_nrofpredecessors NUMBER;
|
||
l_nrofreadypredecessors NUMBER;
|
||
tmp NUMBER;
|
||
BEGIN
|
||
l_success := p_success;
|
||
BEGIN
|
||
SELECT mld_melding_start_key, mld_workflowstep_key, mld_stdmelding_key
|
||
INTO l_melding_start_key, l_workflowstep_key, l_stdmelding_key
|
||
FROM mld_melding
|
||
WHERE mld_melding_key = p_melding_key;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
-- Internal error; mld_melding must exist
|
||
RETURN;
|
||
END;
|
||
|
||
IF p_success = -1
|
||
THEN
|
||
-- The first step of a workflow
|
||
BEGIN
|
||
SELECT ws.mld_workflowstep_key
|
||
INTO l_workflowstep_key
|
||
FROM mld_workflowstep ws
|
||
WHERE ws.mld_stdmelding_key = l_stdmelding_key
|
||
AND ws.mld_workflowstep_start_key IS NULL;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
-- No workflowsteps defined for this type of calls
|
||
RETURN;
|
||
WHEN TOO_MANY_ROWS
|
||
THEN
|
||
-- Workflow defined more than once, is erroneous; do not know what to do so
|
||
RETURN;
|
||
END;
|
||
|
||
-- We must implicitly accept the call, or ELSE we cannot complete it later
|
||
UPDATE mld_melding
|
||
SET mld_workflowstep_key = l_workflowstep_key,
|
||
mld_melding_start_key = p_melding_key -- do we need this or not? choose!
|
||
WHERE mld_melding_key = p_melding_key;
|
||
mld.setmeldingstatus (p_melding_key, 4, NULL);
|
||
|
||
l_melding_start_key := p_melding_key;
|
||
l_success := 1; -- we used the info, we continue like success
|
||
END IF;
|
||
|
||
-- Is this mld_melding part of a workflow?
|
||
IF l_workflowstep_key IS NULL
|
||
THEN
|
||
-- No, done.
|
||
RETURN;
|
||
END IF;
|
||
|
||
-- Als dit niet NULL waarden oplevert, dan is deze melding onderdeel van een workflow process
|
||
-- Bepaal nu de vervolgstappen binnen deze workflow (zelfde start_key).
|
||
-- Dit kunnen er meerdere zijn.
|
||
DECLARE
|
||
-- This cursor yields the next workflowssteps as defined in the workflow
|
||
-- That does not necessarily mean the the steps must be created at this time!
|
||
CURSOR c_nextsteps
|
||
IS
|
||
SELECT ws.mld_workflowstep_key, ws.mld_stdmelding_key, stdm.mld_ins_discipline_key,
|
||
disc.ins_srtdiscipline_key
|
||
FROM mld_workflowrule wr,
|
||
mld_workflowstep ws0,
|
||
mld_workflowstep ws,
|
||
mld_stdmelding stdm,
|
||
mld_discipline disc
|
||
WHERE stdm.mld_stdmelding_key = ws.mld_stdmelding_key
|
||
AND stdm.mld_ins_discipline_key = disc.ins_discipline_key
|
||
AND wr.mld_workflowstep_key = ws0.mld_workflowstep_key
|
||
AND ws.mld_workflowstep_start_key =
|
||
NVL (ws0.mld_workflowstep_start_key, ws.mld_workflowstep_start_key)
|
||
AND wr.mld_workflowstep_next_key = ws.mld_workflowstep_key
|
||
AND wr.mld_workflowrule_result = l_success
|
||
AND wr.mld_workflowstep_key = l_workflowstep_key;
|
||
|
||
r_nextsteps c_nextsteps%ROWTYPE;
|
||
BEGIN
|
||
OPEN c_nextsteps;
|
||
|
||
FETCH c_nextsteps INTO r_nextsteps;
|
||
|
||
IF c_nextsteps%NOTFOUND THEN
|
||
-- If no l_workflowstep_next_key was found, this workflow is done
|
||
-- THEN, close the originating l_melding_start_key
|
||
-- But only if there are no other threads open!
|
||
SELECT COUNT (mld_melding_key)
|
||
INTO tmp
|
||
FROM mld_melding
|
||
WHERE mld_melding_start_key = l_melding_start_key
|
||
AND mld_melding_status NOT IN (1,5,6)
|
||
AND mld_melding_key <> l_melding_start_key;
|
||
|
||
-- Als er geen lopende parallelle meldingen zijn, OF DEZE (eenzame) STAP WORDT AFGEWEZEN
|
||
-- Dan sluit de root. Overwogen dat de root niet Afgewezen wordt bij 0.
|
||
IF tmp = 0 OR l_success = 0
|
||
THEN
|
||
--DBMS_OUTPUT.PUT_LINE('Closing parent:' || l_melding_start_key);
|
||
mld.setmeldingstatus(l_melding_start_key, 5, null);
|
||
--ELSE
|
||
--DBMS_OUTPUT.PUT_LINE('no more steps, but still ' || tmp || ' open calls in workflow');
|
||
END IF;
|
||
|
||
--More?
|
||
RETURN;
|
||
ELSE
|
||
-- For each found l_workflowstep_next_key, create a new mld_melding
|
||
-- Using the properties (which?) of l_melding_start_key
|
||
-- And the flexprops of p_melding_key if these match the mld_srtkenmerk_key
|
||
LOOP
|
||
SELECT COUNT (*)
|
||
INTO l_nrofpredecessors
|
||
FROM mld_workflowrule wr1,
|
||
mld_workflowstep ws1
|
||
WHERE wr1.mld_workflowstep_key = ws1.mld_workflowstep_key
|
||
AND wr1.mld_workflowstep_next_key = r_nextsteps.mld_workflowstep_key;
|
||
--DBMS_OUTPUT.PUT_LINE ( 'startkey:' || l_melding_start_key || ' step key:' || r_nextsteps.mld_workflowstep_key);
|
||
SELECT COUNT (*)
|
||
INTO l_nrofreadypredecessors
|
||
FROM mld_melding m
|
||
WHERE m.mld_workflowstep_key IN (
|
||
SELECT wr1.mld_workflowstep_key
|
||
FROM mld_workflowrule wr1,
|
||
mld_workflowstep ws1
|
||
WHERE wr1.mld_workflowstep_key = ws1.mld_workflowstep_key
|
||
AND wr1.mld_workflowstep_next_key = r_nextsteps.mld_workflowstep_key)
|
||
-- the step to be continued
|
||
AND mld_melding_status IN (1, 5, 6) -- predecessor has been handled, no matter how
|
||
AND mld_melding_start_key = l_melding_start_key; -- for this thread
|
||
|
||
--DBMS_OUTPUT.put_line ( 'total nr of predecessors for next step: ' || l_nrofpredecessors);
|
||
--DBMS_OUTPUT.put_line ( 'READY nr of predecessors for next step: ' || l_nrofreadypredecessors);
|
||
IF l_nrofreadypredecessors >= l_nrofpredecessors OR p_success = -1
|
||
THEN
|
||
--DBMS_OUTPUT.put_line ( 'We GO for the next step '|| r_nextsteps.mld_workflowstep_key);
|
||
SELECT mld_s_mld_melding_key.NEXTVAL
|
||
INTO l_new_melding_key
|
||
FROM DUAL;
|
||
-- Merk op: voor sommige velden laten we bewust de default nemen
|
||
INSERT INTO mld_melding
|
||
(
|
||
mld_melding_key,
|
||
mld_melding_module,
|
||
mld_meldbron_key, mld_alg_locatie_key, mld_alg_onroerendgoed_keys,
|
||
mld_melding_datum, mld_melding_omschrijving, mld_melding_opmerking,
|
||
mld_stdmelding_key, mld_melding_status,
|
||
mld_kosten_klant, mld_melding_document, prs_kostenplaats_key,
|
||
prs_perslid_key,
|
||
mld_adres_key, mld_workflowstep_key,
|
||
mld_melding_start_key, mld_melding_ordernr, mld_melding_spoed)
|
||
SELECT
|
||
l_new_melding_key,
|
||
mld_melding_module,
|
||
mld_meldbron_key,
|
||
mld_alg_locatie_key, mld_alg_onroerendgoed_keys,
|
||
SYSDATE,
|
||
mld_melding_omschrijving,
|
||
lcl.l('lcl_mld_wf_generated_by')
|
||
|| p_melding_key
|
||
|| '. '
|
||
|| mld_melding_opmerking,
|
||
r_nextsteps.mld_stdmelding_key, 2,
|
||
mld_kosten_klant,
|
||
mld_melding_document, prs_kostenplaats_key, prs_perslid_key,
|
||
mld_adres_key,
|
||
r_nextsteps.mld_workflowstep_key, l_melding_start_key, mld_melding_ordernr, mld_melding_spoed
|
||
FROM mld_melding, mld_stdmelding msm
|
||
WHERE mld_melding_key = l_melding_start_key
|
||
AND msm.mld_stdmelding_key = r_nextsteps.mld_stdmelding_key;
|
||
|
||
fac.trackaction ('MLDNEW', l_new_melding_key, NULL, NULL, NULL); -- ook mld2bo notificatie
|
||
|
||
-- Neen AKZA#18432 revoked mld.setmeldingstatus (l_new_melding_key, 4, NULL); -- auto accept
|
||
-- Kopieer nu de flexkenmerken voor zover deze bij oud-EN-nieuw bestaan
|
||
DECLARE
|
||
CURSOR c_mld_kenmerken
|
||
IS
|
||
-- VERRASSEND, SLIPGEVAAR, lastige materie
|
||
-- Dit zijn (nu) alle ingevulde kenmerken van de voorlopende meldingen,
|
||
-- per soortkenmerk gesorteerd zdd de LAATST AANGEMAAKTE MELDING (hogere key)
|
||
-- eerst komt.
|
||
-- Verderop wordt steeds alleen de eerste beschouwd.
|
||
-- Dat betekent de de kenmerken van de melding die later in een workflow
|
||
-- worden aangepast sterker zijn dan de eerdere.
|
||
-- Een echt hele goeie oplossing is niet mogelijk.
|
||
-- Pas ook op: bij de voorgaande meldingen kunnen ook zomaar de vervolgstappen
|
||
-- betrokken worden die hierboven net aangemaakt zijn. Dat vinden we niet erg
|
||
-- want die zijn dan immers zojuist ook op dezelfde manier bepaald.
|
||
SELECT km.mld_kenmerkmelding_waarde, k.mld_srtkenmerk_key, m.mld_melding_key, k.mld_kenmerk_groep
|
||
FROM mld_kenmerkmelding km, mld_kenmerk k, mld_melding m, mld_srtkenmerk s
|
||
WHERE km.mld_kenmerkmelding_verwijder IS NULL
|
||
AND km.mld_kenmerk_key = k.mld_kenmerk_key
|
||
AND km.mld_melding_key = m.mld_melding_key
|
||
AND k.mld_srtkenmerk_key = s.mld_srtkenmerk_key
|
||
AND s.mld_srtkenmerk_kenmerktype NOT IN ('F','E')
|
||
AND m.mld_melding_start_key = l_melding_start_key
|
||
AND m.mld_melding_key < l_new_melding_key
|
||
ORDER BY 2, 4, 3 DESC;
|
||
|
||
r_mld_kenmerken c_mld_kenmerken%ROWTYPE;
|
||
l_new_kenmerk_key NUMBER (10);
|
||
wasbezigmetsrtkenmerk NUMBER(10);
|
||
wasbezigmetgroep NUMBER(10);
|
||
benbezigmetsrtkenmerk NUMBER(10);
|
||
benbezigmetgroep NUMBER(10);
|
||
BEGIN
|
||
wasbezigmetsrtkenmerk := -1;
|
||
wasbezigmetgroep := -1;
|
||
FOR r_mld_kenmerken IN c_mld_kenmerken LOOP
|
||
-- Does the new (std)melding r_nextsteps.mld_stdmelding_key have this flexprop as well? THEN use it
|
||
BEGIN
|
||
--DBMS_OUTPUT.PUT_LINE ( 'SELECT kk.mld_kenmerk_key ..' || r_mld_kenmerken.mld_srtkenmerk_key || ' ' || r_nextsteps.mld_stdmelding_key);
|
||
benbezigmetsrtkenmerk := r_mld_kenmerken.mld_srtkenmerk_key;
|
||
benbezigmetgroep := r_mld_kenmerken.mld_kenmerk_groep;
|
||
|
||
IF (benbezigmetsrtkenmerk <> wasbezigmetsrtkenmerk OR
|
||
(benbezigmetsrtkenmerk = wasbezigmetsrtkenmerk AND benbezigmetgroep <> wasbezigmetgroep))
|
||
THEN
|
||
wasbezigmetsrtkenmerk:= benbezigmetsrtkenmerk;
|
||
wasbezigmetgroep:= benbezigmetgroep;
|
||
--DBMS_OUTPUT.PUT_LINE ( 'EERSTE WAARDE VAN DIT KENMERK, van melding '||r_mld_kenmerken.mld_melding_key);
|
||
SELECT mld_kenmerk_key
|
||
INTO l_new_kenmerk_key
|
||
FROM (SELECT kk.mld_kenmerk_key
|
||
FROM mld_kenmerk kk
|
||
WHERE kk.mld_kenmerk_verwijder IS NULL
|
||
AND kk.mld_srtkenmerk_key = r_mld_kenmerken.mld_srtkenmerk_key
|
||
AND kk.mld_kenmerk_groep = r_mld_kenmerken.mld_kenmerk_groep
|
||
AND kk.mld_kenmerk_niveau = 'S'
|
||
AND kk.mld_stdmelding_key = r_nextsteps.mld_stdmelding_key
|
||
UNION
|
||
SELECT kk.mld_kenmerk_key
|
||
FROM mld_kenmerk kk
|
||
WHERE kk.mld_kenmerk_verwijder IS NULL
|
||
AND kk.mld_srtkenmerk_key = r_mld_kenmerken.mld_srtkenmerk_key
|
||
AND kk.mld_kenmerk_groep = r_mld_kenmerken.mld_kenmerk_groep
|
||
AND kk.mld_kenmerk_niveau = 'D'
|
||
AND kk.mld_stdmelding_key = r_nextsteps.mld_ins_discipline_key
|
||
UNION
|
||
SELECT kk.mld_kenmerk_key
|
||
FROM mld_kenmerk kk
|
||
WHERE kk.mld_kenmerk_verwijder IS NULL
|
||
AND kk.mld_srtkenmerk_key = r_mld_kenmerken.mld_srtkenmerk_key
|
||
AND kk.mld_kenmerk_groep = r_mld_kenmerken.mld_kenmerk_groep
|
||
AND kk.mld_kenmerk_niveau = 'T'
|
||
AND kk.mld_stdmelding_key = r_nextsteps.ins_srtdiscipline_key) x;
|
||
|
||
--DBMS_OUTPUT.PUT_LINE('ook aanwezig bij de nieuwe, met kenmerk_key');
|
||
--DBMS_OUTPUT.PUT_LINE(l_new_kenmerk_key);
|
||
--DBMS_OUTPUT.PUT_LINE('dus insert');
|
||
INSERT INTO mld_kenmerkmelding
|
||
(mld_melding_key, mld_kenmerk_key,
|
||
mld_kenmerkmelding_waarde
|
||
)
|
||
VALUES (l_new_melding_key, l_new_kenmerk_key,
|
||
r_mld_kenmerken.mld_kenmerkmelding_waarde
|
||
);
|
||
-- ELSE negeer dit record, we hebben deze al.
|
||
END IF;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND THEN NULL;
|
||
--DBMS_OUTPUT.PUT_LINE('not found');
|
||
WHEN TOO_MANY_ROWS THEN raise_application_error(-20000, 'Soortkenmerk ' || r_mld_kenmerken.mld_srtkenmerk_key || ' is op meerdere niveaus gedefinieerd');
|
||
--DBMS_OUTPUT.PUT_LINE('TOO MANY ROW');
|
||
END;
|
||
END LOOP;
|
||
END;
|
||
END IF;
|
||
|
||
FETCH c_nextsteps INTO r_nextsteps;
|
||
EXIT WHEN c_nextsteps%NOTFOUND;
|
||
END LOOP;
|
||
|
||
CLOSE c_nextsteps;
|
||
END IF;
|
||
END;
|
||
END mld_nextworkflowstep;
|
||
|
||
-- Bereken van de melding het object met de laagste uitvoertijd.
|
||
FUNCTION getlowestobjectuitvoer (p_melding_key IN NUMBER)
|
||
RETURN NUMBER
|
||
AS
|
||
v_ins_key_min_uitvoertijd NUMBER;
|
||
BEGIN
|
||
SELECT MAX (d.ins_deel_key) ins_deel_key
|
||
INTO v_ins_key_min_uitvoertijd
|
||
FROM ins_deel d,
|
||
mld_melding_object m
|
||
WHERE m.mld_melding_key = p_melding_key
|
||
AND d.ins_deel_key = m.ins_deel_key
|
||
AND (CASE
|
||
WHEN d.ins_deel_t_uitvoertijd.eenheid = 'U'
|
||
THEN d.ins_deel_t_uitvoertijd.tijdsduur / 24
|
||
ELSE d.ins_deel_t_uitvoertijd.tijdsduur
|
||
END) = (SELECT MIN (CASE
|
||
WHEN d1.ins_deel_t_uitvoertijd.eenheid = 'U'
|
||
THEN d1.ins_deel_t_uitvoertijd.tijdsduur / 24
|
||
ELSE d1.ins_deel_t_uitvoertijd.tijdsduur
|
||
END)
|
||
FROM ins_deel d1,
|
||
mld_melding_object m1
|
||
WHERE m1.mld_melding_key = p_melding_key
|
||
AND d1.ins_deel_key = m1.ins_deel_key);
|
||
|
||
RETURN v_ins_key_min_uitvoertijd;
|
||
END;
|
||
|
||
-- Dit is de tijd waarop afgerekend gaat worden. Respijt wordt er afgetrokken
|
||
FUNCTION getactualuitvoer (p_melding_key IN NUMBER)
|
||
RETURN NUMBER
|
||
AS
|
||
v_ins_key_min_uitvoertijd NUMBER;
|
||
v_actual_uitvoertijd NUMBER;
|
||
BEGIN
|
||
-- Bepaal van de melding het object met de laagste uitvoertijd.
|
||
v_ins_key_min_uitvoertijd := getlowestobjectuitvoer(p_melding_key);
|
||
|
||
SELECT mld.getactualuitvoer(m.mld_melding_datum,
|
||
COALESCE(fac.gettrackingdate('MLDAFM', m.mld_melding_key), fac.gettrackingdate('MLDREJ', m.mld_melding_key), SYSDATE),
|
||
m.mld_stdmelding_key,
|
||
m.mld_melding_spoed,
|
||
m.mld_alg_onroerendgoed_keys,
|
||
v_ins_key_min_uitvoertijd
|
||
)
|
||
INTO v_actual_uitvoertijd
|
||
FROM mld_melding m
|
||
WHERE mld_melding_key = p_melding_key;
|
||
RETURN v_actual_uitvoertijd;
|
||
END;
|
||
|
||
FUNCTION getactualuitvoer (startdate IN DATE,
|
||
enddate IN DATE,
|
||
stdm_key IN NUMBER,
|
||
prio IN NUMBER,
|
||
alg_key IN NUMBER, -- Altijd gebouw of hoger, locatie niet ondersteund
|
||
ins_key IN NUMBER -- Object met de laagste uitvoertijd
|
||
)
|
||
RETURN NUMBER
|
||
AS
|
||
v_actual_uitvoertijd NUMBER;
|
||
v_uitvoertijdtype VARCHAR2(5);
|
||
v_mld_stdmelding_regime mld_stdmelding.mld_stdmelding_regime%TYPE;
|
||
v_uitvoertijd_object mld_stdmelding.mld_stdmelding_t_uitvoertijd%TYPE := MLD_T_UITVOERTIJD(NULL, NULL); -- contructor initialisatie;
|
||
v_beginuur alg_gebouw.alg_gebouw_beginuur%TYPE;
|
||
v_einduur alg_gebouw.alg_gebouw_einduur%TYPE;
|
||
v_werkdagen alg_gebouw.alg_gebouw_werkdagen%TYPE;
|
||
BEGIN
|
||
getSLAparams(stdm_key, prio, alg_key, ins_key,
|
||
v_mld_stdmelding_regime, v_uitvoertijd_object, v_beginuur, v_einduur, v_werkdagen);
|
||
IF v_uitvoertijd_object.eenheid = 'D'
|
||
THEN
|
||
v_uitvoertijdtype := 'DAGEN';
|
||
ELSE
|
||
v_uitvoertijdtype := 'UREN';
|
||
END IF;
|
||
|
||
-- Als bij openingstijden geen ruimte/gebouwopeningstijden zijn gevonden dan terugvallen op kantoortijden.
|
||
IF v_mld_stdmelding_regime = 1 OR (v_mld_stdmelding_regime = 2 AND (v_beginuur = -1 OR v_einduur = -1)) -- kantoortijden, als in 5.1.2
|
||
THEN
|
||
v_actual_uitvoertijd :=
|
||
FAC.datumtijdnaaruitvoertijd (startdate, enddate, v_uitvoertijdtype);
|
||
ELSIF v_mld_stdmelding_regime = 2 -- Openingstijden: gebruik ruimte/gebouwopeningstijden er bij
|
||
THEN
|
||
v_actual_uitvoertijd :=
|
||
FAC.datumtijdnaaruitvoertijd (startdate,
|
||
enddate,
|
||
v_uitvoertijdtype,
|
||
v_beginuur,
|
||
v_einduur,
|
||
v_werkdagen); -- Mode=0/1 resp. alle dagen/alleen werkdagen!
|
||
ELSIF v_mld_stdmelding_regime = 3 -- 24/7, negeert weekenden of vrije dagen
|
||
THEN
|
||
v_actual_uitvoertijd :=
|
||
FAC.datumtijdnaaruitvoertijd (startdate,
|
||
enddate,
|
||
v_uitvoertijdtype,
|
||
NULL, -- Don't care
|
||
NULL, -- Don't care
|
||
2); -- Mode=2 => 24/7
|
||
END IF;
|
||
RETURN v_actual_uitvoertijd;
|
||
END;
|
||
|
||
-- bereken de SLA-einddatum gegeven onderstaande info
|
||
FUNCTION geteinddatum (startdate IN DATE,
|
||
stdm_key IN NUMBER,
|
||
prio IN NUMBER,
|
||
alg_key IN NUMBER, -- Altijd gebouw of hoger, locatie niet ondersteund
|
||
ins_key IN NUMBER, -- Object met de laagste uitvoertijd
|
||
uitvoertijd_object IN MLD_T_UITVOERTIJD DEFAULT MLD_T_UITVOERTIJD(NULL, NULL)) -- Als meegegeven dan wordt dit genomen als norm
|
||
RETURN DATE -- Handig voor (bevroren) mld_melding_uitvoertijd + respijt
|
||
AS
|
||
v_einddatum DATE;
|
||
v_mld_stdmelding_regime mld_stdmelding.mld_stdmelding_regime%TYPE;
|
||
v_uitvoertijd_object mld_stdmelding.mld_stdmelding_t_uitvoertijd%TYPE := MLD_T_UITVOERTIJD(NULL, NULL); -- contructor initialisatie;
|
||
v_uitvoertijdtype VARCHAR2(5);
|
||
v_beginuur alg_gebouw.alg_gebouw_beginuur%TYPE;
|
||
v_einduur alg_gebouw.alg_gebouw_einduur%TYPE;
|
||
v_werkdagen NUMBER;
|
||
BEGIN
|
||
getSLAparams(stdm_key, prio, alg_key, ins_key,
|
||
v_mld_stdmelding_regime, v_uitvoertijd_object, v_beginuur, v_einduur, v_werkdagen);
|
||
|
||
IF uitvoertijd_object.eenheid IS NOT NULL
|
||
THEN
|
||
v_uitvoertijd_object := uitvoertijd_object;
|
||
END IF;
|
||
|
||
IF v_uitvoertijd_object.eenheid = 'D'
|
||
THEN
|
||
v_uitvoertijdtype := 'DAGEN';
|
||
ELSE
|
||
v_uitvoertijdtype := 'UREN';
|
||
END IF;
|
||
|
||
-- Als bij openingstijden geen ruimte/gebouwopeningstijden zijn gevonden dan terugvallen op kantoortijden.
|
||
IF v_mld_stdmelding_regime = 1 OR (v_mld_stdmelding_regime = 2 AND (v_beginuur = -1 OR v_einduur = -1)) -- kantoortijden, als in 5.1.2
|
||
THEN
|
||
v_einddatum :=
|
||
FAC.DatumTijdPlusUitvoerTijd (startdate,
|
||
v_uitvoertijd_object.tijdsduur,
|
||
v_uitvoertijdtype);
|
||
ELSIF v_mld_stdmelding_regime = 2 -- Openingstijden: gebruik ruimte/gebouwopeningstijden er bij
|
||
THEN
|
||
v_einddatum :=
|
||
FAC.datumtijdplusuitvoertijd (startdate,
|
||
v_uitvoertijd_object.tijdsduur,
|
||
v_uitvoertijdtype,
|
||
v_beginuur,
|
||
v_einduur,
|
||
v_werkdagen); -- Mode=0/1 resp. alle dagen/alleen werkdagen!
|
||
ELSIF v_mld_stdmelding_regime = 3 -- 24/7, negeert weekenden of vrije dagen
|
||
THEN
|
||
v_einddatum :=
|
||
FAC.datumtijdplusuitvoertijd (startdate,
|
||
v_uitvoertijd_object.tijdsduur,
|
||
v_uitvoertijdtype,
|
||
NULL, -- Don't care
|
||
NULL, -- Don't care
|
||
2); -- Mode=2 => 24/7
|
||
END IF;
|
||
|
||
RETURN v_einddatum;
|
||
END;
|
||
|
||
FUNCTION geteinddatum (p_melding_key IN NUMBER,
|
||
p_uitvoertijd_object IN MLD_T_UITVOERTIJD DEFAULT MLD_T_UITVOERTIJD(NULL, NULL), -- Als meegegeven dan wordt dit genomen als norm
|
||
p_startdate IN DATE DEFAULT NULL) -- Bereken einddatum met startdatum (voor opdrachten en meldingen verschillend)
|
||
RETURN DATE
|
||
AS
|
||
v_ins_key_min_uitvoertijd NUMBER := NULL;
|
||
v_einddatum DATE;
|
||
BEGIN
|
||
-- Als p_uitvoertijd_object meegegeven is dan is object met de laagste uitvoertijd niet meer van belang
|
||
IF p_uitvoertijd_object.eenheid IS NULL
|
||
THEN
|
||
-- Bepaal van de melding het object met de laagste uitvoertijd.
|
||
v_ins_key_min_uitvoertijd := getlowestobjectuitvoer(p_melding_key);
|
||
END IF;
|
||
|
||
SELECT mld.geteinddatum(COALESCE(p_startdate, m.mld_melding_datum),
|
||
m.mld_stdmelding_key,
|
||
m.mld_melding_spoed,
|
||
m.mld_alg_onroerendgoed_keys,
|
||
v_ins_key_min_uitvoertijd, -- Object met de laagste uitvoertijd
|
||
p_uitvoertijd_object
|
||
)
|
||
INTO v_einddatum
|
||
FROM mld_melding m
|
||
WHERE mld_melding_key = p_melding_key;
|
||
RETURN v_einddatum;
|
||
END;
|
||
|
||
-- Bereken de standaard uitvoertijd
|
||
FUNCTION getstduitvoer (stdm_key IN NUMBER,
|
||
prio IN NUMBER,
|
||
alg_key IN NUMBER, -- Altijd gebouw of hoger, locatie niet ondersteund
|
||
ins_key IN NUMBER) -- Object met de laagste uitvoertijd
|
||
RETURN MLD_T_UITVOERTIJD
|
||
AS
|
||
v_uitvoertijd_object mld_stdmelding.mld_stdmelding_t_uitvoertijd%TYPE := MLD_T_UITVOERTIJD(NULL, NULL); -- contructor initialisatie
|
||
v_mld_stdmelding_regime mld_stdmelding.mld_stdmelding_regime%TYPE;
|
||
v_beginuur alg_gebouw.alg_gebouw_beginuur%TYPE;
|
||
v_einduur alg_gebouw.alg_gebouw_einduur%TYPE;
|
||
v_werkdagen NUMBER;
|
||
BEGIN
|
||
getSLAparams(stdm_key, prio, alg_key, ins_key,
|
||
v_mld_stdmelding_regime, v_uitvoertijd_object, v_beginuur, v_einduur, v_werkdagen);
|
||
RETURN v_uitvoertijd_object;
|
||
END;
|
||
|
||
-- Bereken de standaard uitvoertijd
|
||
FUNCTION getstduitvoer (p_melding_key IN NUMBER)
|
||
RETURN MLD_T_UITVOERTIJD
|
||
AS
|
||
v_uitvoertijd_object mld_stdmelding.mld_stdmelding_t_uitvoertijd%TYPE := MLD_T_UITVOERTIJD(NULL, NULL); -- contructor initialisatie
|
||
v_ins_key_min_uitvoertijd NUMBER;
|
||
v_ins_key_min_uitvoertijd_eenh NUMBER;
|
||
v_std_uitvoertijd NUMBER;
|
||
v_std_uitvoertijd_eenheid NUMBER;
|
||
BEGIN
|
||
-- Bepaal van de melding het object met de laagste uitvoertijd.
|
||
v_ins_key_min_uitvoertijd := getlowestobjectuitvoer(p_melding_key);
|
||
SELECT mld.getstduitvoer(m.mld_stdmelding_key,
|
||
m.mld_melding_spoed,
|
||
m.mld_alg_onroerendgoed_keys,
|
||
v_ins_key_min_uitvoertijd
|
||
)
|
||
INTO v_uitvoertijd_object
|
||
FROM mld_melding m
|
||
WHERE mld_melding_key = p_melding_key;
|
||
RETURN v_uitvoertijd_object;
|
||
END;
|
||
PROCEDURE getSLAparams (stdm_key IN NUMBER,
|
||
prio IN NUMBER,
|
||
alg_key IN NUMBER, -- Altijd gebouw of hoger, locatie niet ondersteund
|
||
ins_key IN NUMBER, -- Object met de laagste uitvoertijd
|
||
v_mld_stdmelding_regime OUT NUMBER,
|
||
v_uitvoertijd_object OUT MLD_T_UITVOERTIJD,
|
||
v_beginuur OUT NUMBER,
|
||
v_einduur OUT NUMBER,
|
||
v_werkdagen OUT NUMBER
|
||
)
|
||
AS
|
||
v_uitvoertijd_object_s mld_stdmelding.mld_stdmelding_t_uitvoertijd%TYPE := MLD_T_UITVOERTIJD(NULL, NULL); -- contructor initialisatie
|
||
v_mld_stdmelding_afhankelijk mld_stdmelding.mld_stdmelding_afhankelijk%TYPE;
|
||
l_ruimte_key alg_ruimte.alg_ruimte_key%TYPE;
|
||
l_insdeel_uitvoertijd_object ins_deel.ins_deel_t_uitvoertijd%TYPE := MLD_T_UITVOERTIJD(NULL, NULL); -- contructor initialisatie
|
||
l_srtruimte_uitvoertijd_object alg_srtruimte.alg_srtruimte_t_uitvoertijd%TYPE := MLD_T_UITVOERTIJD(NULL, NULL); -- contructor initialisatie
|
||
BEGIN
|
||
SELECT mld_stdmelding_regime,
|
||
COALESCE(CASE prio
|
||
WHEN 1 THEN mld_stdmelding_t_uitvtijd_pr1
|
||
WHEN 2 THEN mld_stdmelding_t_uitvtijd_pr2
|
||
WHEN 4 THEN mld_stdmelding_t_uitvtijd_pr4
|
||
ELSE mld_stdmelding_t_uitvoertijd
|
||
END, mld_stdmelding_t_uitvoertijd), -- gegarandeerd gevuld
|
||
mld_stdmelding_t_uitvoertijd, -- standaard uitvoertijd
|
||
mld_stdmelding_afhankelijk
|
||
INTO v_mld_stdmelding_regime,
|
||
v_uitvoertijd_object,
|
||
v_uitvoertijd_object_s,
|
||
v_mld_stdmelding_afhankelijk
|
||
FROM mld_stdmelding msm
|
||
WHERE msm.mld_stdmelding_key = stdm_key;
|
||
|
||
IF v_mld_stdmelding_afhankelijk = 1 AND ins_key IS NOT NULL
|
||
THEN
|
||
SELECT d.ins_deel_t_uitvoertijd
|
||
INTO l_insdeel_uitvoertijd_object
|
||
FROM ins_deel d
|
||
WHERE d.ins_deel_key = ins_key;
|
||
v_uitvoertijd_object.tijdsduur := COALESCE(l_insdeel_uitvoertijd_object.tijdsduur, v_uitvoertijd_object_s.tijdsduur);
|
||
IF l_insdeel_uitvoertijd_object.tijdsduur IS NOT NULL
|
||
THEN
|
||
v_uitvoertijd_object.eenheid := l_insdeel_uitvoertijd_object.eenheid;
|
||
ELSE
|
||
v_uitvoertijd_object.eenheid := v_uitvoertijd_object_s.eenheid;
|
||
END IF;
|
||
END IF;
|
||
|
||
IF v_mld_stdmelding_afhankelijk = 1 AND l_insdeel_uitvoertijd_object.tijdsduur IS NULL AND alg_key IS NOT NULL
|
||
THEN
|
||
-- Als alg_srtruimte_uitvoertijd geen waarde heeft, dan terugvallen op standaard uitvoertijd die altijd een waarde heeft
|
||
SELECT alg_srtruimte_t_uitvoertijd
|
||
INTO l_srtruimte_uitvoertijd_object
|
||
FROM alg_ruimte r,
|
||
alg_srtruimte sr
|
||
WHERE r.alg_srtruimte_key = sr.alg_srtruimte_key(+)
|
||
AND r.alg_ruimte_key = alg_key;
|
||
|
||
-- Uitvoertijd van de srtruimte nemen.
|
||
v_uitvoertijd_object.tijdsduur := COALESCE(l_srtruimte_uitvoertijd_object.tijdsduur, v_uitvoertijd_object_s.tijdsduur);
|
||
IF l_srtruimte_uitvoertijd_object.tijdsduur IS NOT NULL
|
||
THEN
|
||
v_uitvoertijd_object.eenheid := l_srtruimte_uitvoertijd_object.eenheid;
|
||
ELSE
|
||
v_uitvoertijd_object.eenheid := v_uitvoertijd_object_s.eenheid;
|
||
END IF;
|
||
END IF;
|
||
|
||
IF alg_key IS NULL AND v_mld_stdmelding_regime = 2
|
||
THEN
|
||
v_mld_stdmelding_regime := 1; -- dan terugvallen op algemene kantooruren
|
||
END IF;
|
||
IF v_mld_stdmelding_regime = 2 -- Openingstijden: zoek ruimte/gebouwopeningstijden er bij
|
||
THEN
|
||
SELECT MAX(alg_ruimte_key)
|
||
INTO l_ruimte_key
|
||
FROM alg_ruimte r
|
||
WHERE r.alg_ruimte_key = alg_key;
|
||
-- Minstens <20><>n van beide keys is gedefinieerd, zeker weten
|
||
IF l_ruimte_key IS NOT NULL
|
||
THEN
|
||
-- de tijden van de ruimte of anders het gebouw gelden
|
||
SELECT COALESCE (alg_ruimte_beginuur, alg_gebouw_beginuur, -1),
|
||
COALESCE (alg_ruimte_einduur, alg_gebouw_einduur, -1),
|
||
COALESCE (alg_ruimte_werkdagen, alg_gebouw_werkdagen)
|
||
INTO v_beginuur, v_einduur, v_werkdagen
|
||
FROM alg_ruimte r, alg_verdieping v, alg_gebouw g
|
||
WHERE r.alg_verdieping_key = v.alg_verdieping_key
|
||
AND v.alg_gebouw_key = g.alg_gebouw_key
|
||
AND r.alg_ruimte_key = l_ruimte_key;
|
||
ELSE -- alg_key zal een gebouw of een verdieping zijn
|
||
-- de tijden van het gebouw gelden
|
||
SELECT alg_gebouw_beginuur, alg_gebouw_einduur, alg_gebouw_werkdagen
|
||
INTO v_beginuur, v_einduur, v_werkdagen
|
||
FROM alg_gebouw g, alg_v_allonroerendgoed aag
|
||
WHERE g.alg_gebouw_key = aag.alg_gebouw_key
|
||
AND aag.alg_onroerendgoed_keys = alg_key
|
||
AND aag.alg_type = 'G';
|
||
END IF;
|
||
END IF;
|
||
RETURN;
|
||
END;
|
||
|
||
FUNCTION getacceptdatum (startdate IN DATE, stdm_key IN NUMBER, alg_key IN NUMBER)
|
||
RETURN DATE
|
||
IS
|
||
l_accepttijd_object mld_stdmelding.mld_stdmelding_t_accepttijd%TYPE := MLD_T_UITVOERTIJD(NULL, NULL); -- contructor initialisatie;
|
||
l_stdmelding_regime mld_stdmelding.mld_stdmelding_regime%TYPE;
|
||
l_ruimte_key alg_ruimte.alg_ruimte_key%TYPE;
|
||
l_beginuur alg_gebouw.alg_gebouw_beginuur%TYPE;
|
||
l_einduur alg_gebouw.alg_gebouw_einduur%TYPE;
|
||
l_werkdagen NUMBER;
|
||
l_uitvoertijdtype VARCHAR2(5);
|
||
BEGIN
|
||
SELECT mld_stdmelding_t_accepttijd,
|
||
mld_stdmelding_regime
|
||
INTO l_accepttijd_object,
|
||
l_stdmelding_regime
|
||
FROM mld_stdmelding
|
||
WHERE mld_stdmelding_key = stdm_key;
|
||
|
||
-- mld_stdmelding_regime: 1) Kantoortijden regime
|
||
-- 2) Openingstijden regime
|
||
-- 3) 24/7 regime (negeert weekenden of vrije dagen)
|
||
-- De functie fac.datumtijdplusuitvoertijd kan rekenen met zowel dagen als uren
|
||
|
||
IF l_accepttijd_object.eenheid = 'D'
|
||
THEN
|
||
l_uitvoertijdtype := 'DAGEN';
|
||
ELSE
|
||
l_uitvoertijdtype := 'UREN';
|
||
END IF;
|
||
|
||
IF (l_stdmelding_regime = 1) OR (alg_key IS NULL AND l_stdmelding_regime = 2) -- Kantoortijdenregime of hierop terugvallen
|
||
THEN
|
||
RETURN fac.datumtijdplusuitvoertijd (startdate, l_accepttijd_object.tijdsduur, l_uitvoertijdtype);
|
||
END IF;
|
||
|
||
IF l_stdmelding_regime = 2 -- Openingstijden: zoek ruimte/gebouwopeningstijden er bij
|
||
THEN
|
||
SELECT MAX(alg_ruimte_key)
|
||
INTO l_ruimte_key
|
||
FROM alg_ruimte r
|
||
WHERE r.alg_ruimte_key = alg_key;
|
||
|
||
-- Minstens <20><>n van beide keys is gedefinieerd, zeker weten
|
||
IF l_ruimte_key IS NOT NULL
|
||
THEN
|
||
-- de tijden van de ruimte of anders het gebouw gelden
|
||
SELECT COALESCE (alg_ruimte_beginuur, alg_gebouw_beginuur, 0),
|
||
COALESCE (alg_ruimte_einduur, alg_gebouw_einduur, 24),
|
||
COALESCE (alg_ruimte_werkdagen, alg_gebouw_werkdagen)
|
||
INTO l_beginuur, l_einduur, l_werkdagen
|
||
FROM alg_ruimte r, alg_verdieping v, alg_gebouw g
|
||
WHERE r.alg_verdieping_key = v.alg_verdieping_key
|
||
AND v.alg_gebouw_key = g.alg_gebouw_key
|
||
AND r.alg_ruimte_key = l_ruimte_key;
|
||
ELSE -- alg_key zal een gebouw of een verdieping zijn
|
||
-- de tijden van het gebouw gelden
|
||
SELECT COALESCE (alg_gebouw_beginuur, 0),
|
||
COALESCE (alg_gebouw_einduur, 24),
|
||
alg_gebouw_werkdagen
|
||
INTO l_beginuur, l_einduur, l_werkdagen
|
||
FROM alg_gebouw g, alg_v_allonroerendgoed aag
|
||
WHERE g.alg_gebouw_key = aag.alg_gebouw_key
|
||
AND aag.alg_onroerendgoed_keys = alg_key
|
||
AND aag.alg_type = 'G';
|
||
END IF;
|
||
|
||
RETURN FAC.datumtijdplusuitvoertijd (startdate,
|
||
l_accepttijd_object.tijdsduur,
|
||
l_uitvoertijdtype,
|
||
l_beginuur,
|
||
l_einduur,
|
||
l_werkdagen); -- Mode=0/1 resp. alle dagen/alleen werkdagen!
|
||
END IF;
|
||
|
||
IF l_stdmelding_regime = 3 -- 24/7, negeert weekenden of vrije dagen
|
||
THEN
|
||
RETURN FAC.datumtijdplusuitvoertijd (startdate,
|
||
l_accepttijd_object.tijdsduur,
|
||
l_accepttijd_object.eenheid,
|
||
NULL, -- Don't care
|
||
NULL, -- Don't care
|
||
2); -- Mode=2 => 24/7
|
||
END IF;
|
||
END;
|
||
|
||
FUNCTION BepaalOpdrMeldingVolgnr(p_melding_key IN NUMBER) RETURN NUMBER IS
|
||
ReturnVal NUMBER;
|
||
BEGIN
|
||
SELECT COALESCE(MAX(mld_opdr_bedrijfopdr_volgnr),0) + 1
|
||
INTO ReturnVal
|
||
FROM mld_opdr
|
||
WHERE mld_melding_key = p_melding_key;
|
||
RETURN ReturnVal;
|
||
END;
|
||
|
||
FUNCTION BepaalOpdrContractVolgnr(p_contract_key IN NUMBER) RETURN NUMBER IS
|
||
ReturnVal NUMBER;
|
||
BEGIN
|
||
SELECT COALESCE(MAX(mld_opdr_bedrijfopdr_volgnr),0) + 1
|
||
INTO ReturnVal
|
||
FROM mld_opdr
|
||
WHERE cnt_contract_key = p_contract_key;
|
||
RETURN ReturnVal;
|
||
END;
|
||
|
||
FUNCTION mldsprintf (ps IN varchar2 , p_melding_key IN number)
|
||
RETURN varchar2 IS
|
||
s varchar2 (2048 CHAR);
|
||
varstdmld mld_stdmelding.mld_stdmelding_omschrijving%TYPE;
|
||
vardisc ins_tab_discipline.ins_discipline_omschrijving%TYPE;
|
||
varsrtdisc ins_srtdiscipline.ins_srtdiscipline_prefix%TYPE;
|
||
varplaats alg_v_plaatsaanduiding_all.alg_plaatsaanduiding%TYPE;
|
||
BEGIN
|
||
s := ps;
|
||
-- We do support substitution of placeholders in the messages
|
||
-- ##DISC## = ins_discipline_omschrijving
|
||
-- ##STDMLD## = mld_stdmelding_omschrijving
|
||
-- ##KEY## = ins_srtdiscipline_prefix+key
|
||
-- ##PLAATS## = plaatsaanduidig van plaats service
|
||
IF INSTR (s, '#') > 0
|
||
THEN
|
||
SELECT lcl.x ('mld_stdmelding_omschrijving',
|
||
stdm.mld_stdmelding_key,
|
||
stdm.mld_stdmelding_omschrijving),
|
||
lcl.x ('ins_discipline_omschrijving',
|
||
d.ins_discipline_key,
|
||
d.ins_discipline_omschrijving),
|
||
sd.ins_srtdiscipline_prefix
|
||
INTO varstdmld, vardisc, varsrtdisc
|
||
FROM mld_stdmelding stdm, ins_tab_discipline d, ins_srtdiscipline sd, mld_melding m
|
||
WHERE d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
|
||
AND stdm.mld_ins_discipline_key = d.ins_discipline_key
|
||
AND stdm.mld_stdmelding_key = m.mld_stdmelding_key
|
||
AND m.mld_melding_key = p_melding_key;
|
||
s :=
|
||
REPLACE (REPLACE (REPLACE (s, '##DISC##', vardisc), '##STDMLD##', varstdmld),
|
||
'##KEY##',
|
||
varsrtdisc || TO_CHAR (p_melding_key)
|
||
);
|
||
IF INSTR (s, '#') > 0
|
||
THEN
|
||
-- Pas op: p.alg_onroerendgoed_keys is niet uniek, daarom alg_v_allonroerendgoed nodig.
|
||
SELECT NVL (p.alg_plaatsaanduiding, '')
|
||
INTO varplaats
|
||
FROM mld_melding m, alg_v_plaatsaanduiding_all p, alg_v_allonroerendgoed ao
|
||
WHERE p.alg_onroerendgoed_keys = ao.alg_onroerendgoed_keys
|
||
AND p.alg_onroerendgoed_type = ao.alg_type
|
||
AND ao.alg_onroerendgoed_keys = m.mld_alg_onroerendgoed_keys
|
||
AND ao.alg_locatie_key = m.mld_alg_locatie_key
|
||
AND m.mld_alg_onroerendgoed_keys IS NOT NULL
|
||
AND m.mld_melding_key = p_melding_key;
|
||
s := REPLACE (s, '##PLAATS##', varplaats);
|
||
END IF;
|
||
END IF;
|
||
RETURN s;
|
||
END;
|
||
FUNCTION opdrsprintf (ps IN varchar2, p_opdr_key IN number)
|
||
RETURN varchar2
|
||
IS
|
||
s varchar2 (2048 CHAR);
|
||
lmld_melding_key mld_opdr.mld_melding_key%TYPE;
|
||
lbedrijfopdr_volgnr mld_opdr.mld_opdr_bedrijfopdr_volgnr%TYPE;
|
||
lopdr_omschrijving mld_opdr.mld_opdr_omschrijving%TYPE;
|
||
lopdrstatus mld_opdr.mld_statusopdr_key%TYPE;
|
||
lafmelderkey fac_tracking.prs_perslid_key%TYPE;
|
||
lafmelder prs_v_perslid_fullnames_all.prs_perslid_naam_full%TYPE;
|
||
varstdmld mld_stdmelding.mld_stdmelding_omschrijving%TYPE;
|
||
vardisc ins_tab_discipline.ins_discipline_omschrijving%TYPE;
|
||
varsrtdisc ins_srtdiscipline.ins_srtdiscipline_prefix%TYPE;
|
||
varspoed mld_melding.mld_melding_spoed%TYPE;
|
||
varplaats alg_v_plaatsaanduiding_all.alg_plaatsaanduiding%TYPE;
|
||
varopdrtype mld_typeopdr.mld_typeopdr_omschrijving%TYPE;
|
||
BEGIN
|
||
s := ps;
|
||
|
||
-- We support substitution of placeholders in the messages
|
||
-- ##OPDRKEY## = ins_srtdiscipline_prefix+key+/+volgnr (zie: RWSN#18845!)
|
||
-- ##DISC## = ins_discipline_omschrijving
|
||
-- ##STDMLD## = mld_stdmelding_omschrijving
|
||
-- ##DESC## = mld_opdr_omschrijving (tbv SMS)
|
||
-- ##SPOED## = 'SPOED' indien spoed, anders ''
|
||
-- ##PLAATS## = plaatsaanduidig van plaats service
|
||
-- ##OPDRTYPE## = opdrachttype
|
||
IF instr2 (s, '#') > 0
|
||
THEN
|
||
SELECT o.mld_melding_key,
|
||
o.mld_opdr_bedrijfopdr_volgnr,
|
||
o.mld_opdr_omschrijving,
|
||
o.mld_statusopdr_key,
|
||
lcl.x ('mld_typeopdr_omschrijving',
|
||
o.mld_typeopdr_key,
|
||
ot.mld_typeopdr_omschrijving)
|
||
INTO lmld_melding_key,
|
||
lbedrijfopdr_volgnr,
|
||
lopdr_omschrijving,
|
||
lopdrstatus,
|
||
varopdrtype
|
||
FROM mld_opdr o, mld_typeopdr ot
|
||
WHERE o.mld_typeopdr_key = ot.mld_typeopdr_key AND o.mld_opdr_key = p_opdr_key;
|
||
|
||
-- Tijdens het tracken van het afmelden is de transactie nog niet
|
||
-- afgelopen, en levert het zoeken naar de afmelder via tracking
|
||
-- (nog) geen resultaat op. WE KUNNEN HIER DUS NIET NOTIFICEREN
|
||
-- WIE ER HEEFT AFGEMELD.
|
||
SELECT lcl.x ('mld_stdmelding_omschrijving',
|
||
stdm.mld_stdmelding_key,
|
||
stdm.mld_stdmelding_omschrijving),
|
||
lcl.x ('ins_discipline_omschrijving',
|
||
d.ins_discipline_key,
|
||
d.ins_discipline_omschrijving),
|
||
sd.ins_srtdiscipline_prefix,
|
||
m.mld_melding_spoed
|
||
INTO varstdmld,
|
||
vardisc,
|
||
varsrtdisc,
|
||
varspoed
|
||
FROM mld_melding m,
|
||
mld_stdmelding stdm,
|
||
ins_tab_discipline d,
|
||
ins_srtdiscipline sd
|
||
WHERE d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
|
||
AND stdm.mld_ins_discipline_key = d.ins_discipline_key
|
||
AND stdm.mld_stdmelding_key = m.mld_stdmelding_key
|
||
AND m.mld_melding_key = lmld_melding_key;
|
||
|
||
BEGIN
|
||
-- Pas op: p.alg_onroerendgoed_keys is niet uniek, daarom alg_v_allonroerendgoed nodig.
|
||
SELECT NVL (p.alg_plaatsaanduiding, '')
|
||
INTO varplaats
|
||
FROM mld_melding m, alg_v_plaatsaanduiding_all p, alg_v_allonroerendgoed ao
|
||
WHERE p.alg_onroerendgoed_keys = ao.alg_onroerendgoed_keys
|
||
AND p.alg_onroerendgoed_type = ao.alg_type
|
||
AND ao.alg_onroerendgoed_keys = m.mld_alg_onroerendgoed_keys
|
||
AND ao.alg_locatie_key = m.mld_alg_locatie_key
|
||
AND m.mld_alg_onroerendgoed_keys IS NOT NULL
|
||
AND m.mld_melding_key = lmld_melding_key;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
varplaats := '';
|
||
END;
|
||
|
||
s :=
|
||
REPLACE (
|
||
REPLACE (
|
||
REPLACE (
|
||
REPLACE (
|
||
REPLACE (
|
||
REPLACE (
|
||
s,
|
||
'##OPDRKEY##',
|
||
varsrtdisc
|
||
|| TO_CHAR (lmld_melding_key)
|
||
|| '/'
|
||
|| TO_CHAR (lbedrijfopdr_volgnr)),
|
||
'##DISC##',
|
||
vardisc),
|
||
'##STDMLD##',
|
||
varstdmld),
|
||
'##DESC##',
|
||
lopdr_omschrijving),
|
||
'##OPDRTYPE##',
|
||
varopdrtype),
|
||
'##PLAATS##',
|
||
varplaats);
|
||
|
||
IF varspoed = 1
|
||
THEN
|
||
s := REPLACE (s, '##SPOED##', '(' || lcl.l('lcl_mld_spoed') || ')');
|
||
ELSE
|
||
s := REPLACE (s, '##SPOED##', '');
|
||
END IF;
|
||
END IF;
|
||
|
||
s := REPLACE (s, ' ()', '');
|
||
RETURN s;
|
||
END;
|
||
|
||
PROCEDURE upsertmeldingkenmerk (p_kenmerk_key IN NUMBER, p_mld_key IN NUMBER, p_waarde IN VARCHAR2)
|
||
IS
|
||
v_count NUMBER;
|
||
BEGIN
|
||
SELECT COUNT ( * )
|
||
INTO v_count
|
||
FROM mld_kenmerkmelding
|
||
WHERE mld_melding_key = p_mld_key
|
||
AND mld_kenmerk_key = p_kenmerk_key
|
||
AND mld_kenmerkmelding_verwijder IS NULL;
|
||
|
||
IF v_count = 1
|
||
THEN
|
||
IF p_waarde IS NULL
|
||
THEN
|
||
DELETE mld_kenmerkmelding
|
||
WHERE mld_melding_key = p_mld_key
|
||
AND mld_kenmerk_key = p_kenmerk_key
|
||
AND mld_kenmerkmelding_verwijder IS NULL;
|
||
ELSE
|
||
UPDATE mld_kenmerkmelding
|
||
SET mld_kenmerkmelding_waarde = p_waarde
|
||
WHERE mld_melding_key = p_mld_key
|
||
AND mld_kenmerk_key = p_kenmerk_key
|
||
AND mld_kenmerkmelding_verwijder IS NULL;
|
||
END IF;
|
||
ELSE
|
||
IF p_kenmerk_key IS NOT NULL AND p_waarde IS NOT NULL
|
||
THEN
|
||
INSERT INTO mld_kenmerkmelding (mld_kenmerk_key,
|
||
mld_melding_key,
|
||
mld_kenmerkmelding_waarde)
|
||
VALUES (p_kenmerk_key, p_mld_key, p_waarde);
|
||
END IF;
|
||
END IF;
|
||
END;
|
||
|
||
-- Er wordt niet getrackt (wat eigenlijk niet zo goed is)
|
||
PROCEDURE upsertopdrachtkenmerk (p_kenmerk_key IN NUMBER, p_opdr_key IN NUMBER, p_waarde IN VARCHAR2)
|
||
IS
|
||
v_count NUMBER;
|
||
BEGIN
|
||
SELECT COUNT ( * )
|
||
INTO v_count
|
||
FROM mld_kenmerkopdr
|
||
WHERE mld_opdr_key = p_opdr_key
|
||
AND mld_kenmerk_key = p_kenmerk_key
|
||
AND mld_kenmerkopdr_verwijder IS NULL;
|
||
|
||
IF v_count = 1
|
||
THEN
|
||
IF p_waarde IS NULL
|
||
THEN
|
||
DELETE mld_kenmerkopdr
|
||
WHERE mld_opdr_key = p_opdr_key
|
||
AND mld_kenmerk_key = p_kenmerk_key
|
||
AND mld_kenmerkopdr_verwijder IS NULL;
|
||
ELSE
|
||
UPDATE mld_kenmerkopdr
|
||
SET mld_kenmerkopdr_waarde = p_waarde
|
||
WHERE mld_opdr_key = p_opdr_key
|
||
AND mld_kenmerk_key = p_kenmerk_key
|
||
AND mld_kenmerkopdr_verwijder IS NULL;
|
||
END IF;
|
||
ELSE
|
||
IF p_kenmerk_key IS NOT NULL AND p_waarde IS NOT NULL
|
||
THEN
|
||
INSERT INTO mld_kenmerkopdr (mld_kenmerk_key,
|
||
mld_opdr_key,
|
||
mld_kenmerkopdr_waarde)
|
||
VALUES (p_kenmerk_key, p_opdr_key, p_waarde);
|
||
END IF;
|
||
END IF;
|
||
END;
|
||
|
||
|
||
FUNCTION mldflexsummary (pmelding_key IN NUMBER)
|
||
RETURN VARCHAR2
|
||
IS
|
||
CURSOR c1
|
||
IS
|
||
SELECT k.mld_kenmerk_key,
|
||
t.mld_srtkenmerk_kenmerktype,
|
||
t.mld_srtkenmerk_nmin nmin,
|
||
t.mld_srtkenmerk_nmax nmax,
|
||
t.fac_kenmerkdomein_key,
|
||
k.mld_kenmerk_volgnummer,
|
||
mld_srtkenmerk_omschrijving,
|
||
v.mld_kenmerkmelding_waarde
|
||
FROM mld_srtkenmerk t, mld_kenmerk k, mld_kenmerkmelding v
|
||
WHERE v.mld_kenmerk_key = k.mld_kenmerk_key
|
||
AND k.mld_srtkenmerk_key = t.mld_srtkenmerk_key
|
||
AND k.mld_kenmerk_verwijder IS NULL
|
||
AND t.mld_srtkenmerk_verwijder IS NULL
|
||
AND v.mld_melding_key = pmelding_key
|
||
ORDER BY k.mld_kenmerk_volgnummer,
|
||
UPPER(lcl.x ('t.mld_srtkenmerk_omschrijving',
|
||
t.mld_srtkenmerk_key,
|
||
mld_srtkenmerk_omschrijving));
|
||
waarde mld_kenmerkmelding.mld_kenmerkmelding_waarde%TYPE;
|
||
builder VARCHAR2 (4000 CHAR);
|
||
BEGIN
|
||
FOR r IN c1 LOOP
|
||
waarde := r.mld_kenmerkmelding_waarde;
|
||
IF waarde IS NOT NULL AND waarde <> '-1'
|
||
-- gevuld
|
||
THEN
|
||
IF r.mld_srtkenmerk_kenmerktype = 'N' AND r.nmin = 0 AND r.nmax = 1
|
||
-- checkbox
|
||
THEN
|
||
IF waarde = '0'
|
||
THEN
|
||
waarde := lcl.l ('lcl_check_0');
|
||
ELSIF waarde = '1'
|
||
THEN
|
||
waarde := lcl.l ('lcl_check_1');
|
||
END IF;
|
||
ELSIF r.mld_srtkenmerk_kenmerktype = 'R' OR r.mld_srtkenmerk_kenmerktype = 'S'
|
||
-- referentie
|
||
THEN
|
||
waarde := fac.getdomeinwaarde (r.fac_kenmerkdomein_key, TO_NUMBER (waarde));
|
||
END IF;
|
||
-- In het zeldzame geval dat de tekst te lang zou worden slaan we sommige
|
||
-- kenmerken gewoon silent over. Niet ideaal maar toch vrij theoretisch
|
||
IF (COALESCE(LENGTH(builder),0) + LENGTH(r.mld_srtkenmerk_omschrijving) + LENGTH(waarde) < 3990)
|
||
THEN
|
||
builder := builder || CHR(10) || r.mld_srtkenmerk_omschrijving || ': ' || waarde;
|
||
END IF;
|
||
END IF;
|
||
END LOOP;
|
||
RETURN builder;
|
||
END;
|
||
|
||
END mld;
|
||
/
|
||
|
||
REGISTERRUN('$Id$')
|
||
|
||
#endif // MLD
|