Files
Database/FAC/FAC_PACANO.SRC
Jos Groot Lipman 01929844a6 FCLT#90168 Setting S(puo_fclt_web_apikey) na anonimiseren weer correct instellen
svn path=/Database/branches/DB52/; revision=70863
2025-11-10 09:17:39 +00:00

1642 lines
86 KiB
Plaintext

#ifdef MLD
/*
* $Revision$
* $Id$
*/
#undef TRUNC
CREATE OR REPLACE PACKAGE ano AS
PROCEDURE anonymizebes (p_startdatum IN DATE, p_einddatum IN DATE);
PROCEDURE anonymizebez (p_startdatum IN DATE, p_einddatum IN DATE);
PROCEDURE anonymizefin (p_startdatum IN DATE, p_einddatum IN DATE);
PROCEDURE anonymizemld (p_startdatum IN DATE, p_einddatum IN DATE);
PROCEDURE anonymizeprs (p_startdatum IN DATE, p_einddatum IN DATE);
PROCEDURE anonymizeres (p_startdatum IN DATE, p_einddatum IN DATE);
PROCEDURE anonymizefull(p_flags NUMBER DEFAULT 65535);
PROCEDURE anonymize (p_startdatum IN DATE, p_einddatum IN DATE);
PROCEDURE table_column(p_tabel IN VARCHAR2, p_kolom IN VARCHAR2, p_functie IN VARCHAR2);
FUNCTION postcode(postcode_veld IN VARCHAR2) RETURN VARCHAR2;
FUNCTION telefoon(telefoon_veld IN VARCHAR2) RETURN VARCHAR2;
FUNCTION adres(adres_veld IN VARCHAR2) RETURN VARCHAR2;
FUNCTION naam(naam_veld IN VARCHAR2, uniek IN NUMBER DEFAULT 0) RETURN VARCHAR2;
FUNCTION email(email_veld IN VARCHAR2) RETURN VARCHAR2;
FUNCTION memo(memo_veld IN VARCHAR2) RETURN VARCHAR2;
FUNCTION generic(veld IN VARCHAR2, fmt IN NUMBER DEFAULT 0) RETURN VARCHAR2;
END ano;
/
CREATE OR REPLACE PACKAGE BODY ano AS
PROCEDURE anonymizebes (p_startdatum IN DATE,
p_einddatum IN DATE)
AS
anonymize_period NUMBER := fac.safe_to_number (fac.getsetting ('anonymize_period'));
v_count NUMBER;
anonymize_mode NUMBER;
lcl_fac_anonymized fac_locale_xsl.fac_locale_xsl_tekst%TYPE := lcl.l('lcl_fac_anonymized');
-- Alle bestellingen waarvan de afwijsdatum, alles geleverd datum, verwerkingsdatum of annuleringsdatum tussen de startdatum en de einddatum liggen.
CURSOR c_bestelling
IS
SELECT b.bes_bestelling_key
FROM bes_bestelling b
WHERE (SELECT MAX(ft.fac_tracking_datum)
FROM fac_tracking ft
WHERE ft.fac_tracking_refkey = b.bes_bestelling_key
AND ft.fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode = 'bestelling'
--AND fac_srtnotificatie_code != 'BESANO' -- Vervangen door "fac_srtnotificatie_key != key" hieronder. Blijkt veel sneller te zijn.
AND fac_srtnotificatie_key != (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_code = 'BESANO')
)) BETWEEN p_startdatum AND p_einddatum
AND b.bes_bestelling_status IN (1, 6, 7, 8)
AND NOT EXISTS
(SELECT ft.fac_tracking_key
FROM fac_tracking ft
WHERE ft.fac_tracking_refkey = b.bes_bestelling_key
AND ft.fac_srtnotificatie_key = (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_code = 'BESANO'))
ORDER BY b.bes_bestelling_key;
CURSOR c_bijlagen(p_refkey IN NUMBER)
IS
SELECT b.fac_bijlagen_key
FROM fac_bijlagen b
, bes_kenmerk k
, bes_srtkenmerk s
WHERE k.bes_srtkenmerk_key = s.bes_srtkenmerk_key
AND k.bes_kenmerk_key = b.fac_bijlagen_kenmerk_key
AND BITAND(s.bes_srtkenmerk_systeem, 8) = 8
AND b.fac_bijlagen_module = 'BES'
AND b.fac_bijlagen_refkey = p_refkey;
BEGIN
IF p_einddatum > SYSDATE - anonymize_period + 1
THEN
raise_application_error(-20001, 'ano_m001 Einddatum is te groot');
END IF;
SELECT fac.getSetting('anonymize_mode')
INTO anonymize_mode
FROM DUAL;
IF anonymize_mode > 0
THEN
v_count := 0;
FOR rec_b IN c_bestelling
LOOP
-- *
-- Anonimiseren bestellingen.
IF (BITAND(anonymize_mode, 1) = 1) -- tracking
THEN
-- Alle BES tracking anonimiseren m.b.t. de bestelling.
UPDATE fac_tracking
SET fac_tracking_oms = NULL
WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode = 'bestelling'
AND fac_srtnotificatie_code != 'BESANO')
AND fac_tracking_refkey = rec_b.bes_bestelling_key
AND fac_tracking_oms IS NOT NULL;
-- Alle BES tracking verwijderen waar geen omschrijving in staat
-- en waarvoor er ook geen srtnotificatie-tekst bestaat.
DELETE FROM fac_tracking
WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode = 'bestelling'
AND fac_srtnotificatie_oms IS NULL
)
AND fac_tracking_refkey = rec_b.bes_bestelling_key
AND fac_tracking_oms IS NULL;
END IF;
--IF (BITAND(anonymize_mode, 2) = 2) -- notes
--THEN
--END IF;
IF (BITAND(anonymize_mode, 4) = 4) -- kenmerken
THEN
-- Verwijder alle kenmerkwaarden van de bestelling waarvan het &8 (BITAND) bit (anonimiseren)
-- van het bes_srtkenmerk.bes_srtkenmerk_systeem veld is gezet.
DELETE FROM bes_kenmerkbestell bkbl
WHERE bkbl.bes_bestelling_key = rec_b.bes_bestelling_key
AND bkbl.bes_kenmerk_key IN (SELECT bk.bes_kenmerk_key
FROM bes_kenmerk bk,
bes_srtkenmerk bsk
WHERE bk.bes_srtkenmerk_key = bsk.bes_srtkenmerk_key
AND bk.bes_kenmerk_key = bkbl.bes_kenmerk_key
AND BITAND(bsk.bes_srtkenmerk_systeem, 8) = 8);
-- Zet het verwijder-veld van alle bijlagen van bestellingen waarvan het &8 (BITAND) bit (anonimiseren)
-- van het bes_srtkenmerk.bes_srtkenmerk_systeem veld is gezet.
-- De scheduled functie utils/gen_schedular/gen_cleanup.js verwijderd dan binnenkort de bijlage echt
-- en ruimt dan ook het record in fac_bijlagen op.
FOR rec_fb in c_bijlagen(rec_b.bes_bestelling_key)
LOOP
flx.deleteflexbijlage(rec_fb.fac_bijlagen_key);
END LOOP;
END IF;
IF (BITAND(anonymize_mode, 8) = 8) -- vaste omschrijvingen
THEN
-- Anonimiseren van tekstvelden in de bestelling.
UPDATE bes_bestelling
SET bes_bestelling_opmerking = CASE WHEN bes_bestelling_opmerking IS NOT NULL THEN lcl_fac_anonymized END
, bes_bestelling_ordernr = CASE WHEN bes_bestelling_ordernr IS NOT NULL THEN lcl_fac_anonymized END
, bes_bestelling_plaats = CASE WHEN bes_bestelling_plaats IS NOT NULL THEN lcl_fac_anonymized END
, bes_bestelling_satisfaction_op = CASE WHEN bes_bestelling_satisfaction_op IS NOT NULL THEN lcl_fac_anonymized END
, bes_bestelling_lev_opm = CASE WHEN bes_bestelling_lev_opm IS NOT NULL THEN lcl_fac_anonymized END
, bes_bestelling_externnr = CASE WHEN bes_bestelling_externnr IS NOT NULL THEN lcl_fac_anonymized END
WHERE bes_bestelling_key = rec_b.bes_bestelling_key;
END IF;
-- Anonimiseren van de bestelling tracken.
fac.trackaction('#BESANO', rec_b.bes_bestelling_key, NULL, NULL, NULL);
-- *
-- Anonimiseren bestelopdrachten.
FOR rec_bo IN (SELECT bo.bes_bestelopdr_key
FROM bes_bestelopdr bo,
bes_bestelopdr_item boi,
bes_bestelling_item bi
WHERE bo.bes_bestelopdr_key = boi.bes_bestelopdr_key
AND boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key
AND bi.bes_bestelling_key = rec_b.bes_bestelling_key)
LOOP
IF (BITAND(anonymize_mode, 1) = 1) -- tracking
THEN
-- Alle BES tracking anonimiseren m.b.t. de bestelopdracht van de bestelling.
UPDATE fac_tracking
SET fac_tracking_oms = NULL
WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode = 'bestelopdr'
AND fac_srtnotificatie_code != 'BES2AN')
AND fac_tracking_refkey = rec_bo.bes_bestelopdr_key
AND fac_tracking_oms IS NOT NULL;
-- Alle BES tracking verwijderen waar geen omschrijving in staat
-- en waarvoor er ook geen srtnotificatie-tekst bestaat.
DELETE FROM fac_tracking
WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode = 'bestelopdr'
AND fac_srtnotificatie_oms IS NULL
)
AND fac_tracking_refkey = rec_bo.bes_bestelopdr_key
AND fac_tracking_oms IS NULL;
END IF;
--IF (BITAND(anonymize_mode, 2) = 2) -- notes
--THEN
--END IF;
IF (BITAND(anonymize_mode, 4) = 4) -- kenmerken
THEN
-- Verwijder alle kenmerkwaarden van de bestelopdrachten van de bestelling waarvan het &8 (BITAND) bit (anonimiseren)
-- van het bes_srtkenmerk.bes_srtkenmerk_systeem veld is gezet.
DELETE FROM bes_kenmerkbesteli bkbi
WHERE bkbi.bes_bestelling_item_key IN (SELECT bi.bes_bestelling_item_key
FROM bes_bestelling_item bi
WHERE bi.bes_bestelling_key = rec_b.bes_bestelling_key)
AND bkbi.bes_kenmerk_key IN (SELECT bk.bes_kenmerk_key
FROM bes_kenmerk bk,
bes_srtkenmerk bsk
WHERE bk.bes_srtkenmerk_key = bsk.bes_srtkenmerk_key
AND bk.bes_kenmerk_key = bkbi.bes_kenmerk_key
AND BITAND(bsk.bes_srtkenmerk_systeem, 8) = 8);
FOR rec_fb IN c_bijlagen(rec_bo.bes_bestelopdr_key)
LOOP
flx.deleteflexbijlage(rec_fb.fac_bijlagen_key);
END LOOP;
END IF;
IF (BITAND(anonymize_mode, 8) = 8) -- vaste omschrijvingen
THEN
-- Anonimiseren van tekstvelden in de bestelopdracht.
UPDATE bes_bestelopdr
SET bes_bestelopdr_opmerking = CASE WHEN bes_bestelopdr_opmerking IS NOT NULL THEN lcl_fac_anonymized END
, bes_bestelopdr_delivery_opmerk = CASE WHEN bes_bestelopdr_delivery_opmerk IS NOT NULL THEN lcl_fac_anonymized END
, bes_bestelopdr_externnr = CASE WHEN bes_bestelopdr_externnr IS NOT NULL THEN lcl_fac_anonymized END
WHERE bes_bestelopdr_key = rec_bo.bes_bestelopdr_key;
UPDATE bes_bestelopdr_item
SET bes_bestelopdr_item_opmerking = CASE WHEN bes_bestelopdr_item_opmerking IS NOT NULL THEN lcl_fac_anonymized END
WHERE bes_bestelopdr_key = rec_bo.bes_bestelopdr_key;
END IF;
-- Anonimiseren van de bestelopdracht tracken.
fac.trackaction('BES2AN', rec_bo.bes_bestelopdr_key, NULL, NULL, NULL);
END LOOP; -- bestelopdrachten
IF v_count >= 1000
THEN
COMMIT;
v_count := 0;
ELSE
v_count := v_count + 1;
END IF;
END LOOP; -- bestellingen
END IF;
END;
PROCEDURE anonymizebez (p_startdatum IN DATE,
p_einddatum IN DATE)
AS
anonymize_period NUMBER := fac.safe_to_number (fac.getsetting ('anonymize_period'));
bez_generic_visitor VARCHAR2 (2001) := lcl.l('lcl_bez_generic_visitor');
v_count NUMBER;
anonymize_mode NUMBER;
-- Alle afspraken die tussen de startdatum en de einddatum liggen.
CURSOR c_afspraak
IS
SELECT bez_afspraak_key
FROM bez_afspraak
WHERE bez_afspraak_eind BETWEEN p_startdatum AND p_einddatum
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'))
ORDER BY bez_afspraak_key;
CURSOR c_bijlagen(p_refkey IN NUMBER)
IS
SELECT b.fac_bijlagen_key
FROM fac_bijlagen b
, bez_kenmerk k
, bez_bezoekers v
WHERE k.bez_kenmerk_key = b.fac_bijlagen_kenmerk_key
AND b.fac_bijlagen_refkey = v.bez_bezoekers_key
AND BITAND(k.bez_kenmerk_systeem, 8) = 8
AND b.fac_bijlagen_module = 'BEZ'
AND v.bez_afspraak_key = p_refkey;
BEGIN
IF p_einddatum > SYSDATE - anonymize_period + 1
THEN
raise_application_error(-20001, 'ano_m001 Einddatum is te groot');
END IF;
SELECT fac.getSetting('anonymize_mode')
INTO anonymize_mode
FROM DUAL;
IF anonymize_mode > 0
THEN
v_count := 0;
FOR rec_a IN c_afspraak
LOOP
-- *
-- Anonimiseren afspraak
IF (BITAND(anonymize_mode, 1) = 1) -- tracking
THEN
-- 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_a.bez_afspraak_key
AND fac_tracking_oms IS NOT NULL;
-- Alle BEZ tracking verwijderen waar geen omschrijving in staat
-- en waarvoor er ook geen srtnotificatie-tekst bestaat.
DELETE FROM fac_tracking
WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode = 'afspraak'
AND fac_srtnotificatie_oms IS NULL
)
AND fac_tracking_refkey = rec_a.bez_afspraak_key
AND fac_tracking_oms IS NULL;
END IF;
--IF (BITAND(anonymize_mode, 2) = 2) -- notes
--THEN
--END IF;
IF (BITAND(anonymize_mode, 4) = 4) -- kenmerken
THEN
-- Verwijder alle kenmerkwaarden van bezoekers van de afspraak waarvan het &8 (BITAND) bit (anonimiseren)
-- 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_a.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);
-- Zet het verwijder-veld van alle bijlagen van bezoekers waarvan het &8 (BITAND) bit (anonimiseren)
-- van het bez_kenmerk.bez_kenmerk_systeem veld is gezet.
-- De scheduled functie utils/gen_schedular/gen_cleanup.js verwijderd dan binnenkort de bijlage echt
-- en ruimt dan ook het record in fac_bijlagen op.
FOR rec_fb in c_bijlagen(rec_a.bez_afspraak_key)
LOOP
flx.deleteflexbijlage(rec_fb.fac_bijlagen_key);
END LOOP;
END IF;
IF (BITAND(anonymize_mode, 8) = 8) -- vaste omschrijvingen
THEN
-- 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 gastheer 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_a.bez_afspraak_key;
END IF;
-- Anonimiseren van de afspraak tracken.
fac.trackaction('#BEZANO', rec_a.bez_afspraak_key, NULL, NULL, NULL);
-- *
-- Anonimiseren bezoekers
BEGIN
-- Geen speciale acties per bezoeker dus kan per afspraak ipv lus per bezoeker.
IF (BITAND(anonymize_mode, 1) = 1) -- tracking
THEN
-- 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_a.bez_afspraak_key)
AND fac_tracking_oms IS NOT NULL;
-- Alle BEZ tracking verwijderen waar geen omschrijving in staat
-- en waarvoor er ook geen srtnotificatie-tekst bestaat.
DELETE FROM fac_tracking
WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode = 'bezoeker'
AND fac_srtnotificatie_oms IS NULL
)
AND fac_tracking_refkey IN (SELECT bb.bez_bezoekers_key
FROM bez_bezoekers bb
WHERE bb.bez_afspraak_key = rec_a.bez_afspraak_key)
AND fac_tracking_oms IS NULL;
END IF;
--IF (BITAND(anonymize_mode, 2) = 2) -- notes
--THEN
--END IF;
--IF (BITAND(anonymize_mode, 4) = 4) -- kenmerken
--THEN
--END IF;
IF (BITAND(anonymize_mode, 8) = 8) -- vaste omschrijvingen
THEN
-- 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_a.bez_afspraak_key;
END IF;
END;
IF v_count >= 1000
THEN
COMMIT;
v_count := 0;
ELSE
v_count := v_count + 1;
END IF;
END LOOP;
END IF;
END;
PROCEDURE anonymizefin (p_startdatum IN DATE,
p_einddatum IN DATE)
AS
anonymize_period NUMBER := fac.safe_to_number (fac.getsetting ('anonymize_period'));
v_count NUMBER;
anonymize_mode NUMBER;
lcl_fac_anonymized fac_locale_xsl.fac_locale_xsl_tekst%TYPE := lcl.l('lcl_fac_anonymized');
-- Alle facturen die afgewezen of verwerkt zijn in de periode tussen de startdatum en de einddatum.
CURSOR c_factuur
IS
WITH
fin_tracking
AS
( SELECT fac_tracking_refkey,
MAX (fac_tracking_datum) max_tracking_datum
FROM fac_tracking
WHERE fac_srtnotificatie_key IN
(SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode = 'factuur'
AND fac_srtnotificatie_key !=
(SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_code = 'FINANO'))
GROUP BY fac_tracking_refkey)
SELECT f.fin_factuur_key
FROM fin_factuur f, fin_tracking ft
WHERE f.fin_factuur_key = ft.fac_tracking_refkey
AND ft.max_tracking_datum BETWEEN p_startdatum AND p_einddatum
AND f.fin_factuur_statuses_key IN (1, 7)
AND NOT EXISTS
(SELECT ft.fac_tracking_key
FROM fac_tracking ft
WHERE ft.fac_tracking_refkey = f.fin_factuur_key
AND ft.fac_srtnotificatie_key =
(SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_code = 'FINANO'))
ORDER BY f.fin_factuur_key;
CURSOR c_bijlagen_factuur(p_refkey IN NUMBER)
IS
SELECT b.fac_bijlagen_key
FROM fac_bijlagen b
, fin_kenmerk k
WHERE k.fin_kenmerk_key = b.fac_bijlagen_kenmerk_key
AND b.fac_bijlagen_refkey = p_refkey
AND BITAND(k.fin_kenmerk_systeem, 8) = 8
AND k.fin_kenmerk_type = 'F'
AND b.fac_bijlagen_module = 'FIN';
CURSOR c_bijlagen_factuur_note(p_refkey IN NUMBER)
IS
SELECT b.fac_bijlagen_key
FROM fac_bijlagen b
, fin_factuur_note n
WHERE b.fac_bijlagen_refkey = n.fin_factuur_note_key
AND b.fac_bijlagen_module = 'FINN'
AND b.fac_bijlagen_kenmerk_key = -1
AND n.fin_factuur_key = p_refkey;
BEGIN
IF p_einddatum > SYSDATE - anonymize_period + 1
THEN
raise_application_error(-20001, 'ano_m001 Einddatum is te groot');
END IF;
SELECT fac.getSetting('anonymize_mode')
INTO anonymize_mode
FROM DUAL;
IF anonymize_mode > 0
THEN
DBMS_APPLICATION_INFO.SET_ACTION ('ANONYMIZE'); // Voorkomt eventueel triggers
v_count := 0;
FOR rec_f IN c_factuur
LOOP
-- *
-- Anonimiseren factuur
IF (BITAND(anonymize_mode, 1) = 1) -- tracking
THEN
-- Alle FIN tracking anonimiseren m.b.t. de factuur.
UPDATE fac_tracking
SET fac_tracking_oms = NULL
WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode = 'factuur'
AND fac_srtnotificatie_code != 'FINANO')
AND fac_tracking_refkey = rec_f.fin_factuur_key
AND fac_tracking_oms IS NOT NULL;
-- Alle FIN tracking verwijderen waar geen omschrijving in staat
-- en waarvoor er ook geen srtnotificatie-tekst bestaat.
DELETE FROM fac_tracking
WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode = 'factuur'
AND fac_srtnotificatie_oms IS NULL
)
AND fac_tracking_refkey = rec_f.fin_factuur_key
AND fac_tracking_oms IS NULL;
END IF;
IF (BITAND(anonymize_mode, 2) = 2) -- notes
THEN
-- Verwijder alle bijlagen van notities van de melding.
FOR rec_nb IN c_bijlagen_factuur_note(rec_f.fin_factuur_key)
LOOP
flx.deleteflexbijlage(rec_nb.fac_bijlagen_key);
END LOOP;
-- Verwijder alle notities van de factuur.
DELETE FROM fin_factuur_note ffn
WHERE ffn.fin_factuur_key = rec_f.fin_factuur_key;
END IF;
IF (BITAND(anonymize_mode, 4) = 4) -- kenmerken
THEN
-- Verwijder alle kenmerkwaarden van de factuur waarvan het &8 (BITAND) bit (anonimiseren)
-- van het fin_kenmerk.fin_kenmerk_systeem veld is gezet.
DELETE FROM fin_kenmerkfactuur fkf
WHERE fkf.fin_factuur_key = rec_f.fin_factuur_key
AND fkf.fin_kenmerk_key IN (SELECT fk.fin_kenmerk_key
FROM fin_kenmerk fk
WHERE fk.fin_kenmerk_key = fkf.fin_kenmerk_key
AND fk.fin_kenmerk_type = 'F'
AND BITAND(fk.fin_kenmerk_systeem, 8) = 8);
-- Zet het verwijder-veld van alle bijlagen van de factuur waarvan het &8 (BITAND) bit (anonimiseren)
-- van het fin_kenmerk.fin_kenmerk_systeem veld is gezet.
-- De scheduled functie utils/gen_schedular/gen_cleanup.js verwijderd dan binnenkort de bijlage echt
-- en ruimt dan ook het record in fac_bijlagen op.
FOR rec_fb IN c_bijlagen_factuur(rec_f.fin_factuur_key)
LOOP
flx.deleteflexbijlage(rec_fb.fac_bijlagen_key);
END LOOP;
END IF;
IF (BITAND(anonymize_mode, 8) = 8) -- vaste omschrijvingen
THEN
-- Anonimiseren van tekstvelden in de factuur.
UPDATE fin_factuur
SET fin_factuur_opmerking = CASE WHEN fin_factuur_opmerking IS NOT NULL THEN lcl_fac_anonymized END
, fin_factuur_opmerking_afw = CASE WHEN fin_factuur_opmerking_afw IS NOT NULL THEN lcl_fac_anonymized END
WHERE fin_factuur_key = rec_f.fin_factuur_key;
END IF;
-- Anonimiseren van de factuur tracken.
fac.trackaction('#FINANO', rec_f.fin_factuur_key, NULL, NULL, NULL);
-- *
-- Anonimiseren factuurregels.
FOR rec_r IN (SELECT fin_factuurregel_key
FROM fin_factuurregel
WHERE fin_factuur_key = rec_f.fin_factuur_key)
LOOP
--IF (BITAND(anonymize_mode, 1) = 1) -- tracking
--THEN -- Tracking van factuurregels gebeurd op factuur niveau.
--END IF;
--IF (BITAND(anonymize_mode, 2) = 2) -- notes
--THEN -- Factuurregels hebben geen notes.
--END IF;
IF (BITAND(anonymize_mode, 4) = 4) -- kenmerken
THEN
-- Verwijder alle kenmerkwaarden van de factuurregels van de factuur waarvan het &8 (BITAND) bit (anonimiseren)
-- van het fin_kenmerk.fin_kenmerk_systeem veld is gezet.
DELETE FROM fin_kenmerkfactregel fkr
WHERE fkr.fin_factuurregel_key = rec_r.fin_factuurregel_key
AND fkr.fin_kenmerk_key IN (SELECT fk.fin_kenmerk_key
FROM fin_kenmerk fk
WHERE fk.fin_kenmerk_key = fkr.fin_kenmerk_key
AND fk.fin_kenmerk_type = 'R'
AND BITAND(fk.fin_kenmerk_systeem, 8) = 8);
-- Factuurregels hebben geen bijlagekenmerken. Zie fin\fin_flexkenmerk.inc
END IF;
IF (BITAND(anonymize_mode, 8) = 8) -- vaste omschrijvingen
THEN
-- Anonimiseren van tekstvelden in de factuurregels van de factuur.
UPDATE fin_factuurregel
SET fin_factuurregel_omschrijving = CASE WHEN fin_factuurregel_omschrijving IS NOT NULL THEN lcl_fac_anonymized END
WHERE fin_factuurregel_key = rec_r.fin_factuurregel_key;
END IF;
-- Anonimiseren van factuurregels wordt niet getrackt.
END LOOP; -- factuurregels
IF v_count >= 1000
THEN
COMMIT;
v_count := 0;
ELSE
v_count := v_count + 1;
END IF;
END LOOP; -- facturen
END IF;
END;
PROCEDURE anonymizemld (p_startdatum IN DATE,
p_einddatum IN DATE)
AS
anonymize_period NUMBER := fac.safe_to_number (fac.getsetting ('anonymize_period'));
v_count NUMBER;
anonymize_mode NUMBER;
lcl_fac_anonymized fac_locale_xsl.fac_locale_xsl_tekst%TYPE := lcl.l('lcl_fac_anonymized');
-- Alle meldingen waarvan de afwijsdatum of verwerkingsdatum tussen de startdatum en de einddatum liggen.
CURSOR c_melding
IS
SELECT m.mld_melding_key
FROM mld_melding m
WHERE (SELECT MAX(ft.fac_tracking_datum)
FROM fac_tracking ft
WHERE ft.fac_tracking_refkey = m.mld_melding_key
AND ft.fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode = 'melding'
--AND fac_srtnotificatie_code != 'MLDANO' -- Vervangen door "fac_srtnotificatie_key != key" hieronder. Blijkt veel sneller te zijn.
AND fac_srtnotificatie_key != (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_code = 'MLDANO')
)) BETWEEN p_startdatum AND p_einddatum
AND m.mld_melding_status IN (1, 6)
AND NOT EXISTS
(SELECT ft.fac_tracking_key
FROM fac_tracking ft
WHERE ft.fac_tracking_refkey = m.mld_melding_key
AND ft.fac_srtnotificatie_key = (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_code = 'MLDANO'))
ORDER BY m.mld_melding_key;
CURSOR c_bijlagen_melding(p_refkey IN NUMBER)
IS
SELECT b.fac_bijlagen_key
FROM fac_bijlagen b
, mld_kenmerk k
, mld_srtkenmerk s
WHERE k.mld_kenmerk_key = b.fac_bijlagen_kenmerk_key
AND k.mld_srtkenmerk_key = s.mld_srtkenmerk_key
AND b.fac_bijlagen_refkey = p_refkey
AND BITAND(s.mld_srtkenmerk_systeem, 8) = 8
AND k.mld_kenmerk_niveau IN ('S','D','T')
AND b.fac_bijlagen_module = 'MLD';
CURSOR c_bijlagen_opdracht(p_refkey IN NUMBER)
IS
SELECT b.fac_bijlagen_key
FROM fac_bijlagen b
, mld_kenmerk k
, mld_srtkenmerk s
WHERE k.mld_kenmerk_key = b.fac_bijlagen_kenmerk_key
AND k.mld_srtkenmerk_key = s.mld_srtkenmerk_key
AND b.fac_bijlagen_refkey = p_refkey
AND BITAND(s.mld_srtkenmerk_systeem, 8) = 8
AND k.mld_kenmerk_niveau IN ('P','O')
AND b.fac_bijlagen_module = 'MLD';
CURSOR c_bijlagen_melding_note(p_refkey IN NUMBER)
IS
SELECT b.fac_bijlagen_key
FROM fac_bijlagen b
, mld_melding_note n
WHERE b.fac_bijlagen_refkey = n.mld_melding_note_key
AND b.fac_bijlagen_module = 'MLDN'
AND b.fac_bijlagen_kenmerk_key = -1
AND n.mld_melding_key = p_refkey;
CURSOR c_bijlagen_opdracht_note(p_refkey IN NUMBER)
IS
SELECT b.fac_bijlagen_key
FROM fac_bijlagen b
, mld_opdr_note n
WHERE b.fac_bijlagen_refkey = n.mld_opdr_note_key
AND b.fac_bijlagen_module = 'ORDN'
AND b.fac_bijlagen_kenmerk_key = -1
AND n.mld_opdr_key = p_refkey;
BEGIN
IF p_einddatum > SYSDATE - anonymize_period + 1
THEN
raise_application_error(-20001, 'ano_m001 Einddatum is te groot');
END IF;
SELECT fac.getSetting('anonymize_mode')
INTO anonymize_mode
FROM DUAL;
IF anonymize_mode > 0
THEN
DBMS_APPLICATION_INFO.SET_ACTION ('ANONYMIZE'); // Voorkomt mld_t_mld_melding_B_IU
v_count := 0;
FOR rec_m IN c_melding
LOOP
-- *
-- Anonimiseren melding
IF (BITAND(anonymize_mode, 1) = 1) -- tracking
THEN
-- Alle MLD tracking anonimiseren m.b.t. de melding.
UPDATE fac_tracking
SET fac_tracking_oms = NULL
WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode = 'melding'
AND fac_srtnotificatie_code != 'MLDANO')
AND fac_tracking_refkey = rec_m.mld_melding_key
AND fac_tracking_oms IS NOT NULL;
-- Alle MLD tracking verwijderen waar geen omschrijving in staat
-- en waarvoor er ook geen srtnotificatie-tekst bestaat.
DELETE FROM fac_tracking
WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode = 'melding'
AND fac_srtnotificatie_oms IS NULL
)
AND fac_tracking_refkey = rec_m.mld_melding_key
AND fac_tracking_oms IS NULL;
END IF;
IF (BITAND(anonymize_mode, 2) = 2) -- notes
THEN
-- Verwijder alle bijlagen van notities van de melding.
FOR rec_nb IN c_bijlagen_melding_note(rec_m.mld_melding_key)
LOOP
flx.deleteflexbijlage(rec_nb.fac_bijlagen_key);
END LOOP;
-- Verwijder alle notities van de melding.
DELETE FROM mld_melding_note mmn
WHERE mmn.mld_melding_key = rec_m.mld_melding_key;
END IF;
IF (BITAND(anonymize_mode, 4) = 4) -- kenmerken
THEN
-- Verwijder alle kenmerkwaarden van de melding waarvan het &8 (BITAND) bit (anonimiseren)
-- van het mld_srtkenmerk.mld_srtkenmerk_systeem veld is gezet.
DELETE FROM mld_kenmerkmelding mkm
WHERE mkm.mld_melding_key = rec_m.mld_melding_key
AND mkm.mld_kenmerk_key IN (SELECT mk.mld_kenmerk_key
FROM mld_kenmerk mk,
mld_srtkenmerk msk
WHERE mk.mld_srtkenmerk_key = msk.mld_srtkenmerk_key
AND mk.mld_kenmerk_key = mkm.mld_kenmerk_key
AND BITAND(msk.mld_srtkenmerk_systeem, 8) = 8);
-- Zet het verwijder-veld van alle bijlagen van de melding waarvan het &8 (BITAND) bit (anonimiseren)
-- van het mld_srtkenmerk.mld_srtkenmerk_systeem veld is gezet.
-- De scheduled functie utils/gen_schedular/gen_cleanup.js verwijderd dan binnenkort de bijlage echt
-- en ruimt dan ook het record in fac_bijlagen op.
FOR rec_fb IN c_bijlagen_melding(rec_m.mld_melding_key)
LOOP
flx.deleteflexbijlage(rec_fb.fac_bijlagen_key);
END LOOP;
END IF;
IF (BITAND(anonymize_mode, 8) = 8) -- vaste omschrijvingen
THEN
-- Anonimiseren van tekstvelden in de melding.
UPDATE mld_melding
SET mld_melding_omschrijving = CASE WHEN mld_melding_omschrijving IS NOT NULL THEN lcl_fac_anonymized END
, mld_melding_opmerking = CASE WHEN mld_melding_opmerking IS NOT NULL THEN lcl_fac_anonymized END
, mld_melding_document = CASE WHEN mld_melding_document IS NOT NULL THEN lcl_fac_anonymized END
, mld_melding_satisfaction_op = CASE WHEN mld_melding_satisfaction_op IS NOT NULL THEN lcl_fac_anonymized END
, mld_melding_naam_ext = CASE WHEN mld_melding_naam_ext IS NOT NULL THEN lcl_fac_anonymized END
, mld_melding_email_ext = CASE WHEN mld_melding_email_ext IS NOT NULL THEN lcl_fac_anonymized END
, mld_melding_tel_ext = CASE WHEN mld_melding_tel_ext IS NOT NULL THEN lcl_fac_anonymized END
WHERE mld_melding_key = rec_m.mld_melding_key;
END IF;
-- Anonimiseren van de melding tracken.
fac.trackaction('#MLDANO', rec_m.mld_melding_key, NULL, NULL, NULL);
-- *
-- Anonimiseren opdrachten melding.
FOR rec_o IN (SELECT mld_opdr_key
FROM mld_opdr
WHERE mld_melding_key = rec_m.mld_melding_key)
LOOP
IF (BITAND(anonymize_mode, 1) = 1) -- tracking
THEN
-- Alle MLD tracking anonimiseren m.b.t. de opdrachten van de melding.
UPDATE fac_tracking
SET fac_tracking_oms = NULL
WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode = 'opdracht'
AND fac_srtnotificatie_code != 'ORDANO')
AND fac_tracking_refkey = rec_o.mld_opdr_key
AND fac_tracking_oms IS NOT NULL;
-- Alle ORD tracking verwijderen waar geen omschrijving in staat
-- en waarvoor er ook geen srtnotificatie-tekst bestaat.
DELETE FROM fac_tracking
WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode = 'opdracht'
AND fac_srtnotificatie_oms IS NULL
)
AND fac_tracking_refkey = rec_o.mld_opdr_key
AND fac_tracking_oms IS NULL;
END IF;
IF (BITAND(anonymize_mode, 2) = 2) -- notes
THEN
-- Verwijder alle bijlagen van notities van de opdracht bij de melding.
FOR rec_nb IN c_bijlagen_opdracht_note(rec_o.mld_opdr_key)
LOOP
flx.deleteflexbijlage(rec_nb.fac_bijlagen_key);
END LOOP;
-- Verwijder alle notities van de opdrachten bij de melding.
DELETE FROM mld_opdr_note mon
WHERE mon.mld_opdr_key = rec_o.mld_opdr_key;
END IF;
IF (BITAND(anonymize_mode, 4) = 4) -- kenmerken
THEN
-- Verwijder alle kenmerkwaarden van de opdrachten van de melding waarvan het &8 (BITAND) bit (anonimiseren)
-- van het mld_srtkenmerk.mld_srtkenmerk_systeem veld is gezet.
DELETE FROM mld_kenmerkopdr mko
WHERE mko.mld_opdr_key = rec_o.mld_opdr_key
AND mko.mld_kenmerk_key IN (SELECT mk.mld_kenmerk_key
FROM mld_kenmerk mk,
mld_srtkenmerk msk
WHERE mk.mld_srtkenmerk_key = msk.mld_srtkenmerk_key
AND mk.mld_kenmerk_key = mko.mld_kenmerk_key
AND BITAND(msk.mld_srtkenmerk_systeem, 8) = 8);
-- Zet het verwijder-veld van alle bijlagen van de melding-opdracht waarvan het &8 (BITAND) bit (anonimiseren)
-- van het mld_srtkenmerk.mld_srtkenmerk_systeem veld is gezet.
-- De scheduled functie utils/gen_schedular/gen_cleanup.js verwijderd dan binnenkort de bijlage echt
-- en ruimt dan ook het record in fac_bijlagen op.
FOR rec_fb IN c_bijlagen_opdracht(rec_o.mld_opdr_key)
LOOP
flx.deleteflexbijlage(rec_fb.fac_bijlagen_key);
END LOOP;
END IF;
IF (BITAND(anonymize_mode, 8) = 8) -- vaste omschrijvingen
THEN
-- Anonimiseren van tekstvelden in de opdrachten van de melding.
UPDATE mld_opdr
SET mld_opdr_omschrijving = CASE WHEN mld_opdr_omschrijving IS NOT NULL THEN lcl_fac_anonymized END
, mld_opdr_werkzaamheden = CASE WHEN mld_opdr_werkzaamheden IS NOT NULL THEN lcl_fac_anonymized END
, mld_opdr_contactpersoon = CASE WHEN mld_opdr_contactpersoon IS NOT NULL THEN lcl_fac_anonymized END
, mld_opdr_opmerking_fiat = CASE WHEN mld_opdr_opmerking_fiat IS NOT NULL THEN lcl_fac_anonymized END
, mld_opdr_opmerking = CASE WHEN mld_opdr_opmerking IS NOT NULL THEN lcl_fac_anonymized END
WHERE mld_opdr_key = rec_o.mld_opdr_key;
-- Anonimiseren van tekstvelden in opdrachtregels van de melding.
UPDATE mld_opdr_materiaal
SET mld_opdr_materiaal_omschr = CASE WHEN mld_opdr_materiaal_omschr IS NOT NULL THEN lcl_fac_anonymized END
, mld_opdr_materiaal_info = CASE WHEN mld_opdr_materiaal_info IS NOT NULL THEN lcl_fac_anonymized END
, mld_opdr_materiaal_extra1 = CASE WHEN mld_opdr_materiaal_extra1 IS NOT NULL THEN lcl_fac_anonymized END
, mld_opdr_materiaal_extra2 = CASE WHEN mld_opdr_materiaal_extra2 IS NOT NULL THEN lcl_fac_anonymized END
, mld_opdr_materiaal_extra3 = CASE WHEN mld_opdr_materiaal_extra3 IS NOT NULL THEN lcl_fac_anonymized END
, mld_opdr_materiaal_extra4 = CASE WHEN mld_opdr_materiaal_extra4 IS NOT NULL THEN lcl_fac_anonymized END
WHERE mld_opdr_key = rec_o.mld_opdr_key;
END IF;
-- Anonimiseren van de meldingsopdracht tracken.
fac.trackaction('#ORDANO', rec_o.mld_opdr_key, NULL, NULL, NULL);
END LOOP; -- opdrachten
IF v_count >= 1000
THEN
COMMIT;
v_count := 0;
ELSE
v_count := v_count + 1;
END IF;
END LOOP; -- meldingen
END IF;
DBMS_APPLICATION_INFO.SET_ACTION (NULL);
EXCEPTION
WHEN OTHERS THEN
DBMS_APPLICATION_INFO.SET_ACTION (NULL);
END;
PROCEDURE anonymizeprs (p_startdatum IN DATE,
p_einddatum IN DATE)
AS
anonymize_period NUMBER := fac.safe_to_number (fac.getsetting ('anonymize_period'));
bez_generic_visitor VARCHAR2 (2001) := lcl.l('lcl_bez_generic_visitor');
prs_old_employee VARCHAR2 (100) := lcl.l('lcl_prs_old_employee');
v_count NUMBER;
anonymize_mode NUMBER;
-- Alle personen die tussen de startdatum en de einddatum verwijderd zijn.
CURSOR c_perslid
IS
SELECT '[' || TO_CHAR (p.prs_perslid_key) || '|' || p.prs_perslid_naam || '|' || p.prs_perslid_email || '] ' aanduiding,
p.prs_perslid_key
FROM prs_perslid p
WHERE p.prs_perslid_verwijder IS NOT NULL
AND p.prs_perslid_verwijder BETWEEN p_startdatum AND p_einddatum
AND NOT EXISTS
(SELECT ft.fac_tracking_key
FROM fac_tracking ft
WHERE ft.fac_tracking_refkey = p.prs_perslid_key
AND ft.fac_srtnotificatie_key = (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_code = 'PRSANO'))
ORDER BY 2;
CURSOR c_bijlagen(p_refkey IN NUMBER)
IS
SELECT b.fac_bijlagen_key
FROM fac_bijlagen b
, prs_kenmerk k
WHERE k.prs_kenmerk_key = b.fac_bijlagen_kenmerk_key
AND BITAND(k.prs_kenmerk_systeem, 8) = 8
AND b.fac_bijlagen_module = 'PRS'
AND b.fac_bijlagen_refkey = p_refkey;
BEGIN
IF p_einddatum > SYSDATE - anonymize_period + 1
THEN
raise_application_error(-20001, 'ano_m001 Einddatum is te groot');
END IF;
SELECT fac.getSetting('anonymize_mode')
INTO anonymize_mode
FROM DUAL;
IF anonymize_mode > 0
THEN
v_count := 0;
FOR rec_p IN c_perslid
LOOP
BEGIN
IF (BITAND(anonymize_mode, 1) = 1) -- tracking
THEN
-- Alle PRSXXX tracking anonimiseren. De PRSLOG tracking moet verwijderd worden.
UPDATE fac_tracking
SET fac_tracking_oms = NULL
WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_code LIKE 'PRS%'
AND fac_srtnotificatie_code != 'PRSLOG'
AND fac_srtnotificatie_code != 'PRSANO')
AND fac_tracking_refkey = rec_p.prs_perslid_key
AND fac_tracking_oms IS NOT NULL;
-- Alle PRS tracking verwijderen waar geen omschrijving in staat
-- en waarvoor er ook geen srtnotificatie-tekst bestaat.
DELETE FROM fac_tracking
WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_code LIKE 'PRS%'
AND fac_srtnotificatie_code != 'PRSLOG'
AND fac_srtnotificatie_oms IS NULL
)
AND fac_tracking_refkey = rec_p.prs_perslid_key
AND fac_tracking_oms IS NULL;
-- PRSLOG Tracking verwijderen.
DELETE FROM fac_tracking
WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_code = 'PRSLOG')
AND fac_tracking_refkey = rec_p.prs_perslid_key;
END IF;
--IF (BITAND(anonymize_mode, 2) = 2) -- notes
--THEN
--END IF;
IF (BITAND(anonymize_mode, 4) = 4) -- kenmerken
THEN
-- Verwijder alle kenmerkwaarden van de persoon waarvan het &8 (BITAND) bit (anonimiseren)
-- van het prs_kenmerk.prs_kenmerk_systeem veld is gezet.
DELETE FROM prs_kenmerklink pkl
WHERE pkl.prs_kenmerklink_niveau = 'P'
AND pkl.prs_link_key = rec_p.prs_perslid_key
AND pkl.prs_kenmerk_key IN (SELECT pk.prs_kenmerk_key
FROM prs_kenmerk pk
WHERE pk.prs_kenmerk_key = pkl.prs_kenmerk_key
AND BITAND(pk.prs_kenmerk_systeem, 8) = 8);
-- Zet het verwijder-veld van alle bijlagen van personen waarvan het &8 (BITAND) bit (anonimiseren)
-- van het prs_kenmerk.prs_kenmerk_systeem veld is gezet.
-- De scheduled functie utils/gen_schedular/gen_cleanup.js verwijderd dan binnenkort de bijlage echt
-- en ruimt dan ook het record in fac_bijlagen op.
FOR rec_fb in c_bijlagen(rec_p.prs_perslid_key)
LOOP
flx.deleteflexbijlage(rec_fb.fac_bijlagen_key);
END LOOP;
END IF;
IF (BITAND(anonymize_mode, 8) = 8) -- vaste omschrijvingen
THEN
-- Persoon anonimiseren.
UPDATE prs_perslid
SET prs_perslid_naam = prs_old_employee,
prs_perslid_tussenvoegsel = NULL,
prs_perslid_voorletters = NULL,
prs_perslid_voornaam = NULL,
prs_perslid_titel = NULL,
prs_perslid_initialen = NULL,
prs_perslid_geslacht = NULL,
prs_perslid_nr = NULL,
prs_perslid_telefoonnr = NULL,
prs_perslid_mobiel = NULL,
prs_perslid_email = NULL,
prs_perslid_oslogin = NULL,
prs_perslid_oslogin2 = NULL,
prs_perslid_uurloon = NULL,
alg_onroerendgoed_keys = NULL,
alg_onroerendgoed_type = NULL
WHERE prs_perslid_key = rec_p.prs_perslid_key;
-- Van al zijn afspraken waar hij host was, ook de naam van de host (=veld gastheer) anonimiseren.
-- Door update gebeurd dit eigenlijk al automatisch maar dan moet de persoon al wel eerst geanonimiseerd zijn.
UPDATE bez_afspraak
SET bez_afspraak_gastheer = bez_generic_visitor
WHERE bez_afspraak_host_key = rec_p.prs_perslid_key;
END IF;
-- Anonimiseren van de persoon tracken.
fac.trackaction('#PRSANO', rec_p.prs_perslid_key, NULL, NULL, NULL);
IF v_count >= 1000
THEN
COMMIT;
v_count := 0;
ELSE
v_count := v_count + 1;
END IF;
END;
END LOOP;
END IF;
END;
PROCEDURE anonymizeres (p_startdatum IN DATE,
p_einddatum IN DATE)
AS
anonymize_period NUMBER := fac.safe_to_number (fac.getsetting ('anonymize_period'));
bez_generic_visitor VARCHAR2 (2001) := lcl.l('lcl_bez_generic_visitor');
prs_old_employee VARCHAR2 (100) := lcl.l('lcl_prs_old_employee');
v_count NUMBER;
anonymize_mode NUMBER;
lcl_fac_anonymized fac_locale_xsl.fac_locale_xsl_tekst%TYPE := lcl.l('lcl_fac_anonymized');
-- Alle personen die tussen de startdatum en de einddatum verwijderd zijn.
CURSOR c_reservering
IS
SELECT r.res_rsv_ruimte_key
FROM res_rsv_ruimte r
WHERE (SELECT MAX(ft.fac_tracking_datum)
FROM fac_tracking ft
WHERE ft.fac_tracking_refkey = r.res_rsv_ruimte_key
AND ft.fac_srtnotificatie_key IN (SELECT nk.fac_srtnotificatie_key
FROM fac_srtnotificatie nk
WHERE nk.fac_srtnotificatie_xmlnode = 'reservering'
AND nk.fac_srtnotificatie_key != (SELECT nc.fac_srtnotificatie_key
FROM fac_srtnotificatie nc
WHERE nc.fac_srtnotificatie_code = 'RESANO'
)
)
) BETWEEN p_startdatum AND p_einddatum
AND ( r.res_status_bo_key IN (5,6)
OR r.res_rsv_ruimte_verwijder IS NOT NULL
)
AND NOT EXISTS
(SELECT ft.fac_tracking_key
FROM fac_tracking ft
WHERE ft.fac_tracking_refkey = r.res_rsv_ruimte_key
AND ft.fac_srtnotificatie_key = (SELECT nc.fac_srtnotificatie_key
FROM fac_srtnotificatie nc
WHERE nc.fac_srtnotificatie_code = 'RESANO'
)
)
ORDER BY r.res_rsv_ruimte_key;
CURSOR c_bijlagen(p_refkey IN NUMBER)
IS
SELECT b.fac_bijlagen_key
FROM fac_bijlagen b
, res_kenmerk k
, res_srtkenmerk s
WHERE k.res_kenmerk_key = b.fac_bijlagen_kenmerk_key
AND k.res_srtkenmerk_key = s.res_srtkenmerk_key
AND BITAND(s.res_srtkenmerk_systeem, 8) = 8
AND b.fac_bijlagen_module = 'RES'
AND b.fac_bijlagen_refkey = p_refkey;
BEGIN
IF p_einddatum > SYSDATE - anonymize_period + 1
THEN
raise_application_error(-20001, 'ano_m001 Einddatum is te groot');
END IF;
SELECT fac.getSetting('anonymize_mode')
INTO anonymize_mode
FROM DUAL;
IF anonymize_mode > 0
THEN
DBMS_APPLICATION_INFO.SET_ACTION ('ANONYMIZE'); // Voorkomt eventuele triggers
v_count := 0;
FOR rec_r IN c_reservering
LOOP
-- *
-- Anonimiseren reservering
IF (BITAND(anonymize_mode, 1) = 1) -- tracking
THEN
-- Alle RES tracking anonimiseren m.b.t. de reservering.
UPDATE fac_tracking
SET fac_tracking_oms = NULL
WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode = 'reservering'
AND fac_srtnotificatie_code != 'RESANO')
AND fac_tracking_refkey = rec_r.res_rsv_ruimte_key
AND fac_tracking_oms IS NOT NULL;
-- Alle RES tracking verwijderen waar geen omschrijving in staat
-- en waarvoor er ook geen srtnotificatie-tekst bestaat.
DELETE FROM fac_tracking
WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_xmlnode = 'reservering'
AND fac_srtnotificatie_oms IS NULL
)
AND fac_tracking_refkey = rec_r.res_rsv_ruimte_key
AND fac_tracking_oms IS NULL;
END IF;
--IF (BITAND(anonymize_mode, 2) = 2) -- notes
--THEN
--END IF;
IF (BITAND(anonymize_mode, 4) = 4) -- kenmerken
THEN
-- Verwijder alle kenmerkwaarden van de reservering waarvan het &8 (BITAND) bit (anonimiseren)
-- van het res_srtkenmerk.res_srtkenmerk_systeem veld is gezet.
DELETE FROM res_kenmerkwaarde rkw
WHERE rkw.res_rsv_ruimte_key = rec_r.res_rsv_ruimte_key
AND rkw.res_kenmerk_key IN (SELECT rk.res_kenmerk_key
FROM res_kenmerk rk
, res_srtkenmerk rsk
WHERE rk.res_srtkenmerk_key = rsk.res_srtkenmerk_key
AND rk.res_kenmerk_key = rkw.res_kenmerk_key
AND BITAND(rsk.res_srtkenmerk_systeem, 8) = 8);
-- Zet het verwijder-veld van alle bijlagen van reservering waarvan het &8 (BITAND) bit (anonimiseren)
-- van het res_srtkenmerk.res_srtkenmerk_systeem veld is gezet.
-- De scheduled functie utils/gen_schedular/gen_cleanup.js verwijderd dan binnenkort de bijlage echt
-- en ruimt dan ook het record in fac_bijlagen op.
FOR rec_fb in c_bijlagen(rec_r.res_rsv_ruimte_key)
LOOP
flx.deleteflexbijlage(rec_fb.fac_bijlagen_key);
END LOOP;
END IF;
IF (BITAND(anonymize_mode, 8) = 8) -- vaste omschrijvingen
THEN
UPDATE res_rsv_ruimte
SET res_rsv_ruimte_omschrijving = CASE WHEN res_rsv_ruimte_omschrijving IS NOT NULL THEN lcl_fac_anonymized END
, res_rsv_ruimte_opmerking = CASE WHEN res_rsv_ruimte_opmerking IS NOT NULL THEN lcl_fac_anonymized END
, res_rsv_ruimte_telefoon = CASE WHEN res_rsv_ruimte_telefoon IS NOT NULL THEN lcl_fac_anonymized END
WHERE res_rsv_ruimte_key = rec_r.res_rsv_ruimte_key;
END IF;
-- Anonimiseren van de reservering tracken.
fac.trackaction('#RESANO', rec_r.res_rsv_ruimte_key, NULL, NULL, NULL);
IF v_count >= 1000
THEN
COMMIT;
v_count := 0;
ELSE
v_count := v_count + 1;
END IF;
END LOOP;
END IF;
END;
-- Bitje 1 gezet: PRSSYS wachtwoorden (ook) wissen
PROCEDURE anonymizefull(p_flags NUMBER DEFAULT 65535)
AS
BEGIN
DBMS_APPLICATION_INFO.SET_ACTION ('ANONYMIZE'); // Voorkomt trigger bez_t_bez_afspraak_B_IU die in de weg kan zitten
-- Destructive obstrufication of personal data.
UPDATE prs_perslid
SET prs_perslid_naam = INITCAP (DBMS_RANDOM.string ('l', LENGTH (prs_perslid_naam)))
WHERE prs_perslid_naam NOT LIKE 'INACTIEF:%'
AND prs_perslid_naam NOT LIKE 'Facilitor'
AND (prs_perslid_oslogin IS NULL OR SUBSTR(prs_perslid_oslogin, 1, 1) <> '_');
UPDATE prs_perslid
SET prs_perslid_voornaam = INITCAP (DBMS_RANDOM.string ('l', LENGTH (prs_perslid_voornaam)))
WHERE prs_perslid_voornaam IS NOT NULL
AND (prs_perslid_oslogin IS NULL OR SUBSTR(prs_perslid_oslogin, 1, 1) <> '_');
UPDATE prs_perslid
SET prs_perslid_voorletters = UPPER( SUBSTR(prs_perslid_voorletters,1,1)
|| REGEXP_REPLACE(SUBSTR(prs_perslid_voorletters, 2), '[A-Z]', DBMS_RANDOM.string('l',1))
)
WHERE prs_perslid_voorletters IS NOT NULL;
UPDATE prs_perslid
SET prs_perslid_naam = 'INACTIEF:' || INITCAP (DBMS_RANDOM.string ('l', LENGTH (prs_perslid_naam) - 9))
WHERE prs_perslid_naam LIKE 'INACTIEF:%';
UPDATE prs_perslid
SET prs_perslid_email = 'P' || TO_CHAR(prs_perslid_key) || '@notexist.facilitor.nl'
WHERE prs_perslid_email IS NOT NULL;
UPDATE prs_perslid
SET prs_perslid_oslogin2='O' || TO_CHAR(prs_perslid_key)
WHERE prs_perslid_oslogin2 IS NOT NULL;
IF BITAND(p_flags, 1) = 1 THEN
UPDATE prs_perslid
SET prs_perslid_wachtwoord_hash = null;
ELSE -- PRSSYS ingemoeid laten
UPDATE prs_perslid
SET prs_perslid_wachtwoord_hash = null
WHERE prs_perslid_key NOT IN
(SELECT fw.prs_perslid_key
FROM fac_v_webgebruiker fw, fac_functie f
WHERE fw.fac_functie_key = f.fac_functie_key
AND fac_functie_code = 'WEB_PRSSYS');
END IF;
UPDATE prs_perslid
SET prs_perslid_apikey = 'TEST_' || dbms_utility.get_hash_value(prs_perslid_apikey, 0, power(2,24))
WHERE prs_perslid_apikey IS NOT NULL;
-- Deze weer kloppend maken voor als je lokaal gaat testen
UPDATE fac_setting
SET fac_setting_pvalue =
(SELECT prs_perslid_apikey
FROM prs_perslid
WHERE prs_perslid_oslogin = '_PUTORDERS')
WHERE fac_setting_pvalue IS NOT NULL
AND fac_setting_name = 'puo_fclt_web_apikey';
DELETE FROM fac_imp_perslid;
-- Indien mogelijk de naam van contactpersoon overnemen van prs_perslid.
UPDATE prs_contactpersoon cp
SET prs_contactpersoon_naam =
( SELECT CASE WHEN c.prs_perslid_key IS NULL
THEN UPPER(SUBSTR(c.prs_contactpersoon_naam,1,1)) || DBMS_RANDOM.string('l', LENGTH(c.prs_contactpersoon_naam) -1)
ELSE SUBSTR(p.prs_perslid_naam, 1, 30)
END
FROM prs_contactpersoon c
, prs_perslid p
WHERE c.prs_perslid_key = p.prs_perslid_key(+)
AND c.prs_contactpersoon_key = cp.prs_contactpersoon_key
);
UPDATE prs_contactpersoon cp
SET cp.prs_contactpersoon_voornaam =
( SELECT CASE WHEN c.prs_perslid_key IS NULL
THEN UPPER(SUBSTR(c.prs_contactpersoon_voornaam,1,1) || DBMS_RANDOM.string('l', LENGTH(c.prs_contactpersoon_voornaam) -1))
ELSE p.prs_perslid_voornaam
END
FROM prs_contactpersoon c
, prs_perslid p
WHERE c.prs_perslid_key = p.prs_perslid_key(+)
AND c.prs_contactpersoon_key = cp.prs_contactpersoon_key
)
WHERE prs_contactpersoon_voornaam IS NOT NULL;
UPDATE prs_contactpersoon cp
SET prs_contactpersoon_voorletters =
( SELECT CASE WHEN c.prs_perslid_key IS NULL
THEN UPPER(SUBSTR(c.prs_contactpersoon_voornaam,1,1) || REGEXP_REPLACE(SUBSTR(c.prs_contactpersoon_voorletters,2),'[A-Z]', DBMS_RANDOM.string('l',1)))
ELSE SUBSTR(p.prs_perslid_voorletters, 1, 15)
END
FROM prs_contactpersoon c
, prs_perslid p
WHERE c.prs_perslid_key = p.prs_perslid_key(+)
AND c.prs_contactpersoon_key = cp.prs_contactpersoon_key
)
WHERE prs_contactpersoon_voorletters IS NOT NULL;
UPDATE prs_contactpersoon
SET prs_contactpersoon_email= 'EC' || TO_CHAR(prs_contactpersoon_key) || '@notexist.facilitor.nl'
WHERE prs_contactpersoon_email IS NOT NULL;
UPDATE bez_afspraak
SET bez_afspraak_gastheer = (SELECT SUBSTR(prs_perslid_naam_full,1,50)
FROM prs_v_perslid_fullnames_all
WHERE prs_perslid_key = bez_afspraak_host_key
)
WHERE bez_afspraak_host_key IS NOT NULL;
UPDATE bez_afspraak
SET bez_afspraak_gastheer = INITCAP (DBMS_RANDOM.string ('l', LENGTH (bez_afspraak_gastheer)))
WHERE bez_afspraak_host_key IS NULL;
UPDATE bez_bezoekers
SET bez_afspraak_naam = UPPER(SUBSTR(bez_afspraak_naam,1,1)) || '. Bezoeker'
WHERE bez_afspraak_naam IS NOT NULL
AND bez_afspraak_naam <> 'Anoniem';
UPDATE bez_bezoekers
SET bez_afspraak_bedrijf = UPPER(SUBSTR(bez_afspraak_bedrijf,1,1)) || 'areon B.V.'
WHERE bez_afspraak_bedrijf IS NOT NULL
AND bez_afspraak_bedrijf <> 'Anoniem';
-- Alleen de externe bedrijven
UPDATE prs_bedrijf
SET prs_bedrijf_naam = ano.naam(prs_bedrijf_naam, 10)
, prs_bedrijf_post_adres = ano.adres(prs_bedrijf_post_adres)
, prs_bedrijf_post_postcode = ano.postcode(prs_bedrijf_post_postcode)
, prs_bedrijf_bezoek_adres = ano.adres(prs_bedrijf_bezoek_adres)
, prs_bedrijf_bezoek_postcode = ano.postcode(prs_bedrijf_bezoek_postcode)
, prs_bedrijf_bezoek_plaats = ano.generic(prs_bedrijf_bezoek_plaats, 1)
, prs_bedrijf_telefoon = ano.telefoon(prs_bedrijf_telefoon)
, prs_bedrijf_telefoon2 = ano.telefoon(prs_bedrijf_telefoon2)
, prs_bedrijf_fax = ano.telefoon(prs_bedrijf_fax)
, prs_bedrijf_url = ano.generic(prs_bedrijf_url)
, prs_bedrijf_email = ano.email(prs_bedrijf_email)
, prs_bedrijf_contact_persoon = ano.naam(prs_bedrijf_contact_persoon)
, prs_bedrijf_contact_telefoon = ano.telefoon(prs_bedrijf_contact_telefoon)
, prs_bedrijf_contact_fax = ano.telefoon(prs_bedrijf_contact_fax)
WHERE prs_bedrijf_intern IS NULL;
UPDATE prs_bedrijfadres
SET prs_bedrijfadres_url = ano.email(prs_bedrijfadres_url)
, prs_bedrijfadres_username = ano.naam(prs_bedrijfadres_username)
, prs_bedrijfadres_password = NULL;
UPDATE aut_idp
SET aut_idp_secret = 'TEST_' || DBMS_RANDOM.string('a', 10)
WHERE aut_idp_secret IS NOT NULL
AND aut_idp_internal = 0;
UPDATE aut_sp
SET aut_sp_secret = 'TEST_' || DBMS_RANDOM.string('a', 10)
WHERE aut_sp_secret IS NOT NULL
AND aut_sp_internal = 0;
UPDATE mld_adres
SET mld_adres_bezoek_adres = ano.adres(mld_adres_bezoek_adres)
, mld_adres_bezoek_postcode = ano.postcode(mld_adres_bezoek_postcode)
, mld_adres_post_adres = ano.adres(mld_adres_post_adres)
, mld_adres_post_postcode = ano.postcode(mld_adres_post_postcode)
, mld_adres_contactpersoon = ano.naam(mld_adres_contactpersoon)
, mld_adres_contactpers_telefoon = ano.telefoon(mld_adres_contactpers_telefoon)
, mld_adres_contactpers_email = ano.email(mld_adres_contactpers_email)
, mld_adres_telefoon = ano.telefoon(mld_adres_telefoon)
, mld_adres_email = ano.email(mld_adres_email);
UPDATE mld_melding
SET mld_melding_naam_ext = ano.naam(mld_melding_naam_ext)
, mld_melding_email_ext = ano.email(mld_melding_email_ext)
, mld_melding_tel_ext = ano.telefoon(mld_melding_tel_ext);
UPDATE mld_disc_params
SET mld_disc_params_emailnw1 = ano.email(mld_disc_params_emailnw1)
, mld_disc_params_emailnw2 = ano.email(mld_disc_params_emailnw2)
, mld_disc_params_emailnw3 = ano.email(mld_disc_params_emailnw3)
, mld_disc_params_emailnw4 = ano.email(mld_disc_params_emailnw4)
, mld_disc_params_smsnw1 = ano.telefoon(mld_disc_params_smsnw1)
, mld_disc_params_smsnw2 = ano.telefoon(mld_disc_params_smsnw2)
, mld_disc_params_smsnw3 = ano.telefoon(mld_disc_params_smsnw3)
, mld_disc_params_smsnw4 = ano.telefoon(mld_disc_params_smsnw4)
WHERE mld_ins_discipline_key IN (SELECT ins_discipline_key
FROM mld_discipline);
ano.table_column('mld_opdr', 'mld_opdr_contactpersoon', 'naam');
ano.table_column('fin_verkoopfactuur', 'prs_debiteur_naam', 'naam');
ano.table_column('alg_gebouw', 'alg_gebouw_email', 'email');
ano.table_column('alg_locatie', 'alg_locatie_email', 'email');
ano.table_column('bez_bezoekers', 'bez_bezoekers_email', 'email');
ano.table_column('fac_notificatie', 'fac_notificatie_sender_email', 'email');
ano.table_column('fac_notificatie', 'fac_notificatie_receiver_email', 'email');
ano.table_column('ins_tab_discipline', 'ins_discipline_email', 'email');
ano.table_column('alg_locatie', 'alg_locatie_verantw_tel', 'telefoon');
ano.table_column('bez_afspraak', 'bez_afspraak_telefoonnr', 'telefoon');
ano.table_column('bez_bezoekers', 'bez_bezoekers_telefoon', 'telefoon');
ano.table_column('prs_contactpersoon', 'prs_contactpersoon_telefoon_1', 'telefoon');
ano.table_column('prs_contactpersoon', 'prs_contactpersoon_telefoon_2', 'telefoon');
ano.table_column('prs_perslid', 'prs_perslid_telefoonnr', 'telefoon');
ano.table_column('prs_perslid', 'prs_perslid_mobiel', 'telefoon');
DBMS_APPLICATION_INFO.SET_ACTION (NULL);
// Onderstaande heeft niets met anonimiseren te maken maar anonymizefull draait nogal eens
// na een import en dan is het altijd fijn om de mld_t_uitvoertijd te herstellen
adm.fix_mld_t_uitvoertijd();
END;
PROCEDURE anonymize (p_startdatum IN DATE,
p_einddatum IN DATE)
AS
BEGIN
anonymizebes(p_startdatum, p_einddatum);
anonymizebez(p_startdatum, p_einddatum);
anonymizefin(p_startdatum, p_einddatum);
anonymizemld(p_startdatum, p_einddatum);
anonymizeprs(p_startdatum, p_einddatum);
anonymizeres(p_startdatum, p_einddatum);
END;
PROCEDURE table_column(p_tabel IN VARCHAR2,
p_kolom IN VARCHAR2,
p_functie IN VARCHAR2)
AS
sql_str VARCHAR2(2000);
BEGIN
sql_str := 'UPDATE ' || p_tabel
|| ' SET ' || p_kolom || ' = ano.' || p_functie || '(' || p_kolom || ')'
|| ' WHERE ' || p_kolom || ' IS NOT NULL';
EXECUTE IMMEDIATE sql_str;
END;
FUNCTION postcode(postcode_veld IN VARCHAR2) RETURN VARCHAR2
IS
c VARCHAR2(1);
code VARCHAR2(15) := '';
BEGIN
IF (postcode_veld IS NOT NULL)
THEN
FOR i IN 1..LENGTH(SUBSTR(postcode_veld,1,15))
LOOP
c := SUBSTR(postcode_veld,i,1);
BEGIN
c := TO_CHAR(TO_NUMBER(c));
c := TO_CHAR(TRUNC(DBMS_RANDOM.value(0,10)));
EXCEPTION
WHEN VALUE_ERROR THEN
IF (c NOT IN (' ','-'))
THEN
c := DBMS_RANDOM.string('u',1);
END IF;
END;
code := code||c;
END LOOP;
END IF;
RETURN code;
END postcode;
FUNCTION telefoon(telefoon_veld IN VARCHAR2) RETURN VARCHAR2
IS
n NUMBER;
r NUMBER;
i NUMBER;
f VARCHAR2(5) := '+-_ *'; -- alleen deze laten we staan
tel VARCHAR2(30) := '';
c VARCHAR2(1);
BEGIN
IF (telefoon_veld IS NOT NULL)
THEN
n := DBMS_RANDOM.value(0,1);
tel := TO_CHAR(TRUNC(n * POWER(10,LENGTH(telefoon_veld))));
FOR r IN 0..3
LOOP
c := SUBSTR(f,r,1);
i := 1;
WHILE (INSTR(telefoon_veld, c, 1, i) > 0)
LOOP
tel := REGEXP_REPLACE(tel
,'(^.{'||(INSTR(telefoon_veld,c,1,i)-1)||'})(.{1})(.*)$'
,'\1'||c||'\3'
);
i := i + 1;
END LOOP;
END LOOP;
END IF;
RETURN tel;
END telefoon;
FUNCTION adres(adres_veld IN VARCHAR2) RETURN VARCHAR2
IS
c VARCHAR2(1);
adres VARCHAR2(100) := '';
BEGIN
IF (adres_veld IS NOT NULL)
THEN
FOR i IN 1..LENGTH(adres_veld)
LOOP
c := SUBSTR(adres_veld,i,1);
BEGIN
c := TO_CHAR(TO_NUMBER(c));
EXCEPTION
WHEN VALUE_ERROR THEN
IF (c <> ' ')
THEN
c := DBMS_RANDOM.string('l',1);
END IF;
END;
adres := adres||c;
END LOOP;
END IF;
RETURN INITCAP(adres);
END adres;
FUNCTION email(email_veld IN VARCHAR2) RETURN VARCHAR2
IS
c varchar2(1);
e varchar2(500) := '_';
a varchar2(500);
email varchar2(500) := '';
occ number;
BEGIN
email := email_veld;
IF (email IS NOT NULL)
THEN
occ := 0;
WHILE (e IS NOT NULL)
LOOP
occ := occ + 1;
SELECT REGEXP_SUBSTR(email, '([a-zA-Z0-9._+-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)', 1, occ)
INTO e
FROM dual;
IF (e IS NOT NULL)
THEN
a := '';
FOR i IN 1..LENGTH(e)
LOOP
c := SUBSTR(e, i, 1);
IF (c NOT IN ('.','@'))
THEN
c := DBMS_RANDOM.string('1',1);
END IF;
a := a || c;
END LOOP;
email := replace(email, e, a);
END IF;
END LOOP;
END IF;
RETURN email;
END email;
FUNCTION naam(naam_veld IN VARCHAR2, uniek IN NUMBER DEFAULT 0) RETURN VARCHAR2
IS
mx NUMBER := 60; -- Maximale lengte van naam_veld.
ca NUMBER := 0;
cx NUMBER := 0;
ci NUMBER;
nm VARCHAR2(200) := '';
BEGIN
IF (naam_veld IS NOT NULL)
THEN
ca := LENGTH(naam_veld);
ci := INSTR(naam_veld, '(', -1);
IF (SUBSTR(naam_veld, ca, 1) = ')' AND ci > 0)
THEN -- de naam bevat haakjes ()
cx := ca - ci + 1; -- - 1;
ca := ca - cx; -- - 2;
END IF;
ca := LEAST(GREATEST(ca, uniek), mx);
nm := UPPER(SUBSTR(naam_veld, 1, 1)) || DBMS_RANDOM.string('l', ca -1);
IF (cx > 0)
THEN
cx := GREATEST(LEAST(cx, (mx - ca)), 0);
nm := nm || '(' || DBMS_RANDOM.string('l', cx - 2) || ')';
END IF;
END IF;
RETURN nm;
END naam;
FUNCTION memo(memo_veld IN VARCHAR2) RETURN VARCHAR2
IS
memo VARCHAR2(4000) := '';
c VARCHAR2(1) := '';
r VARCHAR2(1);
BEGIN
IF (memo_veld IS NOT NULL)
THEN
FOR i IN 1..LENGTH(memo_veld)
LOOP
r := SUBSTR(memo_veld,i,1);
IF (r NOT IN (' ','.') )
THEN
c := DBMS_RANDOM.string('l',1);
IF (r = UPPER(r))
THEN
c := UPPER(c);
END IF;
ELSE
c := r;
END IF;
memo := memo||c;
END LOOP;
END IF;
RETURN memo;
END memo;
FUNCTION generic(veld IN VARCHAR2, fmt IN NUMBER DEFAULT 0) RETURN VARCHAR2
IS
BEGIN
-- fmt is wat formatting
-- 0 = niks
-- 1 = INITCAP
IF (veld IS NOT NULL)
THEN
IF fmt = 1
THEN
RETURN INITCAP(DBMS_RANDOM.string('l', LENGTH(veld)));
ELSE
RETURN DBMS_RANDOM.string('l', LENGTH(veld));
END IF;
ELSE
RETURN NULL;
END IF;
END generic;
END ano;
/
REGISTERRUN('$Id$')
#endif // ANO