--
-- $Id$
--
-- Script containing customer specific configuration sql statements for GDZW

DEFINE thisfile = 'GDZW.SQL'
DEFINE dbuser   = '^GDZW'

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 gdzw_v_import_log
AS
   SELECT imp_log_status fclt_f_status,
          imp_log_omschrijving omschrijving,
          imp_log_hint opmerking
     FROM imp_log
    WHERE imp_log_applicatie = 'PRS';

CREATE OR REPLACE PROCEDURE gdzw_import_prs (p_import_key IN NUMBER)
IS
   c_fielddelimitor                VARCHAR2 (1) := ';';
   -- LET OP: moet idem zijn als declaratie bij GDZW_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;
   -- De importvelden:
   v_prs_perslid_naam              VARCHAR2 (256);
   v_prs_perslid_tussenvoegsel     VARCHAR2 (256);
   v_prs_perslid_voornaam          VARCHAR2 (256);
   v_prs_perslid_geslacht          VARCHAR2 (256);
   v_prs_perslid_oslogin           VARCHAR2 (256);
   v_prs_perslid_nr                VARCHAR2 (256);
   v_prs_afdeling_omschrijving     VARCHAR2 (256);
   v_prs_srtperslid_omschrijving   VARCHAR2 (256);
   v_prs_perslid_email             VARCHAR2 (256);
   v_prs_perslid_telefoonnr        VARCHAR2 (256);
   v_prs_perslid_mobiel            VARCHAR2 (256);
   v_BSN                           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 gdzw_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
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_nr);                -- EMPLOYEENUMBER
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_naam);              -- SN
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_voornaam);          -- GIVENNAME
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_oslogin);           -- SAMACCOUNTNAME
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_afdeling_omschrijving);     -- DEPARTMENT
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_srtperslid_omschrijving);   -- TITLE
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_telefoonnr);        -- TELEPHONENUMBER
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_email);             -- MAIL
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_geslacht);          -- EXTENSIONATTRIBUTE1
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_mobiel);            -- MOBILE
         --fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_tussenvoegsel);     --

         v_aanduiding :=
               '['
            || v_prs_perslid_oslogin
            || '|'
            || v_prs_perslid_naam
            || '|'
            || v_prs_perslid_voornaam
            || '|'
            || v_prs_perslid_email
            || '] ';

         -- 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_nr)              = 'EMPLOYEENUMBER'
               AND UPPER (v_prs_perslid_naam)            = 'SN'
               AND UPPER (v_prs_perslid_voornaam)        = 'GIVENNAME'
               AND UPPER (v_prs_perslid_oslogin)         = 'SAMACCOUNTNAME'
               AND UPPER (v_prs_afdeling_omschrijving)   = 'DEPARTMENT'
               AND UPPER (v_prs_srtperslid_omschrijving) = 'TITLE'
               AND UPPER (v_prs_perslid_telefoonnr)      = 'TELEPHONENUMBER'
               AND UPPER (v_prs_perslid_email)           = 'MAIL'
               AND UPPER (v_prs_perslid_geslacht)        = 'EXTENSIONATTRIBUTE1'
               AND UPPER (v_prs_perslid_mobiel)          = 'MOBILE'
               --AND UPPER (v_prs_perslid_tussenvoegsel)   = ''
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;

            -- Controleer alle veldwaarden
            v_errorhint := 'Ongeldig personeelsnummer';
            v_prs_perslid_nr := TRIM (v_prs_perslid_nr);

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

            v_errorhint := 'Ongeldige achternaam';
            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 || 'Achternaam te lang',
                     'Achternaam 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 || 'Achternaam onbekend',
                     'Achternaam is verplicht; regel wordt overgeslagen!');
               END IF;
            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 te lang',
                     'Voornaam wordt afgebroken tot ['
                  || v_prs_perslid_voornaam
                  || ']');
            END IF;

            v_errorhint := 'Ongeldige accountnaam';
            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 || 'accountnaam te lang',
                     'accountnaam 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 || 'accountnaam onbekend',
                     'accountnaam is verplicht; regel wordt overgeslagen!');
               END IF;
            END IF;

            v_errorhint := 'Ongeldige afdeling';
            v_prs_afdeling_omschrijving := TRIM (v_prs_afdeling_omschrijving);

            IF LENGTH (v_prs_afdeling_omschrijving) > 60
            THEN
               v_prs_afdeling_omschrijving := SUBSTR (v_prs_afdeling_omschrijving, 1, 10);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Afdeling te lang',
                     'Afdeling wordt afgebroken tot ['
                  || v_prs_afdeling_omschrijving
                  || ']');
            ELSE
               IF (v_prs_afdeling_omschrijving IS NULL)
               THEN
                  v_prs_afdeling_omschrijving := 'Onbekend';
                  --TODO: verplicht maken?
                  --v_ongeldig := 1;
                  --fac.imp_writelog (
                  --   p_import_key,
                  --   'E',
                  --   v_aanduiding || 'Afdeling onbekend',
                  --   'Afdeling is verplicht; regel wordt overgeslagen!');
               END IF;
            END IF;

            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';
                  --TODO: verplicht maken?
                  --v_ongeldig := 1;
                  --fac.imp_writelog (
                  --   p_import_key,
                  --   'E',
                  --   v_aanduiding || 'Functie onbekend',
                  --   'Functie is verplicht; regel wordt overgeslagen!');
               END IF;
            END IF;

            v_errorhint := 'Telefoonnummer te lang';
            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 || v_errorhint,
                     'Nummer wordt afgebroken tot ['
                  || v_prs_perslid_telefoonnr
                  || ']');
            END IF;

            v_errorhint := 'E-mailadres te lang';
            v_prs_perslid_email := TRIM (v_prs_perslid_email);

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

            v_errorhint := 'Ongeldig geslacht';
            v_prs_perslid_geslacht := TRIM (v_prs_perslid_geslacht);

            IF (UPPER (v_prs_perslid_geslacht) != 'M'
                AND UPPER (v_prs_perslid_geslacht) != 'V')
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                 'Geslacht is [' || v_prs_perslid_geslacht || ']');
            ELSIF (v_prs_perslid_geslacht IS NULL)
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                 'Geslacht niet ingevuld');
            END IF;

            v_errorhint := 'Mobiel nummer te lang';
            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 || v_errorhint,
                     'Nummer wordt afgebroken tot ['
                  || v_prs_perslid_mobiel
                  || ']');
            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
            --      || ']');
            --END IF;

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

                  INSERT INTO gdzw_imp_prs (imp_datum,
                                            prs_perslid_naam,
                                            --prs_perslid_tussenvoegsel,
                                            prs_perslid_voornaam,
                                            prs_perslid_geslacht,
                                            prs_perslid_oslogin,
                                            prs_perslid_nr,
                                            prs_afdeling_omschrijving,
                                            prs_srtperslid_omschrijving,
                                            prs_perslid_email,
                                            prs_perslid_telefoonnr,
                                            prs_perslid_mobiel
                                           )
                      VALUES (SYSDATE,
                              v_prs_perslid_naam,
                              --v_prs_perslid_tussenvoegsel,
                              v_prs_perslid_voornaam,
                              v_prs_perslid_geslacht,
                              v_prs_perslid_oslogin,
                              v_prs_perslid_nr,
                              v_prs_afdeling_omschrijving,
                              v_prs_srtperslid_omschrijving,
                              v_prs_perslid_email,
                              v_prs_perslid_telefoonnr,
                              v_prs_perslid_mobiel
                              );

                  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,
                        'W',
                        v_aanduiding || v_errormsg,
                        'Ingelezen regel kan niet worden weggeschreven!');
                     COMMIT;
               END;
            END IF;
         END IF; -- header_valid
      END;
   END LOOP;

   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),
      '');
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 gdzw_import_prs;
/



CREATE OR REPLACE PROCEDURE gdzw_update_prs (p_import_key IN NUMBER)
IS
   -- LET OP: moet idem zijn als declaratie bij gdzw_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_gebouw_code             VARCHAR2 (10) := 'ZAVUR';
   c_ruimte_nr               VARCHAR2 (10) := '999';
   c_gebouw_key              NUMBER (10);
   c_ruimte_key              NUMBER (10);
   -- Groep waar personen in geplaatst worden (indien nog geen groep)
   c_groep_upper             VARCHAR2 (30) := '_DEFAULT';
   v_aanduiding              VARCHAR2 (200);
   v_errorhint               VARCHAR2 (1000);
   v_errormsg                VARCHAR2 (1000);
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   v_count_prs_import        NUMBER (10);    -- #actieve personen  na  import!
   v_count_prs_actual        NUMBER (10);    -- #actieve personen vóór import!
   v_count_tot               NUMBER (10);
   v_count_error             NUMBER (10);
   v_count                   NUMBER (10);
   --
   v_perslid_key             NUMBER (10);
   v_perslid_naam            VARCHAR2 (30);
   v_perslid_tussenvoegsel   VARCHAR2 (15);
   v_afdeling_key            NUMBER (10);
   v_srtperslid_key          NUMBER (10);
   --v_oslogin                VARCHAR2 (30);
   --v_locatie_key            NUMBER (10);
   v_gebouw_key              NUMBER (10);
   v_verdieping_key          NUMBER (10);
   v_ruimte_key              NUMBER (10);
   v_ruimte_nr               VARCHAR2 (10);
   v_wp_key                  NUMBER (10);
   v_wp_volgnr               NUMBER (3);
   v_wp_oms                  VARCHAR2 (30);
   v_groep_key               NUMBER (10);
   v_kenmerklink_key         NUMBER (10);
   v_dbg_gebouw_code         VARCHAR2 (10);
   v_dbg_ruimte_nr           VARCHAR2 (10);

   -- Alle personen met primaire login in Facilitor, die in de import niet voorkomen.
   -- Dubbele nummers? Dan wordt iemand mogelijk niet verwijderd/INACTIEF!
   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
     WHERE   p.prs_perslid_oslogin IS NOT NULL
             AND p.prs_perslid_oslogin NOT LIKE '\_%' ESCAPE '\'
             AND NOT EXISTS
                   (SELECT   1
                      FROM   gdzw_imp_prs ip
                     WHERE   UPPER (ip.prs_perslid_oslogin) =
                                p.prs_perslid_oslogin)
    UNION ALL
    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 NULL
             AND p.prs_perslid_naam LIKE 'INACTIEF:%'
             AND NOT EXISTS (SELECT   1
                               FROM   prs_v_verplichting_keys pv
                              WHERE   p.prs_perslid_key = pv.prs_perslid_key);

   -- Dubbele nummers? Dan worden gewoon 2 (of meer) personen toegevoegd!
   -- Alle gegevens uit importtabel geformatteerd volgens specificatie
   CURSOR cperslid
   IS
      SELECT prs_perslid_naam,
             prs_perslid_tussenvoegsel,
             prs_perslid_voornaam,
             DECODE (UPPER (prs_perslid_geslacht),
                     'M', 1,
                     'V', 0)
                prs_perslid_geslacht,
             prs_perslid_oslogin,
             prs_perslid_nr,
             prs_afdeling_omschrijving,
             prs_srtperslid_omschrijving,
             prs_perslid_email,
             prs_perslid_telefoonnr,
             prs_perslid_mobiel
        FROM gdzw_imp_prs
       WHERE prs_perslid_oslogin IS NOT NULL;

   -- Soort perslid/functie
   CURSOR csrtperslid
   IS
        SELECT MIN (prs_perslid_oslogin) prs_perslid_oslogin,
               MIN (prs_perslid_naam) prs_perslid_naam,
               MIN (prs_perslid_voornaam) prs_perslid_voornaam,
               MIN (prs_srtperslid_omschrijving) prs_srtperslid_omschrijving
          FROM gdzw_imp_prs
      GROUP BY UPPER (prs_srtperslid_omschrijving);

   -- Dubbele nummers? Dan krijgt iemand mogelijk de verkeerde plaats!
   -- Personen in importsheet + hun werkplekken
   -- (voor maken nieuwe/verhuizen naar (virtuele) werkplek)
   CURSOR cwp
   IS
      SELECT p.*
        FROM gdzw_imp_prs ip, prs_v_aanwezigperslid p
       WHERE UPPER (ip.prs_perslid_oslogin) = UPPER (p.prs_perslid_oslogin);

   -- Alle actieve personen met primaire login (ie. de import-doelgroep) zonder een werkplek
   -- Voor logging: lijst van mensen zonder 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
       WHERE     p.prs_perslid_oslogin IS NOT NULL
             AND p.prs_perslid_naam NOT LIKE c_persoon_inactief || '%'
             AND NOT EXISTS (SELECT pw.prs_perslid_key
                               FROM prs_perslidwerkplek pw
                              WHERE pw.prs_perslid_key = p.prs_perslid_key);

   -- Alle aanwezige personen met primaire login (ie. de import-doelgroep) niet in een authorisatiegroep
   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);

BEGIN
   -- Bepaal accountnaam-match tussen Facilitor en RECENT importbestand ofwel
   -- het aantal actieve personen na import.
   -- RECENT betekent niet meer dan een kwartiertje oud (14,4 minuten); dit voorkomt
   -- dat - als er geen nieuw importbestand is aangeleverd - telkens dezelfde fouten
   -- worden gerapporteerd (nl. op basis van een oud importbestand in GDZW_IMP_PRS).
   SELECT COUNT ( * )
     INTO v_count_prs_import
     FROM prs_v_aanwezigperslid p, gdzw_imp_prs ip
    WHERE     p.prs_perslid_oslogin IS NOT NULL
          AND UPPER (p.prs_perslid_oslogin) = UPPER (ip.prs_perslid_oslogin)
          AND (ip.imp_datum + 0.01) > SYSDATE;

   -- Bepaal huidig aantal actieve personen in Facilitor.
   SELECT DECODE (COUNT ( * ), 0, 1, COUNT ( * ))
     INTO v_count_prs_actual
     FROM prs_v_aanwezigperslid
    WHERE prs_perslid_oslogin IS NOT NULL;

   IF ( (TRUNC ( (v_count_prs_import / v_count_prs_actual) * 100) >=
              (100 - c_max_delta_percentage))--OR (TRUNC ( (v_count_prs_import / v_count_prs_actual) * 100) <=
                                             --       (100 + c_max_delta_percentage))
      )
   THEN

--      v_errorhint := 'Fout bij bepalen standaardgebouw';
--
--      SELECT COUNT ( * )
--        INTO v_count
--        FROM alg_v_aanweziggebouw
--       WHERE UPPER (alg_gebouw_code) = UPPER (c_gebouw_code);
--
--      -- v_count=0 --> gebouw 'ZAVUR' bestaat niet!
--      IF (v_count = 0)
--      THEN
--         fac.imp_writelog (
--            p_import_key,
--            'E',
--            v_aanduiding || v_errorhint,
--               'Gebouw ['
--            || c_gebouw_code
--            || '] voor standaardwerkplek bestaat niet!');
--         c_gebouw_key := NULL;
--      ELSE
--         SELECT alg_gebouw_key
--           INTO c_gebouw_key
--           FROM alg_v_aanweziggebouw
--          WHERE UPPER (alg_gebouw_code) = UPPER (c_gebouw_code);
--      END IF;
--
--      v_errorhint := 'Fout bij bepalen standaardruimte';
--
--      SELECT COUNT ( * )
--        INTO v_count
--        FROM alg_v_aanwezigruimte r, alg_v_aanwezigverdieping v
--       WHERE     UPPER (alg_ruimte_nr) = UPPER (c_ruimte_nr)
--             AND r.alg_verdieping_key = v.alg_verdieping_key
--             AND v.alg_gebouw_key = c_gebouw_key;
--
--      -- v_count=0 -> ruimte '999' bestaat nog niet.
--      IF (v_count = 0)
--      THEN
--         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 toevoegen standaardruimte';
--
--         INSERT INTO alg_ruimte (alg_verdieping_key,
--                                 alg_srtruimte_key,
--                                 alg_ruimte_nr)
--             VALUES (v_verdieping_key, 37,                -- onbekend
--                                         c_ruimte_nr)
--          RETURNING alg_ruimte_key
--               INTO c_ruimte_key;
--      ELSE
--         SELECT alg_ruimte_key
--           INTO c_ruimte_key
--           FROM alg_v_aanwezigruimte r, alg_v_aanwezigverdieping v
--          WHERE     UPPER (alg_ruimte_nr) = UPPER (c_ruimte_nr)
--                AND r.alg_verdieping_key = v.alg_verdieping_key
--                AND v.alg_gebouw_key = c_gebouw_key;
--      END IF;
--
--   --      fac.imp_writelog (
--   --         p_import_key,
--   --         'I',
--   --         'Standaardgebouw en -ruimte:',
--   --            '['
--   --         || TO_CHAR (c_gebouw_key)
--   --         || '|'
--   --         || TO_CHAR (c_ruimte_key)
--   --         || ']');
--
--      COMMIT;
      -- 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 login ['
                  || recdelprs.prs_perslid_oslogin
                  || '] en naam ['
                  || recdelprs.prs_perslid_naam
                  || ', '
                  || recdelprs.prs_perslid_voornaam
                  || '] is verwijderd',
                  'Persoon is verwijderd');
            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 login ['
                     || 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 login ['
                     || recdelprs.prs_perslid_oslogin
                     || '] en naam ['
                     || recdelprs.prs_perslid_naam
                     || ', '
                     || recdelprs.prs_perslid_voornaam
                     || '] is INACTIEF gemaakt',
                     'Persoon is INACTIEF gemaakt (en account is verwijderd)');
               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,
                                 'W',
                                 v_errormsg,
                                 v_errorhint);
               COMMIT;
         END;
      END LOOP;

      v_count_tot := 0;
      v_count_error := 0;

      FOR recsrtperslid IN csrtperslid
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding :=
                  recsrtperslid.prs_perslid_oslogin
               || '|'
               || recsrtperslid.prs_perslid_naam
               || '|'
               || recsrtperslid.prs_perslid_voornaam
               || '|'
               || recsrtperslid.prs_srtperslid_omschrijving
               || ' - ';
            v_errorhint := 'Fout bij bepalen functie';

            SELECT COUNT ( * )
              INTO v_count
              FROM prs_srtperslid
             WHERE UPPER (prs_srtperslid_omschrijving) =
                      UPPER (recsrtperslid.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 (recsrtperslid.prs_srtperslid_omschrijving);
            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);
         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
               || '] - ';

            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_omschrijving
               || ']';

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

            v_errorhint :=
                  'Fout bij bepalen naam ['
               || recperslid.prs_perslid_naam
               || ']';

            --TODO: Is die lengte-check wel nodig? Doet import_prs ook al!
            --      (Let op: v_perslid_naam wordt hieronder gebruikt!)
            IF LENGTH (recperslid.prs_perslid_naam) > 30
            THEN
               v_perslid_naam := SUBSTR (recperslid.prs_perslid_naam, 1, 30);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Achternaam te lang',
                     'Achternaam wordt afgebroken tot ['
                  || v_perslid_naam
                  || ']');
            ELSE
               v_perslid_naam := recperslid.prs_perslid_naam;
            END IF;

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

               INSERT INTO prs_perslid (prs_perslid_module,
                                        prs_perslid_naam,
                                        prs_perslid_tussenvoegsel,
                                        prs_perslid_voornaam,
                                        prs_perslid_geslacht,
                                        prs_perslid_oslogin,
                                        prs_perslid_nr,
                                        prs_afdeling_key,
                                        prs_srtperslid_key,
                                        prs_perslid_email,
                                        prs_perslid_telefoonnr,
                                        prs_perslid_mobiel)
                   VALUES ('PRS',
                           v_perslid_naam,
                           recperslid.prs_perslid_tussenvoegsel,
                           recperslid.prs_perslid_voornaam,
                           recperslid.prs_perslid_geslacht,
                           recperslid.prs_perslid_oslogin,
                           recperslid.prs_perslid_nr,
                           v_afdeling_key,
                           v_srtperslid_key,
                           recperslid.prs_perslid_email,
                           recperslid.prs_perslid_telefoonnr,
                           recperslid.prs_perslid_mobiel)
                RETURNING prs_perslid_key
                     INTO v_perslid_key;

               --TODO: voeg persoon toe op standaardwerkplek (ZAVUR-0-999)
            ELSE
               IF (v_count > 1)
               THEN
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     v_aanduiding || ' kan persoon niet eenduidig bepalen',
                     v_errorhint);
               END IF;

               v_errorhint := 'Fout bij wijzigen persoon';

               -- TODO: coalesce's voor velden die nog niet overschreven moeten worden.
               UPDATE prs_perslid
                  SET prs_perslid_naam          =           v_perslid_naam,
                      prs_perslid_tussenvoegsel =           recperslid.prs_perslid_tussenvoegsel,
                      prs_perslid_voornaam      =           recperslid.prs_perslid_voornaam,
                      prs_perslid_geslacht      =           recperslid.prs_perslid_geslacht,
                      prs_perslid_oslogin       =           recperslid.prs_perslid_oslogin,
                      prs_perslid_nr            =           recperslid.prs_perslid_nr,
                      prs_afdeling_key          =           v_afdeling_key,
                      prs_srtperslid_key        =           v_srtperslid_key,
                      prs_perslid_email         =           recperslid.prs_perslid_email,
                      prs_perslid_telefoonnr    = COALESCE (recperslid.prs_perslid_telefoonnr, prs_perslid_telefoonnr),
                      prs_perslid_mobiel        = COALESCE (recperslid.prs_perslid_mobiel, prs_perslid_mobiel)
                WHERE prs_perslid_key = v_perslid_key;

                --TODO: als nog geen werkplek, dan standaardwerkplek?
            END IF;

         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_count_error := v_count_error + 1;
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || 'Geen data gevonden',
                                 v_errorhint);
            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),
         '');

      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_gebouw_code
--               || '|'
--               || recwp.alg_ruimte_nr
--               || ' - ';
--            v_errorhint := 'Fout bij bepalen persoon';
--
--            SELECT prs_perslid_key
--              INTO v_perslid_key
--              FROM prs_v_aanwezigperslid
--             WHERE     prs_perslid_login IS NOT NULL
--                   AND UPPER (prs_perslid_oslogin) = UPPER (recwp.prs_perslid_oslogin);
--
--            v_gebouw_key := NULL;
--            v_ruimte_key := NULL;
--
--            -- standaardwaardes
--            IF v_gebouw_key IS NULL OR v_ruimte_key IS NULL
--            THEN
--               v_gebouw_key := c_gebouw_key;
--               v_ruimte_key := c_ruimte_key;
--            END IF;
--
--            -- Bepalen wat er moet gebeuren:
--            --   . als WEL geldige waardes uit Compas:
--            --   .   . ZELFDE als in Facilitor --> huidige werkplek behouden
--            --   .   . ANDERS dan in Facililtor --> werkplek uit Compas overnemen (bestaande werkplek ontkoppelen)
--            --   . als GEEN (geldige) waardes uit Compas:
--            --   .   . al IETS in Facilitor --> huidige werkplek behouden
--            --   .   . nog NIETS in Facililtor --> standaardwerkplek gebruiken
--            IF (    recwp.alg_gebouw_code IS NOT NULL
--                AND recwp.alg_ruimte_nr IS NOT NULL
--                AND v_gebouw_key != c_gebouw_key
--                AND v_ruimte_key != c_ruimte_key)
--            THEN
--               v_errorhint :=
--                  'Fout bij bepalen of persoon in ruimte een werkplek heeft';
--
--               SELECT COUNT ( * )
--                 INTO v_count
--                 FROM prs_v_aanwezigperslidwerkplek apw, prs_werkplek wp
--                WHERE     apw.prs_perslid_key = v_perslid_key
--                      AND apw.prs_werkplek_key = wp.prs_werkplek_key
--                      AND wp.prs_alg_ruimte_key = v_ruimte_key;
--
--               -- v_count=0 --> persoon verhuist --> ontkoppel van huidige werkplek
--               IF (v_count = 0)
--               THEN
--                  -- Verwijder (keihard) de koppeling van deze persoon met een werkplek!
--                  -- TODO: Dit verwijdert alle werkplekken, ook in andere gebouwen!
--                  DELETE FROM prs_perslidwerkplek pw
--                        WHERE pw.prs_perslid_key = v_perslid_key;
--
--                  -- "echte" ruimte, met één werkplek per persoon
--                  -- kijk of er een bestaande werkplek beschikbaar is in deze ruimte
--                  SELECT COUNT (w.prs_werkplek_key)
--                    INTO v_count
--                    FROM prs_werkplek w
--                   WHERE w.prs_alg_ruimte_key = v_ruimte_key
--                         AND w.prs_werkplek_verwijder IS NULL
--                         AND NOT EXISTS
--                               (SELECT 1
--                                  FROM prs_v_aanwezigperslidwerkplek 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 w.prs_werkplek_verwijder IS NULL
--                            AND NOT EXISTS
--                                  (SELECT 1
--                                     FROM prs_v_aanwezigperslidwerkplek 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);
--
--                     SELECT prs_werkplek_omschrijving
--                       INTO v_wp_oms
--                       FROM prs_v_aanwezigwerkplek
--                      WHERE prs_werkplek_key = v_wp_key;
--
--                     fac.imp_writelog (
--                        p_import_key,
--                        'I',
--                        v_aanduiding || 'is verhuisd naar bestaande werkplek',
--                        'Werkplek: [' || v_wp_oms || ']');
--                  ELSE            -- geen vrije werkplek beschikbaar in ruimte
--                     -- Als nieuwe werkplekken automatisch aangemaakt mogen worden:
--                     IF (0 = 1)
--                     THEN
--                        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;
--
--                        SELECT alg_ruimte_nr
--                          INTO v_ruimte_nr
--                          FROM alg_ruimte
--                         WHERE alg_ruimte_key = v_ruimte_key;
--
--                        v_wp_oms :=
--                           v_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 verhuizen 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);
--
--                        SELECT prs_werkplek_omschrijving
--                          INTO v_wp_oms
--                          FROM prs_werkplek
--                         WHERE prs_werkplek_key = v_wp_key;
--
--                        fac.imp_writelog (
--                           p_import_key,
--                           'I',
--                           v_aanduiding
--                           || 'is verhuisd naar nieuwe aangemaakte werkplek',
--                           'Werkplek: [' || v_wp_oms || ']');
--                     ELSE -- als nieuwe werkplekken NIET automatisch aangemaakt mogen worden:
--                        fac.imp_writelog (
--                           p_import_key,
--                           'W',
--                           'Geen vrije werkplek beschikbaar voor'
--                           || v_aanduiding,
--                              'Ruimte: ['
--                           || recwp.alg_gebouw_code
--                           || '|'
--                           || recwp.alg_ruimte_nr
--                           || ']');
--                     END IF;
--                  END IF;  -- werkplek beschikbaar?
--               END IF;
--
--            ELSE  -- geen (geldige) waardes vanuit Compas
--               v_errorhint := 'Fout bij bepalen of persoon al een werkplek heeft';
--
--               SELECT COUNT ( * )
--                 INTO v_count
--                 FROM prs_v_aanwezigperslidwerkplek apw, prs_werkplek wp
--                WHERE apw.prs_perslid_key = v_perslid_key
--                      AND apw.prs_werkplek_key = wp.prs_werkplek_key;
--
--               -- v_count=0 --> nog geen werkplek --> standaardruimte!
--               IF (v_count = 0)
--               THEN
--                  v_errorhint := 'Fout bij bepalen vrije werkplek';
--
--                  -- werkplek in fictieve standaardruimte:
--                  -- . daar is maar één werkplek, waar iedereen aan gekoppeld is
--                  --   . kijk of die werkplek al bestaat
--                  --     . zoniet, maak aan
--                  -- . voeg persoon toe met bezetting 1%
--                  -- kijk de werkplek in de standaardruimte al is aangemaakt
--                  SELECT COUNT (w.prs_werkplek_key)
--                    INTO v_count
--                    FROM prs_werkplek w
--                   WHERE w.prs_alg_ruimte_key = c_ruimte_key
--                         AND w.prs_werkplek_verwijder IS NULL;
--
--                  -- nog niet; maak aan
--                  IF (v_count = 0)
--                  THEN
--                     v_errorhint := 'Fout bij aanmaken standaardwerkplek';
--
--                     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;
--
--                     SELECT alg_ruimte_nr
--                       INTO v_ruimte_nr
--                       FROM alg_ruimte
--                      WHERE alg_ruimte_key = v_ruimte_key;
--
--                     v_wp_oms := v_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);
--                  END IF;
--
--                  -- Voeg persoon toe aan standaardwerkplek, bezetting 1%
--                  v_errorhint :=
--                     'Fout bij koppelen persoon aan standaardwerkplek';
--
--                  SELECT MIN (w.prs_werkplek_key)
--                    INTO v_wp_key
--                    FROM prs_werkplek w
--                   WHERE w.prs_alg_ruimte_key = v_ruimte_key
--                         AND w.prs_werkplek_verwijder IS NULL;
--
--                  INSERT INTO prs_perslidwerkplek (prs_perslid_key,
--                                                   prs_werkplek_key,
--                                                   prs_perslidwerkplek_bezetting)
--                      VALUES (v_perslid_key, v_wp_key, 1);
--
--                  SELECT prs_werkplek_omschrijving
--                    INTO v_wp_oms
--                    FROM prs_werkplek
--                   WHERE prs_werkplek_key = v_wp_key;
--
--                  fac.imp_writelog (
--                     p_import_key,
--                     'I',
--                     v_aanduiding || 'is gekoppeld naar standaardwerkplek',
--                     'Werkplek: [' || v_wp_oms || ']');
--               END IF;                                     -- al een werkplek?
--            END IF;                                        -- geldige waardes?
--
--            COMMIT;
--
--         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 login ['
--               || recnowp.prs_perslid_oslogin
--               || '] en naam ['
--               || recnowp.prs_perslid_naam
--               || ', '
--               || recnowp.prs_perslid_voornaam
--               || '] heeft geen werkplek',
--               'Geen werkplek');
--         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);
--         END;
--      END LOOP;
--
--      COMMIT;

      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 [' || c_groep_upper || ']';

            SELECT fac_groep_key
              INTO v_groep_key
              FROM fac_groep
             WHERE fac_groep_upper = c_groep_upper;

            v_errorhint :=
                  'Fout bij koppelen persoon aan groep ['
               || c_groep_upper
               || ']';

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

         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);
         END;
      END LOOP;

      COMMIT;

      -- Verwijder ongebruikte functies; deze import bepaalt de functies!
      DELETE FROM prs_srtperslid sp
            WHERE NOT EXISTS
                     (SELECT 1
                        FROM prs_perslid P
                       WHERE p.prs_srtperslid_key = sp.prs_srtperslid_key);

   ELSE
      IF (v_count_prs_import = 0)
      THEN
         fac.imp_writelog (
            p_import_key,
            'S',
            'Geen nieuw/recent bestand met te importeren personen aangetroffen!',
            '');
      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> '
            || '- matchend #personen importbestand = ['
            || TO_CHAR (v_count_prs_import)
            || '] <br> '
            || '- #personen Facilitor = ['
            || TO_CHAR (v_count_prs_actual)
            || ']');
      END IF;

   END IF;

   COMMIT;
END gdzw_update_prs;
/


-- Rappelnotificaties naar contractbeheerder en -eigenaar.
-- (Notificatie naar eigenaar alleen als dit niet ook de beheerder is)
-- Dagelijks schedulen; rapporteert alleen de contracten die vandaag de rappeltermijn ingaan.
CREATE OR REPLACE VIEW gdzw_v_noti_cntreminder_geg
AS
   SELECT 'CNTMAI' code,
          '' sender,
          c.prs_perslid_key_beh beh,
          c.prs_perslid_key_eig eig,
          cnt.cnt_getrappeldatum (c.cnt_contract_key) rap,
          cnt.cnt_getopzegdatum (c.cnt_contract_key) opz,
             'Rappel: Contract '
          || c.cnt_contract_nummer_intern
          || ' ('
          || c.cnt_contract_omschrijving
          || ' '
          || b.prs_bedrijf_naam
          || ')'
          || ' moet uiterlijk per '
          || TO_CHAR (cnt.cnt_getopzegdatum (c.cnt_contract_key),
                      'DD-MM-YYYY')
          || ' worden verlengd of opgezegd.' text,
          c.cnt_contract_key key,
          c.cnt_contract_nummer_intern par1,
          cnt.cnt_getopzegdatum (c.cnt_contract_key) par2,
          NULL xkey
     FROM cnt_v_aanwezigcontract c, prs_bedrijf b
    WHERE     b.prs_bedrijf_key = c.cnt_prs_bedrijf_key
          AND cnt_contract_verwijder IS NULL
          AND cnt_contract_status = 0
          AND TRUNC(SYSDATE) = TRUNC(cnt.cnt_getrappeldatum(c.cnt_contract_key));

CREATE OR REPLACE VIEW gdzw_v_noti_cntreminder
(
   CODE,
   SENDER,
   RECEIVER,
   TEXT,
   KEY,
   PAR1,
   PAR2,
   XKEY
)
AS
   SELECT code,
          sender,
          beh receiver,
          text,
          key,
          par1,
          par2,
          xkey
     FROM gdzw_v_noti_cntreminder_geg
    WHERE beh IS NOT NULL
  UNION ALL
   SELECT code,
          sender,
          eig receiver,
          text,
          key,
          par1,
          par2,
          xkey
     FROM gdzw_v_noti_cntreminder_geg
    WHERE eig IS NOT NULL
      AND eig != beh;
      
CREATE OR REPLACE VIEW gdzw_v_rap_keyvsfe
(
   soort_gebruiker,
   Naam,
   Loginnaam,
   laatste_login
)
AS
   SELECT DECODE (key_user, 1, 'KEY', 'FE'),
          pf.prs_perslid_naam_full,
          oslogin,
          prs_perslid_login
     FROM (SELECT *
             FROM (SELECT p.prs_perslid_key prs_key,
                          COALESCE (p.prs_perslid_oslogin,
                                    p.prs_perslid_oslogin2)
                             oslogin,
                          1 login,     -- 1=user heeft login + groep + rechten
                          DECODE (
                             SIGN(TRUNC(COALESCE (p.prs_perslid_login + 92,
                                                  SYSDATE - 1))
                                  - TRUNC (SYSDATE)),
                             -1,
                             0,
                             1)      -- 1=user heeft laatste 92 dagen ingelogd
                             recent_login
                     FROM prs_v_aanwezigperslid p
                    WHERE EXISTS       -- op basis van login + groep + rechten
                             (SELECT 1
                                FROM fac_v_webgebruiker gg
                               WHERE gg.prs_perslid_key = p.prs_perslid_key)
                          AND NOT EXISTS -- FSN#36597: WEB_FACFAC-users niet meetellen!
                                (SELECT 1
                                   FROM fac_v_webgebruiker gg, fac_functie f
                                  WHERE gg.prs_perslid_key =
                                           p.prs_perslid_key
                                        AND gg.fac_functie_key =
                                              f.fac_functie_key
                                        AND fac_functie_code = 'WEB_FACFAC')
                   UNION ALL -- FSN#24029: Soms ook personen zonder login meetellen!
                   SELECT p.prs_perslid_key,
                          NULL oslogin,
                          1 login,  -- 1=user telt mee, want allow_for_others!
                          0 recent_login -- geen login, dus nooit recent ingelogd
                     FROM prs_v_aanwezigperslid p
                    WHERE COALESCE (p.prs_perslid_oslogin,
                                    p.prs_perslid_oslogin2) IS NULL
                          AND (fac.getSetting ('mld_allow_for_others') = 1
                               OR EXISTS
                                    (SELECT 1
                                       FROM bes_disc_params dp
                                      WHERE dp.bes_disc_params_for_others = 1))
                   UNION ALL -- FSN#27315: En ook eventuele "sensorusers" meetellen!
                   SELECT NULL prs_perslid_key,
                          NULL oslogin,
                          COUNT ( * ) login, -- elke sensoruser telt mee als FE!
                          1 recent_login -- recent actief dus tellen als recent
                     FROM ins_v_aanwezigdeel d
                    WHERE ins_deel_statedate > TRUNC (SYSDATE - 30)) x
                  LEFT JOIN   -- 1=user heeft rechten op key-codes=notFE-codes
                            (SELECT DISTINCT fclt_f_login, 1 key_user
                               FROM fac_v_rap_groeprechten gr, fac_functie f
                              WHERE gr.fclt_f_funcode = f.fac_functie_code
                                    AND f.fac_functie_groep IN (1, 2)) a
                     ON x.oslogin = a.fclt_f_login
                  LEFT JOIN     -- FSN#30404: 1=user is cross-domain (xd) user
                            (SELECT p.prs_perslid_key, 1 xd_user
                               FROM prs_v_aanwezigperslid p,
                                    prs_v_afdeling_boom ab
                              WHERE p.prs_afdeling_key = ab.prs_afdeling_key
                                    AND p.prs_perslid_apikey IS NOT NULL
                                    AND ab.prs_bedrijf_key =
                                          fac.safe_to_number(fac.getSetting('xd_primary_bedrijfkey')))
                            b
                     ON x.prs_key = b.prs_perslid_key) st,
          prs_perslid p,
          prs_v_perslid_fullnames pf
    WHERE     login = 1
          AND p.prs_perslid_key = st.prs_key
          AND pf.prs_perslid_key = p.prs_perslid_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