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

set echo on

spool xling.lst

-- 61 = 'PRS'
CREATE OR REPLACE VIEW ling_v_import_log
AS
   SELECT imp_log_status fclt_f_status,
          imp_log_omschrijving omschrijving,
          imp_log_hint opmerking
     FROM imp_log
    WHERE fac_import_key = (SELECT MAX (fac_import_key)
                              FROM fac_import
                             WHERE fac_import_app_key = 61);


CREATE OR REPLACE PROCEDURE ling_import_prs (
   p_import_key IN NUMBER
)
IS
   c_fielddelimitor                VARCHAR2 (1)    := ';';
   -- LET OP: moet idem zijn als declaratie bij LING_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_email             VARCHAR2 (256);
   v_prs_perslid_naam              VARCHAR2 (256);
   v_prs_perslid_tussenvoegsel     VARCHAR2 (256);
   v_prs_perslid_voorletters       VARCHAR2 (256);
   v_prs_perslid_voornaam          VARCHAR2 (256);
   -- LING#19944: sinds de reorganisatie gebruiken we prs_afdeling_omschrijving
   -- ipv prs_afdeling_code
   v_prs_team_naam                 VARCHAR2 (256);                     -- A60
   v_prs_srtperslid_omschrijving   VARCHAR2 (256);
   v_alg_locatie_code              VARCHAR2 (256);                     -- A5
   v_alg_gebouw_code               VARCHAR2 (256);                     -- A10
   v_alg_verdieping_volgnr         VARCHAR2 (256);                     -- N3
   v_alg_ruimte_nr                 VARCHAR2 (256);                     -- A10
   v_prs_perslid_telefoonnr        VARCHAR2 (256);
   v_prs_perslid_oslogin           VARCHAR2 (256);
   -- Overig:
   v_alg_verdieping_volgnr_n       NUMBER (3);                         -- N3

   CURSOR c1
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   -- Eerst opruiming
   SELECT COUNT (*)
     INTO v_count
     FROM imp_log
    WHERE fac_import_key = p_import_key;

   DELETE FROM ling_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
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_email);
         -- 02
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_naam);
         -- 03
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_tussenvoegsel
                          );
         -- 04
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_voorletters
                          );
         -- 05
         fac.imp_getfield (v_newline, c_fielddelimitor,
                           v_prs_perslid_voornaam);
         -- 06
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_team_naam);
         -- 07
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_srtperslid_omschrijving
                          );
         -- 08
         fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_locatie_code);
         -- 09
         fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_gebouw_code);
         -- 10
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_alg_verdieping_volgnr
                          );
         -- 11
         fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_ruimte_nr);
         -- 12
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_telefoonnr
                          );
         -- 13
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_oslogin);
         --
         v_aanduiding :=
               '['
            || v_prs_perslid_email
            || '|'
            || v_prs_perslid_naam
            || '|'
            || v_prs_perslid_tussenvoegsel
            || '|'
            || v_prs_perslid_voornaam
            || '] ';

         -- 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.
         -- LING#19944: 'afdelingscode' is eigenlijk teamnaam, maar de kolomnaam blijft hetzelfde
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_prs_perslid_email) = 'EMAIL'
               AND UPPER (v_prs_perslid_naam) = 'NAAM'
               AND UPPER (v_prs_perslid_tussenvoegsel) = 'TUSSENVOEGSEL'
               AND UPPER (v_prs_perslid_voorletters) = 'VOORLETTERS'
               AND UPPER (v_prs_perslid_voornaam) = 'VOORNAAM'
               AND UPPER (v_prs_team_naam) = 'AFDELINGSCODE'
               AND UPPER (v_prs_srtperslid_omschrijving) = 'FUNCTIE'
               AND UPPER (v_alg_locatie_code) = 'LOCATIE'
               AND UPPER (v_alg_gebouw_code) = 'GEBOUW'
               AND UPPER (v_alg_verdieping_volgnr) = 'VERDIEPING'
               AND UPPER (v_alg_ruimte_nr) = 'RUIMTE'
               AND UPPER (v_prs_perslid_telefoonnr) = 'TELEFOON'
               AND UPPER (v_prs_perslid_oslogin) = 'LOGINNAAM'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errorhint := 'Ongeldig e-mailadres';
            v_prs_perslid_email := TRIM (v_prs_perslid_email);

            IF v_prs_perslid_email IS NULL
               OR LENGTH (v_prs_perslid_email) > 50
            THEN
               v_ongeldig := 1;
               fac.imp_writelog
                       (p_import_key,
                        'E',
                        v_aanduiding || 'E-mailadres onbekend/te lang',
                        'E-mailadres is verplicht; regel wordt overgeslagen!'
                       );
               COMMIT;
            END IF;

            --
            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
                                 || ']'
                                );
               COMMIT;
            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!'
                              );
                  COMMIT;
               END IF;
            END IF;

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

            IF LENGTH (v_prs_perslid_tussenvoegsel) > 10
            THEN
               v_prs_perslid_tussenvoegsel :=
                                  SUBSTR (v_prs_perslid_tussenvoegsel, 1, 10);
               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
                                 || ']'
                                );
               COMMIT;
            ELSE
               IF (v_prs_perslid_voornaam IS NULL)
               THEN
                  v_prs_perslid_voornaam := '-';
                  fac.imp_writelog (p_import_key,
                                    'W',
                                    v_aanduiding || 'Voornaam onbekend',
                                    'Voornaam wordt gezet op [-]'
                                   );
                  COMMIT;
               END IF;
            END IF;

            -- LING#19944: afdelingscode is vervangen door teamnaam
            v_errorhint := 'Ongeldige teamnaam';
            v_prs_team_naam := TRIM (v_prs_team_naam);

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

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

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

            --
            v_errorhint := 'Ongeldige 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 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',
                                    'Aanduiding wordt afgebroken tot ['
                                 || v_alg_gebouw_code
                                 || ']'
                                );
               COMMIT;
            END IF;

            --
            v_errorhint := 'Ongeldig verdiepingnummer';
            v_alg_verdieping_volgnr := TRIM (v_alg_verdieping_volgnr);

            BEGIN
               v_alg_verdieping_volgnr_n :=
                         ROUND (fac.safe_to_number (v_alg_verdieping_volgnr));

               IF v_alg_verdieping_volgnr_n NOT BETWEEN -999 AND 999
               THEN
                  fac.imp_writelog
                                 (p_import_key,
                                  'E',
                                  v_aanduiding || v_errorhint,
                                  'Geef een getal niet groter dan 3 posities'
                                 );
                  COMMIT;
               END IF;
            EXCEPTION
               WHEN OTHERS
               THEN
                  v_ongeldig := 1;
                  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,
                                    'Regel wordt overgeslagen!'
                                   );
                  COMMIT;
            END;

            --
            v_errorhint := 'Ongeldig ruimtenummer';
            v_alg_ruimte_nr := TRIM (v_alg_ruimte_nr);

            IF LENGTH (v_alg_ruimte_nr) > 10
            THEN
               v_alg_ruimte_nr := SUBSTR (v_alg_ruimte_nr, 1, 10);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Ruimtenummer te lang',
                                    'Aanduiding wordt afgebroken tot ['
                                 || v_alg_ruimte_nr
                                 || ']'
                                );
               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;

            --
            v_errorhint := 'Ongeldige 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
                                 || ']'
                                );
               COMMIT;
            END IF;

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

                  INSERT INTO ling_imp_prs
                              (prs_perslid_email, prs_perslid_naam,
                               prs_perslid_tussenvoegsel,
                               prs_perslid_voorletters,
                               prs_perslid_voornaam, prs_team_naam,
                               prs_srtperslid_omschrijving,
                               alg_locatie_code, alg_gebouw_code,
                               alg_verdieping_volgnr, alg_ruimte_nr,
                               prs_perslid_telefoonnr,
                               prs_perslid_oslogin
                              )
                       VALUES (v_prs_perslid_email, v_prs_perslid_naam,
                               v_prs_perslid_tussenvoegsel,
                               v_prs_perslid_voorletters,
                               v_prs_perslid_voornaam, v_prs_team_naam,
                               v_prs_srtperslid_omschrijving,
                               v_alg_locatie_code, v_alg_gebouw_code,
                               v_alg_verdieping_volgnr_n, v_alg_ruimte_nr,
                               v_prs_perslid_telefoonnr,
                               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 ling_import_prs;
/


CREATE OR REPLACE PROCEDURE ling_update_prs (
   p_import_key IN NUMBER
)
IS
   -- LET OP: moet idem zijn als declaratie bij LING_IMPORT_PRS
   c_persoon_inactief       VARCHAR2 (30)   := 'INACTIEF: ';
   -- Maximaal percentage aan nieuwe medewerkers tov. actieve medewerkers met een e-mail
   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_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_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_kenmerklink_key        NUMBER (10);
   v_locatie_key            NUMBER (10);
   v_gebouw_key             NUMBER (10);
   v_verdieping_key         NUMBER (10);
   v_ruimte_key             NUMBER (10);
   v_wp_volgnr              NUMBER (3);
   v_wp_oms                 VARCHAR2 (30);
   v_wp_key                 NUMBER (10);
   v_groep_key              NUMBER (10);

   -- Let op! Personen die niet meer in dienst zijn -> niet in ling_imp_prs!
   -- Dubbele e-mails? Dan wordt iemand mogelijk niet verwijderd/INACTIEF!
   CURSOR cdelprs
   IS
      SELECT p.prs_perslid_key, p.prs_perslid_email, p.prs_perslid_naam,
             p.prs_perslid_voornaam
        FROM prs_v_aanwezigperslid p
       WHERE p.prs_perslid_email IS NOT NULL
         AND NOT EXISTS (
                SELECT 1
                  FROM ling_imp_prs ip
                 WHERE UPPER (ip.prs_perslid_email) =
                                                   UPPER (p.prs_perslid_email));

   -- Let op! Personen die niet meer in dienst zijn -> niet in ling_imp_prs!
   CURSOR csrtperslid
   IS
      SELECT   MIN (prs_perslid_email) prs_perslid_email,
               MIN (prs_perslid_naam) prs_perslid_naam,
               MIN (prs_perslid_voornaam) prs_perslid_voornaam,
               MIN (prs_srtperslid_omschrijving) prs_srtperslid_omschrijving
          FROM ling_imp_prs
      GROUP BY UPPER (prs_srtperslid_omschrijving);

   -- Let op! Personen die niet meer in dienst zijn -> niet in ling_imp_prs!
   -- Dubbele e-mails? Dan worden gewoon 2 (of meer) personen toegevoegd!
   CURSOR cperslid
   IS
      SELECT *
        FROM ling_imp_prs;

   -- Let op! Personen die niet meer in dienst zijn -> niet in ling_imp_prs!
   -- Dubbele e-mails? Dan krijgt iemand mogelijk de verkeerde plaats!
   CURSOR cwp
   IS
      SELECT p.*, ip.alg_locatie_code, ip.alg_gebouw_code, ip.alg_verdieping_volgnr,
             ip.alg_ruimte_nr
        FROM ling_imp_prs ip, prs_v_aanwezigperslid p
       WHERE UPPER (ip.prs_perslid_email) = UPPER (p.prs_perslid_email);

   -- Alle actieve personen met e-mail (ie. de import-doelgroep) zonder een werkplek
   CURSOR cnowp
   IS
      SELECT p.prs_perslid_key, p.prs_perslid_email, p.prs_perslid_naam,
             p.prs_perslid_voornaam
        FROM prs_v_aanwezigperslid p
       WHERE p.prs_perslid_email IS NOT NULL
         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 met e-mail (ie. de import-doelgroep) niet in een groep
   CURSOR cnogroup
   IS
      SELECT p.prs_perslid_key, p.prs_perslid_email, p.prs_perslid_naam,
             p.prs_perslid_voornaam
        FROM prs_v_aanwezigperslid p
       WHERE p.prs_perslid_email IS NOT NULL
         AND NOT EXISTS (SELECT 1
                           FROM fac_gebruikersgroep g
                          WHERE g.prs_perslid_key = p.prs_perslid_key);
BEGIN
   SELECT DECODE (COUNT (*), 0, 1, COUNT (*))
     INTO v_count_prs_actual
     FROM prs_v_aanwezigperslid
    WHERE prs_perslid_email IS NOT NULL;

   SELECT DECODE (COUNT (*), 0, 1, COUNT (*))
     INTO v_count_prs_import
     FROM prs_v_aanwezigperslid p, ling_imp_prs ip
    WHERE p.prs_perslid_email IS NOT NULL
      AND UPPER (p.prs_perslid_email) = UPPER (ip.prs_perslid_email);

   IF (   (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
            v_aanduiding :=
                  recdelprs.prs_perslid_email
               || '|'
               || recdelprs.prs_perslid_naam
               || '|'
               || recdelprs.prs_perslid_voornaam
               || ' - ';
            v_errorhint := 'Fout bij bepalen verplichtingen';

            -- 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 e-mail ['
                                 || recdelprs.prs_perslid_email
                                 || '] 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 maken persoon';

                  -- Persoon INACTIEF maken (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 e-mail ['
                                    || recdelprs.prs_perslid_email
                                    || '] en naam ['
                                    || recdelprs.prs_perslid_naam
                                    || ', '
                                    || recdelprs.prs_perslid_voornaam
                                    || '] is INACTIEF gemaakt',
                                    'Persoon is INACTIEF gemaakt'
                                   );
               ELSE
                  v_errorhint := 'Fout bij INACTIEF houden persoon';

                  -- Persoon INACTIEF houden (reset oslogin; indien handmatig INACTIEF gemaakt)
                  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 e-mail ['
                                    || recdelprs.prs_perslid_email
                                    || '] en naam ['
                                    || recdelprs.prs_perslid_naam
                                    || ', '
                                    || recdelprs.prs_perslid_voornaam
                                    || '] is INACTIEF',
                                    'Persoon is INACTIEF'
                                   );
               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_aanduiding || 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_email
               || '|'
               || 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_v_aanwezigsrtperslid
             WHERE UPPER (prs_srtperslid_omschrijving) =
                             UPPER (recsrtperslid.prs_srtperslid_omschrijving);

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

               INSERT INTO prs_srtperslid
                           (prs_srtperslid_omschrijving
                           )
                    VALUES (recsrtperslid.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_email
               || '|'
               || 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_v_aanwezigsrtperslid
             WHERE UPPER (prs_srtperslid_omschrijving) = UPPER (recperslid.prs_srtperslid_omschrijving);

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

            SELECT prs_afdeling_key
              INTO v_afdeling_key
              FROM prs_v_aanwezigafdeling
             WHERE UPPER(prs_afdeling_omschrijving) = UPPER (recperslid.prs_team_naam);

            v_errorhint := 'Fout bij bepalen persoon';

            SELECT COUNT (*), MAX (prs_perslid_key)
              INTO v_count, v_perslid_key
              FROM prs_v_aanwezigperslid
             WHERE UPPER (prs_perslid_email) = UPPER (recperslid.prs_perslid_email);

            IF v_count > 1
            THEN
               fac.imp_writelog (p_import_key,
                                 'E',
                                    v_aanduiding
                                 || ' kan persoon niet 1-duidig bepalen',
                                 v_errorhint
                                );
               COMMIT;
            ELSE
               IF v_count = 0
               THEN
                  v_errorhint := 'Fout bij toevoegen persoon';

                  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_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_email,
                               recperslid.prs_perslid_oslogin
                              )
                    RETURNING prs_perslid_key
                         INTO v_perslid_key;
               ELSE
                  v_errorhint := 'Fout bij wijzigen persoon';

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

               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_email
               || '|'
               || recwp.prs_perslid_naam
               || '|'
               || recwp.prs_perslid_voornaam
               || '|'
               || recwp.alg_locatie_code
               || '|'
               || recwp.alg_gebouw_code
               || '|'
               || recwp.alg_verdieping_volgnr
               || '|'
               || recwp.alg_ruimte_nr
               || ' - ';
            v_errorhint := 'Fout bij bepalen persoon';

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

            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 = recwp.alg_verdieping_volgnr;

            v_errorhint := 'Fout bij bepalen ruimte';

            SELECT alg_ruimte_key
              INTO v_ruimte_key
              FROM alg_v_aanwezigruimte
             WHERE alg_verdieping_key = v_verdieping_key
               AND UPPER (alg_ruimte_nr) = UPPER (recwp.alg_ruimte_nr);

            v_errorhint := 'Fout bij verhuizen naar nieuwe werkplek';
            PRS.movetoruimte (v_perslid_key, v_ruimte_key, 'G');
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_count_error := v_count_error + 1;
               v_errormsg := 'Geen data gevonden';
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || v_errormsg,
                                 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',
                           '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 e-mail ['
                              || recnowp.prs_perslid_email
                              || '] 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;

      FOR recnogroup IN cnogroup
      LOOP
         BEGIN
            v_aanduiding :=
                  recnogroup.prs_perslid_email
               || '|'
               || 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
                        );

            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;

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

      COMMIT;
   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 ling_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 ling_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 ling_v_noti_cntreminder
(
   CODE,
   SENDER,
   RECEIVER,
   TEXT,
   KEY,
   PAR1,
   PAR2,
   XKEY
)
AS
   SELECT code,
          sender,
          beh receiver,
          text,
          key,
          par1,
          par2,
          xkey
     FROM ling_v_noti_cntreminder_geg
    WHERE beh IS NOT NULL
  UNION ALL
   SELECT code,
          sender,
          eig receiver,
          text,
          key,
          par1,
          par2,
          xkey
     FROM ling_v_noti_cntreminder_geg
    WHERE eig IS NOT NULL
      AND eig != beh;


BEGIN adm.systrackscriptId('$Id$', 0); END;
/
BEGIN fac.registercustversion('LING', 3); END;
/

commit;

spool off
