#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 anonymize (p_startdatum IN DATE, p_einddatum IN DATE);
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'));

       -- 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')) 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 (-20000, 'ano_m001 Einddatum is te groot');
       END IF;

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

       -- Alle afspraken die tussen de startdatum en de einddatum liggen.
       CURSOR c_afspraak
       IS
            SELECT bez_afspraak_key
              FROM bez_afspraak
             WHERE bez_afspraak_datum 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 (-20000, 'ano_m001 Einddatum is te groot');
       END IF;

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

       -- 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')) 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 (-20000, 'ano_m001 Einddatum is te groot');
       END IF;

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

       -- 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 (-20000, 'ano_m001 Einddatum is te groot');
       END IF;

       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_init_upper = 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);
          END;
       END LOOP;
    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;

END ano;
/

REGISTERRUN('$Id$')

#endif // ANO
