-- Script containing customer specific configuration sql statements for VIAR
-- (c) 2013 SG|facilitor bv
-- $Revision$
-- $Id$
--
-- Support: +31 53 4800700

set echo on

spool VIAR.lst

-- VIAR#33232
-- Zet alle opdrachten van afgemelde meldingen (= key 5) die zijn afgerond (= key 161) naar status historie (= key 7)
-- Zet alle afgemelde meldingen (= key 5) die zijn afgerond (= key 161) naar status historie (= key 6)
CREATE OR REPLACE PROCEDURE viar_export_nachtwerk (p_applname   IN VARCHAR2,
                                                   p_applrun    IN VARCHAR2,
                                                   p_filedir    IN VARCHAR2,
                                                   p_filename   IN VARCHAR2)
AS
   CURSOR cmafm
   IS
      SELECT   DISTINCT m.mld_melding_key
        FROM   mld_melding m, mld_opdr o
       WHERE   mld_melding_status = 5
               AND o.mld_melding_key = m.mld_melding_key
               AND m.mld_melding_key IN
                        (SELECT   fac_tracking_refkey
                           FROM   fac_tracking
                          WHERE   fac_srtnotificatie_key = 161);

   CURSOR coafm
   IS
      SELECT   mld_opdr_key
        FROM   mld_opdr
       WHERE   mld_statusopdr_key IN (6, 9)
               AND mld_melding_key IN
                        (SELECT   DISTINCT m.mld_melding_key
                           FROM   mld_melding m, mld_opdr o
                          WHERE   mld_melding_status = 5
                                  AND o.mld_melding_key = m.mld_melding_key
                                  AND o.mld_melding_key NOT IN
                                           (SELECT   mld_melding_key
                                              FROM   mld_opdr
                                             WHERE   mld_statusopdr_key NOT IN
                                                           (6, 9))
                                  AND m.mld_melding_key IN
                                           (SELECT   fac_tracking_refkey
                                              FROM   fac_tracking
                                             WHERE   fac_srtnotificatie_key =
                                                        161));

   v_errorhint      VARCHAR2 (1000);
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_count          NUMBER := 0;
   v_count2         NUMBER := 0;
BEGIN
   FOR r IN coafm
   LOOP
      BEGIN
         MLD.setopdrachtstatus (r.mld_opdr_key, 7, NULL);

         v_count2 := v_count2 + 1;


         COMMIT;
      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.writelog (p_applname,
                          'W',
                          v_errormsg,
                          v_errorhint);
            COMMIT;
      END;
   END LOOP;

   fac.writelog (p_applname,
                 'S',
                 'Aantal opdrachten verwerkt: ' || TO_CHAR (v_count2),
                 '');
   COMMIT;

   FOR r IN cmafm
   LOOP
      BEGIN
         MLD.setmeldingstatus (r.mld_melding_key, 6, NULL);

         v_count := v_count + 1;


         COMMIT;
      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.writelog (p_applname,
                          'W',
                          v_errormsg,
                          v_errorhint);
            COMMIT;
      END;
   END LOOP;

   fac.writelog (p_applname,
                 'S',
                 'Aantal meldingen verwerkt: ' || TO_CHAR (v_count),
                 '');

   COMMIT;
   
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.writelog (p_applname,
                    'E',
                    'Proces NACHTWERK afgebroken!',
                    v_errormsg);
      COMMIT;
END;
/

CREATE OR REPLACE PROCEDURE viar_import_prs (
   p_import_key IN NUMBER
)
IS
   c_fielddelimitor                VARCHAR2 (1)    := ';';
   -- LET OP: moet idem zijn als declaratie bij viar_UPDATE_PRS
   v_newline                       VARCHAR2 (1000);             -- Input line
   v_aanduiding                    VARCHAR2 (200);
   v_errorhint                     VARCHAR2 (1000);
   v_errormsg                      VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER := 0;
   v_ongeldig                      NUMBER (1);
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_count                         NUMBER;
   v_pos                           NUMBER;
   -- De importvelden:
   v_prs_perslid_nr                VARCHAR2 (256);
   v_prs_perslid_voornaam          VARCHAR2 (256);
   v_prs_perslid_naam              VARCHAR2 (256);
   v_prs_perslid_tussenvoegsel     VARCHAR2 (256);
   v_prs_perslid_voorletters       VARCHAR2 (256);
   v_prs_afdeling_code             VARCHAR2 (256);
   v_prs_srtperslid_omschrijving   VARCHAR2 (256);
   v_prs_perslid_telefoonnr        VARCHAR2 (256);
   v_prs_perslid_mobiel            VARCHAR2 (256);
   v_prs_perslid_email             VARCHAR2 (256);
   v_prs_perslid_oslogin           VARCHAR2 (256);


   -- Overig:
   v_alg_locatie_code              VARCHAR2 (256);
   v_alg_gebouw_code               VARCHAR2 (256);


   CURSOR c1
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   DELETE FROM viar_imp_prs;

   COMMIT;

   v_count_tot := 0;
   v_count_import := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_aanduiding := '';
         v_errorhint := 'Fout bij opvragen te importeren rij';
         v_ongeldig := 0;
         -- Lees alle veldwaarden

         -- 01, 02, 03, 04 - Naam van medewerkers in de 1e 4 kolommen: voornaam, voorletters, tussenvoegsels, achternaam.
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_voornaam);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_voorletters);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_tussenvoegsel);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_naam);


         -- 05 - Afdelingscode
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_afdeling_code);

         -- 06 - Functieomschrijving van medewerker
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_srtperslid_omschrijving);

         -- 07 - Email adres van medewerker
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_email);

         -- 08 - Mobiel van medewerker
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_mobiel);

         -- 09 - Telnr van medewerker
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_telefoonnr);

         -- 10 - Usernaam/login
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_oslogin);



         --
         v_aanduiding :=
               '['
            || v_prs_perslid_oslogin
            || '|'
            || v_prs_perslid_naam
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF  UPPER (v_prs_perslid_voornaam) = 'ROEPNAAM'
                AND UPPER (v_prs_perslid_naam) = 'ACHTERNAAM'
                AND UPPER (v_prs_afdeling_code) = 'AFDNR.'
                AND UPPER (v_prs_srtperslid_omschrijving) = 'FUNCTIE'
                AND UPPER (v_prs_perslid_email) = 'E-MAIL'
                AND UPPER (v_prs_perslid_mobiel) = 'MOBILE'
                AND UPPER (v_prs_perslid_telefoonnr) = 'TELEFOON'
                AND UPPER (v_prs_perslid_oslogin) = 'LOGIN'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden

            --
            v_errorhint := 'Ongeldige naam';
            v_prs_perslid_naam := TRIM (v_prs_perslid_naam);

            IF LENGTH (v_prs_perslid_naam) > 30
            THEN
               v_prs_perslid_naam := SUBSTR (v_prs_perslid_naam, 1, 30);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Naam te lang',
                                    'Naam wordt afgebroken tot ['
                                 || v_prs_perslid_naam
                                 || ']'
                                );
            ELSE
               IF (v_prs_perslid_naam IS NULL)
               THEN
                  v_ongeldig := 1;
                  fac.imp_writelog
                              (p_import_key,
                               'E',
                               v_aanduiding || 'Naam onbekend',
                               'Naam is verplicht; regel wordt overgeslagen!'
                              );
               END IF;
            END IF;
            COMMIT;

            --

            v_errorhint := 'Ongeldig loginnaam';
            v_prs_perslid_oslogin := TRIM (v_prs_perslid_oslogin);

            IF LENGTH (v_prs_perslid_oslogin) > 30
            THEN
               v_prs_perslid_oslogin := SUBSTR (v_prs_perslid_oslogin, 1, 30);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Loginnaam te lang',
                                    'Loginnaam wordt afgebroken tot ['
                                 || v_prs_perslid_oslogin
                                 || ']'
                                );
            ELSE
               IF (v_prs_perslid_oslogin IS NULL)
               THEN
                  v_ongeldig := 1;
                  fac.imp_writelog
                     (p_import_key,
                      'E',
                      v_aanduiding || 'Usernaam/login onbekend',
                      'Usernaam/login is verplicht; regel wordt overgeslagen!'
                     );
               END IF;
            END IF;
            COMMIT;

            --
            v_errorhint := 'Ongeldig e-mailadres';
            v_prs_perslid_email := TRIM (v_prs_perslid_email);

            IF LENGTH (v_prs_perslid_email) > 200
            THEN
               v_prs_perslid_email := SUBSTR (v_prs_perslid_email, 1, 200);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'E-mailadres te lang',
                                    'E-mailadres wordt afgebroken tot ['
                                 || v_prs_perslid_email
                                 || ']'
                                );
               COMMIT;
            END IF;



            --
            v_errorhint := 'Ongeldig tussenvoegsel';
            v_prs_perslid_tussenvoegsel := TRIM (v_prs_perslid_tussenvoegsel);

            IF LENGTH (v_prs_perslid_tussenvoegsel) > 15
            THEN
               v_prs_perslid_tussenvoegsel :=
                                  SUBSTR (v_prs_perslid_tussenvoegsel, 1, 15);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Tussenvoegsel te lang',
                                    'Tussenvoegsel wordt afgebroken tot ['
                                 || v_prs_perslid_tussenvoegsel
                                 || ']'
                                );
               COMMIT;
            END IF;

            --
            v_errorhint := 'Ongeldige voorletters';
            v_prs_perslid_voorletters := TRIM (v_prs_perslid_voorletters);

            IF LENGTH (v_prs_perslid_voorletters) > 10
            THEN
               v_prs_perslid_voorletters :=
                                    SUBSTR (v_prs_perslid_voorletters, 1, 10);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Voorletters te lang',
                                    'Voorletters worden afgebroken tot ['
                                 || v_prs_perslid_voorletters
                                 || ']'
                                );
               COMMIT;
            END IF;

            --
            v_errorhint := 'Ongeldige voornaam';
            v_prs_perslid_voornaam := TRIM (v_prs_perslid_voornaam);

            IF LENGTH (v_prs_perslid_voornaam) > 30
            THEN
               v_prs_perslid_voornaam :=
                                       SUBSTR (v_prs_perslid_voornaam, 1, 30);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Voornaam is te lang',
                                    'Voornaam wordt afgebroken tot ['
                                 || v_prs_perslid_voornaam
                                 || ']'
                                );
            END IF;
            COMMIT;





            v_errorhint := 'Ongeldige afdelingcode';
            v_prs_afdeling_code := TRIM (v_prs_afdeling_code);

            IF LENGTH (v_prs_afdeling_code) > 10
            THEN
               v_prs_afdeling_code := SUBSTR (v_prs_afdeling_code, 1, 10);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Afdelingscode te lang',
                                    'Afdelingscode wordt afgebroken tot ['
                                 || v_prs_afdeling_code
                                 || ']'
                                );
            ELSE
               IF (v_prs_afdeling_code IS NULL)
               THEN
                  v_ongeldig := 1;
                  fac.imp_writelog
                     (p_import_key,
                      'E',
                      v_aanduiding || 'Afdelingscode onbekend',
                      'Afdelingscode is verplicht; regel wordt overgeslagen!'
                     );
               END IF;
            END IF;
            COMMIT;


            --
            v_errorhint := 'Ongeldige functie';
            v_prs_srtperslid_omschrijving := TRIM (v_prs_srtperslid_omschrijving);

            IF LENGTH (v_prs_srtperslid_omschrijving) > 60
            THEN
               v_prs_srtperslid_omschrijving :=
                                SUBSTR (v_prs_srtperslid_omschrijving, 1, 60);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Functie te lang',
                                    'Functie wordt afgebroken tot ['
                                 || v_prs_srtperslid_omschrijving
                                 || ']'
                                );
            ELSE
               IF (v_prs_srtperslid_omschrijving IS NULL)
               THEN
                  v_prs_srtperslid_omschrijving := 'Onbekend';
                  fac.imp_writelog
                           (p_import_key,
                            'W',
                            v_aanduiding || 'Functie onbekend',
                            'Functie heeft lege waarde en is verplicht; wordt door Facilitor op onbekend gezet!'
                           );
               END IF;
            END IF;
            COMMIT;

            --
            v_errorhint := 'Ongeldige plaats/locatiecode';
            v_alg_locatie_code := TRIM(v_alg_locatie_code);

            IF LENGTH (v_alg_locatie_code) > 5
            THEN
               v_alg_locatie_code := SUBSTR (v_alg_locatie_code, 1, 5);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Locatiecode te lang',
                                    'Locatiecode wordt afgebroken tot ['
                                 || v_alg_locatie_code
                                 || ']'
                                );
               COMMIT;
            END IF;

            --
            v_errorhint := 'Ongeldige plaats/gebouwcode';
            v_alg_gebouw_code := TRIM(v_alg_gebouw_code);

            IF LENGTH (v_alg_gebouw_code) > 10
            THEN
               v_alg_gebouw_code := SUBSTR (v_alg_gebouw_code, 1, 10);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Gebouwcode te lang',
                                    'Gebouwcode wordt afgebroken tot ['
                                 || v_alg_gebouw_code
                                 || ']'
                                );
               COMMIT;
            END IF;

            --
            v_errorhint := 'Ongeldig mobiel nummer';
            v_prs_perslid_mobiel := TRIM (v_prs_perslid_mobiel);

            IF LENGTH (v_prs_perslid_mobiel) > 15
            THEN
               v_prs_perslid_mobiel := SUBSTR (v_prs_perslid_mobiel, 1, 15);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Mobiel nummer te lang',
                                    'mobiel nummer wordt afgebroken tot ['
                                 || v_prs_perslid_mobiel
                                 || ']'
                                );
               COMMIT;
            END IF;


            v_errorhint := 'Ongeldig telefoonnummer';
            v_prs_perslid_telefoonnr := TRIM (v_prs_perslid_telefoonnr);

            IF LENGTH (v_prs_perslid_telefoonnr) > 15
            THEN
               v_prs_perslid_telefoonnr :=
                                     SUBSTR (v_prs_perslid_telefoonnr, 1, 15);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Telefoonnummer te lang',
                                    'Telefoonnummer wordt afgebroken tot ['
                                 || v_prs_perslid_telefoonnr
                                 || ']'
                                );
               COMMIT;
            END IF;

            COMMIT;


            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               BEGIN
                  v_errorhint :=
                      'Fout bij toevoegen regel aan importtabel VIAR_IMP_PRS';

                  INSERT INTO viar_imp_prs
                          (prs_perslid_naam,
                           prs_perslid_tussenvoegsel,
                           prs_perslid_voorletters,
                           prs_perslid_voornaam,
                           prs_afdeling_code,
                           prs_srtperslid_omschrijving,
                           alg_locatie_code, alg_gebouw_code,
                           alg_verdieping_volgnr, alg_ruimte_nr,
                           prs_perslid_telefoonnr,
                           prs_perslid_mobiel,
                           prs_perslid_email,
                           prs_perslid_oslogin
                          )
                   VALUES (v_prs_perslid_naam,
                           v_prs_perslid_tussenvoegsel,
                           v_prs_perslid_voorletters,
                           v_prs_perslid_voornaam,
                           v_prs_afdeling_code,
                           v_prs_srtperslid_omschrijving,
                           v_alg_locatie_code, v_alg_gebouw_code,
                           NULL, NULL,
                           v_prs_perslid_telefoonnr,
                           v_prs_perslid_mobiel,
                           v_prs_perslid_email,
                           v_prs_perslid_oslogin
                          );
                  COMMIT;
                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=
                           v_errorhint
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog
                             (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Ingelezen regel kan niet worden weggeschreven!'
                             );
                     COMMIT;
               END;
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!'
                       );
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                           'Persoon: aantal ingelezen regels: '
                        || TO_CHAR (v_count_tot),
                        ''
                       );
      fac.imp_writelog (p_import_key,
                        'S',
                           'Persoon: aantal ongeldige importregels: '
                        || TO_CHAR (v_count_tot - v_count_import),
                        ''
                       );
   END IF;
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
           'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        v_errorhint
                       );
      COMMIT;
END viar_import_prs;
/

CREATE OR REPLACE PROCEDURE viar_update_prs (
   p_import_key IN NUMBER
)
IS
   -- LET OP: moet idem zijn als declaratie bij VIAR_IMPORT_PRS
   c_persoon_inactief       VARCHAR2 (30)   := 'INACTIEF: ';
   -- Maximaal percentage aan nieuwe medewerkers tov. actieve medewerkers met een nummer
   c_max_delta_percentage   NUMBER (10)     := 20;
   -- Ruimte waar personen in geplaatst worden (indien nog geen ruimte in opgegeven gebouw)
   c_ruimte_nr              VARCHAR2 (10)   := '000';
   -- Groep waar personen in geplaatst worden (indien nog geen groep)

   c_key_default_rol        NUMBER(10) := 1;

   v_aanduiding             VARCHAR2 (200);
   v_errorhint              VARCHAR2 (1000);
   v_errormsg               VARCHAR2 (1000);
   oracle_err_num           NUMBER;
   oracle_err_mes           VARCHAR2 (200);
   v_count_prs_actual       NUMBER (10);
   v_count_prs_import       NUMBER (10);          -- Matching actual persons!
   v_count_tot              NUMBER (10);
   v_count_error            NUMBER (10);
   v_count                  NUMBER (10);
   --
   v_perslid_key            NUMBER (10);
   v_afdeling_key           NUMBER (10);

   v_srtperslid_key         NUMBER (10);
   v_oslogin                VARCHAR2 (30);
   v_wachtwoord             VARCHAR2 (30);
   v_locatie_key            NUMBER (10);
   v_gebouw_key             NUMBER (10);
   v_verdieping_key         NUMBER (10);
   v_ruimte_key             NUMBER (10);
   v_wp_key                 NUMBER (10);
   v_wp_volgnr              NUMBER (3);
   v_wp_oms                 VARCHAR2 (30);
   v_groep_defaultnaam      VARCHAR2 (30);

   -- Let op! Personen met een functie (srt_perslid) waarvan het oppervlak expliciet op 0 is gezet, betekent een functie die tijdelijk is cq. externe is
   -- Dus oppervlak leeg laten of een oppervlak > 0 is een interne. Normailiter is oppervlak gewoon leeg.
   -- Via deze regel is het dus mogelijk om een externe of systeemuser aan te maken, die niet via AD wordt aangemaakt, maar handmatig.
   -- Je geeft deze persoon een SPECIALE, IN AD NIET BESTAANDE functienaam (bv EXTERN, of SYSTEM, of NOT-AD) met opp=0.
   -- Die blijven dan gewoon in het systeem staan en worden NIET verwijderd omdat ze niet in AD export staan.
   -- Ook personen met die als loginnaam beginnen met een _ (underscore) worden niet verwijderd.
   CURSOR cdelprs
   IS
     SELECT p.prs_perslid_key, p.prs_perslid_oslogin, p.prs_perslid_naam,
             p.prs_perslid_voornaam
        FROM prs_v_aanwezigperslid p, prs_srtperslid sp
       WHERE p.prs_srtperslid_key = sp.prs_srtperslid_key
         AND COALESCE(sp.prs_srtperslid_opp,1) > 0
         AND SUBSTR(p.prs_perslid_oslogin,1,1) <> '_'
        AND NOT EXISTS (
                SELECT 1
                  FROM viar_imp_prs ip
                 WHERE UPPER(ip.prs_perslid_oslogin) = UPPER(p.prs_perslid_oslogin));


   CURSOR csperslid
   IS
      SELECT prs_srtperslid_omschrijving
      FROM viar_imp_prs
      GROUP BY prs_srtperslid_omschrijving;


   CURSOR cprsafd
   IS
      SELECT UPPER(prs_afdeling_code) prs_afdeling_code, MIN(prs_afdeling_naam) prs_afdeling_naam
      FROM viar_imp_prs
      GROUP BY UPPER (prs_afdeling_code);

   CURSOR cperslid
   IS
      SELECT *
        FROM viar_imp_prs;

   CURSOR cwp
   IS
      SELECT p.*, ip.alg_locatie_code, ip.alg_gebouw_code
        FROM viar_imp_prs ip, prs_v_aanwezigperslid p
       WHERE ip.alg_locatie_code IS NOT NULL
         AND ip.alg_gebouw_code IS NOT NULL
         AND UPPER (ip.prs_perslid_oslogin) = UPPER (p.prs_perslid_oslogin);

   -- Alle actieve personen met personeelsnummer (ie. de import-doelgroep) zonder een werkplek
   CURSOR cnowp
   IS
      SELECT p.prs_perslid_key, p.prs_perslid_oslogin, p.prs_perslid_naam,
             p.prs_perslid_voornaam
        FROM prs_v_aanwezigperslid p, prs_srtperslid sp
       WHERE p.prs_srtperslid_key = sp.prs_srtperslid_key
         AND COALESCE(sp.prs_srtperslid_opp,1) > 0
         AND p.prs_perslid_naam NOT LIKE c_persoon_inactief || '%'
         AND NOT EXISTS (SELECT 1
                           FROM prs_perslidwerkplek pw
                          WHERE pw.prs_perslid_key = p.prs_perslid_key);

   -- Alle aanwezige personen vanuit AD (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, prs_srtperslid sp
       WHERE p.prs_srtperslid_key = sp.prs_srtperslid_key
         AND COALESCE(sp.prs_srtperslid_opp,1) > 0
         AND NOT EXISTS (SELECT 1
                           FROM fac_gebruikersgroep g
                          WHERE g.prs_perslid_key = p.prs_perslid_key);


BEGIN
    -- Alle niet verwijderde personen die via AD zijn geimporteerd.
   SELECT DECODE (COUNT (*), 0, 1, COUNT (*))
     INTO v_count_prs_actual
          FROM prs_perslid p, prs_srtperslid sp
       WHERE p.prs_srtperslid_key = sp.prs_srtperslid_key
         AND COALESCE(sp.prs_srtperslid_opp,1) > 0
         AND p.prs_perslid_verwijder IS NULL
         AND (prs_perslid_oslogin IS NULL OR SUBSTR(prs_perslid_oslogin,1,1) <> '_');

    -- Alle personen die via AD zijn geimporteerd en nu weer in AD worden aangeboden.
   SELECT DECODE (COUNT (*), 0, 1, COUNT (*))
     INTO v_count_prs_import
     FROM prs_perslid p, viar_imp_prs ip, prs_srtperslid sp
       WHERE p.prs_srtperslid_key = sp.prs_srtperslid_key
         AND COALESCE(sp.prs_srtperslid_opp,1) > 0
         AND p.prs_perslid_verwijder IS NULL
         AND UPPER(p.prs_perslid_oslogin) = UPPER(ip.prs_perslid_oslogin);

   -- Als alle personen
   IF (  v_count_prs_actual = 1 OR (TRUNC ((v_count_prs_import / v_count_prs_actual) * 100) >=
                                               (100 - c_max_delta_percentage
                                               )
          )
      )
   THEN
      -- Geldig importbestand wat betreft aantal personen
      FOR recdelprs IN cdelprs
      LOOP
         BEGIN
            -- Heeft persoon actuele/toekomstige verplichtingen?
            SELECT COUNT (*)
              INTO v_count
              FROM prs_perslid p, prs_v_verplichting_keys r
             WHERE p.prs_perslid_key = r.prs_perslid_key
               AND p.prs_perslid_key = recdelprs.prs_perslid_key;

            IF (v_count = 0)
            THEN
               v_errorhint := 'Fout bij verwijderen persoon';

               UPDATE prs_perslid
                  SET prs_perslid_verwijder = SYSDATE
                WHERE prs_perslid_key = recdelprs.prs_perslid_key;

               fac.imp_writelog (p_import_key,
                                 'I',
                                    'Persoon met nummer ['
                                 || recdelprs.prs_perslid_oslogin
                                 || '] en naam ['
                                 || recdelprs.prs_perslid_naam
                                 || ', '
                                 || recdelprs.prs_perslid_voornaam
                                 || '] is verwijderd',
                                 'Persoon is verwijderd'
                                );
               COMMIT;
            ELSE
               -- Staat persoon INACTIEF?
               SELECT COUNT (*)
                 INTO v_count
                 FROM prs_perslid p
                WHERE p.prs_perslid_naam LIKE c_persoon_inactief || '%'
                  AND p.prs_perslid_key = recdelprs.prs_perslid_key;

               IF (v_count = 0)
               THEN
                  v_errorhint := 'Fout bij INACTIEF zetten persoon';

                  -- Persoon INACTIEF zetten (update naam + reset oslogin)
                  UPDATE prs_perslid
                     SET prs_perslid_naam =
                            SUBSTR (c_persoon_inactief || prs_perslid_naam,
                                    1,
                                    30
                                   ),
                         prs_perslid_oslogin = NULL
                   WHERE prs_perslid_key = recdelprs.prs_perslid_key;

                  fac.imp_writelog (p_import_key,
                                    'I',
                                       'Persoon met nummer ['
                                    || recdelprs.prs_perslid_oslogin
                                    || '] en naam ['
                                    || recdelprs.prs_perslid_naam
                                    || ', '
                                    || recdelprs.prs_perslid_voornaam
                                    || '] is INACTIEF gezet',
                                    'Persoon is INACTIEF gezet'
                                   );
               ELSE
                  v_errorhint := 'Fout bij INACTIEF maken persoon';

                  -- Persoon INACTIEF maken (reset oslogin; indien handmatig INACTIEF gezet)
                  UPDATE prs_perslid
                     SET prs_perslid_oslogin = NULL
                   WHERE prs_perslid_naam LIKE c_persoon_inactief || '%'
                     AND prs_perslid_oslogin IS NOT NULL;

                  fac.imp_writelog (p_import_key,
                                    'I',
                                       'Persoon met nummer ['
                                    || recdelprs.prs_perslid_oslogin
                                    || '] en naam ['
                                    || recdelprs.prs_perslid_naam
                                    || ', '
                                    || recdelprs.prs_perslid_voornaam
                                    || '] is INACTIEF gemaakt',
                                    'Persoon is INACTIEF gemaakt'
                                   );
               END IF;
               COMMIT;
            END IF;
         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;

      v_count_tot := 0;
      v_count_error := 0;

      FOR recsperslid IN csperslid
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding := recsperslid.prs_srtperslid_omschrijving || ' - ';
            v_errorhint := 'Fout bij bepalen functie';

            SELECT COUNT (*)
              INTO v_count
              FROM prs_srtperslid
             WHERE UPPER (prs_srtperslid_omschrijving) =
                               UPPER (recsperslid.prs_srtperslid_omschrijving)
               AND prs_srtperslid_verwijder IS NULL;

            IF (v_count = 0)
            THEN
               v_errorhint := 'Fout bij toevoegen functie';

               INSERT INTO prs_srtperslid (prs_srtperslid_omschrijving)
               VALUES (recsperslid.prs_srtperslid_omschrijving);
               COMMIT;
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               v_count_error := v_count_error + 1;
               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_aanduiding || v_errormsg,
                                 v_errorhint
                                );
               COMMIT;
         END;
      END LOOP;

      fac.imp_writelog (p_import_key,
                        'S',
                           'Functie: verwerkte regels zonder foutmelding: '
                        || TO_CHAR (v_count_tot - v_count_error),
                        ''
                       );
      fac.imp_writelog (p_import_key,
                        'S',
                           'Functie: verwerkte regels met foutmelding: '
                        || TO_CHAR (v_count_error),
                        ''
                       );

      COMMIT;

      v_count_tot := 0;
      v_count_error := 0;

      FOR recperslid IN cperslid
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding :=
                  recperslid.prs_perslid_oslogin
               || '|'
               || recperslid.prs_perslid_naam
               || '|'
               || recperslid.prs_perslid_voornaam
               || ' - '
               || recperslid.prs_afdeling_code
               || ' - ';

            v_errorhint :=
                  'Fout bij bepalen functie ['
               || recperslid.prs_srtperslid_omschrijving
               || ']';

            SELECT prs_srtperslid_key
              INTO v_srtperslid_key
              FROM prs_srtperslid
             WHERE prs_srtperslid_verwijder IS NULL
               AND UPPER (prs_srtperslid_omschrijving) =
                                UPPER (recperslid.prs_srtperslid_omschrijving);

            v_errorhint :=
                  'Fout bij bepalen afdeling ['
               || recperslid.prs_afdeling_naam
               || ']';

            SELECT prs_afdeling_key
              INTO v_afdeling_key
              FROM prs_afdeling
             WHERE prs_afdeling_verwijder IS NULL
               AND UPPER (prs_afdeling_naam) = UPPER (recperslid.prs_afdeling_code);

            v_errorhint := 'Fout bij bepalen persoon';

            SELECT COUNT (*), MAX (prs_perslid_key)
              INTO v_count, v_perslid_key
              FROM prs_perslid
             WHERE prs_perslid_verwijder IS NULL
               AND UPPER (prs_perslid_oslogin) = UPPER (recperslid.prs_perslid_oslogin);


						IF (v_count = 0)
            THEN
               v_errorhint := 'Fout bij toevoegen persoon';
               -- Nieuwe persoon uit importbestand, wordt toegevoegd in Facilitor.
               INSERT INTO prs_perslid
                           (prs_perslid_module, prs_srtperslid_key,
                            prs_afdeling_key, prs_perslid_naam,
                            prs_perslid_voorletters,
                            prs_perslid_tussenvoegsel,
                            prs_perslid_voornaam,
                            prs_perslid_telefoonnr,
                            prs_perslid_mobiel,
                            prs_perslid_email,
                            prs_perslid_oslogin
                           )
                    VALUES ('PRS', v_srtperslid_key,
                            v_afdeling_key, recperslid.prs_perslid_naam,
                            recperslid.prs_perslid_voorletters,
                            recperslid.prs_perslid_tussenvoegsel,
                            recperslid.prs_perslid_voornaam,
                            recperslid.prs_perslid_telefoonnr,
                            recperslid.prs_perslid_mobiel,
                            recperslid.prs_perslid_email,
                            recperslid.prs_perslid_oslogin
                           );
               COMMIT;
            ELSE

               v_errorhint := 'Fout bij wijzigen persoon';

               -- Functie, Afdeling altijd bijwerken
               -- Voorletters, Naam, Tussenvoegsels, Voornaam alleen indien gevuld wordt aangeboden, anders laten staan wat in DB stond.
               -- Telefoonnr: alleen bijwerken indien uit AD-dump gevuld, anders niet bijwerken (dus gewoon laten staan zoals in Facilitor was gereigistreerd).
               -- E-mail: alleen bijwerken indien uit AD-dump gevuld, anders niet bijwerken (dus gewoon laten staan zoals in Facilitor was gereigistreerd).
               -- Login: alleen bijwerken indien uit AD-dump gevuld, anders niet bijwerken (dus gewoon laten staan zoals in Facilitor was gereigistreerd).

               UPDATE prs_perslid
                  SET prs_srtperslid_key = v_srtperslid_key,
                      prs_afdeling_key = v_afdeling_key,
                      prs_perslid_naam = COALESCE(recperslid.prs_perslid_naam,prs_perslid_naam),
                      prs_perslid_voorletters = COALESCE(recperslid.prs_perslid_voorletters,prs_perslid_voorletters),
                      prs_perslid_tussenvoegsel = COALESCE(recperslid.prs_perslid_tussenvoegsel,prs_perslid_tussenvoegsel),
                      prs_perslid_voornaam = COALESCE(recperslid.prs_perslid_voornaam,prs_perslid_voornaam),
                      prs_perslid_telefoonnr = COALESCE (recperslid.prs_perslid_telefoonnr, prs_perslid_telefoonnr),
                      prs_perslid_mobiel = COALESCE (recperslid.prs_perslid_mobiel, prs_perslid_mobiel),
                      prs_perslid_email = COALESCE (recperslid.prs_perslid_email, prs_perslid_email),
                      prs_perslid_oslogin = COALESCE (recperslid.prs_perslid_oslogin, prs_perslid_oslogin)
                  WHERE prs_perslid_key = v_perslid_key;
               COMMIT;
            END IF;



         EXCEPTION
            WHEN OTHERS
            THEN
               v_count_error := v_count_error + 1;
               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_aanduiding || v_errormsg,
                                 v_errorhint
                                );
               COMMIT;
         END;
      END LOOP;

      fac.imp_writelog (p_import_key,
                        'S',
                           'Persoon: verwerkte regels zonder foutmelding: '
                        || TO_CHAR (v_count_tot - v_count_error),
                        ''
                       );
      fac.imp_writelog (p_import_key,
                        'S',
                           'Persoon: verwerkte regels met foutmelding: '
                        || TO_CHAR (v_count_error),
                        ''
                       );
      COMMIT;

      v_count_tot := 0;
      v_count_error := 0;

      FOR recwp IN cwp
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding :=
                  recwp.prs_perslid_oslogin
               || '|'
               || recwp.prs_perslid_naam
               || '|'
               || recwp.prs_perslid_voornaam
               || '|'
               || recwp.alg_locatie_code
               || '|'
               || recwp.alg_gebouw_code
               || ' - ';
            v_errorhint := 'Fout bij bepalen persoon';

            SELECT prs_perslid_key
              INTO v_perslid_key
              FROM prs_v_aanwezigperslid
             WHERE UPPER (prs_perslid_oslogin) = UPPER (recwp.prs_perslid_oslogin);

            v_errorhint := 'Fout bij bepalen locatie';

            SELECT alg_locatie_key
              INTO v_locatie_key
              FROM alg_v_aanweziglocatie
             WHERE UPPER (alg_locatie_code) = UPPER (recwp.alg_locatie_code);

            v_errorhint := 'Fout bij bepalen gebouw';

            SELECT alg_gebouw_key
              INTO v_gebouw_key
              FROM alg_v_aanweziggebouw
             WHERE alg_locatie_key = v_locatie_key
               AND UPPER (alg_gebouw_code) = UPPER (recwp.alg_gebouw_code);

            v_errorhint := 'Fout bij bepalen verdieping';

            SELECT alg_verdieping_key
              INTO v_verdieping_key
              FROM alg_v_aanwezigverdieping
             WHERE alg_gebouw_key = v_gebouw_key
               AND alg_verdieping_volgnr = (SELECT MIN (v.alg_verdieping_volgnr)
						                      FROM alg_verdieping v
					                         WHERE v.alg_gebouw_key = v_gebouw_key
								               AND v.alg_verdieping_volgnr >= 0);

            v_errorhint :=
                    'Fout bij bepalen of persoon in gebouw een werkplek heeft';

            SELECT COUNT (*)
              INTO v_count
              FROM prs_perslidwerkplek pw,
                   prs_werkplek wp,
                   alg_ruimte r,
                   alg_verdieping v
             WHERE pw.prs_perslid_key = v_perslid_key
               AND pw.prs_werkplek_key = wp.prs_werkplek_key
               AND wp.prs_alg_ruimte_key = r.alg_ruimte_key
               AND r.alg_verdieping_key = v.alg_verdieping_key
               AND v.alg_gebouw_key = v_gebouw_key;

            -- v_count=0 -> persoon verhuist naar/krijgt wp in gebouw.
            IF (v_count = 0)
            THEN
               v_errorhint := 'Fout bij bepalen ruimte';

               SELECT COUNT (*)
                 INTO v_count
                 FROM alg_v_aanwezigruimte r
                WHERE r.alg_verdieping_key = v_verdieping_key
                  AND r.alg_ruimte_nr = c_ruimte_nr;

               -- v_count=0 -> ruimte '000' bestaat nog niet.
               IF (v_count = 0)
               THEN
                  v_errorhint := 'Fout bij toevoegen ruimte';

                  INSERT INTO alg_ruimte
                              (alg_verdieping_key, alg_srtruimte_key,
                               alg_ruimte_nr
                              )
                       VALUES (v_verdieping_key, 21,      -- facilitaire ruimte
                               c_ruimte_nr
                              );
                  COMMIT;
               END IF;

               v_errorhint := 'Fout bij bepalen ruimte';

               SELECT alg_ruimte_key
                 INTO v_ruimte_key
                 FROM alg_v_aanwezigruimte r
                WHERE r.alg_verdieping_key = v_verdieping_key
                  AND r.alg_ruimte_nr = c_ruimte_nr;

               v_errorhint := 'Fout bij bepalen vrije werkplek';

               SELECT COUNT (w.prs_werkplek_key)
                 INTO v_count
                 FROM prs_werkplek w
                WHERE w.prs_alg_ruimte_key = v_ruimte_key
                  AND NOT EXISTS (
                                SELECT 1
                                  FROM prs_perslidwerkplek pw
                                 WHERE pw.prs_werkplek_key =
                                                            w.prs_werkplek_key);

               IF (v_count > 0)
               THEN
                  SELECT MIN (w.prs_werkplek_key)
                    INTO v_wp_key
                    FROM prs_werkplek w
                   WHERE w.prs_alg_ruimte_key = v_ruimte_key
                     AND NOT EXISTS (
                                SELECT 1
                                  FROM prs_perslidwerkplek pw
                                 WHERE pw.prs_werkplek_key =
                                                            w.prs_werkplek_key);

                  v_errorhint :=
                                'Fout bij koppelen persoon aan vrije werkplek';

                  INSERT INTO prs_perslidwerkplek
                              (prs_perslid_key, prs_werkplek_key,
                               prs_perslidwerkplek_bezetting
                              )
                       VALUES (v_perslid_key, v_wp_key,
                               100
                              );
                  COMMIT;
               ELSE
                  v_errorhint := 'Fout bij bepalen nieuwe werkplek';

                  SELECT prs_s_prs_werkplek_key.NEXTVAL
                    INTO v_wp_key
                    FROM DUAL;

                  SELECT COALESCE (MAX (w.prs_werkplek_volgnr), 0) + 1
                    INTO v_wp_volgnr
                    FROM prs_werkplek w
                   WHERE w.prs_alg_ruimte_key = v_ruimte_key;

                  v_wp_oms := c_ruimte_nr || '/' || TO_CHAR (v_wp_volgnr);

                  v_errorhint := 'Fout bij aanmaken nieuwe werkplek';

                  INSERT INTO prs_werkplek
                              (prs_werkplek_key, prs_werkplek_module,
                               prs_werkplek_volgnr,
                               prs_werkplek_omschrijving, prs_alg_ruimte_key
                              )
                       VALUES (v_wp_key, 'PRR',
                               v_wp_volgnr,
                               v_wp_oms, v_ruimte_key
                              );

                  v_errorhint :=
                               'Fout bij koppelen persoon aan nieuwe werkplek';

                  INSERT INTO prs_perslidwerkplek
                              (prs_perslid_key, prs_werkplek_key,
                               prs_perslidwerkplek_bezetting
                              )
                       VALUES (v_perslid_key, v_wp_key,
                               100
                              );
                  COMMIT;
               END IF;
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               v_count_error := v_count_error + 1;
               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_aanduiding || v_errormsg,
                                 v_errorhint
                                );
               COMMIT;
         END;
      END LOOP;

      fac.imp_writelog (p_import_key,
                        'S',
                           'Werkplek: verwerkte regels zonder foutmelding: '
                        || TO_CHAR (v_count_tot - v_count_error),
                        ''
                       );
      fac.imp_writelog (p_import_key,
                        'S',
                           'Werkplek: verwerkte regels met foutmelding: '
                        || TO_CHAR (v_count_error),
                        ''
                       );
      COMMIT;

      FOR recnowp IN cnowp
      LOOP
         BEGIN
            fac.imp_writelog (p_import_key,
                              'I',
                                 'Persoon met nummer ['
                              || recnowp.prs_perslid_oslogin
                              || '] en naam ['
                              || recnowp.prs_perslid_naam
                              || ', '
                              || recnowp.prs_perslid_voornaam
                              || '] heeft geen werkplek',
                              'Geen werkplek'
                             );
            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;

			-- Iedereen krijgt _default-rol die nog geen groep heeft.
      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 persoon 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;


   ELSE
      fac.imp_writelog
         (p_import_key,
          'E',
          'Verschil tussen het actuele aantal en het te importeren aantal personen te groot; zie specificatie!',
             '- max. verschilpercentage = ['
          || TO_CHAR (c_max_delta_percentage)
          || '%] <br> '
          || '- #personen importbestand = ['
          || TO_CHAR (v_count_prs_import)
          || '] <br> '
          || '- #personen Facilitor = ['
          || TO_CHAR (v_count_prs_actual)
          || ']'
         );
      COMMIT;
   END IF;                  -- Geldig importbestand wat betreft aantal inserts
   COMMIT;
END viar_update_prs;
/



---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------
---                 MIPP MANINFO RAPPORTAGE              MIPP MANINFO RAPPORTAGE              MIPP MANINFO RAPPORTAGE                     ---
---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------

-- ins_srtdiscipline_key = 1 is meldingtype 'MIPP'.
-- mld_typeopdr_key (+) = 41 is de 'MIPP-afhandeling' opdrachttype, en geen andere opdrachttype.
-- km1.mld_kenmerk_key (+) = 101 is de omschrijving (wat is er gebeurd) van de MIPP-melding.
-- ko1.mld_kenmerk_key (+) = 35 is of het een incident of bijna incident is.
-- ko2.mld_kenmerk_key (+) = 38 is de risico klasse.


-- Let op: kolom fclt_key (volgend op fclt_lopend) is dezelfde, alleen deze kolomnaam moet zo heten ivm usrrap vanuit cust.xsl.

CREATE OR REPLACE VIEW VIAR_V_RAP_MLD_MIPP
(
   FCLT_F_MELDINGNR,
   HIDE_F_INS_DISCIPLINE_KEY,
   HIDE_F_FCLT_F_VAKGROEP,
   HIDE_F_MLD_STDMELDING_KEY,
   FCLT_F_MELDING,
   MLD_MELDING_OMSCHRIJVING,
   HIDE_F_MLD_MELDING_OPMERKING,
   FCLT_F_LOCATIE,
   FCLT_F_GEBOUW,
   FCLT_F_VERDIEPING,
   RUIMTE,
   FCLT_F_RUIMTESOORT,
   FCLT_F_JAAR,
   FCLT_F_HALFJAAR,
   FCLT_F_KWARTAAL,
   FCLT_F_MAAND,
   FCLT_F_INGEVOERD,
   HIDE_F_OPERATIONELE_EINDDATUM,
   HIDE_F_SLA_EINDDATUM,
   HIDE_F_OPERATIONEEL_TE_LAAT,
   HIDE_F_SLA_TE_LAAT,
   HIDE_F_OPERATIONEEL_DAGUURMIN,
   FCLT_F_LOPEND,
   FCLT_F_STATUS,
   HIDE_F_STATUS_CODE,
   AFMELD_DATUM,
   FCLT_F_AFGEMELD,
   AFMELD_DATUM_TIME,
   AFGEMELD_DOOR,
   INGEVOERD_DOOR,
   FCLT_F_SECTOR,
   FCLT_F_AFDELING,
   FCLT_F_UITVOERENDE,
   FCLT_F_UITV_KEY,
   FCLT_F_INCIDENT,
   FCLT_F_RISICOKLASSE,
   FCLT_F_BAXTER,
   FCLT_F_NIET_BAXTER,
   FCLT_F_VOORRAADMEDICATIE,
   FCLT_F_OVERIG
)
AS
   SELECT   TO_CHAR (m.mld_melding_key),
            d.ins_discipline_key,
            d.ins_discipline_omschrijving,
            std.mld_stdmelding_key,
            std.mld_stdmelding_omschrijving,
            km1.mld_kenmerkmelding_waarde AS melding_omschrijving,
            m.mld_melding_opmerking,
            alg.loc,
            alg.bld,
            alg.flr,
            alg.room,
            alg.roms,
            TO_CHAR (m.mld_melding_datum, 'YYYY'),
            TO_CHAR (DECODE (TO_CHAR (m.mld_melding_datum, 'Q'),
                             1,
                             1,
                             2,
                             1,
                             3,
                             2,
                             4,
                             2)),
            'Q' || TO_CHAR (m.mld_melding_datum, 'Q'),
            TO_CHAR (m.mld_melding_datum, 'MM'),
            TO_CHAR (m.mld_melding_datum, 'YYYY-MM-DD'),
            m.mld_melding_einddatum,
            m.mld_melding_einddatum_std,
            CASE
               WHEN m.mld_melding_einddatum <
                       COALESCE (
                          fac.gettrackingdate ('MLDAFM', m.mld_melding_key),
                          fac.gettrackingdate ('MLDREJ', m.mld_melding_key),
                          SYSDATE
                       )
               THEN
                  1
               ELSE
                  0
            END,
            CASE
               WHEN m.mld_melding_einddatum_std <
                       COALESCE (
                          fac.gettrackingdate ('MLDAFM', m.mld_melding_key),
                          fac.gettrackingdate ('MLDREJ', m.mld_melding_key),
                          SYSDATE
                       )
               THEN
                  1
               ELSE
                  0
            END,
            TO_CHAR(FLOOR(COALESCE (
                             fac.gettrackingdate ('MLDAFM',
                                                  m.mld_melding_key),
                             fac.gettrackingdate ('MLDREJ',
                                                  m.mld_melding_key),
                             SYSDATE
                          )
                          - m.mld_melding_datum))
            || 'd '
            || TO_CHAR(MOD (
                          FLOOR( (COALESCE (
                                     fac.gettrackingdate ('MLDAFM',
                                                          m.mld_melding_key),
                                     fac.gettrackingdate ('MLDREJ',
                                                          m.mld_melding_key),
                                     SYSDATE
                                  )
                                  - m.mld_melding_datum)
                                * 24),
                          24
                       ))
            || 'u '
            || TO_CHAR(MOD (
                          ROUND (
                             (COALESCE (
                                 fac.gettrackingdate ('MLDAFM',
                                                      m.mld_melding_key),
                                 fac.gettrackingdate ('MLDREJ',
                                                      m.mld_melding_key),
                                 SYSDATE
                              )
                              - m.mld_melding_datum)
                             * 24
                             * 60,
                             0
                          ),
                          60
                       ))
            || 'm'
               dagenuurmin,
            CASE
               WHEN ms.mld_statuses_key IN (0, 2, 3, 4, 7, 99) THEN 'Open'
               ELSE 'Afgesloten'
            END,
            ms.mld_statuses_omschrijving,
            ms.mld_statuses_key,
            fac.gettrackingdate ('MLDAFM', m.mld_melding_key),
            COALESCE (
               TO_CHAR (fac.gettrackingdate ('MLDAFM', m.mld_melding_key),
                        'YYYY-MM-DD'),
               'Niet afgemeld'
            ),
            TO_CHAR (fac.gettrackingdate ('MLDAFM', m.mld_melding_key),
                     'DD-MM-YYYY HH24:MI'),
            p2.prs_perslid_naam
            || NVL2 (p2.prs_perslid_voorletters,
                     ', ' || p2.prs_perslid_voorletters,
                     '')
            || NVL2 (p2.prs_perslid_tussenvoegsel,
                     ' ' || p2.prs_perslid_tussenvoegsel,
                     '')
            || NVL2 (p2.prs_perslid_voornaam,
                     ' (' || p2.prs_perslid_voornaam || ')',
                     '')
               afgemeld_door,
            p.prs_perslid_naam
            || NVL2 (p.prs_perslid_voorletters,
                     ', ' || p.prs_perslid_voorletters,
                     '')
            || NVL2 (p.prs_perslid_tussenvoegsel,
                     ' ' || p.prs_perslid_tussenvoegsel,
                     '')
            || NVL2 (p.prs_perslid_voornaam,
                     ' (' || p.prs_perslid_voornaam || ')',
                     '')
               ingevoerd_door,
            COALESCE (
               sector.prs_afdeling_naam,
               afd.prs_afdeling_naam || '-' || afd.prs_afdeling_omschrijving
            ),
            DECODE (
               sector.prs_afdeling_naam,
               NULL,
               NULL,
               afd.prs_afdeling_naam || '-' || afd.prs_afdeling_omschrijving
            ),
            u.prs_perslid_naam
            || NVL2 (u.prs_perslid_voorletters,
                     ', ' || u.prs_perslid_voorletters,
                     '')
            || NVL2 (u.prs_perslid_tussenvoegsel,
                     ' ' || u.prs_perslid_tussenvoegsel,
                     '')
            || NVL2 (u.prs_perslid_voornaam,
                     ' (' || u.prs_perslid_voornaam || ')',
                     '')
               uitvoerende,
            u.prs_perslid_key,   
            (SELECT   ud.fac_usrdata_omschr
               FROM   fac_usrdata ud
              WHERE   ud.fac_usrtab_key = 21
                      AND ud.fac_usrdata_key =
                            fac.safe_to_number (ko1.mld_kenmerkopdr_waarde))
               bijna_incident,
            (SELECT   ud.fac_usrdata_omschr
               FROM   fac_usrdata ud
              WHERE   ud.fac_usrtab_key = 24
                      AND ud.fac_usrdata_key =
                            fac.safe_to_number (ko2.mld_kenmerkopdr_waarde))
               risico_klasse,
            (SELECT   ud.fac_usrdata_omschr
               FROM   fac_usrdata ud, mld_kenmerkmelding km
              WHERE   ud.fac_usrtab_key = 2
                      AND ud.fac_usrdata_key =
                            fac.safe_to_number (km.mld_kenmerkmelding_waarde)
                      AND KM.MLD_KENMERK_KEY = 30
                      AND KM.MLD_KENMERKMELDING_VERWIJDER IS NULL
                      AND KM.MLD_MELDING_KEY = m.mld_melding_key)
               baxter,
            (SELECT   ud.fac_usrdata_omschr
               FROM   fac_usrdata ud, mld_kenmerkmelding km
              WHERE   ud.fac_usrtab_key = 3
                      AND ud.fac_usrdata_key =
                            fac.safe_to_number (km.mld_kenmerkmelding_waarde)
                      AND KM.MLD_KENMERK_KEY = 31
                      AND KM.MLD_KENMERKMELDING_VERWIJDER IS NULL
                      AND KM.MLD_MELDING_KEY = m.mld_melding_key)
               niet_baxter,
            (SELECT   ud.fac_usrdata_omschr
               FROM   fac_usrdata ud, mld_kenmerkmelding km
              WHERE   ud.fac_usrtab_key = 4
                      AND ud.fac_usrdata_key =
                            fac.safe_to_number (km.mld_kenmerkmelding_waarde)
                      AND KM.MLD_KENMERK_KEY = 32
                      AND KM.MLD_KENMERKMELDING_VERWIJDER IS NULL
                      AND KM.MLD_MELDING_KEY = m.mld_melding_key)
               voorraadmedicatie,
            (SELECT   ud.fac_usrdata_omschr
               FROM   fac_usrdata ud, mld_kenmerkmelding km
              WHERE   ud.fac_usrtab_key = 5
                      AND ud.fac_usrdata_key =
                            fac.safe_to_number (km.mld_kenmerkmelding_waarde)
                      AND KM.MLD_KENMERK_KEY = 33
                      AND KM.MLD_KENMERKMELDING_VERWIJDER IS NULL
                      AND KM.MLD_MELDING_KEY = m.mld_melding_key)
               overig
     FROM   mld_melding m,
            mld_statuses ms,
            mld_stdmelding std,
            ins_tab_discipline d,
            ins_srtdiscipline sd,
            mld_opdr o,
            prs_perslid u,
            mld_kenmerkmelding km1,
            mld_kenmerkopdr ko1,
            mld_kenmerkopdr ko2,
            prs_perslid p,
            prs_afdeling sector,
            prs_afdeling afd,
            prs_perslid p2,
            (SELECT   mr.mld_melding_key,
                      l.alg_locatie_code || '-' || l.alg_locatie_omschrijving
                         loc,
                      alg.alg_gebouw_naam bld,
                      TO_CHAR (v.alg_verdieping_volgnr) flr,
                      r.alg_ruimte_nr room,
                      srt.alg_srtruimte_omschrijving roms
               FROM   mld_melding mr,
                      alg_v_allonrgoed_gegevens alg,
                      alg_ruimte r,
                      alg_srtruimte srt,
                      alg_locatie l,
                      alg_verdieping v
              WHERE   alg.alg_type = 'R'
                      AND alg_onroerendgoed_keys =
                            mr.mld_alg_onroerendgoed_keys
                      AND alg.alg_ruimte_key = r.alg_ruimte_key
                      AND r.alg_srtruimte_key = srt.alg_srtruimte_key(+)
                      AND l.alg_locatie_key = alg.alg_locatie_key
                      AND alg.alg_verdieping_key = v.alg_verdieping_key
             UNION ALL
             SELECT   mr.mld_melding_key,
                      l.alg_locatie_code || '-' || l.alg_locatie_omschrijving,
                      alg.alg_gebouw_naam,
                      TO_CHAR (v.alg_verdieping_volgnr),
                      NULL,
                      NULL
               FROM   mld_melding mr,
                      alg_v_allonrgoed_gegevens alg,
                      alg_locatie l,
                      alg_verdieping v
              WHERE   alg.alg_type != 'R'
                      AND alg_onroerendgoed_keys =
                            mr.mld_alg_onroerendgoed_keys
                      AND l.alg_locatie_key = alg.alg_locatie_key
                      AND alg.alg_verdieping_key = v.alg_verdieping_key(+)
             UNION ALL
             SELECT   mr.mld_melding_key,
                      l.alg_locatie_code || '-' || l.alg_locatie_omschrijving,
                      NULL,
                      NULL,
                      NULL,
                      NULL
               FROM   mld_melding mr, alg_locatie l
              WHERE   mr.mld_alg_locatie_key = l.alg_locatie_key
                      AND mr.mld_alg_onroerendgoed_keys IS NULL) alg
    WHERE       m.prs_perslid_key = p.prs_perslid_key
            AND p.prs_afdeling_key = afd.prs_afdeling_key
            AND afd.prs_afdeling_parentkey = sector.prs_afdeling_key(+)
            AND m.mld_melding_key = alg.mld_melding_key
            AND fac.gettrackinguserkey ('MLDAFM', m.mld_melding_key) =
                  p2.prs_perslid_key(+)
            AND ms.mld_statuses_key = mld_melding_status
            AND m.mld_melding_key = km1.mld_melding_key(+)
            AND km1.mld_kenmerk_key(+) = 101
            AND m.mld_melding_key = o.mld_melding_key(+)
            AND o.mld_uitvoerende_keys = u.prs_perslid_key(+)
            AND o.mld_opdr_key = ko1.mld_opdr_key(+)
            AND ko1.mld_kenmerk_key(+) = 35
            AND o.mld_opdr_key = ko2.mld_opdr_key(+)
            AND ko2.mld_kenmerk_key(+) = 38
            AND m.mld_stdmelding_key = std.mld_stdmelding_key
            AND std.mld_ins_discipline_key = d.ins_discipline_key
            AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
            AND sd.ins_srtdiscipline_key = 1
            AND o.mld_typeopdr_key(+) = 41
            AND COALESCE (o.mld_opdr_key, -1) =
                  (SELECT   COALESCE (MAX (mld_opdr_key), -1)
                     FROM   mld_opdr
                    WHERE   mld_melding_key = m.mld_melding_key);


---------------------------
-- Incidentele Bestel Aanvragen (IBA's):
-- Keuze van leverancier via view VIAR_V_IBA_LEVERANCIERS: Tbv domein 'leveranciers' bij verplichte keuze bij IBA waar leverancier moet worden gekozen.
-- Keuze van BTW percentage via view VIAR_V_IBA_BTWPERC.


CREATE OR REPLACE VIEW viar_v_iba_leveranciers
(PRS_BEDRIJF_KEY, 
PRS_BEDRIJF_NAAM
)
AS
SELECT prs_bedrijf_key, prs_bedrijf_naam
FROM prs_bedrijf b                 
WHERE B.PRS_BEDRIJF_INTERN IS NULL   
AND B.PRS_BEDRIJF_LEVERANCIER = 1  
AND b.prs_bedrijf_verwijder IS NULL;

CREATE OR REPLACE VIEW viar_v_iba_btwperc
(FIN_BTWTABELWAARDE_KEY, 
FIN_BTWTABELWAARDE_PERC
)
AS
SELECT tw.fin_btwtabelwaarde_key, SUBSTR(' ' || to_char(tw.fin_btwtabelwaarde_perc) || '%', length(tw.fin_btwtabelwaarde_perc))
FROM fin_btwtabelwaarde tw, fin_btwtabel t
WHERE t.fin_btwtabel_default=1
AND t.fin_btwtabel_key = tw.fin_btwtabel_key
AND t.fin_btwtabel_verwijder IS NULL
AND tw.fin_btwtabelwaarde_verwijder IS NULL;

-- VIAR#32013: Notificatie MIPP BackOffice
-- Alle leden van de MIPP commissie (personen in de autorisatiegroep MIPP Commisie met key 41) ontvangen een mailnotificatie naar de MIPP-melding (vakgroeptype key = 1) 
-- zodra een opdracht wordt gesloten. Dus ook al staan er nog wat opdrachten open, zodra er 1 wordt gesloten, dan een signaaltje...
CREATE OR REPLACE VIEW viar_v_noti_mipp_opdr_ready
(code, sender, receiver, text, key, par1, par2, xkey)
AS
 SELECT DISTINCT sn.fac_srtnotificatie_code, NULL, p.prs_perslid_key,
                 'Opdracht MIPP' ||  m.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr  || ' bij MIPP melding ' || m.mld_melding_key || ' is afgemeld',
                 m.mld_melding_key, NULL, NULL, NULL  
       FROM fac_gebruikersgroep gg,
            prs_v_aanwezigperslid p,
            fac_groep gr,
            fac_groeprechten grr,
            mld_melding m, mld_stdmelding sm, mld_discipline d, mld_opdr o,
            fac_notificatie_job nj, fac_srtnotificatie sn
      WHERE     p.prs_perslid_key = gg.prs_perslid_key
            AND gg.fac_groep_key = gr.fac_groep_key
            AND gr.FAC_GROEP_KEY = grr.fac_groep_key
            AND GR.FAC_GROEP_KEY = 41
            AND m.mld_stdmelding_key = sm.mld_stdmelding_key
            AND sm.mld_ins_discipline_key = d.ins_discipline_key
            AND d.ins_srtdiscipline_key = 1
            AND o.mld_melding_key = m.mld_melding_key
            AND fac.gettrackingdate('ORDAFM',o.mld_opdr_key) >= nj.fac_notificatie_job_nextrun - nj.fac_notificatie_job_interval / 24
            AND nj.fac_notificatie_job_view = 'VIAR_V_NOTI_MIPP_OPDR_READY'
            AND sn.fac_srtnotificatie_code = 'CUST01';
 
-- VIAR#31661           
CREATE OR REPLACE VIEW VIAR_V_RES_DAGLIJST
(
   HIDE_F_KEY,
   RESNR,
   FCLT_F_RUIMTE,
   FCLT_F_DATUM,
   VAN,
   TOT,
   ACTIVITEIT,
   OMSCHRIJVING,
   GASTHEER_VROUW,
   AANTAL_PERS,
   OPSTELLING,
   VOORZIENING
)
AS
   SELECT   rrr.res_rsv_ruimte_key,
            rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr Resnr,
            r2a.ruimte_nr,
            TO_CHAR (rrr.res_rsv_ruimte_van, 'DD-MM') Datum,
            TO_CHAR (rrr.res_rsv_ruimte_van, 'HH24.MI') Van,
            TO_CHAR (rrr.res_rsv_ruimte_tot, 'HH24.MI') Tot,
            ra.res_activiteit_omschrijving Activiteit,
            rrr.res_rsv_ruimte_omschrijving Omschrijving,
            pf.prs_perslid_naam_full Gastheer_vrouw,
            rrr.res_rsv_ruimte_bezoekers pers,
            r2a.opstelling,
            voorzieningen
     FROM   res_v_aanwezigrsv_ruimte rrr,
            alg_gebouw g,
            alg_verdieping v,
            alg_ruimte r,
            res_activiteit ra,
            prs_v_perslid_fullnames pf,
            (  SELECT   res_rsv_ruimte_key,
                        LISTAGG (voorziening, CHR (13) || CHR (10))
                           WITHIN GROUP (ORDER BY voorziening)
                           AS Voorzieningen
                 FROM   (SELECT   res_rsv_ruimte_key,
                                  res_deel_omschrijving voorziening
                           FROM   res_deel rd, res_rsv_deel rrd
                          WHERE   RES_RSV_DEEL_verwijder IS NULL
                                  AND rd.res_deel_key = rrd.res_deel_key
                         UNION ALL
                         SELECT   res_rsv_ruimte_key,
                                     rra.res_rsv_artikel_aantal
                                  || ' * '
                                  || res_artikel_omschrijving
                                     voorziening
                           FROM   res_artikel ra, res_rsv_artikel rra
                          WHERE   RES_RSV_artikel_verwijder IS NULL
                                  AND ra.res_artikel_key = rra.res_artikel_key)
             GROUP BY   res_rsv_ruimte_key) voorz,
            (  SELECT   res_ruimte_opstel_key,
                        MAX (o.res_opstelling_omschrijving) opstelling,
                        MAX (ra.alg_ruimte_key) alg_ruimte_key,
                        MAX (rr.res_ruimte_nr) ruimte_nr
                 FROM   res_ruimte_opstelling ro,
                        res_opstelling o,
                        res_ruimte rr,
                        res_alg_ruimte ra
                WHERE       ro.res_ruimte_key = rr.res_ruimte_key
                        AND ro.res_opstelling_key = o.res_opstelling_key
                        AND rr.res_ruimte_key = ra.res_ruimte_key
             GROUP BY   res_ruimte_opstel_key) r2a
    WHERE   rrr.res_ruimte_opstel_key = r2a.res_ruimte_opstel_key
            AND rrr.res_rsv_ruimte_van BETWEEN TRUNC (SYSDATE)
                                           AND  TRUNC (SYSDATE + 4)
            AND r.alg_ruimte_key = r2a.alg_ruimte_key
            AND r.alg_verdieping_key = v.alg_verdieping_key
            AND v.alg_gebouw_key = g.alg_gebouw_key
            AND ra.res_activiteit_key = rrr.res_activiteit_key
            AND pf.prs_perslid_key = rrr.res_rsv_ruimte_host_key
            AND voorz.res_rsv_ruimte_key(+) = rrr.res_rsv_ruimte_key;            
            



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

BEGIN fac.registercustversion('VIAR', 8); END;
/

commit;

spool off
