3530 lines
140 KiB
Plaintext
3530 lines
140 KiB
Plaintext
/* $Revision$
|
||
* $Modtime: 12-03-12 13:01 $
|
||
*/
|
||
|
||
/*
|
||
*
|
||
* FAC_P_FAC_SAVE_RESTORE: Package voor het bewaren en teruggeven van primary keys binnen triggers.
|
||
*
|
||
* Gebruikt in: De status van de MLD_MELDING is afhankelijk van de minimale status van zijn opdrachten, of als
|
||
* er geen opdrachten kan dit door de gebruiker gezet worden. Als er een nieuwe opdrachten aangemaakt
|
||
* wordt, of als een opdracht van status veranderd of als een opdracht verwijderd wordt, heeft dit invloed
|
||
* op de status van de bijbehorende melding. Dit mechanisme is opgelost via de triggers van MLD_OPDR.
|
||
*
|
||
* De volgende functies zijn beschikbaar:
|
||
* - ResetSelectie(TableName) RETURN BOOLEAN:
|
||
* Verwijderd de vorige selectie van de Primary-keys van de tabel. Hou hier rekening met multi-user dmv. de
|
||
* huidige SessionId. Retourneerd of het gelukt (TRUE) is of niet (FALSE).
|
||
* Deze moet aangeroepen worden in de BEFORE-statement-trigger,
|
||
* bijvoorbeeld: BEFORE INSERT OR UPDATE OR DELETE ON mld_opdr.
|
||
* - SavePrimaryKey(TableName, PrimaryKey) RETURN BOOLEAN:
|
||
* Onthou de PrimaryKey-waarde, hou hiet ook rekening met multi-user dmv. de huidige SessionId. Retourneerd
|
||
* of het gelukt (TRUE) is of niet (FALSE).
|
||
* Deze moet aangeroepen worden in de BEFORE-row-trigger,
|
||
* bijvoorbeeld: BEFORE INSERT OR UPDATE ON mld_opdr FOR EACH ROW
|
||
* EN : BEFORE DELETE ON mld_opdr FOR EACH ROW
|
||
* - GetPrimaryKey(TableName, IndexNr) RETURN NUMBER:
|
||
* Geef de nth onthouden PrimaryKey terug, hou hiet ook rekening met multi-user dmv. de huidige SessionId.
|
||
* Het IndexNr begint met 1 en loopt door totdat er geen volgende PrimaryKey onthouden is.
|
||
* Retourneerd de gevonden PrimaryKey of NULL (als er geen volgende is).
|
||
* Deze moet aangeroepen worden in de AFTER-statement-trigger,
|
||
* bijvoorbeeld: AFTER INSERT OR UPDATE OR DELETE ON mld_opdr.
|
||
*
|
||
* LET OP: FAC_P_FAC_SAVE_RESTORE_UPDATE(Func, TableName)
|
||
* Voor het gebruik van GetPrimaryKey() is een #define FAC_P_FAC_SAVE_RESTORE_UPDATE(Func, TableName)
|
||
* gemaakt in COMSQL.H: Deze doorloopt alle onthouden PrimaryKeys van TableName en roept voor elk record
|
||
* de functie Func aan. Func krijgt 1 argument, nl. PrimaryKey en moet een BOOLEAN retourneren.
|
||
*
|
||
*/
|
||
|
||
#include "comsql.h"
|
||
#include "fac_pacx.src"
|
||
#include "fac_pacf.src"
|
||
#include "fac_pacl.src"
|
||
|
||
|
||
CREATE OR REPLACE PACKAGE fac_p_fac_save_restore AS
|
||
-- Maak de vorige selectie van de tabel en de huidige sessie leeg.
|
||
FUNCTION ResetSelectie( TableName IN VARCHAR2 ) RETURN BOOLEAN;
|
||
-- Onthou de primary key van de tabel en de huidige sessie.
|
||
FUNCTION SavePrimaryKey( TableName IN VARCHAR2, PrimaryKey IN NUMBER ) RETURN BOOLEAN;
|
||
-- Geef de nth primary key van de tabel en de huidige sessie. IndexNr begint met 1.
|
||
FUNCTION GetPrimaryKey( TableName IN VARCHAR2, IndexNr IN NUMBER ) RETURN NUMBER;
|
||
-- Onthou naast Primary key ook de datum i.v.m. een eventuele UNDO vanuit AutoCAD.
|
||
FUNCTION SavePrimaryKeyAndDate( TableName IN VARCHAR2, PrimaryKey IN NUMBER, Datum IN Date ) RETURN BOOLEAN;
|
||
-- Geef verwijderdatum of NULL terug van primary key i.v.m. eventuele UNDO vanuit AutoCAD.
|
||
FUNCTION GetDate( TableName IN VARCHAR2, PrimaryKey IN NUMBER ) RETURN DATE;
|
||
PRAGMA RESTRICT_REFERENCES (GetPrimaryKey,WNDS, WNPS);
|
||
END fac_p_fac_save_restore;
|
||
/
|
||
|
||
CREATE OR REPLACE PACKAGE BODY fac_p_fac_save_restore AS
|
||
FUNCTION GetSessionId RETURN VARCHAR2 IS
|
||
Session_Id VARCHAR2(20);
|
||
BEGIN
|
||
SELECT USERENV('SESSIONID')
|
||
INTO Session_Id
|
||
FROM DUAL;
|
||
|
||
RETURN Session_Id;
|
||
END;
|
||
|
||
FUNCTION ResetSelectie( TableName IN VARCHAR2 ) RETURN BOOLEAN IS
|
||
SessionId VARCHAR2(20);
|
||
BEGIN
|
||
SessionId := GetSessionId();
|
||
|
||
DELETE FROM fac_selectie
|
||
WHERE fac_selectie_node = SessionId
|
||
AND fac_selectie_tabel = TableName;
|
||
|
||
RETURN TRUE;
|
||
EXCEPTION
|
||
WHEN OTHERS
|
||
THEN RETURN FALSE;
|
||
END;
|
||
|
||
FUNCTION SavePrimaryKey( TableName IN VARCHAR2, PrimaryKey IN NUMBER ) RETURN BOOLEAN IS
|
||
SessionId VARCHAR2(20);
|
||
BEGIN
|
||
SessionId := GetSessionId();
|
||
|
||
INSERT INTO fac_selectie (fac_selectie_node,
|
||
fac_selectie_tabel,
|
||
fac_selectie_key)
|
||
VALUES (SessionId, TableName, PrimaryKey);
|
||
RETURN TRUE;
|
||
EXCEPTION
|
||
WHEN OTHERS
|
||
THEN RETURN FALSE;
|
||
END;
|
||
|
||
-- Geef de nth Fac_Selectie_Key van de geselecteerde records
|
||
-- terug. IndexNr begint met 1.
|
||
FUNCTION GetPrimaryKey( TableName IN VARCHAR2, IndexNr IN NUMBER ) RETURN NUMBER IS
|
||
SessionId VARCHAR2(20);
|
||
CURSOR Selectie IS SELECT DISTINCT fac_selectie_key
|
||
FROM fac_selectie
|
||
WHERE fac_selectie_node = SessionId
|
||
AND fac_selectie_tabel = TableName
|
||
ORDER BY fac_selectie_key;
|
||
SelectieRec Selectie%ROWTYPE;
|
||
TmpIndex NUMBER;
|
||
ReturnKey NUMBER(10);
|
||
BEGIN
|
||
SessionId := GetSessionId();
|
||
ReturnKey := NULL;
|
||
TmpIndex := 1;
|
||
FOR SelectieRec IN Selectie LOOP
|
||
IF IndexNr = TmpIndex
|
||
THEN
|
||
ReturnKey := SelectieRec.fac_selectie_key;
|
||
EXIT;
|
||
END IF;
|
||
TmpIndex := TmpIndex + 1;
|
||
END LOOP;
|
||
RETURN ReturnKey;
|
||
END;
|
||
|
||
FUNCTION SavePrimaryKeyAndDate( TableName IN VARCHAR2, PrimaryKey IN NUMBER, Datum IN Date ) RETURN BOOLEAN IS
|
||
SessionId VARCHAR2(20);
|
||
BEGIN
|
||
SessionId := GetSessionId();
|
||
|
||
INSERT INTO fac_selectie (fac_selectie_node,
|
||
fac_selectie_tabel,
|
||
fac_selectie_key,
|
||
fac_selectie_datum)
|
||
VALUES (SessionId, TableName, PrimaryKey, Datum);
|
||
RETURN TRUE;
|
||
EXCEPTION
|
||
WHEN OTHERS
|
||
THEN RETURN FALSE;
|
||
END;
|
||
|
||
FUNCTION GetDate( TableName IN VARCHAR2, PrimaryKey IN NUMBER ) RETURN DATE IS
|
||
SessionId VARCHAR2(20);
|
||
ReturnDate Date;
|
||
|
||
CURSOR Selectie IS SELECT DISTINCT fac_selectie_datum
|
||
FROM fac_selectie
|
||
|
||
WHERE fac_selectie_node = SessionId
|
||
AND fac_selectie_key = PrimaryKey
|
||
AND fac_selectie_tabel = TableName;
|
||
SelectieRec Selectie%ROWTYPE;
|
||
TmpIndex NUMBER;
|
||
ReturnKey NUMBER(10);
|
||
|
||
BEGIN
|
||
SessionId := GetSessionId();
|
||
ReturnDate := NULL;
|
||
FOR SelectieRec IN Selectie LOOP
|
||
ReturnDate := SelectieRec.fac_selectie_datum;
|
||
EXIT;
|
||
END LOOP;
|
||
RETURN ReturnDate;
|
||
END;
|
||
END fac_p_fac_save_restore;
|
||
/
|
||
|
||
CREATE OR REPLACE PACKAGE fac AS
|
||
BeginWerkUur NUMBER(4,2);
|
||
EindWerkUur NUMBER(4,2);
|
||
FUNCTION addMonths (pdate1 IN DATE, padd_mon IN NUMBER) RETURN DATE;
|
||
FUNCTION safe_To_Integer( str IN VARCHAR2 ) RETURN NUMBER;
|
||
FUNCTION safe_To_Number( str IN VARCHAR2 ) RETURN NUMBER;
|
||
FUNCTION safe_To_Date ( pchar IN VARCHAR2, pfmt IN VARCHAR2 ) RETURN DATE;
|
||
FUNCTION getdomeinwaarde (dkey IN NUMBER, waarde IN VARCHAR2) RETURN VARCHAR2;
|
||
FUNCTION getrefwaarde (module IN VARCHAR2, kkey IN NUMBER, waarde IN VARCHAR2) RETURN VARCHAR2;
|
||
FUNCTION count_Work_Days ( pdate1 IN DATE , pdate2 IN DATE ) RETURN NUMBER;
|
||
FUNCTION count_Work_Days_InclTime ( pdate1 IN DATE , pdate2 IN DATE ) RETURN NUMBER;
|
||
FUNCTION datumtijdplusuitvoertijd (begindatum IN DATE, uitvoertijd IN NUMBER, uitvoertijdtype IN VARCHAR2) RETURN DATE;
|
||
FUNCTION datumtijdplusuitvoertijd (begindatum IN DATE, uitvoertijd IN NUMBER, uitvoertijdtype IN VARCHAR2,
|
||
pBeginWerkUur IN NUMBER, pEindWerkUur IN NUMBER, palleenWerkdagen IN NUMBER) RETURN DATE;
|
||
FUNCTION usrrap_query (p_tabelnaam IN VARCHAR2) RETURN VARCHAR2;
|
||
FUNCTION usrrap_orderby (p_tabelnaam IN VARCHAR2) RETURN VARCHAR2;
|
||
PROCEDURE imp_getfield ( p_parseline IN OUT VARCHAR2,
|
||
p_fielddelimitor IN VARCHAR2,
|
||
p_field OUT VARCHAR2
|
||
);
|
||
|
||
PROCEDURE imp_getfield_nr (p_parseline IN VARCHAR2,
|
||
p_fielddelimitor IN VARCHAR2,
|
||
p_nr IN NUMBER,
|
||
p_field OUT VARCHAR2
|
||
);
|
||
|
||
PROCEDURE imp_writelog( p_import_key IN NUMBER,
|
||
pLevel IN VARCHAR2,
|
||
pMsg IN VARCHAR2,
|
||
pHint IN VARCHAR2
|
||
);
|
||
|
||
PROCEDURE writelog( pAppl IN VARCHAR2,
|
||
pLevel IN VARCHAR2,
|
||
pMsg IN VARCHAR2,
|
||
pHint IN VARCHAR2
|
||
);
|
||
|
||
PROCEDURE imp_alg_delete_onrgoed (p_import_key IN NUMBER, p_mode IN NUMBER);
|
||
PROCEDURE imp_prs_delete_organisatie (p_import_key IN NUMBER, p_mode IN NUMBER);
|
||
PROCEDURE imp_mld_delete_mld (p_import_key IN NUMBER, p_mode IN NUMBER);
|
||
PROCEDURE fac_perfmon_incr(limiet IN NUMBER, zwaarte IN NUMBER);
|
||
PROCEDURE putnotificationprio (pfrom NUMBER, pto NUMBER, pmessage VARCHAR2, pmode NUMBER,
|
||
poptemail VARCHAR2, poptmobile VARCHAR2, pprio NUMBER);
|
||
PROCEDURE putnotification (pfrom NUMBER, pto NUMBER, pmessage VARCHAR2, pmode NUMBER,
|
||
poptemail VARCHAR2, poptmobile VARCHAR2);
|
||
PROCEDURE putsystemnotification (pmessage VARCHAR2, pmode NUMBER);
|
||
PROCEDURE putnotificationsrtprio (pfrom NUMBER, pto NUMBER, pcode VARCHAR2, pref NUMBER,
|
||
poptmessage VARCHAR2, poptstatus NUMBER, poptemail VARCHAR2, poptmobile VARCHAR2, pxref NUMBER,
|
||
pprio NUMBER, psender VARCHAR2);
|
||
PROCEDURE clrnotifications (pcode VARCHAR2, pref NUMBER);
|
||
PROCEDURE putnotificationjobs (pcust VARCHAR2);
|
||
PROCEDURE putjobnotifications (pviewname VARCHAR2, pmode NUMBER);
|
||
FUNCTION getMobile ( pkey IN NUMBER ) RETURN VARCHAR2;
|
||
PROCEDURE executeschedules;
|
||
PROCEDURE markorderassent(pxmlnode VARCHAR2, pkey NUMBER, presult NUMBER, presulttext VARCHAR2);
|
||
FUNCTION getSetting (pname IN VARCHAR2 ) RETURN VARCHAR2;
|
||
PROCEDURE trackaction (pcode VARCHAR2, prefkey NUMBER, puserkey NUMBER, pdatum DATE, poms VARCHAR2);
|
||
PROCEDURE backtrackaction (pcode VARCHAR2, prefkey NUMBER, puserkey NUMBER, pdatum DATE);
|
||
PROCEDURE notifytracking(psrtnotificatiekey NUMBER, pperslid_key NUMBER, ptracking_oms VARCHAR2, prefkey NUMBER);
|
||
FUNCTION gettrackingdate (peventcode IN VARCHAR2, pkey IN number) RETURN date;
|
||
FUNCTION gettrackinguserkey (peventcode IN VARCHAR2, pkey IN number) RETURN number;
|
||
PROCEDURE initsession (flcode IN VARCHAR2);
|
||
PROCEDURE registerversion (pmaj IN NUMBER, pmin IN NUMBER, ppatch IN VARCHAR2, pschema IN NUMBER, plang IN VARCHAR2);
|
||
PROCEDURE registercustversion (pcustid IN VARCHAR2, pcustnr IN NUMBER);
|
||
FUNCTION getdbversion RETURN VARCHAR2;
|
||
PROCEDURE systrackscript (n IN VARCHAR2, r IN VARCHAR2, force IN NUMBER);
|
||
PROCEDURE processemail (pfrom IN VARCHAR2, pto IN VARCHAR2, psubject IN VARCHAR2, pbody IN VARCHAR2, pextra IN VARCHAR2);
|
||
END fac;
|
||
/
|
||
|
||
CREATE OR REPLACE PACKAGE BODY fac AS
|
||
-- This function is to be used instead of the native ADD_MONTHS function
|
||
-- If 29, 30 or 31 date doesn't exist in the month then de first of the next month is taken
|
||
FUNCTION addMonths (pdate1 IN DATE, padd_mon IN NUMBER) RETURN DATE IS
|
||
pdate2 date;
|
||
BEGIN
|
||
pdate2:= ADD_MONTHS(pdate1-1, padd_mon);
|
||
IF LAST_DAY(pdate1) = pdate1 OR LAST_DAY(pdate2) = pdate2
|
||
THEN
|
||
RETURN pdate2+1;
|
||
ELSE
|
||
RETURN ADD_MONTHS(pdate1, padd_mon);
|
||
END IF;
|
||
END;
|
||
|
||
-- This function is to be used instead of the native TO_NUMBER in situations
|
||
-- where the value might be an invalid number like '206E9547' ('Numeric overflow')
|
||
FUNCTION safe_To_Integer( str IN VARCHAR2 ) RETURN NUMBER IS
|
||
BEGIN
|
||
RETURN TO_NUMBER(REGEXP_SUBSTR(str, '^\d+') ); // alleen leading cijfers
|
||
EXCEPTION
|
||
WHEN OTHERS THEN RETURN NULL;
|
||
END;
|
||
|
||
-- This function is to be used instead of the native TO_NUMBER in situations
|
||
-- where the value might be an invalid number. This is the case for (FSN#203)
|
||
-- flexible properties as in FAC.SAFE_TO_NUMBER(alg_onrgoedkenmerk_waarde)<200
|
||
-- It returns NULL instead of an ORA1722:error (or even another error)
|
||
FUNCTION safe_To_Number( str IN VARCHAR2 ) RETURN NUMBER IS
|
||
BEGIN
|
||
RETURN TO_NUMBER(str);
|
||
EXCEPTION
|
||
WHEN OTHERS THEN RETURN NULL;
|
||
END;
|
||
|
||
FUNCTION safe_To_Date( pchar IN VARCHAR2, pfmt IN VARCHAR2 ) RETURN DATE IS
|
||
BEGIN
|
||
RETURN TO_DATE(pchar, pfmt);
|
||
EXCEPTION
|
||
WHEN OTHERS THEN RETURN NULL;
|
||
END;
|
||
|
||
/*
|
||
* Levert de gerefereerde waarde van een flexkenmerk op, gegeven de fac_kenmerkdomein_key en de waarde
|
||
*/
|
||
FUNCTION getdomeinwaarde (dkey IN NUMBER, waarde IN VARCHAR2)
|
||
RETURN VARCHAR2
|
||
IS
|
||
sresult VARCHAR2 (255);
|
||
kolomnaam VARCHAR2 (50);
|
||
kolomtxt VARCHAR2 (50);
|
||
objectnaam VARCHAR2 (50);
|
||
tab_key NUMBER (10);
|
||
ttype VARCHAR2 (1);
|
||
resultvalue VARCHAR2 (255);
|
||
BEGIN
|
||
IF waarde IS NULL
|
||
THEN
|
||
resultvalue := NULL; -- gauw klaar mee
|
||
ELSE
|
||
SELECT rsk.fac_kenmerkdomein_kolomnaam,
|
||
rsk.fac_kenmerkdomein_kolomtxt,
|
||
rsk.fac_kenmerkdomein_objectnaam,
|
||
rsk.fac_usrtab_key,
|
||
ut.fac_usrtab_view
|
||
INTO kolomnaam,
|
||
kolomtxt,
|
||
objectnaam,
|
||
tab_key,
|
||
ttype
|
||
FROM fac_kenmerkdomein rsk, fac_usrtab ut
|
||
WHERE rsk.fac_kenmerkdomein_key = dkey AND rsk.fac_usrtab_key = ut.fac_usrtab_key(+);
|
||
|
||
IF tab_key IS NULL OR ttype = 'V' OR ttype IS NULL
|
||
THEN
|
||
sresult := 'SELECT ' || kolomtxt || ' FROM ' || objectnaam || ' WHERE ' || kolomnaam || '=' || waarde;
|
||
ELSE
|
||
sresult :=
|
||
'SELECT '
|
||
|| kolomtxt
|
||
|| ' FROM '
|
||
|| objectnaam
|
||
|| ' WHERE '
|
||
|| kolomnaam
|
||
|| '='
|
||
|| waarde
|
||
|| ' AND fac_usrtab_key = '
|
||
|| TO_CHAR (tab_key);
|
||
END IF;
|
||
|
||
IF sresult IS NOT NULL
|
||
THEN
|
||
EXECUTE IMMEDIATE sresult INTO resultvalue;
|
||
END IF;
|
||
END IF;
|
||
|
||
RETURN resultvalue;
|
||
END;
|
||
|
||
/* Levert de gerefereerde waarde van een flexkenmerk op, gegeven de kenmerk_key en de waarde
|
||
(en vereist ook de module)
|
||
DEPRECATED, gebruik functie getdomeinwaarde!
|
||
*/
|
||
FUNCTION getrefwaarde (module IN VARCHAR2, kkey IN NUMBER, waarde IN VARCHAR2)
|
||
RETURN VARCHAR2
|
||
IS
|
||
sresult VARCHAR2 (255);
|
||
kolomnaam VARCHAR2 (50);
|
||
kolomtxt VARCHAR2 (50);
|
||
objectnaam VARCHAR2 (50);
|
||
tab_key NUMBER (10);
|
||
ttype VARCHAR2 (1);
|
||
resultvalue VARCHAR2 (255);
|
||
BEGIN
|
||
IF waarde IS NULL
|
||
THEN
|
||
resultvalue := NULL;
|
||
ELSE
|
||
CASE module
|
||
WHEN 'ALG'
|
||
THEN
|
||
SELECT rsk.fac_kenmerkdomein_kolomnaam,
|
||
rsk.fac_kenmerkdomein_kolomtxt,
|
||
rsk.fac_kenmerkdomein_objectnaam,
|
||
rsk.fac_usrtab_key,
|
||
ut.fac_usrtab_view
|
||
INTO kolomnaam,
|
||
kolomtxt,
|
||
objectnaam,
|
||
tab_key,
|
||
ttype
|
||
FROM fac_kenmerkdomein rsk, alg_kenmerk sk, fac_usrtab ut
|
||
WHERE sk.alg_kenmerk_key = kkey
|
||
AND rsk.fac_usrtab_key = ut.fac_usrtab_key(+)
|
||
AND sk.fac_kenmerkdomein_key = rsk.fac_kenmerkdomein_key;
|
||
WHEN 'FIN'
|
||
THEN
|
||
SELECT rsk.fac_kenmerkdomein_kolomnaam,
|
||
rsk.fac_kenmerkdomein_kolomtxt,
|
||
rsk.fac_kenmerkdomein_objectnaam,
|
||
rsk.fac_usrtab_key,
|
||
ut.fac_usrtab_view
|
||
INTO kolomnaam,
|
||
kolomtxt,
|
||
objectnaam,
|
||
tab_key,
|
||
ttype
|
||
FROM fac_kenmerkdomein rsk, fin_kenmerk sk, fac_usrtab ut
|
||
WHERE sk.fin_kenmerk_key = kkey
|
||
AND rsk.fac_usrtab_key = ut.fac_usrtab_key(+)
|
||
AND sk.fac_kenmerkdomein_key = rsk.fac_kenmerkdomein_key;
|
||
WHEN 'INS'
|
||
THEN
|
||
SELECT rsk.fac_kenmerkdomein_kolomnaam,
|
||
rsk.fac_kenmerkdomein_kolomtxt,
|
||
rsk.fac_kenmerkdomein_objectnaam,
|
||
rsk.fac_usrtab_key,
|
||
ut.fac_usrtab_view
|
||
INTO kolomnaam,
|
||
kolomtxt,
|
||
objectnaam,
|
||
tab_key,
|
||
ttype
|
||
FROM fac_kenmerkdomein rsk, ins_srtkenmerk sk, fac_usrtab ut
|
||
WHERE sk.ins_srtkenmerk_key = kkey
|
||
AND rsk.fac_usrtab_key = ut.fac_usrtab_key(+)
|
||
AND sk.fac_kenmerkdomein_key = rsk.fac_kenmerkdomein_key;
|
||
WHEN 'MLD'
|
||
THEN
|
||
SELECT rsk.fac_kenmerkdomein_kolomnaam,
|
||
rsk.fac_kenmerkdomein_kolomtxt,
|
||
rsk.fac_kenmerkdomein_objectnaam,
|
||
rsk.fac_usrtab_key,
|
||
ut.fac_usrtab_view
|
||
INTO kolomnaam,
|
||
kolomtxt,
|
||
objectnaam,
|
||
tab_key,
|
||
ttype
|
||
FROM fac_kenmerkdomein rsk, mld_srtkenmerk sk, fac_usrtab ut
|
||
WHERE sk.mld_srtkenmerk_key = kkey
|
||
AND rsk.fac_usrtab_key = ut.fac_usrtab_key(+)
|
||
AND sk.fac_kenmerkdomein_key = rsk.fac_kenmerkdomein_key;
|
||
WHEN 'PRS'
|
||
THEN
|
||
SELECT rsk.fac_kenmerkdomein_kolomnaam,
|
||
rsk.fac_kenmerkdomein_kolomtxt,
|
||
rsk.fac_kenmerkdomein_objectnaam,
|
||
rsk.fac_usrtab_key,
|
||
ut.fac_usrtab_view
|
||
INTO kolomnaam,
|
||
kolomtxt,
|
||
objectnaam,
|
||
tab_key,
|
||
ttype
|
||
FROM fac_kenmerkdomein rsk, prs_kenmerk sk, fac_usrtab ut
|
||
WHERE sk.prs_kenmerk_key = kkey
|
||
AND rsk.fac_usrtab_key = ut.fac_usrtab_key(+)
|
||
AND sk.fac_kenmerkdomein_key = rsk.fac_kenmerkdomein_key;
|
||
WHEN 'RES'
|
||
THEN
|
||
SELECT rsk.fac_kenmerkdomein_kolomnaam,
|
||
rsk.fac_kenmerkdomein_kolomtxt,
|
||
rsk.fac_kenmerkdomein_objectnaam,
|
||
rsk.fac_usrtab_key,
|
||
ut.fac_usrtab_view
|
||
INTO kolomnaam,
|
||
kolomtxt,
|
||
objectnaam,
|
||
tab_key,
|
||
ttype
|
||
FROM fac_kenmerkdomein rsk, res_srtkenmerk sk, fac_usrtab ut
|
||
WHERE sk.res_srtkenmerk_key = kkey
|
||
AND rsk.fac_usrtab_key = ut.fac_usrtab_key(+)
|
||
AND sk.fac_kenmerkdomein_key = rsk.fac_kenmerkdomein_key;
|
||
WHEN 'BES'
|
||
THEN
|
||
SELECT rsk.fac_kenmerkdomein_kolomnaam,
|
||
rsk.fac_kenmerkdomein_kolomtxt,
|
||
rsk.fac_kenmerkdomein_objectnaam,
|
||
rsk.fac_usrtab_key,
|
||
ut.fac_usrtab_view
|
||
INTO kolomnaam,
|
||
kolomtxt,
|
||
objectnaam,
|
||
tab_key,
|
||
ttype
|
||
FROM fac_kenmerkdomein rsk, bes_srtkenmerk sk, fac_usrtab ut
|
||
WHERE sk.bes_srtkenmerk_key = kkey
|
||
AND rsk.fac_usrtab_key = ut.fac_usrtab_key(+)
|
||
AND sk.fac_kenmerkdomein_key = rsk.fac_kenmerkdomein_key;
|
||
WHEN 'CNT'
|
||
THEN
|
||
SELECT rsk.fac_kenmerkdomein_kolomnaam,
|
||
rsk.fac_kenmerkdomein_kolomtxt,
|
||
rsk.fac_kenmerkdomein_objectnaam,
|
||
rsk.fac_usrtab_key,
|
||
ut.fac_usrtab_view
|
||
INTO kolomnaam,
|
||
kolomtxt,
|
||
objectnaam,
|
||
tab_key,
|
||
ttype
|
||
FROM fac_kenmerkdomein rsk, cnt_srtkenmerk sk, fac_usrtab ut
|
||
WHERE sk.cnt_srtkenmerk_key = kkey
|
||
AND rsk.fac_usrtab_key = ut.fac_usrtab_key(+)
|
||
AND sk.fac_kenmerkdomein_key = rsk.fac_kenmerkdomein_key;
|
||
WHEN 'BEZ'
|
||
THEN
|
||
SELECT rsk.fac_kenmerkdomein_kolomnaam,
|
||
rsk.fac_kenmerkdomein_kolomtxt,
|
||
rsk.fac_kenmerkdomein_objectnaam,
|
||
rsk.fac_usrtab_key,
|
||
ut.fac_usrtab_view
|
||
INTO kolomnaam,
|
||
kolomtxt,
|
||
objectnaam,
|
||
tab_key,
|
||
ttype
|
||
FROM fac_kenmerkdomein rsk, bez_kenmerk sk, fac_usrtab ut
|
||
WHERE sk.bez_kenmerk_key = kkey
|
||
AND rsk.fac_usrtab_key = ut.fac_usrtab_key(+)
|
||
AND sk.fac_kenmerkdomein_key = rsk.fac_kenmerkdomein_key;
|
||
ELSE
|
||
RETURN NULL;
|
||
END CASE;
|
||
|
||
IF tab_key IS NULL OR ttype = 'V' OR ttype IS NULL
|
||
THEN
|
||
sresult := 'SELECT ' || kolomtxt || ' from ' || objectnaam || ' where ' || kolomnaam || '=' || waarde;
|
||
ELSE
|
||
sresult :=
|
||
'SELECT '
|
||
|| kolomtxt
|
||
|| ' from '
|
||
|| objectnaam
|
||
|| ' where '
|
||
|| kolomnaam
|
||
|| '='
|
||
|| waarde
|
||
|| ' AND fac_usrtab_key = '
|
||
|| TO_CHAR (tab_key);
|
||
END IF;
|
||
|
||
IF sresult IS NOT NULL
|
||
THEN
|
||
EXECUTE IMMEDIATE sresult INTO resultvalue;
|
||
END IF;
|
||
END IF;
|
||
|
||
RETURN resultvalue;
|
||
END;
|
||
|
||
-- Return number of workdays between two dates, not including the startdate, weekends and holidays
|
||
FUNCTION count_Work_Days0( pdate1 IN DATE , pdate2 IN DATE, pInclTime IN BOOLEAN ) RETURN NUMBER IS
|
||
eikdag NUMBER;
|
||
v_date_from DATE;
|
||
v_date_to DATE;
|
||
v_time_from NUMBER;
|
||
v_time_to NUMBER;
|
||
v_extra_day NUMBER;
|
||
lbackwards BOOLEAN;
|
||
v_week NUMBER;
|
||
v_mod NUMBER;
|
||
v_day_from NUMBER;
|
||
v_day_to NUMBER;
|
||
v_holidays NUMBER;
|
||
BEGIN
|
||
|
||
-- Dit is een maandag, is dat volgens de huidige territory dag 2?
|
||
SELECT TO_NUMBER (DATE_TO_CHAR (TO_DATE('01-01-2007','DD-MM-YYYY'), 'D'))
|
||
INTO eikdag
|
||
FROM DUAL;
|
||
IF eikdag <> 2
|
||
THEN
|
||
-- WE MOETEN met zondag=1 werken (geen nieuwe eis, wel duidelijker probleem)
|
||
raise_application_error (-20000, 'Facilitor: Invalid NLS_TERRITORY');
|
||
END IF;
|
||
|
||
-- Remove time-part from dates (ie. set to 0:00) and set dates chronologically
|
||
IF pdate1 > pdate2 THEN
|
||
v_date_from := TRUNC(pdate2);
|
||
v_date_to := TRUNC(pdate1);
|
||
v_time_from := to_char(pdate2,'sssss');
|
||
v_time_to := to_char(pdate1,'sssss');
|
||
lbackwards := TRUE;
|
||
ELSE
|
||
v_date_from := TRUNC(pdate1);
|
||
v_date_to := TRUNC(pdate2);
|
||
v_time_from := to_char(pdate1,'sssss');
|
||
v_time_to := to_char(pdate2,'sssss');
|
||
lbackwards := FALSE;
|
||
END IF;
|
||
|
||
-- Determine whole weeks (v_week) and remaining days (v_mod) between FROM and TO
|
||
v_week := trunc((v_date_to - v_date_from)/7);
|
||
v_mod := mod((v_date_to - v_date_from),7);
|
||
|
||
-- Correct remaining days (v_mod) depending on the FROM and TO "day-number"
|
||
v_day_from := to_number(DATE_TO_CHAR(v_date_from,'d'));
|
||
v_day_to := to_number(DATE_TO_CHAR(v_date_to,'d'));
|
||
IF v_day_from = 1 THEN /* FROM is sunday */
|
||
IF v_day_to = 7 THEN /* TO is saturday */
|
||
v_mod := v_mod - 1; /* should always be 5! */
|
||
END IF;
|
||
ELSE IF v_day_from = 7 THEN /* FROM is saturday */
|
||
IF v_day_to != 7 THEN /* TO is not saturday */
|
||
v_mod := v_mod - 1; /* exclude sunday succeding FROM-saturday */
|
||
END IF;
|
||
ELSE /* FROM is workday */
|
||
IF v_day_to = 7 THEN /* TO is saturday */
|
||
v_mod := v_mod - 1; /* exclude TO-saturday */
|
||
ELSE IF v_day_to < v_day_from THEN /* weekend between FROM and TO */
|
||
v_mod := v_mod - 2; /* exclude weekend */
|
||
END IF;
|
||
END IF;
|
||
END IF;
|
||
END IF;
|
||
|
||
v_extra_day := 0;
|
||
IF pInclTime THEN
|
||
IF v_time_to > v_time_from THEN
|
||
v_extra_day := 1;
|
||
END IF;
|
||
END IF;
|
||
|
||
|
||
-- Determine the registered holidays between FROM and TO
|
||
SELECT count(*)
|
||
INTO v_holidays
|
||
FROM MLD_VRIJE_DAGEN
|
||
WHERE MLD_VRIJE_DAGEN_DATUM BETWEEN v_date_from AND v_date_to;
|
||
|
||
IF lbackwards THEN
|
||
RETURN 0 - (5 * v_week + v_mod + v_extra_day - v_holidays);
|
||
ELSE
|
||
RETURN 5 * v_week + v_mod + v_extra_day - v_holidays;
|
||
END IF;
|
||
EXCEPTION
|
||
WHEN OTHERS THEN RETURN NULL;
|
||
END;
|
||
|
||
FUNCTION count_Work_Days_InclTime( pdate1 IN DATE , pdate2 IN DATE ) RETURN NUMBER IS
|
||
BEGIN
|
||
RETURN count_Work_Days0(pdate1,pdate2, TRUE);
|
||
END;
|
||
|
||
FUNCTION count_Work_Days( pdate1 IN DATE , pdate2 IN DATE ) RETURN NUMBER IS
|
||
BEGIN
|
||
RETURN count_Work_Days0(pdate1,pdate2, FALSE);
|
||
END;
|
||
|
||
/*
|
||
** Bepaal een nieuwe datum van de begindatum waarbij de uitvoertijd is
|
||
** opgeteld. De uitvoertijd (UitvoerTijdType) kan in 'UREN' of in 'DAGEN' zijn.
|
||
** Er wordt rekening gehouden met Werkuren, BeginWerkTijd en EindWerkTijd en
|
||
** Weekenddagen (Zondag = 1, Zaterdag = 7) en Vrije dagen (MLD_VRIJE_DAGEN).
|
||
** Testscript beschikbaar: /SRC/SQL/_UTIL/test_datumtijd.sql.
|
||
*/
|
||
FUNCTION datumtijdplusuitvoertijd (begindatum IN DATE, uitvoertijd IN NUMBER, uitvoertijdtype IN VARCHAR2) RETURN DATE
|
||
IS
|
||
BEGIN
|
||
IF BeginWerkUur IS NULL OR EindWerkUur IS NULL
|
||
THEN
|
||
BeginWerkUur := fac.safe_to_number (fac.getsetting ('fac_t_startofworkday')); // half 8 is 7.5 en niet 7.30
|
||
EindWerkUur := fac.safe_to_number (fac.getsetting ('fac_t_endofworkday'));
|
||
DBMS_OUTPUT.put_line ('Recaching Werkuren ' || BeginWerkUur||'..'||EindWerkUur);
|
||
END IF;
|
||
RETURN datumtijdplusuitvoertijd (begindatum, uitvoertijd, uitvoertijdtype,
|
||
BeginWerkUur, EindWerkUur, 1); // altijd alleen werkdagen
|
||
END;
|
||
|
||
FUNCTION datumtijdplusuitvoertijd (begindatum IN DATE, uitvoertijd IN NUMBER, uitvoertijdtype IN VARCHAR2,
|
||
pBeginWerkUur IN NUMBER, pEindWerkUur IN NUMBER, palleenWerkdagen IN NUMBER) -- uur-parameters zijn 7.5 voor half acht (en niet 7.3)
|
||
RETURN DATE
|
||
IS
|
||
olddatumgereed DATE;
|
||
newdatumgereed DATE;
|
||
dagvdweek NUMBER;
|
||
vrijedagen NUMBER;
|
||
aantalwerkweken NUMBER;
|
||
aantaldagen NUMBER;
|
||
aantaldagenover NUMBER;
|
||
beginuur NUMBER (5, 2);
|
||
einduur NUMBER (5, 2);
|
||
werkuren NUMBER (5, 2);
|
||
returnval DATE;
|
||
eikdag NUMBER;
|
||
extradag NUMBER;
|
||
|
||
BEGIN
|
||
--veronderstelt NLS_TERRITORY='AMERICA'
|
||
IF uitvoertijd IS NOT NULL AND begindatum IS NOT NULL AND uitvoertijdtype = 'DAGEN'
|
||
THEN
|
||
IF palleenWerkdagen IS NULL THEN
|
||
RETURN begindatum + uitvoertijd; // zo simpel kan het zijn
|
||
END IF;
|
||
|
||
-- Dit is een maandag, is dat volgens de huidige territory dag 2?
|
||
eikdag := TO_NUMBER (DATE_TO_CHAR (_TO_DATE2('01-01-2007', 'DD-MM-YYYY'), 'D'));
|
||
|
||
IF eikdag <> 2
|
||
THEN
|
||
-- WE MOETEN met zondag=1 werken (geen nieuwe eis, wel duidelijker probleem)
|
||
raise_application_error (-20000, 'Facilitor: Invalid NLS_TERRITORY (should be american)');
|
||
END IF;
|
||
|
||
dagvdweek := TO_NUMBER (DATE_TO_CHAR (begindatum, 'D'));
|
||
|
||
-- dagvdweek: zondag=1,.., zaterdag=7
|
||
aantalwerkweken := TRUNC (uitvoertijd / 5);
|
||
aantaldagenover := uitvoertijd MOD 5;
|
||
-- een werkweek van 5 dagen zorgt voor een doorlooptijd van 7 kalenderdagen
|
||
newdatumgereed := begindatum + aantalwerkweken * 7 + aantaldagenover;
|
||
--DBMS_OUTPUT.put_line ('zonder vrije dagen of weekends ' || TO_CHAR (newdatumgereed));
|
||
|
||
IF uitvoertijd > 0
|
||
THEN
|
||
|
||
IF dagvdweek + aantaldagenover > 6
|
||
THEN
|
||
-- er zit dan een weekend(dag) tussen
|
||
IF dagvdweek = 7
|
||
THEN
|
||
-- begindatum is een zaterdag. Dan maar 1 optellen
|
||
newdatumgereed := newdatumgereed + 1;
|
||
ELSE
|
||
-- begindatum is zondag, maandag, dinsdag, woensdag, donderdag of een vrijdag. Dan 2 optellen
|
||
newdatumgereed := newdatumgereed + 2;
|
||
END IF;
|
||
END IF;
|
||
|
||
IF dagvdweek = 1 AND uitvoertijd = 1
|
||
THEN
|
||
-- begin op zondag en uitvoertijd 1 dag
|
||
newdatumgereed := newdatumgereed + 1;
|
||
END IF;
|
||
|
||
--DBMS_OUTPUT.put_line ('zonder vrije dagen ' || DATE_TO_CHAR (newdatumgereed));
|
||
olddatumgereed := begindatum;
|
||
|
||
LOOP
|
||
dagvdweek := TO_NUMBER (DATE_TO_CHAR (newdatumgereed, 'D'));
|
||
|
||
IF dagvdweek = 7 OR dagvdweek = 1
|
||
THEN
|
||
-- zaterdag wordt maandag, zondag wordt dinsdag
|
||
newdatumgereed := newdatumgereed + 2;
|
||
--DBMS_OUTPUT.put_line ('opschuiven: ' || TO_CHAR (newdatumgereed));
|
||
|
||
dagvdweek := TO_NUMBER (DATE_TO_CHAR (newdatumgereed, 'D'));
|
||
END IF;
|
||
|
||
SELECT COUNT (*)
|
||
INTO vrijedagen
|
||
FROM mld_vrije_dagen
|
||
WHERE mld_vrije_dagen_datum > olddatumgereed AND mld_vrije_dagen_datum <= newdatumgereed;
|
||
|
||
IF dagvdweek > 1 AND dagvdweek < 7 AND vrijedagen = 0
|
||
THEN
|
||
-- Het uiteindelijke resultaat is gevonden
|
||
--DBMS_OUTPUT.put_line ('met vrije dagen en weekendcorrectie ' || TO_CHAR (newdatumgereed));
|
||
EXIT;
|
||
END IF;
|
||
|
||
IF vrijedagen > 0
|
||
THEN
|
||
-- schuif het eindresultaat evenzoveel dagen op; hier kan dan een weekend tussen zitten!
|
||
olddatumgereed := newdatumgereed;
|
||
newdatumgereed := newdatumgereed + TRUNC (vrijedagen / 5) * 7 + vrijedagen MOD 5;
|
||
--DBMS_OUTPUT.put_line ('met vrije dagen mogelijk weekend ' || TO_CHAR (newdatumgereed));
|
||
|
||
IF dagvdweek + (vrijedagen MOD 5) > 6
|
||
THEN
|
||
-- er zit dan een weekend tussen
|
||
newdatumgereed := newdatumgereed + 2;
|
||
END IF;
|
||
|
||
--DBMS_OUTPUT.put_line ('met vrije dagen na een weekend ' || TO_CHAR (newdatumgereed));
|
||
END IF;
|
||
-- En doorloop de controle nog een keer met deze nieuwe datum, daar kunnen ook weer vrije dagen tussen zitten
|
||
END LOOP;
|
||
|
||
END IF;
|
||
|
||
returnval := newdatumgereed;
|
||
ELSIF uitvoertijd IS NOT NULL AND begindatum IS NOT NULL AND uitvoertijdtype = 'UREN'
|
||
THEN
|
||
/*
|
||
** Alles is al decimalen
|
||
*/
|
||
-- bepaal de dag om te kijken of de begindatum in het weekend ligt.
|
||
dagvdweek := TO_NUMBER (DATE_TO_CHAR (begindatum, 'D'));
|
||
-- kijk of de begindatum op een vrije dag valt.
|
||
SELECT COUNT (*)
|
||
INTO vrijedagen
|
||
FROM mld_vrije_dagen
|
||
WHERE mld_vrije_dagen_datum = TRUNC(begindatum);
|
||
|
||
ExtraDag := 0;
|
||
BeginUur := (TRUNC(BeginDatum, 'MI') - TRUNC(BeginDatum)) * 24;
|
||
|
||
-- Indien de begintijd voor het interval ligt dan begint de telling aan het begin van het interval
|
||
IF BeginUur < pBeginWerkUur
|
||
THEN
|
||
BeginUur := pBeginWerkUur;
|
||
END IF;
|
||
|
||
-- Indien de begintijd na het interval ligt dan begint de telling aan het begin van het volgende interval
|
||
-- JGL TODO: Dit moet voor regime 24/7 anders denk ik
|
||
IF BeginUur > pEindWerkUur
|
||
OR dagvdweek = 7
|
||
OR dagvdweek= 1
|
||
OR vrijedagen = 1
|
||
THEN
|
||
BeginUur := pBeginWerkUur;
|
||
ExtraDag := 1; // JGL TODO Moet niet voor zondag?
|
||
END IF;
|
||
|
||
WerkUren := pEindWerkUur - pBeginWerkUur;
|
||
EindUur := BeginUur + UitvoerTijd;
|
||
AantalDagen := extraDag;
|
||
--
|
||
IF EindUur > pEindWerkUur
|
||
THEN
|
||
AantalDagen := TRUNC((EindUur-pEindWerkUur) / WerkUren)+1+ extraDag;
|
||
EindUur := EindUur - (AantalDagen-extraDag) * WerkUren;
|
||
END IF;
|
||
|
||
/*
|
||
** Eventuele verbetering hierin: Indien geen begin en eindtijd van werkdag bekend,
|
||
** dan 0:00 en 23:59 nemen, waardoor een werkdag 24 uur wordt. Kan dus gebruikt
|
||
** worden voor bedrijven waar continu gewerkt wordt.
|
||
*/
|
||
OldDatumGereed := TRUNC(BeginDatum) + EindUur / 24;
|
||
IF AantalDagen > 0
|
||
THEN
|
||
ReturnVal := DatumTijdPlusUitvoerTijd(OldDatumGereed, AantalDagen, 'DAGEN', pBeginWerkUur, pEindWerkUur, palleenWerkdagen);
|
||
ELSE
|
||
ReturnVal := OldDatumGereed;
|
||
END IF;
|
||
ELSE
|
||
ReturnVal := NULL;
|
||
END IF;
|
||
/*
|
||
** Voor controle op juiste berekening van de einddatum en tijd.
|
||
** raise_application_error(-20000,'klaar op : '|| DATE_to_char(returnval,'dd-mm-yyyy hh24:mi'));
|
||
*/
|
||
RETURN ReturnVal;
|
||
END;
|
||
|
||
FUNCTION usrrap_query ( p_tabelnaam IN VARCHAR2 ) RETURN VARCHAR2 IS
|
||
QueryString VARCHAR2(4000);
|
||
Kolomnaam VARCHAR2(64);
|
||
mainuser VARCHAR2(80);
|
||
BEGIN
|
||
BEGIN
|
||
DECLARE
|
||
CURSOR Zoek_label IS
|
||
SELECT column_name
|
||
, data_type
|
||
FROM user_tab_columns
|
||
WHERE table_name = UPPER(p_tabelnaam)
|
||
ORDER BY COLUMN_ID;
|
||
|
||
BEGIN
|
||
|
||
QueryString := 'Select ';
|
||
FOR LabelRec in zoek_label LOOP
|
||
|
||
IF LabelRec.data_type = 'NUMBER'
|
||
THEN
|
||
QueryString := QueryString ||'to_number(TO_CHAR('|| LabelRec.column_name ||',''99999999D9999'')) "'||LabelRec.column_name||'",';
|
||
ELSE
|
||
QueryString := QueryString ||' ' || LabelRec.column_name ||',';
|
||
END IF;
|
||
|
||
END LOOP;
|
||
END;
|
||
END;
|
||
QueryString := Substr(QueryString,1,(LENGTH(QueryString)-1))||' from '|| p_tabelnaam ;
|
||
RETURN QueryString;
|
||
END usrrap_query;
|
||
|
||
|
||
FUNCTION usrrap_orderby ( p_tabelnaam IN VARCHAR2 ) RETURN VARCHAR2 IS
|
||
AantalRecords NUMBER(10);
|
||
OrderBy VARCHAR2(255);
|
||
mainuser VARCHAR2(80);
|
||
i NUMBER(10);
|
||
|
||
BEGIN
|
||
SELECT count(*)
|
||
INTO AantalRecords
|
||
FROM user_tab_columns
|
||
WHERE table_name = UPPER(p_tabelnaam);
|
||
--
|
||
OrderBy := '';
|
||
i := 1;
|
||
|
||
FOR i IN 1..AantalRecords LOOP
|
||
OrderBy := OrderBy||TO_CHAR(i)||',';
|
||
END LOOP;
|
||
OrderBy := SUBSTR(OrderBy,1,(LENGTH(OrderBy)-1));
|
||
RETURN ' ORDER BY ' || OrderBy;
|
||
END usrrap_orderby;
|
||
|
||
|
||
PROCEDURE imp_getfield (
|
||
p_parseline IN OUT VARCHAR2,
|
||
p_fielddelimitor IN VARCHAR2,
|
||
p_field OUT VARCHAR2
|
||
)
|
||
AS
|
||
v_firstdelim NUMBER;
|
||
v_first_quote NUMBER;
|
||
v_next_quote NUMBER;
|
||
v_quote_count NUMBER;
|
||
v_found BOOLEAN;
|
||
BEGIN
|
||
v_firstdelim := INSTR (p_parseline, p_fielddelimitor, 1);
|
||
|
||
IF v_firstdelim = 0
|
||
THEN
|
||
-- no delimiter found, so this is the last field of the row
|
||
-- check if we start with a quote
|
||
IF INSTR (p_parseline, '"', 1) = 1
|
||
THEN
|
||
-- strip leading and trailing quote
|
||
-- we assume that the last character is a quote
|
||
p_field := substr2 (p_parseline, 2, LENGTH (p_parseline) - 2);
|
||
-- now we only have the unescape the double quotes
|
||
p_field := replace(p_field, '""', '"');
|
||
ELSE
|
||
p_field := substr2 (p_parseline, 1);
|
||
END IF;
|
||
p_parseline := '';
|
||
ELSE
|
||
-- we found a delimiter
|
||
p_field := SUBSTR (p_parseline, 1, v_firstdelim - 1);
|
||
v_first_quote := INSTR (p_field, '"', 1);
|
||
|
||
IF v_first_quote <> 1 OR p_field IS NULL
|
||
THEN
|
||
-- line does not start with a quote or field is empty
|
||
-- (two delimiters after each other)
|
||
p_parseline := substr2 (p_parseline, v_firstdelim + 1);
|
||
ELSE
|
||
-- double quote found. Search for the end double quote.
|
||
v_found := FALSE;
|
||
v_quote_count := 2;
|
||
|
||
WHILE v_found = FALSE
|
||
LOOP
|
||
-- look for the next double quote
|
||
v_next_quote := INSTR (p_parseline, '"', 1, v_quote_count);
|
||
|
||
IF v_next_quote = 0
|
||
THEN
|
||
-- no end quote found. So, it is the last field in the row
|
||
-- lets remove the leading quote
|
||
-- this should not happen since a quoted field should always have an end quote
|
||
p_field := substr2 (p_parseline, 2, LENGTH (p_parseline) - 1);
|
||
p_parseline := '';
|
||
v_found := TRUE;
|
||
ELSE
|
||
-- we have found a double quote, lets see what the next char is?
|
||
IF SUBSTR (p_parseline, v_next_quote + 1, 1) = '"'
|
||
THEN
|
||
-- two quotes found, so lets unescape the quote
|
||
v_quote_count := v_quote_count + 1;
|
||
p_parseline :=
|
||
SUBSTR (p_parseline, 1, v_next_quote)
|
||
|| SUBSTR (p_parseline, v_next_quote + 2);
|
||
ELSIF SUBSTR (p_parseline, v_next_quote + 1, 1) = p_fielddelimitor
|
||
THEN
|
||
-- quote + delimiter found
|
||
p_field := SUBSTR (p_parseline, 2, v_next_quote - 2);
|
||
p_parseline := SUBSTR (p_parseline, v_next_quote + 2);
|
||
v_found := TRUE;
|
||
ELSE
|
||
-- quote without delimiter found
|
||
-- this should never happen.
|
||
v_quote_count := v_quote_count + 1;
|
||
END IF;
|
||
END IF;
|
||
END LOOP;
|
||
END IF;
|
||
END IF;
|
||
END;
|
||
|
||
-- Retourneert het gegevens uit de kolom met volgnummer 'p_nr', beginnend met kolomnr 1.
|
||
-- 'Uiteraard' is deze functie gebaseerd op imp_getfield!
|
||
-- Verschil is dat p_parseline hier alleen IN-parameter is (en niet IN-OUT), en natuurlijk de extra parameter p_nr.
|
||
-- En de gelezen waarde wordt itt imp_getfield gewoon getrimd (weg met die overbodige spaties die alleen voor de rommel zorgen): VOD D'R MET!
|
||
PROCEDURE imp_getfield_nr (
|
||
p_parseline IN VARCHAR2,
|
||
p_fielddelimitor IN VARCHAR2,
|
||
p_nr IN NUMBER,
|
||
p_field OUT VARCHAR2
|
||
)
|
||
AS
|
||
l_parseline VARCHAR2(1024);
|
||
l_nr NUMBER(10);
|
||
l_field VARCHAR2(1024);
|
||
BEGIN
|
||
l_parseline :=p_parseline;
|
||
l_nr :=p_nr;
|
||
WHILE l_nr >= 1
|
||
LOOP
|
||
-- look for the next kolom in p_parseline
|
||
fac.imp_getfield (l_parseline, p_fielddelimitor, l_field);
|
||
l_nr := l_nr -1;
|
||
END LOOP;
|
||
-- Trimmen met die hap!
|
||
-- En nu pas het veld toekennen aan de parameter van de procedure
|
||
-- omdat de lengte korter kan zijn dan de lengte van de eerdere velden.
|
||
p_field:=TRIM(l_field);
|
||
END;
|
||
|
||
PROCEDURE imp_writelog (
|
||
p_import_key IN NUMBER,
|
||
plevel IN VARCHAR2,
|
||
pmsg IN VARCHAR2,
|
||
phint IN VARCHAR2
|
||
)
|
||
AS
|
||
BEGIN
|
||
INSERT INTO imp_log
|
||
(fac_import_key, imp_log_datum,
|
||
imp_log_status, imp_log_omschrijving, imp_log_hint
|
||
)
|
||
VALUES (p_import_key, SYSDATE,
|
||
plevel, pmsg, phint
|
||
);
|
||
END;
|
||
|
||
PROCEDURE writelog (
|
||
pAppl IN VARCHAR2,
|
||
plevel IN VARCHAR2,
|
||
pmsg IN VARCHAR2,
|
||
phint IN VARCHAR2
|
||
)
|
||
AS
|
||
BEGIN
|
||
INSERT INTO imp_log
|
||
(imp_log_applicatie, imp_log_datum,
|
||
imp_log_status, imp_log_omschrijving, imp_log_hint
|
||
)
|
||
VALUES (pAppl, SYSDATE,
|
||
plevel, pmsg, phint
|
||
);
|
||
END;
|
||
|
||
PROCEDURE imp_alg_delete_onrgoed (p_import_key IN NUMBER, p_mode IN NUMBER)
|
||
AS
|
||
v_errormsg VARCHAR2 (1000);
|
||
v_errorhint VARCHAR2 (1000);
|
||
oracle_err_num NUMBER;
|
||
oracle_err_mes VARCHAR2 (200);
|
||
BEGIN
|
||
DELETE FROM bez_bezoekers;
|
||
|
||
DELETE FROM bez_afspraak;
|
||
|
||
DELETE FROM res_rsv_deel;
|
||
|
||
DELETE FROM res_rsv_artikel;
|
||
|
||
DELETE FROM res_rsv_ruimte;
|
||
|
||
DELETE FROM res_reservering;
|
||
|
||
DELETE FROM res_kenmerkwaarde;
|
||
|
||
DELETE FROM res_alg_ruimte;
|
||
|
||
DELETE FROM res_ruimte_opstelling;
|
||
|
||
DELETE FROM res_ruimte;
|
||
|
||
DELETE FROM res_opstelling;
|
||
|
||
DELETE FROM res_activiteitdiscipline;
|
||
|
||
DELETE FROM res_disc_params;
|
||
|
||
DELETE FROM ins_tab_discipline
|
||
WHERE ins_discipline_module = 'RES' AND ins_discipline_min_level = '3';
|
||
|
||
DELETE FROM res_srtartikel_onrgoed;
|
||
|
||
DELETE FROM fin_factuur
|
||
WHERE mld_opdr_key IS NOT NULL;
|
||
|
||
DELETE FROM cnt_contract_plaats;
|
||
|
||
DELETE FROM cnt_contract_onrgoed;
|
||
|
||
DELETE FROM mld_kenmerkmelding;
|
||
|
||
DELETE FROM mld_melding_object;
|
||
|
||
DELETE FROM mld_opdr;
|
||
|
||
DELETE FROM mld_melding;
|
||
|
||
DELETE FROM mld_adres;
|
||
|
||
DELETE FROM prs_perslidwerkplek;
|
||
|
||
IF (p_mode < 2)
|
||
THEN
|
||
DELETE FROM prs_contactpersoon_locatie;
|
||
END IF;
|
||
|
||
DELETE FROM ins_verbinding;
|
||
|
||
DELETE FROM ins_deelkoppeling;
|
||
|
||
DELETE FROM ins_deel
|
||
WHERE ins_deel_parent_key IS NOT NULL;
|
||
|
||
DELETE FROM ins_deel
|
||
WHERE ins_alg_ruimte_type IS NOT NULL;
|
||
|
||
DELETE FROM alg_terreinsector;
|
||
|
||
DELETE FROM alg_srtterreinsector;
|
||
|
||
DELETE FROM alg_ruimte;
|
||
|
||
DELETE FROM alg_srtruimte;
|
||
|
||
DELETE FROM alg_verdieping;
|
||
|
||
IF (p_mode < 2)
|
||
THEN
|
||
DELETE FROM alg_onrgoedkenmerk;
|
||
|
||
DELETE FROM alg_gebouw;
|
||
|
||
DELETE FROM alg_srtgebouw;
|
||
|
||
DELETE FROM alg_locatie;
|
||
|
||
DELETE FROM alg_district;
|
||
|
||
DELETE FROM alg_regio;
|
||
ELSE
|
||
DELETE FROM alg_onrgoedkenmerk
|
||
WHERE alg_onrgoed_niveau IN ('R', 'T');
|
||
END IF;
|
||
EXCEPTION
|
||
WHEN OTHERS
|
||
THEN
|
||
oracle_err_num := SQLCODE;
|
||
oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
|
||
|
||
IF (v_errormsg = '')
|
||
THEN
|
||
v_errormsg := 'Niet alle onroerendgoed gegevens zijn verwijderd!';
|
||
END IF;
|
||
|
||
v_errorhint :=
|
||
v_errorhint
|
||
|| ' (ORACLE error NUMBER = <'
|
||
|| oracle_err_num
|
||
|| '> ORACLE error message = <'
|
||
|| oracle_err_mes
|
||
|| '>)';
|
||
fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
|
||
COMMIT;
|
||
END;
|
||
|
||
PROCEDURE imp_prs_delete_organisatie (p_import_key IN NUMBER, p_mode IN NUMBER)
|
||
AS
|
||
v_errormsg VARCHAR2 (1000);
|
||
v_errorhint VARCHAR2 (1000);
|
||
oracle_err_num NUMBER;
|
||
oracle_err_mes VARCHAR2 (200);
|
||
|
||
v_bedrijf_key NUMBER(10);
|
||
v_srtperslid_key NUMBER(10);
|
||
v_afdeling_key NUMBER(10);
|
||
v_groep_key_def NUMBER(10);
|
||
v_groep_key_admin NUMBER(10);
|
||
v_perslid_key_gast NUMBER(10);
|
||
v_perslid_key_fac NUMBER(10);
|
||
v_functie_key_prssys NUMBER(10);
|
||
|
||
-- PRS_CONTACTPERSOON_LOCATIE
|
||
CURSOR c1
|
||
IS
|
||
SELECT prs_contactpersoon_locatie_key
|
||
FROM prs_contactpersoon_locatie;
|
||
|
||
rec1 c1%ROWTYPE;
|
||
|
||
-- PRS_CONTACTPERSOON
|
||
CURSOR c2
|
||
IS
|
||
SELECT prs_contactpersoon_key
|
||
FROM prs_contactpersoon;
|
||
|
||
rec2 c2%ROWTYPE;
|
||
|
||
-- PRS_BEDRIJFDIENSTLOCATIE
|
||
CURSOR c3
|
||
IS
|
||
SELECT prs_bedrijfdienstlocatie_key
|
||
FROM prs_bedrijfdienstlocatie;
|
||
|
||
rec3 c3%ROWTYPE;
|
||
|
||
-- PRS_PERSLIDWERKPLEK
|
||
CURSOR c4
|
||
IS
|
||
SELECT prs_perslidwerkplek_key
|
||
FROM prs_perslidwerkplek;
|
||
|
||
rec4 c4%ROWTYPE;
|
||
|
||
-- PRS_WERKPLEK
|
||
CURSOR c5
|
||
IS
|
||
SELECT prs_werkplek_key
|
||
FROM prs_werkplek;
|
||
|
||
rec5 c5%ROWTYPE;
|
||
|
||
-- PRS_PERSLID
|
||
CURSOR c6
|
||
IS
|
||
SELECT prs_perslid_key
|
||
FROM prs_perslid
|
||
WHERE prs_perslid_oslogin not in ('_GAST','_FACILITOR')
|
||
OR prs_perslid_oslogin IS NULL;
|
||
|
||
rec6 c6%ROWTYPE;
|
||
|
||
-- PRS_SRTPERSLID
|
||
CURSOR c7
|
||
IS
|
||
SELECT prs_srtperslid_key
|
||
FROM prs_srtperslid
|
||
where prs_srtperslid_upper <> 'ONBEKEND';
|
||
|
||
rec7 c7%ROWTYPE;
|
||
|
||
-- PRS_KOSTENPLAATS
|
||
CURSOR c8
|
||
IS
|
||
SELECT prs_kostenplaats_key
|
||
FROM prs_kostenplaats;
|
||
|
||
rec8 c8%ROWTYPE;
|
||
|
||
BEGIN
|
||
IF (p_mode <= 1)
|
||
THEN
|
||
|
||
FOR rec1 IN c1
|
||
LOOP
|
||
BEGIN
|
||
delete from prs_contactpersoon_locatie where prs_contactpersoon_locatie_key = rec1.prs_contactpersoon_locatie_key;
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
v_errormsg := 'Ok, dan niet. Neem het volgende record ....';
|
||
END;
|
||
END LOOP;
|
||
|
||
commit;
|
||
|
||
FOR rec2 IN c2
|
||
LOOP
|
||
BEGIN
|
||
delete from prs_contactpersoon where prs_contactpersoon_key = rec2.prs_contactpersoon_key;
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
v_errormsg := 'Ok, dan niet. Neem het volgende record ....';
|
||
END;
|
||
END LOOP;
|
||
|
||
commit;
|
||
|
||
FOR rec3 IN c3
|
||
LOOP
|
||
BEGIN
|
||
delete from prs_bedrijfdienstlocatie where prs_bedrijfdienstlocatie_key = rec3.prs_bedrijfdienstlocatie_key;
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
v_errormsg := 'Ok, dan niet. Neem het volgende record ....';
|
||
END;
|
||
END LOOP;
|
||
|
||
commit;
|
||
|
||
END IF;
|
||
|
||
IF (p_mode <= 2)
|
||
THEN
|
||
|
||
FOR rec4 IN c4
|
||
LOOP
|
||
BEGIN
|
||
delete from prs_perslidwerkplek where prs_perslidwerkplek_key = rec4.prs_perslidwerkplek_key;
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
v_errormsg := 'Ok, dan niet. Neem het volgende record ....'; -- agv prs_v_verplichting_all/fac_gebruikersgroep
|
||
END;
|
||
END LOOP;
|
||
|
||
commit;
|
||
|
||
FOR rec5 IN c5
|
||
LOOP
|
||
BEGIN
|
||
delete from prs_werkplek where prs_werkplek_key = rec5.prs_werkplek_key;
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
v_errormsg := 'Ok, dan niet. Neem het volgende record ....'; --
|
||
END;
|
||
END LOOP;
|
||
|
||
commit;
|
||
|
||
FOR rec6 IN c6
|
||
LOOP
|
||
BEGIN
|
||
delete from prs_perslid where prs_perslid_key = rec6.prs_perslid_key;
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
v_errormsg := 'Ok, dan niet. Neem het volgende record ....'; -- agv prs_v_verplichting_all/fac_gebruikersgroep/prs_perslidwerkplek
|
||
END;
|
||
END LOOP;
|
||
|
||
commit;
|
||
|
||
FOR rec7 IN c7
|
||
LOOP
|
||
BEGIN
|
||
delete from prs_srtperslid where prs_srtperslid_key = rec7.prs_srtperslid_key;
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
v_errormsg := 'Ok, dan niet. Neem het volgende record ....'; -- agv prs_perslid
|
||
END;
|
||
END LOOP;
|
||
|
||
commit;
|
||
|
||
END IF;
|
||
|
||
IF (p_mode <= 1)
|
||
THEN
|
||
|
||
-- Verwijder ALLE afdelingen indien mogelijk. Doe dit wel in de 'juiste' volgorde.
|
||
|
||
DELETE FROM prs_afdeling
|
||
WHERE prs_afdeling_key IN (SELECT prs_afdeling_key
|
||
FROM prs_v_afdeling
|
||
WHERE niveau = 5) AND prs_afdeling_key NOT IN (SELECT prs_afdeling_key
|
||
FROM prs_perslid);
|
||
|
||
DELETE FROM prs_afdeling
|
||
WHERE prs_afdeling_key IN (SELECT prs_afdeling_key
|
||
FROM prs_v_afdeling
|
||
WHERE niveau = 4)
|
||
AND prs_afdeling_key NOT IN (SELECT prs_afdeling_key
|
||
FROM prs_perslid)
|
||
AND prs_afdeling_key NOT IN (SELECT prs_afdeling_parentkey
|
||
FROM prs_v_afdeling
|
||
WHERE niveau = 5);
|
||
|
||
DELETE FROM prs_afdeling
|
||
WHERE prs_afdeling_key IN (SELECT prs_afdeling_key
|
||
FROM prs_v_afdeling
|
||
WHERE niveau = 3)
|
||
AND prs_afdeling_key NOT IN (SELECT prs_afdeling_key
|
||
FROM prs_perslid)
|
||
AND prs_afdeling_key NOT IN (SELECT prs_afdeling_parentkey
|
||
FROM prs_v_afdeling
|
||
WHERE niveau = 4);
|
||
|
||
DELETE FROM prs_afdeling
|
||
WHERE prs_afdeling_key IN (SELECT prs_afdeling_key
|
||
FROM prs_v_afdeling
|
||
WHERE niveau = 2)
|
||
AND prs_afdeling_key NOT IN (SELECT prs_afdeling_key
|
||
FROM prs_perslid)
|
||
AND prs_afdeling_key NOT IN (SELECT prs_afdeling_parentkey
|
||
FROM prs_v_afdeling
|
||
WHERE niveau = 3);
|
||
|
||
DELETE FROM prs_afdeling
|
||
WHERE prs_afdeling_key IN (SELECT prs_afdeling_key
|
||
FROM prs_v_afdeling
|
||
WHERE niveau = 1)
|
||
AND prs_afdeling_upper <> 'ONBEKEND'
|
||
AND prs_afdeling_key NOT IN (SELECT prs_afdeling_key
|
||
FROM prs_perslid)
|
||
AND prs_afdeling_key NOT IN (SELECT prs_afdeling_parentkey
|
||
FROM prs_v_afdeling
|
||
WHERE niveau = 2);
|
||
|
||
-- Verwijder ALLE bedrijven voor zover mogelijk
|
||
DELETE FROM prs_bedrijf
|
||
WHERE prs_bedrijf_key NOT IN (SELECT prs_bedrijf_key
|
||
FROM prs_afdeling)
|
||
AND prs_bedrijf_naam_upper <> 'ONBEKEND';
|
||
|
||
commit;
|
||
|
||
END IF;
|
||
|
||
-- Verwijder ALLE kostenplaatsen voor zover mogelijk
|
||
FOR rec8 IN c8
|
||
LOOP
|
||
BEGIN
|
||
delete from prs_kostenplaats where prs_kostenplaats_key = rec8.prs_kostenplaats_key;
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
v_errormsg := 'Ok, dan niet. Neem het volgende record ....';
|
||
END;
|
||
END LOOP;
|
||
|
||
COMMIT;
|
||
|
||
-- Maak initiele vulling aan
|
||
BEGIN
|
||
INSERT INTO prs_srtperslid (prs_srtperslid_omschrijving, prs_bedrijf_key)
|
||
VALUES ('Onbekend', NULL);
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
v_errormsg := 'Ok. Kennelijk bestaat het record al';
|
||
END;
|
||
|
||
SELECT prs_srtperslid_key
|
||
INTO v_srtperslid_key
|
||
FROM prs_srtperslid
|
||
WHERE prs_srtperslid_upper = 'ONBEKEND';
|
||
|
||
BEGIN
|
||
INSERT INTO prs_bedrijf (prs_bedrijf_naam, prs_bedrijf_intern)
|
||
VALUES ('Onbekend', 1);
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
v_errormsg := 'Ok. Kennelijk bestaat het record al';
|
||
END;
|
||
|
||
SELECT prs_bedrijf_key
|
||
INTO v_bedrijf_key
|
||
FROM prs_bedrijf
|
||
WHERE prs_bedrijf_naam_upper = 'ONBEKEND';
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
BEGIN
|
||
INSERT INTO prs_afdeling (prs_bedrijf_key, prs_afdeling_naam)
|
||
VALUES (v_bedrijf_key, 'Onbekend');
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
v_errormsg := 'Ok. Kennelijk bestaat het record al';
|
||
END;
|
||
|
||
SELECT prs_afdeling_key
|
||
INTO v_afdeling_key
|
||
FROM prs_afdeling
|
||
WHERE prs_afdeling_upper = 'ONBEKEND';
|
||
|
||
BEGIN
|
||
INSERT INTO prs_perslid
|
||
(prs_perslid_module,
|
||
prs_srtperslid_key,
|
||
prs_afdeling_key,
|
||
prs_perslid_naam,
|
||
prs_perslid_oslogin,
|
||
prs_perslid_salt,
|
||
prs_perslid_wachtwoord_hash,
|
||
prs_perslid_dienstverband,
|
||
prs_perslid_ingangsdatum,
|
||
prs_perslid_login
|
||
)
|
||
VALUES ('PRS',
|
||
v_srtperslid_key,
|
||
v_afdeling_key,
|
||
'Gast',
|
||
'_GAST',
|
||
'tfYBQzSFECrhRcCgMhvVAgfgNtFaYZuh',
|
||
'6E52C06F3A8895E5BB79E36CC04502D7', /* nobodyknow$ */
|
||
100,
|
||
SYSDATE,
|
||
SYSDATE
|
||
);
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
v_errormsg := 'Ok. Kennelijk bestaat het record al';
|
||
END;
|
||
|
||
SELECT prs_perslid_key
|
||
INTO v_perslid_key_gast
|
||
FROM prs_perslid
|
||
WHERE prs_perslid_oslogin = '_GAST';
|
||
|
||
BEGIN
|
||
INSERT INTO prs_perslid
|
||
(prs_perslid_module,
|
||
prs_srtperslid_key,
|
||
prs_afdeling_key,
|
||
prs_perslid_naam,
|
||
prs_perslid_oslogin,
|
||
prs_perslid_salt,
|
||
prs_perslid_wachtwoord_hash,
|
||
prs_perslid_dienstverband,
|
||
prs_perslid_ingangsdatum,
|
||
prs_perslid_login
|
||
)
|
||
VALUES ('PRS',
|
||
v_srtperslid_key,
|
||
v_afdeling_key,
|
||
'Facilitor',
|
||
'_FACILITOR',
|
||
'wAxYpizzUNeWAFdkIkhcEbfzFAYvEpoH',
|
||
'9D8B5A6A8AED1496DF8C1CC54A9EBFF2', /* fictorial */
|
||
100,
|
||
SYSDATE,
|
||
SYSDATE
|
||
);
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
v_errormsg := 'Ok. Kennelijk bestaat het record al';
|
||
END;
|
||
|
||
SELECT prs_perslid_key
|
||
INTO v_perslid_key_fac
|
||
FROM prs_perslid
|
||
WHERE prs_perslid_oslogin = '_FACILITOR';
|
||
|
||
BEGIN
|
||
INSERT INTO fac_groep
|
||
(fac_groep_omschrijving)
|
||
VALUES ('_Default');
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
v_errormsg := 'Ok. Kennelijk bestaat het record al';
|
||
END;
|
||
|
||
SELECT fac_groep_key
|
||
INTO v_groep_key_def
|
||
FROM fac_groep
|
||
WHERE fac_groep_upper = '_DEFAULT';
|
||
|
||
BEGIN
|
||
INSERT INTO fac_groep
|
||
(fac_groep_omschrijving)
|
||
VALUES ('_Admin');
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
v_errormsg := 'Ok. Kennelijk bestaat het record al';
|
||
END;
|
||
|
||
SELECT fac_groep_key
|
||
INTO v_groep_key_admin
|
||
FROM fac_groep
|
||
WHERE fac_groep_upper = '_ADMIN';
|
||
|
||
BEGIN
|
||
INSERT INTO fac_gebruikersgroep
|
||
(fac_groep_key, prs_perslid_key)
|
||
VALUES (v_groep_key_def, v_perslid_key_gast);
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
v_errormsg := 'Ok. Kennelijk bestaat het record al';
|
||
END;
|
||
|
||
BEGIN
|
||
INSERT INTO fac_gebruikersgroep
|
||
(fac_groep_key, prs_perslid_key)
|
||
VALUES (v_groep_key_admin, v_perslid_key_fac);
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
v_errormsg := 'Ok. Kennelijk bestaat het record al';
|
||
END;
|
||
|
||
SELECT fac_functie_key
|
||
INTO v_functie_key_prssys
|
||
FROM fac_functie
|
||
WHERE fac_functie_code = 'WEB_PRSSYS';
|
||
|
||
BEGIN
|
||
INSERT INTO fac_groeprechten
|
||
(fac_groep_key,
|
||
fac_functie_key,
|
||
fac_gebruiker_prs_level_read,
|
||
fac_gebruiker_alg_level_read,
|
||
fac_gebruiker_prs_level_write,
|
||
fac_gebruiker_alg_level_write
|
||
)
|
||
VALUES (v_groep_key_admin, v_functie_key_prssys, -1, -1, -1, -1);
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
v_errormsg := 'Ok. Kennelijk bestaat het record al';
|
||
END;
|
||
|
||
commit;
|
||
|
||
EXCEPTION
|
||
WHEN OTHERS
|
||
THEN
|
||
oracle_err_num := SQLCODE;
|
||
oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
|
||
|
||
IF (v_errormsg = '')
|
||
THEN
|
||
v_errormsg := 'Niet alle bedrijven zijn verwijderd';
|
||
END IF;
|
||
|
||
v_errorhint :=
|
||
v_errorhint
|
||
|| ' (ORACLE error NUMBER = <'
|
||
|| oracle_err_num
|
||
|| '> ORACLE error message = <'
|
||
|| oracle_err_mes
|
||
|| '>)';
|
||
fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
|
||
COMMIT;
|
||
END;
|
||
|
||
PROCEDURE imp_mld_delete_mld (p_import_key IN NUMBER, p_mode IN NUMBER)
|
||
AS
|
||
v_errormsg VARCHAR2 (1000);
|
||
v_errorhint VARCHAR2 (1000);
|
||
oracle_err_num NUMBER;
|
||
oracle_err_mes VARCHAR2 (200);
|
||
BEGIN
|
||
|
||
delete from mld_opdr;
|
||
|
||
delete from mld_melding;
|
||
|
||
delete from mld_stdmelding;
|
||
|
||
delete from prs_kostensoort;
|
||
|
||
delete from mld_disc_params;
|
||
|
||
delete from ins_tab_discipline where ins_discipline_module='MLD';
|
||
|
||
delete from ins_srtdiscipline;
|
||
|
||
EXCEPTION
|
||
WHEN OTHERS
|
||
THEN
|
||
oracle_err_num := SQLCODE;
|
||
oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
|
||
|
||
v_errormsg := 'Niet alle servicedesk gegevens zijn verwijderd!';
|
||
|
||
v_errorhint :=
|
||
v_errorhint
|
||
|| ' (ORACLE error NUMBER = <'
|
||
|| oracle_err_num
|
||
|| '> ORACLE error message = <'
|
||
|| oracle_err_mes
|
||
|| '>)';
|
||
fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
|
||
COMMIT;
|
||
END; -- imp_mld_delete_mld
|
||
|
||
PROCEDURE fac_perfmon_incr (limiet IN NUMBER, zwaarte IN NUMBER)
|
||
AS
|
||
dummy VARCHAR2 (1);
|
||
BEGIN
|
||
BEGIN
|
||
SELECT ''
|
||
INTO dummy
|
||
FROM fac_perfmon
|
||
WHERE fac_perfmon_datum = TRUNC (SYSDATE);
|
||
|
||
UPDATE fac_perfmon
|
||
SET fac_perfmon_waarde = fac_perfmon_waarde + zwaarte,
|
||
fac_perfmon_aantal = fac_perfmon_aantal + 1
|
||
WHERE fac_perfmon_datum = TRUNC (SYSDATE);
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
-- a brandnew day. vul het aantal gebruikers van de vorige dag in en start een nieuwe
|
||
UPDATE fac_perfmon
|
||
SET fac_perfmon_users =
|
||
(SELECT COUNT (prs_perslid_key)
|
||
FROM prs_perslid
|
||
WHERE TRUNC (prs_perslid_login) = fac_perfmon_datum)
|
||
WHERE fac_perfmon_users IS NULL;
|
||
|
||
INSERT INTO fac_perfmon
|
||
(fac_perfmon_aantal, fac_perfmon_waarde,
|
||
fac_perfmon_datum, fac_perfmon_threshold
|
||
)
|
||
VALUES (1, zwaarte,
|
||
TRUNC (SYSDATE), limiet
|
||
);
|
||
END;
|
||
END;
|
||
|
||
-- Retourneert string met emailadres van persoon pkey, '' indien niet beschikbaar
|
||
FUNCTION getemail (pkey IN NUMBER)
|
||
RETURN VARCHAR2
|
||
IS
|
||
lemail prs_perslid.prs_perslid_email%TYPE;
|
||
BEGIN
|
||
lemail := '';
|
||
|
||
BEGIN
|
||
-- emailadres van ontvanger
|
||
SELECT prs_perslid_email
|
||
INTO lemail
|
||
FROM prs_perslid
|
||
WHERE prs_perslid_key = pkey;
|
||
EXCEPTION
|
||
WHEN OTHERS
|
||
THEN
|
||
NULL;
|
||
END;
|
||
|
||
RETURN lemail;
|
||
END;
|
||
|
||
-- Retourneert string met mobielnummer van persoon pkey, '' indien niet beschikbaar
|
||
FUNCTION getmobile (pkey IN NUMBER)
|
||
RETURN VARCHAR2
|
||
IS
|
||
lphone prs_perslid.prs_perslid_mobiel%TYPE;
|
||
BEGIN
|
||
lphone := '';
|
||
|
||
BEGIN
|
||
-- mobiele telefoon van ontvanger
|
||
SELECT prs_perslid_mobiel
|
||
INTO lphone
|
||
FROM prs_perslid
|
||
WHERE prs_perslid_key = pkey;
|
||
EXCEPTION
|
||
WHEN OTHERS
|
||
THEN
|
||
NULL;
|
||
END;
|
||
|
||
RETURN lphone;
|
||
END;
|
||
|
||
-- Retourneert de taal van een user
|
||
FUNCTION getlang (pkey IN NUMBER)
|
||
RETURN VARCHAR2
|
||
IS
|
||
llang prs_perslid.prs_perslid_lang%TYPE;
|
||
BEGIN
|
||
llang := '';
|
||
|
||
BEGIN
|
||
-- taal van persoon; te overwegen (gelijk gedrag) is om alleen
|
||
-- afwijking terug te geven, dus NULL als default ipv default
|
||
SELECT COALESCE(prs_perslid_lang, lcl.getuserlanguage())
|
||
INTO llang
|
||
FROM prs_perslid
|
||
WHERE prs_perslid_key = pkey;
|
||
EXCEPTION
|
||
WHEN OTHERS
|
||
THEN
|
||
NULL;
|
||
END;
|
||
|
||
RETURN llang;
|
||
END;
|
||
|
||
-- Zet een vrij bericht in de queue ter verspreiding volgens pmode. Dit is geen bestaande srtnotificatie
|
||
-- 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)
|
||
AS
|
||
lemail prs_perslid.prs_perslid_email%TYPE;
|
||
lphone prs_perslid.prs_perslid_mobiel%TYPE;
|
||
llang prs_perslid.prs_perslid_lang%TYPE;
|
||
lsysteem prs_perslid.prs_perslid_systeemadres%TYPE;
|
||
lmode NUMBER;
|
||
BEGIN
|
||
lmode := pmode;
|
||
IF poptemail IS NULL
|
||
THEN
|
||
lemail := fac.getemail (pto);
|
||
ELSE
|
||
lemail := poptemail;
|
||
END IF;
|
||
|
||
IF poptmobile IS NULL
|
||
THEN
|
||
lphone := fac.getmobile (pto);
|
||
ELSE
|
||
lphone := poptmobile;
|
||
END IF;
|
||
|
||
IF pto IS NOT NULL
|
||
THEN
|
||
llang := fac.getlang(pto);
|
||
ELSE
|
||
llang := lcl.getuserlanguage();
|
||
END IF;
|
||
|
||
IF pto IS NOT NULL
|
||
THEN
|
||
BEGIN
|
||
SELECT prs_perslid_systeemadres
|
||
INTO lsysteem
|
||
FROM prs_perslid
|
||
WHERE prs_perslid_key = pto;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND THEN NULL;
|
||
END;
|
||
END IF;
|
||
|
||
-- Stuur notificatie
|
||
IF BITAND(pmode, 2) = 2 AND lemail IS NULL
|
||
THEN
|
||
lmode := BITAND(lmode, 255-2);
|
||
END IF;
|
||
|
||
IF BITAND(pmode, 4) = 4 AND lphone IS NULL
|
||
THEN
|
||
lmode := BITAND(lmode, 255-4);
|
||
END IF;
|
||
|
||
IF lmode > 0 OR lsysteem IS NOT NULL THEN
|
||
INSERT INTO fac_notificatie
|
||
(fac_srtnotificatie_key, fac_notificatie_status, prs_perslid_key_sender, prs_perslid_key_receiver,
|
||
fac_notificatie_receiver_email, fac_notificatie_receiver_phone, fac_notificatie_oms,
|
||
fac_notificatie_refkey, fac_notificatie_prioriteit, fac_notificatie_lang, fac_notificatie_systeemadres
|
||
)
|
||
VALUES (NULL, lmode, pfrom, pto,
|
||
lemail, lphone, SUBSTR(pmessage, 1, 2048),
|
||
NULL, pprio, llang, lsysteem
|
||
);
|
||
END IF;
|
||
END;
|
||
|
||
/* for code compatibility only */
|
||
PROCEDURE putnotification (pfrom NUMBER, pto NUMBER, pmessage VARCHAR2, pmode NUMBER,
|
||
poptemail VARCHAR2, poptmobile VARCHAR2)
|
||
AS
|
||
BEGIN
|
||
putnotificationprio (pfrom, pto, pmessage, pmode, poptemail, poptmobile, 2);
|
||
END;
|
||
|
||
-- Zet een bericht in de queue ter verspreiding aan de applicatiebeheerders
|
||
PROCEDURE putsystemnotification (pmessage VARCHAR2, pmode NUMBER)
|
||
AS
|
||
CURSOR c1
|
||
IS
|
||
SELECT fgg.prs_perslid_key
|
||
FROM fac_functie f, fac_groeprechten fgr, fac_gebruikersgroep fgg
|
||
WHERE fgg.fac_groep_key = fgr.fac_groep_key
|
||
AND f.fac_functie_key = fgr.fac_functie_key
|
||
AND f.fac_functie_code = 'WEB_PRSSYS';
|
||
BEGIN
|
||
FOR rec1 IN c1
|
||
LOOP
|
||
putnotification (NULL, rec1.prs_perslid_key, pmessage, pmode, NULL, NULL);
|
||
END LOOP;
|
||
END;
|
||
|
||
-- Zet een bericht in de queue ter verspreiding volgens definitie van een bestaande srtnotificatie
|
||
-- Eventueel gebeurt er dus niets, als de srtnotificatie uitgeschakeld (mode=0) is.
|
||
-- Als het bericht wordt meegegeven in poptmessage dan wordt die tekst gebruikt ipv de standaardtekst van pcode
|
||
-- Evenzo wordt de standaardmode overruled door poptstatus als die meegegeven is, en
|
||
-- kan de email en mobile van pto optioneel worden overruled door poptemail en poptmobile
|
||
-- Als email of sms gevraagt wordt (smode) en email of mobile kan niet bepaald worden, wordt niet gequeued
|
||
-- pprio is de prioriteit (1, 2 of 3) die geen effect heeft op de quebehandeling, maar wel wordt meegegeven
|
||
-- psender is een optioneel emailadres dat als afzender kan worden gehanteerd.
|
||
PROCEDURE putnotificationsrtprio (pfrom NUMBER,
|
||
pto NUMBER,
|
||
pcode VARCHAR2,
|
||
pref NUMBER,
|
||
poptmessage VARCHAR2,
|
||
poptstatus NUMBER,
|
||
poptemail VARCHAR2,
|
||
poptmobile VARCHAR2,
|
||
pxref NUMBER,
|
||
pprio NUMBER,
|
||
psender VARCHAR2)
|
||
AS
|
||
soms fac_srtnotificatie.fac_srtnotificatie_oms%TYPE;
|
||
smode fac_srtnotificatie.fac_srtnotificatie_mode%TYPE;
|
||
oldersmode fac_srtnotificatie.fac_srtnotificatie_mode%TYPE;
|
||
susermode fac_srtnotificatie.fac_srtnotificatie_usermode%TYPE;
|
||
lmode fac_srtnotificatie.fac_srtnotificatie_mode%TYPE;
|
||
skey fac_srtnotificatie.fac_srtnotificatie_key%TYPE;
|
||
lemail fac_notificatie.fac_notificatie_receiver_email%TYPE;
|
||
lphone fac_notificatie.fac_notificatie_receiver_phone%TYPE;
|
||
llang prs_perslid.prs_perslid_lang%TYPE;
|
||
lsysteem prs_perslid.prs_perslid_systeemadres%TYPE;
|
||
BEGIN
|
||
IF pcode IS NOT NULL
|
||
THEN
|
||
BEGIN
|
||
IF poptstatus IS NULL
|
||
THEN
|
||
-- Geen status/mode meegegeven, bepaal em zelf
|
||
SELECT sn.fac_srtnotificatie_oms,
|
||
sn.fac_srtnotificatie_mode,
|
||
sn.fac_srtnotificatie_key,
|
||
fac_srtnotificatie_usermode
|
||
INTO soms,
|
||
smode,
|
||
skey,
|
||
susermode
|
||
FROM fac_srtnotificatie sn
|
||
WHERE sn.fac_srtnotificatie_code = pcode
|
||
AND sn.fac_srtnotificatie_mode > 0;
|
||
|
||
-- Als deze notificatiesoort userafhankelijk kan zijn, kijken we
|
||
-- naar de status/mode die bij de user is aangegeven
|
||
IF susermode = 1 AND pto IS NOT NULL
|
||
THEN
|
||
BEGIN
|
||
SELECT prs_perslid_srtnoti_mode
|
||
INTO smode
|
||
FROM prs_perslid
|
||
WHERE prs_perslid_key = pto
|
||
AND prs_perslid_srtnoti_mode IS NOT NULL;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
-- geen gebruikersoverrule, gebruik gewoon de centrale mode
|
||
NULL;
|
||
END;
|
||
END IF;
|
||
ELSE
|
||
-- Wel status meegegeven; die is dan vast
|
||
smode := poptstatus;
|
||
|
||
SELECT sn.fac_srtnotificatie_oms, sn.fac_srtnotificatie_key
|
||
INTO soms, skey
|
||
FROM fac_srtnotificatie sn
|
||
WHERE sn.fac_srtnotificatie_code = pcode;
|
||
END IF;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
-- Nothing to do
|
||
RETURN;
|
||
END;
|
||
|
||
IF poptmessage IS NOT NULL
|
||
THEN
|
||
soms := poptmessage;
|
||
END IF;
|
||
|
||
soms := REPLACE (soms, '##KEY##', TO_CHAR (pref));
|
||
|
||
IF poptemail IS NULL
|
||
THEN
|
||
lemail := fac.getemail (pto);
|
||
ELSE
|
||
lemail := poptemail;
|
||
END IF;
|
||
|
||
IF poptmobile IS NULL
|
||
THEN
|
||
lphone := fac.getmobile (pto);
|
||
ELSE
|
||
lphone := poptmobile;
|
||
END IF;
|
||
|
||
IF pto IS NOT NULL
|
||
THEN
|
||
llang := fac.getlang(pto);
|
||
ELSE
|
||
llang := lcl.getuserlanguage();
|
||
END IF;
|
||
|
||
IF pto IS NOT NULL
|
||
THEN
|
||
BEGIN
|
||
SELECT prs_perslid_systeemadres
|
||
INTO lsysteem
|
||
FROM prs_perslid
|
||
WHERE prs_perslid_key = pto;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND THEN NULL;
|
||
END;
|
||
END IF;
|
||
|
||
lmode := smode;
|
||
|
||
IF BITAND (smode, 2) = 2 AND lemail IS NULL
|
||
THEN
|
||
lmode := BITAND (lmode, 255 - 2);
|
||
END IF;
|
||
|
||
IF BITAND (smode, 4) = 4 AND lphone IS NULL
|
||
THEN
|
||
lmode := BITAND (lmode, 255 - 4);
|
||
END IF;
|
||
|
||
-- voorkom e-mail/sms van deze *UPD als de *NEW nog niet eens de deur uit is door Putorders
|
||
-- of meer algemeen: elke e-mail/sms die nog niet de deur is.
|
||
IF BITAND (smode, 2 + 4) <> 0
|
||
THEN
|
||
-- Zoek de lmode van een al/nog aanwezige fac_notificatie die over hetzelfde gaat
|
||
BEGIN
|
||
SELECT fac_notificatie_status
|
||
INTO oldersmode
|
||
FROM fac_v_notifyqueue ander
|
||
WHERE (pcode = ander.fac_srtnotificatie_code
|
||
OR pcode = 'BESUPD'
|
||
AND ander.fac_srtnotificatie_code IN ('BESNEW')
|
||
OR pcode = 'RESUPD'
|
||
AND ander.fac_srtnotificatie_code IN ('RESNEW')
|
||
OR pcode = 'MLDUPD'
|
||
AND ander.fac_srtnotificatie_code IN ('MLDNEW')
|
||
)
|
||
AND ander.fac_notificatie_refkey = pref
|
||
AND COALESCE (ander.fac_notificatie_extrakey, -1) =
|
||
COALESCE (pxref, -1)
|
||
AND COALESCE (ander.fac_notificatie_receiver_email, '@') =
|
||
COALESCE (lemail, '@')
|
||
AND COALESCE (ander.fac_notificatie_receiver_phone, '@') =
|
||
COALESCE (lphone, '@')
|
||
AND BITAND (fac_notificatie_status, 2 + 4) <> 0
|
||
AND ROWNUM=1; -- anders te ingewikkeld
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
NULL;
|
||
END;
|
||
|
||
IF BITAND (smode, 2) = 2 AND BITAND (oldersmode, 2) = 2
|
||
THEN
|
||
lmode := BITAND (lmode, 255 - 2);
|
||
END IF;
|
||
|
||
IF BITAND (smode, 4) = 4 AND BITAND (oldersmode, 4) = 4
|
||
THEN
|
||
lmode := BITAND (lmode, 255 - 4);
|
||
END IF;
|
||
|
||
-- Dan nog omgekeerd: trek eerdere zwakkere notificaties terug als deze pcode sterker is
|
||
-- als die oudere nog niet de deur uit is. NB: de tracking blijft natuurlijk gewoon
|
||
-- Ook portalberichten worden zo verminderd, en niet alleen die van de laatste 5 minuten
|
||
-- U zult bezwaar maken, maar mij motivatie is dat notificatie een attentiewaarde heeft
|
||
-- en een oude attentie waardeloos is. Herhaalde update werden ook al onderdrukt.
|
||
-- De tracking tells it all! Gooi je zelf niks weg, dan resteert in de portal de NEW en de AFM, tof.
|
||
-- Wellicht dat deze lijst nog wat groeit.
|
||
CASE pcode
|
||
WHEN 'MLDAFM'
|
||
THEN
|
||
fac.clrnotifications('MLDUPD', pref);
|
||
WHEN 'RESAFM'
|
||
THEN
|
||
fac.clrnotifications('RESUPD', pref);
|
||
WHEN 'BESAFM'
|
||
THEN
|
||
fac.clrnotifications('BESUPD', pref);
|
||
WHEN 'ORDAFM'
|
||
THEN
|
||
fac.clrnotifications('ORDUPD', pref);
|
||
ELSE
|
||
NULL;
|
||
END CASE;
|
||
|
||
END IF;
|
||
END IF;
|
||
|
||
IF lmode > 0
|
||
THEN
|
||
-- Stuur notificatie, als soms meerdere regels is dan alleen eerste regel
|
||
-- Empirisch gebleken dat chr(10) wel wat doet, en chr(13) niet echt
|
||
-- hangt dat van iets af? Moeten we dan misschien allebei doen?
|
||
IF INSTR(soms, CHR(10)) > 0
|
||
THEN
|
||
soms := SUBSTR(soms, 1, INSTR (soms, CHR(10)) - 1);
|
||
END IF;
|
||
INSERT INTO fac_notificatie (fac_srtnotificatie_key,
|
||
fac_notificatie_status,
|
||
prs_perslid_key_sender,
|
||
prs_perslid_key_receiver,
|
||
fac_notificatie_receiver_email,
|
||
fac_notificatie_receiver_phone,
|
||
fac_notificatie_oms,
|
||
fac_notificatie_refkey,
|
||
fac_notificatie_extrakey,
|
||
fac_notificatie_prioriteit,
|
||
fac_notificatie_sender_email,
|
||
fac_notificatie_lang,
|
||
fac_notificatie_systeemadres)
|
||
VALUES (skey,
|
||
lmode,
|
||
pfrom,
|
||
pto,
|
||
lemail,
|
||
lphone,
|
||
soms,
|
||
pref,
|
||
pxref,
|
||
pprio,
|
||
psender,
|
||
llang,
|
||
lsysteem);
|
||
END IF;
|
||
END;
|
||
|
||
-- Ruim zoveel mogelijk notificatiespul op voor dit item. Pcode mag een wildcard zijn!
|
||
PROCEDURE clrnotifications (pcode VARCHAR2, pref NUMBER)
|
||
AS
|
||
skey fac_srtnotificatie.fac_srtnotificatie_key%TYPE;
|
||
BEGIN
|
||
-- gequeuede berichten
|
||
DELETE FROM fac_notificatie
|
||
WHERE fac_srtnotificatie_key IN (SELECT sn.fac_srtnotificatie_key
|
||
FROM fac_srtnotificatie sn
|
||
WHERE sn.fac_srtnotificatie_code LIKE pcode)
|
||
AND fac_notificatie_refkey = pref;
|
||
|
||
-- portalberichten
|
||
DELETE FROM web_user_messages
|
||
WHERE fac_srtnotificatie_key IN (SELECT sn.fac_srtnotificatie_key
|
||
FROM fac_srtnotificatie sn
|
||
WHERE sn.fac_srtnotificatie_code LIKE pcode)
|
||
AND web_user_mess_action_params = pref;
|
||
|
||
END;
|
||
|
||
-- Kijk welke jobs gescheduled zijn en nu uitgevoerd moeten worden.
|
||
PROCEDURE putnotificationjobs (pcust VARCHAR2)
|
||
AS
|
||
CURSOR c1
|
||
IS
|
||
SELECT fac_notificatie_job_key, fac_notificatie_job_view, fac_notificatie_job_oms,
|
||
fac_notificatie_job_interval, fac_notificatie_job_mode, fac_notificatie_job_nextrun
|
||
FROM fac_notificatie_job
|
||
WHERE fac_notificatie_job_nextrun <= SYSDATE OR fac_notificatie_job_nextrun IS NULL; -- eerste keer
|
||
tnextrun fac_notificatie_job.fac_notificatie_job_nextrun%TYPE;
|
||
BEGIN
|
||
FOR rec1 IN c1
|
||
LOOP
|
||
-- Voer de job uit
|
||
putjobnotifications (rec1.fac_notificatie_job_view, rec1.fac_notificatie_job_mode);
|
||
-- Notificeer de uitvoering van de job aan de beheerder(s)? Regel dat zelf maar!
|
||
-- putsystemnotification ('Notificatiejob ' || rec1.fac_notificatie_job_oms || ' uitgevoerd.', 1);
|
||
-- Bepaal de volgende keer voor deze job, en garandeer dat dat altijd NA NU gaat gebeuren
|
||
-- dus zonder dat eventueel overgeslagen keren nog zullen worden ingehaald.
|
||
tnextrun := COALESCE (rec1.fac_notificatie_job_nextrun, SYSDATE);
|
||
|
||
WHILE tnextrun <= SYSDATE
|
||
LOOP
|
||
-- Interval in hrs, DATE arithmetics are in days, so we will have to divide by 24 hrs a day
|
||
UPDATE fac_notificatie_job
|
||
SET fac_notificatie_job_nextrun =
|
||
COALESCE (fac_notificatie_job_nextrun, SYSDATE)
|
||
+ rec1.fac_notificatie_job_interval / 24
|
||
WHERE fac_notificatie_job_key = rec1.fac_notificatie_job_key;
|
||
|
||
SELECT fac_notificatie_job_nextrun
|
||
INTO tnextrun
|
||
FROM fac_notificatie_job
|
||
WHERE fac_notificatie_job_key = rec1.fac_notificatie_job_key;
|
||
END LOOP;
|
||
END LOOP;
|
||
END;
|
||
|
||
-- Voer nu job pcode uit.
|
||
PROCEDURE putjobnotifications (pviewname VARCHAR2, pmode NUMBER)
|
||
AS
|
||
TYPE noticursortype IS REF CURSOR;
|
||
|
||
messages noticursortype;
|
||
lsender fac_notificatie.prs_perslid_key_sender%TYPE;
|
||
lreceiver fac_notificatie.prs_perslid_key_receiver%TYPE;
|
||
ltext fac_notificatie.fac_notificatie_oms%TYPE;
|
||
lcode fac_srtnotificatie.fac_srtnotificatie_code%TYPE;
|
||
lrefkey fac_notificatie.fac_notificatie_refkey%TYPE;
|
||
lxkey fac_notificatie.fac_notificatie_extrakey%TYPE;
|
||
BEGIN
|
||
OPEN messages FOR 'SELECT sender, receiver, text, code, key, xkey FROM ' || pviewname;
|
||
|
||
LOOP
|
||
FETCH messages
|
||
INTO lsender, lreceiver, ltext, lcode, lrefkey, lxkey;
|
||
|
||
EXIT WHEN messages%NOTFOUND;
|
||
|
||
IF lcode IS NULL
|
||
THEN
|
||
putnotification (lsender, lreceiver, ltext, pmode, NULL, NULL);
|
||
ELSE
|
||
putnotificationsrtprio (lsender, lreceiver, lcode, lrefkey, ltext, pmode, NULL, NULL, lxkey, 2, NULL);
|
||
END IF;
|
||
END LOOP;
|
||
|
||
CLOSE messages;
|
||
EXCEPTION
|
||
WHEN OTHERS
|
||
THEN
|
||
raise_application_error (-20000, 'Facilitor: invalid notification job/view ' || pviewname);
|
||
END;
|
||
|
||
PROCEDURE executeactiviteit (pxmlnode VARCHAR2, pactkey NUMBER)
|
||
AS
|
||
lkey NUMBER (10);
|
||
lkey_m NUMBER (10);
|
||
lkey_new NUMBER (10);
|
||
luserkey NUMBER (10);
|
||
lvolgnr mld_opdr.mld_opdr_bedrijfopdr_volgnr%TYPE;
|
||
BEGIN
|
||
BEGIN
|
||
CASE pxmlnode
|
||
WHEN 'melding'
|
||
THEN
|
||
SELECT MAX (mld_melding_key)
|
||
INTO lkey
|
||
FROM mld_melding
|
||
WHERE fac_activiteit_key = pactkey;
|
||
|
||
SELECT mld_s_mld_melding_key.nextval
|
||
INTO lkey_new
|
||
FROM DUAL;
|
||
|
||
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_uitvoertijd,
|
||
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 lkey_new, mld_melding_module, mld_meldbron_key, mld_alg_locatie_key,
|
||
mld_alg_onroerendgoed_keys, SYSDATE, mld_melding_omschrijving,
|
||
'Automatisch gegenereerd door activiteit ' || pactkey || '. ' || mld_melding_opmerking,
|
||
mld_stdmelding_key, mld_melding_uitvoertijd,
|
||
mld_kosten_klant, mld_melding_document, prs_kostenplaats_key, prs_perslid_key,
|
||
mld_adres_key, NULL, NULL,
|
||
mld_melding_ordernr, mld_melding_spoed
|
||
FROM mld_melding
|
||
WHERE mld_melding_key = lkey;
|
||
|
||
INSERT INTO mld_kenmerkmelding
|
||
(mld_melding_key, mld_kenmerk_key, mld_kenmerkmelding_waarde)
|
||
SELECT lkey_new, mld_kenmerk_key, mld_kenmerkmelding_waarde
|
||
FROM mld_kenmerkmelding
|
||
WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_melding_key = lkey;
|
||
|
||
INSERT INTO mld_melding_object
|
||
(mld_melding_key, ins_deel_key)
|
||
SELECT lkey_new, ins_deel_key
|
||
FROM mld_melding_object
|
||
WHERE mld_melding_object_verwijder IS NULL AND mld_melding_key = lkey;
|
||
mld.setmeldingstatus(lkey_new, 2,NULL);
|
||
|
||
WHEN 'opdracht'
|
||
THEN
|
||
SELECT MAX (mld_opdr_key),
|
||
MAX (mld_melding_key)
|
||
INTO lkey,
|
||
lkey_m
|
||
FROM mld_opdr
|
||
WHERE fac_activiteit_key = pactkey;
|
||
|
||
SELECT mld.bepaalopdrmeldingvolgnr (lkey_m)
|
||
INTO lvolgnr
|
||
FROM DUAL;
|
||
|
||
SELECT mld_s_mld_opdr_key.nextval
|
||
INTO lkey_new
|
||
FROM DUAL;
|
||
|
||
INSERT INTO mld_opdr
|
||
(mld_opdr_key, mld_opdr_module, mld_melding_key, mld_uitvoerende_keys, mld_typeopdr_key,
|
||
mld_statusopdr_key, mld_standaardopdr_key, mld_opdr_omschrijving, mld_opdr_datumbegin,
|
||
mld_opdr_einddatum, mld_opdr_werkzaamheden, mld_opdr_uren, mld_opdr_materiaal, mld_opdr_kosten,
|
||
mld_opdr_contactpersoon, mld_opdr_bedrijfopdr_volgnr, mld_opdr_uurloon, prs_perslid_key,
|
||
prs_contactpersoon_key, cnt_contract_key, cnt_contract_dienst_key, prs_kostenplaats_key,
|
||
mld_opdr_ordernr, mld_opdr_teverzenden)
|
||
SELECT lkey_new, mld_opdr_module, mld_melding_key, mld_uitvoerende_keys, mld_typeopdr_key, mld_statusopdr_key,
|
||
mld_standaardopdr_key, mld_opdr_omschrijving, SYSDATE, mld_opdr_einddatum,
|
||
'Automatisch gegenereerd door activiteit ' || pactkey || '. ' || mld_opdr_werkzaamheden,
|
||
mld_opdr_uren, mld_opdr_materiaal, mld_opdr_kosten, mld_opdr_contactpersoon, lvolgnr,
|
||
mld_opdr_uurloon, prs_perslid_key, prs_contactpersoon_key, cnt_contract_key,
|
||
cnt_contract_dienst_key, prs_kostenplaats_key, mld_opdr_ordernr, mld_opdr_teverzenden
|
||
FROM mld_opdr
|
||
WHERE mld_opdr_key = lkey;
|
||
|
||
INSERT INTO mld_kenmerkopdr
|
||
(mld_opdr_key, mld_kenmerk_key, mld_kenmerkopdr_waarde)
|
||
SELECT lkey_new, mld_kenmerk_key, mld_kenmerkopdr_waarde
|
||
FROM mld_kenmerkopdr
|
||
WHERE mld_kenmerkopdr_verwijder IS NULL AND mld_opdr_key = lkey;
|
||
mld.setopdrachtstatus(lkey_new, 2,NULL);
|
||
|
||
WHEN 'bestelling'
|
||
THEN
|
||
SELECT MAX (bes_bestelling_key),
|
||
MAX (prs_perslid_key)
|
||
INTO lkey,
|
||
luserkey
|
||
FROM bes_bestelling
|
||
WHERE fac_activiteit_key = pactkey;
|
||
|
||
SELECT bes_s_bes_bestelling_key.nextval
|
||
INTO lkey_new
|
||
FROM DUAL;
|
||
|
||
-- Bestelling kopi<70>ren.
|
||
INSERT INTO bes_bestelling (
|
||
bes_bestelling_key,
|
||
bes_bestelling_module,
|
||
bes_bestelling_status,
|
||
bes_bestelling_datum,
|
||
prs_perslid_key,
|
||
prs_perslid_key_voor,
|
||
bes_bestelling_opmerking,
|
||
bes_bestelling_ordernr,
|
||
bes_bestelling_plaats,
|
||
mld_adres_key_lev,
|
||
bes_bestelling_item_cnt,
|
||
prs_kostenplaats_key,
|
||
bes_bestelling_leverdatum,
|
||
bes_bestelling_kosten_klant
|
||
)
|
||
SELECT lkey_new,
|
||
bes_bestelling_module,
|
||
bes_bestelling_status,
|
||
SYSDATE,
|
||
prs_perslid_key,
|
||
prs_perslid_key_voor,
|
||
'Automatisch gegenereerd door activiteit ' || pactkey || '. ' || bes_bestelling_opmerking,
|
||
bes_bestelling_ordernr,
|
||
bes_bestelling_plaats,
|
||
mld_adres_key_lev,
|
||
bes_bestelling_item_cnt,
|
||
prs_kostenplaats_key,
|
||
TRUNC (SYSDATE + (bes_bestelling_leverdatum - bes_bestelling_datum)),
|
||
bes_bestelling_kosten_klant
|
||
FROM bes_bestelling
|
||
WHERE bes_bestelling_key = lkey;
|
||
|
||
-- Kenmerken van bestelling kopi<70>ren.
|
||
INSERT INTO bes_kenmerkbestell
|
||
(bes_bestelling_key, bes_kenmerk_key, bes_kenmerkbestell_waarde)
|
||
SELECT lkey_new, bes_kenmerk_key, bes_kenmerkbestell_waarde
|
||
FROM bes_kenmerkbestell
|
||
WHERE bes_kenmerkbestell_verwijder IS NULL AND bes_bestelling_key = lkey;
|
||
|
||
-- Bestelregels kopi<70>ren.
|
||
INSERT INTO bes_bestelling_item (bes_bestelling_key,
|
||
bes_bestelling_item_aantal,
|
||
bes_bestelling_item_aantalontv,
|
||
bes_bestelling_item_brutoprijs,
|
||
bes_bestelling_item_prijs,
|
||
bes_srtdeel_key)
|
||
SELECT lkey_new,
|
||
bes_bestelling_item_aantal,
|
||
bes_bestelling_item_aantalontv,
|
||
bes.getsrtdeelprijsinfo(bi.bes_srtdeel_key, SYSDATE, 1),
|
||
bes.getsrtdeelprijsinfo(bi.bes_srtdeel_key, SYSDATE, 1),
|
||
bi.bes_srtdeel_key
|
||
FROM bes_bestelling_item bi, bes_srtdeel isd
|
||
WHERE bes_bestelling_key = lkey
|
||
AND isd.bes_srtdeel_key = bi.bes_srtdeel_key;
|
||
|
||
-- Kenmerken van bestelregels kopi<70>ren.
|
||
INSERT INTO bes_kenmerkbesteli (bes_bestelling_item_key,
|
||
bes_kenmerk_key,
|
||
bes_kenmerkbesteli_waarde,
|
||
bes_kenmerkbesteli_aanmaak)
|
||
SELECT tab1.bes_bestelling_item_key_new,
|
||
kbi.bes_kenmerk_key,
|
||
kbi.bes_kenmerkbesteli_waarde,
|
||
SYSDATE
|
||
FROM bes_kenmerkbesteli kbi,
|
||
(SELECT bi1.bes_bestelling_item_key bes_bestelling_item_key_new,
|
||
bi.bes_bestelling_item_key,
|
||
bi.bes_srtdeel_key
|
||
FROM bes_bestelling_item bi, bes_bestelling_item bi1
|
||
WHERE bi.bes_bestelling_key = lkey
|
||
AND bi1.bes_srtdeel_key = bi.bes_srtdeel_key
|
||
AND bi1.bes_bestelling_key = lkey_new) tab1
|
||
WHERE kbi.bes_bestelling_item_key = tab1.bes_bestelling_item_key
|
||
AND kbi.bes_bestelling_item_key IN (SELECT bes_bestelling_item_key
|
||
FROM bes_bestelling_item bi
|
||
WHERE bi.bes_bestelling_key = lkey);
|
||
|
||
-- Het gaat hier om een geplande actie. Je mag er van uit gaan dat deze goed gekeurd is voordat deze is aangemaakt.
|
||
-- Daarom bestellingstatus op 4 zetten (Geaccepteerd) en bestelopdracht automatisch aanmaken.
|
||
bes.setbestellingstatus(lkey_new, 4, luserkey); -- Geaccepteerd
|
||
bes.makeorders(luserkey, lkey_new); -- bes_makeorders notificeert zelf de leveranciers.
|
||
END CASE;
|
||
EXCEPTION
|
||
WHEN OTHERS
|
||
THEN
|
||
putsystemnotification ( 'Facilitor scheduler: opdracht voor activiteit '
|
||
|| pactkey
|
||
|| ' kan niet worden aangemaakt: '
|
||
|| SQLERRM,
|
||
3
|
||
);
|
||
END;
|
||
END;
|
||
|
||
PROCEDURE executeschedules
|
||
AS
|
||
newaantal NUMBER;
|
||
|
||
-- Interval in hrs, DATE arithmetics are in days, so we will have to divide interval by 24 hrs a day
|
||
CURSOR c1
|
||
IS
|
||
SELECT fac_activiteit_key, fac_activiteit_xmlnode, fac_activiteit_status_key, fac_activiteit_interval,
|
||
fac_activiteit_aantal
|
||
FROM fac_activiteit
|
||
WHERE ((fac_activiteit_volgende <= SYSDATE AND fac_activiteit_einddatum IS NULL)
|
||
OR (fac_activiteit_volgende <= SYSDATE AND SYSDATE < fac_activiteit_einddatum)
|
||
OR (fac_activiteit_volgende IS NULL AND SYSDATE BETWEEN fac_activiteit_eerste AND fac_activiteit_einddatum)
|
||
OR (fac_activiteit_volgende IS NULL AND fac_activiteit_einddatum IS NULL AND SYSDATE > fac_activiteit_eerste)
|
||
)
|
||
AND fac_activiteit_status_key IN (2, 3)
|
||
AND fac_activiteit_xmlnode IS NOT NULL
|
||
AND NVL (fac_activiteit_aantal, 1) > 0
|
||
AND fac_activiteit_verwijder IS NULL;
|
||
BEGIN
|
||
FOR rec1 IN c1
|
||
LOOP
|
||
-- Voer de job uit
|
||
IF rec1.fac_activiteit_aantal IS NOT NULL
|
||
THEN
|
||
newaantal := rec1.fac_activiteit_aantal - 1;
|
||
END IF;
|
||
|
||
IF rec1.fac_activiteit_status_key = 2
|
||
THEN
|
||
executeactiviteit (rec1.fac_activiteit_xmlnode, rec1.fac_activiteit_key);
|
||
|
||
-- Remove time-part from volgende (ie. set to 0:00)!
|
||
UPDATE fac_activiteit
|
||
SET fac_activiteit_volgende = TRUNC(COALESCE (fac_activiteit_volgende, fac_activiteit_eerste) + fac_activiteit_interval / 24),
|
||
fac_activiteit_laatste = SYSDATE,
|
||
fac_activiteit_aantal = newaantal
|
||
WHERE fac_activiteit_key = rec1.fac_activiteit_key;
|
||
ELSE
|
||
-- 1 keer overslaan, de volgende keer weer wel dus. Ook hier: remove time-part from volgende (ie. set to 0:00)!
|
||
UPDATE fac_activiteit
|
||
SET fac_activiteit_volgende = TRUNC(COALESCE (fac_activiteit_volgende, fac_activiteit_eerste) + fac_activiteit_interval / 24),
|
||
fac_activiteit_status_key = 2,
|
||
fac_activiteit_aantal = newaantal
|
||
WHERE fac_activiteit_key = rec1.fac_activiteit_key;
|
||
END IF;
|
||
END LOOP;
|
||
END;
|
||
|
||
-- MarkOrderAsSent
|
||
-- Markeert dat een opdracht verzonden is, zoals door PutOrders.exe
|
||
-- Hoe dat moet is afhankelijk van het soort opdracht: bestelopdracht, meldingsopdracht e.d.
|
||
-- pxmlnode is (lowercase!) de xml-naam van de entiteit (opdracht, bestelopdr)
|
||
-- pkey is de key daarvan
|
||
-- presult geeft het succes van de verzending aan: 0=succesvol, 1=geweigerd, 2=geeninhoudelijkrespons
|
||
-- wat gebruikt *kan* worden bij het bepalen van de status die gezet moet worden.
|
||
-- Schijnbaar is ook presult<0 nog mogelijk als er technisch wat mis ging. Die tracken we ook maar eens gewoon?
|
||
-- presulttext bevat (optioneel) de feedback van de leverancier (bijv. reden van afwijzing bestelopdracht)
|
||
-- Voor customer-orderqueues dient overeenkomstige CUST.markorderassent() te worden gedefinieerd.
|
||
-- Bij presult=2 weet je niet zeker wat de leverancier heeft gedaan, bij mail veronderstel je ontvangst, maar weet je
|
||
-- het niet zeker. Met 5.1.2 (UWVA#21074) is daarvoor de status 4 tussengevoegd
|
||
PROCEDURE markorderassent (pxmlnode VARCHAR2, pkey NUMBER, presult NUMBER, presulttext VARCHAR2)
|
||
AS
|
||
order_confirm prs_bedrijf.prs_bedrijf_order_confirm%TYPE;
|
||
BEGIN
|
||
CASE pxmlnode
|
||
WHEN 'opdracht'
|
||
THEN
|
||
IF presult = 0
|
||
THEN
|
||
UPDATE mld_opdr
|
||
SET mld_opdr_verzonden = SYSDATE
|
||
WHERE mld_opdr_key = pkey;
|
||
|
||
fac.trackaction ('ORDSNT', pkey, NULL, NULL, presulttext);
|
||
mld.setopdrachtstatus (pkey, 5, NULL);
|
||
ELSIF presult = 2
|
||
THEN
|
||
fac.trackaction ('ORDSNT', pkey, NULL, NULL, presulttext);
|
||
-- De leverancier heeft geen feedback gegeven, wat is het gedrag dan voor deze leverancier?
|
||
SELECT b.prs_bedrijf_order_confirm
|
||
INTO order_confirm
|
||
FROM prs_bedrijf b, mld_opdr o
|
||
WHERE b.prs_bedrijf_key = o.mld_uitvoerende_keys
|
||
AND o.mld_opdr_key = pkey;
|
||
|
||
-- NOTA BENE
|
||
-- Zo is deze nog prima compatible. Status 8 is in het huidige gebruik nog niet identiek, dus
|
||
-- daar wachten we nog even mee op een diepgaander design, vandaar if true.
|
||
IF TRUE OR order_confirm = 1
|
||
THEN
|
||
-- Er volgt later nog een expliciete bevestiging (5=Ter Bevestiging)
|
||
UPDATE mld_opdr
|
||
SET mld_opdr_verzonden = SYSDATE
|
||
WHERE mld_opdr_key = pkey;
|
||
mld.setopdrachtstatus (pkey, 5, NULL);
|
||
ELSE
|
||
UPDATE mld_opdr
|
||
SET mld_opdr_verzonden = SYSDATE
|
||
WHERE mld_opdr_key = pkey;
|
||
mld.setopdrachtstatus (pkey, 8, NULL);
|
||
END IF;
|
||
ELSIF presult < 0
|
||
THEN
|
||
-- just track, nothing changes really
|
||
fac.trackaction ('ORDSNX', pkey, NULL, NULL, presulttext);
|
||
END IF;
|
||
WHEN 'bestelopdr'
|
||
THEN
|
||
IF presult = 0
|
||
THEN
|
||
-- Succesvol
|
||
fac.trackaction ('BES2SN', pkey, NULL, NULL, presulttext);
|
||
bes.acceptopdracht(pkey, NULL, presulttext);
|
||
ELSIF presult = 1 -- (Logische) fout
|
||
THEN
|
||
fac.trackaction ('BES2SX', pkey, NULL, NULL, presulttext);
|
||
bes.rejectopdracht(pkey, NULL, presulttext);
|
||
ELSIF presult = 2
|
||
THEN
|
||
-- De leverancier heeft geen feedback gegeven, wat is het gedrag dan voor deze leverancier?
|
||
SELECT b.prs_bedrijf_order_confirm
|
||
INTO order_confirm
|
||
FROM prs_bedrijf b, bes_bestelopdr o
|
||
WHERE b.prs_bedrijf_key = o.prs_bedrijf_key
|
||
AND o.bes_bestelopdr_key = pkey;
|
||
fac.trackaction ('BES2SN', pkey, NULL, NULL, presulttext);
|
||
|
||
IF order_confirm = 1
|
||
THEN
|
||
-- Er volgt later nog een expliciete bevestiging (5=Ter Bevestiging)
|
||
UPDATE bes_bestelopdr
|
||
SET bes_bestelopdr_status = 5
|
||
WHERE bes_bestelopdr_key = pkey;
|
||
fac.trackaction ('BES2BE', pkey, NULL, NULL, presulttext);
|
||
ELSE
|
||
bes.acceptopdracht(pkey, NULL, presulttext);
|
||
END IF;
|
||
ELSIF presult < 0
|
||
THEN
|
||
-- just track, nothing changes really
|
||
fac.trackaction ('BES2SX', pkey, NULL, NULL, presulttext);
|
||
END IF;
|
||
END CASE;
|
||
END;
|
||
|
||
-- Returnt de geldende waarde voor setting pname, bepaald uit de settingstabel
|
||
-- en wetende welke omgeving we draaien (OTAP), default indien omgeving onbekend
|
||
FUNCTION getSetting (pname IN VARCHAR2 ) RETURN VARCHAR2
|
||
AS
|
||
lenv fac_version.fac_version_otap%TYPE;
|
||
lres fac_setting.fac_setting_default%TYPE;
|
||
BEGIN
|
||
SELECT COALESCE(fac_version_otap, 'P')
|
||
INTO lenv
|
||
FROM fac_version;
|
||
|
||
CASE lenv
|
||
WHEN 'P'
|
||
THEN
|
||
SELECT COALESCE(fac_setting_pvalue, fac_setting_default)
|
||
INTO lres
|
||
FROM fac_setting
|
||
WHERE fac_setting_name = pname;
|
||
WHEN 'A'
|
||
THEN
|
||
SELECT COALESCE(fac_setting_avalue, fac_setting_default)
|
||
INTO lres
|
||
FROM fac_setting
|
||
WHERE fac_setting_name = pname;
|
||
WHEN 'T'
|
||
THEN
|
||
SELECT COALESCE(fac_setting_tvalue, fac_setting_default)
|
||
INTO lres
|
||
FROM fac_setting
|
||
WHERE fac_setting_name = pname;
|
||
WHEN 'O'
|
||
THEN
|
||
SELECT COALESCE(fac_setting_ovalue, fac_setting_default)
|
||
INTO lres
|
||
FROM fac_setting
|
||
WHERE fac_setting_name = pname;
|
||
ELSE
|
||
SELECT fac_setting_default
|
||
INTO lres
|
||
FROM fac_setting
|
||
WHERE fac_setting_name = pname;
|
||
END CASE;
|
||
|
||
RETURN lres;
|
||
|
||
END;
|
||
|
||
-- add a trackrecord for action pcode, entity prefkey. pdatum may be NULL
|
||
-- Doet niets als er een onbekende pcode wordt meegegeven
|
||
-- We willen (blijkt) toch ook kunnen regelen dat een tracking per se NIET wordt genotificeerd
|
||
-- Dat doen we door pcode te prefixen met #. Deze wordt dan stiekem voor aan poms geplakt
|
||
-- (want anders kunnen we niet inserten) en de trigger op fac_tracking doet dan de rest.
|
||
PROCEDURE trackaction (pcode VARCHAR2, prefkey NUMBER, puserkey NUMBER, pdatum DATE, poms VARCHAR2)
|
||
AS
|
||
tkey fac_srtnotificatie.fac_srtnotificatie_key%TYPE;
|
||
loms fac_tracking.fac_tracking_oms%TYPE;
|
||
lcode VARCHAR2(10); -- tabelsize is 6
|
||
|
||
BEGIN
|
||
IF pcode IS NULL
|
||
THEN
|
||
RETURN;
|
||
END IF;
|
||
|
||
IF prefkey IS NULL
|
||
THEN
|
||
RETURN;
|
||
END IF;
|
||
|
||
lcode := pcode;
|
||
loms := poms;
|
||
|
||
IF SUBSTR(lcode,1,1) = '#'
|
||
THEN
|
||
lcode := SUBSTR(lcode, 2);
|
||
IF poms IS NULL
|
||
THEN
|
||
loms := '#';
|
||
ELSE
|
||
loms := '#' || loms;
|
||
END IF;
|
||
END IF;
|
||
|
||
SELECT fac_srtnotificatie_key
|
||
INTO tkey
|
||
FROM fac_srtnotificatie
|
||
WHERE fac_srtnotificatie_code = lcode;
|
||
|
||
IF pdatum IS NULL
|
||
THEN
|
||
INSERT INTO fac_tracking (fac_tracking_refkey, prs_perslid_key, fac_srtnotificatie_key, fac_tracking_oms
|
||
)
|
||
VALUES (prefkey, puserkey, tkey, loms
|
||
);
|
||
ELSE
|
||
INSERT INTO fac_tracking (fac_tracking_refkey, prs_perslid_key, fac_srtnotificatie_key, fac_tracking_datum, fac_tracking_oms
|
||
)
|
||
VALUES (prefkey, puserkey, tkey, pdatum, loms
|
||
);
|
||
END IF;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
NULL;
|
||
END;
|
||
|
||
-- Pas de datum van een tracking record aan
|
||
-- Userkey wordt nog genegeerd
|
||
PROCEDURE backtrackaction (pcode VARCHAR2,
|
||
prefkey NUMBER,
|
||
puserkey NUMBER,
|
||
pdatum DATE)
|
||
AS
|
||
tkey fac_srtnotificatie.fac_srtnotificatie_key%TYPE;
|
||
BEGIN
|
||
SELECT fac_srtnotificatie_key
|
||
INTO tkey
|
||
FROM fac_srtnotificatie
|
||
WHERE fac_srtnotificatie_code = pcode;
|
||
|
||
UPDATE fac_tracking
|
||
SET fac_tracking_datum = pdatum
|
||
WHERE fac_tracking_refkey = prefkey AND fac_srtnotificatie_key = tkey
|
||
AND fac_tracking_key =
|
||
(SELECT MAX (fac_tracking_key)
|
||
FROM fac_tracking T
|
||
WHERE t.fac_srtnotificatie_key = tkey
|
||
AND fac_tracking_refkey = prefkey);
|
||
END;
|
||
|
||
-- create a notification using only trackrecord parameters
|
||
-- Indeed, we could do this using only the fac_tracking_key, but we do not
|
||
-- if no ptracking_oms is given, we construct one!
|
||
-- Binnen deze procedure weten we nog net wat we doen
|
||
-- (nl. notificeren van een trackrecord van een bekende entiteit)
|
||
-- Een stap verder niet meer, dan is het gewoon een bericht met
|
||
-- een zender en ontvanger.
|
||
PROCEDURE notifytracking (psrtnotificatiekey NUMBER, pperslid_key NUMBER, ptracking_oms VARCHAR2, prefkey NUMBER)
|
||
AS
|
||
lxmlnode fac_srtnotificatie.fac_srtnotificatie_xmlnode%TYPE;
|
||
lcode fac_srtnotificatie.fac_srtnotificatie_code%TYPE;
|
||
lcode2 fac_srtnotificatie.fac_srtnotificatie_code%TYPE;
|
||
loms fac_srtnotificatie.fac_srtnotificatie_oms%TYPE;
|
||
bericht fac_srtnotificatie.fac_srtnotificatie_oms%TYPE;
|
||
lreceiver fac_notificatie.prs_perslid_key_receiver%TYPE;
|
||
lreceiver2 fac_notificatie.prs_perslid_key_receiver%TYPE;
|
||
lsender VARCHAR2 (255 CHAR);
|
||
lmld_stdmelding_key mld_stdmelding.mld_stdmelding_key%TYPE;
|
||
lnotify mld_disc_params.mld_disc_params_notify%TYPE;
|
||
lmnotify mld_stdmelding.mld_stdmelding_notify%TYPE;
|
||
lbonotify mld_disc_params.mld_disc_params_bonotify%TYPE;
|
||
luitvtype mld_v_uitvoerende.TYPE%TYPE;
|
||
lemail prs_bedrijf.prs_bedrijf_email%TYPE;
|
||
lphone prs_bedrijf.prs_bedrijf_telefoon2%TYPE;
|
||
lreskey res_rsv_ruimte.res_reservering_key%TYPE;
|
||
lres_ruimte_opstel_key res_rsv_ruimte.res_ruimte_opstel_key%TYPE;
|
||
lrefkey NUMBER (10);
|
||
lxrefkey res_rsv_ruimte.res_rsv_ruimte_key%TYPE;
|
||
lalg_ruimte_key res_rsv_ruimte.alg_ruimte_key%TYPE;
|
||
lalglocatiekey alg_locatie.alg_locatie_key%TYPE;
|
||
lmld_adres_key mld_adres.mld_adres_key%TYPE;
|
||
lprs_bedrijf_key prs_bedrijf.prs_bedrijf_key%TYPE;
|
||
BEGIN
|
||
-- Het gaat om een notificatie bij een entiteit prefkey,
|
||
-- waarvan het type alleen nog moet worden bepaald via
|
||
-- de srtnotificatie. Dan kan van het record van die
|
||
-- entiteit de ontvanger van de notificatie worden bepaald
|
||
-- (normaal de aanvrager) en wordt het bericht gequeueud.
|
||
-- De afzender is nu ook bekend (vroeger niet)
|
||
-- DIT VERVANGT (5I) ALLE NOTIFICATIETRIGGERS bij de verschillende
|
||
-- entiteiten (met uitzondering van opdrachtnotificatie naar buiten!?
|
||
IF psrtnotificatiekey IS NULL
|
||
THEN
|
||
RETURN;
|
||
END IF;
|
||
|
||
IF prefkey IS NULL
|
||
THEN
|
||
RETURN;
|
||
END IF;
|
||
|
||
lrefkey := prefkey; -- dan kunnen we bij reservering nog wijzigen
|
||
bericht := ptracking_oms; -- als die leeg is zoeken we zelf
|
||
|
||
-- welk type?
|
||
SELECT fac_srtnotificatie_xmlnode, fac_srtnotificatie_code, fac_srtnotificatie_oms
|
||
INTO lxmlnode, lcode, loms
|
||
FROM fac_srtnotificatie
|
||
WHERE fac_srtnotificatie_key = psrtnotificatiekey;
|
||
|
||
-- Bepaal de ontvanger enzo van dit bericht
|
||
CASE
|
||
WHEN lxmlnode='melding'
|
||
THEN
|
||
IF ptracking_oms IS NULL
|
||
THEN
|
||
bericht := mld.mldsprintf (loms, prefkey);
|
||
END IF;
|
||
|
||
-- basisgegevens, de ontvanger enzo
|
||
SELECT m.prs_perslid_key,
|
||
m.mld_stdmelding_key,
|
||
m.mld_adres_key,
|
||
m.mld_alg_locatie_key,
|
||
mld_disc_params_notify,
|
||
stdm.mld_stdmelding_notify,
|
||
d.ins_discipline_email,
|
||
mp.mld_disc_params_bonotify
|
||
INTO lreceiver,
|
||
lmld_stdmelding_key,
|
||
lmld_adres_key,
|
||
lalglocatiekey,
|
||
lnotify,
|
||
lmnotify,
|
||
lsender,
|
||
lbonotify
|
||
FROM mld_melding m, mld_stdmelding stdm, ins_tab_discipline d, mld_disc_params mp
|
||
WHERE stdm.mld_stdmelding_key = m.mld_stdmelding_key
|
||
AND d.ins_discipline_key = stdm.mld_ins_discipline_key
|
||
AND mp.mld_ins_discipline_key = d.ins_discipline_key
|
||
AND m.mld_melding_key = prefkey;
|
||
|
||
IF lbonotify = 1 -- wellicht nog: and lcode='MLDNEW'?
|
||
THEN
|
||
mld.notifybackoffice (prefkey);
|
||
END IF;
|
||
|
||
-- Deze notificatie gaat over een melding. Meldingen worden eventueel niet genotificeerd als
|
||
-- settings daartoe aanleiding geven. We weten genoeg om te checken of dat zo is
|
||
IF (lnotify = 0 OR (lnotify = 2 AND lmnotify = 0))
|
||
THEN
|
||
-- Nothing to do: disc says no OR disc says: see stdmelding and stdmelding says no
|
||
RETURN;
|
||
END IF;
|
||
|
||
IF lsender IS NULL
|
||
THEN
|
||
-- (kennelijk) is de verantwoordelijke voor van het afleveradres iets sterker of zo
|
||
IF lmld_adres_key IS NOT NULL
|
||
THEN
|
||
SELECT l1.alg_locatie_email
|
||
INTO lsender
|
||
FROM mld_adres ma, alg_locatie l1
|
||
WHERE ma.mld_adres_key = lmld_adres_key AND ma.alg_locatie_key = l1.alg_locatie_key(+);
|
||
END IF;
|
||
|
||
IF lsender IS NULL AND lalglocatiekey IS NOT NULL -- nog steeds onbekend
|
||
THEN
|
||
SELECT l2.alg_locatie_email
|
||
INTO lsender
|
||
FROM alg_locatie l2
|
||
WHERE l2.alg_locatie_key = lalglocatiekey;
|
||
END IF;
|
||
END IF;
|
||
WHEN lxmlnode='opdracht'
|
||
THEN
|
||
IF ptracking_oms IS NULL
|
||
THEN
|
||
bericht := mld.opdrsprintf (loms, prefkey);
|
||
END IF;
|
||
|
||
-- In 4i notificeerden we alleen toekenning aan de uitvoerder
|
||
-- In 5i tracken we veel meer, en is er dus ook de mogelijkheid
|
||
-- tot notificeren van tracking
|
||
-- Echter: wie houden we hiervan nou actief op de hoogte?
|
||
-- Dat wordt de interne contacpersoon van de opdracht
|
||
-- behalve ORDMLE/ORDMLI, die naar de uitvoerder
|
||
IF lcode IN ('ORDMLI', 'ORDMLE')
|
||
THEN
|
||
SELECT mld_uitvoerende_keys
|
||
INTO lreceiver
|
||
FROM mld_opdr
|
||
WHERE mld_opdr_key = prefkey;
|
||
|
||
SELECT u.TYPE
|
||
INTO luitvtype
|
||
FROM mld_v_uitvoerende u
|
||
WHERE u.mld_uitvoerende_key = lreceiver;
|
||
|
||
IF luitvtype = 'B'
|
||
THEN
|
||
-- Het gaat om een externe receiver
|
||
BEGIN
|
||
SELECT prs_bedrijf_email, prs_bedrijf_telefoon2
|
||
INTO lemail, lphone
|
||
FROM prs_bedrijf
|
||
WHERE prs_bedrijf_key = lreceiver;
|
||
|
||
-- Nooit op een portal voor externen
|
||
-- want dan zou iedereen die notificatie zien ivm lege receiver
|
||
-- dit overrulet dus iedere setting!
|
||
-- TODO smode := BITAND (smode, 255 - 1);
|
||
-- voorkom dat er een bericht wordt gestuurd
|
||
-- aan een perslid_key als deze bedrijf_key
|
||
lreceiver := NULL;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
RETURN;
|
||
END;
|
||
END IF;
|
||
ELSE
|
||
-- ons intern contactpersoon krijgt in alle andere gevallen het bericht
|
||
SELECT prs_perslid_key
|
||
INTO lreceiver
|
||
FROM mld_opdr
|
||
WHERE mld_opdr_key = prefkey;
|
||
END IF;
|
||
|
||
-- NOTE TO SELF:
|
||
-- Bij ORDMLI/ORDMLE en eigenlijk ook ORDGOE worden derden ingelicht,
|
||
-- bij ORDGOE tevens de opdrachtcontactpersoon, bij die andere twee niet
|
||
-- De mode (mail e.d.) van de notificatie bij dat event kan maar 1 waarde bevatten
|
||
-- Momenteel is dat
|
||
-- ORDMLI/ORDMLE: hoe ontvangt de uitvoerder dit bericht, contactpersoon krijgt niks
|
||
-- ORDGOE: hoe ontvangt de contactpersoon
|
||
-- ORD2GO: hoe ontvangt de uitvoerder dit bericht
|
||
|
||
-- Bij ORDGOE willen we *ook* de goedkeurder inlichten
|
||
IF lcode ='ORDGOE'
|
||
THEN
|
||
mld.notifyopdrgoedkeurder (prefkey);
|
||
END IF;
|
||
|
||
-- de afzender
|
||
BEGIN
|
||
SELECT ins_discipline_email
|
||
INTO lsender
|
||
FROM ins_tab_discipline d, mld_stdmelding sm, mld_melding m, mld_opdr o
|
||
WHERE d.ins_discipline_key = sm.mld_ins_discipline_key
|
||
AND sm.mld_stdmelding_key = m.mld_stdmelding_key
|
||
AND o.mld_melding_key = m.mld_melding_key
|
||
AND o.mld_opdr_key = prefkey;
|
||
|
||
IF lsender IS NULL
|
||
THEN
|
||
SELECT COALESCE (l1.alg_locatie_email, l2.alg_locatie_email)
|
||
INTO lsender
|
||
FROM mld_melding m, mld_adres ma, alg_locatie l1, alg_locatie l2, mld_opdr o
|
||
WHERE m.mld_adres_key = ma.mld_adres_key(+)
|
||
AND ma.alg_locatie_key = l1.alg_locatie_key(+)
|
||
AND m.mld_alg_locatie_key = l2.alg_locatie_key(+)
|
||
AND o.mld_melding_key = m.mld_melding_key
|
||
AND o.mld_opdr_key = prefkey;
|
||
END IF;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
NULL;
|
||
END;
|
||
WHEN lxmlnode='reservering' OR lxmlnode='xreservering'
|
||
THEN
|
||
IF ptracking_oms IS NULL
|
||
THEN
|
||
bericht := res.sprintf (loms, prefkey);
|
||
END IF;
|
||
|
||
BEGIN
|
||
SELECT res_rsv_ruimte_contact_key, res_ruimte_opstel_key, alg_ruimte_key, res_reservering_key
|
||
INTO lreceiver, lres_ruimte_opstel_key, lalg_ruimte_key, lreskey
|
||
FROM res_rsv_ruimte
|
||
WHERE res_rsv_ruimte_key = prefkey
|
||
AND res_rsv_ruimte_dirtlevel = 0;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
RETURN; -- Geen niet bestaande of dirty reserveringen notificeren
|
||
END;
|
||
|
||
-- de afzender, en moeten we wel?
|
||
lnotify := NULL;
|
||
BEGIN
|
||
-- Bepaal afzender, afhankelijk van catalogus (als res_ruimte) of anders de locatie
|
||
-- en check of er voor deze ruimtecatalogus uberhaupt moet worden genotificeerd
|
||
IF lres_ruimte_opstel_key IS NOT NULL
|
||
THEN
|
||
SELECT COALESCE (MAX (d.ins_discipline_email), MAX (l.alg_locatie_email)), MAX(res_disc_params_notify)
|
||
INTO lsender, lnotify
|
||
FROM res_ruimte_opstelling ro,
|
||
res_ruimte rr,
|
||
res_alg_ruimte rag,
|
||
alg_ruimte r,
|
||
alg_verdieping v,
|
||
alg_gebouw g,
|
||
alg_locatie l,
|
||
ins_tab_discipline d,
|
||
res_disc_params rdp
|
||
WHERE l.alg_locatie_key = g.alg_locatie_key
|
||
AND g.alg_gebouw_key = v.alg_gebouw_key
|
||
AND r.alg_verdieping_key = v.alg_verdieping_key
|
||
AND r.alg_ruimte_key = rag.alg_ruimte_key
|
||
AND rag.res_ruimte_key = rr.res_ruimte_key
|
||
AND d.ins_discipline_key = rr.res_discipline_key
|
||
AND rr.res_discipline_key = rdp.res_ins_discipline_key
|
||
AND rr.res_ruimte_key = ro.res_ruimte_key
|
||
AND ro.res_ruimte_opstel_key = lres_ruimte_opstel_key;
|
||
ELSIF lalg_ruimte_key IS NOT NULL
|
||
THEN
|
||
-- Een voorzieningenreservering kan uit meerdere catalogi items hebben,
|
||
-- maar wij maar 1 afzender.. Zwaarst geldt een cateringcatalogusafzender
|
||
SELECT MAX (d.ins_discipline_email)
|
||
INTO lsender
|
||
FROM ins_tab_discipline d, res_artikel a, res_rsv_artikel ra
|
||
WHERE d.ins_discipline_key = a.res_discipline_key
|
||
AND a.res_artikel_key = ra.res_artikel_key
|
||
AND ra.res_rsv_artikel_verwijder IS NULL
|
||
AND ra.res_rsv_ruimte_key = prefkey;
|
||
-- Als die er niet is, dan de voorzieningscatalogusafzender
|
||
IF lsender IS NULL
|
||
THEN
|
||
SELECT MAX (d.ins_discipline_email)
|
||
INTO lsender
|
||
FROM ins_tab_discipline d, res_deel r, res_rsv_deel rd
|
||
WHERE d.ins_discipline_key = r.res_discipline_key
|
||
AND r.res_deel_key = rd.res_deel_key
|
||
AND rd.res_rsv_deel_verwijder IS NULL
|
||
AND rd.res_rsv_ruimte_key = prefkey;
|
||
END IF;
|
||
-- Als die er niet is, dan de locatieafzender
|
||
IF lsender IS NULL
|
||
THEN
|
||
SELECT MAX (l.alg_locatie_email)
|
||
INTO lsender
|
||
FROM alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_locatie l
|
||
WHERE l.alg_locatie_key = g.alg_locatie_key
|
||
AND g.alg_gebouw_key = v.alg_gebouw_key
|
||
AND r.alg_verdieping_key = v.alg_verdieping_key
|
||
AND r.alg_ruimte_key = lalg_ruimte_key;
|
||
END IF;
|
||
ELSE
|
||
lsender := NULL;
|
||
END IF;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
lsender := NULL;
|
||
END;
|
||
-- Reserveringen worden eventueel niet genotificeerd als settings daartoe aanleiding geven.
|
||
-- We weten genoeg om te checken of dat zo is
|
||
IF (lnotify = 0)
|
||
THEN
|
||
-- Nothing to do: disc says no
|
||
RETURN;
|
||
END IF;
|
||
|
||
lxrefkey := lrefkey; -- de deelreservering
|
||
lrefkey := lreskey; -- de hoofdreservering
|
||
WHEN lxmlnode='bestelling'
|
||
THEN
|
||
IF ptracking_oms IS NULL
|
||
THEN
|
||
bericht := bes.bessprintf (loms, prefkey);
|
||
END IF;
|
||
|
||
SELECT prs_perslid_key, mld_adres_key_lev
|
||
INTO lreceiver, lmld_adres_key
|
||
FROM bes_bestelling
|
||
WHERE bes_bestelling_key = prefkey;
|
||
|
||
-- Bepaal de afzender
|
||
-- die komt van de (strikt: een) catalogus van de artikelen uit deze bestelling
|
||
-- of anders bepaald door de locatie van het afleveradres
|
||
BEGIN
|
||
-- Merk op dat tijdens insert nog niet bekend is welke items nog gaan worden toegevoegd
|
||
-- en dan is het dus niet mogelijk hier de catalogus te bepalen en te gebruiken
|
||
-- Tijdens update zou dat wel kunnen, maar de update wordt soms veroorzaakt door
|
||
-- een andere update, in het bijzonder makeorders(). Dat levert dan weer een
|
||
-- table is mutating error op. Dat betekent dus dat de notificatie eigenlijk dieper
|
||
-- moet worden gegenereerd, op bestelling-item. Dit valt nu buiten de scope van RWSN#14861
|
||
-- Met 5i kunnen we dit hier nu wel doen toch? Nee, ook niet!
|
||
-- SELECT MAX (ins_discipline_email)
|
||
-- INTO lsender
|
||
-- FROM ins_tab_discipline d, bes_bestelling_item bi, ins_srtdeel sd, ins_srtgroep sg
|
||
-- WHERE bi.ins_srtdeel_key = sd.ins_srtdeel_key
|
||
-- AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
|
||
-- AND sg.ins_discipline_key = d.ins_discipline_key
|
||
-- AND bi.bes_bestelling_key = prefkey;
|
||
|
||
IF lsender IS NULL
|
||
THEN
|
||
SELECT l.alg_locatie_email
|
||
INTO lsender
|
||
FROM mld_adres ma, alg_locatie l
|
||
WHERE lmld_adres_key = ma.mld_adres_key(+) AND ma.alg_locatie_key = l.alg_locatie_key(+);
|
||
END IF;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
lsender := NULL;
|
||
END;
|
||
WHEN lxmlnode='bestelopdr'
|
||
THEN
|
||
IF ptracking_oms IS NULL
|
||
THEN
|
||
bericht := bes.opdrsprintf (loms, prefkey);
|
||
END IF;
|
||
|
||
-- Wie ontvangt deze? (besteller/leverancier)
|
||
lreceiver := NULL;
|
||
lnotify := NULL; -- de leverancier
|
||
|
||
IF lcode IN ('BES2SN', 'BES2SX')
|
||
THEN
|
||
-- Ontvanger = misschien de besteller (afh. van catalogus)
|
||
-- Mochten er (technisch) meerdere zijn, pak er maar eentje
|
||
BEGIN
|
||
SELECT b.prs_perslid_key, b.prs_perslid_key_voor, b.mld_adres_key_lev,
|
||
p.prs_perslid_email, p.prs_perslid_telefoonnr,
|
||
bdp.bes_disc_params_noti_opdr
|
||
INTO lreceiver, lreceiver2, lmld_adres_key, lemail, lphone, lnotify
|
||
FROM prs_perslid p,
|
||
bes_bestelling b,
|
||
bes_bestelling_item bi,
|
||
bes_bestelopdr_item boi,
|
||
bes_srtdeel sd,
|
||
bes_srtgroep sg,
|
||
bes_disc_params bdp
|
||
WHERE p.prs_perslid_key = b.prs_perslid_key
|
||
AND bi.bes_bestelling_key = b.bes_bestelling_key
|
||
AND sd.bes_srtdeel_key = bi.bes_srtdeel_key
|
||
AND sg.bes_srtgroep_key = sd.bes_srtgroep_key
|
||
AND bdp.bes_ins_discipline_key = sg.ins_discipline_key
|
||
AND boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key
|
||
AND boi.bes_bestelopdr_key = prefkey
|
||
AND ROWNUM=1;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
RETURN;
|
||
END;
|
||
-- Geen dubbele sturen; ik zeg zelfs: de bestel_voor moet m.i. helemaal niet ingelicht worden?!
|
||
--IF (lreceiver2 = lreceiver)
|
||
--THEN
|
||
lreceiver2 := NULL;
|
||
--END IF;
|
||
END IF;
|
||
|
||
IF (lnotify != 1 OR lnotify IS NULL)
|
||
THEN
|
||
-- Ontvanger = leverancier, toch niet de besteller
|
||
lreceiver := NULL;
|
||
lreceiver2 := NULL;
|
||
|
||
SELECT prs_bedrijf_key
|
||
INTO lprs_bedrijf_key
|
||
FROM bes_bestelopdr
|
||
WHERE bes_bestelopdr_key = prefkey;
|
||
|
||
BEGIN
|
||
SELECT prs_bedrijf_email, prs_bedrijf_telefoon2
|
||
INTO lemail, lphone
|
||
FROM prs_bedrijf
|
||
WHERE prs_bedrijf_key = lprs_bedrijf_key;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
RETURN;
|
||
END;
|
||
END IF;
|
||
|
||
-- Afzender
|
||
BEGIN
|
||
SELECT MAX (ins_discipline_email)
|
||
INTO lsender
|
||
FROM ins_tab_discipline d,
|
||
bes_bestelling_item bi,
|
||
bes_srtdeel sd,
|
||
bes_srtgroep sg,
|
||
bes_bestelopdr_item boi
|
||
WHERE bi.bes_srtdeel_key = sd.bes_srtdeel_key
|
||
AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
|
||
AND sg.ins_discipline_key = d.ins_discipline_key
|
||
AND boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key
|
||
AND boi.bes_bestelopdr_key = prefkey;
|
||
|
||
IF lsender IS NULL
|
||
THEN
|
||
SELECT l.alg_locatie_email
|
||
INTO lsender
|
||
FROM mld_adres ma, alg_locatie l
|
||
WHERE lmld_adres_key = ma.mld_adres_key(+) AND ma.alg_locatie_key = l.alg_locatie_key(+);
|
||
END IF;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
NULL;
|
||
END;
|
||
WHEN lxmlnode='afspraak'
|
||
THEN
|
||
IF ptracking_oms IS NULL
|
||
THEN
|
||
bericht := bez.sprintf (loms, prefkey);
|
||
END IF;
|
||
|
||
SELECT bez_afspraak_contact_key, bez_afspraak_host_key, alg_locatie_key
|
||
INTO lreceiver, lreceiver2, lalglocatiekey
|
||
FROM bez_afspraak
|
||
WHERE bez_afspraak_key = prefkey;
|
||
|
||
-- We sturen soms TWEE notificaties, naar contact en host
|
||
-- De normale notificatie gaat naar de contact (UWVA#19008)
|
||
-- Moeten dus kijken of psrtnotificatiekey naar BEZDON of BEZOUT wijst
|
||
-- Dan moeten we ook BEZDO2 of BEZOU2 versturen naar de host.
|
||
IF lcode = 'BEZDON'
|
||
THEN
|
||
lcode2 := 'BEZDO2';
|
||
ELSIF lcode = 'BEZOUT'
|
||
THEN
|
||
lcode2 := 'BEZOU2';
|
||
END IF;
|
||
|
||
-- afzender
|
||
BEGIN
|
||
SELECT l.alg_locatie_email
|
||
INTO lsender
|
||
FROM alg_locatie l
|
||
WHERE l.alg_locatie_key = lalglocatiekey;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
lsender := NULL;
|
||
END;
|
||
WHEN lxmlnode='deel'
|
||
THEN
|
||
IF ptracking_oms IS NULL
|
||
THEN
|
||
bericht := ins.sprintf (loms, prefkey);
|
||
END IF;
|
||
|
||
-- Beheeracties notificeren we niet, zou niet weten naar wie.
|
||
IF lcode IN ('INSOUT', 'INSINN')
|
||
THEN
|
||
-- Bij uitlenen sturen we een notificatie naar de tijdelijke nieuwe eigenaar (UWVA#21528)
|
||
-- Bij innemen sturen we een notificatie naar de oorspronkelijke eigenaar (indien persoon; zeldzaam)
|
||
SELECT ins_alg_ruimte_key, ins_alg_locatie_key
|
||
INTO lreceiver, lalglocatiekey
|
||
FROM ins_deel
|
||
WHERE ins_alg_ruimte_type = 'P'
|
||
AND ins_deel_key = prefkey;
|
||
|
||
-- Afzender
|
||
BEGIN
|
||
SELECT MAX (ins_discipline_email)
|
||
INTO lsender
|
||
FROM ins_tab_discipline d,
|
||
ins_deel dl,
|
||
ins_srtdeel sd,
|
||
ins_srtgroep sg
|
||
WHERE dl.ins_srtdeel_key = sd.ins_srtdeel_key
|
||
AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
|
||
AND sg.ins_discipline_key = d.ins_discipline_key
|
||
AND dl.ins_deel_key = prefkey;
|
||
|
||
IF lsender IS NULL
|
||
THEN
|
||
SELECT l.alg_locatie_email
|
||
INTO lsender
|
||
FROM alg_locatie l
|
||
WHERE l.alg_locatie_key = lalglocatiekey;
|
||
END IF;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
NULL;
|
||
END;
|
||
END IF;
|
||
WHEN lxmlnode='message'
|
||
THEN
|
||
NULL; -- kan nog niet via tracking worden veroorzaakt (later: ontvangstbericht?)
|
||
ELSE
|
||
NULL; -- force error?
|
||
END CASE;
|
||
|
||
fac.putnotificationsrtprio (pperslid_key,
|
||
lreceiver,
|
||
lcode,
|
||
lrefkey,
|
||
bericht,
|
||
NULL,
|
||
lemail,
|
||
lphone,
|
||
lxrefkey,
|
||
2,
|
||
lsender
|
||
);
|
||
|
||
IF lcode2 IS NOT NULL AND lreceiver2 IS NOT NULL
|
||
THEN
|
||
fac.putnotificationsrtprio (pperslid_key,
|
||
lreceiver2,
|
||
lcode2,
|
||
lrefkey,
|
||
bericht,
|
||
NULL,
|
||
lemail,
|
||
lphone,
|
||
lxrefkey,
|
||
2,
|
||
lsender
|
||
);
|
||
END IF;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
NULL;
|
||
END;
|
||
|
||
-- Levert de (nieuwste) datum op van een getrackt event op key
|
||
-- bv de laatste wijzigingsdatum van melding 123 is gettrackingdate('MLDUPD', 123)
|
||
FUNCTION gettrackingdate (peventcode IN VARCHAR2, pkey IN number) RETURN date
|
||
AS
|
||
retdatum date := NULL;
|
||
BEGIN
|
||
IF peventcode IS NOT NULL AND pkey IS NOT NULL THEN
|
||
BEGIN
|
||
SELECT MAX(fac_tracking_datum)
|
||
INTO retdatum
|
||
FROM fac_tracking t, fac_srtnotificatie st
|
||
WHERE t.fac_srtnotificatie_key = st.fac_srtnotificatie_key
|
||
AND st.fac_srtnotificatie_code = peventcode
|
||
AND fac_tracking_refkey=pkey;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN NULL;
|
||
END;
|
||
END IF;
|
||
RETURN retdatum;
|
||
END;
|
||
|
||
-- Levert de (nieuwste) muteerder op van een getrackt event op key
|
||
-- bv de laatste wijziger van melding 123 is gettrackinguserkey('MLDUPD', 123)
|
||
FUNCTION gettrackinguserkey (peventcode IN VARCHAR2, pkey IN NUMBER)
|
||
RETURN NUMBER
|
||
AS
|
||
retkey fac_tracking.prs_perslid_key%TYPE := NULL;
|
||
BEGIN
|
||
BEGIN
|
||
SELECT prs_perslid_key
|
||
INTO retkey
|
||
FROM fac_tracking t, fac_srtnotificatie st
|
||
WHERE t.fac_srtnotificatie_key = st.fac_srtnotificatie_key
|
||
AND st.fac_srtnotificatie_code = peventcode
|
||
AND fac_tracking_refkey = pkey;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
NULL;
|
||
WHEN TOO_MANY_ROWS
|
||
THEN
|
||
-- Veronderstel dat de tracking meestal uniek is, daarom slechts in
|
||
-- uitzonderingsgevallen de nieuwste bepalen
|
||
SELECT prs_perslid_key
|
||
INTO retkey
|
||
FROM fac_tracking t, fac_srtnotificatie st
|
||
WHERE t.fac_srtnotificatie_key = st.fac_srtnotificatie_key
|
||
AND st.fac_srtnotificatie_code = peventcode
|
||
AND fac_tracking_refkey = pkey
|
||
AND fac_tracking_key =
|
||
(SELECT MAX (fac_tracking_key)
|
||
FROM fac_tracking t, fac_srtnotificatie st
|
||
WHERE t.fac_srtnotificatie_key = st.fac_srtnotificatie_key
|
||
AND st.fac_srtnotificatie_code = peventcode
|
||
AND fac_tracking_refkey = pkey);
|
||
END;
|
||
|
||
RETURN retkey;
|
||
END;
|
||
|
||
PROCEDURE initsession (flcode IN VARCHAR2)
|
||
AS
|
||
setsql VARCHAR2(200);
|
||
BEGIN
|
||
-- Initialiseert deze Oracle session met de vereiste parameters
|
||
-- De flcode (FACILITOR Language code) mag null zijn, dan wordt de databasedefault gebruikt
|
||
lcl.setuserlanguage(flcode);
|
||
setsql := 'ALTER SESSION SET '
|
||
|| ' NLS_NUMERIC_CHARACTERS = ''.,'''
|
||
|| ' NLS_SORT = ''BINARY'''
|
||
|| ' NLS_TERRITORY=''AMERICA''';
|
||
EXECUTE IMMEDIATE setsql;
|
||
END;
|
||
|
||
PROCEDURE registerversion (pmaj IN NUMBER, pmin IN NUMBER, ppatch IN VARCHAR2, pschema IN NUMBER, plang IN VARCHAR2)
|
||
AS
|
||
verstring fac_module.fac_module_version%TYPE;
|
||
revisionnr fac_version.fac_version_schema%TYPE;
|
||
BEGIN
|
||
IF pmaj IS NOT NULL AND pmin IS NOT NULL AND ppatch IS NOT NULL
|
||
THEN
|
||
verstring := TO_CHAR (pmaj) || '.' || TO_CHAR (pmin) || '.' || TO_CHAR (ppatch);
|
||
UPDATE fac_module
|
||
SET fac_module_version = verstring;
|
||
|
||
UPDATE fac_version
|
||
SET fac_version_major = pmaj,
|
||
fac_version_minor = pmin,
|
||
fac_version_patch = ppatch,
|
||
fac_version_schema = TO_CHAR(pschema),
|
||
fac_version_date = SYSDATE;
|
||
|
||
UPDATE fac_message
|
||
SET fac_message_text = 'Facilitor ' || verstring || 'DB' || TO_CHAR(pschema)
|
||
WHERE fac_message_code = 'FAC_M002';
|
||
END IF;
|
||
|
||
IF plang IS NOT NULL
|
||
THEN
|
||
UPDATE fac_version
|
||
SET fac_version_lang = plang;
|
||
END IF;
|
||
END;
|
||
|
||
PROCEDURE registercustversion (pcustid IN VARCHAR2, pcustnr IN NUMBER)
|
||
AS
|
||
BEGIN
|
||
IF pcustid IS NOT NULL AND pcustnr IS NOT NULL
|
||
THEN
|
||
UPDATE fac_version
|
||
SET fac_version_cust = pcustid,
|
||
fac_version_custnr = pcustnr,
|
||
fac_version_date = SYSDATE;
|
||
END IF;
|
||
END;
|
||
|
||
FUNCTION getdbversion RETURN VARCHAR2
|
||
AS
|
||
verstring VARCHAR2(100);
|
||
BEGIN
|
||
SELECT 'DB'||fac_version_schema||'/'||fac_version_cust||fac_version_custnr||'-'||COALESCE(fac_version_otap,'P*')
|
||
INTO verstring
|
||
FROM fac_version;
|
||
RETURN verstring;
|
||
END;
|
||
|
||
-- Slechts een synoniem meer
|
||
PROCEDURE systrackscript (n IN VARCHAR2, r IN VARCHAR2, force IN NUMBER)
|
||
AS
|
||
BEGIN
|
||
adm.systrackscript(n, r, force);
|
||
END;
|
||
|
||
-- Status: proven concept
|
||
PROCEDURE processemail (pfrom IN VARCHAR2,
|
||
pto IN VARCHAR2,
|
||
psubject IN VARCHAR2,
|
||
pbody IN VARCHAR2,
|
||
pextra IN VARCHAR2
|
||
)
|
||
AS
|
||
sender prs_perslid.prs_perslid_key%TYPE;
|
||
kostenplaats prs_afdeling.prs_kostenplaats_key%TYPE;
|
||
newkey mld_melding.mld_melding_key%TYPE;
|
||
defaultstdmelding fac_setting.fac_setting_default%TYPE;
|
||
kkey mld_kenmerk.mld_kenmerk_key%TYPE;
|
||
errormsg fac_result.fac_result_waarde%TYPE;
|
||
BEGIN
|
||
-- Valideer de sender in pfrom: kennen we deze?
|
||
SELECT prs_perslid_key, d.prs_kostenplaats_key
|
||
INTO sender, kostenplaats
|
||
FROM prs_perslid p, prs_afdeling d
|
||
WHERE p.prs_afdeling_key = d.prs_afdeling_key
|
||
AND UPPER (prs_perslid_email) = UPPER (pfrom);
|
||
|
||
CASE
|
||
WHEN UPPER (pto) LIKE 'SERVICEDESK@%'
|
||
THEN
|
||
defaultstdmelding := fac.getsetting ('defaultstdmelding');
|
||
|
||
-- suggested extensions:
|
||
-- check for MLDUSE-write autorisations
|
||
-- parse the subject to find an appropriate stdmelding, if uniquely possible
|
||
-- append (as a note?) to an existing melding if #key is found in the subject
|
||
BEGIN
|
||
INSERT INTO mld_melding (mld_melding_module,
|
||
mld_meldbron_key,
|
||
mld_melding_datum,
|
||
mld_melding_omschrijving,
|
||
mld_melding_status,
|
||
mld_melding_uitvoertijd,
|
||
mld_stdmelding_key,
|
||
prs_perslid_key,
|
||
prs_perslid_key_voor,
|
||
prs_kostenplaats_key,
|
||
mld_melding_spoed)
|
||
VALUES ('MLD',
|
||
4, -- email
|
||
SYSDATE,
|
||
SUBSTR (
|
||
psubject || CHR (13)
|
||
|| REPLACE (
|
||
pbody,
|
||
CHR (13) || CHR (10) || CHR (13) || CHR (10),
|
||
CHR (13) || CHR (10)),
|
||
1,
|
||
4000), -- verwijder onnodige witregels
|
||
NULL,
|
||
2,
|
||
defaultstdmelding,
|
||
sender,
|
||
sender,
|
||
kostenplaats,
|
||
3)
|
||
RETURNING mld_melding_key
|
||
INTO newkey;
|
||
|
||
-- find the lowest volgnummer of the flexfield of type folder.
|
||
SELECT MIN (mld_kenmerk_key)
|
||
INTO kkey
|
||
FROM mld_kenmerk k,
|
||
mld_srtkenmerk sk,
|
||
mld_stdmelding std,
|
||
ins_tab_discipline d
|
||
WHERE mld_srtkenmerk_kenmerktype = 'M'
|
||
AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
|
||
AND std.mld_stdmelding_key = defaultstdmelding
|
||
AND std.mld_ins_discipline_key = d.ins_discipline_key
|
||
AND ( (k.mld_stdmelding_key = std.mld_stdmelding_key
|
||
AND k.mld_kenmerk_niveau = 'S')
|
||
OR (k.mld_stdmelding_key = d.ins_discipline_key
|
||
AND k.mld_kenmerk_niveau = 'D')
|
||
OR (k.mld_stdmelding_key = d.ins_srtdiscipline_key
|
||
AND k.mld_kenmerk_niveau = 'T'))
|
||
AND k.mld_kenmerk_verwijder IS NULL
|
||
AND NOT EXISTS
|
||
(SELECT mld_kenmerk_volgnummer
|
||
FROM mld_kenmerk k1,
|
||
mld_srtkenmerk sk1,
|
||
mld_stdmelding std1,
|
||
ins_tab_discipline d1
|
||
WHERE sk1.mld_srtkenmerk_kenmerktype = 'M'
|
||
AND sk1.mld_srtkenmerk_key =
|
||
k1.mld_srtkenmerk_key
|
||
AND std1.mld_stdmelding_key =
|
||
defaultstdmelding
|
||
AND std1.mld_ins_discipline_key =
|
||
d1.ins_discipline_key
|
||
AND ( (k1.mld_stdmelding_key =
|
||
std1.mld_stdmelding_key
|
||
AND k1.mld_kenmerk_niveau = 'S')
|
||
OR (k1.mld_stdmelding_key =
|
||
d1.ins_discipline_key
|
||
AND k1.mld_kenmerk_niveau = 'D')
|
||
OR (k1.mld_stdmelding_key =
|
||
d1.ins_srtdiscipline_key
|
||
AND k1.mld_kenmerk_niveau = 'T'))
|
||
AND k1.mld_kenmerk_verwijder IS NULL
|
||
AND k1.mld_kenmerk_volgnummer >
|
||
k.mld_kenmerk_volgnummer);
|
||
|
||
IF kkey IS NOT NULL
|
||
THEN
|
||
INSERT INTO fac_result (fac_result_sessionid,
|
||
fac_result_naam,
|
||
fac_result_waarde)
|
||
VALUES ('hMailServer',
|
||
'kenmerkpath',
|
||
'MLD\M' || newkey || '\' || kkey || '\');
|
||
END IF;
|
||
|
||
mld.setmeldingstatus (newkey, 2, sender);
|
||
END;
|
||
ELSE
|
||
NULL;
|
||
END CASE;
|
||
|
||
IF errormsg IS NOT NULL
|
||
THEN
|
||
INSERT INTO fac_result (fac_result_sessionid,
|
||
fac_result_naam,
|
||
fac_result_waarde)
|
||
VALUES ('hMailServer', 'errormsg', errormsg);
|
||
END IF;
|
||
EXCEPTION
|
||
WHEN OTHERS
|
||
THEN
|
||
INSERT INTO fac_result (fac_result_sessionid,
|
||
fac_result_naam,
|
||
fac_result_waarde)
|
||
VALUES ('hMailServer',
|
||
'errormsg',
|
||
'Database fout - Neem contact op met uw systeembeheerder');
|
||
END;
|
||
|
||
|
||
END fac;
|
||
/
|
||
|
||
REGISTERRUN('$Workfile: FAC_PAC.SRC $','$Revision$')
|