Files
Customer/ZLMV/ZLMV.sql
Norbert Wassink 24226c245e ZLMV#76512 -- Inrichting ZLM Verzekeringen, anonimiseren volgens ANO.anonymizebez
svn path=/Customer/trunk/; revision=61865
2023-09-21 11:09:42 +00:00

423 lines
15 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;
BEGIN
ANO.anonymizebez (SYSDATE - 365, SYSDATE - anonymize_period);
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;
-- Eerst de csv inlezen naar standaard csv imp tabel
fac_import_genericcsv(p_import_key);
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