--
-- $Id$
--
-- Script containing customer specific db-configuration for VVGR.
DEFINE thisfile = 'VVGR.SQL'
DEFINE dbuser   = '^VVGR'

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 VIEW vvgr_v_rap_import_log
(
   fclt_f_applicatie,
   datum,
   fclt_f_status,
   omschrijving,
   hint
)
AS
   SELECT COALESCE (fac_import_app_code, imp_log_applicatie),
          TO_CHAR (imp_log_datum, 'dd-mm-yyyy hh24:mi'),
          imp_log_status,
          imp_log_omschrijving,
          imp_log_hint
     FROM imp_log il1, fac_import fi1, fac_import_app fia1
    WHERE il1.fac_import_key = fi1.fac_import_key(+)
          AND fi1.fac_import_app_key = fia1.fac_import_app_key(+)
          AND NOT EXISTS
                (SELECT 1
                   FROM imp_log il2, fac_import fi2
                  WHERE     il2.fac_import_key = fi2.fac_import_key
                        AND fi2.fac_import_app_key = fi1.fac_import_app_key
                        AND il2.fac_import_key > il1.fac_import_key);

CREATE OR REPLACE PROCEDURE vvgr_import_prs (p_import_key IN NUMBER)
AS
   v_errormsg       VARCHAR2 (1000) := '-';
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
BEGIN
   -- Funtie-kolom kopieren naar extra kolom 18 (= kenmerk6)!
   UPDATE fac_imp_file i
      SET i.fac_imp_file_line =
             i.fac_imp_file_line
             || ';'
             || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 9)
                                           + 1,   INSTR (fac_imp_file_line, ';', 1, 10)
                                                - INSTR (fac_imp_file_line, ';', 1, 9)
                                                - 1)
    WHERE fac_import_key = p_import_key AND fac_imp_file_index > 1;

   -- Functie-kolom=10 resetten (op 'XXX' want verplicht)!
   UPDATE fac_imp_file i
      SET i.fac_imp_file_line =
                SUBSTR (fac_imp_file_line, 1, INSTR (fac_imp_file_line, ';', 1, 9))
             || '"XXX"'
             || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 10))
    WHERE fac_import_key = p_import_key AND fac_imp_file_index > 1;
   COMMIT;
/*
   -- Afdelingscode-kolom kopieren naar extra kolom 19 (= kenmerk7)!
   UPDATE fac_imp_file i
      SET i.fac_imp_file_line =
             i.fac_imp_file_line
             || ';'
             || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 14)
                                           + 1,   INSTR (fac_imp_file_line, ';', 1, 15)
                                                - INSTR (fac_imp_file_line, ';', 1, 14)
                                                - 1)
    WHERE fac_import_key = p_import_key AND fac_imp_file_index > 1;

   -- Afdelingscode-kolom=15 resetten (op 'XXX' want verplicht)!
   UPDATE fac_imp_file i
      SET i.fac_imp_file_line =
                SUBSTR (fac_imp_file_line, 1, INSTR (fac_imp_file_line, ';', 1, 14))
             || '"XXX"'
             || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 15))
    WHERE fac_import_key = p_import_key AND fac_imp_file_index > 1;
   COMMIT;
*/
   -- Generieke import.
   -- De sequence array staat beschreven in PRS_PAC.SRC bij de import_perslid-PROCEDURE.
   -- Met Stamplaats wordt nog niets gedaan!
   --'%ID;Kantoornummer;Achternaam;AchternaamVoorvoegsel;Voorletters;Voornaam;Emailadres;MobielZakelijk;Geboortedatum;Functie;InternTelefoonnummer;;Geslacht;Naam;Afdeling;Functie;Uren%');
   prs.import_perslid (
      p_import_key,
         '0;0;0;0;0;0;2;3;4;6;'
      || '5;0;0;0;13;11;8;7;0;1;'
      || '10;0;0;0;0;0;9;14;15;16;'
      || '17;18;0;0;0;0;0;0;0;0;'
      || '0;0;0;0;0;0',
      '%ID;Kantoornummer;Achternaam;AchternaamVoorvoegsel;Voorletters;Voornaam;Emailadres;MobielZakelijk;Geboortedatum;Functie;InternTelefoonnummer;;Geslacht;Naam;Afdeling;Functie;Uren%');

   -- Klantspecifieke aanpassingen.
/*
   -- Afdeling-kolom altijd op 'VVGR' (en kenmerk7 negeren)!
   UPDATE fac_imp_perslid i
      SET i.prs_afdeling_naam = 'VVGR';
*/
   -- Functie-kolom volgens kenmerk6 of anders op Onbekend!
   UPDATE fac_imp_perslid i
      SET i.prs_srtperslid_omschrijving = COALESCE (SUBSTR (i.prs_kenmerk6, 1, 60), 'Onbekend')
    WHERE i.prs_perslid_naam IS NOT NULL;
/*
   -- Login-kolom volgens e-mail (en eventueel niet gevuld)!
   UPDATE fac_imp_perslid i
      SET i.prs_perslid_oslogin = SUBSTR (i.prs_perslid_email, 1, 30)
    WHERE i.prs_perslid_naam IS NOT NULL;

   -- Als geen Voornaam aangeleverd, dan handmatig toegekende niet wissen.
   UPDATE fac_imp_perslid i
      SET i.prs_perslid_voornaam =
             (SELECT MAX (prs_perslid_voornaam)
                FROM prs_v_aanwezigperslid
               WHERE prs_perslid_nr = i.prs_perslid_nr)
    WHERE i.prs_perslid_voornaam IS NULL        -- Aangeleverde Voornaam wint!
          AND EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid
                  WHERE prs_perslid_voornaam IS NOT NULL
                        AND prs_perslid_nr = i.prs_perslid_nr);

   -- Als geen Email aangeleverd, dan handmatig toegekende niet wissen.
   UPDATE fac_imp_perslid i
      SET i.prs_perslid_email =
             (SELECT MAX (prs_perslid_email)
                FROM prs_v_aanwezigperslid
               WHERE prs_perslid_nr = i.prs_perslid_nr)
    WHERE i.prs_perslid_email IS NULL              -- Aangeleverde Email wint!
          AND EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid
                  WHERE prs_perslid_email IS NOT NULL
                        AND prs_perslid_nr = i.prs_perslid_nr);

   -- Als geen Telefoonnr aangeleverd, dan handmatig toegekende niet wissen.
   UPDATE fac_imp_perslid i
      SET i.prs_perslid_telefoonnr =
             (SELECT MAX (prs_perslid_telefoonnr)
                FROM prs_v_aanwezigperslid
               WHERE prs_perslid_nr = i.prs_perslid_nr)
    WHERE i.prs_perslid_telefoonnr IS NULL    -- Aangeleverde Telefoonnr wint!
          AND EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid
                  WHERE prs_perslid_telefoonnr IS NOT NULL
                        AND prs_perslid_nr = i.prs_perslid_nr);

   -- Als geen Mobiel aangeleverd, dan handmatig toegekende niet wissen.
   UPDATE fac_imp_perslid i
      SET i.prs_perslid_mobiel =
             (SELECT MAX (prs_perslid_mobiel)
                FROM prs_v_aanwezigperslid
               WHERE prs_perslid_nr = i.prs_perslid_nr)
    WHERE i.prs_perslid_mobiel IS NULL            -- Aangeleverde Mobiel wint!
          AND EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid
                  WHERE prs_perslid_mobiel IS NOT NULL
                        AND prs_perslid_nr = i.prs_perslid_nr);

   -- Klantspecifieke aanpassingen.
   -- Locatie/Gebouw/Verdieping/Ruimte bepalen via Kenmerk1-kolom -> Eigen tabel (key = 1) ->
   -- Gebouw en daaronder Ruimte '_' op de verdieping met het laagste volgnummer!
   -- Als persoon al een WP heeft op import-locatie, dan is dat de juiste en blijft deze
   -- (handmatig gecorrigeerde WP) ongewijzigd. In alle andere gevallen verhuist persoon naar
   -- '_' op de meegegeven locatie.
   -- Eventuele WPs onder andere locaties dan import-locatie blijven ook ongewijzigd!
   UPDATE fac_imp_perslid i
      SET i.alg_locatie_code =
             (SELECT il.alg_locatie_code
                FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Gebouwcode
                     alg_v_aanweziggebouw ig,
                     alg_locatie il
               WHERE ud.fac_usrtab_key = -1
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code)
                     AND ig.alg_locatie_key = il.alg_locatie_key
                     AND NOT EXISTS
                           (SELECT 1
                              FROM alg_v_aanweziggebouw
                             WHERE UPPER (alg_gebouw_code) = UPPER (ud.fac_usrdata_omschr)
                                   AND alg_locatie_key < il.alg_locatie_key)),
          i.alg_gebouw_code =
             (SELECT ig.alg_gebouw_code
                FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Gebouwcode
                     alg_v_aanweziggebouw ig,
                     alg_locatie il
               WHERE ud.fac_usrtab_key = -1
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code)
                     AND ig.alg_locatie_key = il.alg_locatie_key
                     AND NOT EXISTS
                           (SELECT 1
                              FROM alg_v_aanweziggebouw
                             WHERE UPPER (alg_gebouw_code) = UPPER (ud.fac_usrdata_omschr)
                                   AND alg_locatie_key < il.alg_locatie_key)),
          i.alg_verdieping_volgnr =
             (SELECT iv.alg_verdieping_volgnr
                FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Gebouwcode
                     alg_v_aanweziggebouw ig,
                     alg_locatie il,
                     alg_verdieping iv,
                     alg_ruimte ir
               WHERE ud.fac_usrtab_key = -1
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code)
                     AND ig.alg_locatie_key = il.alg_locatie_key
                     AND NOT EXISTS
                           (SELECT 1
                              FROM alg_v_aanweziggebouw
                             WHERE UPPER (alg_gebouw_code) = UPPER (ud.fac_usrdata_omschr)
                                   AND alg_locatie_key < il.alg_locatie_key)
                     AND ig.alg_gebouw_key = iv.alg_gebouw_key
                     AND iv.alg_verdieping_key = ir.alg_verdieping_key
                     AND ir.alg_ruimte_nr = '_000'
                     AND NOT EXISTS
                           (SELECT 1
                              FROM alg_v_aanwezigruimte r, alg_verdieping v
                             WHERE r.alg_ruimte_nr = '_000'
                                   AND r.alg_verdieping_key = v.alg_verdieping_key
                                   AND v.alg_verdieping_volgnr < iv.alg_verdieping_volgnr)),
          i.alg_ruimte_nr =
             (SELECT '_000'
                FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Gebouwcode
                     alg_v_aanweziggebouw ig,
                     alg_locatie il
               WHERE ud.fac_usrtab_key = -1
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code)
                     AND ig.alg_locatie_key = il.alg_locatie_key
                     AND NOT EXISTS
                           (SELECT 1
                              FROM alg_v_aanweziggebouw
                             WHERE UPPER (alg_gebouw_code) = UPPER (ud.fac_usrdata_omschr)
                                   AND alg_locatie_key < il.alg_locatie_key))
    WHERE NOT EXISTS                          -- Nog geen werkplek op Locatie!
             (SELECT 1
                FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Gebouwcode
                     alg_v_aanweziggebouw ig,
                     alg_locatie il,
                     prs_v_aanwezigperslid p,
                     prs_perslidwerkplek pw,
                     prs_werkplek cw,
                     alg_v_aanwezigruimte cr,
                     alg_verdieping cv,
                     alg_gebouw cg
               WHERE ud.fac_usrtab_key = -1
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code)
                     AND ig.alg_locatie_key = il.alg_locatie_key
                     AND NOT EXISTS
                           (SELECT 1
                              FROM alg_v_aanweziggebouw
                             WHERE UPPER (alg_gebouw_code) = UPPER (ud.fac_usrdata_omschr)
                                   AND alg_locatie_key < il.alg_locatie_key)
                     AND p.prs_perslid_nr = i.prs_perslid_nr
                     AND p.prs_perslid_key = pw.prs_perslid_key
                     AND pw.prs_werkplek_key = cw.prs_werkplek_key
                     AND cw.prs_alg_ruimte_key = cr.alg_ruimte_key
                     AND cr.alg_verdieping_key = cv.alg_verdieping_key
                     AND cv.alg_gebouw_key = cg.alg_gebouw_key
                     AND cg.alg_locatie_key = il.alg_locatie_key);

   -- Resulteert in nette foutmelding als ruimte niet kan worden bepaald.
   UPDATE fac_imp_perslid
      SET alg_verdieping_volgnr = 0
    WHERE alg_gebouw_code IS NOT NULL
      AND alg_verdieping_volgnr IS NULL;
*/
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key, 'E', v_errormsg, 'Inleesproces personen afgebroken!');
END vvgr_import_prs;
/

CREATE OR REPLACE PROCEDURE vvgr_update_prs (p_import_key IN NUMBER)
IS
   -- Toevoegen afdelingen die nog niet voorkomen in Facilitor en verwijderen
   -- voorlopig handmatig (ipv. automatisch).
   CURSOR c_afd
   IS
        SELECT i.prs_afdeling_naam,
               MAX (COALESCE (SUBSTR (i.prs_kenmerk3, 1, 60), i.prs_afdeling_naam)) prs_afdeling_omschrijving,
               COUNT (*) aant
          FROM fac_imp_perslid i
         WHERE LENGTH (i.prs_afdeling_naam) BETWEEN 1 AND 15 -- Gevuld en niet te lang!
               AND EXISTS (SELECT 1 FROM prs_v_aanwezigbedrijf WHERE prs_bedrijf_key = 2) -- VVGR!
               AND NOT EXISTS
                     (SELECT 1
                        FROM prs_afdeling
                       WHERE prs_afdeling_verwijder IS NULL
                             AND prs_bedrijf_key = 2                  -- VVGR!
                             AND prs_afdeling_parentkey IS NULL -- Afdeling-1!
                             AND UPPER (TRIM (prs_afdeling_naam)) = UPPER (TRIM (i.prs_afdeling_naam)))
      GROUP BY i.prs_afdeling_naam
      ORDER BY 1;

   -- Verwijderen personen die niet meer in importbestand voorkomen.
   -- Dubbele nummers? Dan wordt iemand mogelijk niet verwijderd/INACTIEF!
   CURSOR c_del
   IS
        SELECT p.prs_perslid_key
          FROM prs_v_aanwezigperslid p
         WHERE p.prs_perslid_key > 10                    -- Voor de zekerheid!
               AND p.prs_perslid_apikey IS NULL
               --AND prs_perslid_oslogin2 IS NULL  -- Zonder alternatieve login!
               AND prs_perslid_nr IS NOT NULL         -- Met personeelsnummer!
               --AND NOT EXISTS
               --      (SELECT 1
               --         FROM fac_imp_perslid
               --        WHERE LOWER (prs_perslid_email) = LOWER (p.prs_perslid_email))
               AND NOT EXISTS
                     (SELECT 1
                        FROM fac_imp_perslid
                       WHERE UPPER (prs_perslid_nr) = UPPER (p.prs_perslid_nr))
      ORDER BY 1;

   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_count          NUMBER;
BEGIN
   -- Toevoegen niet bestaande afdelingen.
   FOR rec IN c_afd
   LOOP
      BEGIN
         INSERT INTO prs_afdeling (prs_bedrijf_key, prs_afdeling_naam, prs_afdeling_omschrijving)
             VALUES (2, rec.prs_afdeling_naam, rec.prs_afdeling_omschrijving);
      END;
   END LOOP;
   COMMIT;

   -- Generic update.
   SELECT COUNT(*) INTO v_count FROM fac_imp_perslid;

   IF v_count < 100
   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;

   -- Generieke update (op e-mail adres).
   prs.update_perslid (p_import_key, 'NR', 'L');

   -- Verwijderen personen *binnen VVGR* niet meer in importbestand.
/*
   FOR rec IN c_del
   LOOP
      BEGIN
         prs.delete_perslid (p_import_key, rec.prs_perslid_key);
      END;
   END LOOP;
*/
END vvgr_update_prs;
/

CREATE OR REPLACE VIEW VVGR_V_RAP_QRC
AS
   SELECT d.ins_deel_omschrijving hide_f_sort,
          l.alg_locatie_code || ' ' || l.alg_locatie_omschrijving
             fclt_f_locatie,
          o.alg_gebouw_omschrijving fclt_f_gebouw,
          o.alg_plaatsaanduiding fclt_f_plaats,
          dd.ins_discipline_omschrijving fclt_f_discipline,
          sg.ins_srtgroep_omschrijving fclt_f_objectgroep,
          sd.ins_srtdeel_omschrijving fclt_f_objectsoort,
          d.ins_deel_omschrijving fclt_f_identificatie,
          dd.ins_discipline_omschrijving || ' / ' || sm.mld_stdmelding_omschrijving
             fclt_f_melding,
          dd.ins_discipline_key fclt_3d_discipline_key,
          sd.ins_srtdeel_key,
          d.ins_deel_key,
          d.ins_alg_locatie_key fclt_3d_locatie_key,
          d.ins_alg_ruimte_type,
          d.ins_alg_ruimte_key,
          o.alg_gebouw_code,
          o.alg_verdieping_code,
          b.fac_bookmark_id hide_f_bookmark_id
     FROM fac_bookmark b,
          ins_v_aanwezigdeel d,
          ins_srtdeel sd,
          ins_srtgroep sg,
          ins_discipline dd,
          alg_locatie l,
          ins_v_alg_overzicht o,
          mld_stdmelding sm,
          mld_stdmelding_srtinst smsd
    WHERE (b.fac_bookmark_expire IS NULL OR b.fac_bookmark_expire > SYSDATE)
          AND b.fac_bookmark_naam = 'QRC_MELDING'
          --AND d.ins_deel_module = 'INS'
          AND d.ins_srtdeel_key = sd.ins_srtdeel_key
          AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
          AND sg.ins_discipline_key = dd.ins_discipline_key
          AND d.ins_deel_parent_key IS NULL
          AND d.ins_alg_ruimte_type IN ('T', 'R', 'W')
          AND d.ins_alg_locatie_key = l.alg_locatie_key
          --AND d.ins_alg_locatie_key = o.alg_locatie_key
          AND d.ins_alg_ruimte_key = o.alg_onroerendgoed_keys
          AND d.ins_alg_ruimte_type = o.alg_onroerendgoed_type
          AND sm.mld_stdmelding_key = smsd.mld_stdmelding_key
          AND smsd.ins_srtinstallatie_key = DECODE (smsd.ins_srtinstallatie_niveau, 'S', sd.ins_srtdeel_key, 'G', sg.ins_srtgroep_key, 'D', dd.ins_discipline_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
