-- Script containing customer specific configuration sql statements for Driessen Groep
-- $Revision$
-- $Id$

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

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 VIEW drie_v_rap_td_looplijst
(
   hide_f_srt,
   soort,
   nr,
   fclt_f_gebouw,
   datum,
   begintijd,
   eindtijd,
   fclt_f_ruimte,
   opstelling,
   aantal,
   omschrijving,
   soortkey
)
AS
   SELECT DISTINCT
             TO_CHAR (rr.res_rsv_ruimte_van, 'yyyy-mm-dd')
          || rg.alg_gebouw_upper
          || TO_CHAR (rr.res_rsv_ruimte_van, 'hh24:mi')
             hide_f_srt,
          'Reservering',
          rr.res_reservering_key || '/' || rr.res_rsv_ruimte_volgnr nr,
          rg.alg_gebouw_omschrijving fclt_f_gebouw,
          rr.res_rsv_ruimte_van datum,
          TO_CHAR (rr.res_rsv_ruimte_van, 'hh24:mi') begintijd,
          TO_CHAR (rr.res_rsv_ruimte_tot, 'hh24:mi') eindtijd,
          r.res_ruimte_nr fclt_f_ruimte,
          o.res_opstelling_omschrijving opstelling,
          rr.res_rsv_ruimte_bezoekers aantal,
          rr.res_rsv_ruimte_omschrijving omschrijving,
          rr.res_rsv_ruimte_key
     FROM res_rsv_ruimte rr,
          res_ruimte_opstelling ro,
          res_opstelling o,
          res_ruimte r,
          res_alg_ruimte ar,
          alg_v_ruimte_gegevens rg
    WHERE     rr.res_rsv_ruimte_verwijder IS NULL
          AND ro.res_ruimte_opstel_key = rr.res_ruimte_opstel_key
          AND o.res_opstelling_key = ro.res_opstelling_key
          AND r.res_ruimte_key = ro.res_ruimte_key
          AND ar.res_ruimte_key = r.res_ruimte_key
          AND ar.res_alg_ruimte_verwijder IS NULL
          AND rg.alg_ruimte_key = ar.alg_ruimte_key
          AND rr.res_status_bo_key NOT IN (5, 6)
   UNION ALL
   SELECT DISTINCT
             TO_CHAR (m.mld_melding_datum, 'yyyy-mm-dd')
          || UPPER (rg.alg_gebouw_code)
          || TO_CHAR (m.mld_melding_datum, 'hh24:mi')
             hide_f_srt,
          'Melding',
          TO_CHAR (m.mld_melding_key),
          alg_g.alg_gebouw_omschrijving,
          m.mld_melding_datum,
          TO_CHAR (m.mld_melding_datum, 'hh24:mi'),
          NULL,
          rg.alg_ruimte_omschrijving,
          NULL,
          NULL,
          m.mld_melding_omschrijving,
          m.mld_melding_key
     FROM mld_melding m,
          mld_stdmelding sm,
          mld_disc_params vgp,
          alg_v_allonrgoed_gegevens rg,
          alg_gebouw alg_g
    WHERE     rg.alg_onroerendgoed_keys = m.mld_alg_onroerendgoed_keys
          AND m.mld_stdmelding_key = sm.mld_stdmelding_key
          AND sm.mld_ins_discipline_key = vgp.mld_ins_discipline_key
          AND vgp.mld_behandelgroep_key = 4                --Technische dienst
          AND alg_g.alg_gebouw_key = rg.alg_gebouw_key
          AND m.mld_melding_status IN (0, 2, 3, 4, 7);

CREATE OR REPLACE PROCEDURE drie_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);
BEGIN
   v_errorhint := 'Generieke import';
   -- 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;6;2;0;0;'
      || '0;0;0;0;17;0;0;3;0;1;'
      || '10;22;0;0;0;0;5;4;7;8;'
      || '9;13;18;19;14;15;16;20;12;11;'
      || '0;0;0;0;0;0',
      '"Mdw.";"Medewerker";"Mail_werk";"Loc";"Locatie";"OE";"Organisatorische_eenheid";"Kostenplaats";"Funct";"Functie";"Roepnaam";"Voorvoegsel";"Geboortenaam";"Naamgebruik_code";"Voorvoegsel_partner";"Geb.naam_partner";"Geslacht";"Begindatum_contract";"Einddatum_contract";"UPN";"Login"');

   -- Hier al login vullen, omdat deze anders wordt leeggemaakt en de sessie daarmee ook. Wanneer sessies leeg worden gemaakt, moet men met Mobile steeds opnieuw inloggen (57793)
   UPDATE fac_imp_perslid
      SET prs_perslid_oslogin =
             SUBSTR (prs_perslid_email,
                     1,
                     INSTR (prs_perslid_email, '@') - 1);

   v_errorhint := 'Klantspecifieke aanpassingen import';
   -- Klantspecifieke aanpassingen
   drie_post_import_perslid (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 drie_import_perslid;
/


CREATE OR REPLACE PROCEDURE drie_post_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);

CURSOR cafd
IS 
SELECT i.prs_afdeling_naam, i.prs_kenmerk3
   FROM fac_imp_perslid i
   WHERE i.prs_afdeling_naam NOT IN
    (SELECT a.prs_afdeling_naam FROM prs_afdeling a WHERE a.prs_afdeling_naam = i.prs_afdeling_naam)
    GROUP BY (i.prs_afdeling_naam, i.prs_kenmerk3);

BEGIN

v_errorhint := 'Toevoegen afdelingen';
  FOR rec IN cafd
  LOOP
     BEGIN
       INSERT INTO prs_afdeling
            (prs_bedrijf_key,
            prs_afdeling_naam,
            prs_afdeling_upper,
            prs_afdeling_omschrijving)
       VALUES
            (2,
            rec.prs_afdeling_naam,
            UPPER(rec.prs_afdeling_naam),
            rec.prs_kenmerk3);
     END;
  END LOOP;
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 drie_post_import_perslid;
/

CREATE OR REPLACE PROCEDURE drie_update_perslid (
   p_import_key IN NUMBER
) IS

   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   v_errormsg                VARCHAR2 (400);
   v_errorhint               VARCHAR2 (400);
   v_count           NUMBER;
   c_persoon_inactief       VARCHAR2 (30)   := 'INACTIEF: ';   
   -- Maximaal percentage aan nieuwe medewerkers tov. actieve medewerkers met een nummer
   c_max_delta_percentage   NUMBER (10)     := 1000;
   v_count_prs_actual       NUMBER (10);
   v_count_prs_import       NUMBER (10);          -- Matching actual persons!

BEGIN

    v_errorhint := 'Fout bij bepalen geldig bestand obv aantallen';
   
   SELECT DECODE (COUNT (*), 0, 1, COUNT (*))
     INTO v_count_prs_actual
     FROM prs_perslid
    WHERE prs_perslid_verwijder IS NULL AND prs_perslid_oslogin IS NOT NULL;

   SELECT DECODE (COUNT (*), 0, 1, COUNT (*))
     INTO v_count_prs_import
     FROM prs_perslid p, fac_imp_perslid ip
    WHERE p.prs_perslid_oslogin IS NOT NULL
      AND p.prs_perslid_verwijder IS NULL
      AND p.prs_perslid_oslogin = ip.prs_perslid_oslogin;

   IF (   (TRUNC ((v_count_prs_import / v_count_prs_actual) * 100) >=
                                               (100 - c_max_delta_percentage
                                               )
          )
      )
   THEN
      -- Geldig importbestand wat betreft aantal personen
       v_errorhint := 'Updaten personen';

      -- 'NR' betekent dat op basis van personeelsNummeR wordt gematched.
      -- 'A' betekent altijd alle (andere/overige) werkplekken verwijderen
      prs.update_perslid (p_import_key, 'NR', NULL);

      COMMIT;

--      -- Klantspecifieke aanpassingen
      v_errorhint := 'Klantspecifieke aanpassingen update';
      drie_post_update_perslid(p_import_key);
      
      COMMIT;
      
   END IF;

END drie_update_perslid;
/

CREATE OR REPLACE PROCEDURE drie_post_update_perslid (p_import_key IN NUMBER)
IS
   oracle_err_num        NUMBER;
   oracle_err_mes        VARCHAR2 (200);
   v_errormsg            VARCHAR2 (400);
   v_errorhint           VARCHAR2 (400);
   c_key_default_rol     NUMBER (10) := 1;
   v_aanduiding          VARCHAR2 (200);
   v_groep_defaultnaam   VARCHAR2 (30);
   p_prs_key             VARCHAR2 (200);
   p_ruimte_key          VARCHAR2 (200);


   -- Alle personen in de import moeten inlognaam krijgen en extern id tbv inloggen (via SAML)
   -- Login naam niet meer ivm 57793
   CURSOR clogin
   IS
      SELECT i.prs_perslid_naam,
             i.prs_perslid_email,
             i.prs_perslid_key,
             i.prs_kenmerk12
        FROM fac_imp_perslid i
       WHERE i.prs_perslid_email IS NOT NULL;

   -- Alle aanwezige personen met personeelsnummer (ie. de import-doelgroep) niet in een groep
   CURSOR cnogroup
   IS
      SELECT p.prs_perslid_key,
             p.prs_perslid_oslogin,
             p.prs_perslid_naam,
             p.prs_perslid_voornaam
        FROM prs_v_aanwezigperslid p
       WHERE p.prs_perslid_oslogin IS NOT NULL
             AND NOT EXISTS (SELECT 1
                               FROM fac_gebruikersgroep g
                              WHERE g.prs_perslid_key = p.prs_perslid_key);
-- Alle personen in de import moeten een werkplek krijgen.
--BESLUIT 4-2-2019: Werkplekken hoeven toch niet aangemaakt te worden!
--    CURSOR cwp
--    IS
--        SELECT i.prs_perslid_key,
--        i.prs_perslid_email,
--        i.prs_perslid_nr,
--        i.prs_perslid_naam,
--        i.prs_perslid_oslogin,
--        i.prs_kenmerk2,
--        (SELECT MAX(r.alg_ruimte_key)
--            FROM alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_locatie l
--            WHERE UPPER (l.alg_locatie_code) = UPPER (i.prs_kenmerk2)
--            AND l.alg_locatie_key = g.alg_locatie_key
--            AND g.alg_gebouw_key = v.alg_gebouw_key
--            AND v.alg_verdieping_key = r.alg_verdieping_key
--            AND r.alg_ruimte_verwijder IS NULL
--            AND UPPER (r.alg_ruimte_nr) = '_0') AS p_ruimte_key
--        FROM fac_imp_perslid i;

BEGIN
   -- Login naam: emailadres; Extern ID: imp_kenmerk12 = UPN (dat wordt meegegeven voor uniek attribuut tbv SAML)
   -- Login naam niet meer ivm 57793
   FOR rec IN clogin
   LOOP
      BEGIN
         v_aanduiding := rec.prs_perslid_naam;
         v_errorhint := 'Externid updaten tbv login - ' || rec.prs_perslid_naam;

         UPDATE prs_perslid p
            SET p.prs_perslid_externid = rec.prs_kenmerk12
          WHERE rec.prs_perslid_key = p.prs_perslid_key
                AND p.prs_perslid_verwijder IS NULL;

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

   COMMIT;

   -- Iedereen verwijderen die niet meer voorkomt (obv pers.nr)
   UPDATE prs_perslid
      SET prs_perslid_verwijder = SYSDATE
    WHERE prs_perslid_nr NOT IN (SELECT prs_perslid_nr FROM fac_imp_perslid)
          AND (SUBSTR (prs_perslid_oslogin, 1, 1) <> '_');

   -- Iedereen krijgt _default-rol die nog geen groep heeft.
   v_errorhint := 'Toevoegen default gebruikersprofiel';

   FOR recnogroup IN cnogroup
   LOOP
      BEGIN
         v_aanduiding :=
               recnogroup.prs_perslid_oslogin
            || '|'
            || recnogroup.prs_perslid_naam
            || '|'
            || recnogroup.prs_perslid_voornaam
            || ' - ';
         v_errorhint :=
            'Fout bij bepalen groep met key [' || c_key_default_rol || ']';

         SELECT fac_groep_upper
           INTO v_groep_defaultnaam
           FROM fac_groep
          WHERE fac_groep_key = c_key_default_rol;

         v_errorhint :=
               'Fout bij koppelen ' || recnogroup.prs_perslid_naam || ' aan groep met key ['
            || c_key_default_rol
            || ']';

         INSERT INTO fac_gebruikersgroep (fac_groep_key, prs_perslid_key)
             VALUES (c_key_default_rol, recnogroup.prs_perslid_key);

         COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=
                  'OTHERS (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              v_errormsg,
                              v_errorhint);
            COMMIT;
      END;
   END LOOP;
-- Verhuist een persoon p_prs_key naar een werkplek in p_ruimte_key
-- Als er al vaste werkplekken waren binnen het niveau van p_alg_type (R,V,G,L,D,NULL,A)
-- dan worden die geleegd/gewist. Bij NULL wordt niks gewist, bij A wordt altijd gewist.
--BESLUIT 4-2-2019: Werkplekken hoeven toch niet aangemaakt te worden!
--      FOR recwp IN cwp
--      LOOP
--         BEGIN
--            PRS.movetoruimte (recwp.prs_perslid_key, recwp.p_ruimte_key, 'R', 0);
--         END;
--      END LOOP;


-- Iedereen mandateren voor alle kostenplaatsen
   INSERT INTO prs_perslidkostenplaats (prs_perslid_key,
                                        prs_kostenplaats_key,
                                        prs_perslidkostenplaats_boeken,
                                        prs_perslidkostenplaats_inzage)
      SELECT p.prs_perslid_key,
             NULL,
             1,
             0
        FROM prs_v_aanwezigperslid p
       WHERE NOT EXISTS (SELECT 1
                           FROM prs_perslidkostenplaats
                          WHERE prs_perslid_key = p.prs_perslid_key);
END drie_post_update_perslid;
/

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