#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 anonymizemld (p_startdatum IN DATE, p_einddatum IN DATE);
  PROCEDURE anonymizeprs (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;

       -- 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;

    BEGIN
       IF p_einddatum > SYSDATE - anonymize_period + 1
       THEN
         raise_application_error(-20001, 'ano_m001 Einddatum is te groot');
       END IF;

       v_count := 0;
       FOR rec_b IN c_bestelling
       LOOP
          -- Verwijder alle kenmerkwaarden van de bestelling waarvan het &8 (BITAND) bit 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);


          -- Verwijder alle kenmerkwaarden van de bestelopdrachten van de bestelling waarvan het &8 (BITAND) bit 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);

          -- 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;

          -- 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
             -- 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;

             -- Anonimiseren van de bestelopdracht tracken.
             fac.trackaction('BES2AN', rec_bo.bes_bestelopdr_key, NULL, NULL, NULL);
          END LOOP;

          IF v_count >= 1000
          THEN
             COMMIT;
             v_count := 0;
          ELSE
             v_count := v_count + 1;
          END IF;
       END LOOP;
    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;

       -- 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;
    BEGIN
       IF p_einddatum > SYSDATE - anonymize_period + 1
       THEN
         raise_application_error(-20001, 'ano_m001 Einddatum is te groot');
       END IF;

       v_count := 0;
       FOR rec IN c_afspraak
       LOOP
          -- Verwijder alle kenmerkwaarden van bezoekers van de afspraak waarvan het &8 (BITAND) bit van het bez_kenmerk.bez_kenmerk_systeem veld is gezet.
          DELETE FROM bez_kenmerkwaarde bkw
                WHERE bkw.bez_bezoekers_key IN (SELECT b.bez_bezoekers_key
                                                  FROM bez_bezoekers b
                                                 WHERE b.bez_afspraak_key = rec.bez_afspraak_key)
                  AND bkw.bez_kenmerk_key IN (SELECT bk.bez_kenmerk_key
                                                FROM bez_kenmerk bk
                                               WHERE bk.bez_kenmerk_key = bkw.bez_kenmerk_key
                                                 AND BITAND(bk.bez_kenmerk_systeem, 8) = 8);

          -- Anonimiseer alle bezoekers.
          UPDATE bez_bezoekers
             SET bez_afspraak_naam = bez_generic_visitor,
                 bez_afspraak_bedrijf = NULL,
                 bez_afspraak_opmerking = NULL,
                 bez_bezoekers_telefoon = NULL,
                 bez_bezoekers_email = NULL,
                 bez_bezoekers_kenteken = NULL
           WHERE bez_afspraak_key = rec.bez_afspraak_key;

          -- Anonimiseer alle afspraken.
          -- Door de trigger in de update wordt automatische de naam van de host in de gastheer geplakt.
          -- Daardoor wordt de lcl "Ganonimiseerd" in vele gevallen niet blijvend in de gasheer gezet.
          -- De persoon (prs record) moet daarom eerst aangepast worden.
          -- Tijdens het anonimiseren van de persoon wordt daarom de bez_afspraak_gastheer ook geanonimiseerd.
          -- In de gevallen dat er geen host wordt gebruikt en alleen tekst voor de persoon (gastheer) wordt ingevuld wordt het veld wel blijvend gezet.
          UPDATE bez_afspraak
             SET bez_afspraak_gastheer = bez_generic_visitor,
                 bez_afspraak_telefoonnr = NULL,
                 bez_afspraak_opmerking = NULL
           WHERE bez_afspraak_key = rec.bez_afspraak_key;

          -- Alle BEZ tracking anonimiseren m.b.t. de afspraak.
          UPDATE fac_tracking
             SET fac_tracking_oms = NULL
           WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
                                              FROM fac_srtnotificatie
                                             WHERE fac_srtnotificatie_xmlnode = 'afspraak'
                                               AND fac_srtnotificatie_code != 'BEZANO')
             AND fac_tracking_refkey = rec.bez_afspraak_key
             AND fac_tracking_oms IS NOT NULL;

          -- Alle BEZ tracking anonimiseren m.b.t. de bezoekers van de afspraak.
          UPDATE fac_tracking
             SET fac_tracking_oms = NULL
           WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key
                                              FROM fac_srtnotificatie
                                             WHERE fac_srtnotificatie_xmlnode = 'bezoeker')
             AND fac_tracking_refkey IN (SELECT bb.bez_bezoekers_key FROM bez_bezoekers bb WHERE bb.bez_afspraak_key = rec.bez_afspraak_key)
             AND fac_tracking_oms IS NOT NULL;

          -- Anonimiseren van de afspraak tracken.
          fac.trackaction('BEZANO', rec.bez_afspraak_key, NULL, NULL, NULL);

          IF v_count >= 1000
          THEN
             COMMIT;
             v_count := 0;
          ELSE
             v_count := v_count + 1;
          END IF;
       END LOOP;
    END;

    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;

       -- 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;

    BEGIN
       IF p_einddatum > SYSDATE - anonymize_period + 1
       THEN
         raise_application_error(-20001, 'ano_m001 Einddatum is te groot');
       END IF;

       v_count := 0;
       FOR rec_m IN c_melding
       LOOP
          -- Verwijder alle kenmerkwaarden van de melding waarvan het &8 (BITAND) bit 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);

          -- Verwijder alle kenmerkwaarden van de opdrachten van de melding waarvan het &8 (BITAND) bit van het mld_srtkenmerk.mld_srtkenmerk_systeem veld is gezet.
          DELETE FROM mld_kenmerkopdr mko
                WHERE mko.mld_opdr_key IN (SELECT mo.mld_opdr_key
                                             FROM mld_opdr mo
                                            WHERE mo.mld_melding_key = rec_m.mld_melding_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);

          -- 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;

          -- 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
             -- 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;

             -- Anonimiseren van de meldingsopdracht tracken.
             fac.trackaction('ORDANO', rec_o.mld_opdr_key, NULL, NULL, NULL);
          END LOOP;

          IF v_count >= 1000
          THEN
             COMMIT;
             v_count := 0;
          ELSE
             v_count := v_count + 1;
          END IF;
       END LOOP;
    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;

       -- 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;
    BEGIN
       IF p_einddatum > SYSDATE - anonymize_period + 1
       THEN
         raise_application_error(-20001, 'ano_m001 Einddatum is te groot');
       END IF;

       v_count := 0;
       FOR rec IN c_perslid
       LOOP
          BEGIN
             -- Verwijder alle kenmerkwaarden van de persoon waarvan het &8 (BITAND) bit 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.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);

             -- 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.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.prs_perslid_key;

             -- 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.prs_perslid_key
                AND fac_tracking_oms IS NOT 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.prs_perslid_key;

             -- Anonimiseren van de persoon tracken.
             fac.trackaction('PRSANO', rec.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;

    PROCEDURE anonymizefull(p_flags NUMBER DEFAULT 65535)
    AS
    BEGIN
        -- 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;

        UPDATE prs_perslid
           SET prs_perslid_wachtwoord_hash = null;

        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;

        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;

        EXECUTE IMMEDIATE 'ALTER TRIGGER bez_t_bez_afspraak_B_IU DISABLE';

            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;

        EXECUTE IMMEDIATE 'ALTER TRIGGER bez_t_bez_afspraak_B_IU ENABLE';

        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';

        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);

        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');
    END;

    PROCEDURE anonymize (p_startdatum IN DATE,
                         p_einddatum  IN DATE)
    AS
    BEGIN
       anonymizebes(p_startdatum, p_einddatum);
       anonymizebez(p_startdatum, p_einddatum);
       anonymizemld(p_startdatum, p_einddatum);
       anonymizeprs(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
