Files
Database/FAC/FAC_PAC.SRC
Peter Feij 95c90fb5e1 FSN#18016-fix
svn path=/Database/trunk/; revision=10550
2010-12-17 09:10:48 +00:00

3213 lines
122 KiB
Plaintext

/* $Revision: 205 $
* $Modtime: 16-12-10 18:53 $
*/
/*
*
* 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 webfac AS
FUNCTION fac_f_usrrap_query (p_tabelnaam IN VARCHAR2) RETURN VARCHAR2;
FUNCTION fac_f_usrrap_orderby (p_tabelnaam IN VARCHAR2) RETURN VARCHAR2;
END webfac;
/
CREATE OR REPLACE PACKAGE BODY webfac AS
FUNCTION fac_f_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 fac_f_usrrap_query;
FUNCTION fac_f_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 fac_f_usrrap_orderby;
END webfac;
/
CREATE OR REPLACE FUNCTION FAC_F_FAC_GET_DESCRIPTION(LPNName IN VARCHAR2
,CondKey IN NUMBER
,Prefix IN VARCHAR2
,PrefixKey IN NUMBER) RETURN VARCHAR2 IS
NextVolgNr VARCHAR2(20);
DeelUpper ins_deel.ins_deel_omschrijving%TYPE;
ReturnString VARCHAR2(30);
BEGIN
-- From 4.40 on, CondKey is dummy for ins_deel (object/subobject): uniqueness is assumed over the entire database
IF LPNName = 'LPN_INS_DEEL'
THEN
SELECT NVL(LPAD( TO_CHAR(MAX(TO_NUMBER(SUBSTR(ins_deel_upper, LENGTH(Prefix)+1,LENGTH(ins_deel_upper)-LENGTH(Prefix))))+1) , MAX(LENGTH(ins_deel_upper)-LENGTH(Prefix)),'0'),'001')
INTO NextVolgNr
FROM INS_DEEL
WHERE ins_deel_upper LIKE Prefix||'%'
AND Fac.safe_to_number(SUBSTR(ins_deel_upper, LENGTH(Prefix)+1,LENGTH(ins_deel_upper)-LENGTH(Prefix))) IS NOT NULL
AND ins_deel_parent_key IS NULL
AND ins_deel_verwijder IS NULL;
ELSIF LPNName = 'LPN_INS_ONDERDEEL'
THEN
SELECT NVL(LPAD( TO_CHAR(MAX(TO_NUMBER(SUBSTR(ins_deel_upper, LENGTH(Prefix)+1,LENGTH(ins_deel_upper)-LENGTH(Prefix))))+1) , MAX(LENGTH(ins_deel_upper)-LENGTH(Prefix)),'0'),'001')
INTO NextVolgNr
FROM INS_DEEL
WHERE ins_deel_upper LIKE Prefix||'%'
AND Fac.safe_to_number(SUBSTR(ins_deel_upper, LENGTH(Prefix)+1,LENGTH(ins_deel_upper)-LENGTH(Prefix))) IS NOT NULL
AND ins_deel_parent_key = CondKey
AND ins_deel_verwijder IS NULL;
ELSIF LPNName = 'LPN_ALG_TERREINSECTOR'
THEN
FOR i IN 3..10
LOOP
SELECT NVL(TO_CHAR(MAX(TO_NUMBER(SUBSTR(alg_terreinsector_code,LENGTH(alg_terreinsector_code)-(i-1),LENGTH(alg_terreinsector_code)))+1)), '***')
INTO NextVolgNr
FROM alg_v_aanwezigterreinsector
WHERE LTRIM(SUBSTR(alg_terreinsector_code, LENGTH(alg_terreinsector_code)-(i-1), LENGTH(alg_terreinsector_code))) BETWEEN '0' AND LPAD('9',i,'9')
AND alg_locatie_key = CondKey
AND LENGTH(alg_terreinsector_code) <= i;
IF NextVolgNr = '***'
THEN
IF i = 3
THEN
NextVolgNr := '001';
ELSE
NextVolgNr := POWER(10, (i-1));
END IF;
EXIT;
ELSE
IF LENGTH(NextVolgNr) <= i
THEN
NextVolgNr:= LPAD(NextVolgNr,i,'0');
EXIT;
END IF;
END IF;
END LOOP;
ELSIF LPNName = 'LPN_ALG_GEBOUW'
THEN
FOR i IN 3..10
LOOP
SELECT NVL(TO_CHAR(MAX(TO_NUMBER(SUBSTR(alg_gebouw_code, LENGTH(alg_gebouw_code)-(i-1), LENGTH(alg_gebouw_code)))+1)), '***')
INTO NextVolgNr
FROM alg_v_aanweziggebouw
WHERE LTRIM(SUBSTR(alg_gebouw_code, LENGTH(alg_gebouw_code)-(i-1), LENGTH(alg_gebouw_code))) BETWEEN '0' AND LPAD('9',i,'9')
AND alg_locatie_key = CondKey
AND LENGTH(alg_gebouw_code) <= i;
IF NextVolgNr = '***'
THEN
IF i = 3
THEN
NextVolgNr := '001';
ELSE
NextVolgNr := POWER(10, (i-1));
END IF;
EXIT;
ELSE
IF LENGTH(NextVolgNr) <= i
THEN
NextVolgNr:= LPAD(NextVolgNr,i,'0');
EXIT;
END IF;
END IF;
END LOOP;
ELSIF LPNName = 'LPN_ALG_RUIMTE'
THEN
FOR i IN 3..10
LOOP
SELECT NVL(TO_CHAR(MAX(TO_NUMBER(SUBSTR(alg_ruimte_nr, LENGTH(alg_ruimte_nr)-(i-1), LENGTH(alg_ruimte_nr)))+1)), '***')
INTO NextVolgNr
FROM alg_v_aanwezigruimte
WHERE LTRIM(SUBSTR(alg_ruimte_nr, LENGTH(alg_ruimte_nr)-(i-1), LENGTH(alg_ruimte_nr))) BETWEEN '0' AND LPAD('9',i,'9')
AND alg_verdieping_key = CondKey
AND LENGTH(alg_ruimte_nr) <= i;
IF NextVolgNr = '***'
THEN
IF i = 3
THEN
NextVolgNr := '001';
ELSE
NextVolgNr := POWER(10, (i-1));
END IF;
EXIT;
ELSE
IF LENGTH(NextVolgNr) <= i
THEN
NextVolgNr:= LPAD(NextVolgNr,i,'0');
EXIT;
END IF;
END IF;
END LOOP;
ELSIF LPNName = 'LPN_PRS_WERKPLEK'
THEN
BEGIN
SELECT TO_CHAR(NVL(MAX(prs_werkplek_volgnr),0) +1)
INTO NextVolgNr
FROM prs_werkplek
WHERE prs_alg_ruimte_key = CondKey
AND prs_werkplek_verwijder IS NULL;
EXCEPTION
WHEN NO_DATA_FOUND
THEN NextVolgNr := '1';
END;
/* Omschrijving */
BEGIN
SELECT alg_ruimte_nr ||' - '|| NextVolgNr
INTO NextVolgNr
FROM alg_ruimte
WHERE alg_ruimte_key = CondKey;
EXCEPTION
WHEN OTHERS
THEN NULL;
END;
END IF;
ReturnString := Prefix||NextVolgNr;
RETURN ReturnString;
END;
/
CREATE OR REPLACE PACKAGE fac AS
FUNCTION addMonths (pdate1 IN DATE, padd_mon IN NUMBER) RETURN DATE;
FUNCTION safe_To_Number( str IN VARCHAR2 ) RETURN NUMBER;
FUNCTION safe_To_Date ( pchar IN VARCHAR2, pfmt IN VARCHAR2 ) RETURN DATE;
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;
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( pAppl IN VARCHAR2,
pRun IN VARCHAR2,
pLevel IN VARCHAR2,
pMsg IN VARCHAR2,
pHint IN VARCHAR2
);
FUNCTION imp_export_fac_rapport (
p_applname IN VARCHAR2,
p_applrun IN VARCHAR2,
p_filedir IN VARCHAR2,
p_filename IN VARCHAR2
) RETURN BOOLEAN;
PROCEDURE imp_alg_delete_onrgoed (p_applname IN VARCHAR2, p_applrun IN VARCHAR2, p_mode IN NUMBER);
PROCEDURE imp_prs_delete_organisatie (p_applname IN VARCHAR2, p_applrun IN VARCHAR2, p_mode IN NUMBER);
PROCEDURE imp_mld_delete_mld (p_applname IN VARCHAR2, p_applrun IN VARCHAR2, 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);
FUNCTION getSetting (pname IN VARCHAR2 ) RETURN VARCHAR2;
PROCEDURE trackaction (pcode VARCHAR2, prefkey NUMBER, puserkey NUMBER, pdatum DATE, poms VARCHAR2);
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 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);
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. 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 kenmerk_key en de waarde
(en vereist ook de module)
*/
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; // gauw klaar mee
ELSE
CASE module
WHEN 'ALG'
THEN
SELECT rsk.alg_refkenmerk_kolomnaam,
rsk.alg_refkenmerk_kolomtxt,
rsk.alg_refkenmerk_objectnaam,
rsk.fac_usrtab_key,
ut.fac_usrtab_view
INTO kolomnaam,
kolomtxt,
objectnaam,
tab_key,
ttype
FROM alg_refkenmerk rsk, alg_kenmerk sk, fac_usrtab ut
WHERE sk.alg_kenmerk_key = kkey
AND rsk.fac_usrtab_key = ut.fac_usrtab_key(+)
AND sk.alg_refkenmerk_key = rsk.alg_refkenmerk_key;
WHEN 'FIN'
THEN
SELECT rsk.fin_refkenmerk_kolomnaam,
rsk.fin_refkenmerk_kolomtxt,
rsk.fin_refkenmerk_objectnaam,
rsk.fac_usrtab_key,
ut.fac_usrtab_view
INTO kolomnaam,
kolomtxt,
objectnaam,
tab_key,
ttype
FROM fin_refkenmerk rsk, fin_kenmerk sk, fac_usrtab ut
WHERE sk.fin_kenmerk_key = kkey
AND rsk.fac_usrtab_key = ut.fac_usrtab_key(+)
AND sk.fin_refkenmerk_key = rsk.fin_refkenmerk_key;
WHEN 'INS'
THEN
SELECT rsk.ins_refsrtkenmerk_kolomnaam,
rsk.ins_refsrtkenmerk_kolomtxt,
rsk.ins_refsrtkenmerk_objectnaam,
rsk.fac_usrtab_key,
ut.fac_usrtab_view
INTO kolomnaam,
kolomtxt,
objectnaam,
tab_key,
ttype
FROM ins_refsrtkenmerk rsk, ins_srtkenmerk sk, fac_usrtab ut
WHERE sk.ins_srtkenmerk_key = kkey
AND rsk.fac_usrtab_key = ut.fac_usrtab_key(+)
AND sk.ins_refsrtkenmerk_key = rsk.ins_refsrtkenmerk_key;
WHEN 'MLD'
THEN
SELECT rsk.mld_refsrtkenmerk_kolomnaam,
rsk.mld_refsrtkenmerk_kolomtxt,
rsk.mld_refsrtkenmerk_objectnaam,
rsk.fac_usrtab_key,
ut.fac_usrtab_view
INTO kolomnaam,
kolomtxt,
objectnaam,
tab_key,
ttype
FROM mld_refsrtkenmerk rsk, mld_srtkenmerk sk, fac_usrtab ut
WHERE sk.mld_srtkenmerk_key = kkey
AND rsk.fac_usrtab_key = ut.fac_usrtab_key(+)
AND sk.mld_refsrtkenmerk_key = rsk.mld_refsrtkenmerk_key;
WHEN 'PRS'
THEN
SELECT rsk.prs_refkenmerk_kolomnaam,
rsk.prs_refkenmerk_kolomtxt,
rsk.prs_refkenmerk_objectnaam,
rsk.fac_usrtab_key,
ut.fac_usrtab_view
INTO kolomnaam,
kolomtxt,
objectnaam,
tab_key,
ttype
FROM prs_refkenmerk rsk, prs_kenmerk sk, fac_usrtab ut
WHERE sk.prs_kenmerk_key = kkey
AND rsk.fac_usrtab_key = ut.fac_usrtab_key(+)
AND sk.prs_refkenmerk_key = rsk.prs_refkenmerk_key;
WHEN 'RES'
THEN
SELECT rsk.res_refsrtkenmerk_kolomnaam,
rsk.res_refsrtkenmerk_kolomtxt,
rsk.res_refsrtkenmerk_objectnaam,
rsk.fac_usrtab_key,
ut.fac_usrtab_view
INTO kolomnaam,
kolomtxt,
objectnaam,
tab_key,
ttype
FROM res_refsrtkenmerk rsk, res_srtkenmerk sk, fac_usrtab ut
WHERE sk.res_srtkenmerk_key = kkey
AND rsk.fac_usrtab_key = ut.fac_usrtab_key(+)
AND sk.res_refsrtkenmerk_key = rsk.res_refsrtkenmerk_key;
WHEN 'BES'
THEN
SELECT rsk.bes_refsrtkenmerk_kolomnaam,
rsk.bes_refsrtkenmerk_kolomtxt,
rsk.bes_refsrtkenmerk_objectnaam,
rsk.fac_usrtab_key,
ut.fac_usrtab_view
INTO kolomnaam,
kolomtxt,
objectnaam,
tab_key,
ttype
FROM bes_refsrtkenmerk rsk, bes_srtkenmerk sk, fac_usrtab ut
WHERE sk.bes_srtkenmerk_key = kkey
AND rsk.fac_usrtab_key = ut.fac_usrtab_key(+)
AND sk.bes_refsrtkenmerk_key = rsk.bes_refsrtkenmerk_key;
WHEN 'CNT'
THEN
SELECT rsk.cnt_refsrtkenmerk_kolomnaam,
rsk.cnt_refsrtkenmerk_kolomtxt,
rsk.cnt_refsrtkenmerk_objectnaam,
rsk.fac_usrtab_key,
ut.fac_usrtab_view
INTO kolomnaam,
kolomtxt,
objectnaam,
tab_key,
ttype
FROM cnt_refsrtkenmerk rsk, cnt_srtkenmerk sk, fac_usrtab ut
WHERE sk.cnt_srtkenmerk_key = kkey
AND rsk.fac_usrtab_key = ut.fac_usrtab_key(+)
AND sk.cnt_refsrtkenmerk_key = rsk.cnt_refsrtkenmerk_key;
WHEN 'BEZ'
THEN
SELECT rsk.bez_refkenmerk_kolomnaam,
rsk.bez_refkenmerk_kolomtxt,
rsk.bez_refkenmerk_objectnaam,
rsk.fac_usrtab_key,
ut.fac_usrtab_view
INTO kolomnaam,
kolomtxt,
objectnaam,
tab_key,ttype
FROM bez_refkenmerk rsk, bez_kenmerk sk, fac_usrtab ut
WHERE sk.bez_kenmerk_key = kkey
AND rsk.fac_usrtab_key = ut.fac_usrtab_key (+)
AND sk.bez_refkenmerk_key = rsk.bez_refkenmerk_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)
RETURN NULL;
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).
*/
FUNCTION datumtijdplusuitvoertijd (begindatum IN DATE, uitvoertijd IN NUMBER, uitvoertijdtype IN VARCHAR2)
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);
newuitvoertijd NUMBER (5, 2);
beginwerknr NUMBER (5, 2);
eindewerknr NUMBER (5, 2);
werkurennr NUMBER (5, 2);
beginuurnr NUMBER (5, 2);
uitvoernr NUMBER (5, 2);
einduurnr NUMBER (5, 2);
newuitvoernr NUMBER (5, 2);
returnval DATE;
eikdag NUMBER;
BeginWerkUur NUMBER(4,2):= fac.safe_to_number (fac.getsetting ('fac_t_startofworkday'));
EindWerkUur NUMBER(4,2):= fac.safe_to_number (fac.getsetting ('fac_t_endofworkday'));
BEGIN
--veronderstelt NLS_TERRITORY='AMERICA'
IF uitvoertijd IS NOT NULL AND begindatum IS NOT NULL AND uitvoertijdtype = 'DAGEN'
THEN
-- 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)
RETURN NULL;
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
/*
** Zet eerst alle tijden om in decimalen. Hiermee kan dan normaal gerekend worden
** zonder dat er rekening moet worden gehouden dat 60 minuten weer een uur is.
*/
/* FSN#495: TO_NUMBER gebruikt NLS-Setting. Forceer '.' */
BeginUur := TO_NUMBER(DATE_TO_CHAR(BeginDatum, 'HH24.MI'), '9999D99', 'nls_numeric_characters = ''.,''');
BeginWerkNr := TRUNC(BeginWerkUur) + (BeginWerkUur - TRUNC(BeginWerkUur))/0.6;
EindeWerkNr := TRUNC(EindWerkUur) + (EindWerkUur - TRUNC(EindWerkUur ))/0.6;
BeginUurNr := TRUNC(BeginUur) + (BeginUur - TRUNC(BeginUur ))/0.6;
UitvoerNr := TRUNC(UitvoerTijd) + (UitvoerTijd - TRUNC(UitvoerTijd ))/0.6;
WerkUrenNr := EindeWerkNr - BeginWerkNr;
EindUurNr := BeginUurNr + UitvoerNr;
AantalDagen := 0;
--
IF EindUurNr > EindeWerkNr
THEN
AantalDagen := TRUNC(EindUurNr / WerkUrenNr);
EindUurNr := EindUurNr - AantalDagen * WerkUrenNr;
END IF;
EindUur := TRUNC(EindUurNr) + (EindUurNr - TRUNC(EindUurNr))*0.6;
/*
** Bij de onderstaande omzetting van decimaal naar datum kan de foutmelding
** "ORA-01850: hour must be between 0 and 23" optreden. Onderzoek dan of de
** initialisatie-procedure SetWerkTijden(..,..) wel wordt aangeroepen in een
** PL/SQL-blok (van form of script) voordat de functie DatumTijdPlusUitvoerTijd
** wordt aangeroepen (bijvoorbeeld in view mld_v_mld_openmelding).
**
** 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 := TO_DATE(DATE_TO_CHAR(TRUNC(BeginDatum), 'DD-MM-YYYY')||' '
|| NUMBER_TO_CHAR(EindUur, '09.99'), 'DD-MM-YYYY HH24.MI');
IF AantalDagen > 0
THEN
ReturnVal := DatumTijdPlusUitvoerTijd(OldDatumGereed, AantalDagen, 'DAGEN');
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;
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);
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, p_field);
l_nr := l_nr -1;
END LOOP;
-- Trimmen met die hap!
p_field:=TRIM(p_field);
END;
PROCEDURE imp_writelog (
pappl IN VARCHAR2,
prun IN VARCHAR2,
plevel IN VARCHAR2,
pmsg IN VARCHAR2,
phint IN VARCHAR2
)
AS
BEGIN
INSERT INTO imp_log
(imp_log_applicatie, imp_log_run, imp_log_datum,
imp_log_status, imp_log_omschrijving, imp_log_hint
)
VALUES (pappl, prun, SYSDATE,
plevel, pmsg, phint
);
END;
FUNCTION imp_export_fac_rapport (
p_applname IN VARCHAR2,
p_applrun IN VARCHAR2,
p_filedir IN VARCHAR2,
p_filename IN VARCHAR2
) RETURN BOOLEAN
AS
v_filehandle UTL_FILE.file_type;
v_newline VARCHAR2 (1000);
v_errormsg VARCHAR (200);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
l_cnt NUMBER;
CURSOR cregels
IS
SELECT FAC_RAPPORT_REGEL regel
FROM FAC_RAPPORT
WHERE FAC_RAPPORT_NODE=userenv('SESSIONID')
ORDER BY FAC_RAPPORT_VOLGNR;
BEGIN
v_filehandle := UTL_FILE.fopen (p_filedir, p_filename, 'w');
fac.imp_writelog (p_applname,
p_applrun,
'I',
'Export naar ' || p_filedir || '/' || p_filename,
''
);
l_cnt := 0;
FOR rcregels IN cregels
LOOP
BEGIN
v_newline := rcregels.regel;
UTL_FILE.put_line (v_filehandle, v_newline);
l_cnt := l_cnt + 1;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
UTL_FILE.fclose (v_filehandle);
-- EOF reached
EXIT;
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg := '(ORACLE error ' || oracle_err_num || '/' || oracle_err_mes || ')';
fac.imp_writelog (p_applname, p_applrun, 'E', v_errormsg, '');
END;
END LOOP;
fac.imp_writelog (p_applname, p_applrun, 'I', 'Aantal geschreven records: ' || l_cnt, '');
RETURN TRUE;
EXCEPTION
WHEN UTL_FILE.invalid_operation
THEN
UTL_FILE.fclose (v_filehandle);
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg :=
'UTL_FILE.INVALID_OPERATION (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
fac.imp_writelog (p_applname,
p_applrun,
'E',
v_errormsg,
'Controleer bestandsnaam van exportbestand'
);
RETURN FALSE;
WHEN UTL_FILE.invalid_filehandle
THEN
UTL_FILE.fclose (v_filehandle);
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg :=
'UTL_FILE.INVALID_FILEHANDLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
fac.imp_writelog (p_applname, p_applrun, 'E', v_errormsg, '');
RETURN FALSE;
WHEN UTL_FILE.invalid_path
THEN
UTL_FILE.fclose (v_filehandle);
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg :=
'UTL_FILE.INVALID_PATH (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
fac.imp_writelog
(p_applname,
p_applrun,
'E',
v_errormsg,
'Controleer directory van importbestand (init.ora bevat utl_file_dir setting om te beschrijven welke directories te gebruiken zijn'
);
RETURN FALSE;
WHEN UTL_FILE.read_error
THEN
UTL_FILE.fclose (v_filehandle);
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg :=
'UTL_FILE.READ_ERROR (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
fac.imp_writelog (p_applname, p_applrun, 'E', v_errormsg, '');
RETURN FALSE;
WHEN OTHERS
THEN
UTL_FILE.fclose (v_filehandle);
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
fac.imp_writelog (p_applname, p_applrun, 'E', v_errormsg, '');
RETURN FALSE;
END;
PROCEDURE imp_alg_delete_onrgoed (p_applname IN VARCHAR2, p_applrun IN VARCHAR2, 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_applname, p_applrun, 'E', v_errormsg, v_errorhint);
COMMIT;
END;
PROCEDURE imp_prs_delete_organisatie (p_applname IN VARCHAR2, p_applrun IN VARCHAR2, 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_wachtwoord,
prs_perslid_dienstverband,
prs_perslid_ingangsdatum,
prs_perslid_login
)
VALUES ('PRS',
v_srtperslid_key,
v_afdeling_key,
'Gast',
'_GAST',
'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_wachtwoord,
prs_perslid_dienstverband,
prs_perslid_ingangsdatum,
prs_perslid_login
)
VALUES ('PRS',
v_srtperslid_key,
v_afdeling_key,
'Facilitor',
'_FACILITOR',
'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_applname, p_applrun, 'E', v_errormsg, v_errorhint);
COMMIT;
END;
PROCEDURE imp_mld_delete_mld (p_applname IN VARCHAR2, p_applrun IN VARCHAR2, 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_applname, p_applrun, '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;
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;
-- 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 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
)
VALUES (NULL, lmode, pfrom, pto,
lemail, lphone, SUBSTR(pmessage, 1, 2048),
NULL, pprio, llang
);
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 strnotificatie
-- 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 prs_perslid.prs_perslid_email%TYPE;
lphone prs_perslid.prs_perslid_mobiel%TYPE;
llang prs_perslid.prs_perslid_lang%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;
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 van RESUPD als de RESNEW nog niet eens de deur uit is door Putorders
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 = 'RESUPD'
AND ander.fac_srtnotificatie_code IN ('RESUPD', 'RESNEW')
OR pcode = 'MLDUPD'
AND ander.fac_srtnotificatie_code IN
('MLDUPD', '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;
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)
VALUES (skey,
lmode,
pfrom,
pto,
lemail,
lphone,
soms,
pref,
pxref,
pprio,
psender,
llang);
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_new 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_ins_discipline_key, 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_ins_discipline_key, 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)
INTO lkey
FROM mld_opdr
WHERE fac_activiteit_key = pactkey;
SELECT mld.bepaalopdrmeldingvolgnr (lkey)
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)
INTO lkey
FROM bes_bestelling
WHERE fac_activiteit_key = pactkey;
SELECT bes_s_bes_bestelling_key.nextval
INTO lkey_new
FROM DUAL;
INSERT INTO bes_bestelling (
bes_bestelling_key,
bes_bestelling_module,
bes_bestelling_status,
bes_bestelling_datum,
prs_perslid_key,
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,
'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;
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;
bes.setbestellingstatus(lkey_new, 2, NULL);
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
-- wat gebruikt *kan* worden bij het bepalen van de status die gezet moet worden.
-- Voor customer-orderqueues dient overeenkomstige CUST.markorderassent() te worden gedefinieerd.
PROCEDURE markorderassent(pxmlnode VARCHAR2, pkey NUMBER, presult NUMBER)
AS
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, NULL);
END IF;
WHEN 'bestelopdr'
THEN
IF presult = 0
THEN
UPDATE bes_bestelopdr
SET bes_bestelopdr_status = 4
WHERE bes_bestelopdr_key = pkey;
fac.trackaction('BES2SN', pkey, NULL, NULL, NULL);
ELSIF presult = 1
THEN
UPDATE bes_bestelopdr
SET bes_bestelopdr_status = 1
WHERE bes_bestelopdr_key = pkey;
fac.trackaction('BES2SX', pkey, NULL, NULL, NULL);
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 fac_version_otap
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;
-- 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 contactpersoon krijgt het bericht
SELECT prs_perslid_key
INTO lreceiver
FROM mld_opdr
WHERE mld_opdr_key = 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? Nu gaat-ie naar de leverancier trouwens
lreceiver := 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;
BEGIN
SELECT MAX (ins_discipline_email)
INTO lsender
FROM ins_tab_discipline d,
bes_bestelling_item bi,
ins_srtdeel sd,
ins_srtgroep sg,
bes_bestelopdr_item boi
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 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='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 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;
END fac;
/
REGISTERRUN('$Workfile: FAC_PAC.SRC $','$Revision: 205 $')