--
-- $Id$
--
-- Script containing customer specific sql statements for the FACILITOR database

DEFINE thisfile = 'VOLK.SQL'
DEFINE dbuser   = '^VOLK'
DEFINE custid   = 'VOLK'

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
WHENEVER SQLERROR EXIT;

SELECT adm.scriptspoolfile ('&dbuser', '&thisfile') AS fcltlogfile FROM DUAL;

WHENEVER SQLERROR CONTINUE;
SPOOL &fcltlogfile
SET DEFINE OFF

------ payload begin ------

CREATE OR REPLACE PROCEDURE volk_import_perslid (p_import_key IN NUMBER)
AS
    oracle_err_num     NUMBER;
    oracle_err_mes     VARCHAR2 (200);
    v_errormsg         VARCHAR2 (400);
    v_errorhint        VARCHAR2 (400);
    v_aantal_in_FCLT   NUMBER;
BEGIN
    v_errorhint := 'Generieke update';
    -- de sequence array staat beschreven in PRS_PAC.SRC bij de prs.import_perslid proc
    prs.import_perslid (
        p_import_key,
           '0;0;0;0;0;0;9;4;10;3;'
        || '8;0;0;0;0;5;0;12;0;1;'
        || '7;1;0;0;0;0;2;6;11;0;'
        || '0;0;0;0;0;0;0;0;0;0;'
        || '0;0;0;0;0;0',
        '%"CentralAccount";"CostCenter";"FirstName";"LastName";"TelephoneNumber";"UserPrincipalName";"DepartmentName";"Initials";"DepartmentCode";"NameAddOn";"Rights";"Email"%');
    --  "CentralAccount(20)";"CostCenter(27)";"FirstName(10)";"LastName(8)";"TelephoneNumber(16)";"UserPrincipalName(28)";"DepartmentName(21)";"Initials(11)";"DepartmentCode(7)";"NameAddOn(9)";"Rights(29)";"Email(18)"
    --  Kenmerk 1: CostCenter. Kan eventueel later gebruikt worden om de OE te bepalen als alleen hoofdgroepen gebruikt gaan worden
    --  Kenmerk 2: UserPrincipalName wordt nog niet gebruikt
    --  Kenmerk 3: Rights. Dit zijn de rollen die iemand moet krijgen

    COMMIT;

    -- Beleid bij de Volksbank: in cloud applicaties moet gekoppeld worden op UserPrincipalName
    -- Personen zonder UserPrincipalName nemen we dus niet mee
    DELETE fac_imp_perslid
     WHERE prs_kenmerk2 IS NULL;

    /* 57846: User identification is not unique, oslogin kan niet op basis van mailadres daarom op perslidnr
    -- prs oslogin hier nemen we het eerste gedeelte van de UPN, volledig UserPrincipalName is te lang
    -- kan tot maximaal 30 posities
    UPDATE fac_imp_perslid
       SET prs_perslid_oslogin =
               SUBSTR (
                   (SUBSTR (prs_kenmerk2, 1, (INSTR (prs_kenmerk2, '@') - 1))),
                   1,
                   30);
    */               

    -- functie wordt niet gebruikt, dus deze wordt altijd 'onbekend'
    UPDATE fac_imp_perslid
       SET prs_srtperslid_omschrijving = 'onbekend';

    -- De rollen die in kenmerk3 zijn gezet splitsen we uit, aanname is dat iemand max. 5 rollen heeft
    -- We vullen de kenmerken 10 tm 14 met de rollen
    UPDATE fac_imp_perslid p
       SET p.PRS_KENMERK10 =
               DECODE (NULLIF (INSTR (p.PRS_KENMERK3,
                                      ',',
                                      1,
                                      1),
                               0),
                       NULL, p.prs_kenmerk3,
                       SUBSTR (prs_kenmerk3,
                               1,
                                 (INSTR (p.PRS_KENMERK3,
                                         ',',
                                         1,
                                         1))
                               - 1)),
           p.PRS_KENMERK11 =
               CASE
                   WHEN NULLIF (INSTR (p.PRS_KENMERK3,
                                       ',',
                                       1,
                                       1),
                                0)
                            IS NOT NULL
                   THEN
                       DECODE (
                           NULLIF (INSTR (p.PRS_KENMERK3,
                                          ',',
                                          1,
                                          2),
                                   0),
                           NULL, SUBSTR (prs_kenmerk3,
                                         INSTR (p.PRS_KENMERK3, ',', 2) + 1),
                           SUBSTR (prs_kenmerk3,
                                   (  INSTR (p.PRS_KENMERK3,
                                             ',',
                                             1,
                                             1)
                                    + 1),
                                   (  INSTR (p.PRS_KENMERK3,
                                             ',',
                                             1,
                                             2)
                                    - INSTR (p.PRS_KENMERK3,
                                             ',',
                                             1,
                                             1)
                                    - 1)))
               END,
           p.PRS_KENMERK12 =
               CASE
                   WHEN NULLIF (INSTR (p.PRS_KENMERK3,
                                       ',',
                                       1,
                                       2),
                                0)
                            IS NOT NULL
                   THEN
                       DECODE (NULLIF (INSTR (p.PRS_KENMERK3,
                                              ',',
                                              1,
                                              3),
                                       0),
                               NULL, SUBSTR (prs_kenmerk3,
                                               INSTR (p.PRS_KENMERK3,
                                                      ',',
                                                      1,
                                                      2)
                                             + 1),
                               SUBSTR (prs_kenmerk3,
                                       (  INSTR (p.PRS_KENMERK3,
                                                 ',',
                                                 1,
                                                 2)
                                        + 1),
                                       (  INSTR (p.PRS_KENMERK3,
                                                 ',',
                                                 1,
                                                 3)
                                        - INSTR (p.PRS_KENMERK3,
                                                 ',',
                                                 1,
                                                 2)
                                        - 1)))
               END,
           p.PRS_KENMERK13 =
               CASE
                   WHEN NULLIF (INSTR (p.PRS_KENMERK3,
                                       ',',
                                       1,
                                       3),
                                0)
                            IS NOT NULL
                   THEN
                       DECODE (NULLIF (INSTR (p.PRS_KENMERK3,
                                              ',',
                                              1,
                                              4),
                                       0),
                               NULL, SUBSTR (prs_kenmerk3,
                                               INSTR (p.PRS_KENMERK3,
                                                      ',',
                                                      1,
                                                      3)
                                             + 1),
                               SUBSTR (prs_kenmerk3,
                                       (  INSTR (p.PRS_KENMERK3,
                                                 ',',
                                                 1,
                                                 3)
                                        + 1),
                                       (  INSTR (p.PRS_KENMERK3,
                                                 ',',
                                                 1,
                                                 4)
                                        - INSTR (p.PRS_KENMERK3,
                                                 ',',
                                                 1,
                                                 3)
                                        - 1)))
               END,
           p.PRS_KENMERK14 =
               CASE
                   WHEN NULLIF (INSTR (p.PRS_KENMERK3,
                                       ',',
                                       1,
                                       4),
                                0)
                            IS NOT NULL
                   THEN
                       DECODE (NULLIF (INSTR (p.PRS_KENMERK3,
                                              ',',
                                              1,
                                              5),
                                       0),
                               NULL, SUBSTR (prs_kenmerk3,
                                               INSTR (p.PRS_KENMERK3,
                                                      ',',
                                                      1,
                                                      4)
                                             + 1),
                               SUBSTR (prs_kenmerk3,
                                       (  INSTR (p.PRS_KENMERK3,
                                                 ',',
                                                 1,
                                                 4)
                                        + 1),
                                       (  INSTR (p.PRS_KENMERK3,
                                                 ',',
                                                 1,
                                                 5)
                                        - INSTR (p.PRS_KENMERK3,
                                                 ',',
                                                 1,
                                                 4)
                                        - 1)))
               END;

    COMMIT;
EXCEPTION
    WHEN OTHERS
    THEN
        oracle_err_num := SQLCODE;
        oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
        v_errormsg := 'Error ' || oracle_err_num || '/' || oracle_err_mes;
        fac.imp_writelog (p_import_key,
                          'E',
                          v_errormsg,
                          v_errorhint);
END volk_import_perslid;
/

CREATE OR REPLACE PROCEDURE volk_update_autorisaties (p_import_key IN NUMBER)
AS
    -- Gebruikers met rechten anders dan de bijzondere groepen die met _ gemarkeerd zijn
    -- Maar die in de import niet meer die rechten mee krijgen
    -- Dan moeten die rechten weer verwijderd worden
    CURSOR c_perslid_autorisatie_verw IS
        SELECT oud.*
          FROM (SELECT gg.fac_groep_key,
                       fac_groep_omschrijving,
                       p.prs_perslid_key,
                       pf.prs_perslid_naam_full
                  FROM fac_gebruikersgroep          gg,
                       fac_groep                    g,
                       prs_perslid                  p,
                       prs_v_perslid_fullnames_all  pf
                 WHERE     gg.fac_groep_key = g.fac_groep_key
                       AND gg.prs_perslid_key = p.prs_perslid_key
                       AND p.prs_perslid_key = pf.prs_perslid_key
                       AND UPPER (g.fac_groep_omschrijving) <> '_DEFAULT'
                       AND p.prs_perslid_oslogin NOT LIKE '%\_%' ESCAPE '\')
               oud
               LEFT OUTER JOIN
               (SELECT groep.*
                  FROM (SELECT i.prs_perslid_key,
                               groep1.fac_groep_key,
                               groep1.fac_groep_omschrijving
                          FROM fac_imp_perslid  i,
                               (SELECT *
                                  FROM fac_groep g) groep1
                         WHERE UPPER (i.PRS_KENMERK10) =
                               groep1.fac_groep_upper(+)
                        UNION ALL
                        SELECT i.prs_perslid_key,
                               groep2.fac_groep_key,
                               groep2.fac_groep_omschrijving
                          FROM fac_imp_perslid  i,
                               (SELECT *
                                  FROM fac_groep g) groep2
                         WHERE UPPER (i.PRS_KENMERK11) =
                               groep2.fac_groep_upper(+)
                        UNION ALL
                        SELECT i.prs_perslid_key,
                               groep3.fac_groep_key,
                               groep3.fac_groep_omschrijving
                          FROM fac_imp_perslid  i,
                               (SELECT *
                                  FROM fac_groep g) groep3
                         WHERE UPPER (i.PRS_KENMERK12) =
                               groep3.fac_groep_upper(+)
                        UNION ALL
                        SELECT i.prs_perslid_key,
                               groep4.fac_groep_key,
                               groep4.fac_groep_omschrijving
                          FROM fac_imp_perslid  i,
                               (SELECT *
                                  FROM fac_groep g) groep4
                         WHERE UPPER (i.PRS_KENMERK13) =
                               groep4.fac_groep_upper(+)
                        UNION ALL
                        SELECT i.prs_perslid_key,
                               groep5.fac_groep_key,
                               groep5.fac_groep_omschrijving
                          FROM fac_imp_perslid  i,
                               (SELECT *
                                  FROM fac_groep g) groep5
                         WHERE UPPER (i.PRS_KENMERK14) =
                               groep5.fac_groep_upper(+)) groep
                 WHERE     groep.prs_perslid_key IS NOT NULL
                       AND groep.fac_groep_key IS NOT NULL
                       AND UPPER (groep.fac_groep_omschrijving) <> '_DEFAULT')
               nieuw
                   ON     oud.prs_perslid_key = nieuw.prs_perslid_key
                      AND oud.fac_groep_key = nieuw.fac_groep_key
         WHERE nieuw.fac_groep_key IS NULL;

    CURSOR c_persid_autorisatiegroep IS
        SELECT prs.prs_perslid_naam_full, groep.*
          FROM (SELECT i.prs_perslid_key,
                       groep1.fac_groep_key,
                       groep1.fac_groep_omschrijving
                  FROM fac_imp_perslid  i,
                       (SELECT *
                          FROM fac_groep g) groep1
                 WHERE UPPER (i.PRS_KENMERK10) = groep1.fac_groep_upper(+)
                UNION ALL
                SELECT i.prs_perslid_key,
                       groep2.fac_groep_key,
                       groep2.fac_groep_omschrijving
                  FROM fac_imp_perslid  i,
                       (SELECT *
                          FROM fac_groep g) groep2
                 WHERE UPPER (i.PRS_KENMERK11) = groep2.fac_groep_upper(+)
                UNION ALL
                SELECT i.prs_perslid_key,
                       groep3.fac_groep_key,
                       groep3.fac_groep_omschrijving
                  FROM fac_imp_perslid  i,
                       (SELECT *
                          FROM fac_groep g) groep3
                 WHERE UPPER (i.PRS_KENMERK12) = groep3.fac_groep_upper(+)
                UNION ALL
                SELECT i.prs_perslid_key,
                       groep4.fac_groep_key,
                       groep4.fac_groep_omschrijving
                  FROM fac_imp_perslid  i,
                       (SELECT *
                          FROM fac_groep g) groep4
                 WHERE UPPER (i.PRS_KENMERK13) = groep4.fac_groep_upper(+)
                UNION ALL
                SELECT i.prs_perslid_key,
                       groep5.fac_groep_key,
                       groep5.fac_groep_omschrijving
                  FROM fac_imp_perslid  i,
                       (SELECT *
                          FROM fac_groep g) groep5
                 WHERE UPPER (i.PRS_KENMERK14) = groep5.fac_groep_upper(+))
               groep,
               PRS_V_PERSLID_FULLNAMES_ALL  prs
         WHERE     prs.prs_perslid_key = groep.prs_perslid_key
               AND groep.prs_perslid_key IS NOT NULL
               AND groep.fac_groep_key IS NOT NULL
               AND UPPER (groep.fac_groep_omschrijving) <> '_DEFAULT'
               AND NOT EXISTS
                       (SELECT fac_gebruikersgroep_key
                          FROM fac_gebruikersgroep gg
                         WHERE     gg.prs_perslid_key = groep.prs_perslid_key
                               AND fac_groep_key = groep.fac_groep_key);
BEGIN
    FOR rc IN c_perslid_autorisatie_verw
    LOOP
        BEGIN
            DELETE fac_gebruikersgroep gg
             WHERE     gg.fac_groep_key = rc.fac_groep_key
                   AND gg.prs_perslid_key = rc.prs_perslid_key;
        EXCEPTION
            WHEN OTHERS
            THEN
                fac.imp_writelog (
                    p_import_key,
                    'W',
                       'Post update autorisaties bij persoon: '
                    || rc.fac_groep_omschrijving
                    || ' is NIET verwijderd,',
                    'Naam:' || rc.prs_perslid_naam_full);
        END;

        COMMIT;
    END LOOP;

    FOR rc IN c_persid_autorisatiegroep
    LOOP
        BEGIN
            INSERT INTO fac_gebruikersgroep (prs_perslid_key, fac_groep_key)
                 VALUES (rc.prs_perslid_key, rc.fac_groep_key);
        EXCEPTION
            WHEN OTHERS
            THEN
                fac.imp_writelog (
                    p_import_key,
                    'W',
                       'Post update autorisaties bij persoon'
                    || rc.prs_perslid_key
                    || ' is NIET volledig uitgevoerd',
                    'Naam:' || rc.prs_perslid_naam_full);
        END;

        COMMIT;
    END LOOP;
END;
/

CREATE OR REPLACE PROCEDURE volk_update_perslid (p_import_key IN NUMBER)
IS
    v_ruimte_key   NUMBER;
    v_virtual      NUMBER;
    v_alg_type     VARCHAR2 (20);
    v_count        NUMBER;

    CURSOR c_perslid IS
        SELECT *
          FROM fac_imp_perslid
         WHERE prs_perslid_key IS NOT NULL;

    -- Alle medewerkers van de Volksbank verwijderen die niet meer in import bestand voorkomen.
    CURSOR c_del IS
        SELECT p.prs_perslid_key,
               p.prs_perslid_oslogin,
               pf.prs_perslid_naam_full
          FROM prs_perslid p, prs_v_perslid_fullnames_all pf
         WHERE     pf.prs_perslid_key = p.prs_perslid_key
               AND p.prs_perslid_oslogin IS NOT NULL
               AND p.prs_perslid_verwijder IS NULL
               AND p.prs_perslid_oslogin NOT LIKE '%\_%' ESCAPE '\'
               AND NOT EXISTS
                       (SELECT *
                          FROM fac_imp_perslid i
                         WHERE UPPER (i.prs_perslid_oslogin) =
                               UPPER (p.prs_perslid_oslogin));
BEGIN
    -- generic update
    SELECT COUNT (*) INTO v_count FROM fac_imp_perslid;

    IF v_count < 1000
    THEN
        fac.imp_writelog (
            p_import_key,
            'E',
               'Het aantal te importeren personen is te klein ('
            || TO_CHAR (v_count)
            || ')',
            'Zie Specificatie');
        RETURN;
    END IF;

    -- 'NR' betekent dat op basis van Login wordt gematched.
    prs.update_perslid (p_import_key, 'NR', NULL);

    volk_update_autorisaties (p_import_key);

    COMMIT;

    -- Verwijder personen die niet meer in de import voorkomen.
    FOR rec IN c_del
    LOOP
        BEGIN
            prs.delete_perslid (p_import_key, rec.prs_perslid_key);
        END;
    END LOOP;

    COMMIT;

    -- er is een virtuele default werkplek waar alle medewerkers opgezet moeten worden
    -- dit ivm een autorisatiescope op locaties
    SELECT alg_ruimte_key
      INTO v_ruimte_key
      FROM ALG_RUIMTE
     WHERE UPPER (alg_ruimte_omschrijving) LIKE 'VIRTUELE WERKPLEK%';

    v_virtual := 1;
    v_alg_type := '';

    FOR rec IN c_persLid
    LOOP
        BEGIN
            prs.movetoruimte (rec.prs_perslid_key,
                              v_ruimte_key,
                              v_alg_type,
                              v_virtual);
        END;
    END LOOP;
END volk_update_perslid;
/

CREATE OR REPLACE VIEW VOLK_V_RAPP_MLD_WINKELS
(
    DATUM,
    HTML_AANVRAAG_NR,
    MELDINGNR,
    LOCATIE,
    GEBOUW,
    MELDER,
    MELDING,
    STATUS,
    ONDERWERP,
    OMSCHRIJVING
)
AS
    SELECT melding_datum,
              '<a class="details" onclick=''FcltMgr.openDetail("'
           || 'appl/mld/mld_melding.asp?urole=fe&'
           || 'mld_key='
           || MELDING_KEY
           || '")''>'
           || HTF.escape_sc (meldingnummer)
           || '</a>'    meldingnummer,
           melding_key,
           melding_locatie,
           melding_gebouw,
           melder,
           subproductgroep,
           melding_status,
           onderwerp,
           vomschrijving
      FROM MLD_V_UDR_MELDING m
     WHERE UPPER (soortmelding) LIKE '%WINKEL%';

CREATE OR REPLACE VIEW VOLK_V_RAPP_TRACKING_UITLEEN
(
    INS_DEEL_KEY,
    OBJECT_OMSCHRIJVING,
    DATUM,
    DATUM_TIJD,
    TRACKING,
    OMSCHRIJVING
)
AS
      SELECT d.ins_deel_key,
             d.ins_deel_omschrijving,
             TRUNC (t.fac_tracking_datum)
                 periode,
             t.fac_tracking_datum,
             DECODE (t.fac_srtnotificatie_key,
                     124, 'Uitgegeven door: ' || p.prs_perslid_naam_friendly,
                     125, 'Ingenomen door: ' || p.prs_perslid_naam_friendly)
                 tracking,
             DECODE (
                 t.fac_srtnotificatie_key,
                 124, (DECODE (
                           naam_cnt.ins_kenmerkdeel_waarde,
                           NULL, t.fac_tracking_oms,
                              'Object '
                           || d.ins_deel_omschrijving
                           || ' is uitgegeven aan '
                           || naam_cnt.ins_kenmerkdeel_waarde)),
                 t.fac_tracking_oms)
                 tracking_omschr
        FROM fac_tracking               t,
             ins_deel                   d,
             prs_v_perslid_fullnames_all p,
             (SELECT ins_deel_key, ins_kenmerkdeel_waarde
                FROM ins_kenmerkdeel kd
               WHERE ins_kenmerk_key = 2 AND ins_kenmerkdeel_verwijder IS NULL)
             naam_cnt,
             (SELECT ins_deel_key, ins_kenmerkdeel_waarde
                FROM ins_kenmerkdeel kd
               WHERE ins_kenmerk_key = 3 AND ins_kenmerkdeel_verwijder IS NULL)
             telnr_cnt
       WHERE     fac_tracking_refkey = d.ins_deel_key
             AND t.prs_perslid_key = p.prs_perslid_key
             AND naam_cnt.ins_deel_key(+) = d.ins_deel_key
             AND telnr_cnt.ins_deel_key(+) = d.ins_deel_key
             AND t.fac_tracking_oms IS NOT NULL
             AND d.ins_srtdeel_key IN (41,
                                       42,
                                       43,
                                       44)               -- passen en sleutels
             AND fac_srtnotificatie_key IN (124, 125) -- uitgifte (insout) en inname (insinn)
    ORDER BY ins_deel_key, t.fac_tracking_datum;

CREATE OR REPLACE VIEW VOLK_V_NOTI_BEZOEKERS
(
    SENDER,
    RECEIVER,
    TEXT,
    CODE,
    FAC_SRTNOTIFICATIE_KEY,
    KEY,
    XKEY,
    XEMAIL,
    XMOBILE
)
AS
    SELECT DISTINCT
       NULL                  sender,
       NULL                  receiver,
       DECODE (
           t.fac_srtnotificatie_key,
           30,    'Nieuwe bezoekersregistratie voor '
               || b.BEZOEK_VAN
               || ', nummer: '
               || b.afspraak_key
               || ', gastheer: '
               || b.HOST,
           31,    'Wijziging in bezoekersregistratie voor '
               || b.BEZOEK_VAN
               || ', nummer: '
               || b.afspraak_key
               || ', gastheer: '
               || b.HOST)    TEXT,
       sn.fac_srtnotificatie_code,
       sn.fac_srtnotificatie_key,
       b.afspraak_key,
       NULL                  xkey,
       ud.fac_usrdata_omschr,
       NULL                  xmobile
  FROM fac_tracking        t,
       bez_v_udr_bezoeker  b,
       alg_locatie         l,
       fac_usrdata         ud,
       fac_srtnotificatie  sn
 WHERE     t.fac_tracking_refkey = b.afspraak_key
       AND t.fac_srtnotificatie_key IN (30, 31) --- BEZMUT, registreren nieuwe afspraak en BEZUPD, wijzigen afspraak
       AND sn.fac_srtnotificatie_code = 'CUST01'
       AND t.fac_tracking_refkey = b.afspraak_key
       AND b.fclt_3d_locatie_key = l.alg_locatie_key
       AND ud.fac_usrdata_code = l.alg_locatie_code
       AND ud.fac_usrtab_key = 141 --- bezoekersmutaties van het afgelopen uur
       AND t.fac_tracking_datum >
           (SELECT   fac_notificatie_job_nextrun
                   - fac_notificatie_job_interval / 24
              FROM fac_notificatie_job
             WHERE UPPER (fac_notificatie_job_view) = 'VOLK_V_NOTI_BEZOEKERS')
       AND t.fac_tracking_datum <
           (SELECT fac_notificatie_job_nextrun
              FROM fac_notificatie_job
             WHERE UPPER (fac_notificatie_job_view) = 'VOLK_V_NOTI_BEZOEKERS');

CREATE OR REPLACE VIEW VOLK_V_RAPP_BEDRIJF_DIENST
(
    bedrijf_naam,
    prs_bedrijf_key,
    dienst,
    locatie
)
AS
    SELECT b.prs_bedrijf_naam, scope.*
      FROM prs_bedrijf  b,
           (SELECT bdl.prs_bedrijf_key,
                   d.prs_dienst_omschrijving,
                   NVL (
                       NVL (l.alg_locatie_omschrijving,
                            g.ALG_GEBOUW_OMSCHRIJVING),
                       'Alle locaties')    locatie
              FROM prs_bedrijfdienstlocatie  bdl,
                   prs_dienst                d,
                   alg_locatie               l,
                   alg_gebouw                g
             WHERE     bdl.prs_dienst_key = d.prs_dienst_key(+)
                   AND bdl.alg_gebouw_key = g.alg_gebouw_key(+)
                   AND bdl.alg_locatie_key = l.alg_locatie_key(+)) scope
     WHERE b.prs_bedrijf_key = scope.prs_bedrijf_key;

-- De bron view met gegevens over bezoekers die een parkeerplaats moeten krijgen vandaag of morgen
CREATE OR REPLACE VIEW VOLK_V_EXP_FIRMBASE
(
    BEZ_BEZOEKER_KEY,
    BEZ_AFSPRAAK_KEY,
    BEZ_STARTDATUM,
    BEZ_EINDDATUM,
    FIRMBASE_RESPONSE,
    KENTEKEN,
    LANDCODE,
    VISITOR_PROFILE,
    VISITOR_ID,
    BEZOEKER_NAAM
)
AS
    SELECT b.bez_bezoekers_key,
           a.bez_afspraak_key,
           a.bez_afspraak_datum,
           a.bez_afspraak_eind,
           firmb.bez_kenmerkwaarde_waarde        AS firmbase_resp, --- KOMT ER EEN KEY TERUG OF KAN IK HIER RESPONS CODE IN TERUGZETTEN?
           REPLACE (REPLACE (kenteken.kenteken, '-', ''), ' ', ''),
           'NL'                AS landcode,
           'VBank',
           guid.bez_kenmerkwaarde_waarde         AS guid,
           b.bez_afspraak_naam                   AS bezoeker_naam
      FROM bez_afspraak   a,
           bez_bezoekers  b,
           alg_locatie    l,
           (SELECT rd.bez_bezoekers_key, d.*
              FROM res_rsv_deel rd, res_v_ins_deel d, ins_srtdeel o
             WHERE     rd.res_deel_key = d.res_deel_key
                   AND d.ins_srtdeel_key = o.ins_srtdeel_key
                   AND ins_srtdeel_upper LIKE 'PARKEERPLAATS%') park,
           (SELECT kw.bez_bezoekers_key, bez_kenmerkwaarde_waarde
              FROM bez_kenmerkwaarde kw, bez_kenmerk k
             WHERE     k.bez_kenmerk_key = kw.bez_kenmerk_key
                   AND k.bez_kenmerk_upper = 'FIRMBASE RESPONSE') firmb,
           (SELECT kw.bez_bezoekers_key, UPPER (bez_kenmerkwaarde_waarde) kenteken
              FROM bez_kenmerkwaarde kw, bez_kenmerk k
             WHERE     k.bez_kenmerk_key = kw.bez_kenmerk_key
                   AND k.bez_kenmerk_upper = 'KENTEKEN') kenteken,
           (SELECT kw.bez_bezoekers_key, bez_kenmerkwaarde_waarde
              FROM bez_kenmerkwaarde kw, bez_kenmerk k
             WHERE     k.bez_kenmerk_key = kw.bez_kenmerk_key
                   AND k.bez_kenmerk_upper = 'VISITORID') guid
     WHERE     b.bez_afspraak_key = a.bez_afspraak_key
           AND b.bez_bezoekers_key = park.bez_bezoekers_key
           AND a.alg_locatie_key = l.alg_locatie_key
           AND l.alg_locatie_key = 104       ---  alleen Utrecht groot kantoor
           AND firmb.bez_bezoekers_key(+) = b.bez_bezoekers_key
           AND kenteken.bez_bezoekers_key(+) = b.bez_bezoekers_key
           AND guid.bez_bezoekers_key(+) = b.bez_bezoekers_key
           AND a.bez_afspraak_datum < TRUNC (SYSDATE) + 2
           AND a.bez_afspraak_datum > TRUNC (SYSDATE) - 1;

-- !!!!!!!!!!!!!!!!!! tijdelijke view omdat de mail uitgevallen is. !!!!!!!!!!!!!!!!!!!!!!
CREATE OR REPLACE VIEW volk_v_rap_bezoekers_mutatie
AS
    SELECT DISTINCT
           DECODE (t.fac_srtnotificatie_key,  30, 'Nieuw',  31, 'Wijziging')
               status,
           a.bez_afspraak_key
               nummer,
           contact.prs_perslid_naam_full
               contactpersoon,
           HOST.prs_perslid_naam_full
               gastheer,
           l.alg_locatie_omschrijving
               --          locatie,
               --      ud.fac_usrdata_omschr
               email,
           b.bez_afspraak_naam
               bezoeker,
           b.bez_afspraak_bedrijf
               bedrijf,
           a.bez_afspraak_datum
               van,
           a.bez_afspraak_eind
               tot,
           (SELECT bez_kenmerkwaarde_waarde
              FROM bez_kenmerkwaarde kw, bez_kenmerk k
             WHERE     k.bez_kenmerk_key = kw.bez_kenmerk_key
                   AND kw.bez_bezoekers_key = b.bez_bezoekers_key
                   AND k.bez_kenmerk_upper = 'KENTEKEN')
               kenteken,
           (SELECT COUNT (*)
              FROM res_rsv_deel rrd
             WHERE rrd.bez_bezoekers_key = b.bez_bezoekers_key)
               parkeerplaats,
           fac_tracking_datum
               wijziging
      FROM fac_tracking             t,
           bez_bezoekers            b,
           bez_afspraak             a,
           alg_locatie              l,
           --    fac_usrdata              ud,
           fac_srtnotificatie       sn,
           prs_v_perslid_fullnames  contact,
           prs_v_perslid_fullnames  HOST
     WHERE     a.bez_afspraak_key = b.bez_afspraak_key
           AND t.fac_tracking_refkey = a.bez_afspraak_key
           AND t.fac_srtnotificatie_key IN (30, 31) --- BEZMUT, registreren nieuwe afspraak en BEZUPD, wijzigen afspraak
           AND sn.fac_srtnotificatie_code = 'CUST01'
           AND t.fac_tracking_refkey = a.bez_afspraak_key
           AND a.alg_locatie_key = l.alg_locatie_key
           --   AND ud.fac_usrdata_code = l.alg_locatie_code
           AND a.bez_afspraak_host_key = HOST.prs_perslid_key
           AND a.bez_afspraak_contact_key = contact.prs_perslid_key
           --     AND ud.fac_usrtab_key = 141 --- bezoekersmutaties van het afgelopen uur
           AND t.fac_tracking_datum >
               TO_DATE ('20190423 16:00', 'yyyymmdd hh24:mi');

-- Procedure om de bezoekers met een parkeerplaats klaar te zetten voor de export
CREATE OR REPLACE PROCEDURE VOLK_SELECT_FIRMBASE (p_applname   IN VARCHAR2,
                                                  p_applrun    IN VARCHAR2)
AS
    v_rap_count       NUMBER;
    v_visitor_id      VARCHAR (100);
    v_kenmerk_visid   NUMBER;

    v_aanduiding      VARCHAR2 (200);
    v_errorhint       VARCHAR2 (1000);
    v_errormsg        VARCHAR2 (1000);
    oracle_err_num    NUMBER;
    oracle_err_mes    VARCHAR2 (200);
    v_count           NUMBER;

    -- Firmbase koppeling bestaat uit 3 verschillende onderdelen:
    -- Insert Visitor, Update Visitor, Cancel Visitor

    -- Stap 1: Insert Visitor
    -- Selectcriteria: alle bezoekers uit volk_v_exp_firmbase die nog niet in de tabel met Firmbase registraties staan
    -- Of eigenlijk ook: nog geen visitor_id hebben
    CURSOR IV IS
        SELECT p.*
          FROM volk_v_exp_firmbase p
         WHERE     p.visitor_id IS NULL
               AND p.bez_bezoeker_key NOT IN
                       (SELECT f.bez_bezoeker_key
                          FROM volk_registraties_firmbase f);


    -- Stap 2: Update Visitor
    -- Er ontstaat verschil in kentekens tussen de VOLK eigen tabel en bez. tabel
    -- Selectcriteria: alle bezoekers uit volk_v_exp_firmbase met Firmbase key waarbij kenteken afwijkt van de gegevens uit VOLK tabel
    -- De nieuwe gegevens worden geexporteerd en de eigen tabel wordt bijgewerkt
    CURSOR UV IS
        SELECT p.*
          FROM volk_v_exp_firmbase p, volk_registraties_firmbase f
         WHERE     p.bez_bezoeker_key = f.bez_bezoeker_key
               AND NVL (p.kenteken, 'KL') <> NVL (f.kenteken, 'KL');


    -- Stap 3: Cancel Visitor
    -- De bezoekersregistratie staat wel in de eigen tabel maar niet in de bez. tabel (bezoeker (en evt ook afspraak) is verwijderd)
    -- Bezoekers uit het verleden kijken we niet naar, die staan sowieso niet in de view
    -- LET OP: ook bij het wijzigen van datum/tijd van de afspraak moet eerst een delete en dan een nieuwe insert gedaan worden
    -- Selectcriteria: alle bezoekers uit VOLK eigen tabel die niet meer voorkomen in volk_v_exp_firmbase
    -- Of bezoekers uit VOLK eigen tabel waarbij begin en/of eindtijd afwijkt van de informatie uit de standaard tabel
    -- Er wordt een delete visitor gestuurd en het record wordt uit de eigen tabel verwijderd
    CURSOR CV IS
        SELECT f.*
          FROM volk_registraties_firmbase f
         WHERE f.bez_startdatum > TRUNC(SYSDATE - 1) 
          AND f.visitor_id NOT IN (SELECT v.visitor_id
                                      FROM volk_v_exp_firmbase v)
        UNION ALL
        SELECT f.*
          FROM volk_registraties_firmbase f, volk_v_exp_firmbase v
         WHERE     f.visitor_id = v.visitor_id
               AND (   f.bez_startdatum <> v.bez_startdatum
                    OR f.bez_einddatum <> v.bez_einddatum);
BEGIN
    DELETE imp_log
     WHERE imp_log_applicatie = p_applname;

    DELETE fac_rapport
     WHERE fac_rapport_node = p_applname;

    v_rap_count := 0;

    SELECT k.bez_kenmerk_key
      INTO v_kenmerk_visid
      FROM bez_kenmerk k
     WHERE k.bez_kenmerk_upper = 'VISITORID';

    FOR rec IN UV
    LOOP
        v_rap_count := v_rap_count + 1;
        v_aanduiding :=
               v_rap_count
            || ': '
            || rec.bez_afspraak_key
            || '/'
            || rec.bez_bezoeker_key;
        v_errormsg := 'Exportregel update visitor Firmbase aanmaken';

        INSERT INTO fac_rapport (fac_rapport_node,
                                 fac_rapport_volgnr,
                                 fac_rapport_regel,
                                 fac_rapport_soort)
                 VALUES (
                     p_applname,
                     v_rap_count,
                        'node update.js'
                     || ' "'
                     || rec.visitor_id
                     || '"'
                     || ' "'
                     || NVL (
                            rec.kenteken,
                               'KL-'
                            || TO_CHAR (rec.bez_bezoeker_key, 'FM000000'))
                     || '"'
                     || ' "'
                     || NVL (
                            rec.landcode, 'NL')
                     || '" >>%0.log 2>>&1'
                     ,
                     0);

        -- dan ook het kenteken in de eigen tabel aanpassen
        UPDATE volk_registraties_firmbase v
           SET kenteken = rec.kenteken
         WHERE v.visitor_id = rec.visitor_id;

        COMMIT;
    END LOOP;

    FOR rec IN CV
    LOOP
        v_rap_count := v_rap_count + 1;
        v_aanduiding :=
               v_rap_count
            || ': '
            || rec.bez_afspraak_key
            || '/'
            || rec.bez_bezoeker_key;
        v_errormsg := 'Exportregel delete visitor Firmbase aanmaken';

        INSERT INTO fac_rapport (fac_rapport_node,
                                 fac_rapport_volgnr,
                                 fac_rapport_regel,
                                 fac_rapport_soort)
             VALUES (p_applname,
                     v_rap_count,
                     'node cancel.js' || ' "' || rec.visitor_id || '" >>%0.log 2>>&1',
                     0);

        --- Registratie verwijderen uit logtabel
        --- VisitorID verwijderen bij de reservering omdat de bezoeker een nieuwe ID moet krijgen via insert
        DELETE volk_registraties_firmbase f
         WHERE f.visitor_id = rec.visitor_id;

        DELETE bez_kenmerkwaarde
         WHERE     bez_kenmerk_key = v_kenmerk_visid
               AND bez_bezoekers_key = rec.bez_bezoeker_key;

        COMMIT;
    END LOOP;


    FOR rec IN IV
    LOOP
        v_rap_count := v_rap_count + 1;
        v_aanduiding :=
               v_rap_count
            || ': '
            || rec.bez_afspraak_key
            || '/'
            || rec.bez_bezoeker_key;
        v_errormsg := 'Exportregel insert visitor Firmbase aanmaken';


        SELECT substr(sys_guid(), 1, 26) || TO_CHAR (p.bez_bezoeker_key, 'FM000000')
          INTO v_visitor_id
          FROM volk_v_exp_firmbase p
         WHERE p.bez_bezoeker_key = rec.bez_bezoeker_key;

        --- als er wel een parkeerplaats is ingevuld, maar er is geen kenteken bekend, dan moet het kenteken veld gevuld worden met:
        --- KL- en de laatste 6 posities van het VisitorID, bij ons is dat de bezoekerkey aangevuld met voorloopnullen
        INSERT INTO fac_rapport (fac_rapport_node,
                                 fac_rapport_volgnr,
                                 fac_rapport_regel,
                                 fac_rapport_soort)
                 VALUES (
                     p_applname,
                     v_rap_count,
                        'node register.js'
                     || ' "'
                     || v_visitor_id
                     || '"'
                     || ' "'
                     || NVL (
                            rec.kenteken,
                               'KL-'
                            || TO_CHAR (rec.bez_bezoeker_key, 'FM000000'))
                     || '"'
                     || ' "'
                     || NVL (
                            rec.landcode, 'NL')
                     || '"'
                     || ' "'
                     || replace (rec.bez_startdatum, ' ', 'T')
                     || '"'
                     || ' "'
                     || replace (rec.bez_einddatum, ' ', 'T')
                     || '"'
                     || ' "'
                     || rec.bezoeker_naam
                     || '" >>%0.log 2>>&1',
                     0);

        -- registratie ook in eigen tabel toevoegen
        INSERT INTO volk_registraties_firmbase (bez_bezoeker_key,
                                                bez_startdatum,
                                                bez_einddatum,
                                                kenteken,
                                                visitor_id)
             VALUES (rec.bez_bezoeker_key,
                     rec.bez_startdatum,
                     rec.bez_einddatum,
                     rec.kenteken,
                     v_visitor_id);

        -- guid ook registreren bij desbetreffende bezoekersregistratie
        INSERT INTO bez_kenmerkwaarde (bez_kenmerk_key,
                                       bez_bezoekers_key,
                                       bez_kenmerkwaarde_waarde)
             VALUES (v_kenmerk_visid, rec.bez_bezoeker_key, v_visitor_id);


        COMMIT;
    END LOOP;

    COMMIT;
END volk_SELECT_firmbase;
/


--- genereert het export bestand voor Firmbase

CREATE OR REPLACE VIEW VOLK_V_EXPORT_FIRMBASE
(
    RESULT,
    RESULT_ORDER
)
AS
    SELECT fac_rapport_regel, fac_rapport_volgnr
      FROM fac_rapport
     WHERE fac_rapport_node = 'FIRMBASE';


CREATE OR REPLACE PACKAGE VOLK
AS
    PROCEDURE mld_after_insert (p_melding_key IN NUMBER);
END;
/


CREATE OR REPLACE PACKAGE BODY VOLK
AS
PROCEDURE mld_after_insert (p_melding_key IN NUMBER)
AS
    CURSOR c IS
        SELECT m.mld_melding_key
          FROM mld_stdmelding      sm,
               ins_tab_discipline  vg,
               ins_srtdiscipline   vgt,
               mld_disc_params     vgp,
               mld_melding         m
         WHERE     sm.mld_ins_discipline_key = vg.ins_discipline_key
               AND vg.ins_srtdiscipline_key = vgt.ins_srtdiscipline_key
               AND UPPER (ins_srtdiscipline_omschrijving) LIKE '%WINKEL%'
               AND sm.mld_ins_discipline_key = vgp.mld_ins_discipline_key
               AND vgp.mld_disc_params_kanpubliek = 1
               AND m.mld_melding_publiek = 0
               AND m.mld_stdmelding_key = sm.mld_stdmelding_key;

    v_count            NUMBER;
    v_stdmelding_key   NUMBER;
BEGIN
    FOR rec IN C
    LOOP
        UPDATE mld_melding m
           SET m.mld_melding_publiek = 1
         WHERE m.mld_melding_key = rec.mld_melding_key;
    END LOOP;
END;

END;
/


COMMIT;
------ payload end   ------

BEGIN
    DBMS_UTILITY.COMPILE_SCHEMA (USER, FALSE);
END;
/

SET DEFINE OFF

BEGIN
    adm.systrackscriptId (
        '$Id$',
        0);
END;
/

COMMIT;
SET ECHO OFF
SPOOL OFF
SET DEFINE ON
PROMPT Logfile of this upgrade is: &fcltlogfile