#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
