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

DEFINE thisfile = 'ofwd.sql'
DEFINE dbuser   = 'OFWD'

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
COLUMN fcltcusttxt NEW_VALUE fcltcusttxt NOPRINT;
WHENEVER SQLERROR CONTINUE;
SELECT adm.getscriptspoolfile('&thisfile') AS fcltlogfile FROM DUAL;
SPOOL &fcltlogfile
WHENEVER SQLERROR EXIT;
SELECT adm.checkscriptcust('&dbuser') AS fcltcusttxt FROM DUAL;
WHENEVER SQLERROR CONTINUE;
---------------------------------------
PROMPT &fcltcusttxt
---------------------------------------
SET DEFINE OFF

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

CREATE OR REPLACE PACKAGE OFWD
AS
   PROCEDURE create_fac_usrdata_node (p_key        IN NUMBER,
                                      p_custid     IN VARCHAR2,
                                      p_sessionid  IN VARCHAR2,
                                      p_extra      IN VARCHAR2,
                                      p_where      IN VARCHAR2);

    PROCEDURE update_devices_from_ad(p_import_key IN NUMBER);
END;
/


CREATE OR REPLACE PACKAGE BODY OFWD
AS

   PROCEDURE create_fac_usrdata_node (p_key        IN NUMBER,
                                      p_custid     IN VARCHAR2,
                                      p_sessionid  IN VARCHAR2,
                                      p_extra      IN VARCHAR2,
                                      p_where      IN VARCHAR2)
   AS
      v_fac_usrtab_key         fac_usrdata.fac_usrtab_key%TYPE;
      v_fac_usrdata_code       fac_usrdata.fac_usrdata_code%TYPE;
      v_fac_usrdata_omschr     fac_usrdata.fac_usrdata_omschr%TYPE;
      v_fac_usrdata_omschr2    fac_usrdata.fac_usrdata_omschr2%TYPE;
      v_fac_usrdata_prijs      fac_usrdata.fac_usrdata_prijs%TYPE;
                
   BEGIN
      IF p_key IS NOT NULL
      THEN
         XML.createconciseopentag ('fac_usrdata');

         SELECT fac_usrdata.fac_usrtab_key,
                fac_usrdata.fac_usrdata_code,
                fac_usrdata.fac_usrdata_omschr,
                fac_usrdata.fac_usrdata_omschr2,
                fac_usrdata.fac_usrdata_prijs
           INTO v_fac_usrtab_key,
                v_fac_usrdata_code,
                v_fac_usrdata_omschr,
                v_fac_usrdata_omschr2,
                v_fac_usrdata_prijs
            FROM fac_usrdata
          WHERE fac_usrdata_key = p_key;

         XML.createxmltagvalue ('tabel_key', v_fac_usrtab_key);
         XML.createxmltagvalue ('code', v_fac_usrdata_code);
         XML.createxmltagvalue ('omschrijving', v_fac_usrdata_omschr);
         XML.createxmltagvalue ('omschrijving2', v_fac_usrdata_omschr2);
         XML.createxmltagvalue ('prijs', XML.mynumbertochar(v_fac_usrdata_prijs));
         XML.createclosetag ('fac_usrdata');
      END IF;
   END;

   PROCEDURE update_devices_from_ad(p_import_key IN NUMBER)
   AS
      --          sql = "id,deviceName,serialNumber,lastSyncDateTime,userDisplayName,emailaddress,phoneNumber,imei,manufacturer,model,enrolledDateTime) "
      CURSOR c_upd IS
        SELECT c.fac_imp_csv_col01 id,
               c.fac_imp_csv_col02 deviceName,
               c.fac_imp_csv_col03 serialnumber,
               CAST (
                  FROM_TZ (CAST (TO_DATE (REPLACE (c.fac_imp_csv_col04, 'Z'), 'yyyy-mm-dd"T"hh24:mi:ss') AS TIMESTAMP), 'UTC')
                     AT TIME ZONE 'Europe/Amsterdam' AS DATE)   lastLocalSyncDateTime,
               c.fac_imp_csv_col05 userDisplayName,
               c.fac_imp_csv_col06 emailaddress,
               c.fac_imp_csv_col07 phoneNumber,
               c.fac_imp_csv_col08 imei,
               c.fac_imp_csv_col09 manufacturer,
               c.fac_imp_csv_col10 model,
               CAST (
                  FROM_TZ (CAST (TO_DATE (REPLACE (c.fac_imp_csv_col11, 'Z'), 'yyyy-mm-dd"T"hh24:mi:ss') AS TIMESTAMP), 'UTC')
                     AT TIME ZONE 'Europe/Amsterdam' AS DATE)   enrolledDateTime,
               c.fac_imp_csv_col12 azureADDeviceId,
               d.ins_deel_key
          FROM fac_imp_csv c, ins_deel d
         WHERE c.fac_import_key = p_import_key
           AND d.ins_deel_externnr = c.fac_imp_csv_col01;

      CURSOR c_ins IS
        SELECT c.fac_imp_csv_col01 id,
               c.fac_imp_csv_col02 deviceName,
               c.fac_imp_csv_col03 serialnumber,
               CAST (
                  FROM_TZ (CAST (TO_DATE (REPLACE (c.fac_imp_csv_col04, 'Z'), 'yyyy-mm-dd"T"hh24:mi:ss') AS TIMESTAMP), 'UTC')
                     AT TIME ZONE 'Europe/Amsterdam' AS DATE)   lastLocalSyncDateTime,
               c.fac_imp_csv_col05 userDisplayName,
               c.fac_imp_csv_col06 emailaddress,
               c.fac_imp_csv_col07 phoneNumber,
               c.fac_imp_csv_col08 imei,
               c.fac_imp_csv_col09 manufacturer,
               c.fac_imp_csv_col10 model,
               CAST (
                  FROM_TZ (CAST (TO_DATE (REPLACE (c.fac_imp_csv_col11, 'Z'), 'yyyy-mm-dd"T"hh24:mi:ss') AS TIMESTAMP), 'UTC')
                     AT TIME ZONE 'Europe/Amsterdam' AS DATE)   enrolledDateTime,
               c.fac_imp_csv_col12 azureADDeviceId
          FROM fac_imp_csv c
         WHERE c.fac_import_key = p_import_key
           AND NOT EXISTS (SELECT 1 FROM ins_deel d WHERE d.ins_deel_externnr = c.fac_imp_csv_col01);

      CURSOR c_del IS
         SELECT ins_deel_key
           FROM ins_deel
          WHERE     ins_deel_verwijder IS NULL
                AND ins_deel_externnr IS NOT NULL
                AND ins_deel_externnr NOT IN (SELECT fac_imp_csv_col01
                                                FROM fac_imp_csv
                                               WHERE fac_import_key = p_import_key);
   v_discipline_key NUMBER;
   v_srtdeel_key    NUMBER;
   v_locatie_key    NUMBER;
   v_ruimte_key     NUMBER;
   v_errormsg       VARCHAR2(100);

     PROCEDURE setflex(p_code IN VARCHAR2, 
                        p_key  IN VARCHAR2,
                        p_waarde IN VARCHAR2,
                        p_tracking IN NUMBER)
      AS
         v_kenmerk_key          NUMBER;
         v_kenmerk_omschrijving ins_kenmerk.ins_kenmerk_omschrijving%TYPE;
         v_kenmerk_waarde       ins_kenmerkdeel.ins_kenmerkdeel_waarde%TYPE;
      BEGIN 
         --dbms_output.put_line(p_code);
         SELECT ins_kenmerk_key, COALESCE(ins_kenmerk_omschrijving, ins_srtkenmerk_omschrijving)
           INTO v_kenmerk_key, v_kenmerk_omschrijving
           FROM ins_kenmerk k, ins_srtkenmerk sk 
          WHERE k.ins_srtkenmerk_key = sk.ins_srtkenmerk_key 
            AND sk.ins_srtkenmerk_code = UPPER(p_code);
          
          v_kenmerk_waarde := FLX.getflex('INS', v_kenmerk_key, p_key);
          FLX.setflex('INS', v_kenmerk_key, p_key, p_waarde);
          
          IF p_tracking = 1 AND COALESCE(v_kenmerk_waarde, '(leeg)') <> COALESCE(p_waarde, '(leeg)')
          THEN 
             fac.trackaction('INSUPD', p_key, NULL, NULL, 'Object gewijzigd' || CHR(10) 
             || v_kenmerk_omschrijving || ': ' || COALESCE(v_kenmerk_waarde, '(leeg)') || ' --> ' || COALESCE(p_waarde, '(leeg)'));
          END IF;
      EXCEPTION WHEN NO_DATA_FOUND
      THEN 
         dbms_output.put_line('Kenmerk niet gevonden: ' || p_code);
      END;

   BEGIN
      FOR rec IN c_ins LOOP
         BEGIN 
            v_errormsg := 'Opzoeken objectsoort in Facilitor: ' || rec.model;
            SELECT ins_srtdeel_key, ins_discipline_key
              INTO v_srtdeel_key, v_discipline_key
              FROM ins_v_srtdeel_gegevens
             WHERE ins_srtdeel_omschrijving = rec.model;
            
            v_errormsg := 'Opzoeken ruimtenummer in Facilitor: 0.3';
            SELECT alg_locatie_key, alg_ruimte_key
              INTO v_locatie_key, v_ruimte_key
              FROM alg_v_ruimte_gegevens
             WHERE alg_ruimte_nr = '0.3';

            INSERT INTO ins_deel (ins_srtdeel_key,
                                  ins_discipline_key,
                                  ins_deel_module,
                                  ins_deel_omschrijving,
                                  ins_alg_locatie_key,
                                  ins_alg_ruimte_key,
                                  ins_alg_ruimte_type,
                                  ins_deel_aanmaak,
                                  ins_deel_externnr,
                                  ins_deel_externsyncdate)
                   VALUES (v_srtdeel_key,
                           v_discipline_key,
                           'INS',
                           SUBSTR(rec.deviceName, 1, 60),
                           v_locatie_key,
                           v_ruimte_key,
                           'R',
                           rec.enrolledDateTime,
                           rec.id,
                           SYSDATE);
          
         EXCEPTION WHEN NO_DATA_FOUND
         THEN
            fac.imp_writelog (p_import_key, 'E', v_errormsg, '');
         END;
      END LOOP;

      FOR rec IN c_upd LOOP
         setflex('lastLocalSyncDateTime', rec.ins_deel_key, TO_CHAR(rec.lastLocalSyncDateTime, 'yyyy-mm-dd hh24:mi:ss'), 0);
         setflex('userDisplayName', rec.ins_deel_key, rec.userDisplayName, 1);
         setflex('imei', rec.ins_deel_key, rec.imei,1);
         setflex('manufacturer', rec.ins_deel_key, rec.manufacturer, 1);
         setflex('serialNumber', rec.ins_deel_key, rec.serialnumber, 1);
         setflex('emailaddress', rec.ins_deel_key, rec.emailaddress, 1);
         setflex('phoneNumber', rec.ins_deel_key, rec.phoneNumber, 1);
         setflex('enrolledDateTime', rec.ins_deel_key, TO_CHAR(rec.enrolledDateTime, 'yyyy-mm-dd hh24:mi:ss'), 1);
         setflex('azureADDeviceId', rec.ins_deel_key, rec.azureADDeviceId, 1);
         UPDATE ins_deel SET ins_deel_externsyncdate = SYSDATE WHERE ins_deel_key = rec.ins_deel_key;
      END LOOP;

      FOR rec IN c_del LOOP
         UPDATE ins_deel SET ins_deel_verwijder = SYSDATE WHERE ins_deel_key = rec.ins_deel_key;
      END LOOP;

      DELETE fac_imp_csv WHERE fac_import_key = p_import_key;
   END;
END;
/


CREATE OR REPLACE PROCEDURE ofwd_import_afasonline (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
    -- Het aangeleverde bestand heeft de gegevens komma gescheiden ipv ;
    v_errorhint := 'Delimiter goed zetten';

    -- UPDATE fac_imp_file
    --   SET fac_imp_file_line = REPLACE (fac_imp_file_line, ',', ';')
    -- WHERE fac_import_key = p_import_key;

    -- Het aangeleverde bestand heeft aanhalingstekens om de invoervelden..
    UPDATE fac_imp_file
       SET fac_imp_file_line = REPLACE (fac_imp_file_line, '"', '')
     WHERE fac_import_key = p_import_key;


    v_errorhint := 'Generieke update';

    -- WORDT 2025-MRT
    prs.import_perslid (
        p_import_key,
           '0;0;0;0;0;0;9;1;2;4;'
        || '3;0;0;0;0;0;0;6;0;5;'
        || '8;0;0;0;0;0;9;10;11;12;'
        || '13;14;0;0;0;0;0;0;0;0;'
        || '0;0;0;0;0;0',
        'Achternaam;Tussenvoegsel;Voorletters;Roepnaam;Personeelsnummer;EMail_werk;Functie_code;Functie_omschrijving;Organisatorische_eenheid_code;Organisatorische_eenheid_omschrijving;Datum_indienst;Datum_uitdienst;Leidinggevende_personeelsnummer;Leidinggevende_Naam%');
    --  "Achternaam";"Tussenvoegsel";"Voorletters";"Roepnaam";"personeelsnummer";"E-Mail_werk";"Functie_code";"Functie_omschrijving";"Organisatorische_eenheid_code";"Organisatorische_eenheid_omschrijving";"Datum_indienst";"Datum_uitdienst";"Leidinggevende_personeelsnummer";"Leidinggevende_Naam";
    --         1 (8)      2 (9)         3 (11)       4 (10)        5 (10)        6 (18)           7 (20)               8(21)                         9 (27)                      10  (28)                          11 (29)             12 (30)              13 (31)                    14 (32) 
    -- DEF:'Achternaam;Tussenvoegsel;Voorletters;Roepnaam;Personeelsnummer;E-Mail_werk;Functie_code;Functie_omschrijving;Organisatorische_eenheid_code;Organisatorische_eenheid_omschrijving; Datum_indienst;Datum_uitdienst;Leidinggevende_personeelsnummer;Leidinggevende_Naam');

     ---- we nemen uit afas alleen de bedrijven/domeinen mee van ofw
    DELETE fac_imp_perslid
     WHERE (
           UPPER (prs_perslid_email) NOT LIKE '%@OFW.NL'
           )           
           ;

    DELETE fac_imp_organisatie;

    -- Kostenplaats HR wordt aan de afdeling toegevoegd om instemming voor ergonomische middelen toe te staan.
    INSERT INTO fac_imp_organisatie (prs_bedrijf_naam, prs_afdeling_naam, prs_afdeling_omschrijving, prs_kostenplaats_nr)
    SELECT DISTINCT 'OFW', prs_afdeling_naam, prs_kenmerk2, 'HR' 
      FROM fac_imp_perslid 
     WHERE fac_import_key = p_import_key;
    
    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 ofwd_import_afasonline;
/
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE PROCEDURE ofwd_update_afasonline (p_import_key IN NUMBER)
IS

   CURSOR c_del
   IS
      SELECT p.prs_perslid_key, p.prs_perslid_naam, p.prs_perslid_email, p.prs_perslid_nr, a.prs_afdeling_omschrijving, b.prs_bedrijf_naam
        FROM prs_perslid p, fac_imp_perslid i, prs_v_afdeling a, prs_bedrijf b
       WHERE p.prs_perslid_nr = i.prs_perslid_nr(+)
             AND p.prs_perslid_verwijder IS NULL
             AND p.prs_afdeling_key = a.prs_afdeling_key AND a.prs_bedrijf_key = b.prs_bedrijf_key
             AND b.prs_bedrijf_naam = 'OFW'
             AND i.prs_perslid_nr IS NULL    -- in Facilitor, met onderstaande voorwaarden, is er dus geen mapping op personeelsnummer en die personen gaan we verwijderen/inactief maken
       ORDER BY 1 ;

   CURSOR c_upd
   IS 
      SELECT p.prs_perslid_key, 
             pf.prs_perslid_naam_full, 
             p.prs_perslid_aanmaak,
             i.prs_kenmerk3 indienst, 
             i.prs_kenmerk4 uitdienst, 
             prs_kenmerk5 leid_prs_nr
        FROM prs_v_perslid_fullnames pf,
             prs_perslid p,
             fac_imp_perslid i 
       WHERE     p.prs_perslid_nr = i.prs_perslid_nr
             AND p.prs_perslid_key = pf.prs_perslid_key;

   CURSOR c_bloktitel (c_stdmelding_key NUMBER)
   IS
      SELECT mld_kenmerk_key, ins_discipline_key
        FROM mld_kenmerk
       WHERE mld_srtkenmerk_key = 24 AND mld_stdmelding_key = c_stdmelding_key;

   v_count            NUMBER;
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   v_errormsg         VARCHAR2 (400);
   v_errorhint        VARCHAR2 (400);

   v_indienst_kenmerk_key       NUMBER(10);
   v_uitdienst_kenmerk_key      NUMBER(10);
   v_leidg_perslid_key          NUMBER(10);
   v_melding_key                NUMBER(10);
   v_indienst_stdmelding_key    NUMBER(10);
   v_uitdienst_stdmelding_key   NUMBER(10);
   v_uitdienst                  NUMBER(1);
   v_indienstdatum              VARCHAR2(10);
   v_uitdienstdatum             VARCHAR2(10);

BEGIN
   v_errorhint := 'Niet genoeg personen in bestand, import afgebroken';

   SELECT COUNT ( * ) INTO v_count FROM fac_imp_perslid;

   IF v_count >= 50
   THEN
      v_errorhint := 'Verwerken organisatiegegevens';
      fac_update_organisatie (p_import_key);
      
      v_errorhint := 'Verwerken persoonsgegevens';

      -- Geldig importbestand wat betreft aantal personen

      COMMIT;

      -- generic update
      -- 'EMAIL' betekent dat op basis van Email wordt gematched.
      -- 'NR' betekent op basis Personeelsnummer
      -- 'NULL' betekent altijd geen werkplekken verwijderen
      prs.update_perslid (p_import_key, 'NR', NULL);

      v_errorhint := 'Verwijderen persoonsgegevens';

      -- 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;
      
      SELECT k.prs_kenmerk_key
        INTO v_indienst_kenmerk_key
        FROM prs_kenmerk k
       WHERE k.prs_kenmerk_verwijder IS NULL
         AND k.prs_kenmerk_code = 'INDIENST';

      SELECT k.prs_kenmerk_key
        INTO v_uitdienst_kenmerk_key
        FROM prs_kenmerk k
       WHERE k.prs_kenmerk_verwijder IS NULL
         AND k.prs_kenmerk_code = 'UITDIENST';

      SELECT mld_stdmelding_key 
        INTO v_indienst_stdmelding_key
        FROM mld_stdmelding 
       WHERE mld_stdmelding_code = 'INDIENST';

      SELECT mld_stdmelding_key 
        INTO v_uitdienst_stdmelding_key
        FROM mld_stdmelding 
       WHERE mld_stdmelding_code = 'UITDIENST';
         
      FOR rec IN c_upd
      LOOP
         BEGIN
            v_uitdienst := 0;
            v_indienstdatum := NULL;
            v_uitdienstdatum := NULL;

            IF rec.indienst IS NOT NULL 
            THEN
               v_indienstdatum := TO_CHAR(FAC.SAFE_TO_DATE(rec.indienst, 'yyyy-mm-dd'), 'dd-mm-yyyy');
            END IF;
            v_errorhint:='Fout bijwerken kenmerkveld3 - Indienst datum: ' || rec.indienst;
            PRS.upsertkenmerk (v_indienst_kenmerk_key, rec.prs_perslid_key, v_indienstdatum);

            IF rec.uitdienst IS NOT NULL 
            THEN 
               v_uitdienstdatum := TO_CHAR(FAC.SAFE_TO_DATE(rec.uitdienst, 'yyyy-mm-dd'), 'dd-mm-yyyy');
               IF FLX.getflex('PRS', v_uitdienst_kenmerk_key, rec.prs_perslid_key, 'P', 1) IS NULL 
               THEN
                  v_uitdienst := 1;
               END IF;
            END IF;
            v_errorhint:='Fout bijwerken kenmerkveld4 - Uitdienst datum';
            PRS.upsertkenmerk (v_uitdienst_kenmerk_key, rec.prs_perslid_key, v_uitdienstdatum);

            v_leidg_perslid_key := NULL;
            IF rec.leid_prs_nr IS NOT NULL 
            THEN
               v_errorhint:='Fout bijwerken leidinggevende';
               BEGIN
                  SELECT prs_perslid_key
                    INTO v_leidg_perslid_key
                    FROM prs_v_aanwezigperslid p 
                   WHERE p.prs_perslid_nr = rec.leid_prs_nr;
                   
                  UPDATE prs_perslid 
                     SET prs_perslid_key_verantw = v_leidg_perslid_key
                   WHERE prs_perslid_key = rec.prs_perslid_key;
               EXCEPTION WHEN NO_DATA_FOUND
               THEN
                  fac.imp_writelog (p_import_key, 'E', 'Leidinggevende kan niet gevonden worden: ' || rec.leid_prs_nr, '');
               END;
            END IF;
            
            -- Aanmaken in diensttredingsmelding
            -- Persoon is vandaag aangemaakt.
            -- en er is niet eerder een indiensttredingsworkflow gestart.
            SELECT count(*) 
              INTO v_count 
              FROM mld_melding 
             WHERE prs_perslid_key = rec.prs_perslid_key
               AND mld_stdmelding_key = v_indienst_stdmelding_key;
               
            IF TRUNC(rec.prs_perslid_aanmaak) = TRUNC(SYSDATE) AND v_count = 0
            THEN

               INSERT INTO mld_melding (mld_melding_module,
                                        mld_meldbron_key,
                                        mld_melding_datum,
                                        mld_melding_onderwerp,
                                        mld_melding_omschrijving,
                                        mld_melding_status,
                                        mld_stdmelding_key,
                                        prs_perslid_key,
                                        prs_perslid_key_voor,
                                        prs_kostenplaats_key,
                                        mld_melding_spoed)
                   VALUES ('MLD',
                           6,                                            -- systeem
                           SYSDATE,
                           'Indienst tredingsbericht: ' || rec.prs_perslid_naam_full,
                           NULL,
                           NULL,
                           v_indienst_stdmelding_key,
                           rec.prs_perslid_key,
                           rec.prs_perslid_key,
                           NULL,
                           3)
                RETURNING mld_melding_key
                     INTO v_melding_key;

               mld.setmeldingstatus (v_melding_key, 2, null);     -- nieuw

               FOR rec_bt IN c_bloktitel(v_indienst_stdmelding_key)
               LOOP
                  INSERT INTO mld_kenmerkblokmelding (mld_melding_key , mld_kenmerk_key , ins_discipline_key , prs_perslid_key , mld_kenmerkblokmelding_afmelddatum ) 
                         VALUES (v_melding_key , rec_bt.mld_kenmerk_key, rec_bt.ins_discipline_key , NULL , NULL );
               END LOOP;

            END IF;

            -- Aanmaken uitdiensttredingsmelding
            -- Persoon is vandaag uitdienstgemeld.
            -- en er is niet eerder een indiensttredingsworkflow gestart.
            SELECT count(*) 
              INTO v_count 
              FROM mld_melding 
             WHERE prs_perslid_key = rec.prs_perslid_key
               AND mld_stdmelding_key = v_uitdienst_stdmelding_key;
               
            IF v_uitdienst = 1 AND v_count = 0
            THEN

               INSERT INTO mld_melding (mld_melding_module,
                                        mld_meldbron_key,
                                        mld_melding_datum,
                                        mld_melding_onderwerp,
                                        mld_melding_omschrijving,
                                        mld_melding_status,
                                        mld_stdmelding_key,
                                        prs_perslid_key,
                                        prs_perslid_key_voor,
                                        prs_kostenplaats_key,
                                        mld_melding_spoed)
                   VALUES ('MLD',
                           6,                                            -- systeem
                           SYSDATE,
                           'Uitdienst tredingsbericht: ' || rec.prs_perslid_naam_full,
                           NULL,
                           NULL,
                           v_uitdienst_stdmelding_key,
                           rec.prs_perslid_key,
                           rec.prs_perslid_key,
                           NULL,
                           3)
                RETURNING mld_melding_key
                     INTO v_melding_key;

               mld.setmeldingstatus (v_melding_key, 2, null);     -- nieuw

               FOR rec_bt IN c_bloktitel(v_uitdienst_stdmelding_key)
               LOOP
                  INSERT INTO mld_kenmerkblokmelding (mld_melding_key , mld_kenmerk_key , ins_discipline_key , prs_perslid_key , mld_kenmerkblokmelding_afmelddatum ) 
                         VALUES (v_melding_key , rec_bt.mld_kenmerk_key, rec_bt.ins_discipline_key , NULL , NULL );
               END LOOP;

            END IF;

         END;
      END LOOP;

      -- Voeg standaard rapport toe om de rechten in de opdrachtbon op te nemen.
      INSERT INTO prs_kenmerklink (prs_link_key,
                                   prs_kenmerklink_niveau,
                                   prs_kenmerk_key,
                                   prs_kenmerklink_waarde)
         WITH
            toegekenderechten
            AS
               (SELECT prs_kenmerk_key
                  FROM prs_kenmerk
                 WHERE prs_kenmerk_code = 'TOEGEKENDERECHTENZD')
         SELECT prs_perslid_key,
                'P',
                tr.prs_kenmerk_key,
                (SELECT fac_usrrap_key FROM fac_usrrap WHERE fac_usrrap_code = 'TOEGEKENDERECHTENZD')
           FROM prs_perslid p, toegekenderechten tr
          WHERE     prs_perslid_nr IS NOT NULL
                AND prs_perslid_verwijder IS NULL
                AND NOT EXISTS
                       (SELECT 1
                          FROM prs_kenmerklink kl
                         WHERE kl.prs_kenmerk_key = tr.prs_kenmerk_key AND kl.prs_link_key = p.prs_perslid_key);

   ELSE
      fac.imp_writelog (p_import_key,
                        'E',
                        v_errormsg,
                        v_errorhint);
      COMMIT;
   END IF;

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

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-- Rapportage om het kenmerkdomein met optionele profielen (objectsoort_key = 42) te vullen
CREATE OR REPLACE VIEW ofwd_v_optionele_profielen
AS
   SELECT ins_deel_key, ins_deel_omschrijving, ins_deel_verwijder
     FROM ins_deel
    WHERE ins_srtdeel_key = 42;

-- Rapportage om de relatie tussen persoon - functie en rol vast te leggen

CREATE OR REPLACE VIEW ofwd_v_rap_prs_rol_recht
AS
   SELECT pf.prs_perslid_key,
          pf.prs_perslid_naam_full                                                                               naam,
          NULL                                                                                                   functie,
          ins_deel_omschrijving                                                                                  rol,
          sd.ins_srtdeel_omschrijving                                                                            soort_rol,
          DECODE (TRUNC (k.ins_kenmerk_volgnummer, -2),  100, 'Sharepoint',  300, 'Mail',  500, 'Applicatie')    groep,
          k.ins_kenmerk_omschrijving                                                                             recht
     FROM prs_perslid        p,
          prs_v_perslid_fullnames pf,
          prs_kenmerklink    kl,
          prs_kenmerk        k,
          fac_kenmerkdomein  kdo,
          ins_deel           d,
          ins_kenmerkdeel    kde,
          ins_kenmerk        k,
          ins_srtdeel        sd,
          prs_v_afdeling     a
    WHERE     p.prs_perslid_verwijder IS NULL
          AND p.prs_perslid_key = pf.prs_perslid_key
          AND p.prs_afdeling_key = a.prs_afdeling_key
          AND a.prs_bedrijf_key = 41                                                                              -- OFW
          AND p.prs_perslid_key = kl.prs_link_key(+)
          AND kl.prs_kenmerk_key = k.prs_kenmerk_key
          AND k.fac_kenmerkdomein_key = kdo.fac_kenmerkdomein_key(+)
          AND kdo.fac_kenmerkdomein_xmlnode = 'deel'
          AND fac.safe_to_number (kl.prs_kenmerklink_waarde) = d.ins_deel_key(+)
          AND d.ins_deel_key = kde.ins_deel_key(+)
          AND kde.ins_kenmerk_key = k.ins_kenmerk_key(+)
          AND d.ins_srtdeel_key = sd.ins_srtdeel_key(+)
   UNION ALL
   SELECT pf.prs_perslid_key,
          pf.prs_perslid_naam_full,
          df.ins_deel_omschrijving,
          dr.ins_deel_omschrijving,
          sd.ins_srtdeel_omschrijving                                                                            soort_rol,
          DECODE (TRUNC (k.ins_kenmerk_volgnummer, -2),  100, 'Sharepoint',  300, 'Mail',  500, 'Applicatie')    groep,
          k.ins_kenmerk_omschrijving
     FROM prs_perslid      p,
          prs_v_perslid_fullnames pf,
          prs_srtperslid   sp,
          (SELECT ins_deel_key, fac.safe_to_number (ins_kenmerkdeel_waarde) ins_kenmerkdeel_waarde
             FROM ins_kenmerkdeel
            WHERE ins_kenmerk_key = 21) kdf,
          ins_deel         df,
          (SELECT ins_deelkoppeling_van_key, ins_deelkoppeling_naar_key
             FROM ins_deelkoppeling
            WHERE ins_deelkoppeling_verwijder IS NULL
           UNION
           SELECT ins_deelkoppeling_naar_key, ins_deelkoppeling_van_key
             FROM ins_deelkoppeling
            WHERE ins_deelkoppeling_verwijder IS NULL) dk,
          ins_deel         dr,
          ins_kenmerkdeel  kde,
          ins_kenmerk      k,
          ins_srtdeel      sd,
          prs_v_afdeling   a
    WHERE     p.prs_perslid_verwijder IS NULL
          AND p.prs_perslid_key = pf.prs_perslid_key
          AND p.prs_afdeling_key = a.prs_afdeling_key
          AND a.prs_bedrijf_key = 41                                                                              -- OFW
          AND p.prs_srtperslid_key = sp.prs_srtperslid_key
          AND sp.prs_srtperslid_key = kdf.ins_kenmerkdeel_waarde(+)
          AND kdf.ins_deel_key = df.ins_deel_key(+)
          AND df.ins_deel_key = dk.ins_deelkoppeling_van_key(+)
          AND dk.ins_deelkoppeling_naar_key = dr.ins_deel_key(+)
          AND dr.ins_deel_key = kde.ins_deel_key(+)
          AND kde.ins_kenmerk_key = k.ins_kenmerk_key(+)
          AND dr.ins_srtdeel_key = sd.ins_srtdeel_key(+);


-- Omdat bovenstaand rapport te groot werd, zijn de functies en de rechten gescheiden. De stylesheet zoekt ze 
-- weer bij elkaar. Deze view is speciaal voor zendesk
CREATE OR REPLACE VIEW ofwd_v_rap_prs_rol_recht_zd
AS
   SELECT pf.prs_perslid_key,
          pf.prs_perslid_naam_full    naam,
          TO_CHAR (NULL)              functie,
          ins_deel_omschrijving       rol,
          ins_deel_key                rol_key,
          TO_CHAR (NULL)              soort_rol,
          TO_CHAR (NULL)              groep,
          TO_CHAR (NULL)              recht
     FROM prs_perslid              p,
          prs_v_perslid_fullnames  pf,
          prs_kenmerklink          kl,
          prs_kenmerk              k,
          fac_kenmerkdomein        kdo,
          ins_deel                 d,
          prs_v_afdeling           a
    WHERE     p.prs_perslid_verwijder IS NULL
          AND p.prs_perslid_key = pf.prs_perslid_key
          AND p.prs_afdeling_key = a.prs_afdeling_key
          AND a.prs_bedrijf_key = 41                                                                              -- OFW
          AND p.prs_perslid_key = kl.prs_link_key(+)
          AND kl.prs_kenmerk_key = k.prs_kenmerk_key
          AND k.fac_kenmerkdomein_key = kdo.fac_kenmerkdomein_key(+)
          AND kdo.fac_kenmerkdomein_xmlnode = 'deel'
          AND fac.safe_to_number (kl.prs_kenmerklink_waarde) = d.ins_deel_key(+)
   UNION ALL
   SELECT pf.prs_perslid_key,
          pf.prs_perslid_naam_full,
          df.ins_deel_omschrijving    functie,
          dr.ins_deel_omschrijving    rol,
          dr.ins_deel_key             rol_key,
          NULL                        soort_rol,
          NULL                        groep,
          NULL                        recht
     FROM prs_perslid              p,
          prs_v_perslid_fullnames  pf,
          prs_srtperslid           sp,
          (SELECT ins_deel_key, fac.safe_to_number (ins_kenmerkdeel_waarde) ins_kenmerkdeel_waarde
             FROM ins_kenmerkdeel
            WHERE ins_kenmerk_key = 21) kdf,
          ins_deel                 df,
          (SELECT ins_deelkoppeling_van_key, ins_deelkoppeling_naar_key
             FROM ins_deelkoppeling
            WHERE ins_deelkoppeling_verwijder IS NULL
           UNION
           SELECT ins_deelkoppeling_naar_key, ins_deelkoppeling_van_key
             FROM ins_deelkoppeling
            WHERE ins_deelkoppeling_verwijder IS NULL) dk,
          ins_deel                 dr,
          ins_srtdeel              sd,
          prs_v_afdeling           a
    WHERE     p.prs_perslid_verwijder IS NULL
          AND p.prs_perslid_key = pf.prs_perslid_key
          AND p.prs_afdeling_key = a.prs_afdeling_key
          AND a.prs_bedrijf_key = 41                                                                              -- OFW
          AND p.prs_srtperslid_key = sp.prs_srtperslid_key
          AND sp.prs_srtperslid_key = kdf.ins_kenmerkdeel_waarde(+)
          AND kdf.ins_deel_key = df.ins_deel_key(+)
          AND df.ins_deel_key = dk.ins_deelkoppeling_van_key(+)
          AND dk.ins_deelkoppeling_naar_key = dr.ins_deel_key(+)
          AND dr.ins_srtdeel_key = sd.ins_srtdeel_key(+)
   UNION ALL
   SELECT NULL,
          NULL,
          NULL                                                                                                   functie,
          dr.ins_deel_omschrijving                                                                               rol,
          dr.ins_deel_key                                                                                        rol_key,
          sd.ins_srtdeel_omschrijving                                                                            soort_rol,
          DECODE (TRUNC (k.ins_kenmerk_volgnummer, -2),  100, 'Sharepoint',  300, 'Mail',  500, 'Applicatie')    groep,
          k.ins_kenmerk_omschrijving
     FROM ins_deel         dr,
          ins_kenmerkdeel  kde,
          ins_kenmerk      k,
          ins_srtdeel      sd
    WHERE     sd.ins_srtgroep_key = 22                                                                            -- Rol
          AND dr.ins_deel_key = kde.ins_deel_key(+)
          AND kde.ins_kenmerk_key = k.ins_kenmerk_key(+)
          AND dr.ins_srtdeel_key = sd.ins_srtdeel_key(+);



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