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

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

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
COLUMN fcltcusttxt NEW_VALUE fcltcusttxt NOPRINT;
WHENEVER SQLERROR CONTINUE;
SELECT adm.getscriptspoolfile('&thisfile') AS fcltlogfile FROM DUAL;
SPOOL &fcltlogfile
WHENEVER SQLERROR EXIT;
SELECT adm.checkscriptcust('&dbuser') AS fcltcusttxt FROM DUAL;
WHENEVER SQLERROR CONTINUE;
---------------------------------------
PROMPT &fcltcusttxt
---------------------------------------
SET DEFINE OFF


------ payload begin ------

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

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


   CURSOR c1
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   DELETE FROM alli_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 - Usernaam/login
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_oslogin);

         -- 02, 03, 04 - voornaam, achternaam, tussenvoegsel.
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_voornaam);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_naam);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_tussenvoegsel);

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

         -- 06 - Afdelingsnaam (niet de code!)
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_afdeling_naam);

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

         -- 08 - Peroneelsnr
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_nr);

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

         -- 10 - Telenr (035) van medewerker
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_telefoonnr);

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

         -- 12 - Bedrijfsonderdeel van medewerker
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_bedrijfsdeel);

         -- 13 - Leidinggevende van medewerker
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_leidinggevende);

         -- 14 - Voorletters
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_voorletters);

         -------------------------------------------------------------------------

         -- xx - Locatiecode werkplek van medewerker
         --fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_locatie_code);
         v_alg_locatie_code := NULL;

         -- xx - Gebouwcode werkplek van medewerker
         --fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_gebouw_code);
         v_alg_gebouw_code := NULL;
         -------------------------------------------------------------------------

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

         -- 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_oslogin) = 'SAMACCOUNTNAME'
                AND UPPER (v_prs_perslid_voornaam) = 'GIVENNAME'
                AND UPPER (v_prs_perslid_naam) = 'SN'
                AND UPPER (v_prs_afdeling_code) = 'DEPARTMENTCODE'
                AND UPPER (v_prs_afdeling_naam) = 'DEPARTMENTNAME'
                AND UPPER (v_prs_srtperslid_omschrijving) = 'FUNCTIE'
                AND UPPER (v_prs_perslid_nr) = 'PERSONEELSNR'
                AND UPPER (v_prs_perslid_email) = 'MAIL'
                AND UPPER (v_prs_perslid_telefoonnr) = 'TELEPHONENUMBER'
                AND UPPER (v_prs_perslid_mobiel) = 'MOBILE'
                AND UPPER (v_prs_perslid_leidinggevende) = 'LEIDINGGEVENDE'
                AND UPPER (v_prs_perslid_voorletters) = 'VOORLETTERS'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden

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

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

            --
            v_errorhint := 'Ongeldig loginnaam';
            --v_prs_perslid_oslogin := SUBSTR (v_prs_perslid_email, 1, INSTR (v_prs_perslid_email, '@', 1, 1) - 1);
            v_prs_perslid_oslogin := TRIM (v_prs_perslid_oslogin);

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

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

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

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

            -- ALLI#33755: tussenvoegsel niet meer inlezen. Dat zit tot nader order in
            -- het achternaamveld gebakken
            v_prs_perslid_tussenvoegsel := NULL;
            --v_errorhint := 'Ongeldig tussenvoegsel';
            --v_prs_perslid_tussenvoegsel := TRIM (v_prs_perslid_tussenvoegsel);
            --
            --IF LENGTH (v_prs_perslid_tussenvoegsel) > 15
            --THEN
            --   v_prs_perslid_tussenvoegsel :=
            --                      SUBSTR (v_prs_perslid_tussenvoegsel, 1, 15);
            --   fac.imp_writelog (p_import_key,
            --                     'W',
            --                     v_aanduiding || 'Tussenvoegsel te lang',
            --                        'Tussenvoegsel wordt afgebroken tot ['
            --                     || v_prs_perslid_tussenvoegsel
            --                     || ']'
            --                    );
            --   COMMIT;
            --END IF;

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

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

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

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


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

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

            v_errorhint := 'Ongeldige afdelingnaam';
            v_prs_afdeling_naam := TRIM (v_prs_afdeling_naam);

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

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

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

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

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

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

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

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

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


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

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


            v_errorhint := 'Ongeldig bedrijfsonderdeel';
            v_prs_perslid_bedrijfsdeel := TRIM (v_prs_perslid_bedrijfsdeel);

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

            v_errorhint := 'Ongeldige leidinggevende';
            v_prs_perslid_leidinggevende := TRIM (v_prs_perslid_leidinggevende);

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


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

                  INSERT INTO alli_imp_prs
                          (prs_perslid_nr, prs_perslid_naam,
                           prs_perslid_tussenvoegsel,
                           prs_perslid_voorletters,
                           prs_perslid_voornaam,
                           prs_afdeling_code, prs_afdeling_naam,
                           prs_srtperslid_omschrijving,
                           alg_locatie_code, alg_gebouw_code,
                           alg_verdieping_volgnr, alg_ruimte_nr,
                           prs_perslid_telefoonnr,
                           prs_perslid_mobiel,
                           prs_perslid_email,
                           prs_perslid_oslogin,
                           prs_perslid_bedrijfsdeel,
                           prs_perslid_leidinggevende
                          )
                   VALUES (v_prs_perslid_nr, v_prs_perslid_naam,
                           v_prs_perslid_tussenvoegsel,
                           v_prs_perslid_voorletters,
                           v_prs_perslid_voornaam,
                           v_prs_afdeling_code, v_prs_afdeling_naam,
                           v_prs_srtperslid_omschrijving,
                           v_alg_locatie_code, v_alg_gebouw_code,
                           NULL, NULL,
                           v_prs_perslid_telefoonnr,
                           v_prs_perslid_mobiel,
                           v_prs_perslid_email,
                           v_prs_perslid_oslogin,
                           v_prs_perslid_bedrijfsdeel,
                           v_prs_perslid_leidinggevende
                          );
                  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 alli_import_prs;
/

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

   c_key_default_rol        NUMBER(10) := 1;

   v_aanduiding             VARCHAR2 (200);
   v_errorhint              VARCHAR2 (1000);
   v_errormsg               VARCHAR2 (1000);
   oracle_err_num           NUMBER;
   oracle_err_mes           VARCHAR2 (200);
   v_count_prs_actual       NUMBER (10);
   v_count_prs_import       NUMBER (10);          -- Matching actual persons!
   v_count_tot              NUMBER (10);
   v_count_error            NUMBER (10);
   v_count                  NUMBER (10);
   --
   v_perslid_key            NUMBER (10);
   v_afdeling_key           NUMBER (10);
   v_fac_usrdata_key        NUMBER (10);
   v_srtperslid_key         NUMBER (10);
   v_leidinggevende_key     NUMBER (10);
   v_oslogin                VARCHAR2 (30);
   v_wachtwoord             VARCHAR2 (30);
   v_locatie_key            NUMBER (10);
   v_gebouw_key             NUMBER (10);
   v_verdieping_key         NUMBER (10);
   v_ruimte_key             NUMBER (10);
   v_wp_key                 NUMBER (10);
   v_wp_volgnr              NUMBER (3);
   v_wp_oms                 VARCHAR2 (30);
   v_groep_defaultnaam      VARCHAR2 (30);

   -- Let op! Met eindatum zijn personen die niet meer in dienst zijn.
   -- Dubbele nummers? Dan wordt iemand mogelijk niet verwijderd/INACTIEF!
   CURSOR cdelprs
   IS
      SELECT p.prs_perslid_key, p.prs_perslid_nr, p.prs_perslid_naam,
             p.prs_perslid_voornaam
        FROM prs_v_aanwezigperslid p
       WHERE p.prs_perslid_nr IS NOT NULL
         AND NOT EXISTS (
                SELECT 1
                  FROM alli_imp_prs ip
                 WHERE ip.prs_perslid_nr = p.prs_perslid_nr);


   CURSOR csperslid
   IS
      SELECT prs_srtperslid_omschrijving
      FROM alli_imp_prs
      GROUP BY prs_srtperslid_omschrijving;


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

    CURSOR c_bedrijf
    IS
    SELECT distinct (prs_perslid_bedrijfsdeel) prs_perslid_bedrijfsdeel
        FROM alli_imp_prs;

   CURSOR cperslid
   IS
      SELECT *
        FROM alli_imp_prs;

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

   -- Alle actieve personen met personeelsnummer (ie. de import-doelgroep) zonder een werkplek
   -- PKO: Niemand heeft een werkplek; check weglaten.
   CURSOR cnowp
   IS
      SELECT p.prs_perslid_key, p.prs_perslid_nr, p.prs_perslid_naam,
             p.prs_perslid_voornaam
        FROM prs_v_aanwezigperslid p
       WHERE p.prs_perslid_nr 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)
         AND 1=0;

   -- Alle aanwezige personen met personeelsnummer (ie. de import-doelgroep) niet in een groep
   CURSOR cnogroup
   IS
      SELECT p.prs_perslid_key, p.prs_perslid_nr, p.prs_perslid_naam,
             p.prs_perslid_voornaam
        FROM prs_v_aanwezigperslid p
       WHERE p.prs_perslid_nr 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_perslid
    WHERE prs_perslid_verwijder IS NULL AND prs_perslid_nr IS NOT NULL;

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

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

      -- Personen verwijderen/inactiveren
      FOR recdelprs IN cdelprs
      LOOP
         BEGIN
            -- Heeft persoon actuele/toekomstige verplichtingen?
            SELECT COUNT (*)
              INTO v_count
              FROM prs_perslid p, prs_v_verplichting_keys r
             WHERE p.prs_perslid_key = r.prs_perslid_key
               AND p.prs_perslid_key = recdelprs.prs_perslid_key;

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

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

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

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

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

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

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

                  fac.imp_writelog (p_import_key,
                                    'I',
                                       'Persoon met nummer ['
                                    || recdelprs.prs_perslid_nr
                                    || '] en naam ['
                                    || recdelprs.prs_perslid_naam
                                    || ', '
                                    || recdelprs.prs_perslid_voornaam
                                    || '] is INACTIEF gemaakt',
                                    'Persoon is INACTIEF gemaakt'
                                   );
               END IF;
               COMMIT;
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     'OTHERS (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_errormsg,
                                 v_errorhint
                                );
               COMMIT;
         END;
      END LOOP;

      v_count_tot := 0;
      v_count_error := 0;

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

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

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

               INSERT INTO prs_srtperslid (prs_srtperslid_omschrijving)
               VALUES (recsperslid.prs_srtperslid_omschrijving);
               COMMIT;
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               v_count_error := v_count_error + 1;
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     'OTHERS (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || v_errormsg,
                                 v_errorhint
                                );
               COMMIT;
         END;
      END LOOP;

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


      v_count_tot := 0;
      v_count_error := 0;

      -- Afdelingen aanmaken
      FOR recafdeling IN cprsafd
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding := recafdeling.prs_afdeling_code || ' - ' || recafdeling.prs_afdeling_naam;
            v_errorhint := 'Fout bij bepalen afdeling';

            SELECT COUNT (*)
              INTO v_count
              FROM prs_afdeling
             WHERE UPPER (prs_afdeling_naam) =  UPPER (recafdeling.prs_afdeling_code)
               AND prs_bedrijf_key = 5
               AND prs_afdeling_verwijder IS NULL;

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

               INSERT INTO prs_afdeling
                           (prs_bedrijf_key, prs_afdeling_naam, prs_afdeling_omschrijving)
                    VALUES (5, recafdeling.prs_afdeling_code, recafdeling.prs_afdeling_naam);
               COMMIT;
            ELSE
               v_errorhint := 'Fout bij bijwerken afdeling';

               UPDATE prs_afdeling
               SET prs_afdeling_omschrijving = recafdeling.prs_afdeling_naam
               WHERE prs_afdeling_naam = recafdeling.prs_afdeling_code
               AND prs_bedrijf_key = 5
               AND prs_afdeling_verwijder IS NULL;

               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',
                           'Afdeling: verwerkte regels zonder foutmelding: '
                        || TO_CHAR (v_count_tot - v_count_error),
                        ''
                       );
      fac.imp_writelog (p_import_key,
                        'S',
                           'Afdeling: verwerkte regels met foutmelding: '
                        || TO_CHAR (v_count_error),
                        ''
                       );
      COMMIT;

      v_count_tot := 0;
      v_count_error := 0;

      -- Bedrijfsonderdeel aanmaken (usrdata)
      FOR recbedrijf IN c_bedrijf
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding := recbedrijf.prs_perslid_bedrijfsdeel;
            v_errorhint := 'Fout bij bepalen bedrijfsonderdeel';

            SELECT COUNT (*)
              INTO v_count
              FROM fac_usrdata
             WHERE UPPER (fac_usrdata_omschr) =  UPPER (recbedrijf.prs_perslid_bedrijfsdeel)
               AND fac_usrtab_key= 121
               AND fac_usrdata_verwijder IS NULL;

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

               INSERT INTO fac_usrdata
                           (fac_usrtab_key, fac_usrdata_code, fac_usrdata_omschr)
                    VALUES (121, SUBSTR(recbedrijf.prs_perslid_bedrijfsdeel,1,30), recbedrijf.prs_perslid_bedrijfsdeel);
               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',
                           'Bedrijfsonderdeel: verwerkte regels zonder foutmelding: '
                        || TO_CHAR (v_count_tot - v_count_error),
                        ''
                       );
      fac.imp_writelog (p_import_key,
                        'S',
                           'Bedrijfsonderdeel: verwerkte regels met foutmelding: '
                        || TO_CHAR (v_count_error),
                        ''
                       );
      COMMIT;
      v_count_tot := 0;
      v_count_error := 0;

      -- Persoon toevoegen/bijwerken
      FOR recperslid IN cperslid
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_perslid_key := NULL;
            v_aanduiding :=
                  recperslid.prs_perslid_nr
               || '|'
               || 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_naam
               || ']';

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

            v_errorhint :=
                  'Fout bij bepalen bedrijfsonderdeel ['
               || recperslid.prs_perslid_bedrijfsdeel
               || ']';

            SELECT fac_usrdata_key
              INTO v_fac_usrdata_key
              FROM fac_usrdata
             WHERE UPPER (fac_usrdata_omschr) =  UPPER (recperslid.prs_perslid_bedrijfsdeel)
               AND fac_usrtab_key= 121
               AND fac_usrdata_verwijder IS NULL;


            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_nr) = UPPER (recperslid.prs_perslid_nr);

            -- Meerdere personen met hetzelfde nummer; loggen en overslaan
            IF (v_count > 1)
            THEN
               v_count_error := v_count_error + 1;
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || 'Meerdere personen met nummer ['||recperslid.prs_perslid_nr||'] gevonden!',
                                 v_errorhint
                                );
               CONTINUE;

            -- Nog niemand met dit nummer; voeg toe
            ELSIF (v_count = 0)
            THEN
               v_errorhint := 'Fout bij toevoegen persoon';

               -- Checken of er al een persoon met dezelfde oslogin bestaat
               SELECT COUNT(*)
                 INTO v_count
                 FROM prs_perslid
                WHERE UPPER(prs_perslid_oslogin) = UPPER(recperslid.prs_perslid_oslogin);

               -- Er bestaat al iemand met deze oslogin. Loggen en overslaan.
               IF (v_count != 0)
               THEN
                  v_count_error := v_count_error + 1;
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_aanduiding || 'Er bestaat al een persoon met login ['||recperslid.prs_perslid_oslogin||']',
                                    v_errorhint
                                   );
                  CONTINUE;
               ELSE
                  -- Nieuwe persoon uit importbestand, wordt toegevoegd in Facilitor.
                  INSERT INTO prs_perslid
                              (prs_perslid_module, prs_srtperslid_key,
                               prs_afdeling_key, prs_perslid_naam,
                               prs_perslid_voorletters,
                               prs_perslid_tussenvoegsel,
                               prs_perslid_voornaam,
                               prs_perslid_telefoonnr,
                               prs_perslid_mobiel,
                               prs_perslid_email,
                               prs_perslid_nr,
                               prs_perslid_oslogin
                              )
                       VALUES ('PRS', v_srtperslid_key,
                               v_afdeling_key, recperslid.prs_perslid_naam,
                               recperslid.prs_perslid_voorletters,
                               recperslid.prs_perslid_tussenvoegsel,
                               recperslid.prs_perslid_voornaam,
                               recperslid.prs_perslid_telefoonnr,
                               recperslid.prs_perslid_mobiel,
                               recperslid.prs_perslid_email,
                               recperslid.prs_perslid_nr,
                               recperslid.prs_perslid_oslogin
                              )
                  RETURNING prs_perslid_key INTO v_perslid_key;
               END IF;

               COMMIT;

            -- E�n persoon met dit nummer; werk bij
            ELSE

               v_errorhint := 'Fout bij wijzigen persoon';

               -- Checken of er al een andere persoon met dezelfde oslogin bestaat
               SELECT COUNT(*)
                 INTO v_count
                 FROM prs_perslid
                WHERE UPPER(prs_perslid_oslogin) = UPPER(recperslid.prs_perslid_oslogin)
                  AND UPPER( COALESCE(prs_perslid_nr,'apekool') ) != UPPER(recperslid.prs_perslid_nr);

               -- Er bestaat al iemand anders met deze oslogin. Loggen en overslaan.
               IF (v_count != 0)
               THEN
                  v_count_error := v_count_error + 1;
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_aanduiding || 'Er bestaat al een persoon (met een ander personeelsnummer) met login ['||recperslid.prs_perslid_oslogin||']',
                                    v_errorhint
                                   );
                  CONTINUE;
               ELSE
                  -- Functie, Afdeling altijd bijwerken
                  -- Voorletters, Naam, Tussenvoegsels, Voornaam alleen indien gevuld wordt aangeboden, anders laten staan wat in DB stond.
                  -- Telefoonnr: alleen bijwerken indien uit AD-dump gevuld, anders niet bijwerken (dus gewoon laten staan zoals in Facilitor was gereigistreerd).
                  -- E-mail: alleen bijwerken indien uit AD-dump gevuld, anders niet bijwerken (dus gewoon laten staan zoals in Facilitor was gereigistreerd).
                  -- Personeelsnr: alleen bijwerken indien uit AD-dump gevuld, anders niet bijwerken (dus gewoon laten staan zoals in Facilitor was gereigistreerd).
                  -- Login: alleen bijwerken indien uit AD-dump gevuld, anders niet bijwerken (dus gewoon laten staan zoals in Facilitor was gereigistreerd).
                  -- ALLI#33755: tussenvoegselveld actief leegmaken (dus geen coalesce meer)
                  UPDATE prs_perslid
                     SET prs_srtperslid_key = v_srtperslid_key,
                         prs_afdeling_key = v_afdeling_key,
                         prs_perslid_naam = COALESCE(recperslid.prs_perslid_naam,prs_perslid_naam),
                         prs_perslid_voorletters = COALESCE(recperslid.prs_perslid_voorletters,prs_perslid_voorletters),
                         prs_perslid_tussenvoegsel = recperslid.prs_perslid_tussenvoegsel,
                         prs_perslid_voornaam = COALESCE(recperslid.prs_perslid_voornaam,prs_perslid_voornaam),
                         prs_perslid_telefoonnr = COALESCE (recperslid.prs_perslid_telefoonnr, prs_perslid_telefoonnr),
                         prs_perslid_mobiel = COALESCE (recperslid.prs_perslid_mobiel, prs_perslid_mobiel),
                         prs_perslid_email = COALESCE (recperslid.prs_perslid_email, prs_perslid_email),
                         prs_perslid_nr = COALESCE (recperslid.prs_perslid_nr, prs_perslid_nr),
                         prs_perslid_oslogin = COALESCE (recperslid.prs_perslid_oslogin, prs_perslid_oslogin)
                     WHERE prs_perslid_key = v_perslid_key;
                  COMMIT;
               END IF;
            END IF;

            -- Bedrijfsonderdeel als flexprop inserten of updaten....
            -- prs_kenmerk_key = 1060 is het bedrijfsonderdeel flexprop bij persoon (prs_perslid)
            SELECT COUNT (*)
              INTO v_count
              FROM prs_kenmerklink
             WHERE prs_link_key = v_perslid_key
               AND prs_kenmerklink_niveau = 'P'
               AND prs_kenmerk_key = 1060
               AND prs_kenmerklink_verwijder IS NULL;

            IF (v_count = 0)
            THEN
               v_errorhint := 'Fout bij toevoegen kenmerk bedrijfsonderdeel';
               INSERT INTO prs_kenmerklink
                           (prs_link_key, prs_kenmerklink_niveau, prs_kenmerk_key, prs_kenmerklink_waarde)
                    VALUES (v_perslid_key, 'P', 1060, v_fac_usrdata_key );
               COMMIT;
            ELSE
               v_errorhint := 'Fout bij bijwerken kenmerk bedrijfsonderdeel';

               UPDATE prs_kenmerklink
               SET prs_kenmerklink_waarde = v_fac_usrdata_key
               WHERE prs_link_key = v_perslid_key
               AND prs_kenmerklink_niveau = 'P'
               AND prs_kenmerk_key = 1060
               AND prs_kenmerklink_verwijder IS NULL;
               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),
                        ''
                       );

      -- ALLI#33108: telefoonnummers opmaken voor de visitekaartjes
      -- (moet worden 0612345678)
      UPDATE prs_perslid
         SET prs_perslid_mobiel =
               REPLACE(
                  REPLACE(
                     REPLACE(
                        REPLACE(prs_perslid_mobiel,
                                '-', ''),
                        '.', ''),
                     ' ', ''),
                  '+31', '0')
       WHERE prs_perslid_verwijder IS NULL
         AND prs_perslid_mobiel IS NOT NULL;
      -- In Visma wordt "0" ingevuld als iemand geen 06 heeft; lege waarde van maken.
      UPDATE prs_perslid
         SET prs_perslid_mobiel = NULL
       WHERE prs_perslid_mobiel = '0';

      -- Ongeldige nummers rapporteren
      FOR rectel IN (
         SELECT prs_perslid_key, prs_perslid_nr, prs_perslid_naam, prs_perslid_voornaam, prs_perslid_mobiel
           FROM prs_v_aanwezigperslid
          WHERE prs_perslid_mobiel IS NOT NULL
            AND prs_perslid_naam NOT LIKE 'INACTIEF%'
            AND (   prs_perslid_mobiel NOT LIKE '06________') )
      LOOP
         fac.imp_writelog (p_import_key,
                           'W',
                              rectel.prs_perslid_nr || '|'
                           || rectel.prs_perslid_naam || '|'
                           || rectel.prs_perslid_voornaam || ' - '
                           || 'ongeldig formaat mobiel nummer',
                              'Mobiel nummer (na ''omnummering''): ['
                           || rectel.prs_perslid_mobiel || ']'
                          );
      END LOOP;

      COMMIT;

      v_count_tot := 0;
      v_count_error := 0;

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

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

            v_errorhint := 'Fout bij bepalen locatie';

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

            v_errorhint := 'Fout bij bepalen gebouw';

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

            v_errorhint := 'Fout bij bepalen verdieping';

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

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

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

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

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

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

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

               v_errorhint := 'Fout bij bepalen ruimte';

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

               v_errorhint := 'Fout bij bepalen vrije werkplek';

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

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

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

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

                  SELECT prs_s_prs_werkplek_key.NEXTVAL
                    INTO v_wp_key
                    FROM DUAL;

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

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

                  v_errorhint := 'Fout bij aanmaken nieuwe werkplek';

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

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

                  INSERT INTO prs_perslidwerkplek
                              (prs_perslid_key, prs_werkplek_key,
                               prs_perslidwerkplek_bezetting
                              )
                       VALUES (v_perslid_key, v_wp_key,
                               100
                              );
                  COMMIT;
               END IF;
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               v_count_error := v_count_error + 1;
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     'OTHERS (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || v_errormsg,
                                 v_errorhint
                                );
               COMMIT;
         END;
      END LOOP;

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

      -- Rapporteer personen zonder werkplek
      FOR recnowp IN cnowp
      LOOP
         BEGIN
            fac.imp_writelog (p_import_key,
                              'I',
                                 'Persoon met nummer ['
                              || recnowp.prs_perslid_nr
                              || '] en naam ['
                              || recnowp.prs_perslid_naam
                              || ', '
                              || recnowp.prs_perslid_voornaam
                              || '] heeft geen werkplek',
                              'Geen werkplek'
                             );
            COMMIT;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     'OTHERS (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_errormsg,
                                 v_errorhint
                                );
               COMMIT;
         END;
      END LOOP;

		-- Iedereen krijgt _Default-rol die nog geen groep heeft.
      FOR recnogroup IN cnogroup
      LOOP
         BEGIN
            v_aanduiding :=
                  recnogroup.prs_perslid_nr
               || '|'
               || recnogroup.prs_perslid_naam
               || '|'
               || recnogroup.prs_perslid_voornaam
               || ' - ';
            v_errorhint := 'Fout bij bepalen groep met key [' || c_key_default_rol || ']';

						SELECT fac_groep_upper
              INTO v_groep_defaultnaam
              FROM fac_groep
             WHERE fac_groep_key = c_key_default_rol;


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

            INSERT INTO fac_gebruikersgroep
                        (fac_groep_key, prs_perslid_key
                        )
                 VALUES (c_key_default_rol, recnogroup.prs_perslid_key
                        );
            COMMIT;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     'OTHERS (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_errormsg,
                                 v_errorhint
                                );
               COMMIT;
         END;
      END LOOP;


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



-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-- Koppeling CYOD serienummers registratie met Misco.

CREATE OR REPLACE VIEW ALLI_V_INS_KENMERKDOMEIN_BES (BES_BESTELLING_KEY, BES_BESTELLING_NR)
AS
SELECT BES_BESTELLING_KEY, to_char(BES_BESTELLING_KEY)
FROM BES_BESTELLING;


--select *
--from bes_bestelopdr_item bo, bes_bestelling_item  bi, bes_srtdeel sd
--where bes_bestelopdr_key = (select bes_bestelopdr_key from bes_bestelopdr where bes_bestelopdr_id = '361/1')
--and  BI.BES_BESTELOPDR_ITEM_KEY = BO.BES_BESTELOPDR_ITEM_KEY
--and bi.bes_srtdeel_key = sd.bes_srtdeel_key;


CREATE OR REPLACE PROCEDURE alli_import_cyod_serienummers (
   p_import_key IN NUMBER
)
IS
   c_fielddelimitor                VARCHAR2 (1)    := ';';
   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_bes_bestelopdr_id             VARCHAR2 (256);
   v_bes_srtdeel_nr                VARCHAR2 (256);
   v_serienummer                   VARCHAR2 (256);
   v_soort                         VARCHAR2 (256);
   v_datum                         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 alli_imp_cyod_serienummers;

   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


        -- v_bes_bestelopdr_id             VARCHAR2 (256);
        -- v_bes_srtdeel_nr                VARCHAR2 (256);
        -- v_serienummer                   VARCHAR2 (256);
        -- v_datum                         VARCHAR2 (256);

         -- 01 - Bestelopdrachtnummer
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 1, v_bes_bestelopdr_id);

         -- 02 - Artikelnummer
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 2, v_bes_srtdeel_nr);

         -- 03 - Serienummer of IMEI nummer.
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 3, v_serienummer);

         -- 04 - Soort object: Notebook (N) of Telefoon (T)
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 4, v_soort);

         -- 05 - Verzenddatum cq. Aanschafdatum
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 5, v_datum);


         --
         v_aanduiding :=
               '['
            || v_bes_bestelopdr_id
            || '|'
            || v_bes_srtdeel_nr
            || '|'
            || v_serienummer
            || '|'
            || v_soort
            || '] ';

         -- 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_bes_bestelopdr_id) = 'BESTELOPDRACHTNR'
               AND UPPER (v_bes_srtdeel_nr) = 'ARTIKELNR'
               AND UPPER (v_serienummer) = 'SERIENR'
               AND UPPER (v_soort) = 'TYPE'
               AND UPPER (v_datum) = 'VERZENDDATUM'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden

            --
            v_errorhint := 'Ongeldig bestelopdrachtnr';
            v_bes_bestelopdr_id := TRIM (v_bes_bestelopdr_id);

            IF (v_bes_bestelopdr_id IS NOT NULL)
            THEN
                IF LENGTH (v_bes_bestelopdr_id) > 30
                THEN
                    v_bes_bestelopdr_id := SUBSTR (v_bes_bestelopdr_id, 1, 30);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Bestelopdrachtnr te lang', 'Nummer wordt afgebroken tot [' || v_bes_bestelopdr_id || ']' );
                END IF;
            ELSE
                v_ongeldig := 1;
            END IF;

            v_errorhint := 'Ongeldig artikelnr';
            v_bes_srtdeel_nr := TRIM (v_bes_srtdeel_nr);

            IF (v_bes_srtdeel_nr IS NOT NULL)
            THEN
                IF LENGTH (v_bes_srtdeel_nr) > 32
                THEN
                    v_bes_srtdeel_nr := SUBSTR (v_bes_srtdeel_nr, 1, 32);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Artikelnummer te lang', 'Nummer wordt afgebroken tot [' || v_bes_srtdeel_nr || ']' );
                END IF;
            ELSE
                v_ongeldig := 1;
            END IF;

            v_errorhint := 'Ongeldig serienummer';
            v_serienummer := TRIM (v_serienummer);
            IF (v_serienummer IS NOT NULL)
            THEN
                IF LENGTH (v_serienummer) > 50
                THEN
                    v_serienummer := SUBSTR (v_serienummer, 1, 50);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Serienummer te lang', 'Nummer wordt afgebroken tot [' || v_serienummer || ']' );
                END IF;
            END IF;

            v_errorhint := 'Ongeldig type/soort';
            v_soort := TRIM (v_soort);
            IF (v_soort IS NOT NULL)
            THEN
                IF LENGTH (v_soort) > 1
                THEN
                    v_soort := SUBSTR (v_soort, 1, 1);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Type/soort te lang', 'Type/soort wordt afgebroken tot [' || v_soort || ']' );
                END IF;
            END IF;


            v_errorhint := 'Ongeldige verzenddatum';
            v_datum := TRIM (v_datum);
            IF (v_datum IS NOT NULL)
            THEN
                IF LENGTH (v_datum) > 10
                THEN
                    v_datum := SUBSTR (v_datum, 1, 10);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Verzenddatum te lang', 'Datum wordt afgebroken tot [' || v_datum || ']' );
                END IF;
            END IF;

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

                  INSERT INTO alli_imp_cyod_serienummers  (bes_bestelopdr_id, bes_srtdeel_nr, serienummer, soort, datum)
                  VALUES (v_bes_bestelopdr_id, v_bes_srtdeel_nr, v_serienummer, v_soort, v_datum);

                  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',
                           'CYOD serienummers: aantal ingelezen regels: '
                        || TO_CHAR (v_count_tot),
                        ''
                       );
   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 alli_import_cyod_serienummers;
/


CREATE OR REPLACE PROCEDURE alli_update_cyod_serienummers (
   p_import_key IN NUMBER
)
IS

    v_aanduiding             VARCHAR2 (200);
    v_errorhint              VARCHAR2 (1000);
    v_errormsg               VARCHAR2 (1000);
    oracle_err_num           NUMBER;
    oracle_err_mes           VARCHAR2 (200);
    v_count_tot              NUMBER (10);
    v_count_error            NUMBER (10);
    v_count                  NUMBER (10);

    v_aantal                NUMBER (10);

    v_bes_bestelling_key    NUMBER (10);
    v_prs_perslid_key       NUMBER (10);
    v_bes_srtgroep_key      NUMBER (10);

    c_ins_srtgroep_key_temp  NUMBER (10)    := 1;
    c_ins_kenmerk_key_temp   NUMBER (10)    := 1;

    l_ins_srtdeel_key        NUMBER (10);
    l_ins_deel_key           NUMBER (10);
    l_code_notebook_telefoon VARCHAR2 (100);


    c_ins_srtdeel_key_telefoon  NUMBER (10)    :=  9201;
    c_ins_srtdeel_key_notebook  NUMBER (10)    :=  9202;

    c_notebook_bestelling_key   NUMBER (10)    :=  1;
    c_notebook_artikel_key      NUMBER (10)    :=  2;
    c_notebook_serienr_key      NUMBER (10)    :=  3;
    c_notebook_datum_key        NUMBER (10)    :=  4;

    c_mobiel_bestelling_key     NUMBER (10)    :=  5;
    c_mobiel_artikel_key        NUMBER (10)    :=  6;
    c_mobiel_serienr_key        NUMBER (10)    :=  7;
    c_mobiel_datum_key          NUMBER (10)    :=  8;



    -- Alle ingelezen CYOD artikelen met serienummers
    CURSOR c_cyod_artikelen
    IS
        SELECT *
        FROM alli_imp_cyod_serienummers;


    BEGIN
    v_count_tot := 0;
    v_count_error := 0;


    v_aanduiding := '';


    -- Alle artikelen verwerken...
    FOR rec_cyod IN c_cyod_artikelen
    LOOP
        BEGIN
            v_count_tot := v_count_tot + 1;

            v_aanduiding :=
                   '['
                || rec_cyod.bes_bestelopdr_id
                || '|'
                || rec_cyod.bes_srtdeel_nr
                || '|'
                || rec_cyod.serienummer
                || '|'
                || rec_cyod.soort
                || '|'
                || rec_cyod.datum
                || '] ';

            v_errorhint := 'Fout bij bepalen combi bestelopdracht en artikelnummer';

            -- Op zoek naar:
            -- 1) de bestelopdracht volgens opdrachtnr: rec_cyod.bes_bestelopdr_id
            -- 2) het artikel dat in die opdracht zit volgens artikelnr: rec_cyod.bes_srtdeel_nr
            -- We vinden dan:
            -- 1) De bestellingaanvraag (bes_bestelling_key)
            -- 2) De besteller (prs_perslid_key)
            -- 3) De soortgroep (bes_srtgroep_key): notebook of telefoon (indien een andere, dan maken we geen serienummer erbij).


            SELECT b.bes_bestelling_key, b.prs_perslid_key, sg.bes_srtgroep_key
            INTO v_bes_bestelling_key, v_prs_perslid_key, v_bes_srtgroep_key
            FROM bes_bestelling b, bes_bestelopdr bo, bes_bestelopdr_item boi, bes_bestelling_item  bi, bes_srtdeel sd, bes_srtgroep sg
            WHERE b.bes_bestelling_key = bi.bes_bestelling_key
            AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key
            AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
            AND  BI.BES_BESTELOPDR_ITEM_KEY = BOI.BES_BESTELOPDR_ITEM_KEY
            AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
            AND bo.bes_bestelopdr_id = rec_cyod.bes_bestelopdr_id
            AND sd.bes_srtdeel_nr = rec_cyod.bes_srtdeel_nr ;


            -- Hier komt een cruciaal stuk die bepaalt of het artikel een N(notebook) of T(telefoon is).
            -- Mogelijk wordt dat in de XML door Misco meegestuurd, en anders bepalen wie die adhv de groep.
            -- Nu doen we ff een simpele check op groep-key: indien 1623 dan is ie van de telefoon-groep, dus een telefoon.

            l_code_notebook_telefoon := NULL;
            l_code_notebook_telefoon := NULL;

            v_errorhint := 'Fout bij bepalen soort object';
            IF rec_cyod.soort = 'T'
            THEN
                -- Ik ben een telefoon, bepaal een nieuwe default naam/code voor het object
                l_ins_srtdeel_key := c_ins_srtdeel_key_telefoon;
            ELSE
                IF rec_cyod.soort = 'N'
                THEN
                    -- Ik ben een notebook, bepaal een nieuwe default naam/code voor het object
                    l_ins_srtdeel_key := c_ins_srtdeel_key_notebook;
                ELSE
                    l_ins_srtdeel_key := NULL;
                END IF;
            END IF;


            IF l_ins_srtdeel_key IS NOT NULL
            THEN
                -- Eerst ff kijken of persoon het object al heeft, waarbij serienummer/IMEI nummer dezelfde is.
                -- Dan namelijk NIET toevoegen, anders wordt het object dubbel geregistreerd.
                -- De aanschafdatum mag dan wel/hooguit worden aangepast, maar dat doen we maar even niet. We gaan ervan uit dat er eenmalig een aanlevering van goede gegevens plaatsvindt.

                SELECT count(*)
                INTO v_aantal
                FROM ins_deel d, ins_kenmerkdeel k
                WHERE ins_deel_module = 'INS'
                AND ins_srtdeel_key = l_ins_srtdeel_key
                AND ins_alg_ruimte_key = v_prs_perslid_key
                AND ins_alg_ruimte_type = 'P'
                AND d.ins_deel_key=k.ins_deel_key
                AND (ins_kenmerk_key = c_notebook_serienr_key OR ins_kenmerk_key = c_mobiel_serienr_key)
                AND ins_kenmerkdeel_waarde = rec_cyod.serienummer;


                IF v_aantal = 0
                THEN
                    -- Persoon heeft het object met dat serienummer nog niet --> DUS TOEVOEGEN


                    SELECT ins.get_description('LPN_INS_DEEL',NULL, ins_srtdeel_code_upper)
                    INTO l_code_notebook_telefoon
                    FROM ins_srtdeel
                    WHERE ins_srtdeel_key= l_ins_srtdeel_key;


                    -- Insert van persoonsgebonden object.
                    v_errorhint := 'Fout bij toevoegen van nieuw object [' || l_code_notebook_telefoon|| ']';
                    INSERT INTO ins_deel (ins_deel_module, ins_srtdeel_key, ins_alg_ruimte_key, ins_alg_ruimte_type, ins_deel_omschrijving)
                    VALUES ('INS', l_ins_srtdeel_key, v_prs_perslid_key, 'P', l_code_notebook_telefoon);

                    v_errorhint := 'Object is toegevoegd';
                    fac.imp_writelog (p_import_key,
                    'I',
                     v_aanduiding || 'Objectnaam ' || l_code_notebook_telefoon || ' is toegevoegd',
                     v_errorhint
                    );

                    SELECT MAX(ins_deel_key) INTO l_ins_deel_key FROM ins_deel;

                    IF  l_ins_srtdeel_key = c_ins_srtdeel_key_notebook
                    THEN
                        -- Ik ben een notebook, vul de kenmerken

                        v_errorhint := 'Fout bij toevoegen kenmerk bestelnummer [' ||  v_bes_bestelling_key  ||  '] bij object [' || l_code_notebook_telefoon || ']';
                        INSERT INTO ins_kenmerkdeel (ins_deel_key, ins_kenmerk_key, ins_kenmerkdeel_waarde)
                        SELECT l_ins_deel_key, c_notebook_bestelling_key, v_bes_bestelling_key FROM DUAL;

                        v_errorhint := 'Fout bij toevoegen kenmerk artikelnummer [' ||  rec_cyod.bes_srtdeel_nr  ||  '] bij object [' || l_code_notebook_telefoon || ']';
                        INSERT INTO ins_kenmerkdeel (ins_deel_key, ins_kenmerk_key, ins_kenmerkdeel_waarde)
                        SELECT l_ins_deel_key, c_notebook_artikel_key, rec_cyod.bes_srtdeel_nr FROM DUAL;

                        v_errorhint := 'Fout bij toevoegen kenmerk serienummer [' ||  rec_cyod.serienummer  ||  '] bij object [' || l_code_notebook_telefoon || ']';
                        INSERT INTO ins_kenmerkdeel (ins_deel_key, ins_kenmerk_key, ins_kenmerkdeel_waarde)
                        SELECT l_ins_deel_key, c_notebook_serienr_key, rec_cyod.serienummer FROM DUAL;

                        v_errorhint := 'Fout bij toevoegen kenmerk aanschafdatum [' ||  rec_cyod.datum  ||  '] bij object [' || l_code_notebook_telefoon || ']';
                        INSERT INTO ins_kenmerkdeel (ins_deel_key, ins_kenmerk_key, ins_kenmerkdeel_waarde)
                        SELECT l_ins_deel_key, c_notebook_datum_key, TO_CHAR(TO_DATE(rec_cyod.datum,'YYYYMMDD'),'DD-MM-YYYY') FROM DUAL;

                    ELSE
                        IF  l_ins_srtdeel_key = c_ins_srtdeel_key_telefoon
                        THEN
                            -- Ik ben een telefoon, vul de kenmerken

                            v_errorhint := 'Fout bij toevoegen kenmerk bestelnummer [' ||  v_bes_bestelling_key  ||  '] bij object [' || l_code_notebook_telefoon || ']';
                            INSERT INTO ins_kenmerkdeel (ins_deel_key, ins_kenmerk_key, ins_kenmerkdeel_waarde)
                            SELECT l_ins_deel_key, c_mobiel_bestelling_key, v_bes_bestelling_key FROM DUAL;

                            v_errorhint := 'Fout bij toevoegen kenmerk artikelnummer [' ||  rec_cyod.bes_srtdeel_nr  ||  '] bij object [' || l_code_notebook_telefoon || ']';
                            INSERT INTO ins_kenmerkdeel (ins_deel_key, ins_kenmerk_key, ins_kenmerkdeel_waarde)
                            SELECT l_ins_deel_key, c_mobiel_artikel_key, rec_cyod.bes_srtdeel_nr FROM DUAL;

                            v_errorhint := 'Fout bij toevoegen kenmerk serienummer [' ||  rec_cyod.serienummer  ||  '] bij object [' || l_code_notebook_telefoon || ']';
                            INSERT INTO ins_kenmerkdeel (ins_deel_key, ins_kenmerk_key, ins_kenmerkdeel_waarde)
                            SELECT l_ins_deel_key, c_mobiel_serienr_key, rec_cyod.serienummer FROM DUAL;

                            v_errorhint := 'Fout bij toevoegen kenmerk aanschafdatum [' ||  rec_cyod.datum  ||  '] bij object [' || l_code_notebook_telefoon || ']';
                            INSERT INTO ins_kenmerkdeel (ins_deel_key, ins_kenmerk_key, ins_kenmerkdeel_waarde)
                            SELECT l_ins_deel_key, c_mobiel_datum_key, TO_CHAR(TO_DATE(rec_cyod.datum,'YYYYMMDD'),'DD-MM-YYYY') FROM DUAL;
                        END IF;
                    END IF;



                ELSE
                    -- Persoon heeft het object met dat serienummer al en zou een dubbel voorkomen gaan worden --> DUS NIET TOEVOEGEN
                    v_count_error := v_count_error + 1;
                    v_errorhint := 'Fout bij toevoegen van object';
                    fac.imp_writelog (p_import_key,
                    'W',
                     v_aanduiding || 'Object met serienummers is al bij persoon geregistreerd: object wordt niet toegevoegd',
                     v_errorhint
                    );
                END IF;
            ELSE
                -- Type/Soort is geen N en geen T, dus onbekend
                    v_count_error := v_count_error + 1;
                    fac.imp_writelog (p_import_key,
                    'W',
                     v_aanduiding || 'Soort object is onbekend: moet N(otebook) of T(elefoon) zijn',
                     v_errorhint
                    );
            END IF;

            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',
                       'CYOD Serienummers: verwerkte regels zonder foutmelding: '
                    || TO_CHAR (v_count_tot - v_count_error),
                    ''
                   );
    fac.imp_writelog (p_import_key,
                    'S',
                       'CYOD Serienummers: verwerkte regels met foutmelding: '
                    || TO_CHAR (v_count_error),
                    ''
                   );
    COMMIT;



END alli_update_cyod_serienummers;
/


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--
-- Koppeling Bouwborden
--
-- Leverancier: Bas Honcoop (prs_bedrijf_key = 936)
-- Catalogus: Bouwborden (discipline = 521)
-- OCI Punchout: http://bh.enson.nl/oci.alliantie.php?username=alliantie&password=[REDACTED]
-- Financiele goedkeuring: nvt --> Automatisch accepteren aanvraag = ja
-- Functionele goedkeuring: communicatiemedewerker van project (door projectleider verplicht in te vullen bij bestelaanvraag)
-- Projectnummer: verplicht invulbaar veld door projectleider in te vullen bij bestelaanvraag.



-- Communicatiemedewerkers voor bouwborden ALLI_V_BO_MDW_BOUWBORD_NOW: dit zijn alle BO-medewerkers met BESBOF rechten op bouwborden (dis-key = 521),
-- waarbij de applicatiebeheerders ('WEB_USER01') worden uitgesloten (ook al hebben ze BESBOF op dis-key 521).

-- Verder worden eventuele vroegere communicatiemedewerkers ALLI_V_BO_MDW_BOUWBORD_PAST via vervaldatum (die dat nu niet meer zijn!!) ook geuniond
-- voor behoud van historie bestellingen (anders zijn ze niet zichtbaar in domein). Let op:

CREATE OR REPLACE VIEW ALLI_V_BO_MDW_BOUWBORD_NOW
(PRS_PERSLID_KEY, PRS_PERSLID_FULL)
AS
select DISTINCT p.prs_perslid_key, P.prs_perslid_naam_full
FROM fac_groeprechten gr, fac_gebruikersgroep gg, prs_v_perslid_fullnames p
WHERE gr.ins_discipline_key = 521
AND GR.FAC_FUNCTIE_KEY = (SELECT fac_functie_key FROM fac_functie f WHERE f.fac_functie_code = 'WEB_BESBOF')
AND NOT EXISTS (
SELECT * FROM  fac_groeprechten gr1, fac_gebruikersgroep gg1, prs_v_perslid_fullnames p1
 WHERE GR1.FAC_FUNCTIE_KEY = (SELECT fac_functie_key FROM fac_functie f1 WHERE f1.fac_functie_code = 'WEB_USER01')
 AND gr1.fac_gebruiker_alg_level_write < 9
 AND gr1.fac_gebruiker_prs_level_write < 9
 AND gr1.fac_groep_key = gg1.fac_groep_key
 AND gg1.prs_perslid_key = p1.prs_perslid_key
 AND  p1.prs_perslid_key = p.prs_perslid_key)
AND gr.fac_gebruiker_alg_level_write < 9
AND gr.fac_gebruiker_prs_level_write < 9
AND gr.fac_groep_key = gg.fac_groep_key
AND gg.prs_perslid_key = p.prs_perslid_key;

CREATE OR REPLACE VIEW ALLI_V_BO_MDW_BOUWBORD_PAST
(PRS_PERSLID_KEY, PRS_PERSLID_FULL)
AS
SELECT DISTINCT p.prs_perslid_key, p.prs_perslid_naam_full
FROM bes_kenmerk k, bes_kenmerkbestell kb,  prs_v_perslid_fullnames p
WHERE k.bes_srtkenmerk_key = 361
AND k.bes_srtinstallatie_key = 521
AND k.bes_kenmerk_niveau='D'
AND k.bes_kenmerk_type='B'
AND k.bes_kenmerk_key = kb.bes_kenmerk_key
AND fac.safe_to_number(kb.bes_kenmerkbestell_waarde) = p.prs_perslid_key
MINUS
SELECT DISTINCT prs_perslid_key, PRS_PERSLID_FULL FROM ALLI_V_BO_MDW_BOUWBORD_NOW;

CREATE OR REPLACE VIEW ALLI_V_BO_MEDEWERKERS_BOUWBORD
(PRS_PERSLID_KEY, PRS_PERSLID_FULL, PRS_PERSLID_ACTIVE)
AS
SELECT PRS_PERSLID_KEY, PRS_PERSLID_FULL, NULL FROM ALLI_V_BO_MDW_BOUWBORD_NOW
UNION
SELECT PRS_PERSLID_KEY, PRS_PERSLID_FULL, TRUNC(SYSDATE - 1) FROM ALLI_V_BO_MDW_BOUWBORD_PAST;
--------------------------------------------------------------------------------------------------------------------------


-- Notificatiejob met key 41 is via alli09.sql aangemaakt.
CREATE OR REPLACE VIEW ALLI_V_NOTIFY_BO_BOUWBORD (code, sender, receiver, text, KEY, par1, par2, xkey)
AS
SELECT sn.fac_srtnotificatie_code, b.prs_perslid_key, fac.safe_to_number(kb.bes_kenmerkbestell_waarde),
           sn.fac_srtnotificatie_oms, b.bes_bestelling_key, NULL, NULL, NULL
FROM bes_bestelling b, bes_kenmerkbestell kb, bes_kenmerk k, bes_srtkenmerk sk, fac_kenmerkdomein kd, fac_notificatie_job nj, fac_srtnotificatie sn
WHERE sn.fac_srtnotificatie_code = 'CUST01'
AND nj.fac_notificatie_job_key = 41
AND b.bes_bestelling_key = kb.bes_bestelling_key
and b.bes_bestelling_status = 3
and KB.BES_KENMERK_KEY = k.bes_kenmerk_key
and K.BES_SRTKENMERK_KEY = SK.BES_SRTKENMERK_KEY
and SK.FAC_KENMERKDOMEIN_KEY= KD.FAC_KENMERKDOMEIN_KEY
and UPPER(KD.FAC_KENMERKDOMEIN_MODULE) = 'BES'
and UPPER(KD.FAC_KENMERKDOMEIN_OBJECTNAAM) = 'ALLI_V_BO_MEDEWERKERS_BOUWBORD';


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-- basisoverzicht van reserveringen + gekoppelde objecten (alle objecten).

/* Formatted on 2/10/2025 12:22:37 (QP5 v5.336) */
CREATE OR REPLACE FORCE VIEW ALLI_V_OBJECTRESER
(
    RESERVERING_KEY,
    RRR_KEY,
    RES_RUIMTE_KEY,
    RES_ACTIVITEIT_KEY,
    DATUM_VAN,
    DATUM_TOT,
    TIJD_VAN,
    TIJD_TOT,
    LOCATIE_CODE,
    RUIMTE_NR,
    OBJECTEN,
    AANMK_DATUM,
    LAST_UPD,
    VERW_DATUM,
    CODE,
    KEY,
    XKEY,
    XEMAIL
)
BEQUEATH DEFINER
AS
    WITH
        obj
        AS
            (  SELECT rrd.res_rsv_ruimte_key                                 AS rrr_key,
                      LISTAGG (d.res_deel_omschrijving, ', ')
                          WITHIN GROUP (ORDER BY d.res_deel_omschrijving)    AS objecten
                 FROM res_rsv_deel rrd
                      JOIN res_deel d ON d.res_deel_key = rrd.res_deel_key
             GROUP BY rrd.res_rsv_ruimte_key)
    SELECT rrr.res_reservering_key
               AS reservering_key,
           rrr.res_rsv_ruimte_key
               AS rrr_key,
           rer.res_ruimte_key
               AS res_ruimte_key,
           rrr.res_activiteit_key
               AS res_activiteit_key,
           TO_CHAR (rrr.res_rsv_ruimte_van, 'dd-mm-yyyy')
               AS datum_van,
           TO_CHAR (rrr.res_rsv_ruimte_tot, 'dd-mm-yyyy')
               AS datum_tot,
           TO_CHAR (rrr.res_rsv_ruimte_van, 'HH24:MI')
               AS tijd_van,
           TO_CHAR (rrr.res_rsv_ruimte_tot, 'HH24:MI')
               AS tijd_tot,
           alg.alg_locatie_code
               AS locatie_code,
           COALESCE (rer.res_ruimte_friendlyname, alg.alg_ruimte_nr)
               AS ruimte_nr,
           NVL (o.objecten, 'object')
               AS objecten,
           rrr.res_rsv_ruimte_aanmaak
               AS aanmk_datum,
           (SELECT MAX (f.fac_tracking_datum)
              FROM fac_tracking f
             WHERE     f.fac_tracking_refkey = rrr.res_rsv_ruimte_key
                   AND f.fac_srtnotificatie_key = 117)
               AS last_upd,
           rrr.res_rsv_ruimte_verwijder
               AS verw_datum,
           'CUST02'
               AS code,
           rrr.res_reservering_key
               AS key,
           rrr.res_rsv_ruimte_key
               AS xkey,
           'localsupport@de-alliantie.nl'
               AS xemail
      FROM res_rsv_ruimte  rrr
           LEFT JOIN res_ruimte_opstelling rop
               ON rop.res_ruimte_opstel_key = rrr.res_ruimte_opstel_key
           LEFT JOIN res_ruimte rer
               ON rer.res_ruimte_key = rop.res_ruimte_key
           LEFT JOIN alg_v_ruimte_gegevens_all alg
               ON alg.alg_ruimte_key = rrr.alg_ruimte_key
           LEFT JOIN obj o ON o.rrr_key = rrr.res_rsv_ruimte_key
     WHERE EXISTS
               (SELECT 1
                  FROM res_rsv_deel rrd
                 WHERE rrd.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key);


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- subset van ALLI_V_OBJECTRESER specifiek voor AV-middelen (microfoon, verrijdbaar scherm).

/* Formatted on 2/10/2025 12:25:09 (QP5 v5.336) */
CREATE OR REPLACE FORCE VIEW ALLI_V_OBJECTRESER_AVSRT
(
    RESERVERING_KEY,
    RRR_KEY,
    RES_RUIMTE_KEY,
    RES_ACTIVITEIT_KEY,
    DATUM_VAN,
    DATUM_TOT,
    TIJD_VAN,
    TIJD_TOT,
    LOCATIE_CODE,
    RUIMTE_NR,
    OBJECTEN,
    AANMK_DATUM,
    LAST_UPD,
    VERW_DATUM,
    CODE,
    KEY,
    XKEY,
    XEMAIL
)
BEQUEATH DEFINER
AS
    WITH
        obj
        AS
            (  SELECT rrd.res_rsv_ruimte_key                                 AS rrr_key,
                      LISTAGG (d.res_deel_omschrijving, ', ')
                          WITHIN GROUP (ORDER BY d.res_deel_omschrijving)    AS objecten
                 FROM res_rsv_deel rrd
                      JOIN res_deel d ON d.res_deel_key = rrd.res_deel_key
                WHERE    UPPER (d.res_deel_omschrijving) LIKE 'MICRO%'
                      OR REGEXP_LIKE (UPPER (d.res_deel_omschrijving),
                                      'VERRIJDBAAR.*SCHERM')
             GROUP BY rrd.res_rsv_ruimte_key)
    SELECT rrr.res_reservering_key,
           rrr.res_rsv_ruimte_key,
           rer.res_ruimte_key,
           rrr.res_activiteit_key,
           TO_CHAR (rrr.res_rsv_ruimte_van, 'dd-mm-yyyy')
               AS datum_van,
           TO_CHAR (rrr.res_rsv_ruimte_tot, 'dd-mm-yyyy')
               AS datum_tot,
           TO_CHAR (rrr.res_rsv_ruimte_van, 'HH24:MI')
               AS tijd_van,
           TO_CHAR (rrr.res_rsv_ruimte_tot, 'HH24:MI')
               AS tijd_tot,
           alg.alg_locatie_code,
           COALESCE (rer.res_ruimte_friendlyname, alg.alg_ruimte_nr)
               AS ruimte_nr,
           NVL (o.objecten, 'object')
               AS objecten,
           rrr.res_rsv_ruimte_aanmaak
               AS aanmk_datum,
           (SELECT MAX (f.fac_tracking_datum)
              FROM fac_tracking f
             WHERE     f.fac_tracking_refkey = rrr.res_rsv_ruimte_key
                   AND f.fac_srtnotificatie_key = 117)
               AS last_upd,
           rrr.res_rsv_ruimte_verwijder
               AS verw_datum,
           'CUST02'
               AS code,
           rrr.res_reservering_key
               AS key,
           rrr.res_rsv_ruimte_key
               AS xkey,
           'localsupport@de-alliantie.nl'
               AS xemail
      FROM res_rsv_ruimte  rrr
           LEFT JOIN res_ruimte_opstelling rop
               ON rop.res_ruimte_opstel_key = rrr.res_ruimte_opstel_key
           LEFT JOIN res_ruimte rer
               ON rer.res_ruimte_key = rop.res_ruimte_key
           LEFT JOIN alg_v_ruimte_gegevens_all alg
               ON alg.alg_ruimte_key = rrr.alg_ruimte_key
           LEFT JOIN obj o ON o.rrr_key = rrr.res_rsv_ruimte_key
     WHERE EXISTS
               (SELECT 1
                  FROM res_rsv_deel  rrd
                       JOIN res_deel d ON d.res_deel_key = rrd.res_deel_key
                 WHERE     rrd.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
                       AND (   UPPER (d.res_deel_omschrijving) LIKE 'MICRO%'
                            OR REGEXP_LIKE (UPPER (d.res_deel_omschrijving),
                                            'VERRIJDBAAR.*SCHERM')));
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- tweede laag bovenop ALLI_V_OBJECTRESER_AVSRT. Bepaalt welke reserveringen nu gemaild moeten worden, afhankelijk van nieuw / gewijzigd / geannuleerd.

/* Formatted on 2/10/2025 12:26:24 (QP5 v5.336) */
CREATE OR REPLACE FORCE VIEW ALLI_V_NOTI_AVSRT
(
    SENDER,
    RECEIVER,
    TEXT,
    CODE,
    KEY,
    XKEY,
    XEMAIL,
    XMOBILE
)
BEQUEATH DEFINER
AS
    SELECT NULL                 AS sender,
           NULL                 AS receiver,
              'Er is een nieuwe AV-reservering voor '
           || TO_CHAR (v.datum_van, 'dd-mm-yyyy')
           || ' (reservering '
           || v.reservering_key
           || '), ruimte '
           || v.ruimte_nr
           || ' met object(en): '
           || v.objecten        AS text,
           v.code,
           v.reservering_key    AS key,
           v.rrr_key            AS xkey,
           v.xemail,
           NULL                 AS xmobile
      FROM ALLI_V_OBJECTRESER_AVSRT v, fac_notificatie_job nj
     WHERE     nj.fac_notificatie_job_view = 'ALLI_V_NOTI_AVSRT'
           AND (   nj.fac_notificatie_job_lastrun IS NULL
                OR v.aanmk_datum > nj.fac_notificatie_job_lastrun)
           AND v.last_upd IS NULL
           AND v.verw_datum IS NULL
    UNION ALL
    /* === Gewijzigde reservering === */
    SELECT NULL                 AS sender,
           NULL                 AS receiver,
              'Er is een gewijzigde AV-reservering voor '
           || TO_CHAR (v.datum_van, 'dd-mm-yyyy')
           || ' (reservering '
           || v.reservering_key
           || '), ruimte '
           || v.ruimte_nr
           || ' met object(en): '
           || v.objecten        AS text,
           v.code,
           v.reservering_key    AS key,
           v.rrr_key            AS xkey,
           v.xemail,
           NULL                 AS xmobile
      FROM ALLI_V_OBJECTRESER_AVSRT v, fac_notificatie_job nj
     WHERE     nj.fac_notificatie_job_view = 'ALLI_V_NOTI_AVSRT'
           AND (   nj.fac_notificatie_job_lastrun IS NULL
                OR v.last_upd > nj.fac_notificatie_job_lastrun)
           AND v.last_upd > v.aanmk_datum
           AND v.verw_datum IS NULL
    UNION ALL
    /* === Geannuleerde reservering === */
    SELECT NULL                 AS sender,
           NULL                 AS receiver,
              'Er is een annulering van een AV-reservering op '
           || TO_CHAR (v.datum_van, 'dd-mm-yyyy')
           || ' (reservering '
           || v.reservering_key
           || '), ruimte '
           || v.ruimte_nr
           || ' met object(en): '
           || v.objecten        AS text,
           v.code,
           v.reservering_key    AS key,
           v.rrr_key            AS xkey,
           v.xemail,
           NULL                 AS xmobile
      FROM ALLI_V_OBJECTRESER_AVSRT v, fac_notificatie_job nj
     WHERE     nj.fac_notificatie_job_view = 'ALLI_V_NOTI_AVSRT'
           AND (   v.verw_datum > nj.fac_notificatie_job_lastrun
                OR nj.fac_notificatie_job_lastrun IS NULL)
           AND v.verw_datum IS NOT NULL;


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-- View tbv notificatiejob contract-reminder (afgeleid van de FAC-standaard).
-- 1x per week wordt de job aangeroepen, verschil met de standaard FAC is dat niet alleen de beheerder (voor de UNION),
-- maar ook andere personen een mailt-notificatie moeten kunnen ontvangen (na UNION).
-- Deze personen worden in eigen tabel "$SYSTEM" (key = 61) met als waarde-code "CNT_NOTI_REMINDER..." geregistreerd.
-- In de waarde-kolom staan de prs_perslid_key van de persoon die (ook) een notificatie moet ontvangen.

CREATE OR REPLACE VIEW alli_v_noti_cntreminder
(code, sender, receiver, text, key, par1, par2, xkey)
AS
    SELECT '', '', c.prs_perslid_key_beh,
             'Rapp�l: 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.',
          c.cnt_contract_key, c.cnt_contract_nummer_intern, cnt.cnt_getopzegdatum (c.cnt_contract_key), NULL
        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 /* actief */
        AND (SYSDATE BETWEEN cnt.cnt_getrappeldatum (c.cnt_contract_key) AND cnt.cnt_getopzegdatum (c.cnt_contract_key))
    UNION
    SELECT '', '', fac.safe_to_number(fac_usrdata_omschr),
             'Rapp�l: 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.',
          c.cnt_contract_key, c.cnt_contract_nummer_intern, cnt.cnt_getopzegdatum (c.cnt_contract_key), NULL
        FROM cnt_v_aanwezigcontract c, prs_bedrijf b, fac_usrdata ud
        WHERE b.prs_bedrijf_key = c.cnt_prs_bedrijf_key
        AND cnt_contract_verwijder IS NULL
        AND cnt_contract_status = 0 /* actief */
        AND (SYSDATE BETWEEN cnt.cnt_getrappeldatum (c.cnt_contract_key) AND cnt.cnt_getopzegdatum (c.cnt_contract_key))
        AND fac_usrtab_key = 61
        AND fac_usrdata_code like 'CNT_NOTI_REMINDER%'
        AND fac_usrdata_verwijder IS NULL;


----------------------------------------------------------------------------------------------------------------------------------------------------------
--- RTM Grafieken op portaal

-- Alle bestelaanvragen per catalogus, per week.
CREATE OR REPLACE VIEW alli_v_bes_catalogus_p_week
(INS_DISCIPLINE_KEY, INS_DISCIPLINE_OMSCHRIJVING, jaar, week, aantal)
AS
select D.INS_DISCIPLINE_KEY, MIN(D.INS_DISCIPLINE_OMSCHRIJVING), to_char(bes_bestelling_datum, 'IYYY'), to_char(bes_bestelling_datum, 'IW'), count(b.bes_bestelling_key)
from bes_bestelling b, bes_bestelling_item bi, bes_srtdeel s, bes_srtgroep g, bes_discipline d
where BI.BES_BESTELLING_KEY = b.bes_bestelling_key
and BI.BES_SRTDEEL_KEY = s.bes_srtdeel_key
and s.bes_srtgroep_key = G.BES_SRTGROEP_KEY
and G.INS_DISCIPLINE_KEY = D.INS_DISCIPLINE_KEY
and TRUNC( b.bes_bestelling_datum) >=  (TRUNC (SYSDATE)
                                         - DECODE (TO_CHAR (SYSDATE, 'D'), '1', 8, TO_CHAR (SYSDATE, 'D'))
                                         + 2) - 10*7
group by D.INS_DISCIPLINE_KEY, to_char(bes_bestelling_datum, 'IYYY'), to_char(bes_bestelling_datum, 'IW');


-- View van de afgelopen 10 weken, met deze week erbij is dat 11.
CREATE OR REPLACE VIEW alli_v_10_week_history
(jaar, week)
AS
SELECT to_char(TRUNC(SYSDATE - (7* (LEVEL - 1))),'IYYY') jaar, substr(to_char(SYSDATE - (7* (LEVEL - 1)), 'IW'), 1, 2) week
FROM  DUAL
CONNECT BY LEVEL <= 11;

CREATE OR REPLACE VIEW alli_v_10_week_future
(jaar, week)
AS
SELECT to_char(TRUNC(SYSDATE + (7* (LEVEL - 1))),'IYYY') jaar, substr(to_char(SYSDATE + (7* (LEVEL - 1)), 'IW'), 1, 2) week
FROM  DUAL
CONNECT BY LEVEL <= 11;

-- Kantoorartikelen per week
CREATE OR REPLACE VIEW alli_v_graph_cat_kantoor
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_KANTOOR,
   FCLT_YAS_INCIDENTEEL,
   FCLT_URL,
   VOLGORDE
)
AS
SELECT '', week,
            COALESCE(
                (SELECT aantal
                FROM alli_v_bes_catalogus_p_week c
                WHERE INS_DISCIPLINE_KEY = 501
                AND c.week = w10.week
                AND c.jaar = w10.jaar),
             0),
           COALESCE(
                (SELECT aantal
                FROM alli_v_bes_catalogus_p_week c
                WHERE INS_DISCIPLINE_KEY = 42
                AND c.week = w10.week
                AND c.jaar = w10.jaar),
             0),
              '',
            jaar|| '-' ||week
FROM alli_v_10_week_history w10;


-- Bouwborden per week
CREATE OR REPLACE VIEW alli_v_graph_cat_bouwbord
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_BOUWBORD,
   FCLT_URL,
   VOLGORDE
)
AS
SELECT '', week,
            COALESCE(
                (SELECT aantal
                FROM alli_v_bes_catalogus_p_week c
                WHERE INS_DISCIPLINE_KEY = 521
                AND c.week = w10.week
                AND c.jaar = w10.jaar),
             0),
             '',
            jaar|| '-' ||week
FROM alli_v_10_week_history w10;

-- Drukwerk per week
CREATE OR REPLACE VIEW alli_v_graph_cat_drukwerk
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_HUISSTIJL,
   FCLT_YAS_VISITEKAARTJES,
   FCLT_YAS_VVE,
   FCLT_YAS_SSC,
   FCLT_YAS_OVERIG,
   FCLT_URL,
   VOLGORDE
)
AS
SELECT '', week,
            COALESCE(
                (SELECT aantal
                FROM alli_v_bes_catalogus_p_week c
                WHERE INS_DISCIPLINE_KEY = 341
                AND c.week = w10.week
                AND c.jaar = w10.jaar),
             0),
             COALESCE(
                (SELECT aantal
                FROM alli_v_bes_catalogus_p_week c
                WHERE INS_DISCIPLINE_KEY = 361
                AND c.week = w10.week
                AND c.jaar = w10.jaar),
             0),
             COALESCE(
                (SELECT SUM(aantal)
                FROM alli_v_bes_catalogus_p_week c
                WHERE INS_DISCIPLINE_KEY IN (442, 443, 444, 445)
                AND c.week = w10.week
                AND c.jaar = w10.jaar),
             0),
             COALESCE(
                (SELECT SUM(aantal)
                FROM alli_v_bes_catalogus_p_week c
                WHERE INS_DISCIPLINE_KEY IN (446, 447)
                AND c.week = w10.week
                AND c.jaar = w10.jaar),
             0),
             COALESCE(
                (SELECT SUM(aantal)
                FROM alli_v_bes_catalogus_p_week c
                WHERE INS_DISCIPLINE_KEY IN (448, 449, 463, 441)
                AND c.week = w10.week
                AND c.jaar = w10.jaar),
             0),
             '',
            jaar|| '-' ||week
FROM alli_v_10_week_history w10;


-- ICT (hardware en CYOD) per week
CREATE OR REPLACE VIEW alli_v_graph_cat_ict
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_HARDWARE,
   FCLT_YAS_INCIDENTEEL,
   FCLT_YAS_CYOD,
   FCLT_URL,
   VOLGORDE
)
AS
SELECT '', week,
            COALESCE(
                (SELECT aantal
                FROM alli_v_bes_catalogus_p_week c
                WHERE INS_DISCIPLINE_KEY = 401
                AND c.week = w10.week
                AND c.jaar = w10.jaar),
             0),
             COALESCE(
                (SELECT aantal
                FROM alli_v_bes_catalogus_p_week c
                WHERE INS_DISCIPLINE_KEY = 201
                AND c.week = w10.week
                AND c.jaar = w10.jaar),
             0),
             COALESCE(
                (SELECT aantal
                FROM alli_v_bes_catalogus_p_week c
                WHERE INS_DISCIPLINE_KEY = 221
                AND c.week = w10.week
                AND c.jaar = w10.jaar),
             0),
             '',
            jaar|| '-' ||week
FROM alli_v_10_week_history w10;



-- Alle nieuwe contracten die ingaan de komende 10 weken per week.
CREATE OR REPLACE VIEW alli_v_cnt_nieuw_per_week
(jaar, week, aantal)
AS
select to_char(c.cnt_contract_looptijd_van, 'IYYY'), to_char(c.cnt_contract_looptijd_van, 'IW'), count(c.cnt_contract_key)
from cnt_contract c
WHERE TRUNC(c.cnt_contract_looptijd_van) >=  (TRUNC (SYSDATE) - DECODE (TO_CHAR (SYSDATE, 'D'), '1', 8, TO_CHAR (SYSDATE, 'D')) + 2)
AND   TRUNC(c.cnt_contract_looptijd_van) <=  (TRUNC (SYSDATE) - DECODE (TO_CHAR (SYSDATE, 'D'), '1', 8, TO_CHAR (SYSDATE, 'D')) + 2) + 10*7
GROUP BY to_char(c.cnt_contract_looptijd_van, 'IYYY'), to_char(c.cnt_contract_looptijd_van, 'IW');


-- Alle aflopende contracten de komende 10 weken per week.
CREATE OR REPLACE VIEW alli_v_cnt_aflopend_per_week
(jaar, week, aantal)
AS
select to_char(c.cnt_contract_looptijd_tot, 'IYYY'), to_char(c.cnt_contract_looptijd_tot, 'IW'), count(c.cnt_contract_key)
from cnt_contract c
WHERE TRUNC(c.cnt_contract_looptijd_tot) >=  (TRUNC (SYSDATE) - DECODE (TO_CHAR (SYSDATE, 'D'), '1', 8, TO_CHAR (SYSDATE, 'D')) + 2)
AND   TRUNC(c.cnt_contract_looptijd_tot) <=  (TRUNC (SYSDATE) - DECODE (TO_CHAR (SYSDATE, 'D'), '1', 8, TO_CHAR (SYSDATE, 'D')) + 2) + 10*7
GROUP BY to_char(c.cnt_contract_looptijd_tot, 'IYYY'), to_char(c.cnt_contract_looptijd_tot, 'IW');


-- Grafiek van alle aflopende contracten voor de komende 10 weken
CREATE OR REPLACE VIEW alli_v_graph_cnt_new_close
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_NIEUW,
   FCLT_YAS_AFLOPEND,
   FCLT_URL,
   VOLGORDE
)
AS
SELECT '', week,
            COALESCE(
                (SELECT aantal
                FROM alli_v_cnt_nieuw_per_week c
                WHERE c.week = w10.week
                AND c.jaar = w10.jaar),
             0),
             COALESCE(
                (SELECT aantal
                FROM alli_v_cnt_aflopend_per_week c
                WHERE c.week = w10.week
                AND c.jaar = w10.jaar),
             0),
             '',
            jaar|| '-' ||week
FROM alli_v_10_week_future w10;









CREATE OR REPLACE VIEW alli_v_visitekaartje (prs_perslid_key,
                                             voornaam,
                                             naam,
                                             functie,
                                             bedrijfsonderdeel,
                                             gebouwcode,
                                             adres,
                                             postcode,
                                             plaats,
                                             postadres,
                                             postpostcode,
                                             postplaats,
                                             telefoon1,
                                             telefoon2,
                                             mobiel1,
                                             mobiel2,
                                             email
                                            )
AS
   SELECT p.prs_perslid_key,
          p.prs_perslid_voornaam,
          DECODE (COALESCE (p.prs_perslid_tussenvoegsel, ''),
                     '', '',
                     p.prs_perslid_tussenvoegsel || ' ')
          || prs_perslid_naam naam,
          prs_srtperslid_omschrijving functie,
          ( SELECT fac_usrdata_omschr
            FROM prs_kenmerklink, fac_usrdata ud
            WHERE fac_usrtab_key=121
            AND ud.fac_usrdata_key = fac.safe_to_number(prs_kenmerklink_waarde)
            AND prs_link_key = p.prs_perslid_key
            AND prs_kenmerklink_niveau = 'P'
            AND prs_kenmerk_key = 1060
            AND prs_kenmerklink_verwijder IS NULL
           ) bedrijfsonderdeel,
          pgl.alg_gebouw_code,
          l.alg_locatie_adres adres,
          l.alg_locatie_postcode postcode,
          l.alg_locatie_plaats plaats,
          l.alg_locatie_post_adres postadres,
          l.alg_locatie_post_postcode postpostcode,
          l.alg_locatie_post_plaats postplaats,
          TRIM( DECODE (SUBSTR (p.prs_perslid_telefoonnr, 1, 1),
                        '(', SUBSTR (p.prs_perslid_telefoonnr, 2,
                                     INSTR (p.prs_perslid_telefoonnr, ')') - 2),
                        SUBSTR (p.prs_perslid_telefoonnr, 1,
                                INSTR (p.prs_perslid_telefoonnr, '-') - 1)
                       )
              )
             telefoon1,
          TRIM( DECODE (SUBSTR (p.prs_perslid_telefoonnr, 1, 1),
                        '(', SUBSTR (p.prs_perslid_telefoonnr,
                                     INSTR (p.prs_perslid_telefoonnr, ')') + 1),
                        SUBSTR (p.prs_perslid_telefoonnr,
                                INSTR (p.prs_perslid_telefoonnr, '-') + 1)
                       )
              )
             telefoon2,
          TRIM( DECODE (SUBSTR (p.prs_perslid_mobiel, 1, 1),
                        '(', SUBSTR (p.prs_perslid_mobiel, 2,
                                     INSTR (p.prs_perslid_mobiel, ')') - 2),
                        SUBSTR (p.prs_perslid_mobiel, 1,
                                INSTR (p.prs_perslid_mobiel, '-') - 1)
                       )
              )
             mobiel1,
          TRIM( DECODE (SUBSTR (p.prs_perslid_mobiel, 1, 1),
                        '(', SUBSTR (p.prs_perslid_mobiel,
                                     INSTR (p.prs_perslid_mobiel, ')') + 1),
                        SUBSTR (p.prs_perslid_mobiel,
                                INSTR (p.prs_perslid_mobiel, '-') + 1)
                       )
              )
             mobiel2,
          p.prs_perslid_email email
     FROM prs_perslid p,
          prs_srtperslid sp,
          alg_locatie l,
          (SELECT alg_locatie_key,
                  g.alg_gebouw_key,
                  g.alg_gebouw_code,
                  prs_perslid_key
             FROM (SELECT prs_perslid_key,
                          (SELECT MAX (alg_ruimte_key)
                             FROM prs_v_perslidwerkplek_gegevens pwg
                            WHERE pwg.prs_perslid_key = pb.prs_perslid_key
                                  AND pwg.prs_perslidwerkplek_bezetting =
                                        pb.prs_perslidwerkplek_bezetting)
                             alg_ruimte_key
                     FROM (  SELECT prs_perslid_key,
                                    MAX (prs_perslidwerkplek_bezetting)
                                       prs_perslidwerkplek_bezetting
                               FROM prs_perslidwerkplek pw, prs_werkplek wp
                              WHERE pw.prs_werkplek_key = wp.prs_werkplek_key
                                    AND wp.prs_werkplek_virtueel = 0
                           GROUP BY prs_perslid_key) pb) pr,
                  alg_gebouw g,
                  alg_verdieping v,
                  alg_ruimte r
            WHERE     pr.alg_ruimte_key = r.alg_ruimte_key
                  AND r.alg_verdieping_key = v.alg_verdieping_key
                  AND v.alg_gebouw_key = g.alg_gebouw_key) pgl
    WHERE p.prs_srtperslid_key = sp.prs_srtperslid_key
          AND p.prs_perslid_key = pgl.prs_perslid_key(+)
          AND pgl.alg_locatie_key = l.alg_locatie_key(+);


CREATE OR REPLACE VIEW alli_v_bestelling_maninfo
    (fclt_f_aanvraagnr,
    fclt_x_jaar,
    fclt_x_kwartaal,
    fclt_x_maand,
    besteldatum,
    [REDACTED],
    fclt_f_catalogus,
    fclt_f_leverancier,
    fclt_f_aanvrager,
    personeelsnr,
    fclt_f_afdeling,
    fclt_f_status,
    bestelbedrag,
    opdrachtbedrag
    )
AS  SELECT TO_CHAR(b.bes_bestelling_key),
         TO_CHAR(MIN(bes_bestelling_datum), 'YYYY') jaar,
         'Kwartaal ' || TO_CHAR(MIN(bes_bestelling_datum), 'Q') kwartaal,
         TO_CHAR(MIN(bes_bestelling_datum), 'MM') maand,
         TO_CHAR(MIN(bes_bestelling_datum), 'DD-MM-YYYY') datum,
         MIN(dis.ins_discipline_key),
         MIN(dis.ins_discipline_omschrijving) catalogus,
         MIN(bd.prs_bedrijf_naam) leverancier,
         MIN(p.prs_perslid_naam)
         || NVL2 (MIN(p.prs_perslid_voorletters),
                  ', ' || MIN(p.prs_perslid_voorletters),
                  '')
         || NVL2 (MIN(p.prs_perslid_tussenvoegsel),
                  ' ' || MIN(p.prs_perslid_tussenvoegsel),
                  '')
         || NVL2 (MIN(p.prs_perslid_voornaam),
                  ' (' || MIN(p.prs_perslid_voornaam) || ')',
                  '')
            aanvrager,
            MIN(P.PRS_PERSLID_NR),
         MIN(d.prs_afdeling_naam) organisation,
         MIN(BS.BES_BESTELLINGSTATUSES_OMSCHR),
         SUM(bi.bes_bestelling_item_aantal
             * COALESCE (bi.bes_bestelling_item_prijs, 0))
            totaalbedrag,
         SUM(BO.BES_BESTELOPDR_ITEM_AANTAL
             * COALESCE (BO.BES_BESTELOPDR_ITEM_PRIJS , 0))
            opdrachtbedrag
    FROM bes_bestelling_item bi,
         bes_bestelopdr_item bo,
         bes_srtdeel srt,
         prs_bedrijf bd,
         bes_bestelling b,
         bes_bestellingstatuses bs,
         prs_perslid p,
         prs_v_afdeling d,
         mld_adres m,
         prs_v_afdeling_boom boom,
         bes_srtgroep grp,
         ins_tab_discipline dis,
         alg_locatie l,
         alg_district di
   WHERE     srt.bes_srtgroep_key = grp.bes_srtgroep_key
         AND grp.ins_discipline_key = dis.ins_discipline_key
         AND bi.bes_srtdeel_key = srt.bes_srtdeel_key
         AND srt.prs_bedrijf_key = bd.prs_bedrijf_key
         AND BO.BES_BESTELOPDR_ITEM_KEY (+) = BI.BES_BESTELOPDR_ITEM_KEY
         AND bi.bes_bestelling_key = b.bes_bestelling_key
         AND B.BES_BESTELLING_STATUS = BS.BES_BESTELLINGSTATUSES_KEY
         AND p.prs_perslid_key = b.prs_perslid_key
         AND p.prs_afdeling_key = d.prs_afdeling_key
         AND d.prs_afdeling_key = boom.prs_afdeling_key
         AND b.mld_adres_key_lev = m.mld_adres_key
         AND m.alg_locatie_key = l.alg_locatie_key(+)
         AND l.alg_district_key = di.alg_district_key(+)
GROUP BY b.bes_bestelling_key, bd.prs_bedrijf_key;


-- Voor genereren van QR-codes voor meldingen op objecten
CREATE OR REPLACE VIEW alli_v_rap_qrc_ins
(
   [REDACTED],
   [REDACTED],
   fclt_f_locatie,
   fclt_f_gebouw,
   plaats,
   soortruimte,
   ins_srtdeel_code,
   ins_srtdeel_omschrijving,
   ins_deel_omschrijving,
   ins_deel_key,
   ins_srtdeel_key,
   fclt_f_objectsoort,
   fclt_f_bookmark,
   ins_alg_ruimte_type,
   alg_district_key,
   ins_deel_upper,
   alg_ruimte_key,
   hide_f_bookmark_id
)
AS
   SELECT i.ins_discipline_key,
          l.alg_locatie_key,
          l.alg_locatie_omschrijving,
          o.alg_gebouw_omschrijving,
          o.alg_plaatsaanduiding plaats,
          (SELECT r.alg_ruimte_omschrijving
             FROM alg_ruimte r
            WHERE r.alg_ruimte_key = i.ins_alg_ruimte_key)
             soortruimte,
          s.ins_srtdeel_code,
          s.ins_srtdeel_omschrijving,
          i.ins_deel_omschrijving,
          i.ins_deel_key,
          s.ins_srtdeel_key,
          s.ins_srtdeel_omschrijving,
          b.fac_bookmark_naam,
          i.ins_alg_ruimte_type,
          l.alg_district_key,
          ins_deel_omschrijving,
          i.ins_alg_ruimte_key,
          b.fac_bookmark_id
     FROM ins_deel i,
          ins_v_alg_overzicht o,
          ins_srtdeel s,
          ins_srtgroep g,
          alg_locatie l,
          alg_district di,
          fac_bookmark b,
          mld_stdmelding sm,
          mld_stdmelding_srtinst si
    WHERE     b.fac_bookmark_path = 'appl/pda/melding.asp'
          AND b.fac_bookmark_query LIKE '%stdm_key='||sm.mld_stdmelding_key||'%'
          AND (b.fac_bookmark_expire IS NULL OR b.fac_bookmark_expire > SYSDATE)
          AND ins_deel_verwijder IS NULL
          AND i.ins_deel_module = 'INS'
          AND i.ins_deel_parent_key IS NULL
          AND s.ins_srtdeel_key = i.ins_srtdeel_key
          AND g.ins_srtgroep_key = s.ins_srtgroep_key
          AND o.alg_onroerendgoed_keys = i.ins_alg_ruimte_key
          AND o.alg_onroerendgoed_type = i.ins_alg_ruimte_type
          AND i.ins_alg_ruimte_type IN ('T', 'R', 'W')
          AND o.alg_locatie_key = i.ins_alg_locatie_key
          AND i.ins_alg_locatie_key = l.alg_locatie_key
          AND l.alg_district_key = di.alg_district_key
          AND sm.mld_stdmelding_key = si.mld_stdmelding_key
          AND si.ins_srtinstallatie_key = DECODE(si.ins_srtinstallatie_niveau,
                                          'S', i.ins_srtdeel_key,
                                          'G', s.ins_srtgroep_key,
                                          'D', g.ins_discipline_key);

-- Voor genereren van QR-codes voor RES-ruimtes
CREATE OR REPLACE VIEW alli_v_rap_qrc_res_ruimte
(
   [REDACTED],
   [REDACTED],
   fclt_f_locatie,
   fclt_f_gebouw,
   fclt_f_ruimtenaam,
   res_ruimte_key,
   hide_f_bookmark_id
)
AS
   SELECT DISTINCT rg.res_discipline_key,
          l.alg_locatie_key,
          l.alg_locatie_omschrijving,
          g.alg_gebouw_naam,
          rg.res_ruimte_nr,
          rg.res_ruimte_key,
          b.fac_bookmark_id
     FROM res_v_res_ruimte_gegevens rg,
          alg_locatie l,
          alg_gebouw g,
          fac_bookmark b
    WHERE     b.fac_bookmark_id = 'BhIEFEoAItbkuYJL'
          AND g.alg_gebouw_key = rg.alg_gebouw_key
          AND l.alg_locatie_key = rg.alg_locatie_key;

-- rapport met ICT objecten (key 321) gekoppeld aan de bij behorende bestellingen (key 221
-- groep_key 1623 = Telefoons
-- srtdeel_key 9202 = notebooks, srtdeel_key 9201 = telefonie
CREATE OR REPLACE VIEW alli_v_rap_ict_insbes
(
   ins_deel_key,
   ins_gekoppeld_aan,
   ins_eigenaar,
   ins_naam,
   ins_email,
   ins_afdeling,
   ins_identificatie,
   ins_beschrijving,
   ins_aanmaakdatum,
   ins_objectsoort,
   ins_groep,
   artikel_groep,
   artikel,
   merk,
   type,
   specificatie,
   artikelnummer,
   bes_aantal,
   bes_item_prijs,
   bes_totaal,
   bestelling,
   ins_artikelnummer,
   ins_serienummer,
   ins_aanschafdatum,
   ins_aanschafdatum_exp,
   ins_imei
)
AS
   SELECT d.ins_deel_key,
          DECODE (ins_alg_ruimte_type,
                  'P', 'Persoon',
                  'A', 'Afdeling',
                  'C', 'Contactpersoon',
                  'R', 'Ruimte',
                  'W', 'Werkplek',
                  'T', 'Terrein',
                  '??')
             gekoppeld_aan,
          COALESCE (pf.prs_perslid_naam_full,
                    a.prs_afdeling_omschrijving,
                    '??')
             eigenaar,
          pf.prs_perslid_naam_full naam,
          pf.prs_perslid_email,
          a.prs_afdeling_omschrijving || ' (' || a.prs_afdeling_naam || ')'
             afdeling,
          ins_deel_omschrijving,
          ins_deel_opmerking beschrijving,
          ins_deel_aanmaak,
          ins_srtdeel_omschrijving,
          ins_srtgroep_omschrijving,
          cyod.bes_srtgroep_omschrijving,
          cyod.bes_srtdeel_omschrijving,
          REGEXP_SUBSTR (cyod.bes_srtdeel_omschrijving,
                         '[^**]+',
                         1,
                         1)
             merk,
          REGEXP_SUBSTR (cyod.bes_srtdeel_omschrijving,
                         '[^**]+',
                         1,
                         2)
             TYPE,
          REGEXP_SUBSTR (cyod.bes_srtdeel_omschrijving,
                         '[^**]+',
                         1,
                         3)
             specificatie,
          cyod.bes_srtdeel_nr,
          cyod.aantal,
          cyod.item_prijs,
          cyod.totaal,
          insbes.ins_kenmerkdeel_waarde bestelling,
          (SELECT ins_kenmerkdeel_waarde
             FROM ins_kenmerkdeel ikd, ins_kenmerk k
            WHERE     ins_deel_key = d.ins_deel_key
                  AND ikd.ins_kenmerk_key = k.ins_kenmerk_key
                  AND k.ins_srtkenmerk_key = 2)
             artikelnr,
          (SELECT ins_kenmerkdeel_waarde
             FROM ins_kenmerkdeel ikd, ins_kenmerk k
            WHERE     ins_deel_key = d.ins_deel_key
                  AND ikd.ins_kenmerk_key = k.ins_kenmerk_key
                  AND k.ins_srtkenmerk_key = 3)
             serienummer,
          (SELECT fac.safe_to_date (ins_kenmerkdeel_waarde, 'dd-mm-yyyy')
             FROM ins_kenmerkdeel ikd, ins_kenmerk k
            WHERE     ins_deel_key = d.ins_deel_key
                  AND ikd.ins_kenmerk_key = k.ins_kenmerk_key
                  AND k.ins_srtkenmerk_key = 5)
             aanschafdatum,
          (SELECT to_char(fac.safe_to_date (ins_kenmerkdeel_waarde, 'dd-mm-yyyy'), 'YYYYMMDD')
             FROM ins_kenmerkdeel ikd, ins_kenmerk k
            WHERE     ins_deel_key = d.ins_deel_key
                  AND ikd.ins_kenmerk_key = k.ins_kenmerk_key
                  AND k.ins_srtkenmerk_key = 5)
             aanschafdatum_exp,
          (SELECT ins_kenmerkdeel_waarde
             FROM ins_kenmerkdeel ikd, ins_kenmerk k
            WHERE     ins_deel_key = d.ins_deel_key
                  AND ikd.ins_kenmerk_key = k.ins_kenmerk_key
                  AND k.ins_srtkenmerk_key = 4)
             imei
     FROM ins_v_aanwezigdeel d,
          ins_v_deel_gegevens_keys idg,
          (SELECT pf1.prs_perslid_key,
                  pf1.prs_perslid_naam_full,
                  p.prs_perslid_email
             FROM prs_v_perslid_fullnames_all pf1, prs_perslid p
            WHERE p.prs_perslid_key = pf1.prs_perslid_key) pf,
          prs_afdeling a,
          ins_srtdeel sd,
          ins_srtgroep sg,
          (SELECT ikd.ins_deel_key, ins_kenmerkdeel_waarde
             FROM ins_kenmerkdeel ikd, ins_kenmerk k
            WHERE ikd.ins_kenmerk_key = k.ins_kenmerk_key
                  AND k.ins_srtkenmerk_key = 1) insbes,
          (SELECT b.bes_bestelling_key,
                  dis.ins_discipline_omschrijving ins_discipline_omschrijving,
                  grp.bes_srtgroep_key bes_srtgroep_key,
                  grp.bes_srtgroep_omschrijving bes_srtgroep_omschrijving,
                  srt.bes_srtdeel_nr bes_srtdeel_nr,
                  srt.bes_srtdeel_omschrijving bes_srtdeel_omschrijving,
                  bi.bes_bestelling_item_aantal aantal,
                  COALESCE (bi.bes_bestelling_item_prijs, 0) item_prijs,
                  bi.bes_bestelling_item_aantal
                  * COALESCE (bi.bes_bestelling_item_prijs, 0)
                     totaal
             FROM bes_bestelling_item bi,
                  bes_srtdeel srt,
                  bes_bestelling b,
                  bes_srtgroep grp,
                  ins_tab_discipline dis
            WHERE     bi.bes_srtdeel_key = srt.bes_srtdeel_key
                  AND srt.bes_srtgroep_key = grp.bes_srtgroep_key
                  AND grp.ins_discipline_key = dis.ins_discipline_key
                  AND bi.bes_bestelling_key = b.bes_bestelling_key
                  AND NOT EXISTS
                        (SELECT b1.bes_bestelling_key
                           FROM bes_bestelling b1
                          WHERE bes_bestelling_parentkey =
                                   b.bes_bestelling_key)
                  AND b.bes_bestelling_key IN
                           (SELECT bes_bestelling_key
                              FROM bes_bestelling_item bbi,
                                   bes_srtdeel bd,
                                   bes_srtgroep bsg
                             WHERE bbi.bes_srtdeel_key = bd.bes_srtdeel_key
                                   AND bd.bes_srtgroep_key =
                                         bsg.bes_srtgroep_key
                                   AND bsg.ins_discipline_key = 221)) cyod
    WHERE     d.ins_srtdeel_key = sd.ins_srtdeel_key
          AND d.ins_deel_key = idg.ins_deel_key
          AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
          AND sg.ins_discipline_key = 321
          AND pf.prs_perslid_key(+) = idg.prs_perslid_key
          AND a.prs_afdeling_key(+) = idg.prs_afdeling_key
          AND insbes.ins_deel_key = d.ins_deel_key
          AND TO_CHAR (cyod.bes_bestelling_key) =
                insbes.ins_kenmerkdeel_waarde(+)
          AND ( (bes_srtgroep_key != 1623 AND d.ins_srtdeel_key = 9202)
               OR (bes_srtgroep_key = 1623 AND d.ins_srtdeel_key = 9201));
               
               
/* Formatted on 17/6/2022 23:57:31 (QP5 v5.371) */
CREATE OR REPLACE PROCEDURE alli_processemail (pfrom        IN VARCHAR2,
                                               pto          IN VARCHAR2,
                                               psubject     IN VARCHAR2,
                                               pbody        IN VARCHAR2,
                                               psessionid   IN VARCHAR2,
                                               pemailkey    IN NUMBER)
AS
    v_sender         prs_perslid.prs_perslid_key%TYPE;
    v_kostenplaats   prs_afdeling.prs_kostenplaats_key%TYPE;
    v_mldstat        mld_melding.mld_melding_status%TYPE;
    v_stdmelding     mld_stdmelding.mld_stdmelding_key%TYPE;
    v_errormsg       fac_result.fac_result_waarde%TYPE;
    v_from           VARCHAR2 (4000);
    v_body           VARCHAR2 (4000);
    m_body           VARCHAR2 (4000);
    v_actie          VARCHAR2 (4000);
    v_mldkey         mld_melding.mld_melding_key%TYPE;
    v_mailorigin     mld_kenmerk.mld_kenmerk_key%TYPE;
    v_attachorigin   mld_kenmerk.mld_kenmerk_key%TYPE;
BEGIN
    v_sender := 4;                            --Standaard de persoon Facilitor
    v_errormsg := '(0x143)';
    v_mailorigin := 462;                  --Kenmerk_key originele mail-bijlage
    v_attachorigin := 461;                     --Kenmerk_key bijlage uit email

    -- Verwijder de Bounce Address Tag Validation
    IF pfrom LIKE 'prvs=%'
    THEN
        v_from := SUBSTR (pfrom, INSTR (pfrom, '=', -1) + 1);
    ELSE
        v_from := pfrom;
    END IF;

    v_body := pbody;
    m_body := pbody;

    --   DBMS_OUTPUT.PUT_LINE('v_from: '||v_from);

    -- Valideer de sender in pfrom: kennen we deze?
    SELECT MIN (p.prs_perslid_key), MIN (d.prs_kostenplaats_key)
      INTO v_sender, v_kostenplaats
      FROM prs_perslid p, prs_afdeling d
     WHERE     p.prs_afdeling_key = d.prs_afdeling_key
           AND p.prs_perslid_verwijder IS NULL
           AND UPPER (prs_perslid_email) = UPPER (v_from);

    CASE
        WHEN UPPER (pto) LIKE 'FACILITAIR@%'
        THEN
            BEGIN
                v_errormsg := '(0x245)' || v_mldkey || psubject || v_actie;
                v_stdmelding :=
                    fac.safe_to_number (fac.getsetting ('defaultstdmelding'));
                v_mldstat := 2;
                -- Standaard de status in Nieuw (2).

                -- pas de omschrijving van de melding aan. Verwijder onnodige html ballast.
                v_body := REPLACE (v_body, '&#x20;', ' ');           -- spatie
                v_body := REPLACE (v_body, '&#x21;', '!');
                v_body := REPLACE (v_body, '&#x22;', CHR (34)); -- double quote
                v_body := REPLACE (v_body, '&#x23;', '#');
                v_body := REPLACE (v_body, '&#x24;', '$');
                v_body := REPLACE (v_body, '&#x25;', '%');
                v_body := REPLACE (v_body, '&#x26;', '&');
                v_body := REPLACE (v_body, '&#x27;', CHR (39)); -- single quote
                v_body := REPLACE (v_body, '&#x28;', '(');
                v_body := REPLACE (v_body, '&#x29;', ')');
                v_body := REPLACE (v_body, '&#x2a;', '*');
                v_body := REPLACE (v_body, '&#x2b;', '+');
                v_body := REPLACE (v_body, '&#x2c;', ',');           --  komma
                v_body := REPLACE (v_body, '&#x2d;', '-');       --  min teken
                v_body := REPLACE (v_body, '&#x2e;', '.');             -- punt
                v_body := REPLACE (v_body, '&#x2f;', '/');
                v_body := REPLACE (v_body, '&#x3a;', ':');     -- dubbele punt
                v_body := REPLACE (v_body, '&#x3b;', ';');       -- punt komma
                v_body := REPLACE (v_body, '&#x3c;', '<');
                v_body := REPLACE (v_body, '&#x3d;', '=');
                v_body := REPLACE (v_body, '&#x3e;', '>');
                v_body := REPLACE (v_body, '&#x3f;', '?');
                v_body := REPLACE (v_body, '&#x40;', '@');
                v_body :=
                    REPLACE (v_body,
                             ' ' || CHR (10) || CHR (13),
                             CHR (10) || CHR (13)); -- soms komt er ineens een een spatie achter de tag.
            EXCEPTION
                WHEN OTHERS
                THEN
                    fac.writelog (
                        'PROCESSEMAIL',
                        'W',
                           'Mail kon niet geformateerd worden afzender:'
                        || pfrom
                        || '['
                        || v_errormsg
                        || ']',
                           'OTHERS (error '
                        || SQLCODE
                        || '/'
                        || SUBSTR (SQLERRM, 1, 100)
                        || ')');
            END;

            --Hieronder de acties die gedaan moeten worden.

            BEGIN
                v_stdmelding :=
                    fac.safe_to_number (fac.getsetting ('defaultstdmelding'));

                INSERT INTO mld_melding (mld_melding_module,
                                         mld_meldbron_key,
                                         mld_melding_datum,
                                         mld_melding_omschrijving,
                                         mld_melding_status,
                                         mld_melding_t_uitvoertijd,
                                         mld_stdmelding_key,
                                         mld_alg_locatie_key,
                                         mld_melding_externnr,
                                         prs_perslid_key,
                                         prs_perslid_key_voor,
                                         prs_kostenplaats_key,
                                         mld_melding_spoed)
                     VALUES (
                                'MLD',
                                4,                                    -- email
                                SYSDATE,
                                SUBSTR (
                                       psubject
                                    || CHR (13)
                                    || REPLACE (
                                           SUBSTR (
                                               v_body,
                                               1,
                                               4000 - (LENGTH (psubject) + 1)),
                                              CHR (13)
                                           || CHR (10)
                                           || CHR (13)
                                           || CHR (10),
                                           CHR (13) || CHR (10)),
                                    1,
                                    4000),     -- verwijder onnodige witregels
                                NULL,
                                MLD_T_UITVOERTIJD (5, 'D'),
                                v_stdmelding,
                                121,                      -- Locatie onbekend.
                                NULL,
                                v_sender,
                                v_sender,
                                v_kostenplaats,
                                3)
                  RETURNING mld_melding_key
                       INTO v_mldkey;

                --                DBMS_OUTPUT.PUT_LINE('Melding toegevoegd: ' || v_mldkey);
                v_errormsg := '(0x165)';
                mld.setmeldingstatus (v_mldkey, 2, v_sender);

                INSERT INTO fac_result (fac_result_sessionid,
                                        fac_result_naam,
                                        fac_result_waarde)
                         VALUES (psessionid,
                                 'maillog',
                                 'Geregistreerd onder melding ' || v_mldkey);
            END;

            IF v_mldkey IS NOT NULL
            THEN
                BEGIN
                    -- Bijlagen toevoegen uit email
                    v_errormsg :=
                        '(0x601)' || v_mldkey || psubject || v_actie;

                    INSERT INTO fac_result (fac_result_sessionid,
                                            fac_result_naam,
                                            fac_result_waarde)
                             VALUES (
                                        psessionid,
                                        'kenmerkpath',
                                           'MLD\M'
                                        || TO_CHAR (TRUNC (v_mldkey / 1000),
                                                    'FM0000')
                                        || '___\M'
                                        || v_mldkey
                                        || '\'
                                        || v_attachorigin
                                        || '\');



                    -- Originele email wordt opgeslagen bij de opdracht
                    v_errormsg :=
                        '(0x602`)' || v_mldkey || psubject || v_actie;

                    INSERT INTO fac_result (fac_result_sessionid,
                                            fac_result_naam,
                                            fac_result_waarde)
                             VALUES (
                                        psessionid,
                                        'kenmerkpath',
                                           'MLD\M'
                                        || TO_CHAR (TRUNC (v_mldkey / 1000),
                                                    'FM0000')
                                        || '___\M'
                                        || v_mldkey
                                        || '\'
                                        || v_mailorigin
                                        || '\');
                END;
            END IF;
        ELSE
            v_errormsg :=
                   '(0x900)'
                || v_mldkey
                || psubject
                || v_actie
                || ' - geen pto herkend';

            INSERT INTO fac_result (fac_result_sessionid,
                                    fac_result_naam,
                                    fac_result_waarde)
                 VALUES (psessionid, 'maillog', v_errormsg);
    END CASE;
EXCEPTION
    WHEN OTHERS
    THEN
        INSERT INTO fac_result (fac_result_sessionid,
                                fac_result_naam,
                                fac_result_waarde)
             VALUES (psessionid, 'maillog', v_errormsg);

        fac.writelog (
            'PROCESSEMAIL',
            'E',
               'Mail kon niet ingelezen worden afzender:'
            || pfrom
            || '['
            || v_errormsg
            || v_mldkey
            || psubject
            || v_actie
            || ']',
               'OTHERS (error '
            || SQLCODE
            || '/'
            || SUBSTR (SQLERRM, 1, 100)
            || ')');
END;
/


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