--
-- $Id$
--
-- Script containing customer specific sql statements for the CWTD database

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

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
WHENEVER SQLERROR EXIT;
SELECT adm.scriptspoolfile('&dbuser', '&thisfile') AS fcltlogfile FROM DUAL;
WHENEVER SQLERROR CONTINUE;
SPOOL &fcltlogfile
SET DEFINE OFF

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

--
-- Personen import
--

CREATE OR REPLACE PROCEDURE cwtd_import_persoon (
   p_import_key IN NUMBER
)
AS
   c_max_import_str_len   NUMBER(10)    := 1000;

   CURSOR c_cursor IS
       SELECT *
         FROM fac_imp_file
        WHERE fac_import_key = p_import_key
     ORDER BY fac_imp_file_index;

   next_record                 c_cursor%ROWTYPE;

   v_newline                   VARCHAR2 (1000);        -- Import line
   v_field                     VARCHAR2 (100);         -- Import field
   v_fielddelimitor            VARCHAR2 (1);           -- Field seperator
   v_errormsg                  VARCHAR (200);
   v_errorhint                 VARCHAR (200);
   oracle_err_num              NUMBER;
   oracle_err_mes              VARCHAR2 (200);

   -- De importvelden
   v_afdeling_naam             VARCHAR2 (1000);
   v_afdeling_omschrijving     VARCHAR2 (1000);
   v_perslid_naam              VARCHAR2 (1000);
  -- v_perslid_tussenvoegsel     VARCHAR2 (1000);
  -- v_perslid_partn_tussen      VARCHAR2 (1000);
  -- v_perslid_partn_naam        VARCHAR2 (1000);
  -- v_perslid_voorletters       VARCHAR2 (1000);
   v_perslid_voornaam          VARCHAR2 (1000);
  -- v_perslid_fullname          VARCHAR2 (1000);
   v_perslid_telefoonnr        VARCHAR2 (1000);
  -- v_perslid_mobiel            VARCHAR2 (1000);
   v_perslid_oslogin           VARCHAR2 (1000);
   v_perslid_email             VARCHAR2 (1000);
   v_srtperslid_omschrijving   VARCHAR2 (1000);
   v_perslid_nr                VARCHAR2 (1000);
   v_perslid_geslacht          VARCHAR2 (1000);
   v_perslid_ingangsdatum      VARCHAR2 (1000);
   v_perslid_einddatum         VARCHAR2 (1000);
   v_locatie_omschrijving      VARCHAR2 (1000);
   v_locatie_code              VARCHAR2 (1000);
   v_ruimte_nr                 VARCHAR2 (1000);
   v_dummy                     VARCHAR2 (1000);
   header_found                BOOLEAN;
   v_controle_res              VARCHAR2(30);
   v_old_persnr                VARCHAR2 (30);
   
    CURSOR c
   IS
        SELECT   fac_usrdata_omschr, prs_perslid_nr
          FROM   cwtd_imp_persoon cip, fac_usrdata u
         WHERE   UPPER(cip.prs_perslid_naam) LIKE UPPER(u.fac_usrdata_omschr) || ' ' || '%'
           AND   fac_usrtab_key = 81
      ORDER BY   cip.prs_perslid_nr, LENGTH (fac_usrdata_omschr) DESC;

   -- SUBFUNCTION
   FUNCTION get_imp_value (p_value IN VARCHAR2, p_length IN NUMBER) RETURN VARCHAR2 IS

        c_del_in_str           VARCHAR2(16)  := 'NULL';
        c_del_in_str2          VARCHAR2(16)  := '"';

        v_value                VARCHAR2(1000);

   BEGIN

      SELECT  SUBSTR(TRIM(coalesce(replace(replace(p_value,c_del_in_str),c_del_in_str2,''),'')),1,p_length)
      INTO    v_value
      FROM    DUAL;

      RETURN v_value;

   EXCEPTION
        WHEN OTHERS
        THEN
          RETURN p_value;

   END;


BEGIN
   -- Init
   header_found := FALSE;
   v_fielddelimitor := ';';
   v_errormsg := '';
   v_old_persnr := 'QueQeLeQue';
   v_controle_res := 'OK'; -- Hier kan een controle ingebouwd worden ...

   IF (v_controle_res IS NULL) THEN

     v_errormsg := 'Ongeldig importbestand';
     fac.imp_writelog (p_import_key, 'E', v_errormsg, '');

   ELSE

      -- Clear my previous imported rows
     DELETE FROM cwtd_imp_persoon;
     commit;

     FOR next_record IN c_cursor LOOP
     BEGIN

        v_newline := SUBSTR(next_record.FAC_IMP_FILE_LINE,1,c_max_import_str_len);


        fac.imp_getfield (v_newline, v_fielddelimitor, v_perslid_nr);              -- Carlson UID
        fac.imp_getfield (v_newline, v_fielddelimitor, v_perslid_voornaam);        -- First Name
        fac.imp_getfield (v_newline, v_fielddelimitor, v_perslid_naam);            -- Last Name
        fac.imp_getfield (v_newline, v_fielddelimitor, v_srtperslid_omschrijving); -- Job Name
        fac.imp_getfield (v_newline, v_fielddelimitor, v_afdeling_omschrijving);   -- Department Name
        fac.imp_getfield (v_newline, v_fielddelimitor, v_locatie_omschrijving);    -- Location Name
        fac.imp_getfield (v_newline, v_fielddelimitor, v_afdeling_naam);           -- Cost Center Numnber
        fac.imp_getfield (v_newline, v_fielddelimitor, v_perslid_email);           -- Email Address
        fac.imp_getfield (v_newline, v_fielddelimitor, v_perslid_geslacht);        -- Gender
        fac.imp_getfield (v_newline, v_fielddelimitor, v_perslid_telefoonnr);      -- Work Phone
        fac.imp_getfield (v_newline, v_fielddelimitor, v_perslid_ingangsdatum);
        v_perslid_ingangsdatum := '';
        fac.imp_getfield (v_newline, v_fielddelimitor, v_perslid_einddatum);
        v_perslid_einddatum := '';
        v_perslid_oslogin := '';

        -- Skip until the header is found
        IF (v_perslid_nr              = 'Carlson UID' AND
            v_perslid_voornaam        = 'First Name' AND
            v_perslid_naam            = 'Last Name' AND
            v_srtperslid_omschrijving = 'Job Name' AND
            v_afdeling_omschrijving   = 'Department Name' AND
            v_locatie_omschrijving    = 'Location Name' AND
            v_afdeling_naam           = 'Cost Center Numnber' AND
            v_perslid_email           = 'Email Address' AND
            v_perslid_geslacht        = 'Gender' AND
            v_perslid_telefoonnr      = 'Work Phone'
           -- v_perslid_voorletters     IS NULL AND
           -- v_perslid_tussenvoegsel   IS NULL AND
           -- v_perslid_partn_tussen    IS NULL AND
           -- v_perslid_partn_naam      IS NULL AND
           -- v_perslid_fullname        IS NULL AND
           -- v_srtperslid_omschrijving IS NULL AND
           -- v_perslid_mobiel          IS NULL AND
          )
        THEN
           header_found := TRUE;
        ELSIF (header_found)
        THEN

          BEGIN

             v_errormsg := 'Kan persoonsgegevens niet inlezen: ';

             v_perslid_nr               := get_imp_value(v_perslid_nr,16);
             v_perslid_naam             := get_imp_value(v_perslid_naam,30);
             v_perslid_voornaam         := get_imp_value(v_perslid_voornaam,30);
             -- v_perslid_tussenvoegsel    := get_imp_value(v_perslid_tussenvoegsel,15);
             v_perslid_geslacht         := get_imp_value(v_perslid_geslacht, 10);
             -- v_perslid_partn_naam       := get_imp_value(v_perslid_partn_naam,30);
             -- v_perslid_partn_tussen     := get_imp_value(v_perslid_partn_tussen,15);
             -- v_perslid_fullname         := get_imp_value(v_perslid_fullname,60);
             v_perslid_oslogin          := get_imp_value(v_perslid_oslogin,30);
             v_perslid_email            := get_imp_value(v_perslid_email,200);
             v_afdeling_naam            := get_imp_value(v_afdeling_naam,10);
             v_afdeling_omschrijving    := get_imp_value(v_afdeling_omschrijving,60);
             v_locatie_omschrijving     := get_imp_value(v_locatie_omschrijving,30);
             v_srtperslid_omschrijving  := get_imp_value(v_srtperslid_omschrijving,30);
             v_perslid_telefoonnr       := get_imp_value(v_perslid_telefoonnr, 30);

             -- Velden met een waarde '' zijn leeg ivm privacy overwegingen
             INSERT INTO cwtd_imp_persoon
              (prs_perslid_nr
              ,prs_perslid_naam
              ,prs_perslid_voornaam
              ,prs_perslid_geslacht
              --,prs_perslid_partn_tussen
              --,prs_perslid_partn_naam
              --,prs_perslid_tussenvoegsel
              --,prs_perslid_voorletters
              --,prs_perslid_fullname
              ,prs_perslid_telefoonnr
             -- ,prs_perslid_mobiel
              ,prs_perslid_oslogin
              ,prs_perslid_email
              ,prs_srtperslid_omschrijving
              ,prs_afdeling_naam
              ,prs_afdeling_omschr
              ,prs_perslid_ingangsdatum
              ,prs_perslid_einddatum
              ,prs_locatie_omschrijving
              ,cwtd_imp_persoon_aanmaak
              )
              VALUES(v_perslid_nr
                    ,v_perslid_naam
                    ,v_perslid_voornaam
                    ,DECODE (v_perslid_geslacht, 'Male', 1, 'Female', 0, NULL)
                    --,v_perslid_partn_tussen
                   -- ,v_perslid_partn_naam
                   -- ,v_perslid_tussenvoegsel
                   -- ,v_perslid_voorletters
                    --,v_perslid_fullname
                    ,v_perslid_telefoonnr
                   -- ,v_perslid_mobiel
                    ,TO_CHAR (v_perslid_nr)
                    ,v_perslid_email
                    ,v_srtperslid_omschrijving
                    ,v_afdeling_naam
                    ,v_afdeling_omschrijving
                    ,''
                    ,''
                    ,v_locatie_omschrijving
                    ,sysdate
              );

              commit;

           EXCEPTION
           WHEN OTHERS
           THEN

              oracle_err_num := SQLCODE;
              oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
              v_errormsg := v_errormsg || 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
              fac.imp_writelog (p_import_key, 'E', v_errormsg, 'personeelsnummer:'||v_perslid_nr);
              commit; -- logging

          END;

        END IF;

        COMMIT;
     END;
     END LOOP;

     IF header_found = FALSE THEN
       fac.imp_writelog (p_import_key, 'E', 'Geen geldige header gevonden', '');
     ELSE
     -- splits de achternaam in tussenvoegsels en achternaam.
     FOR rec IN c
      LOOP
         BEGIN
            IF rec.prs_perslid_nr <> v_old_persnr
            THEN
               DBMS_OUTPUT.put_line (
                  rec.prs_perslid_nr || '-' || rec.fac_usrdata_omschr);
               v_old_persnr := rec.prs_perslid_nr;

               UPDATE cwtd_imp_persoon cip
                  SET prs_perslid_tussenvoegsel = rec.fac_usrdata_omschr,
                      prs_perslid_naam =
                         TRIM(SUBSTR (prs_perslid_naam,
                                      LENGTH (rec.fac_usrdata_omschr) + 1))
                WHERE cip.prs_perslid_nr = rec.prs_perslid_nr;
            END IF;
         END;
      END LOOP;
    END IF;
   END IF;
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_errormsg, '');

END;
/

SHOW ERRORS;

CREATE OR REPLACE PROCEDURE cwtd_update_persoon (p_import_key IN NUMBER)
AS

   -- Constanten (LET OP: deze waarden moeten letterlijk in de DB aabwezig zijn!)
   c_usrtab_key                  INTEGER                              := 1; -- Tbv GEBOUW
   c_srtgebouw_default           INTEGER                              := 1;
   c_srtruimte_default           INTEGER                              := 1;

   -- Constanten (overig)
   c_prs_werkplek_omschrijving   VARCHAR2 (16)                        := 'Onbekend';
   c_srtperslid_omschr_default   VARCHAR2 (16)                        := 'Onbekend';
   c_werkplek_volgnr_default     INTEGER                              := 1;
   c_verdieping_omschr_default   VARCHAR2 (16)                        := 'BG';
   c_ruimte_omschr_default       VARCHAR2 (16)                        := 'Onbekend';
   c_ruimte_code                 VARCHAR2 (3)                         := '000';
   c_commitbuffer                NUMBER                               := 1000;
   c_perslid_aanmaak             DATE; --                               := TO_DATE('01011980','ddmmyy'); -- ivm privacy overwegingen
   c_perslid_verwijder           DATE; --                               := TO_DATE('01011980','ddmmyy'); -- ivm privacy overwegingen
   c_perslid_ingangsdatum        DATE; --                               := TO_DATE('01011980','ddmmyy'); -- ivm privacy overwegingen
   c_no_key_found                NUMBER                               := 0;
   c_afdeling_niveau_persoon     NUMBER(1)                            := 3; -- Afdelingsniveau waaraan personen gekoppeld worden

   -- Prefix voor persoonnaam om aan te geven dat de persoon op de nominatie staat om verwijderd te
   -- worden maar dat verwijderen nog niet mogelijk is omdat de persoon verplichtingen heeft.
   c_inactief                    VARCHAR2(16)                         := 'INACTIEF:';

   -- om de zoveel committen
   v_buffercount                 NUMBER                               := 0;

   CURSOR c_prs_del
   IS
                SELECT p.prs_perslid_key, p.prs_perslid_nr
                    FROM prs_perslid p, cwtd_imp_persoon c
                WHERE     p.prs_perslid_nr IS NOT NULL
                        AND p.prs_perslid_verwijder IS NULL
                        AND p.prs_perslid_nr = c.prs_perslid_nr(+)
                        AND c.prs_perslid_nr IS NULL
               ORDER BY 1;

   CURSOR c_prs_upd
   IS
        SELECT p.prs_perslid_key,
               lp.prs_locatie_omschrijving,
               lp.prs_perslid_partn_tussen,
               lp.prs_perslid_partn_naam,
               lp.prs_perslid_fullname,
               DECODE (lp.prs_afdeling_naam, NULL, '0000', lp.prs_afdeling_naam) prs_afdeling_naam,
               lp.prs_afdeling_omschr,
               lp.prs_perslid_naam,
               lp.prs_perslid_tussenvoegsel,
               lp.prs_perslid_voorletters,
               lp.prs_perslid_voornaam,
               lp.prs_perslid_geslacht,
               DECODE (lp.prs_perslid_telefoonnr,
                       '0', NULL,
                       lp.prs_perslid_telefoonnr)
                  prs_perslid_telefoonnr,
               lp.prs_perslid_mobiel,
               lp.prs_perslid_oslogin,
               lp.prs_perslid_email,
               COALESCE (lp.prs_srtperslid_omschrijving, 'Onbekend')
                  prs_srtperslid_omschrijving,
               lp.prs_perslid_nr,
               '' prs_perslid_titel,
               p.prs_perslid_verwijder,
               INSTR (lp.prs_perslid_fullname, lp.prs_perslid_naam) ind_eigen,
               INSTR (lp.prs_perslid_fullname,
                      NVL (lp.prs_perslid_partn_naam, 'xxxxxx'))
                  ind_partner
          FROM    (  SELECT * FROM cwtd_imp_persoon) lp
               LEFT OUTER JOIN
                  (  SELECT * FROM prs_perslid) p
               ON LTRIM (lp.prs_perslid_nr, '0') = LTRIM (p.prs_perslid_nr, '0')
      -- Dit moet analoog aan UWVA#13061: verwijderde personen moeten kunnen worden gereactiveerd.
      -- AND p.prs_perslid_verwijder IS NULL
      ORDER BY lp.prs_perslid_nr ASC;

   v_perslid_tussenvoegsel       VARCHAR2(15);
   v_perslid_naam                VARCHAR2(30);
   v_per_indnaamsvoegen          VARCHAR2(1);
   v_perslid_key                 NUMBER (10);
   v_prs_key_cnt                 NUMBER (10);
   v_srtperslid_key              NUMBER (10);
   v_afdeling_key                NUMBER (10);
   v_gebouw_key                  NUMBER (10);
   v_verdieping_key              NUMBER (10);
   v_ruimte_nr                   VARCHAR2 (10);
   v_ruimte_key                  NUMBER (10);
   v_werkplek_key                NUMBER (10);
   v_gebouw_code                 VARCHAR2 (10);
   v_srtperslid_omschr           VARCHAR (30);
   rec_prs_del                   c_prs_del%ROWTYPE;
   rec_prs_upd                   c_prs_upd%ROWTYPE;
   oracle_err_num                NUMBER;
   oracle_err_mes                VARCHAR2 (200);
   v_errormsg                    VARCHAR2 (1024);
   v_errorhint                   VARCHAR2 (1024);
   v_debug                       VARCHAR2 (1024);
   v_count                       NUMBER (10);
   v_update                      BOOLEAN;
   v_aktie                       VARCHAR (10);
   v_perslid_count_imp           NUMBER;
   v_perslid_count_fclt          NUMBER;
   v_perslid_newcount_fclt       NUMBER;
   currentversion                fac_module.fac_module_version%TYPE;
   l_validatie                   NUMBER;
   v_srtimport                   VARCHAR2 (10);
   o_afdeling_key                NUMBER (10);  -- huidige (oude) afdeling
   l_nrkps                       NUMBER;
   v_nr_werkplek                 NUMBER;
   v_current_gebouw_key          NUMBER;
   v_new_gebouw_key              NUMBER;
   v_werkplek_volgnr             NUMBER(10);
   v_werkplek_oms                VARCHAR2 (60);

BEGIN
   -- Constanten:
   SELECT   SYSDATE, SYSDATE, SYSDATE
   INTO     c_perslid_aanmaak, c_perslid_verwijder, c_perslid_ingangsdatum
   FROM     DUAL;

   -- *** Delete ***************************************************************
   v_errorhint := 'Eventueel te verwijderen personen worden verwijderd ';

   SELECT COUNT (*)
     INTO v_perslid_count_fclt
     FROM prs_perslid
    WHERE prs_perslid_nr IS NOT NULL AND prs_perslid_verwijder IS NULL;

   SELECT COUNT (*)
     INTO v_perslid_count_imp
     FROM cwtd_imp_persoon;

   IF v_perslid_count_imp < 10 THEN
     fac.imp_writelog (p_import_key, 'E', 'Geen records gevonden om te importeren.', '');
     COMMIT;
     RETURN;
   END IF;

   FOR rec_prs_del IN c_prs_del
   LOOP
      BEGIN

         v_perslid_key  := rec_prs_del.prs_perslid_key;
         v_errorhint    := 'Verwijderen van de persoon is NIET gelukt';

         SELECT COUNT (*)
           INTO v_count
           FROM prs_v_verplichting_refcheck pv
          WHERE pv.prs_perslid_key = v_perslid_key;

         IF v_count = 0
         THEN
            -- Persoon heeft geen enkele (actuele of historische) verplichting
            v_errormsg := 'Kan persoon (kennelijk zonder historie!) niet met prs_perslid_key [' || TO_CHAR (v_perslid_key) || '] niet verwijder. ';

            DELETE FROM prs_perslid
                  WHERE prs_perslid_key = v_perslid_key;

            fac.imp_writelog (p_import_key,
                              'I',
                              'Persoon verwijderd met personeelsnummer ['||rec_prs_del.prs_perslid_nr||']',
                              ''
                             );
         ELSE
            -- Controleer of er ACTUELE verplichtingen zijn
            SELECT COUNT (*)
              INTO v_count
              FROM prs_v_verplichting_keys pv
             WHERE pv.prs_perslid_key = v_perslid_key;

            IF v_count > 0
            THEN
               v_errormsg := 'Kan persoon (kennelijk met historie!) niet inactiveren met prs_perslid_key [' || TO_CHAR (v_perslid_key) || ']';
               UPDATE prs_perslid
                  SET prs_perslid_naam = SUBSTR (c_inactief || prs_perslid_naam, 1, 30),
                      prs_perslid_oslogin = NULL
                WHERE prs_perslid_key = v_perslid_key
                  AND prs_perslid_naam NOT LIKE c_inactief||'%';

               fac.imp_writelog (p_import_key,
                                 'I',
                                 'Persoon als ['||c_inactief||'] gemarkeerd met personeelsnummer ['||rec_prs_del.prs_perslid_nr||']',
                                 ''
                                );
            ELSE
               BEGIN
                  v_errormsg := 'Kan persoon (kennelijk met historie!) niet inactiveren (verwijderdatum zetten) met prs_perslid_key [' || TO_CHAR (v_perslid_key) || ']';
                  UPDATE prs_perslid
                     SET prs_perslid_verwijder = c_perslid_verwijder
                   WHERE prs_perslid_key = v_perslid_key;

                  fac.imp_writelog (p_import_key,
                                    'I',
                                    'Persoon verwijderd met personeelsnummer ['||rec_prs_del.prs_perslid_nr||']',
                                    ''
                                   );
               EXCEPTION
                  WHEN OTHERS
                  THEN

                     -- Kennelijk heeft de persoon toch ernstige verplichtingen
                     v_errorhint :=
                           'Persoon heeft nog (max. '
                        || TO_CHAR (v_count)
                        || ') verplichtingen; personeelsnummer: '
                        || rec_prs_del.prs_perslid_nr;
                     fac.imp_writelog (p_import_key, 'I', 'Inactiveren persoon is niet gelukt', v_errorhint);

               END;

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

   COMMIT;

   -- *** Update ***************************************************************
   v_errormsg := 'Persoonsgegevens worden nu aangepast (toevoegen/wijzigen) ';

   FOR rec_prs_upd IN c_prs_upd
   LOOP
      BEGIN

         -- Init
         v_update         := TRUE; -- Nog geen fouten gevonden
         v_afdeling_key   := c_no_key_found;
         v_srtperslid_key := c_no_key_found;
         v_perslid_key    := c_no_key_found;
         v_errormsg := '';

         IF rec_prs_upd.prs_perslid_key IS NULL
         THEN
            v_aktie := 'INSERT';
            v_errorhint := 'Persoonsgegevens kunnen niet toegevoegd worden';
         ELSE
            v_aktie := 'UPDATE';
            v_errorhint := 'Persoonsgegevens kunnen niet gewijzigd worden';
         END IF;

         -- *** Controle verplichte gegevens + ophalen extra informatie ***
         -- Controle: PRS_PERSLID_NR
         IF rec_prs_upd.prs_perslid_nr IS NULL
         THEN
            v_errormsg  := 'Persoon met achternaam ['||rec_prs_upd.prs_perslid_naam||' heeft geen personeelsnummer ';
            fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
            v_update := FALSE;
         END IF;

         -- (oorspronkelijk overgenomen uit de CONN perman koppeling.)
         IF rec_prs_upd.ind_eigen = 0 THEN
           v_per_indnaamsvoegen := 'A';
         ELSIF rec_prs_upd.ind_partner = 0 THEN
           v_per_indnaamsvoegen := 'X';
         ELSIF rec_prs_upd.ind_partner < rec_prs_upd.ind_eigen THEN
           v_per_indnaamsvoegen := 'J';
         ELSE
           v_per_indnaamsvoegen := 'G';
         END IF;

         v_perslid_tussenvoegsel := rec_prs_upd.prs_perslid_tussenvoegsel;
         v_perslid_naam := rec_prs_upd.prs_perslid_naam;
         
         
          -- partner - eigen
  --    IF    v_per_indnaamsvoegen = 'J'
  --       OR v_per_indnaamsvoegen = 'W'
  --       OR v_per_indnaamsvoegen = 'E'
  --       OR v_per_indnaamsvoegen = 'P'
  --    THEN
  --       v_perslid_tussenvoegsel := rec_prs_upd.prs_perslid_partn_tussen;
  --
  --       IF rec_prs_upd.prs_perslid_tussenvoegsel IS NOT NULL
  --       THEN
  --          v_perslid_naam := SUBSTR (rec_prs_upd.prs_perslid_partn_naam || '-' || rec_prs_upd.prs_perslid_tussenvoegsel || ' ' || rec_prs_upd.prs_perslid_naam, 1, 30);
  --       ELSE
  --          v_perslid_naam := SUBSTR (rec_prs_upd.prs_perslid_partn_naam || '-' || rec_prs_upd.prs_perslid_naam, 1, 30);
  --       END IF;
  --    -- partner
  --    ELSIF v_per_indnaamsvoegen = 'A'
  --    THEN
  --       v_perslid_tussenvoegsel := rec_prs_upd.prs_perslid_partn_tussen;
  --       v_perslid_naam := SUBSTR (rec_prs_upd.prs_perslid_partn_naam, 1, 30);
  --    -- eigen - partner
  --    ELSIF v_per_indnaamsvoegen = 'G'
  --    THEN
  --       IF rec_prs_upd.prs_perslid_partn_tussen IS NOT NULL
  --       THEN
  --          v_perslid_naam :=
  --                        SUBSTR (rec_prs_upd.prs_perslid_naam || '-' || rec_prs_upd.prs_perslid_partn_tussen || ' ' || rec_prs_upd.prs_perslid_partn_naam, 1, 30);
  --       ELSE
  --          v_perslid_naam := SUBSTR (rec_prs_upd.prs_perslid_naam || '-' || rec_prs_upd.prs_perslid_partn_naam, 1, 30);
  --       END IF;
  --    END IF;

         -- Controle: PRS_PERSLID_NAAM
         IF v_update AND v_perslid_naam IS NULL
         THEN
            v_errormsg := 'Persoon met personeelsnummer [' || rec_prs_upd.prs_perslid_nr||'] heeft geen achternaam';
            fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
            v_update := FALSE;
         END IF;

         -- Controle: Kan persoon gereactiveerd worden of is er al een persoon met dezelfde prs_perslid_nr actief
         IF v_update AND rec_prs_upd.prs_perslid_verwijder IS NOT NULL
         THEN
            BEGIN
               -- Is er al een actieve persoon met dezelfde perslid_nr
               SELECT COUNT(p.prs_perslid_key)
                 INTO v_prs_key_cnt
                 FROM prs_perslid p
                WHERE p.prs_perslid_verwijder IS NULL
                  AND LTRIM(p.prs_perslid_nr, '0') LIKE LTRIM(rec_prs_upd.prs_perslid_nr, '0')
                  AND p.prs_perslid_key != rec_prs_upd.prs_perslid_key;

               IF v_prs_key_cnt > 0
               THEN
                  -- (UWVA#13270)
                  -- Waarde(n) gevonden: Er is al een actieve persoon met dezelfde prs_perslid_nr gevonden: Niet updaten!!!
                  --v_errormsg := 'Persoon hoeft niet gereactiveerd te worden; prs_perslid_nr: ' || rec_prs_upd.prs_perslid_nr;
                  --v_errorhint := 'Er bestaat al een persoon met dezelfde persooneelsnummer die actief is, GEEN ACTIE NODIG; personeelsnummer: ' || rec_prs_upd.prs_perslid_nr;
                  --fac.imp_writelog (p_import_key, 'I', v_errormsg, v_errorhint);
                  v_update := FALSE;
               ELSE
                  -- Kennelijk is er geen persoon gevonden met dezelfde prs_perslid_nr
                  -- persoon kan gereactieveerd worden (prs_perslid_verwijder op NULL zetten)
                  -- v_update := TRUE;
                  v_errormsg := 'Persoon reactiveren; prs_perslid_nr: ' || rec_prs_upd.prs_perslid_nr;
                  v_errorhint := 'ACTIE wordt ondernomen; personeelsnummer: ' || rec_prs_upd.prs_perslid_nr;
                  fac.imp_writelog (p_import_key, 'I', v_errormsg, v_errorhint);
               END IF;
            EXCEPTION
               WHEN OTHERS
               THEN
                  v_update := FALSE;
                  v_errorhint := 'Fout in het vinden aantal actieve personen; personeelsnummer: ' || rec_prs_upd.prs_perslid_nr || '?!';
            END;
         END IF;

         -- Controle: PRS_AFDELING_NAAM
         IF v_update
         THEN
            BEGIN
              v_errormsg := 'De afdeling ['||rec_prs_upd.prs_afdeling_naam||']'||' kan niet éénduidig bepaald worden ';

               -- Bepaal de afdelingskey; indien afdeling niet bestaat nieuwe toevoegen.
               SELECT prs_afdeling_key
                 INTO v_afdeling_key
                 FROM prs_afdeling
                WHERE prs_afdeling_naam = upper(rec_prs_upd.prs_afdeling_naam)
                  AND prs_afdeling_verwijder is null;

            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  INSERT INTO prs_kostenplaats (prs_kostenplaats_nr, prs_kostenplaats_module) values (rec_prs_upd.prs_afdeling_naam, 'PRS');

                  INSERT INTO prs_afdeling (prs_afdeling_naam, prs_afdeling_omschrijving, prs_kostenplaats_key, prs_bedrijf_key)
                   VALUES
                   ( rec_prs_upd.prs_afdeling_naam
                   , 'Onbekend-'||rec_prs_upd.prs_afdeling_naam
                   , (  SELECT prs_kostenplaats_key
                          FROM prs_kostenplaats
                         WHERE prs_kostenplaats_verwijder is null
                           AND prs_kostenplaats_nr = rec_prs_upd.prs_afdeling_naam)
                   , 2);

                   -- Bepaal de afdelingskey;
                   SELECT prs_afdeling_key
                     INTO v_afdeling_key
                     FROM prs_afdeling
                    WHERE prs_afdeling_naam = upper(rec_prs_upd.prs_afdeling_naam)
                      AND prs_afdeling_verwijder is null;

               WHEN OTHERS
               THEN
                  v_update := FALSE;
                  v_errorhint := 'Kan Afdeling ' || rec_prs_upd.prs_afdeling_naam || ' niet eenduidig bepalen?!';
            END;
         END IF;

         -- Controle: PRS_SRTPERSLID_OMSCHRIJVING
         IF v_update
         THEN
            v_srtperslid_omschr := RTRIM (INITCAP (rec_prs_upd.prs_srtperslid_omschrijving));

            BEGIN
               -- Bepaal de key van de functie
               SELECT prs_srtperslid_key
                 INTO v_srtperslid_key
                 FROM prs_srtperslid
                WHERE prs_srtperslid_upper = UPPER (v_srtperslid_omschr) AND prs_srtperslid_verwijder IS NULL;
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  v_errormsg := 'prs_srtperslid ' || v_srtperslid_omschr || ' bestaat niet';

                  -- Functie bestaat kennelijk niet, maak 'm maar aan
                  INSERT INTO prs_srtperslid
                              (prs_srtperslid_omschrijving)
                       VALUES (v_srtperslid_omschr)
                    RETURNING prs_srtperslid_key
                         INTO v_srtperslid_key;
               WHEN OTHERS
               THEN
                  v_errorhint :=
                        'Functie '
                     || v_srtperslid_omschr
                     || '  kan niet bepaald worden; persoonnr: '
                     || rec_prs_upd.prs_perslid_nr;
                  v_update := FALSE;
            END;
         END IF;

         -- *** Daadwerkelijk insert/update prs_perslid ***
         IF v_update
         THEN
            BEGIN
               IF v_aktie = 'INSERT'
               THEN
                  v_errormsg := 'Persoon kan niet worden toegevoegd';

                  INSERT INTO prs_perslid
                              (prs_perslid_naam, prs_perslid_tussenvoegsel, prs_perslid_module,
                               prs_perslid_voorletters, prs_perslid_voornaam, prs_perslid_geslacht,
                               prs_perslid_telefoonnr, prs_perslid_mobiel, prs_perslid_oslogin, prs_perslid_email, prs_perslid_nr,
                               prs_perslid_titel, prs_srtperslid_key, prs_afdeling_key, prs_perslid_aanmaak, fac_profiel_key
                              )
                       VALUES (v_perslid_naam, v_perslid_tussenvoegsel, 'PRS',
                               rec_prs_upd.prs_perslid_voorletters, rec_prs_upd.prs_perslid_voornaam, rec_prs_upd.prs_perslid_geslacht,
                               rec_prs_upd.prs_perslid_telefoonnr, rec_prs_upd.prs_perslid_mobiel, rec_prs_upd.prs_perslid_oslogin, rec_prs_upd.prs_perslid_email, rec_prs_upd.prs_perslid_nr,
                               rec_prs_upd.prs_perslid_titel, v_srtperslid_key, v_afdeling_key, c_perslid_aanmaak, 21
                              );

                  fac.imp_writelog (p_import_key,
                                    'C',
                                    'Nieuw persoon toegevoegd',
                                       'Naam/persoonsnr: '
                                    || v_perslid_naam
                                    || '/'
                                    || rec_prs_upd.prs_perslid_nr
                                   );
               ELSE

                  v_errormsg := 'Persoon kan niet worden gewijzigd';

                  UPDATE prs_perslid
                     SET prs_perslid_naam = v_perslid_naam,
                         prs_perslid_tussenvoegsel = v_perslid_tussenvoegsel,
                         prs_perslid_voorletters = rec_prs_upd.prs_perslid_voorletters,
                         prs_perslid_voornaam = NVL (rec_prs_upd.prs_perslid_voornaam, prs_perslid_voornaam),
                         prs_perslid_telefoonnr = rec_prs_upd.prs_perslid_telefoonnr,
                         prs_perslid_geslacht = rec_prs_upd.prs_perslid_geslacht,
                         prs_perslid_titel = rec_prs_upd.prs_perslid_titel,
                         prs_perslid_oslogin = rec_prs_upd.prs_perslid_oslogin,
                         prs_srtperslid_key = v_srtperslid_key,
                         prs_afdeling_key = v_afdeling_key,
                         prs_perslid_verwijder = NULL,
                         prs_perslid_email = rec_prs_upd.prs_perslid_email
                   WHERE prs_perslid_key = rec_prs_upd.prs_perslid_key
                     AND (   prs_perslid_naam != v_perslid_naam
                          OR NVL (prs_perslid_tussenvoegsel, '-') != NVL (v_perslid_tussenvoegsel, '-')
                         -- OR prs_perslid_voorletters != rec_prs_upd.prs_perslid_voorletters
                          OR NVL (prs_perslid_voornaam, '-') != NVL (rec_prs_upd.prs_perslid_voornaam, '-')
                          OR NVL (prs_perslid_telefoonnr, '-') != NVL (rec_prs_upd.prs_perslid_telefoonnr, '-')
                         -- OR prs_perslid_titel != rec_prs_upd.prs_perslid_titel
                          OR prs_srtperslid_key != v_srtperslid_key
                          OR prs_afdeling_key != v_afdeling_key
                          OR prs_perslid_email != rec_prs_upd.prs_perslid_email
                          OR NVL (prs_perslid_geslacht, 9) != NVL (rec_prs_upd.prs_perslid_geslacht, 9)
                          OR rec_prs_upd.prs_perslid_verwijder IS NOT NULL
                          OR NVL (prs_perslid_oslogin, '-') != NVL (rec_prs_upd.prs_perslid_oslogin, '-')
                         );
               END IF;
            EXCEPTION
               WHEN OTHERS
               THEN
                  oracle_err_num := SQLCODE;
                  oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                  v_errormsg := '(ORACLE error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                  v_errorhint := to_char(v_afdeling_key)||'|'||rec_prs_upd.prs_afdeling_naam||'|xxx {' || v_errormsg || '}; personeelsnummer: ' || rec_prs_upd.prs_perslid_nr;
                  v_update := FALSE;
                  fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
            END;
         END IF;

         -- *** Werkplek *******************************************************
         v_errorhint := 'Kan geen werkplek toevoegen';

         IF v_update AND (v_aktie = 'UPDATE')
         THEN
            -- bepaal aantal werkplekken
            BEGIN
               SELECT COUNT(*)
                 INTO v_nr_werkplek
                 FROM prs_perslidwerkplek
                WHERE prs_perslid_key = rec_prs_upd.prs_perslid_key;
            EXCEPTION
               WHEN OTHERS
               THEN
                  fac.imp_writelog (p_import_key,
                                    'I',
                                    v_errormsg,
                                       'Het aantal werkplekken kan niet bepaald worden?! personeelsnummer: '
                                    || rec_prs_upd.prs_perslid_nr
                                   );
                  v_update := FALSE;
            END;

            IF v_update AND v_nr_werkplek = 1
            THEN
               BEGIN

                  -- bepaal huidige alg_gebouw_key
                  SELECT alg_gebouw_key
                    INTO v_current_gebouw_key
                    FROM prs_v_werkplekperslid_gegevens pwg
                       , alg_gebouw g
                   WHERE prs_perslid_key = rec_prs_upd.prs_perslid_key
                     AND g.alg_gebouw_upper = pwg.alg_gebouw_upper
                     AND g.alg_gebouw_verwijder IS NULL;

                  -- bepaal nieuwe alg_gebouw_key
                  SELECT g.alg_gebouw_key
                    INTO v_new_gebouw_key
                    FROM fac_usrdata ud,
                         alg_gebouw g
                   WHERE ud.fac_usrtab_key = c_usrtab_key
                     AND ud.fac_usrdata_omschr = g.alg_gebouw_code
                     AND ud.fac_usrdata_code = rec_prs_upd.prs_afdeling_naam
                     AND g.alg_gebouw_verwijder IS NULL;

                  -- indien gelijk dan werkplek niet updaten.
                  v_update := (v_current_gebouw_key != v_new_gebouw_key);

               EXCEPTION
                  WHEN OTHERS
                  THEN
                     fac.imp_writelog (p_import_key,
                                       'I',
                                       v_errormsg,
                                          'huidige of nieuwe alg_gebouw_key kan niet bepaald worden?! personeelsnummer: '
                                       || rec_prs_upd.prs_perslid_nr
                                      );
                     v_update := FALSE;
               END;
            END IF;
         END IF;

         IF v_update AND (rec_prs_upd.prs_afdeling_naam IS NOT NULL)
                     AND ((v_aktie = 'INSERT') OR (v_aktie = 'UPDATE') AND (v_nr_werkplek<=1))
         THEN

            IF v_aktie = 'INSERT'
            THEN
               v_errormsg := 'Fout bij toewijzen werkplek bij zojuist toegevoegde persoon ';
            ELSE -- v_aktie = 'UPDATE'
               v_errormsg := 'Fout bij het wijzigen van de werkplek';
            END IF;

            BEGIN
               SELECT prs_perslid_key
                 INTO v_perslid_key
                 FROM prs_perslid
                WHERE LTRIM (prs_perslid_nr, '0') = LTRIM (rec_prs_upd.prs_perslid_nr, '0')
                  AND prs_perslid_verwijder IS NULL;
            EXCEPTION
               WHEN TOO_MANY_ROWS
               THEN
                  fac.imp_writelog (p_import_key,
                                    'I',
                                    v_errormsg,
                                    'Het personeelsnummer is niet uniek: ' || rec_prs_upd.prs_perslid_nr
                                   );

                  v_update := FALSE;
               WHEN OTHERS
               THEN
                  fac.imp_writelog (p_import_key,
                                    'I',
                                    v_errormsg,
                                       'De persoon kan niet bepaald worden?! personeelsnummer: '
                                    || rec_prs_upd.prs_perslid_nr
                                   );

                  v_update := FALSE;
            END;

            BEGIN

               SELECT g.alg_gebouw_key
                 INTO v_gebouw_key
                 FROM fac_usrdata ud, alg_gebouw g
                WHERE ud.fac_usrtab_key     = c_usrtab_key
                  AND ud.fac_usrdata_omschr = g.alg_gebouw_code
                  AND ud.fac_usrdata_code   = rec_prs_upd.prs_afdeling_naam
                  AND g.alg_gebouw_verwijder IS NULL;

            EXCEPTION
               WHEN OTHERS
               THEN
                  v_update := FALSE;

            END;

            IF NOT v_update
            THEN
               v_errorhint :=
                     'Onbekende Gebouw-omschrijving '
                  || rec_prs_upd.prs_afdeling_naam
                  || ';  personeelsnummer: '
                  || rec_prs_upd.prs_perslid_nr;
               fac.imp_writelog (p_import_key, 'I', v_errormsg, v_errorhint);
            ELSE

               BEGIN
                  v_errormsg := 'Bepalen alg_verdieping_key';

                  SELECT alg_verdieping_key
                    INTO v_verdieping_key
                    FROM alg_verdieping
                   WHERE alg_gebouw_key = v_gebouw_key AND alg_verdieping_verwijder IS NULL
                         AND alg_verdieping_volgnr = 0;   -- Begane grond!
               EXCEPTION
                  WHEN NO_DATA_FOUND
                  THEN
                     v_errorhint :=
                        'Persoon met persoonnummer ' || rec_prs_upd.prs_perslid_nr || ': toevoegen verdieping Onbekend';

                     INSERT INTO alg_verdieping
                                 (alg_gebouw_key, alg_verdieping_omschrijving, alg_verdieping_volgnr,
                                  alg_verdieping_code
                                 )
                          VALUES (v_gebouw_key, c_verdieping_omschr_default, 0,
                                  '0'
                                 );

                     -- Alsnog bepalen v_verdieping_key
                     SELECT alg_verdieping_key
                       INTO v_verdieping_key
                       FROM alg_verdieping
                      WHERE alg_gebouw_key = v_gebouw_key
                        AND alg_verdieping_verwijder IS NULL
                        AND alg_verdieping_volgnr = 0;   -- Begane grond!
               END;

               BEGIN
                  v_errorhint :=
                        'Persoon met persoonnummer '
                     || rec_prs_upd.prs_perslid_nr
                     || ': bepalen ruimte (ruimte zou bekend moeten zijn)';

                  SELECT alg_ruimte_nr, alg_ruimte_key
                    INTO v_ruimte_nr, v_ruimte_key
                    FROM alg_ruimte
                   WHERE alg_verdieping_key = v_verdieping_key
                     AND alg_ruimte_verwijder IS NULL
                     AND alg_ruimte_nr = c_ruimte_code;
               -- Altijd ruimte met deze notatie!
               EXCEPTION
                  WHEN NO_DATA_FOUND
                  THEN
                     INSERT INTO alg_ruimte
                                 (alg_verdieping_key, alg_srtruimte_key,   alg_ruimte_nr, alg_ruimte_omschrijving)
                          VALUES (v_verdieping_key,   c_srtruimte_default, c_ruimte_code, c_ruimte_omschr_default);

                     -- Alsnog bepalen v_ruimte_key
                     SELECT alg_ruimte_nr, alg_ruimte_key
                       INTO v_ruimte_nr, v_ruimte_key
                       FROM alg_ruimte
                      WHERE alg_verdieping_key = v_verdieping_key
                        AND alg_ruimte_verwijder IS NULL
                        AND alg_ruimte_nr = c_ruimte_code;
               -- Altijd ruimte met deze notatie!
               END;

-- *** IMPLICIETE WERKPLEK (NIEUW) *********************************************
               -- Persoon krijgt wp op fictieve of echte ruimte.
               v_errorhint := 'Fout bij bepalen vrije werkplek';

               SELECT COUNT ( * )
                 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_werkplek_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_werkplek_key, 100);
               ELSE
                  v_errorhint := 'Fout bij bepalen nieuwe werkplek';

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

                  v_werkplek_oms := v_ruimte_nr || '/' || TO_CHAR (v_werkplek_volgnr);
                  v_errorhint := 'Fout bij toevoegen nieuwe werkplek';

                  INSERT INTO prs_werkplek (prs_werkplek_module,
                                            prs_werkplek_volgnr,
                                            prs_werkplek_omschrijving,
                                            prs_alg_ruimte_key)
                       VALUES ('PRR',
                               v_werkplek_volgnr,
                               v_werkplek_oms,
                               v_ruimte_key)
                    RETURNING prs_werkplek_key
                         INTO v_werkplek_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_werkplek_key, 100);
               END IF;

---- *** EXPLICIETE WERKPLEK (OUD) ***********************************************
--               BEGIN
--                  v_errorhint :=
--                        'Persoon met persoonnummer '
--                     || rec_prs_upd.prs_perslid_nr
--                     || ': bepalen werkplek (werkplek zou bekend moeten zijn)';
--
--                  SELECT prs_werkplek_key
--                    INTO v_werkplek_key
--                    FROM prs_werkplek
--                   WHERE prs_alg_ruimte_key = v_ruimte_key
--                     AND prs_werkplek_verwijder IS NULL
--                     AND prs_werkplek_volgnr = c_werkplek_volgnr_default;
--               -- Altijd werkplek met deze notatie!
--               EXCEPTION
--                  WHEN NO_DATA_FOUND
--                  THEN
--                     INSERT INTO prs_werkplek
--                                 (prs_werkplek_volgnr, prs_werkplek_omschrijving, prs_alg_ruimte_key,
--                                  prs_werkplek_virtueel
--                                 )
--                          VALUES (c_werkplek_volgnr_default, c_prs_werkplek_omschrijving, v_ruimte_key,
--                                  1
--                                 );
--
--                     -- Alsnog bepalen v_werkplek_key
--                     SELECT prs_werkplek_key
--                       INTO v_werkplek_key
--                       FROM prs_werkplek
--                      WHERE prs_alg_ruimte_key = v_ruimte_key
--                        AND prs_werkplek_verwijder IS NULL
--                        AND prs_werkplek_volgnr = c_werkplek_volgnr_default;
--               -- Altijd werkplek met deze notatie!
--               END;
--
--               IF v_aktie = 'INSERT' OR (v_nr_werkplek = 0 AND v_aktie = 'UPDATE')
--               THEN
--                  INSERT INTO prs_perslidwerkplek
--                              (prs_perslid_key, prs_werkplek_key, prs_perslidwerkplek_bezetting
--                              )
--                       VALUES (v_perslid_key, v_werkplek_key, 0
--                              );
--               ELSE -- v_aktie = 'UPDATE' AND v_nr_werkplek = 1
--                  UPDATE prs_perslidwerkplek
--                     SET prs_werkplek_key = v_werkplek_key
--                   WHERE prs_perslid_key = v_perslid_key;
--               END IF;
            END IF;   -- gebouw
         END IF;   -- afdeling

         v_buffercount := v_buffercount + 1;

         IF v_buffercount >= c_commitbuffer
         THEN
            COMMIT;
            v_buffercount := 0;
         END IF;

      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            v_errorhint := 'perslid_nr:' || rec_prs_upd.prs_perslid_nr || ' gebouw:' || rec_prs_upd.prs_afdeling_naam || ' ' || v_errorhint || ' {' || v_errormsg || '}';
            v_errormsg := '(ORACLE error ' || oracle_err_num || '/' || oracle_err_mes || ')';
            fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
      END;
   END LOOP;

   SELECT COUNT (*)
     INTO v_perslid_newcount_fclt
     FROM prs_perslid
    WHERE prs_perslid_nr IS NOT NULL AND prs_perslid_verwijder IS NULL;

   fac.imp_writelog (p_import_key,
                     'S',
                        'Aantal actieve personen (met personeelsnr) vooraf: '
                     || TO_CHAR (v_perslid_count_fclt)
                     || '  nu: '
                     || TO_CHAR (v_perslid_newcount_fclt),
                     ''
                    );

   SELECT COUNT (*)
     INTO v_perslid_newcount_fclt   -- misbruik
     FROM prs_perslid
    WHERE prs_perslid_nr IS NULL AND prs_perslid_verwijder IS NULL;

   fac.imp_writelog (p_import_key,
                     'S',
                     'Aantal actieve personen zonder personeelsnr: ' || TO_CHAR (v_perslid_newcount_fclt),
                     ''
                    );

  -- plaats medewerkers die nog niet in de default groep zitten in de default groep.
  INSERT INTO fac_gebruikersgroep
              (fac_groep_key, prs_perslid_key)
     (SELECT 1, prs_perslid_key
        FROM prs_perslid p
       WHERE prs_perslid_oslogin IS NOT NULL
         AND prs_perslid_verwijder IS NULL
         AND NOT EXISTS (
                SELECT prs_perslid_key
                  FROM fac_gebruikersgroep gg
                 WHERE fac_groep_key = 1
                   AND p.prs_perslid_key = gg.prs_perslid_key));

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


CREATE OR REPLACE VIEW CWTD_V_NOTI_CNTREMINDER
(CODE, SENDER, RECEIVER, TEXT, KEY,
 PAR1, PAR2, XKEY)
AS
SELECT '', '', 7282,
             '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 trunc(SYSDATE) = trunc(cnt.cnt_getrappeldatum(c.cnt_contract_key));

-- backoffice bezoekers rapport (tbv notificatie naar gebouwadres)      
CREATE OR REPLACE VIEW CWTD_V_RAP_BEZBO
(
   datum,
   van,
   tot,
   bezoeker,
   bedrijf,
   Parkeerplaats,
   Contactpersoon,
   Gastheer_vrouw,
   Telefoon,
   Ruimte,
   Actie,
   Opmerking,
   Gebouw_code,
   extra_key
)
AS
   SELECT TO_CHAR (bez_afspraak_datum, 'DD-MM-YYYY') datum,
          TO_CHAR (bez_afspraak_datum, 'HH24:MI') van,
          TO_CHAR (bez_afspraak_eind, 'HH24:MI') tot,
          bez_afspraak_naam Bezoeker,
          bez_afspraak_bedrijf Bedrijf,
          NVL2 (rd.res_rsv_deel_key, 'Ja', NULL) parkeer,
          p.prs_perslid_naam_full Contactpersoon,
          bez_afspraak_gastheer Gastheer_vrouw,
          COALESCE (p2.prs_perslid_telefoonnr, p2.prs_perslid_mobiel),
             aog.alg_gebouw_code
          || ' '
          || aog.alg_verdieping_code
          || ' '
          || aog.alg_ruimte_nr
             ruimte,
          bez_actie_omschrijving actie,
          ba.bez_afspraak_opmerking opmerking,
          aog.alg_gebouw_code,
          aog.alg_gebouw_key
     FROM bez_afspraak ba,
          bez_bezoekers bb,
          bez_actie bac,
          alg_v_allonrgoed_gegevens aog,
          res_rsv_deel rd,
          prs_v_perslid_fullnames_all p,
          prs_perslid p2
    WHERE TRUNC (bez_afspraak_datum) = TRUNC (SYSDATE + 1)
      AND bb.bez_afspraak_key = ba.bez_afspraak_key
      AND ba.bez_actie_key = bac.bez_actie_key
      AND aog.alg_onroerendgoed_keys = ba.alg_onrgoed_keys
      AND bb.bez_bezoekers_key = rd.bez_bezoekers_key(+)
      AND ba.bez_afspraak_contact_key = p.prs_perslid_key
      AND p2.prs_perslid_key(+) = ba.bez_afspraak_host_key;




--create view controle acties in FACILITOR
CREATE OR REPLACE VIEW CWTD_V_RAP_GUI_COUNTER
(
    FAC_GUI_COUNTER_KEY,
    FAC_GUI_COUNTER_GROUP,
    FAC_GUI_COUNTER_INFO,
    FAC_GUI_COUNTER_REFKEY,
    FAC_GUI_COUNTER_CHOICE,
    FAC_GUI_COUNTER_RESULT,
    FAC_GUI_COUNTER_DATE,
    PRS_PERSLID_KEY,
    PRS_PERSLID_NAAM_FULL,
    PRS_AFDELING_OMSCHRIJVING,
    PRS_BEDRIJF_NAAM
)
AS
    SELECT fgc.fac_gui_counter_key,
           fgc.fac_gui_counter_group,
           fgc.fac_gui_counter_info,
           fgc.fac_gui_counter_refkey,
           choice.fac_gui_counter_info fac_gui_counter_choice,
           result.fac_gui_counter_info fac_gui_counter_result,
           fac_gui_counter_date,
           fgc.prs_perslid_key,
           prs_perslid_naam_full,
           afd.prs_afdeling_omschrijving,
           bedr.prs_bedrijf_naam
      FROM fac_gui_counter          fgc,
           prs_v_perslid_fullnames  pf,
           prs_perslid              pr,
           prs_afdeling             afd,
           prs_bedrijf              bedr,
           (SELECT fac_gui_counter_refkey, fac_gui_counter_info
              FROM fac_gui_counter fgc
             WHERE     fac_gui_counter_info IS NOT NULL
                   AND fac_gui_counter_group = 'searchchoice') choice,
           (SELECT fac_gui_counter_refkey, fac_gui_counter_info
              FROM fac_gui_counter fgc
             WHERE     fac_gui_counter_info IS NOT NULL
                   AND fac_gui_counter_group = 'searchresult') result
     WHERE     fac_gui_counter_group = 'search'
           AND fgc.fac_gui_counter_info IS NOT NULL
           AND fgc.prs_perslid_key = pf.prs_perslid_key
           AND choice.fac_gui_counter_refkey(+) = fgc.fac_gui_counter_key
           AND result.fac_gui_counter_refkey(+) = fgc.fac_gui_counter_key
           AND pr.prs_perslid_key = fgc.prs_perslid_key
           AND afd.PRS_AFDELING_KEY = pr.prs_afdeling_key
           AND bedr.prs_bedrijf_key = afd.prs_bedrijf_key 
    UNION ALL
    SELECT fgc.fac_gui_counter_key,
           fgc.fac_gui_counter_group,
           fac_usrrap_omschrijving,
           fgc.fac_gui_counter_refkey,
           NULL,
           NULL,
           fac_gui_counter_date,
           fgc.prs_perslid_key,
           prs_perslid_naam_full,
           afd.prs_afdeling_omschrijving,
           bedr.prs_bedrijf_naam
      FROM fac_gui_counter fgc,
           prs_v_perslid_fullnames pf, 
           fac_usrrap fr,
           prs_afdeling  afd,
           prs_perslid              pr,
           prs_bedrijf   bedr
     WHERE     fgc.fac_gui_counter_group = 'report'
           AND fgc.prs_perslid_key = pf.prs_perslid_key(+)
           AND fr.fac_usrrap_key(+) = fgc.fac_gui_counter_refkey
           AND pr.prs_perslid_key = fgc.prs_perslid_key
           AND afd.PRS_AFDELING_KEY = pr.prs_afdeling_key
           AND bedr.prs_bedrijf_key = afd.prs_bedrijf_key          
    UNION ALL
    SELECT fgc.fac_gui_counter_key,
           fgc.fac_gui_counter_group,
           COALESCE (fac_menu_altlabel, lcl.l (fac_menuitems_label)),
           fgc.fac_gui_counter_refkey,
           NULL,
           NULL,
           fac_gui_counter_date,
           fgc.prs_perslid_key,
           prs_perslid_naam_full,
           afd.prs_afdeling_omschrijving,
           bedr.prs_bedrijf_naam
      FROM fac_gui_counter          fgc,
           prs_v_perslid_fullnames  pf,
           prs_afdeling             afd,
           prs_bedrijf              bedr,
           prs_perslid              pr,
           fac_menu                 m,
           fac_menuitems            mi
     WHERE     fgc.fac_gui_counter_group = 'menu'
           AND fgc.prs_perslid_key = pf.prs_perslid_key(+)
           AND m.fac_menu_key = fac_gui_counter_refkey
           AND mi.fac_menuitems_key(+) = m.fac_menuitems_key
           AND pr.prs_perslid_key = fgc.prs_perslid_key
           AND afd.PRS_AFDELING_KEY = pr.prs_afdeling_key
           AND bedr.prs_bedrijf_key = afd.prs_bedrijf_key;



-- Lastminute afspraken ook notificeren op de dag zelf
-- Key 14 = BEZMUT      
CREATE OR REPLACE FORCE VIEW CWTD_V_NOTI_BEZBO_LASTMIN
(
   CODE,
   SENDER,
   RECEIVER,
   TEXT,
   KEY,
   XKEY,
   XEMAIL,
   XMOBILE
)
AS
   SELECT 'BEZMUT',
          NULL,
          NULL,
          'Last minute bezoekerafspraak toegevoegd: '
          || g.alg_gebouw_omschrijving,
          ba.bez_afspraak_key,
          null,
          g.alg_gebouw_email,
          NULL
     FROM bez_afspraak ba,
          alg_v_allonrgoed_gegevens aog,
          alg_gebouw g,
          fac_tracking tr
    WHERE TRUNC (bez_afspraak_datum) = TRUNC (SYSDATE)
      AND aog.alg_onroerendgoed_keys = ba.alg_onrgoed_keys
      AND g.alg_gebouw_key = aog.alg_gebouw_key
      AND g.alg_gebouw_email IS NOT NULL
      AND tr.fac_tracking_refkey = ba.bez_afspraak_key
      AND tr.fac_srtnotificatie_key = 14
      AND tr.fac_tracking_datum > sysdate -1/24;      

-- Stuur elke dag een overzicht van bezoekers naar gebouwadres     
CREATE OR REPLACE VIEW CWTD_V_NOTI_BEZBO
(
   CODE,
   SENDER,
   RECEIVER,
   TEXT,
   KEY,
   XKEY,
   XEMAIL,
   XMOBILE
)
AS
   SELECT 'CUST01',
          NULL,
          NULL,
             'Bezoekers overzicht '
          || g.alg_gebouw_omschrijving
          || ' '
          || TRUNC (SYSDATE + 1),
          (SELECT fac_usrrap_key
             FROM fac_usrrap
            WHERE fac_usrrap_view_name = 'CWTD_V_RAP_BEZBO'),
          g.alg_gebouw_key,
          g.alg_gebouw_email,
          NULL
     FROM alg_gebouw g
    WHERE g.alg_gebouw_email IS NOT NULL;      

-- CWTD#36142
CREATE OR REPLACE PROCEDURE cwtd_processemail ( pfrom      IN VARCHAR2,
                                                pto        IN VARCHAR2,
                                                psubject   IN VARCHAR2,
                                                pbody      IN VARCHAR2,
                                                psessionid IN VARCHAR2,
                                                puserkey   IN NUMBER DEFAULT NULL)
AS
   v_count              NUMBER;
   sender               prs_perslid.prs_perslid_key%TYPE;
   kostenplaats         prs_afdeling.prs_kostenplaats_key%TYPE;
   newkey               mld_melding.mld_melding_key%TYPE;
   defaultstdmelding    fac_setting.fac_setting_default%TYPE;
   kkey                 mld_kenmerk.mld_kenmerk_key%TYPE;
   errormsg             fac_result.fac_result_waarde%TYPE;
BEGIN
   -- Valideer de sender in pfrom: kennen we deze?
   SELECT COUNT(*)
     INTO v_count
     FROM prs_perslid p, prs_afdeling d
    WHERE p.prs_afdeling_key = d.prs_afdeling_key
      AND UPPER (prs_perslid_email) = UPPER (pfrom);

   -- Bekende afzender --> dat is de melder
   IF (v_count = 1)
   THEN
      SELECT prs_perslid_key, d.prs_kostenplaats_key
        INTO sender, kostenplaats
        FROM prs_perslid p, prs_afdeling d
       WHERE p.prs_afdeling_key = d.prs_afdeling_key
         AND UPPER (prs_perslid_email) = UPPER (pfrom);
   -- Geen bekende afzender --> _FACILITOR
   ELSE
      SELECT prs_perslid_key, d.prs_kostenplaats_key
        INTO sender, kostenplaats
        FROM prs_perslid p, prs_afdeling d
       WHERE p.prs_afdeling_key = d.prs_afdeling_key
         AND prs_perslid_key = 4;
   END IF;

   CASE
      WHEN UPPER (pto) LIKE 'MELDINGENFMBENELUX@%'
      THEN
         defaultstdmelding := fac.getsetting ('defaultstdmelding');

         -- suggested extensions:
         -- check for MLDUSE-write autorisations
         -- parse the subject to find an appropriate stdmelding, if uniquely possible
         -- append (as a note?) to an existing melding if #key is found in the subject
         BEGIN
            INSERT INTO mld_melding (mld_melding_module,
                                     mld_meldbron_key,
                                     mld_melding_datum,
                                     mld_melding_onderwerp,
                                     mld_melding_omschrijving,
                                     mld_melding_status,
                                     mld_stdmelding_key,
                                     mld_alg_locatie_key,
                                     prs_perslid_key,
                                     prs_perslid_key_voor,
                                     prs_kostenplaats_key,
                                     mld_melding_spoed)
                VALUES ('MLD',
                        4,                                            -- email
                        SYSDATE,
                        SUBSTR ( psubject, 1, 60),
                        SUBSTR (
                           REPLACE (
                              SUBSTR (pbody, 1, 4000),
                              CHR (13) || CHR (10) || CHR (13) || CHR (10),
                              CHR (13) || CHR (10)),
                           1,
                           4000),               -- verwijder onnodige witregels
                        NULL,
                        defaultstdmelding,
                        1062,                   -- Brussels Woluwe HQ
                        sender,
                        sender,
                        kostenplaats,
                        3)
             RETURNING mld_melding_key
                  INTO newkey;

            -- find the lowest volgnummer of the flexfield of type folder.
            SELECT MIN (mld_kenmerk_key)
              INTO kkey
              FROM mld_kenmerk k,
                   mld_srtkenmerk sk,
                   mld_stdmelding std,
                   ins_tab_discipline d
             WHERE mld_srtkenmerk_kenmerktype = 'M'
               AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
               AND std.mld_stdmelding_key = defaultstdmelding
               AND std.mld_ins_discipline_key = d.ins_discipline_key
               AND (   (k.mld_kenmerk_niveau = 'S' AND k.mld_stdmelding_key = std.mld_stdmelding_key)
                    OR (k.mld_kenmerk_niveau = 'D' AND k.mld_stdmelding_key = d.ins_discipline_key)
                    OR (k.mld_kenmerk_niveau = 'T' AND k.mld_stdmelding_key = d.ins_srtdiscipline_key) )
               AND k.mld_kenmerk_verwijder IS NULL
               AND NOT EXISTS
                  (  SELECT mld_kenmerk_volgnummer
                       FROM mld_kenmerk k1,
                            mld_srtkenmerk sk1,
                            mld_stdmelding std1,
                            ins_tab_discipline d1
                      WHERE sk1.mld_srtkenmerk_kenmerktype = 'M'
                            AND sk1.mld_srtkenmerk_key = k1.mld_srtkenmerk_key
                            AND std1.mld_stdmelding_key = defaultstdmelding
                            AND std1.mld_ins_discipline_key = d1.ins_discipline_key
                            AND (   (k1.mld_kenmerk_niveau = 'S' AND k1.mld_stdmelding_key = std1.mld_stdmelding_key)
                                 OR (k1.mld_kenmerk_niveau = 'D' AND k1.mld_stdmelding_key = d1.ins_discipline_key)
                                 OR (k1.mld_kenmerk_niveau = 'T' AND k1.mld_stdmelding_key = d1.ins_srtdiscipline_key) )
                            AND k1.mld_kenmerk_verwijder IS NULL
                            AND k1.mld_kenmerk_volgnummer > k.mld_kenmerk_volgnummer);

            IF kkey IS NOT NULL
            THEN
               INSERT INTO fac_result (fac_result_sessionid,
                                       fac_result_naam,
                                       fac_result_waarde)
                   VALUES (psessionid,
                           'kenmerkpath',
                           'MLD\M' || to_char( TRUNC(newkey/1000), 'FM0000') || '___\M' || newkey || '\' || kkey || '\');
            END IF;

            mld.setmeldingstatus (newkey, 2, sender);
            INSERT INTO fac_result (
               fac_result_sessionid,
               fac_result_naam,
               fac_result_waarde)
            VALUES (psessionid, 'maillog', 'Geregistreerd onder melding ' || newkey);
         END;
      ELSE
         NULL;
   END CASE;

   IF errormsg IS NOT NULL
   THEN
      INSERT INTO fac_result (fac_result_sessionid,
                              fac_result_naam,
                              fac_result_waarde)
          VALUES (psessionid, 'errormsg', errormsg);
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      fac.writelog (
               'PROCESSEMAIL',
               'W',
                  'Mail kon niet verwerkt worden afzender: ' || pfrom
               || '[' || errormsg || ']',
                  'OTHERS (error ' || SQLCODE || '/' || SUBSTR (SQLERRM, 1, 100)
               || ')');
      INSERT INTO fac_result (fac_result_sessionid,
                              fac_result_naam,
                              fac_result_waarde)
          VALUES (psessionid,
                  'errormsg',
                  'Database fout - Neem contact op met uw systeembeheerder');
END cwtd_processemail;
/

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