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

set echo on

spool atch_import_prs.lst

CREATE TABLE atch_imp_prs (
   prs_perslid_nr VARCHAR2 (256),
   prs_perslid_naam VARCHAR2 (256),
   prs_perslid_tussenvoegsel VARCHAR2 (256),
   prs_perslid_voorletters VARCHAR2 (256),
   prs_perslid_voornaam VARCHAR2 (256),
   prs_afdeling_naam VARCHAR2 (256),
   prs_srtperslid_omschrijving VARCHAR2 (256),
   alg_locatie_code VARCHAR2 (256),
   alg_gebouw_code VARCHAR2 (256),
   alg_verdieping_volgnr VARCHAR2 (256),
   alg_ruimte_nr VARCHAR2 (256),
   prs_perslid_telefoonnr VARCHAR2 (256),
   prs_perslid_email VARCHAR2 (256),
   prs_perslid_ingangsdatum DATE,
   prs_perslid_einddatum DATE,
   prs_perslid_oslogin VARCHAR2 (256),
   prs_perslid_wachtwoord VARCHAR2 (256),
   prs_perslid_kenmerk1   VARCHAR2 (256),
	 prs_perslid_kenmerk2   VARCHAR2 (256),
	 prs_perslid_kenmerk3   VARCHAR2 (256),
	 prs_perslid_kenmerk4   VARCHAR2 (256),
	 prs_perslid_kenmerk5   VARCHAR2 (256),
	 prs_perslid_kenmerk6   VARCHAR2 (256),
	 prs_perslid_kenmerk7   VARCHAR2 (256),
	 prs_perslid_kenmerk8   VARCHAR2 (256),
	 prs_perslid_kenmerk9   VARCHAR2 (256),
	 prs_perslid_kenmerk10  VARCHAR2 (256)
);

INSERT INTO fac_import_app
            (fac_import_app_code, fac_import_app_oms,
             fac_functie_key)
   SELECT 'PRS', 'Import persoonsgegevens uit HRM systeem',
          fac_functie_key
     FROM fac_functie
    WHERE fac_functie_code = 'WEB_PRSSYS';



CREATE OR REPLACE VIEW atch_v_import_log
AS
   SELECT imp_log_status fclt_f_status,
          imp_log_omschrijving omschrijving,
          imp_log_hint opmerking
   FROM imp_log
   WHERE imp_log_applicatie = 'PRS';


CREATE OR REPLACE PROCEDURE atch_import_prs (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
IS
   c_fielddelimitor                VARCHAR2 (1)    := ';';
   -- LET OP: moet idem zijn als declaratie bij atch_UPDATE_PRS
   c_first_import                  VARCHAR2 (30)   := 'Initiele import';
   v_newline                       VARCHAR2 (1000);             -- Input line
   v_aanduiding                    VARCHAR2 (200);
   v_errorhint                     VARCHAR2 (1000);
   v_errormsg                      VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER := 0;
   v_ongeldig                      NUMBER (1);
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_count                         NUMBER;
   -- De importvelden:
   v_prs_perslid_nr                VARCHAR2 (256);
   v_prs_perslid_naam              VARCHAR2 (256);
   v_prs_perslid_tussenvoegsel     VARCHAR2 (256);
   v_prs_perslid_voorletters       VARCHAR2 (256);
   v_prs_perslid_voornaam          VARCHAR2 (256);
   v_prs_afdeling_naam             VARCHAR2 (256);
   v_prs_srtperslid_omschrijving   VARCHAR2 (256);
   v_prs_perslid_telefoonnr        VARCHAR2 (256);
   v_prs_perslid_email             VARCHAR2 (256);
   v_prs_perslid_oslogin           VARCHAR2 (256);
   v_prs_perslid_wachtwoord        VARCHAR2 (256);
   
	 v_prs_perslid_kenmerk1         VARCHAR2 (256);
	 v_prs_perslid_kenmerk2         VARCHAR2 (256);
	 v_prs_perslid_kenmerk3         VARCHAR2 (256);
	 v_prs_perslid_kenmerk4         VARCHAR2 (256);
	 v_prs_perslid_kenmerk5         VARCHAR2 (256);
	 v_prs_perslid_kenmerk6         VARCHAR2 (256);
	 v_prs_perslid_kenmerk7         VARCHAR2 (256);
	 v_prs_perslid_kenmerk8         VARCHAR2 (256);
	 v_prs_perslid_kenmerk9         VARCHAR2 (256);
	 v_prs_perslid_kenmerk10        VARCHAR2 (256);
                 
                 
-- !!!!!!!!!!!!!!!!!!!!!!!                 
-- !!LET OP!!
-- 1) Kenmerken doen alleen mee voor nieuwe personen, dus werken alleen voor de 1e keer bij aanmaak nieuwe persoon
--    Kenmerken worden dus bij bestaande personen (nog) NIET bijgewerkt!!
-- 2) Dit zijn platte kenmerken, dus GEEN referentie kenmerken (hiervoor is deze import functie niet geschikt gemaakt
-- !!!!!!!!!!!!!!!!!!!!!!!                 

	 v_prs_perslid_kenmerk_naam1         VARCHAR2 (256) :='BSN'             ;
	 v_prs_perslid_kenmerk_naam2         VARCHAR2 (256) :='MEISJESNAAM'     ;
	 v_prs_perslid_kenmerk_naam3         VARCHAR2 (256) :='GEBOORTEDATUM'   ;
	 v_prs_perslid_kenmerk_naam4         VARCHAR2 (256) :='ADRES'           ;
	 v_prs_perslid_kenmerk_naam5         VARCHAR2 (256) :='HUISNR'        ;
	 v_prs_perslid_kenmerk_naam6         VARCHAR2 (256) :='POSTCODE'        ;
	 v_prs_perslid_kenmerk_naam7         VARCHAR2 (256) :='WOONPLAATS'      ;
	 v_prs_perslid_kenmerk_naam8         VARCHAR2 (256) :='TELEFOON (THUIS)';
	 v_prs_perslid_kenmerk_naam9         VARCHAR2 (256) :='BIJZONDERHEDEN'  ;
	 v_prs_perslid_kenmerk_naam10         VARCHAR2 (256):='LEEG'            ;
	 
                               
                               
	 v_prs_perslid_kenmerk1_len NUMBER(10) := 15 ;
	 v_prs_perslid_kenmerk2_len NUMBER(10) := 50 ;
	 v_prs_perslid_kenmerk3_len NUMBER(10) := 15 ;
	 v_prs_perslid_kenmerk4_len NUMBER(10) := 50 ;
	 v_prs_perslid_kenmerk5_len NUMBER(10) := 7 ;
	 v_prs_perslid_kenmerk6_len NUMBER(10) := 7 ;
	 v_prs_perslid_kenmerk7_len NUMBER(10) := 50 ;
	 v_prs_perslid_kenmerk8_len NUMBER(10) := 20 ;
	 v_prs_perslid_kenmerk9_len NUMBER(10) := 250;
	 v_prs_perslid_kenmerk10_len NUMBER(10) := 0;
	 
   
   -- Overig:
   v_alg_locatie_code              VARCHAR2 (256);
   v_alg_gebouw_code               VARCHAR2 (256);


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

   IF (v_count = 0)
   THEN
      fac.imp_writelog
              (p_applname,
               p_applrun,
               'I',
               c_first_import,
               'Controle importbestand op aantal personen wordt overgeslagen'
              );
      COMMIT;
   ELSE
      DELETE FROM imp_log
            WHERE imp_log_applicatie = p_applname;
   END IF;

   DELETE FROM atch_imp_prs;

   COMMIT;

   v_count_tot := 0;
   v_count_import := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_aanduiding := '';
         v_errorhint := 'Fout bij opvragen te importeren rij';
         v_ongeldig := 0;
         -- Lees alle veldwaarden
         
         -- 01
         fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_locatie_code);
         -- 02
         fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_gebouw_code);
         -- 03
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_afdeling_naam);
         -- 04
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_naam);
         -- 05
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_tussenvoegsel);
         -- 06
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_voorletters);
         -- 07
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_voornaam);
         -- 08
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_telefoonnr);
         -- 09
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_email);
         -- 10
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_srtperslid_omschrijving);
         -- 11
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_nr);
				 -- 12
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_oslogin);
         -- 13
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_wachtwoord);
         
         -- Flexprops voor de personen...
         
         -- 14
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_kenmerk1);
         -- 15
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_kenmerk2);
         -- 16
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_kenmerk3);
         -- 17
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_kenmerk4);
         -- 18
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_kenmerk5);
         -- 19
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_kenmerk6);
         -- 20
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_kenmerk7);
         -- 21
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_kenmerk8);
         -- 22
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_kenmerk9);
         -- 23
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_kenmerk10);
         
         
         
         --
         v_aanduiding :=
               '['
            || v_prs_perslid_nr
            || '|'
            || v_prs_perslid_naam
            || '|'
            || v_prs_perslid_tussenvoegsel
            || '|'
            || v_prs_perslid_voornaam
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_alg_locatie_code) = 'LOCATIECODE'
               AND UPPER (v_alg_gebouw_code) = 'GEBOUWCODE'
               AND UPPER (v_prs_afdeling_naam) = 'AFDELINGSCODE'
            	 AND UPPER (v_prs_perslid_naam) = 'PERSOONACHTERNAAM'
               AND UPPER (v_prs_perslid_tussenvoegsel) = 'TUSSENVOEGSEL'
               AND UPPER (v_prs_perslid_voorletters) = 'VOORLETTERS'
               AND UPPER (v_prs_perslid_voornaam) = 'VOORNAAM'
               AND UPPER (v_prs_perslid_telefoonnr) = 'TELEFOONNUMMER (WERK)'
               AND UPPER (v_prs_perslid_email) = 'EMAIL'
               AND UPPER (v_prs_srtperslid_omschrijving) = 'FUNCTIE'
               AND UPPER (v_prs_perslid_nr) = 'PERSONEELSNUMMER'
               AND UPPER (v_prs_perslid_oslogin) = 'LOGINNAAM'
               AND UPPER (v_prs_perslid_wachtwoord) = 'PASSWORD'
               AND UPPER (v_prs_perslid_kenmerk1) = UPPER(v_prs_perslid_kenmerk_naam1)
               AND UPPER (v_prs_perslid_kenmerk2) = UPPER(v_prs_perslid_kenmerk_naam2)
               AND UPPER (v_prs_perslid_kenmerk3) = UPPER(v_prs_perslid_kenmerk_naam3)
               AND UPPER (v_prs_perslid_kenmerk4) = UPPER(v_prs_perslid_kenmerk_naam4)
               AND UPPER (v_prs_perslid_kenmerk5) = UPPER(v_prs_perslid_kenmerk_naam5)
               AND UPPER (v_prs_perslid_kenmerk6) = UPPER(v_prs_perslid_kenmerk_naam6)
               AND UPPER (v_prs_perslid_kenmerk7) = UPPER(v_prs_perslid_kenmerk_naam7)
               AND UPPER (v_prs_perslid_kenmerk8) = UPPER(v_prs_perslid_kenmerk_naam8)
               AND UPPER (v_prs_perslid_kenmerk9) = UPPER(v_prs_perslid_kenmerk_naam9)
               AND UPPER (v_prs_perslid_kenmerk10)= UPPER(v_prs_perslid_kenmerk_naam10)
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errorhint := 'Ongeldig personeelsnummer';
            v_prs_perslid_nr := TRIM (v_prs_perslid_nr);

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

            --
            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_applname,
                                 p_applrun,
                                 '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_applname,
                               p_applrun,
                               'E',
                               v_aanduiding || 'Naam onbekend',
                               'Naam is verplicht; regel wordt overgeslagen!'
                              );
               END IF;
            END IF;
            COMMIT;

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

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

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

            IF LENGTH (v_prs_perslid_voorletters) > 10
            THEN
               v_prs_perslid_voorletters :=
                                    SUBSTR (v_prs_perslid_voorletters, 1, 10);
               fac.imp_writelog (p_applname,
                                 p_applrun,
                                 '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_applname,
                                 p_applrun,
                                 'W',
                                 v_aanduiding || 'Voornaam is te lang',
                                    'Voornaam wordt afgebroken tot ['
                                 || v_prs_perslid_voornaam
                                 || ']'
                                );
            ELSE
               IF (v_prs_perslid_voornaam IS NULL)
               THEN
                  v_prs_perslid_voornaam := '-';
                  fac.imp_writelog
                          (p_applname,
                           p_applrun,
                           'W',
                           v_aanduiding || 'Voornaam onbekend',
                           'Voornaam wordt gezet op [-]'
                          );
               END IF;
            END IF;
            COMMIT;

            --
            v_errorhint := 'Ongeldige afdelingscode';
            v_prs_afdeling_naam := TRIM (v_prs_afdeling_naam);

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

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

            IF LENGTH (v_prs_srtperslid_omschrijving) > 30
            THEN
               v_prs_srtperslid_omschrijving :=
                                SUBSTR (v_prs_srtperslid_omschrijving, 1, 30);
               fac.imp_writelog (p_applname,
                                 p_applrun,
                                 '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_applname,
                            p_applrun,
                            '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_applname,
                                 p_applrun,
                                 '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_applname,
                                 p_applrun,
                                 'W',
                                 v_aanduiding || 'Gebouwcode te lang',
                                    'Gebouwcode wordt afgebroken tot ['
                                 || v_alg_gebouw_code
                                 || ']'
                                );
               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_applname,
                                 p_applrun,
                                 'W',
                                 v_aanduiding || 'Telefoonnummer te lang',
                                    'Telefoonnummer wordt afgebroken tot ['
                                 || v_prs_perslid_telefoonnr
                                 || ']'
                                );
               COMMIT;
            END IF;

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

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

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

            IF LENGTH (v_prs_perslid_oslogin) > 30
            THEN
               v_prs_perslid_oslogin := SUBSTR (v_prs_perslid_oslogin, 1, 30);
               fac.imp_writelog (p_applname,
                                 p_applrun,
                                 'W',
                                 v_aanduiding || 'Loginnaam te lang',
                                    'Loginnaam wordt afgebroken tot ['
                                 || v_prs_perslid_oslogin
                                 || ']'
                                );
               COMMIT;
            END IF;

            --
            v_errorhint := 'Ongeldig wachtwoord';
            v_prs_perslid_wachtwoord := TRIM (v_prs_perslid_wachtwoord);

            IF LENGTH (v_prs_perslid_wachtwoord) > 30
            THEN
               v_prs_perslid_wachtwoord := SUBSTR (v_prs_perslid_wachtwoord, 1, 30);
               fac.imp_writelog (p_applname,
                                 p_applrun,
                                 'W',
                                 v_aanduiding || 'Wachtwoord te lang',
                                    'Wachtwoord wordt afgebroken tot ['
                                 || v_prs_perslid_wachtwoord
                                 || ']'
                                );
               COMMIT;
            END IF;
            
            
            v_errorhint := 'Ongeldig kenmerk1';
            v_prs_perslid_kenmerk1 := TRIM (v_prs_perslid_kenmerk1);

            IF LENGTH (v_prs_perslid_kenmerk1) > v_prs_perslid_kenmerk1_len
            THEN
               v_prs_perslid_kenmerk1 := SUBSTR (v_prs_perslid_kenmerk1, 1, v_prs_perslid_kenmerk1_len);
               fac.imp_writelog (p_applname,
                                 p_applrun,
                                 'W',
                                 v_aanduiding || 'Kenmerk1 te lang',
                                    '... wordt afgebroken tot ['
                                 || v_prs_perslid_kenmerk1
                                 || ']'
                                );
               COMMIT;
            END IF;
            
            v_errorhint := 'Ongeldig kenmerk2';
            v_prs_perslid_kenmerk2 := TRIM (v_prs_perslid_kenmerk2);

            IF LENGTH (v_prs_perslid_kenmerk2) > v_prs_perslid_kenmerk2_len
            THEN
               v_prs_perslid_kenmerk2 := SUBSTR (v_prs_perslid_kenmerk2, 1, v_prs_perslid_kenmerk2_len);
               fac.imp_writelog (p_applname,
                                 p_applrun,
                                 'W',
                                 v_aanduiding || 'kenmerk2 te lang',
                                    '... wordt afgebroken tot ['
                                 || v_prs_perslid_kenmerk2
                                 || ']'
                                );
               COMMIT;
            END IF;
            
            v_errorhint := 'Ongeldig kenmerk3';
            v_prs_perslid_kenmerk3 := TRIM (v_prs_perslid_kenmerk3);

            IF LENGTH (v_prs_perslid_kenmerk3) > v_prs_perslid_kenmerk3_len
            THEN
               v_prs_perslid_kenmerk3 := SUBSTR (v_prs_perslid_kenmerk3, 1, v_prs_perslid_kenmerk3_len);
               fac.imp_writelog (p_applname,
                                 p_applrun,
                                 'W',
                                 v_aanduiding || 'kenmerk3 te lang',
                                    '... wordt afgebroken tot ['
                                 || v_prs_perslid_kenmerk3
                                 || ']'
                                );
               COMMIT;
            END IF;
            v_errorhint := 'Ongeldig kenmerk4';
            v_prs_perslid_kenmerk4 := TRIM (v_prs_perslid_kenmerk4);

            IF LENGTH (v_prs_perslid_kenmerk4) > v_prs_perslid_kenmerk4_len
            THEN
               v_prs_perslid_kenmerk4 := SUBSTR (v_prs_perslid_kenmerk4, 1, v_prs_perslid_kenmerk4_len);
               fac.imp_writelog (p_applname,
                                 p_applrun,
                                 'W',
                                 v_aanduiding || 'kenmerk4 te lang',
                                    '... wordt afgebroken tot ['
                                 || v_prs_perslid_kenmerk4
                                 || ']'
                                );
               COMMIT;
            END IF;
            v_errorhint := 'Ongeldig kenmerk5';
            v_prs_perslid_kenmerk5 := TRIM (v_prs_perslid_kenmerk5);

            IF LENGTH (v_prs_perslid_kenmerk5) > v_prs_perslid_kenmerk5_len
            THEN
               v_prs_perslid_kenmerk5 := SUBSTR (v_prs_perslid_kenmerk5, 1, v_prs_perslid_kenmerk5_len);
               fac.imp_writelog (p_applname,
                                 p_applrun,
                                 'W',
                                 v_aanduiding || 'kenmerk5 te lang',
                                    '... wordt afgebroken tot ['
                                 || v_prs_perslid_kenmerk5
                                 || ']'
                                );
               COMMIT;
            END IF;
            v_errorhint := 'Ongeldig kenmerk6';
            v_prs_perslid_kenmerk6 := TRIM (v_prs_perslid_kenmerk6);

            IF LENGTH (v_prs_perslid_kenmerk6) > v_prs_perslid_kenmerk6_len
            THEN
               v_prs_perslid_kenmerk6 := SUBSTR (v_prs_perslid_kenmerk6, 1, v_prs_perslid_kenmerk6_len);
               fac.imp_writelog (p_applname,
                                 p_applrun,
                                 'W',
                                 v_aanduiding || 'kenmerk6 te lang',
                                    '... wordt afgebroken tot ['
                                 || v_prs_perslid_kenmerk6
                                 || ']'
                                );
               COMMIT;
            END IF;
            v_errorhint := 'Ongeldig kenmerk7';
            v_prs_perslid_kenmerk7 := TRIM (v_prs_perslid_kenmerk7);

            IF LENGTH (v_prs_perslid_kenmerk7) > v_prs_perslid_kenmerk7_len
            THEN
               v_prs_perslid_kenmerk7 := SUBSTR (v_prs_perslid_kenmerk7, 1, v_prs_perslid_kenmerk7_len);
               fac.imp_writelog (p_applname,
                                 p_applrun,
                                 'W',
                                 v_aanduiding || 'kenmerk7 te lang',
                                    '... wordt afgebroken tot ['
                                 || v_prs_perslid_kenmerk7
                                 || ']'
                                );
               COMMIT;
            END IF;
            v_errorhint := 'Ongeldig kenmerk8';
            v_prs_perslid_kenmerk8 := TRIM (v_prs_perslid_kenmerk8);

            IF LENGTH (v_prs_perslid_kenmerk8) > v_prs_perslid_kenmerk8_len
            THEN
               v_prs_perslid_kenmerk8 := SUBSTR (v_prs_perslid_kenmerk8, 1, v_prs_perslid_kenmerk8_len);
               fac.imp_writelog (p_applname,
                                 p_applrun,
                                 'W',
                                 v_aanduiding || 'kenmerk8 te lang',
                                    '... wordt afgebroken tot ['
                                 || v_prs_perslid_kenmerk8
                                 || ']'
                                );
               COMMIT;
            END IF;
            v_errorhint := 'Ongeldig kenmerk9';
            v_prs_perslid_kenmerk9 := TRIM (v_prs_perslid_kenmerk9);

            IF LENGTH (v_prs_perslid_kenmerk9) > v_prs_perslid_kenmerk9_len
            THEN
               v_prs_perslid_kenmerk9 := SUBSTR (v_prs_perslid_kenmerk9, 1, v_prs_perslid_kenmerk9_len);
               fac.imp_writelog (p_applname,
                                 p_applrun,
                                 'W',
                                 v_aanduiding || 'kenmerk9 te lang',
                                    '... wordt afgebroken tot ['
                                 || v_prs_perslid_kenmerk9
                                 || ']'
                                );
               COMMIT;
            END IF;
            v_errorhint := 'Ongeldig kenmerk10';
            v_prs_perslid_kenmerk10 := TRIM (v_prs_perslid_kenmerk10);

            IF LENGTH (v_prs_perslid_kenmerk10) > v_prs_perslid_kenmerk10_len
            THEN
               v_prs_perslid_kenmerk10 := SUBSTR (v_prs_perslid_kenmerk10, 1, v_prs_perslid_kenmerk10_len);
               fac.imp_writelog (p_applname,
                                 p_applrun,
                                 'W',
                                 v_aanduiding || 'kenmerk10 te lang',
                                    '... wordt afgebroken tot ['
                                 || v_prs_perslid_kenmerk10
                                 || ']'
                                );
               COMMIT;
            END IF;
            
            
            
            
            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               BEGIN
                  v_errorhint :=
                      'Fout bij toevoegen regel aan importtabel atch_IMP_PRS';

                  INSERT INTO atch_imp_prs
                          (prs_perslid_nr, prs_perslid_naam,
                           prs_perslid_tussenvoegsel,
                           prs_perslid_voorletters,
                           prs_perslid_voornaam, prs_afdeling_naam,
                           prs_srtperslid_omschrijving,
                           alg_locatie_code, alg_gebouw_code,
                           alg_verdieping_volgnr, alg_ruimte_nr,
                           prs_perslid_telefoonnr,
                           prs_perslid_email,
                           prs_perslid_oslogin,
                           prs_perslid_wachtwoord,
                           prs_perslid_kenmerk1,
                           prs_perslid_kenmerk2,
                           prs_perslid_kenmerk3,
                           prs_perslid_kenmerk4,
                           prs_perslid_kenmerk5,
                           prs_perslid_kenmerk6,
                           prs_perslid_kenmerk7,
                           prs_perslid_kenmerk8,
                           prs_perslid_kenmerk9,
                           prs_perslid_kenmerk10
                          )
                   VALUES (v_prs_perslid_nr, v_prs_perslid_naam,
                           v_prs_perslid_tussenvoegsel,
                           v_prs_perslid_voorletters,
                           v_prs_perslid_voornaam, 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_email,
                           v_prs_perslid_oslogin,
                           v_prs_perslid_wachtwoord,
                           v_prs_perslid_kenmerk1,
                           v_prs_perslid_kenmerk2,
                           v_prs_perslid_kenmerk3,
                           v_prs_perslid_kenmerk4,
                           v_prs_perslid_kenmerk5,
                           v_prs_perslid_kenmerk6,
                           v_prs_perslid_kenmerk7,
                           v_prs_perslid_kenmerk8,
                           v_prs_perslid_kenmerk9,
                           v_prs_perslid_kenmerk10
                           );
                  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_applname,
                              p_applrun,
                              '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_applname,
                        p_applrun,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!'
                       );
   ELSE
      fac.imp_writelog (p_applname,
                        p_applrun,
                        'S',
                           'Persoon: aantal ingelezen regels: '
                        || TO_CHAR (v_count_tot),
                        ''
                       );
      fac.imp_writelog (p_applname,
                        p_applrun,
                        '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_applname,
                        p_applrun,
                        'E',
                        v_aanduiding || v_errormsg,
                        v_errorhint
                       );
      COMMIT;
END atch_import_prs;
/


-- MBMB
-- Let op de kenmerk-keys in onderstaande procedure

CREATE OR REPLACE PROCEDURE atch_update_prs (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
IS
   -- LET OP: moet idem zijn als declaratie bij atch_IMPORT_PRS
   c_first_import           VARCHAR2 (30)   := 'Initiele import';
   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_first_import_count     NUMBER (10);
   v_count_prs_actual       NUMBER (10);
   v_count_prs_import       NUMBER (10);          -- Matching actual persons!
   v_count_tot              NUMBER (10);
   v_count_error            NUMBER (10);
   v_count                  NUMBER (10);
   --
   v_perslid_key            NUMBER (10);
   v_afdeling_key           NUMBER (10);
   v_srtperslid_key         NUMBER (10);
   v_oslogin                VARCHAR2 (30);
   v_wachtwoord             VARCHAR2 (30);

-- !!!!!!!!!!!!!!!!!!!!!!!                 
-- !!LET OP!!
-- 1) Kenmerken doen alleen mee voor nieuwe personen, dus werken alleen voor de 1e keer bij aanmaak nieuwe persoon
--    Kenmerken worden dus bij bestaande personen (nog) NIET bijgewerkt!!
-- 2) Dit zijn platte kenmerken, dus GEEN referentie kenmerken (hiervoor is deze import functie niet geschikt gemaakt
-- !!!!!!!!!!!!!!!!!!!!!!!                 
   
   v_prs_perslid_kenmerk1         VARCHAR2 (256);
	 v_prs_perslid_kenmerk2         VARCHAR2 (256);
	 v_prs_perslid_kenmerk3         VARCHAR2 (256);
	 v_prs_perslid_kenmerk4         VARCHAR2 (256);
	 v_prs_perslid_kenmerk5         VARCHAR2 (256);
	 v_prs_perslid_kenmerk6         VARCHAR2 (256);
	 v_prs_perslid_kenmerk7         VARCHAR2 (256);
	 v_prs_perslid_kenmerk8         VARCHAR2 (256);
	 v_prs_perslid_kenmerk9         VARCHAR2 (256);
	 v_prs_perslid_kenmerk10        VARCHAR2 (256);
                          
                          
   v_prs_perslid_kenmerk1_key NUMBER(10) := 1020;
   v_prs_perslid_kenmerk2_key NUMBER(10) := 1001;
   v_prs_perslid_kenmerk3_key NUMBER(10) := 1002;
   v_prs_perslid_kenmerk4_key NUMBER(10) := 1003;
   v_prs_perslid_kenmerk5_key NUMBER(10) := 1040;
   v_prs_perslid_kenmerk6_key NUMBER(10) := 1004;
   v_prs_perslid_kenmerk7_key NUMBER(10) := 1005;
   v_prs_perslid_kenmerk8_key NUMBER(10) := 1006;
   v_prs_perslid_kenmerk9_key NUMBER(10) := 1041;
   v_prs_perslid_kenmerk10_key NUMBER(10) := 0;
   
   
   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 atch_imp_prs ip
                 WHERE ip.prs_perslid_nr = p.prs_perslid_nr);

   -- Let op! Met eindatum zijn personen die niet meer in dienst zijn.
   CURSOR csperslid
   IS
      SELECT UPPER(prs_srtperslid_omschrijving) prs_srtperslid_omschrijving
      FROM atch_imp_prs
      GROUP BY UPPER (prs_srtperslid_omschrijving);

   
   CURSOR cperslid
   IS
      SELECT *
        FROM atch_imp_prs;

   CURSOR cwp
   IS
      SELECT p.*, ip.alg_locatie_code, ip.alg_gebouw_code
        FROM atch_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
   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_v_aanwezigperslidwerkplek pw
                          WHERE pw.prs_perslid_key = p.prs_perslid_key);

   -- 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 COUNT (*)
     INTO v_first_import_count
     FROM imp_log
    WHERE imp_log_omschrijving = c_first_import
      AND imp_log_applicatie = p_applname;

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

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

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

               fac.imp_writelog (p_applname,
                                 p_applrun,
                                 '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_applname,
                                    p_applrun,
                                    '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_applname,
                                    p_applrun,
                                    '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_applname,
                                 p_applrun,
                                 'E',
                                 v_errormsg,
                                 v_errorhint
                                );
               COMMIT;
         END;
      END LOOP;

      v_count_tot := 0;
      v_count_error := 0;

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

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

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

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

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

      v_count_tot := 0;
      v_count_error := 0;

      FOR recperslid IN cperslid
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding :=
                  recperslid.prs_perslid_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_naam);

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


						-- Login afleiden uit e-mail (alles voor @)
 						-- v_oslogin := SUBSTR (recperslid.prs_perslid_email, 1, INSTR (recperslid.prs_perslid_email, '@', 1, 1) - 1);
            -- Hier wordt loginnaam expliciet (anders) in het importbestand meegegeven.
            v_oslogin := recperslid.prs_perslid_oslogin;
            v_wachtwoord := recperslid.prs_perslid_wachtwoord;
            v_prs_perslid_kenmerk1 := recperslid.prs_perslid_kenmerk1;
						v_prs_perslid_kenmerk2 := recperslid.prs_perslid_kenmerk2;
						v_prs_perslid_kenmerk3 := recperslid.prs_perslid_kenmerk3;
						v_prs_perslid_kenmerk4 := recperslid.prs_perslid_kenmerk4;
						v_prs_perslid_kenmerk5 := recperslid.prs_perslid_kenmerk5;
						v_prs_perslid_kenmerk6 := recperslid.prs_perslid_kenmerk6;
						v_prs_perslid_kenmerk7 := recperslid.prs_perslid_kenmerk7;
						v_prs_perslid_kenmerk8 := recperslid.prs_perslid_kenmerk8;
						v_prs_perslid_kenmerk9 := recperslid.prs_perslid_kenmerk9;
						v_prs_perslid_kenmerk10:= recperslid.prs_perslid_kenmerk10;
          

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

               INSERT INTO prs_perslid
                           (prs_perslid_module, prs_srtperslid_key,
                            prs_afdeling_key, prs_perslid_naam,
                            prs_perslid_voorletters,
                            prs_perslid_tussenvoegsel,
                            prs_perslid_voornaam,
                            prs_perslid_telefoonnr,
                            prs_perslid_email,
                            prs_perslid_nr, 
                            prs_perslid_oslogin,
                            prs_perslid_wachtwoord
                           )
                    VALUES ('PRS', v_srtperslid_key,
                            v_afdeling_key, recperslid.prs_perslid_naam,
                            recperslid.prs_perslid_voorletters,
                            recperslid.prs_perslid_tussenvoegsel,
                            recperslid.prs_perslid_voornaam,
                            recperslid.prs_perslid_telefoonnr,
                            recperslid.prs_perslid_email,
                            recperslid.prs_perslid_nr, 
                            v_oslogin, 
                            v_wachtwoord
                           );
                           
               COMMIT;
               
               SELECT prs_perslid_key
	             INTO v_perslid_key
	             FROM prs_v_aanwezigperslid
	             WHERE UPPER (prs_perslid_nr) = UPPER (recperslid.prs_perslid_nr);
               
               IF (v_prs_perslid_kenmerk1_key <> 0)
               THEN
	               INSERT INTO PRS_KENMERKLINK(PRS_LINK_KEY,PRS_KENMERKLINK_NIVEAU,PRS_KENMERK_KEY,PRS_KENMERKLINK_WAARDE)
	               VALUES(v_perslid_key, 'P', v_prs_perslid_kenmerk1_key, v_prs_perslid_kenmerk1);
               END IF;
               IF (v_prs_perslid_kenmerk2_key <> 0)
               THEN
	               INSERT INTO PRS_KENMERKLINK(PRS_LINK_KEY,PRS_KENMERKLINK_NIVEAU,PRS_KENMERK_KEY,PRS_KENMERKLINK_WAARDE)
	               VALUES(v_perslid_key, 'P', v_prs_perslid_kenmerk2_key, v_prs_perslid_kenmerk2);
               END IF;
               IF (v_prs_perslid_kenmerk3_key <> 0)
               THEN
	               INSERT INTO PRS_KENMERKLINK(PRS_LINK_KEY,PRS_KENMERKLINK_NIVEAU,PRS_KENMERK_KEY,PRS_KENMERKLINK_WAARDE)
	               VALUES(v_perslid_key, 'P', v_prs_perslid_kenmerk3_key, v_prs_perslid_kenmerk3);
               END IF;
               IF (v_prs_perslid_kenmerk4_key <> 0)
               THEN
	               INSERT INTO PRS_KENMERKLINK(PRS_LINK_KEY,PRS_KENMERKLINK_NIVEAU,PRS_KENMERK_KEY,PRS_KENMERKLINK_WAARDE)
	               VALUES(v_perslid_key, 'P', v_prs_perslid_kenmerk4_key, v_prs_perslid_kenmerk4);
               END IF;
               IF (v_prs_perslid_kenmerk5_key <> 0)
               THEN
	               INSERT INTO PRS_KENMERKLINK(PRS_LINK_KEY,PRS_KENMERKLINK_NIVEAU,PRS_KENMERK_KEY,PRS_KENMERKLINK_WAARDE)
	               VALUES(v_perslid_key, 'P', v_prs_perslid_kenmerk5_key, v_prs_perslid_kenmerk5);
               END IF;
               IF (v_prs_perslid_kenmerk6_key <> 0)
               THEN
	               INSERT INTO PRS_KENMERKLINK(PRS_LINK_KEY,PRS_KENMERKLINK_NIVEAU,PRS_KENMERK_KEY,PRS_KENMERKLINK_WAARDE)
	               VALUES(v_perslid_key, 'P', v_prs_perslid_kenmerk6_key, v_prs_perslid_kenmerk6);
               END IF;
               IF (v_prs_perslid_kenmerk7_key <> 0)
               THEN
	               INSERT INTO PRS_KENMERKLINK(PRS_LINK_KEY,PRS_KENMERKLINK_NIVEAU,PRS_KENMERK_KEY,PRS_KENMERKLINK_WAARDE)
	               VALUES(v_perslid_key, 'P', v_prs_perslid_kenmerk7_key, v_prs_perslid_kenmerk7);
               END IF;
               IF (v_prs_perslid_kenmerk8_key <> 0)
               THEN
	               INSERT INTO PRS_KENMERKLINK(PRS_LINK_KEY,PRS_KENMERKLINK_NIVEAU,PRS_KENMERK_KEY,PRS_KENMERKLINK_WAARDE)
	               VALUES(v_perslid_key, 'P', v_prs_perslid_kenmerk8_key, v_prs_perslid_kenmerk8);
               END IF;
               IF (v_prs_perslid_kenmerk9_key <> 0)
               THEN
	               INSERT INTO PRS_KENMERKLINK(PRS_LINK_KEY,PRS_KENMERKLINK_NIVEAU,PRS_KENMERK_KEY,PRS_KENMERKLINK_WAARDE)
	               VALUES(v_perslid_key, 'P', v_prs_perslid_kenmerk9_key, v_prs_perslid_kenmerk9);
               END IF;
               IF (v_prs_perslid_kenmerk10_key <> 0)
               THEN
	               INSERT INTO PRS_KENMERKLINK(PRS_LINK_KEY,PRS_KENMERKLINK_NIVEAU,PRS_KENMERK_KEY,PRS_KENMERKLINK_WAARDE)
	               VALUES(v_perslid_key, 'P', v_prs_perslid_kenmerk10_key, v_prs_perslid_kenmerk10);
               END IF;	 
              	 
            ELSE
               IF (v_count > 1)
               THEN
                  fac.imp_writelog (p_applname,
                                    p_applrun,
                                    'E',
                                       v_aanduiding
                                    || ' kan persoon niet 1-duidig bepalen',
                                    v_errorhint
                                   );
                  COMMIT;
               END IF;

               v_errorhint := 'Fout bij wijzigen persoon';

               UPDATE prs_perslid
                  SET prs_srtperslid_key = v_srtperslid_key,
                      prs_afdeling_key = v_afdeling_key,
                      prs_perslid_naam = recperslid.prs_perslid_naam,
                      prs_perslid_voorletters = recperslid.prs_perslid_voorletters,
                      prs_perslid_tussenvoegsel = recperslid.prs_perslid_tussenvoegsel,
                      prs_perslid_voornaam = recperslid.prs_perslid_voornaam,
                      prs_perslid_telefoonnr = COALESCE (recperslid.prs_perslid_telefoonnr, prs_perslid_telefoonnr),
                      prs_perslid_email = COALESCE (recperslid.prs_perslid_email, prs_perslid_email),
                      prs_perslid_nr = recperslid.prs_perslid_nr,
                      prs_perslid_oslogin = COALESCE (v_oslogin, prs_perslid_oslogin),
                      prs_perslid_wachtwoord = COALESCE (v_wachtwoord, prs_perslid_wachtwoord)
                  WHERE prs_perslid_key = v_perslid_key;
               COMMIT;
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               v_count_error := v_count_error + 1;
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     'OTHERS (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_applname,
                                 p_applrun,
                                 'E',
                                 v_aanduiding || v_errormsg,
                                 v_errorhint
                                );
               COMMIT;
         END;
      END LOOP;

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

      v_count_tot := 0;
      v_count_error := 0;

      FOR recwp IN cwp
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding :=
                  recwp.prs_perslid_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_v_aanwezigperslidwerkplek 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_v_aanwezigperslidwerkplek pw
                                 WHERE pw.prs_werkplek_key =
                                                            w.prs_werkplek_key);

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

                  -- Verwijder (keihard) de mogelijk eerder logisch verwijderde
                  -- koppeling tussen dezelfde persoon en werkplek!!!
                  DELETE FROM prs_perslidwerkplek pw
                        WHERE pw.prs_perslid_key = v_perslid_key
                          AND pw.prs_werkplek_key = v_wp_key
                          AND pw.prs_perslidwerkplek_verwijder IS NOT NULL;

                  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_applname,
                                 p_applrun,
                                 'E',
                                 v_aanduiding || v_errormsg,
                                 v_errorhint
                                );
               COMMIT;
         END;
      END LOOP;

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

      FOR recnowp IN cnowp
      LOOP
         BEGIN
            fac.imp_writelog (p_applname,
                              p_applrun,
                              '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_applname,
                                 p_applrun,
                                 '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
               AND fac_groep_verwijder IS NULL;


            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_applname,
                                 p_applrun,
                                 'E',
                                 v_errormsg,
                                 v_errorhint
                                );
               COMMIT;
         END;
      END LOOP;
     
      
   ELSE
      fac.imp_writelog
         (p_applname,
          p_applrun,
          '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 atch_update_prs;
/




COMMIT;

spool off
