Files
Customer/ZLMV/ZLMV.sql
Jos Groot Lipman 8957bdb3df FCLT#80823 Aanroep van fac_import_genericcsv (p_import_key); is niet meer nodig
svn path=/Customer/trunk/; revision=65968
2024-08-21 08:46:15 +00:00

539 lines
21 KiB
SQL

--
-- $Id$
--
-- Script containing customer specific sql statements for the FACILITOR database
--
--
--
--
--
DEFINE thisfile = 'ZLMV.SQL'
DEFINE dbuser = 'ZLMV'
SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
COLUMN fcltcusttxt NEW_VALUE fcltcusttxt NOPRINT;
WHENEVER SQLERROR CONTINUE;
SELECT adm.getscriptspoolfile('&thisfile') AS fcltlogfile FROM DUAL;
SPOOL &fcltlogfile
WHENEVER SQLERROR EXIT;
SELECT adm.checkscriptcust('&dbuser') AS fcltcusttxt FROM DUAL;
WHENEVER SQLERROR CONTINUE;
---------------------------------------
PROMPT &fcltcusttxt
---------------------------------------
SET DEFINE OFF
------ payload begin ------
CREATE OR REPLACE PACKAGE ZLMV
AS
PROCEDURE inactivate_prs;
PROCEDURE anonimiseer_bezoeker;
END;
/
CREATE OR REPLACE PACKAGE BODY ZLMV
AS
PROCEDURE inactivate_prs
AS
v_errormsg VARCHAR2 (1000);
v_errorhint VARCHAR2 (1000);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_count NUMBER (10);
v_perslid_naam VARCHAR (100);
v_perslid_nr VARCHAR (30);
--- Als een persoon 12 maanden niet meer heeft ingelogd verwijderen we deze
CURSOR prs_del IS
SELECT p.prs_perslid_key, p.prs_perslid_oslogin
FROM prs_v_aanwezigperslid p
WHERE p.prs_perslid_login <
TRUNC (ADD_MONTHS (SYSDATE, -6), 'mm')
GROUP BY p.prs_perslid_key, p.prs_perslid_oslogin;
BEGIN
FOR rec IN prs_del
LOOP
BEGIN
v_errormsg := 'Verwijderen van de persoon is NIET gelukt';
v_errorhint :=
'Heeft de persoon met prs_perslid_key '
|| TO_CHAR (rec.prs_perslid_key)
|| ' historie?';
SELECT prs_perslid_naam_full, prs_perslid_nr
INTO v_perslid_naam, v_perslid_nr
FROM prs_perslid p, prs_v_perslid_fullnames pf
WHERE p.prs_perslid_key = pf.prs_perslid_key
AND p.prs_perslid_key = rec.prs_perslid_key;
-- *** Budgethouderschap ***
-- Voor hoeveel kostenplaatsen is deze persoon budgethouder?
SELECT COUNT (*)
INTO v_count
FROM prs_kostenplaats
WHERE prs_perslid_key = rec.prs_perslid_key;
IF (v_count > 0)
THEN
UPDATE prs_kostenplaats
SET prs_perslid_key = NULL
WHERE prs_perslid_key = rec.prs_perslid_key;
fac.writelog (
'inact_prs',
'I',
'Budgethouderschap van te verwijderen persoon ('
|| v_count
|| ' stuks) vervallen.',
'Naam/persoonsnr: '
|| v_perslid_naam
|| '/'
|| v_perslid_nr);
END IF;
-- *** Vervangers ***
-- koppelingen met vervangers dienen ook verwijderd te worden
SELECT COUNT (*)
INTO v_count
FROM prs_collega
WHERE prs_perslid_key = rec.prs_perslid_key
OR prs_perslid_key_alt = rec.prs_perslid_key;
IF (v_count > 0)
THEN
DELETE FROM prs_collega
WHERE prs_perslid_key = rec.prs_perslid_key
OR prs_perslid_key_alt = rec.prs_perslid_key;
fac.writelog (
'inact_prs',
'I',
'Te verwijderen persoon heeft vervanger(s). Koppeling(en) verwijderd.',
'Naam/persoonsnr: '
|| v_perslid_naam
|| '/'
|| v_perslid_nr);
END IF;
-- *** werkplekken ***
DELETE prs_perslidwerkplek
WHERE prs_perslid_key = rec.prs_perslid_key;
-- *** Verplichtingen ***
SELECT COUNT (*)
INTO v_count
FROM prs_v_verplichting_refcheck vp
WHERE vp.prs_perslid_key = rec.prs_perslid_key;
IF v_count = 0
THEN
-- Persoon heeft geen enkele (actuele of historische) verplichting
v_errorhint :=
'Verwijderen van persoon met key '
|| TO_CHAR (rec.prs_perslid_key);
-- Referenties in tabellen naar deze pers_perslid_key moeten eerst verwijderd worden.
-- Door cascade verwijderen van deze record onstaan audits op die tabellen die audit tracking hebben.
-- Daardoor onstaan "ORxA-04091:table VLKC.FAC_AUDIT is mutating, trigger/function may not see it" foutmeldingen
-- op de delete van de prs_perslid_key uit de prs_perslid tabel.
-- De tabellen prs_kostenplaats, prs_kostenplaatsgrp, prs_perslidkostenplaats en fac_gebruikersgroep hebben een prs_perslid_key referentie en audit tracking.
DELETE FROM prs_kostenplaats
WHERE prs_perslid_key = rec.prs_perslid_key;
DELETE FROM prs_kostenplaatsgrp
WHERE prs_perslid_key = rec.prs_perslid_key;
DELETE FROM prs_perslidkostenplaats
WHERE prs_perslid_key = rec.prs_perslid_key;
DELETE FROM fac_gebruikersgroep
WHERE prs_perslid_key = rec.prs_perslid_key;
DELETE FROM prs_perslid
WHERE prs_perslid_key = rec.prs_perslid_key;
fac.writelog (
'inact_prs',
'I',
'Persoon verwijderd.',
'Achternaam/persoonsnr: '
|| v_perslid_naam
|| '/'
|| v_perslid_nr);
ELSE
-- Controleer of er ACTUELE verplichtingen zijn
SELECT COUNT (*)
INTO v_count
FROM prs_v_verplichting_keys vp
WHERE vp.prs_perslid_key = rec.prs_perslid_key;
IF v_count > 0
THEN
UPDATE prs_perslid
SET prs_perslid_naam =
SUBSTR ('INACTIEF:' || prs_perslid_naam,
1,
60),
prs_perslid_oslogin = NULL,
prs_perslid_oslogin2 = NULL
WHERE prs_perslid_key = rec.prs_perslid_key
AND prs_perslid_naam NOT LIKE 'INACTIEF:%';
fac.writelog (
'inact_prs',
'I',
'Persoon als INACTIEF gemarkeerd of was al INACTIEF gemarkeerd.',
'Achternaam/persoonsnr: '
|| v_perslid_naam
|| '/'
|| v_perslid_nr);
ELSE
BEGIN
UPDATE prs_perslid
SET prs_perslid_verwijder = SYSDATE
WHERE prs_perslid_key = rec.prs_perslid_key;
fac.writelog (
'inact_prs',
'I',
'Persoon ge?ctiveerd.',
'Achternaam/persoonsnr: '
|| v_perslid_naam
|| '/'
|| v_perslid_nr);
EXCEPTION
WHEN OTHERS
THEN
-- Kennelijk heeft de persoon toch ernstige verplichtingen
v_errorhint :=
'Persoon heeft nog (max. '
|| TO_CHAR (v_count)
|| ') verplichtingen. Naam/persoonsnr: '
|| v_perslid_naam
|| '/'
|| v_perslid_nr;
fac.writelog (
'inact_prs',
'I',
'Inactiveren persoon is niet gelukt',
v_errorhint);
END;
END IF;
END IF;
EXCEPTION
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.writelog ('inact_prs',
'E',
v_errormsg,
v_errorhint);
END;
END LOOP;
END;
PROCEDURE anonimiseer_bezoeker
AS
anonymize_period NUMBER := 42;
bez_generic_visitor VARCHAR2 (2001)
:= lcl.l ('lcl_bez_generic_visitor');
v_count NUMBER;
CURSOR c_afspraak IS
SELECT a.bez_afspraak_key
FROM bez_afspraak a,
(SELECT datum_van
FROM (SELECT TRUNC (MIN (bez_afspraak_datum)) datum_van
FROM bez_afspraak a
WHERE bez_afspraak_datum <
(SYSDATE - anonymize_period)
AND NOT EXISTS
(SELECT ft.fac_tracking_key
FROM fac_tracking ft
WHERE ft.fac_tracking_refkey =
bez_afspraak_key
AND ft.fac_srtnotificatie_key =
(SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_code =
'BEZANO'))))
van,
(SELECT TRUNC (SYSDATE - anonymize_period) --- 6 weken dus 6*7
datum_tot
FROM DUAL) tot
WHERE a.bez_afspraak_datum BETWEEN van.datum_van
AND tot.datum_tot
AND NOT EXISTS
(SELECT ft.fac_tracking_key
FROM fac_tracking ft
WHERE ft.fac_tracking_refkey =
a.bez_afspraak_key
AND ft.fac_srtnotificatie_key =
(SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_code =
'BEZANO'))
ORDER BY a.bez_afspraak_key;
BEGIN
FOR rec IN c_afspraak
LOOP
-- Verwijder alle kenmerkwaarden van bezoekers van de afspraak waarvan het ampersand 8 (BITAND) bit van het bez_kenmerk.bez_kenmerk_systeem veld is gezet.
DELETE FROM bez_kenmerkwaarde bkw
WHERE bkw.bez_bezoekers_key IN
(SELECT b.bez_bezoekers_key
FROM bez_bezoekers b
WHERE b.bez_afspraak_key =
rec.bez_afspraak_key)
AND bkw.bez_kenmerk_key IN
(SELECT bk.bez_kenmerk_key
FROM bez_kenmerk bk
WHERE bk.bez_kenmerk_key =
bkw.bez_kenmerk_key
AND BITAND (bk.bez_kenmerk_systeem,
8) =
8);
-- Anonimiseer alle bezoekers.
UPDATE bez_bezoekers
SET bez_afspraak_naam = bez_generic_visitor,
-- bez_afspraak_bedrijf = NULL,
bez_afspraak_opmerking = NULL,
bez_bezoekers_telefoon = NULL,
bez_bezoekers_email = NULL,
bez_bezoekers_kenteken = NULL
WHERE bez_afspraak_key = rec.bez_afspraak_key;
-- Anonimiseer alle afspraken.
-- Door de trigger in de update wordt automatische de naam van de host in de gastheer geplakt.
-- Daardoor wordt de lcl "Ganonimiseerd" in vele gevallen niet blijvend in de gasheer gezet.
-- De persoon (prs record) moet daarom eerst aangepast worden.
-- Tijdens het anonimiseren van de persoon wordt daarom de bez_afspraak_gastheer ook geanonimiseerd.
-- In de gevallen dat er geen host wordt gebruikt en alleen tekst voor de persoon (gastheer) wordt ingevuld wordt het veld wel blijvend gezet.
UPDATE bez_afspraak
SET bez_afspraak_gastheer = bez_generic_visitor,
bez_afspraak_telefoonnr = NULL,
bez_afspraak_opmerking = NULL
WHERE bez_afspraak_key = rec.bez_afspraak_key;
-- Alle BEZ tracking anonimiseren m.b.t. de afspraak.
UPDATE fac_tracking
SET fac_tracking_oms = NULL
WHERE fac_srtnotificatie_key IN
(SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode =
'afspraak'
AND fac_srtnotificatie_code != 'BEZANO')
AND fac_tracking_refkey = rec.bez_afspraak_key
AND fac_tracking_oms IS NOT NULL;
-- Alle BEZ tracking anonimiseren m.b.t. de bezoekers van de afspraak.
UPDATE fac_tracking
SET fac_tracking_oms = NULL
WHERE fac_srtnotificatie_key IN
(SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode = 'bezoeker')
AND fac_tracking_refkey IN
(SELECT bb.bez_bezoekers_key
FROM bez_bezoekers bb
WHERE bb.bez_afspraak_key = rec.bez_afspraak_key)
AND fac_tracking_oms IS NOT NULL;
-- Anonimiseren van de afspraak tracken.
fac.trackaction ('BEZANO',
rec.bez_afspraak_key,
NULL,
NULL,
NULL);
IF v_count >= 1000
THEN
COMMIT;
v_count := 0;
ELSE
v_count := v_count + 1;
END IF;
END LOOP;
END;
END;
/
CREATE OR REPLACE PROCEDURE ZLMV_IMPORT_IMPPERSLID(p_import_key IN NUMBER)
AS
CURSOR c1 is
SELECT fac_imp_csv_col01 prs_voornaam,
fac_imp_csv_col02 prs_tussenvoegsel,
fac_imp_csv_col03 prs_achternaam,
fac_imp_csv_col04 prs_email,
fac_imp_csv_col05 prs_titel,
fac_imp_csv_col06 prs_afdeling
FROM fac_imp_csv
WHERE fac_import_key=p_import_key
ORDER BY fac_imp_csv_key;
v_header NUMBER:=0;
v_afdeling_code VARCHAR2(15);
v_functie VARCHAR2(60);
BEGIN
v_header :=0;
DELETE FROM fac_imp_perslid;
DELETE FROM fac_imp_organisatie;
FOR rec in C1
LOOP
IF rec.prs_voornaam='GivenName' AND v_header=0
THEN
v_header:=1;
ELSE
BEGIN
SELECT prs_afdeling_naam
INTO v_afdeling_code
FROM prs_afdeling
WHERE UPPER(prs_afdeling_omschrijving)=UPPER(rec.prs_afdeling);
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_afdeling_code:='Onbekend';
END;
IF length(rec.prs_titel)>1 THEN
v_functie:=rec.prs_titel;
ELSE
v_functie:='Onbekend';
END IF;
INSERT INTO fac_imp_perslid(fac_import_key,
prs_afdeling_naam,
prs_perslid_voornaam,
prs_perslid_tussenvoegsel,
prs_perslid_naam,
prs_perslid_email,
prs_srtperslid_omschrijving)
VALUES(p_import_key,
v_afdeling_code,
rec.prs_voornaam,
rec.prs_tussenvoegsel,
rec.prs_achternaam,
rec.prs_email,
v_functie);
END IF;
END LOOP;
END;
/
CREATE OR REPLACE PROCEDURE ZLMV_UPDATE_IMPPERSLID(p_import_key IN NUMBER)
AS
CURSOR p_del
IS
SELECT *
FROM prs_perslid p
WHERE p.prs_perslid_verwijder IS NULL
AND p.prs_perslid_email NOT IN (SELECT prs_perslid_email
FROM fac_imp_perslid);
CURSOR p_wrkplk
IS
SELECT p.prs_perslid_key, a.alg_ruimte_key
FROM prs_perslid p, prs_afdeling pa, ALG_V_AANWEZIGRUIMTE a
WHERE p.PRS_AFDELING_KEY=pa.prs_afdeling_key
AND UPPER(pa.prs_afdeling_omschrijving)='FACILITAIR'
AND pa.prs_afdeling_verwijder IS NULL
AND p.prs_perslid_verwijder IS NULL
AND UPPER(a.alg_ruimte_omschrijving)='FACILITAIR'
AND a.alg_ruimte_nr='0.31';
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_errormsg VARCHAR2 (200);
v_aanduiding VARCHAR2 (200);
v_errorhint VARCHAR2 (200);
BEGIN
prs.update_perslid (p_import_key, 'EMAIL', 'A', 1);
-- Opschonen van personen die niet meer in de import zitten
FOR rec IN p_del
LOOP
prs.delete_perslid (p_import_key, rec.prs_perslid_key);
END LOOP;
-- Alle medewerkers Fcailitrair krijgen werkplek in Ruimte Facilitair gebouw C2
FOR rec IN p_wrkplk
LOOP
v_aanduiding := 'Perslidkey: ' || rec.prs_perslid_key;
v_errorhint :=
'Specifieke werkplek koppelen voor perslid: '
|| rec.prs_perslid_key;
BEGIN
prs.movetoruimte (rec.prs_perslid_key, rec.alg_ruimte_key, '');
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
fac.writelog (
'Toewijzen Facilitair specifieke werkplek',
'E',
'Error '
|| v_aanduiding
|| oracle_err_num
|| '/'
|| oracle_err_mes,
v_errorhint);
END;
END LOOP;
END;
/
CREATE OR REPLACE PROCEDURE ZLMV_DAILY
AS
BEGIN
-- inactiveren personen die 12 maanden niet hebben ingelogd
-- zlmv.inactivate_prs (); moet nu via de scim koppeling worden geregeld.
-- anonimiseer bezoekers to 42 dagen terug
zlmv.anonimiseer_bezoeker ();
END;
/
------ payload end ------
SET DEFINE OFF
BEGIN adm.systrackscriptId ('$Id$', 0); END;
/
COMMIT;
SET ECHO OFF
SPOOL OFF
SET DEFINE ON
PROMPT Logfile of this upgrade is: &fcltlogfile