--
-- $Id$
--
-- Script containing customer specific sql for UWVA (UWV Amsterdam)
-- related to ABS/KPN/VINDER/PROVISIONING/PHONEBOOK.

DEFINE thisfile = 'UWVA_PRS.SQL'
DEFINE dbuser   = '^UWVA'

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

-- UWVA#15040 Import van projectkostenplaatsen die niet voorkomen in de KPN import
CREATE OR REPLACE PROCEDURE uwva_import_kpn_prj (p_import_key IN NUMBER)
AS
   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);                           -- Input line
   v_field            VARCHAR2 (100);
   v_fielddelimitor   VARCHAR2 (1);
   v_errormsg         VARCHAR (200);
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   header_is_valid    NUMBER;
   v_afdeling         VARCHAR2 (100);
   v_status           VARCHAR2 (100);
   v_omschrijving     VARCHAR2 (100);
   v_boekingsunit     VARCHAR2 (100);
   v_project          VARCHAR2 (100);
BEGIN
   v_fielddelimitor := ';';

   header_is_valid := 0;

   DELETE FROM uwva_imp_kpn_prj;

   FOR NEXT_RECORD IN c_cursor
   LOOP
      BEGIN
         v_newline := next_record.FAC_IMP_FILE_LINE;
         fac.imp_getfield (v_newline, v_fielddelimitor, v_boekingsunit);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_project);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_omschrijving);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_status);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_afdeling);

         IF (    header_is_valid = 0
             AND v_afdeling = 'Afdeling'
             AND v_status = 'Status op ingangsdatum'
             AND v_omschrijving = 'Omschrijving'
             AND v_boekingsunit = 'BU'
             AND v_project = 'Project')
         THEN
            header_is_valid := 1;
         ELSE
            IF (    header_is_valid = 1
                AND v_afdeling <> ' '
                AND v_project <> ' ')
            THEN
               IF (LENGTH (v_afdeling) >= 6) -- lengte van kostenplaats moet minimaal 6 posities zijn.
               THEN
                  INSERT INTO uwva_imp_kpn_prj (project,
                                                afdeling,
                                                status,
                                                omschrijving,
                                                boekingsunit)
                    VALUES   (SUBSTR (v_project, 1, 30),
                              SUBSTR (v_afdeling, 1, 6),
                              SUBSTR (v_status, 1, 1),
                              SUBSTR (v_omschrijving, 1, 60),
                              SUBSTR (v_boekingsunit, 1, 6));
               ELSE
                  fac.imp_writelog (p_import_key, 'E', 'Invalid import file', 'Er is een ongeldige Projectkostenplaats aangetroffen in het importbestand:' || SUBSTR (v_project, 1, 30));

                  -- UWVA#23269: Hier stond uwva_imp_kpn en dat leek mij niet goed (zeker met 't
                  -- vervolg in uwva_update_abs() zoals dat tegenwoordig het geval is)!!!
                  DELETE FROM uwva_imp_kpn_prj; -- maak uwva_imp_kpn_prj weer leeg.
                  EXIT; -- kostenplaats niet 6 posities; voorloopnullen kunnen weggevallen zijn.
               END IF;
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key, 'E', 'Invalid import file', 'Er is geen geldige Header aangetroffen en in het importbestand');
   END IF;

   -- UWVA#41977: Import robuust gemaakt tegen dubbele aanlevering van KPN_PRJ-bestand.
   DELETE FROM fac_imp_file
         WHERE fac_import_key = p_import_key;
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;
/

CREATE OR REPLACE PROCEDURE uwva_update_kpn_prj (p_import_key IN NUMBER)
AS
BEGIN
   -- update wordt door de uwva_update_kpn procedure uitgevoerd.
   NULL;
END;
/

-- UWVA#7 Import van kostenplaatsen
-- UWVA#20021 Nu met organisatiestructuur en budgethouders + mandaten
--            (waardoor budgethouderimport overbodig wordt)
CREATE OR REPLACE PROCEDURE uwva_import_kpn (p_import_key IN NUMBER)
AS
   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);                          -- Input line
   v_field            VARCHAR2 (100);
   v_fielddelimitor   VARCHAR2 (1);
   v_errormsg         VARCHAR (200);
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   header_is_valid    NUMBER;
   v_empty            VARCHAR2 (100);
   v_afdeling         VARCHAR2 (100);
   v_status           VARCHAR2 (100);
   v_omschrijving     VARCHAR2 (100);
   v_niv2_code        VARCHAR2 (100);
   v_niv2_oms         VARCHAR2 (100);
   v_niv3_code        VARCHAR2 (100);
   v_niv4_code        VARCHAR2 (100);
   v_niv5_code        VARCHAR2 (100);
   v_niv6_code        VARCHAR2 (100);
   v_niv7_code        VARCHAR2 (100);
   v_perslid_nr       VARCHAR2 (100);
   v_mandaatcode      VARCHAR2 (100);
   v_date1            VARCHAR2 (20);
   v_date2            VARCHAR2 (20);
BEGIN
   v_fielddelimitor := ';';

   header_is_valid := 0;

   DELETE FROM uwva_imp_kpn;

   FOR next_record IN c_cursor LOOP
   BEGIN
      v_newline := next_record.FAC_IMP_FILE_LINE;
      fac.imp_getfield (v_newline, v_fielddelimitor, v_afdeling);
      fac.imp_getfield (v_newline, v_fielddelimitor, v_omschrijving);
      fac.imp_getfield (v_newline, v_fielddelimitor, v_niv2_code);
      fac.imp_getfield (v_newline, v_fielddelimitor, v_niv2_oms);
      fac.imp_getfield (v_newline, v_fielddelimitor, v_niv3_code);
      fac.imp_getfield (v_newline, v_fielddelimitor, v_niv4_code);
      fac.imp_getfield (v_newline, v_fielddelimitor, v_niv5_code);
      fac.imp_getfield (v_newline, v_fielddelimitor, v_niv6_code);
      fac.imp_getfield (v_newline, v_fielddelimitor, v_niv7_code);
      fac.imp_getfield (v_newline, v_fielddelimitor, v_perslid_nr);
      fac.imp_getfield (v_newline, v_fielddelimitor, v_mandaatcode);
      fac.imp_getfield (v_newline, v_fielddelimitor, v_date1);
      fac.imp_getfield (v_newline, v_fielddelimitor, v_date2);

      IF (    header_is_valid = 0
          AND v_afdeling = 'code_eenheid'                       --code_eenheid
          AND v_omschrijving = 'naam_eenheid'                   --naam_eenheid
          AND v_niv2_code = 'code_eenheid_niveau_2'    --code_eenheid_niveau_2
          AND v_niv2_oms  = 'naam_eenheid_nivo_2'        --naam_eenheid_nivo_2
          AND v_niv3_code = 'code_eenheid_niveau_3'    --code_eenheid_niveau_3
          AND v_niv4_code = 'code_eenheid_niveau_4'    --code_eenheid_niveau_4
          AND v_niv5_code = 'code_eenheid_niveau_5'    --code_eenheid_niveau_5
          AND v_niv6_code = 'code_eenheid_niveau_6'    --code_eenheid_niveau_6
          AND v_niv7_code = 'code_eenheid_niveau_7'    --code_eenheid_niveau_7
          AND v_perslid_nr = 'wnr_leidinggevende'         --wnr_leidinggevende
          AND v_mandaatcode = 'code_mandaat'                    --code_mandaat
          AND v_date1 = 'start_datum'                            --start_datum
          AND v_date2 = 'eind_datum'                              --eind_datum
         )
      THEN
         header_is_valid := 1;
      ELSE
         IF (header_is_valid = 1 AND v_afdeling != ' ')
         THEN
            IF (LENGTH (v_afdeling) >= 6) -- lengte van kostenplaats moet minimaal 6 posities zijn.
            THEN
               IF (SYSDATE >= TO_DATE (v_date1, 'dd-mm-yyyy') AND SYSDATE <= TO_DATE (v_date2, 'dd-mm-yyyy'))
               THEN v_status := 'A';
               ELSE v_status := 'I';
               END IF;

               INSERT INTO uwva_imp_kpn
                           (afdeling,
                            status,
                            omschrijving,
                            niv2_code,
                            niv3_code,
                            niv4_code,
                            niv5_code,
                            niv6_code,
                            niv7_code,
                            perslid_nr,
                            mandaatcode
                           )
                    VALUES (SUBSTR (v_afdeling, 1, 6), SUBSTR (v_status, 1, 1),
                            SUBSTR (v_omschrijving, 1, 60),
                            -- Het laagste niveau afdeling dat in iedere regel wordt meegegeven
                            -- is de afdeling waar die regel over gaat. We willen alleen de parent
                            -- en bovenliggende afdelingen hebben, dus laat de huidige afdeling maar
                            -- weg (zodat we in de update een coalesce kunnen gebruiken om de parent
                            -- te bepalen!)
                            DECODE(v_niv2_code, v_afdeling, NULL, SUBSTR (v_niv2_code, 1, 6) ),
                            DECODE(v_niv3_code, v_afdeling, NULL, SUBSTR (v_niv3_code, 1, 6) ),
                            DECODE(v_niv4_code, v_afdeling, NULL, SUBSTR (v_niv4_code, 1, 6) ),
                            DECODE(v_niv5_code, v_afdeling, NULL, SUBSTR (v_niv5_code, 1, 6) ),
                            DECODE(v_niv6_code, v_afdeling, NULL, SUBSTR (v_niv6_code, 1, 6) ),
                            DECODE(v_niv7_code, v_afdeling, NULL, SUBSTR (v_niv7_code, 1, 6) ),
                            SUBSTR (v_perslid_nr, 1, 16), SUBSTR(v_mandaatcode, 1, 6)
                           );
            ELSE
               fac.imp_writelog (p_import_key, 'E', 'Invalid import file', 'Er is een ongeldige Kostenplaats aangetroffen in het importbestand. Een kostenplaats moet uit 6 posities bestaan. kostenplaats:' || SUBSTR (v_afdeling, 1, 6));
               DELETE FROM uwva_imp_kpn; -- maak uwva_imp_kpn weer leeg.
               EXIT; -- kostenplaats heeft geen 6 posities. Voorloopnullen kunnen weggevallen zijn.
            END IF;
         END IF;
      END IF;
   END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key, 'E', 'Invalid import file', 'Er is geen geldige Header aangetroffen en in het importbestand');
   END IF;

   -- UWVA#41977: Import robuust gemaakt tegen dubbele aanlevering van KPN-bestand.
   DELETE FROM fac_imp_file
         WHERE fac_import_key = p_import_key;
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;
/

-- UWVA#20021: KPN-import met organisatiestructuur
-- UWVA#23718 Door overgang naar Peoplesoft is het importbestand gewijzigd:
--            inactieve kostenplaatsen worden niet meer meegegeven.
CREATE OR REPLACE PROCEDURE uwva_update_kpn (p_import_key IN NUMBER)
AS
   -- UWVA#32268: Project- en gebouwkostenplaatsen (= alfanumeriek) niet meer
   --             eerst aanmaken als cluster en dan direct weer verwijderen.
   CURSOR cclusters
   IS
        SELECT   afdeling,
                 status,
                 omschrijving,
                 niv2_code,
                 'PRS' TYPE
          FROM   uwva_imp_kpn
         WHERE   status = 'A' AND niv2_code IS NULL AND fac.safe_to_number (afdeling) > 0
      ORDER BY   1;

   -- UWVA#16503: KPN_PRJ-kostenplaatsen dominant over KPN-kostenplaatsen!
   -- UWVA#23718: quick fix; alleen nog actieve kostenplaatsen in import, dus
   --             inactieve kostenplaatsen zijn kostenplaatsen die alleen nog
   --             in Facilitor voorkomen.
   CURSOR ckostenplaatsen
   IS
      SELECT   1, afdeling,
               status,
               omschrijving,
               COALESCE (niv2_code, afdeling) boekingsunit,
               'PRS' type
        FROM   uwva_imp_kpn
      UNION
      SELECT   2, project,
               status,
               omschrijving,
               boekingsunit,
               'PRJ' type
        FROM   uwva_imp_kpn_prj
      --UNION
      --SELECT   1, prs_kostenplaats_nr afdeling,
      --         'I' status,
      --         prs_kostenplaats_omschrijving omschrijving,
      --         NULL boekingsunit,
      --         'PRS' type
      --  FROM   prs_kostenplaats k
      -- WHERE       prs_kostenplaats_module = 'PRS'
      --         AND prs_kostenplaats_verwijder IS NULL
      --         AND prs_kostenplaats_upper NOT IN (SELECT afdeling FROM uwva_imp_kpn)
      UNION
      SELECT   3, k.prs_kostenplaats_nr afdeling,
               'I' status,
               k.prs_kostenplaats_omschrijving omschrijving,
               NULL boekingsunit,
               k.prs_kostenplaats_module type
        FROM   prs_kostenplaats k
       WHERE       k.prs_kostenplaats_module IN ('PRS', 'ALG', 'PRJ') -- UWVA#31020: Ook ALG + PRJ inactiveren!
               AND k.prs_kostenplaats_verwijder IS NULL
               --AND prs_kostenplaats_upper NOT IN (SELECT afdeling FROM uwva_imp_kpn)
               AND NOT EXISTS (SELECT 1 FROM uwva_imp_kpn WHERE UPPER (afdeling) = k.prs_kostenplaats_upper)
               AND NOT EXISTS (SELECT 1 FROM uwva_imp_kpn_prj WHERE UPPER (project) = k.prs_kostenplaats_upper)
      ORDER BY 1, 2;

   -- Aparte cursor, zodat eerst alle afdelingen (en dus alle parent-afdelingen)
   -- toegevoegd kunnen worden, voor dat parent-child links worden vastgelegd.
   -- niveau6 geeft aan of een afdeling op afdelingsniveau 6 zou komen (en dus naar niveau
   -- 5 gehaald moet worden, door 'm naast z'n parent te zetten.
   CURSOR cstructuur
   IS
      SELECT   afdeling,
               omschrijving,
               COALESCE (niv7_code, niv6_code, niv5_code, niv4_code, niv3_code, niv2_code) parent,
               DECODE (niv6_code, NULL, 0, 1) niveau6
        FROM   uwva_imp_kpn
       WHERE        niv2_code IS NOT NULL
               AND  status = 'A'
               AND  fac.safe_to_number (afdeling) > 0
      ORDER BY 1;

   v_errormsg         VARCHAR (200);
   oracle_err_mes     VARCHAR2 (150);
   c_maxvariation     NUMBER;
   c_prs_bedrijfkey   NUMBER;
   currentversion     fac_module.fac_module_version%TYPE;
   l_oldcount         NUMBER;
   l_oldcountverw     NUMBER;
   l_impcount         NUMBER;
   l_impcountverw     NUMBER;
   l_impcount_prj     NUMBER;
   l_newcount         NUMBER;
   l_newcountverw     NUMBER;
   l_manualcount      NUMBER;
   l_created          BOOLEAN;                   -- In deze sessie aangemaakt!
   l_inactivated      BOOLEAN; -- In deze sessie inactief gemaakt of gebleven!
   lniv2_codekey      NUMBER (10);
   lkostenplaatskey   NUMBER (10);
   lafdelingkey       NUMBER (10);
   lparentkey         NUMBER (10);
   v_count            NUMBER;

   FUNCTION isafdelingskostenplaats (kpn IN VARCHAR2)
      RETURN BOOLEAN
   IS
   BEGIN
      RETURN fac.safe_to_number (kpn) > 0;
   END isafdelingskostenplaats;
BEGIN
   c_maxvariation := 0.5;    -- Max new/old ratio to prevent undesired changes
   c_prs_bedrijfkey := 1;                            -- Key of own UWV bedrijf

   SELECT MAX (fac_module_version) INTO currentversion FROM fac_module;

   fac.imp_writelog (p_import_key,
                     'I',
                     'Facilitor KPN import version ' || currentversion,
                     '$Revision$');

   -- How many active records are now present?
   SELECT COUNT ( * )
     INTO l_oldcount
     FROM prs_kostenplaats
    WHERE prs_kostenplaats_verwijder IS NULL;

   -- How many inactive records are now present? (for summary only)
   SELECT COUNT ( * )
     INTO l_oldcountverw
     FROM prs_kostenplaats
    WHERE prs_kostenplaats_verwijder IS NOT NULL;

   -- How many (in)active records are imported?
   SELECT COUNT ( * )
     INTO l_impcount
     FROM uwva_imp_kpn
    WHERE status = 'A';

   SELECT COUNT ( * )
     INTO l_impcountverw
     FROM uwva_imp_kpn
    WHERE status != 'A';

   SELECT COUNT ( * )
     INTO l_impcount_prj
     FROM uwva_imp_kpn_prj
    WHERE status = 'A';


   --IF 1 - ((l_impcount + l_impcount_prj) / l_oldcount) > c_maxvariation
   IF (ABS ( (l_impcount + l_impcount_prj) - l_oldcount) >
          c_maxvariation * l_oldcount)
   THEN
      fac.imp_writelog (
         p_import_key,
         'E',
            'Het verschil tussen de actieve kostenplaatsen ('
         || TO_CHAR (l_oldcount)
         || ') en geimporteerde aantallen ('
         || TO_CHAR (l_impcount + l_impcount_prj)
         || ') is te groot',
         'Zie Specificaties: De afwijking is teveel en bedraagt '
         || TO_CHAR (
               ( (l_oldcount - (l_impcount + l_impcount_prj) ) / l_oldcount ) * 100,
               '999D9'
            )
         || '%.'
      );
      RETURN;
   END IF;

   -- Clusters (actieve)
   FOR rc IN cclusters
   LOOP
      -- Bestaat deze al?
      BEGIN
         SELECT   prs_afdeling_key
           INTO   lniv2_codekey
           FROM   prs_afdeling
          WHERE       prs_afdeling_upper = UPPER (rc.afdeling)
                  AND prs_afdeling_parentkey IS NULL
                  AND prs_afdeling_verwijder IS NULL;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            -- Misschien is het een BU die nu nog als afdeling (child) staat
            -- geregistreerd; die wordt dan nu gepromoveerd tot BU
            BEGIN
               SELECT   prs_afdeling_key
                 INTO   lniv2_codekey
                 FROM   prs_afdeling
                WHERE   prs_afdeling_upper = UPPER (rc.afdeling)
                        AND prs_afdeling_verwijder IS NULL;

               UPDATE   prs_afdeling
                  SET   prs_afdeling_parentkey = NULL,
                        prs_bedrijf_key = c_prs_bedrijfkey
                WHERE   prs_afdeling_key = lniv2_codekey
                        AND prs_afdeling_verwijder IS NULL;
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  lniv2_codekey := -1;
            END;
         WHEN OTHERS
         THEN
            lniv2_codekey := -1;
      END;

      IF lniv2_codekey = -1
      THEN
         -- Bestaat nog niet
         INSERT INTO prs_afdeling (prs_afdeling_naam,
                                   prs_afdeling_omschrijving,
                                   prs_bedrijf_key,
                                   prs_afdeling_parentkey)
           VALUES   (rc.afdeling,
                     rc.omschrijving,
                     c_prs_bedrijfkey,
                     NULL);
      ELSE
         -- Niet heel belangrijk: omschrijving (re)setten
         UPDATE   prs_afdeling
            SET   prs_afdeling_omschrijving = rc.omschrijving
          WHERE   prs_afdeling_key = lniv2_codekey
                  AND prs_afdeling_omschrijving != rc.omschrijving;
      END IF;
   END LOOP;

   -- Clusters (toplevel afdelingen) geregeld

   ---
   -- Afdelingen/kostenplaatsen
   ---
   FOR rc IN ckostenplaatsen
   LOOP
      l_created := (1 = 0);
      l_inactivated := (1 = 0);

      -- Bestaat deze al?
      BEGIN
         SELECT   k.prs_kostenplaats_key
           INTO   lkostenplaatskey
           FROM   prs_kostenplaats k
          WHERE   k.prs_kostenplaats_upper = UPPER (rc.afdeling)
            AND   k.prs_kostenplaats_verwijder IS NULL;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            BEGIN
               -- Er bestaat geen actuele kostenplaats. Misschien een (onterecht
               -- handmatig/automatisch) verwijderde? (UWVA#647)
               SELECT   k.prs_kostenplaats_key
                 INTO   lkostenplaatskey
                 FROM   prs_kostenplaats k
                WHERE   k.prs_kostenplaats_upper = UPPER (rc.afdeling);
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  -- Kostenplaats bestaat echt nog niet
                  lkostenplaatskey := -1;
               WHEN TOO_MANY_ROWS
               THEN
                  -- Meerdere verwijderde instanties. Daar heeft zeer
                  -- waarschijnlijk iemand iets handmatig niet goed gedaan
                  fac.imp_writelog (
                     p_import_key,
                     'W',
                     'Kostenplaats komt vaker voor (handmatige mutatie!)',
                     rc.afdeling || '/' || rc.omschrijving
                  );

                  -- Er zijn dus louter verwijderden; pak de oorspronkelijkste
                  SELECT   MIN (k.prs_kostenplaats_key)
                    INTO   lkostenplaatskey
                    FROM   prs_kostenplaats k
                   WHERE   k.prs_kostenplaats_upper = UPPER (rc.afdeling);
            END;
         WHEN OTHERS
         THEN
            fac.imp_writelog (
               p_import_key,
               'W',
               'Kan kostenplaats niet eenduidig bepalen',
               rc.afdeling || '/' || rc.omschrijving
            );
      END;

      IF lkostenplaatskey = -1 AND rc.status = 'A'
      THEN
         -- Bestaat nog niet en moet gaan bestaan
         BEGIN
            -- Module wordt voor oude kostenplaatsen aan het einde op de juiste
            -- waarde gezet
            INSERT INTO prs_kostenplaats (
                                             prs_kostenplaats_nr,
                                             prs_kostenplaats_omschrijving,
                                             prs_kostenplaats_module
                       )
              VALUES   (rc.afdeling, rc.omschrijving, rc.TYPE)
           RETURNING   prs_kostenplaats_key
                INTO   lkostenplaatskey;

            fac.imp_writelog (p_import_key,
                              'I',
                              'Kostenplaats is toegevoegd',
                              rc.afdeling || '/' || rc.omschrijving);

            l_created := (1 = 1);
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
               v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
               fac.imp_writelog (
                  p_import_key,
                  'E',
                  'Kostenplaats kan niet toegevoegd worden ' || v_errormsg,
                  rc.afdeling || '/' || rc.omschrijving
               );
         END;
      ELSE
         -- Bestaat al wel
         IF rc.status = 'A'
         THEN
            -- (Re)Activeer de kostenplaats
            UPDATE   prs_kostenplaats
               SET   prs_kostenplaats_omschrijving = rc.omschrijving,
                     prs_kostenplaats_verwijder = NULL,
                     prs_kostenplaats_nr = rc.afdeling,
                     prs_kostenplaats_eind = NULL
             WHERE   prs_kostenplaats_key = lkostenplaatskey;
         ELSE
            UPDATE   prs_kostenplaats
               SET   prs_kostenplaats_omschrijving =
                        SUBSTR ('INACTIEF:' || rc.omschrijving, 1, 60),
                     prs_kostenplaats_eind = SYSDATE
             WHERE   prs_kostenplaats_key = lkostenplaatskey
                     AND prs_kostenplaats_omschrijving NOT LIKE 'INACTIEF%';

            UPDATE   prs_kostenplaats
               SET   prs_kostenplaats_eind = SYSDATE
             WHERE   prs_kostenplaats_key = lkostenplaatskey
                     AND prs_kostenplaats_eind IS NULL -- UWVA#31020/MVH!
                     AND prs_kostenplaats_omschrijving LIKE 'INACTIEF%';

            l_inactivated := (1 = 1);
         END IF;
      END IF;

      -- Nu bestaat de kostenplaats gegarandeerd al, en is lkostenplaatskey geldig.
      BEGIN
         -- Let op (UWVA#178): Hoewel wij afdeling altijd hergebruiken kan het
         -- door handmatig beheer wel voorkomen dat een afdeling dubbel voorkomt,
         -- 1 keer verwijderd en 1 keer actueel
         -- Om dan de juiste te nemen en too_many-rows te vermijden, gebruiken we
         -- hier nu deze GROUP BY expressie
         -- UWVA#22805: MAX() levert altijd een resultaat, dus treedt geen
         -- NO_DATA_FOUND op, ook als niets wordt gevonden. Daarom een coalesce
         -- met -1.
         SELECT   COALESCE( MAX(d1.prs_afdeling_key), -1)
           INTO   lafdelingkey
           FROM   prs_afdeling d1
          WHERE   d1.prs_afdeling_upper = UPPER (rc.afdeling);
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            lafdelingkey := -1;
      END;

      -- We hoeven nu alleen nog maar een afdeling aan te maken als het een PRS-
      -- kostenplaats is
      IF isafdelingskostenplaats (rc.afdeling)
      THEN
         -- Als l_created = TRUE, dan is de kostenplaats net aangemaakt. Als het
         -- een divisie (cluster) betreft, dan is de afdeling ook net aangemaakt
         -- en moeten we die dus niet nog een keer aanmaken, maar updaten!
         -- UWVA#22805: l_created = TRUE impliceert dus v_count > 0 (want voor een
         -- nieuwe "divisie-kostenplaats" is al een "divisie-afdeling" aangemaakt,
         -- dus die afdeling bestaat al!). Relevanter is of de afdelingskosten-
         -- plaats actief is, want dan moet er een afdeling bij bestaan. (Zo
         -- worden afdelingen die - om wat voor reden dan ook - eerder niet zijn
         -- toegevoegd, in de huidige run wel toegevoegd (met l_created gebeurde
         -- dat alleen in de run waarin de kostenplaats wordt aangemaakt).
         SELECT   COUNT(*)
           INTO   v_count
           FROM   prs_afdeling
          WHERE   prs_afdeling_upper = UPPER (rc.afdeling);

         IF (rc.status = 'A' AND v_count = 0)
         THEN
            -- Kostenplaats is actief, maar afdeling bestaat nog niet
            BEGIN

               INSERT INTO prs_afdeling (prs_afdeling_naam,
                                         prs_afdeling_omschrijving,
                                         prs_kostenplaats_key,
                                         prs_bedrijf_key)
                  SELECT   rc.afdeling,
                           rc.omschrijving,
                           k.prs_kostenplaats_key,
                           1  -- 'Intern'
                    FROM   prs_kostenplaats k
                   WHERE   k.prs_kostenplaats_upper = UPPER (rc.afdeling);

               fac.imp_writelog (p_import_key,
                                 'I',
                                 'Afdeling is toegevoegd',
                                 rc.afdeling || '/' || rc.omschrijving);
            EXCEPTION
               WHEN OTHERS
               THEN
                  oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
                  v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     'Afdeling kan niet worden toegevoegd ' || v_errormsg,
                        rc.afdeling
                     || '/'
                     || rc.omschrijving
                     || ' [key='
                     || lafdelingkey
                     || ']'
                  );
            END;
         ELSE
            -- Kostenplaats en afdeling bestonden al wel
            IF l_inactivated
            THEN
               -- Bepaal aantal verplichtingen op afdeling als som van:
               -- 1. #voorkomens in PRS_V_AFD_VERPLICHTING
               -- 2. #voorkomens in PRS_RUIMTEAFDELING
               -- 3. #voorkomens van afdeling-kinderen in PRS_RUIMTEAFDELING
               SELECT   SUM (x.aantal)
                 INTO   v_count
                 FROM   (SELECT   COUNT ( * ) aantal
                           FROM   prs_v_afd_verplichting av
                          WHERE   av.prs_afdeling_key = lafdelingkey
                         UNION ALL
                         SELECT   COUNT ( * ) aantal
                           FROM   prs_v_aanwezigruimteafdeling ra
                          WHERE   ra.prs_afdeling_key = lafdelingkey
                         UNION ALL
                         SELECT   COUNT ( * ) aantal
                           FROM   prs_v_aanwezigafdeling a,
                                  prs_v_aanwezigruimteafdeling ra
                          WHERE   a.prs_afdeling_parentkey = lafdelingkey
                                  AND a.prs_afdeling_key =
                                        ra.prs_afdeling_key) x;

               -- Als v_count>0, dan bestaan er nog verplichtingen en wordt de
               -- afdeling INACTIEF gemaakt!
               IF v_count > 0
               THEN
                  -- Maak (of houd) afdeling INACTIEF
                  UPDATE   prs_afdeling
                     SET   prs_afdeling_naam = rc.afdeling,
                           prs_afdeling_omschrijving =
                              SUBSTR ('INACTIEF:' || rc.omschrijving, 1, 60),
                           prs_kostenplaats_key = lkostenplaatskey
                   WHERE   prs_afdeling_key = lafdelingkey
                           AND prs_afdeling_omschrijving NOT LIKE 'INACTIEF%';
               ELSE
                  -- Verwijder afdeling ‚n kostenplaats
                  BEGIN
                     SELECT   COUNT(*)
                       INTO   v_count
                       FROM   prs_kostenplaats
                      WHERE   prs_kostenplaats_key = lkostenplaatskey
                              AND prs_kostenplaats_verwijder IS NULL;
                     IF (v_count > 0)
                     THEN
                        UPDATE   prs_kostenplaats
                           SET   prs_kostenplaats_verwijder = SYSDATE
                         WHERE   prs_kostenplaats_key = lkostenplaatskey
                                 AND prs_kostenplaats_verwijder IS NULL;
                        fac.imp_writelog (p_import_key, 'I',
                                          'Kostenplaats is verwijderd',
                                          rc.afdeling || '/' || rc.omschrijving);
                     END IF;

                     SELECT   COUNT(*)
                       INTO   v_count
                       FROM   prs_afdeling
                      WHERE   prs_afdeling_key = lafdelingkey
                              AND prs_afdeling_verwijder IS NULL;
                     IF (v_count > 0)
                     THEN
                        UPDATE   prs_afdeling
                           SET   prs_afdeling_verwijder = SYSDATE
                         WHERE   prs_afdeling_key = lafdelingkey
                                 AND prs_afdeling_verwijder IS NULL;
                        fac.imp_writelog (p_import_key, 'I',
                                          'Afdeling is verwijderd',
                                          rc.afdeling || '/' || rc.omschrijving);
                     END IF;

                  EXCEPTION
                     WHEN OTHERS
                     THEN
                        fac.imp_writelog (
                           p_import_key,
                           'E',
                           'Afdeling ' || rc.afdeling
                           || ' kan niet worden verwijderd (heeft nog personen)',
                              rc.afdeling
                           || '/'
                           || rc.omschrijving
                           || ' [key='
                           || lafdelingkey
                           || ']'
                        );

                        UPDATE   prs_afdeling
                           SET   prs_afdeling_naam = rc.afdeling,
                                 prs_afdeling_omschrijving =
                                    SUBSTR ('INACTIEF:' || rc.omschrijving,
                                            1,
                                            60),
                                 prs_kostenplaats_key = lkostenplaatskey
                         WHERE   prs_afdeling_key = lafdelingkey;
                  END;
               END IF;
            ELSE
               BEGIN
                  -- Just update this one
                  UPDATE   prs_afdeling
                     SET   prs_afdeling_naam = rc.afdeling,
                           prs_afdeling_omschrijving = rc.omschrijving,
                           prs_kostenplaats_key = lkostenplaatskey,
                           prs_afdeling_verwijder = NULL
                   WHERE   prs_afdeling_key = lafdelingkey;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
                     v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
                     fac.imp_writelog (
                        p_import_key,
                        'E',
                        'Afdeling kan niet worden bijgewerkt ' || v_errormsg,
                           rc.afdeling
                        || '/'
                        || rc.omschrijving
                        || ' [key='
                        || lafdelingkey
                        || ']'
                     );
               END;
            END IF;
         END IF;
      ELSE
         BEGIN
            -- Hier kunnen geen mensen bij horen, want geen afdelingskostenplaats
            -- Ergo: zo mogelijk opruimen
            -- UWVA#32268: Niet-afdelingskostenplaatsen worden vanuit deze import
            --             nooit meer als afdeling aangemaakt! Hier gebeurt in
            --             principe dus nooit iets (tenzij handmatig een project-
            --             of gebouwkostenplaats als afdeling is toegevoegd die
            --             toevallig ook voorkomt in het importbestand).
            UPDATE   prs_afdeling
               SET   prs_afdeling_verwijder = SYSDATE
             WHERE   prs_afdeling_key = lafdelingkey;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
               v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  'Afdeling kan niet vervallen (heeft nog personen)',
                     rc.afdeling
                  || '/'
                  || rc.omschrijving
                  || ' [key='
                  || lafdelingkey
                  || ']'
               );
         END;
      END IF;
   END LOOP;

   -- Organisatiestructuur vastleggen
   FOR rc IN cstructuur
   LOOP
      BEGIN
         lafdelingkey := NULL;
         lparentkey := NULL;

         SELECT   prs_afdeling_key
           INTO   lafdelingkey
           FROM   prs_afdeling
          WHERE       prs_afdeling_upper = UPPER (rc.afdeling)
                  AND prs_afdeling_verwijder IS NULL;
         -- TODO: MAX, omdat ...?
         SELECT   MAX (dparent.prs_afdeling_key)
           INTO   lparentkey
           FROM   prs_afdeling dparent
          WHERE       dparent.prs_afdeling_upper = UPPER (rc.parent)
                  AND dparent.prs_afdeling_verwijder IS NULL;

         -- Obv importfile alleen update parent uitvoeren indien de
         -- ouder niet zichzelf is
         IF lparentkey != lafdelingkey AND lparentkey IS NOT NULL
         THEN
            -- UWV's organisatiestructuur heeft 6 lagen ipv; er zijn 3 ICT-afdelingen in die 6e laag,
            -- onder "Servicedesk ICT".
            -- Haal die dus één laag omhoog (oftewel zet 'niveau-6' afdelingen naast
            -- hun parent in afdelingsniveau 5)
            IF (rc.niveau6 = 1)
            THEN
               BEGIN
                  SELECT   MAX (dparent.prs_afdeling_parentkey)
                    INTO   lparentkey
                    FROM   prs_afdeling dparent
                   WHERE       dparent.prs_afdeling_key = lparentkey
                           AND dparent.prs_afdeling_verwijder IS NULL;

                  UPDATE   prs_afdeling
                     SET   prs_afdeling_parentkey = lparentkey,
                           prs_bedrijf_key = NULL
                   WHERE   prs_afdeling_key = lafdelingkey;

                  fac.imp_writelog (p_import_key,
                                    'I',
                                    'Niveau-6 afdeling aan parent van parentafdeling gekoppeld: ',
                                    rc.afdeling || '/' || rc.omschrijving || ' (' ||rc.parent || ')');
               EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  fac.imp_writelog (p_import_key,
                                    'W',
                                    'Kan parent van parentafdeling niet vinden',
                                    rc.afdeling || '/' || rc.omschrijving || ' ('|| rc.parent || ')');
               WHEN OTHERS
               THEN
                  fac.imp_writelog (p_import_key,
                                    'W',
                                    'Fout bij bepalen parent van parentafdeling',
                                    rc.afdeling || '/' || rc.omschrijving || ' ('|| rc.parent || ')');
               END;
            ELSE

               UPDATE   prs_afdeling
                  SET   prs_afdeling_parentkey = lparentkey,
                        prs_bedrijf_key = NULL
                WHERE   prs_afdeling_key = lafdelingkey;
            END IF;
         ELSE
            fac.imp_writelog (p_import_key,
                              'W',
                              'Fout bij vastleggen parentafdeling',
                              rc.afdeling || '/' || rc.omschrijving || ' ('|| rc.parent || ')');
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
            v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
            fac.imp_writelog (
               p_import_key,
               'W',
               'Fout bij bepalen (parent-)afdeling',
                  rc.afdeling
               || '/'
               || rc.omschrijving
               || ' [key='
               || lafdelingkey
               || '], parent: '
               || rc.parent
               || ' [' || lparentkey || ']'
            );
      END;
   END LOOP;

   -- For summary only
   SELECT COUNT ( * )
     INTO l_newcount
     FROM prs_kostenplaats
    WHERE prs_kostenplaats_verwijder IS NULL;

   SELECT COUNT ( * )
     INTO l_newcountverw
     FROM prs_kostenplaats
    WHERE prs_kostenplaats_verwijder IS NOT NULL;

   fac.imp_writelog (
      p_import_key,
      'S',
         'Aantal ingelezen kostenplaatsen: '
      || TO_CHAR (l_impcount)
      || '(actief) + '
      || TO_CHAR (l_impcountverw)
      || '(inactief) = '
      || TO_CHAR (l_impcount + l_impcountverw),
      ''
   );
   fac.imp_writelog (
      p_import_key,
      'S',
         'Aantal actieve kostenplaatsen vooraf: '
      || TO_CHAR (l_oldcount)
      || '  nu: '
      || TO_CHAR (l_newcount),
      ''
   );
   fac.imp_writelog (
      p_import_key,
      'S',
         'Aantal inactieve kostenplaatsen vooraf: '
      || TO_CHAR (l_oldcountverw)
      || ' nu: '
      || TO_CHAR (l_newcountverw),
      ''
   );

   -- Bonus logging
   SELECT COUNT ( * )
     INTO l_manualcount
     FROM prs_kostenplaats k, uwva_imp_kpn i
    WHERE k.prs_kostenplaats_nr = i.afdeling(+)
          AND i.afdeling IS NULL
          AND k.prs_kostenplaats_verwijder IS NULL
          AND UPPER (k.prs_kostenplaats_nr) NOT LIKE '__UWV';

   fac.imp_writelog (
      p_import_key,
      'S',
      'Aantal actieve kostenplaatsen niet via import: '
      || TO_CHAR (l_manualcount),
      ''
   );

   -- Update kostenplaatsgroep voor combinatievalidatie
   UPDATE prs_kostenplaats
      SET prs_kostenplaatsgrp_key = '61', prs_kostenplaats_module = 'PRJ'
    WHERE prs_kostenplaats_nr LIKE 'PKPU%';

   UPDATE prs_kostenplaats
      SET prs_kostenplaatsgrp_key = '61', prs_kostenplaats_module = 'PRJ'
    WHERE prs_kostenplaats_nr LIKE 'PKUN%';

   UPDATE prs_kostenplaats
      SET prs_kostenplaatsgrp_key = '27', prs_kostenplaats_module = 'PRJ'
    WHERE prs_kostenplaats_nr LIKE 'P%'
      AND (prs_kostenplaatsgrp_key != 61 OR prs_kostenplaatsgrp_key IS NULL);

   UPDATE prs_kostenplaats
      SET prs_kostenplaatsgrp_key = '24', prs_kostenplaats_module = 'ALG'
    WHERE prs_kostenplaats_nr LIKE 'G%';

   UPDATE prs_kostenplaats
      SET prs_kostenplaatsgrp_key = '25', prs_kostenplaats_module = 'PRJ'
    WHERE prs_kostenplaats_nr LIKE 'H%';

   UPDATE prs_kostenplaats
      SET prs_kostenplaatsgrp_key = '27', prs_kostenplaats_module = 'PRJ'
    WHERE prs_kostenplaats_nr LIKE 'U%';

   UPDATE prs_kostenplaats
      SET prs_kostenplaatsgrp_key = '25', prs_kostenplaats_module = 'PRJ'
    WHERE prs_kostenplaats_nr LIKE 'I%';

   UPDATE prs_kostenplaats
      SET prs_kostenplaatsgrp_key = '22', prs_kostenplaats_module = 'PRJ'
    WHERE (prs_kostenplaats_nr LIKE 'S%'
           AND prs_kostenplaats_upper NOT IN
                    ('S30006',
                     'S30007',
                     'S30008',
                     'S30011',
                     'S30015',
                     'S30046',
                     'S30056',
                     'S30065',
                     'S30080',
                     'S30083',
                     'S30115',
                     'S30116',
                     'S30121',
                     'S30122',
                     'S30130',
                     'S30132'))
          OR prs_kostenplaats_nr LIKE 'T%';

   UPDATE prs_kostenplaats
      SET prs_kostenplaatsgrp_key = '23', prs_kostenplaats_module = 'PRJ'
    WHERE prs_kostenplaats_nr LIKE 'S%'
          AND prs_kostenplaats_upper IN
                   ('S30006',
                    'S30007',
                    'S30008',
                    'S30011',
                    'S30015',
                    'S30046',
                    'S30056',
                    'S30065',
                    'S30080',
                    'S30083',
                    'S30115',
                    'S30116',
                    'S30121',
                    'S30122',
                    'S30130',
                    'S30132');

   UPDATE prs_kostenplaats
      SET prs_kostenplaatsgrp_key = '21', prs_kostenplaats_module = 'PRS'
    WHERE fac.safe_to_number (prs_kostenplaats_nr) IS NOT NULL;

   -- Alle kostenplaatsen uit de kpn_prj import zijn projectkostenplaatsen.
   UPDATE prs_kostenplaats k
      SET k.prs_kostenplaatsgrp_key = '27',
          k.prs_kostenplaats_module = 'PRJ'
    WHERE EXISTS (SELECT project
                    FROM uwva_imp_kpn_prj
                   WHERE project = k.prs_kostenplaats_nr);

   COMMIT;

   -- UWVA#15374: Automatisch bijwerken "kpn-based" legenda's
   INSERT INTO cad_legendawaarde (cad_legenda_key,
                                  cad_legendawaarde_value,
                                  cad_legendawaarde_rgb,
                                  cad_legendawaarde_omschr)
      SELECT DISTINCT
             181,
             SUBSTR (a.prs_afdeling_naam6, 1, 60),               -- HV-Divisie
             TO_CHAR (
                DBMS_UTILITY.get_hash_value (
                   SUBSTR (a.prs_afdeling_naam6, 1, 60),
                   0,
                   POWER (2, 24)
                ),
                '0XXXXX'
             ),
             SUBSTR (a.prs_afdeling_naam6, 1, 60)
        FROM prs_v_aanwezigafdeling a
       WHERE a.prs_afdeling_parentkey IS NULL
             AND NOT EXISTS
                   (SELECT cl.cad_legendawaarde_value
                      FROM cad_legendawaarde cl
                     WHERE cl.cad_legendawaarde_value = SUBSTR (a.prs_afdeling_naam6, 1, 60)
                           AND cl.cad_legenda_key = 181);

   INSERT INTO cad_legendawaarde (cad_legenda_key,
                                  cad_legendawaarde_value,
                                  cad_legendawaarde_rgb,
                                  cad_legendawaarde_omschr)
      SELECT DISTINCT
             182,
             SUBSTR (a.prs_afdeling_naam6, 1, 60),              -- HV-Afdeling
             TO_CHAR (
                DBMS_UTILITY.get_hash_value (
                   SUBSTR (a.prs_afdeling_naam6, 1, 60),
                   0,
                   POWER (2, 24)
                ),
                '0XXXXX'
             ),
             SUBSTR (a.prs_afdeling_naam6, 1, 60)
        FROM prs_v_aanwezigafdeling a
       WHERE a.prs_afdeling_parentkey IS NOT NULL
             AND NOT EXISTS
                   (SELECT cl.cad_legendawaarde_value
                      FROM cad_legendawaarde cl
                     WHERE cl.cad_legendawaarde_value = SUBSTR (a.prs_afdeling_naam6, 1, 60)
                           AND cl.cad_legenda_key = 182);
END;
/


-- USRRAP views tbv UWVA#7
/* Formatted on 2005/02/16 11:26 (Formatter Plus v4.8.5) */
CREATE OR REPLACE VIEW uwva_v_kpn_01_teverwijderenafd (personeelsnr, persoon, afdeling, omschrijving, vervallen)
AS
   SELECT prs_perslid_nr, pf.prs_perslid_naam_full, prs_afdeling_naam, prs_afdeling_omschrijving,
          DECODE (d.prs_afdeling_verwijder, NULL, '', 'INACTIEF')
     FROM prs_afdeling d, prs_perslid p, uwva_imp_kpn i, prs_v_perslid_fullnames_all pf
    WHERE p.prs_afdeling_key = d.prs_afdeling_key
      AND i.afdeling = d.prs_afdeling_naam
      AND i.status <> 'A'
      AND p.prs_perslid_verwijder IS NULL
      AND pf.prs_perslid_key = p.prs_perslid_key;

CREATE OR REPLACE VIEW uwva_v_kpn_03_vervallenafd (hide_f_vervaldatum,
                                                   vervaldatum,
                                                   afdeling,
                                                   omschrijving
                                                  )
AS
   SELECT SYSDATE - d.prs_afdeling_verwijder,
          TO_CHAR (d.prs_afdeling_verwijder, 'YYYY-MM-DD'),
          d.prs_afdeling_naam, d.prs_afdeling_omschrijving
     FROM prs_afdeling d
    WHERE d.prs_afdeling_verwijder IS NOT NULL;

CREATE OR REPLACE VIEW uwva_v_kpn_04_openverpl
(fclt_f_servicepunt, fclt_f_locatie, kostenplaats, omschrijving, vervaldatum,
 verplichting, item, fclt_3d_locatie_key)
AS
SELECT di.alg_district_omschrijving fclt_f_servicepunt,
          l.alg_locatie_code fclt_f_locatie,
          k.prs_kostenplaats_nr,
          k.prs_kostenplaats_omschrijving,
          TO_CHAR (k.prs_kostenplaats_verwijder, 'YYYY-MM-DD'),
          NVL (t.fac_message_text, pv.fac_message_code),
          item,
          pv.locatie_key
     FROM prs_v_kp_verplichting pv,
          fac_message t,
          prs_kostenplaats k,
          alg_locatie l,
          alg_district di
    WHERE pv.prs_kostenplaats_key = k.prs_kostenplaats_key
      AND pv.locatie_key = l.alg_locatie_key
      AND l.alg_district_key = di.alg_district_key
      AND pv.fac_message_code = t.fac_message_code(+)
      AND k.prs_kostenplaats_verwijder IS NOT NULL;


CREATE OR REPLACE PROCEDURE UWVA_import_cis (
   p_import_key IN NUMBER
)
AS
    -- constanten
    c_fielddelimitor                VARCHAR2 (1) := ';';    -- Field seperator

    -- import
    v_newline                       VARCHAR2 (1000);        -- Import line
    v_field                         VARCHAR2 (100);         -- Import field
    header_is_valid                 BOOLEAN;
    v_aantal                        NUMBER;

    -- foutafhandeling
    v_errormsg                      VARCHAR (200);
    v_errorhint                     VARCHAR (200);
    oracle_err_num                  NUMBER;
    oracle_err_mes                  VARCHAR2 (200);
    v_errmes                        VARCHAR(1024);
    -- De importvelden
    v_prs_perslid_nr                VARCHAR2(16 BYTE);
    v_prs_perslid_bsn               VARCHAR2(10 BYTE);
    v_prs_perslid_naam              VARCHAR2(60 BYTE);
    v_prs_perslid_oslogin           VARCHAR2(30 BYTE);
    v_prs_perslid_email             VARCHAR2(200 BYTE);
    v_teller                        NUMBER;

    CURSOR c1 IS
       SELECT *
         FROM fac_imp_file
        WHERE fac_import_key = p_import_key
     ORDER BY fac_imp_file_index;
    rec1 c1%ROWTYPE;

BEGIN

   -- Init
   header_is_valid := FALSE;

   -- Clear my previous imported rows
   DELETE FROM UWVA_imp_cis;

    BEGIN
      v_teller := 0;
      OPEN c1;
      IF c1%ISOPEN THEN
        v_teller := 1;
        LOOP
          BEGIN
            v_errmes := 'Fout FETCH te importeren rij';
            FETCH c1 INTO rec1;
            EXIT WHEN c1%NOTFOUND;
            v_errmes := 'Fout opvragen te importeren rij';
            v_newline := rec1.fac_imp_file_line;

            fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_nr);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_bsn);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_naam);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_oslogin);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_email);

            -- Skip until a valid header is found
            IF (    header_is_valid = FALSE
                AND v_prs_perslid_naam LIKE 'Volledige naam'
               )
            THEN
              header_is_valid := TRUE;
            ELSIF (header_is_valid)
            THEN

              INSERT INTO UWVA_imp_cis
                      (prs_perslid_nr
                      ,prs_perslid_bsn
                      ,prs_perslid_naam
                      ,prs_perslid_oslogin
                      ,prs_perslid_email
                      )
                VALUES (SUBSTR (RTRIM(v_prs_perslid_nr), 1, 16)
                       ,SUBSTR (RTRIM(v_prs_perslid_bsn), 1, 10)
                       ,SUBSTR (RTRIM(v_prs_perslid_naam), 1, 60)
                       ,SUBSTR (RTRIM(v_prs_perslid_oslogin), 1, 30)
                       ,SUBSTR (RTRIM(v_prs_perslid_email), 1, 200)
                       );
            END IF;

            header_is_valid := TRUE;

            COMMIT;

            IF (NOT header_is_valid)
            THEN
              fac.imp_writelog (p_import_key,
                                'E',
                                'Invalid import file',
                                'Er is geen geldige header aangetroffen in het importbestand'
                               );
            END IF;
            COMMIT; --  alles is goed gegaan
          END;
        END LOOP;
      END IF;
      CLOSE c1;

      SELECT count(*)
        INTO v_aantal
        FROM FAC_IMP_FILE
       WHERE fac_import_key = p_import_key;
      fac.imp_writelog (p_import_key, 'S', 'Aantal ingelezen uit cis bestand: '|| v_aantal, '');

      SELECT COUNT (*)
        INTO v_aantal
        FROM prs_v_aanwezigperslid
       WHERE prs_perslid_naam NOT LIKE 'INA%' AND prs_perslid_nr IS NOT NULL;
      fac.imp_writelog (p_import_key, 'S', 'Aantal actieve personen in Facilitor met pers.nr: '|| v_aantal, '');

      SELECT COUNT (*)
        INTO v_aantal
        FROM prs_perslid p, uwva_imp_cis cis
       WHERE prs_perslid_verwijder IS NULL
         AND p.prs_perslid_naam NOT LIKE 'INACT%'
         AND p.prs_perslid_nr IS NOT NULL
         AND cis.prs_perslid_nr = p.prs_perslid_nr;
      fac.imp_writelog (p_import_key, 'S', 'Match personeelsnummer: '|| v_aantal, '');

      SELECT COUNT (*)
        INTO v_aantal
        FROM prs_perslid p, uwva_imp_cis cis
       WHERE prs_perslid_verwijder IS NULL
         AND p.prs_perslid_naam NOT LIKE 'INACT%'
         AND p.prs_perslid_nr IS NOT NULL
         AND cis.prs_perslid_nr = p.prs_perslid_nr
         AND LTRIM (RTRIM (UPPER (cis.prs_perslid_oslogin))) =
                                       LTRIM (RTRIM (UPPER (p.prs_perslid_oslogin)))
         AND cis.prs_perslid_oslogin IS NOT NULL
         AND p.prs_perslid_oslogin IS NOT NULL;
      fac.imp_writelog (p_import_key, 'S', 'Match personeelsnummer en logincode: '|| v_aantal, '');

      SELECT COUNT (*)
        INTO v_aantal
        FROM prs_perslid p, uwva_imp_cis cis
       WHERE prs_perslid_verwijder IS NULL                                  -- 18550
         AND p.prs_perslid_naam NOT LIKE 'INACT%'
         AND p.prs_perslid_nr IS NOT NULL
         AND cis.prs_perslid_nr = p.prs_perslid_nr
         AND LTRIM (RTRIM (UPPER (cis.prs_perslid_email))) =
                                         LTRIM (RTRIM (UPPER (p.prs_perslid_email)))
         AND cis.prs_perslid_email IS NOT NULL
         AND p.prs_perslid_email IS NOT NULL;
      fac.imp_writelog (p_import_key, 'S', 'Match personeelsnummer en email: '|| v_aantal, '');


      COMMIT;
    END;
    EXCEPTION WHEN OTHERS THEN
      ROLLBACK;
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      fac.imp_writelog (p_import_key,
                        'E',
                        'Personen import: '|| v_errmes,
                        'Oracle foutmelding (' || oracle_err_num || '/' || oracle_err_mes || ')'
                       );
      COMMIT; -- Logging opslaan
END;
/


/* Formatted on 2005/10/11 14:25 (Formatter Plus v4.8.5) */
CREATE OR REPLACE PROCEDURE UWVA_update_cis (p_import_key IN NUMBER)
AS

   CURSOR c_login
   IS
      SELECT p.prs_perslid_nr, cis.prs_perslid_oslogin, p.prs_perslid_login
        FROM prs_perslid p, uwva_imp_cis cis
       WHERE prs_perslid_verwijder IS NULL
         AND p.prs_perslid_naam NOT LIKE 'INACT%'
         AND p.prs_perslid_nr IS NOT NULL
         AND cis.prs_perslid_nr = p.prs_perslid_nr
         AND LTRIM (RTRIM (UPPER (NVL(cis.prs_perslid_oslogin, 'is leeg')))) <>
                                       LTRIM (RTRIM (UPPER (NVL(p.prs_perslid_oslogin, 'is leeg'))))
         AND cis.prs_perslid_oslogin IS NOT NULL;

   CURSOR c_email
   IS
      SELECT p.prs_perslid_nr, cis.prs_perslid_email
        FROM prs_perslid p, uwva_imp_cis cis
       WHERE prs_perslid_verwijder IS NULL
         AND p.prs_perslid_naam NOT LIKE 'INACT%'
         AND p.prs_perslid_nr IS NOT NULL
         AND cis.prs_perslid_nr = p.prs_perslid_nr
         AND LTRIM (RTRIM (UPPER (NVL(cis.prs_perslid_email,'geenmail')))) <>
                                         LTRIM (RTRIM (UPPER (NVL(p.prs_perslid_email,'geenmail'))))
         AND cis.prs_perslid_email IS NOT NULL
         AND NOT (substr(cis.prs_perslid_email,7,1)='@')
         AND fac.safe_to_number(substr(cis.prs_perslid_email, 4,3)) is null;

    v_aantal   NUMBER(10);
    oracle_err_num                  NUMBER;
    oracle_err_mes                  VARCHAR2 (200);
    v_errmes                        VARCHAR(1024);
    v_errormsg                      VARCHAR (200);

BEGIN

  v_aantal := 0;
  FOR rc IN c_login
   LOOP
      -- Bestaat deze al?
      BEGIN


         IF rc.prs_perslid_login < to_date ('20070101', 'yyyymmdd') OR
            rc.prs_perslid_login is NULL THEN

           UPDATE prs_perslid
              SET prs_perslid_oslogin = null
            WHERE prs_perslid_oslogin = UPPER(rc.prs_perslid_oslogin);

           UPDATE prs_perslid
              SET prs_perslid_oslogin = rc.prs_perslid_oslogin
            WHERE prs_perslid_nr = rc.prs_perslid_nr
              AND prs_perslid_verwijder is null;
           v_aantal := v_aantal + 1;
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
           oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
           v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
           fac.imp_writelog (p_import_key,
                             'E',
                             'Kan login niet aanpassen ' || v_errormsg,
                             'Personeelsnummer: ' || rc.prs_perslid_nr || ' login: ' || rc.prs_perslid_oslogin
                             );
      END;
      COMMIT;
   END LOOP;

   fac.imp_writelog (p_import_key,
                     'S',
                     'Aantal aangepaste logins: ' || v_aantal,
                     ''
                     );

  v_aantal := 0;
  FOR rc IN c_email
   LOOP
      BEGIN
         UPDATE prs_perslid
            SET prs_perslid_email = rc.prs_perslid_email
          WHERE prs_perslid_nr = rc.prs_perslid_nr
            AND prs_perslid_verwijder is null;
         v_aantal := v_aantal + 1;
      EXCEPTION
         WHEN OTHERS
         THEN
           oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
           v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
           fac.imp_writelog (p_import_key,
                             'E',
                             'Kan emailadres niet aanpassen ' || v_errormsg,
                             'Personeelnummer: ' || rc.prs_perslid_nr || ' email: ' || rc.prs_perslid_email
                             );
      END;
      COMMIT;
   END LOOP;

   fac.imp_writelog (p_import_key,
                     'S',
                     'Aantal aangepaste emailadressen: ' || v_aantal,
                     ''
                     );

commit;

END;
/


/* UWVA#15279 - Importfunctie tbv. het bijwerken van persoonsgegevens! */
CREATE OR REPLACE PROCEDURE uwva_import_prs (
   p_import_key IN NUMBER
)
IS
   c_delim                     VARCHAR2 (1)    := ';';
   v_newline                   VARCHAR2 (1000);                 -- Input line
   v_aanduiding                VARCHAR2 (200);
   v_errorhint                 VARCHAR2 (1000);
   v_errormsg                  VARCHAR2 (1000);
   oracle_err_num              NUMBER;
   oracle_err_mes              VARCHAR2 (200);
   header_is_valid             NUMBER          := 0;
   v_ongeldig                  NUMBER (1);
   v_wp_ongeldig               NUMBER (1);
   v_count_tot                 NUMBER (10);
   v_count_import              NUMBER (10);
   v_count                     NUMBER (10);
   -- De importvelden:
   v_prs_perslid_nr            VARCHAR2 (255);
   v_prs_perslid_oslogin       VARCHAR2 (255);
   v_prs_perslid_oslogin2      VARCHAR2 (255);
   v_prs_perslid_telefoonnr    VARCHAR2 (255);
   v_prs_perslid_mobiel        VARCHAR2 (255);
   v_prs_perslid_email         VARCHAR2 (255);
   v_alg_locatie_code          VARCHAR2 (255);
   v_alg_gebouw_code           VARCHAR2 (255);
   v_alg_verdieping_volgnr     VARCHAR2 (255);                         -- C10
   v_alg_verdieping_volgnr_n   NUMBER (3);                              -- N3
   v_alg_ruimte_nr             VARCHAR2 (255);                         -- C10

   CURSOR c1
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   DELETE FROM uwva_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_errormsg := '';
         v_ongeldig := 0;
         v_wp_ongeldig := 0;
         -- Lees alle veldwaarden
         -- 01
         fac.imp_getfield (v_newline, c_delim, v_prs_perslid_nr);
         -- 02
         fac.imp_getfield (v_newline, c_delim, v_prs_perslid_oslogin);
         -- 03
         fac.imp_getfield (v_newline, c_delim, v_prs_perslid_oslogin2);
         -- 04
         fac.imp_getfield (v_newline, c_delim, v_prs_perslid_telefoonnr);
         -- 05
         fac.imp_getfield (v_newline, c_delim, v_prs_perslid_mobiel);
         -- 06
         fac.imp_getfield (v_newline, c_delim, v_prs_perslid_email);
         -- 07
         fac.imp_getfield (v_newline, c_delim, v_alg_locatie_code);
         -- 08
         fac.imp_getfield (v_newline, c_delim, v_alg_gebouw_code);
         -- 09
         fac.imp_getfield (v_newline, c_delim, v_alg_verdieping_volgnr);
         -- 10
         fac.imp_getfield (v_newline, c_delim, v_alg_ruimte_nr);
         --
         v_aanduiding :=
             '[' || COALESCE (v_prs_perslid_nr, v_prs_perslid_oslogin)
             || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_prs_perslid_nr) = 'PERSONEELSNUMMER'
               AND UPPER (v_prs_perslid_oslogin) = 'LOGINNAAM'
               AND UPPER (v_prs_perslid_oslogin2) = 'ALT-LOGINNAAM'
               AND UPPER (v_prs_perslid_telefoonnr) = 'TELEFOONNUMMER'
               AND UPPER (v_prs_perslid_mobiel) = 'MOBIEL'
               AND UPPER (v_prs_perslid_email) = 'EMAIL'
               AND UPPER (v_alg_locatie_code) = 'LOCATIECODE'
               AND UPPER (v_alg_gebouw_code) = 'GEBOUWCODE'
               AND UPPER (v_alg_verdieping_volgnr) = 'VERDIEPINGNUMMER'
               AND UPPER (v_alg_ruimte_nr) = 'RUIMTENUMMER'
            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_ongeldig := 1;
               fac.imp_writelog
                  (p_import_key,
                   'W',
                   v_aanduiding || 'Personeelsnummer te lang',
                   'Personeelsnummer is primair verplicht; regel wordt overgeslagen!'
                  );
               COMMIT;
            END IF;

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

            IF LENGTH (v_prs_perslid_oslogin) > 30
            THEN
               IF v_prs_perslid_nr IS NULL
               THEN
                  v_ongeldig := 1;
                  fac.imp_writelog
                     (p_import_key,
                      'W',
                      v_aanduiding || 'Loginnaam te lang',
                      'Loginnaam is secundair verplicht; regel wordt overgeslagen!'
                     );
               ELSE
                  v_prs_perslid_oslogin := NULL;
                  fac.imp_writelog (p_import_key,
                                    'W',
                                    v_aanduiding || 'Loginnaam te lang',
                                    'Loginnaam wordt niet bijgewerkt'
                                   );
               END IF;

               COMMIT;
            END IF;

            --
            IF (    v_ongeldig = 0
                AND v_prs_perslid_nr IS NULL
                AND v_prs_perslid_oslogin IS NULL
               )
            THEN
               v_ongeldig := 1;
               fac.imp_writelog
                  (p_import_key,
                   'W',
                   v_aanduiding || 'Personeelsnummer en loginnaam onbekend',
                   'Personeelsnummer of loginnaam is verplicht; regel wordt overgeslagen!'
                  );
               COMMIT;
            END IF;

            --
            v_errorhint := 'Ongeldige tweede loginnaam';
            v_prs_perslid_oslogin2 := TRIM (v_prs_perslid_oslogin2);

            IF LENGTH (v_prs_perslid_oslogin2) > 30
            THEN
               v_prs_perslid_oslogin2 := NULL;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Tweede loginnaam te lang',
                                 'Tweede loginnaam wordt niet bijgewerkt'
                                );
               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 := NULL;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Telefoonnummer te lang',
                                 'Telefoonnummer wordt niet bijgewerkt'
                                );
               COMMIT;
            END IF;

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

            IF LENGTH (v_prs_perslid_mobiel) > 15
            THEN
               v_prs_perslid_mobiel := NULL;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Mobiel nummer te lang',
                                 'Mobiel nummer wordt niet bijgewerkt'
                                );
               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 := NULL;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'E-mailadres te lang',
                                 'E-mailadres wordt niet bijgewerkt'
                                );
               COMMIT;
            END IF;

            --
            v_errorhint :=
                        'Ongeldige locatiecode [' || v_alg_locatie_code || ']';
            v_alg_locatie_code := TRIM (v_alg_locatie_code);

            IF LENGTH (v_alg_locatie_code) > 5
            THEN
               v_alg_locatie_code := NULL;
               v_wp_ongeldig := 1;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Locatiecode te lang',
                                 'Werkplek wordt niet bijgewerkt'
                                );
               COMMIT;
            END IF;

            --
            v_errorhint :=
                          'Ongeldige gebouwcode [' || v_alg_gebouw_code || ']';
            v_alg_gebouw_code := TRIM (v_alg_gebouw_code);

            IF LENGTH (v_alg_gebouw_code) > 10
            THEN
               v_wp_ongeldig := 1;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Gebouwcode te lang',
                                 'Werkplek wordt niet bijgewerkt'
                                );
               COMMIT;
            END IF;

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

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

               IF v_alg_verdieping_volgnr_n NOT BETWEEN -999 AND 999
               THEN
                  v_wp_ongeldig := 1;
                  fac.imp_writelog (p_import_key,
                                    'W',
                                       v_aanduiding
                                    || 'Verdiepingnummer groter dan 3 posities',
                                    'Werkplek wordt niet bijgewerkt'
                                   );
                  COMMIT;
               END IF;
            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
                     || ')';
                  v_wp_ongeldig := 1;
                  fac.imp_writelog (p_import_key,
                                    'W',
                                    v_aanduiding || v_errormsg,
                                    'Werkplek wordt niet bijgewerkt'
                                   );
                  COMMIT;
            END;

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

            IF LENGTH (v_alg_ruimte_nr) > 10
            THEN
               v_wp_ongeldig := 1;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Ruimtenummer te lang',
                                 'Werkplek wordt niet bijgewerkt'
                                );
               COMMIT;
            END IF;

            SELECT   DECODE (v_alg_locatie_code, NULL, 0, 1)
                   + DECODE (v_alg_gebouw_code, NULL, 0, 1)
                   + DECODE (v_alg_verdieping_volgnr_n, NULL, 0, 1)
                   + DECODE (v_alg_ruimte_nr, NULL, 0, 1)
              INTO v_count
              FROM DUAL;

            IF v_count MOD 4 <> 0
            THEN
               v_wp_ongeldig := 1;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Werkplekgegevens onvolledig',
                                 'Werkplek wordt niet bijgewerkt'
                                );
               COMMIT;
            END IF;

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

                  IF v_wp_ongeldig = 1
                  THEN
                     INSERT INTO uwva_imp_prs
                                 (prs_perslid_nr, prs_perslid_oslogin,
                                  prs_perslid_oslogin2,
                                  prs_perslid_telefoonnr,
                                  prs_perslid_mobiel, prs_perslid_email
                                 )
                          VALUES (v_prs_perslid_nr, v_prs_perslid_oslogin,
                                  v_prs_perslid_oslogin2,
                                  v_prs_perslid_telefoonnr,
                                  v_prs_perslid_mobiel, v_prs_perslid_email
                                 );
                  ELSE
                     INSERT INTO uwva_imp_prs
                                 (prs_perslid_nr, prs_perslid_oslogin,
                                  prs_perslid_oslogin2,
                                  prs_perslid_telefoonnr,
                                  prs_perslid_mobiel, prs_perslid_email,
                                  alg_locatie_code, alg_gebouw_code,
                                  alg_verdieping_volgnr, alg_ruimte_nr
                                 )
                          VALUES (v_prs_perslid_nr, v_prs_perslid_oslogin,
                                  v_prs_perslid_oslogin2,
                                  v_prs_perslid_telefoonnr,
                                  v_prs_perslid_mobiel, v_prs_perslid_email,
                                  v_alg_locatie_code, v_alg_gebouw_code,
                                  v_alg_verdieping_volgnr_n, v_alg_ruimte_nr
                                 );
                  END IF;

                  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 :=
                           ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog (p_import_key,
                                       'W',
                                       v_aanduiding || v_errormsg,
                                       v_errorhint
                                      );
                     COMMIT;
               END;
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!'
                       );
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                           'Persoon: aantal ingelezen regels: '
                        || TO_CHAR (v_count_tot),
                        ''
                       );
      fac.imp_writelog (p_import_key,
                        'S',
                           'Persoon: aantal ongeldige importregels: '
                        || TO_CHAR (v_count_tot - v_count_import),
                        ''
                       );
   END IF;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
           'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'W',
                        v_aanduiding || v_errormsg,
                        v_errorhint
                       );
      COMMIT;
END uwva_import_prs;
/

CREATE OR REPLACE PROCEDURE uwva_update_prs (
   p_import_key IN NUMBER
)
IS
   v_aanduiding       VARCHAR2 (200);
   v_errorhint        VARCHAR2 (1000);
   v_errormsg         VARCHAR2 (1000);
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   v_count_tot        NUMBER (10);
   v_count_error      NUMBER (10);
   v_count            NUMBER (10);
   --
   v_perslid_key      NUMBER (10);
   v_locatie_key      NUMBER (10);
   v_gebouw_key       NUMBER (10);
   v_verdieping_key   NUMBER (10);
   v_ruimte_key       NUMBER (10);
   v_wp_key           NUMBER (10);
   v_wp_volgnr        NUMBER (3);
   v_wp_oms           VARCHAR2 (30);

   -- Dubbele nummers/logins in import? Dan wordt dezelfde persoon 2x (of meer) bijgewerkt!
   CURSOR cperslid
   IS
      SELECT ip.prs_perslid_nr, ip.prs_perslid_oslogin,
             ip.prs_perslid_oslogin2, ip.prs_perslid_telefoonnr,
             ip.prs_perslid_mobiel, ip.prs_perslid_email
        FROM uwva_imp_prs ip;

   -- Dubbele nummers/logins in import? Dan krijgt iemand mogelijk de verkeerde plaats(en)!
   -- NB. Import garandeert dat als locatie niet leeg, dan ook gebouw t/m ruimte niet leeg!
   CURSOR cwp
   IS
      SELECT ip.prs_perslid_nr, ip.prs_perslid_oslogin, ip.alg_locatie_code,
             ip.alg_gebouw_code, ip.alg_verdieping_volgnr, ip.alg_ruimte_nr
        FROM uwva_imp_prs ip
       WHERE ip.alg_locatie_code IS NOT NULL;

   -- 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 'INACTIEF:%'
         AND NOT EXISTS (SELECT 1
                           FROM prs_perslidwerkplek pw
                          WHERE pw.prs_perslid_key = p.prs_perslid_key);
BEGIN
   v_count_tot := 0;
   v_count_error := 0;

   FOR recperslid IN cperslid
   LOOP
      BEGIN
         v_count_tot := v_count_tot + 1;
         v_aanduiding :=
               '['
            || COALESCE (recperslid.prs_perslid_nr,
                         recperslid.prs_perslid_oslogin
                        )
            || '] ';
         v_errorhint := 'Fout bij bepalen persoon';

         IF recperslid.prs_perslid_nr IS NOT NULL
         THEN
            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);
         ELSE
            SELECT COUNT (*), MAX (prs_perslid_key)
              INTO v_count, v_perslid_key
              FROM prs_perslid
             WHERE prs_perslid_verwijder IS NULL
               AND UPPER (prs_perslid_oslogin) = UPPER (recperslid.prs_perslid_oslogin);
         END IF;

         IF (v_count = 1)
         THEN
            v_errorhint := 'Fout bij wijzigen persoon';

            UPDATE prs_perslid
               SET prs_perslid_oslogin =
                      COALESCE (recperslid.prs_perslid_oslogin,
                                prs_perslid_oslogin
                               ),
                   prs_perslid_oslogin2 =
                      COALESCE (recperslid.prs_perslid_oslogin2,
                                prs_perslid_oslogin2
                               ),
                   prs_perslid_telefoonnr =
                      COALESCE (recperslid.prs_perslid_telefoonnr,
                                prs_perslid_telefoonnr
                               ),
                   prs_perslid_mobiel =
                      COALESCE (recperslid.prs_perslid_mobiel,
                                prs_perslid_mobiel
                               ),
                   prs_perslid_email =
                      COALESCE (recperslid.prs_perslid_email,
                                prs_perslid_email
                               )
             WHERE prs_perslid_key = v_perslid_key;
         ELSE
            IF (v_count = 0)
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                    v_aanduiding
                                 || ' Persoon niet bekend in Facilitor',
                                 v_errorhint
                                );
            ELSE                                              -- (v_count > 1)
               fac.imp_writelog (p_import_key,
                                 'W',
                                    v_aanduiding
                                 || ' Persoon niet 1-duidig te bepalen',
                                 v_errorhint
                                );
            END IF;
         END IF;

         COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            v_count_error := v_count_error + 1;
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=
               'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'W',
                              v_aanduiding || v_errormsg,
                              v_errorhint
                             );
            COMMIT;
      END;
   END LOOP;

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

   v_count_tot := 0;
   v_count_error := 0;

   FOR recwp IN cwp
   LOOP
      BEGIN
         v_count_tot := v_count_tot + 1;
         v_aanduiding :=
               '['
            || COALESCE (recwp.prs_perslid_nr, recwp.prs_perslid_oslogin)
            || '] ';
         v_errorhint := 'Fout bij bepalen persoon';

         IF recwp.prs_perslid_nr IS NOT NULL
         THEN
            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 (recwp.prs_perslid_nr);
         ELSE
            SELECT COUNT (*), MAX (prs_perslid_key)
              INTO v_count, v_perslid_key
              FROM prs_perslid
             WHERE prs_perslid_verwijder IS NULL
               AND UPPER (prs_perslid_oslogin) = UPPER (recwp.prs_perslid_oslogin);
         END IF;

         IF (v_count = 1)
         THEN
            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 UPPER (alg_verdieping_volgnr) = UPPER (recwp.alg_verdieping_volgnr);

            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 UPPER (r.alg_ruimte_nr) = UPPER (recwp.alg_ruimte_nr);

            -- Persoon verhuist naar/krijgt nieuwe werkplek in betreffende gebouw!
            v_errorhint := 'Fout bij verhuizen naar nieuwe werkplek';
            PRS.movetoruimte (v_perslid_key, v_ruimte_key, 'G');
         --ELSE
         --Niets, want dat is dan al gemeld in voorgaande loop!
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            v_count_error := v_count_error + 1;
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=
               'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'W',
                              v_aanduiding || v_errormsg,
                              v_errorhint
                             );
            COMMIT;
      END;
   END LOOP;

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

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

--UWVA#30448: PWP-import
/* Formatted on 12-12-2014 14:45:15 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PROCEDURE uwva_import_pwp (p_import_key IN NUMBER)
AS
   c_delim            VARCHAR2 (1) := ';';
   v_newline          VARCHAR2 (1000);                           -- Input line
   v_errormsg         VARCHAR2 (1000);
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   v_aanduiding       VARCHAR2 (200) := '';
   header_is_valid    NUMBER := 0;
   v_count_tot        NUMBER (10) := 0;
   v_count_import     NUMBER (10) := 0;
   v_ongeldig         NUMBER (1) := 0;
   -- De importvelden
   v_login            VARCHAR2 (255);               -- C30/prs_perslid_oslogin
   v_locatie          VARCHAR2 (255);                  -- C10/alg_locatie_code
   v_gebouw           VARCHAR2 (255);                   -- C12/alg_gebouw_code
   v_verdiepingcode   VARCHAR2 (255);               -- C10/alg_verdieping_code
   v_ruimtenr         VARCHAR2 (255);                     -- C10/alg_ruimte_nr
   v_pwp_volgnr       VARCHAR2 (255);         -- N2/prs_perslidwerkplek_volgnr
   v_bezetting        VARCHAR2 (255);      -- N3/prs_perslidwerkplek_bezetting

   -- Overige velden:
   CURSOR c1
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   DELETE FROM uwva_imp_pwp;

   COMMIT;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout bij opvragen importregel';
         v_aanduiding := '';
         v_ongeldig := 0;

         -- Lees alle veldwaarden
         -- LOGIN;LOCATIE;GEBOUW;VERDIEPINGCODE;RUIMTENR;PWP_VOLGNR;BEZETTING
         fac.imp_getfield (v_newline, c_delim, v_login);
         fac.imp_getfield (v_newline, c_delim, v_locatie);
         fac.imp_getfield (v_newline, c_delim, v_gebouw);
         fac.imp_getfield (v_newline, c_delim, v_verdiepingcode);
         fac.imp_getfield (v_newline, c_delim, v_ruimtenr);
         fac.imp_getfield (v_newline, c_delim, v_pwp_volgnr);
         fac.imp_getfield (v_newline, c_delim, v_bezetting);
         v_aanduiding :=
               '['
            || v_login
            || '|'
            || v_gebouw
            || '|'
            || v_verdiepingcode
            || '|'
            || v_ruimtenr
            || '|'
            || TO_CHAR (v_pwp_volgnr)
            || '|'
            || TO_CHAR (v_bezetting)
            || '] ';

         -- 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 (TRIM (v_login)) = 'LOGIN'
               AND UPPER (TRIM (v_locatie)) = 'LOCATIE'
               AND UPPER (TRIM (v_gebouw)) = 'GEBOUW'
               AND UPPER (TRIM (v_verdiepingcode)) = 'VERDIEPINGCODE'
               AND UPPER (TRIM (v_ruimtenr)) = 'RUIMTENR'
               AND UPPER (TRIM (v_pwp_volgnr)) = 'PWP_VOLGNR'
               AND UPPER (TRIM (v_bezetting)) = 'BEZETTING'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errormsg := 'Login ongeldig/ongedefinieerd of te lang';
            v_login := TRIM (v_login);

            IF v_login IS NULL OR LENGTH (v_login) > 30
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Regel wordt overgeslagen!');
            END IF;

            --
            v_errormsg := 'Locatie ongeldig/ongedefinieerd of te lang';
            v_locatie := TRIM (v_locatie);

            IF v_locatie IS NULL OR LENGTH (v_locatie) > 10
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Regel wordt overgeslagen!');
            END IF;

            --
            v_errormsg := 'Gebouw ongeldig/ongedefinieerd of te lang';
            v_gebouw := TRIM (v_gebouw);

            IF v_gebouw IS NULL OR LENGTH (v_gebouw) > 12
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Regel wordt overgeslagen!');
            END IF;

            --
            v_errormsg := 'Verdieping ongeldig/ongedefinieerd of te lang';
            v_verdiepingcode := TRIM (v_verdiepingcode);

            IF v_verdiepingcode IS NULL OR LENGTH (v_verdiepingcode) > 10
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Regel wordt overgeslagen!');
            END IF;

            --
            v_errormsg := 'Ruimtenr ongeldig/ongedefinieerd of te lang';
            v_ruimtenr := TRIM (v_ruimtenr);

            IF v_ruimtenr IS NULL OR LENGTH (v_ruimtenr) > 10
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Regel wordt overgeslagen!');
            END IF;

            --
            v_errormsg := 'PWP-volgnr ongeldig';
            v_pwp_volgnr := TRIM (v_pwp_volgnr);

            IF v_pwp_volgnr IS NOT NULL AND COALESCE (fac.safe_to_number (v_pwp_volgnr), -1) NOT BETWEEN 0 AND 99
            THEN
               v_pwp_volgnr := NULL;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Volgnummer wordt genegeerd!');
            END IF;

            --
            v_errormsg := 'Bezetting ongeldig/ongedefinieerd';
            v_bezetting := TRIM (v_bezetting);

            IF COALESCE (fac.safe_to_number (v_bezetting), -1) NOT BETWEEN 0 AND 100
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Regel wordt overgeslagen!');
            END IF;

            -- Insert geformatteerde import record
            IF (v_ongeldig = 0)
            THEN
               BEGIN
                  v_errormsg := 'Fout wegschrijven importregel';

                  INSERT INTO uwva_imp_pwp (login,
                                            locatie,
                                            gebouw,
                                            verdiepingcode,
                                            ruimtenr,
                                            pwp_volgnr,
                                            bezetting)
                      VALUES (v_login,
                              v_locatie,
                              v_gebouw,
                              v_verdiepingcode,
                              v_ruimtenr,
                              fac.safe_to_number (v_pwp_volgnr),
                              fac.safe_to_number (v_bezetting));

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

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!');
   ELSE
      fac.imp_writelog (
         p_import_key,
         'S',
         'Inleesproces/#ingelezen importregels: ' || TO_CHAR (v_count_tot),
         '');
      fac.imp_writelog (
         p_import_key,
         'S',
         'Inleesproces/#ongeldige niet ingelezen 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, 200);
      v_errormsg :=
            v_errormsg
         || 'ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Inleesproces PWP afgebroken!');
END;
/

CREATE OR REPLACE PROCEDURE uwva_update_pwp (p_import_key IN NUMBER)
AS
   -- Cursor loopt - op login/locatie/gebouw/verdiepingcode/ruimtenr! - over
   -- alle ingelezen regels.
   CURSOR c1
   IS
        SELECT *
          FROM uwva_imp_pwp
      ORDER BY 1, 2, 3, 4, 5;

   v_errormsg         VARCHAR2 (1000);
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   v_aanduiding       VARCHAR2 (200);
   v_count            NUMBER (10) := 0;
   v_count_tot        NUMBER (10) := 0;
   v_count_upd        NUMBER (10) := 0;
   v_perslid_key      prs_perslid.prs_perslid_key%TYPE;
   v_locatie_key      alg_locatie.alg_locatie_key%TYPE;
   v_gebouw_key       alg_gebouw.alg_gebouw_key%TYPE;
   v_verdieping_key   alg_verdieping.alg_verdieping_key%TYPE;
   v_ruimte_key       alg_ruimte.alg_ruimte_key%TYPE;
   v_pwp_key          prs_perslidwerkplek.prs_perslidwerkplek_key%TYPE;
BEGIN
   -- Loop over alle ingelezen PWP-regels.
   FOR rec1 IN c1
   LOOP
      BEGIN
         v_aanduiding :=
               '['
            || rec1.login
            || '|'
            || rec1.gebouw
            || '|'
            || rec1.verdiepingcode
            || '|'
            || rec1.ruimtenr
            || '|'
            || TO_CHAR (rec1.pwp_volgnr)
            || '|'
            || TO_CHAR (rec1.bezetting)
            || '] ';
         v_count_tot := v_count_tot + 1;

         v_errormsg := 'Fout bepalen persoon';

         SELECT prs_perslid_key
           INTO v_perslid_key
           FROM prs_v_aanwezigperslid
          WHERE prs_perslid_oslogin = UPPER (rec1.login)
                OR prs_perslid_oslogin2 = UPPER (rec1.login);

         v_errormsg := 'Fout bepalen locatie';

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

         v_errormsg := 'Fout bepalen gebouw';

         SELECT alg_gebouw_key
           INTO v_gebouw_key
           FROM alg_v_aanweziggebouw
          WHERE alg_gebouw_upper = UPPER (rec1.gebouw)
                AND alg_locatie_key = v_locatie_key;

         v_errormsg := 'Fout bepalen verdiepingcode';

         SELECT alg_verdieping_key
           INTO v_verdieping_key
           FROM alg_v_aanwezigverdieping
          WHERE UPPER (alg_verdieping_code) = UPPER (rec1.verdiepingcode)
                AND alg_gebouw_key = v_gebouw_key;

         v_errormsg := 'Fout bepalen ruimtenr';

         SELECT alg_ruimte_key
           INTO v_ruimte_key
           FROM alg_v_aanwezigruimte
          WHERE alg_ruimte_upper_nr = UPPER (rec1.ruimtenr)
                AND alg_verdieping_key = v_verdieping_key;

         v_errormsg := 'Fout bepalen bestaande werkplek op locatie';

         SELECT COUNT ( * )
           INTO v_count
           FROM prs_perslidwerkplek pwp,
                prs_werkplek wp,
                alg_ruimte r,
                alg_verdieping v,
                alg_gebouw g
          WHERE     pwp.prs_perslid_key = v_perslid_key
                AND pwp.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 = g.alg_gebouw_key
                AND g.alg_locatie_key = v_locatie_key;

         -- Als op locatie reeds een bestaande WP, dan niet nog een toewijzen.
         IF (v_count = 0)
         THEN
            v_errormsg := 'Fout toewijzen werkplek';
            PRS.movetoruimte (v_perslid_key, v_ruimte_key, NULL);

            v_errormsg := 'Fout bepalen werkplek';

            SELECT pwp.prs_perslidwerkplek_key
              INTO v_pwp_key
              FROM prs_perslidwerkplek pwp, prs_werkplek wp
             WHERE     pwp.prs_perslid_key = v_perslid_key
                   AND pwp.prs_werkplek_key = wp.prs_werkplek_key
                   AND wp.prs_werkplek_virtueel = 0    -- Alleen echte plekken
                   AND wp.prs_werkplek_type = 0        -- Alleen vaste plekken
                   AND wp.prs_alg_ruimte_key = v_ruimte_key;

            v_errormsg := 'Fout bijwerken werkplek';

            UPDATE prs_perslidwerkplek
               SET prs_perslidwerkplek_volgnr = rec1.pwp_volgnr,
                   prs_perslidwerkplek_bezetting = rec1.bezetting
             WHERE prs_perslidwerkplek_key = v_pwp_key;

            v_count_upd := v_count_upd + 1;
         ELSE
            fac.imp_writelog (p_import_key,
                              'I',
                              v_aanduiding || 'Werkplek ongewijzigd',
                              '');
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=
                  v_errormsg
               || ' ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              '');
      END;
   END LOOP;

   fac.imp_writelog (p_import_key,
                     'S',
                     'PWPs/#ingelezen: ' || TO_CHAR (v_count_tot),
                     '');
   fac.imp_writelog (p_import_key,
                     'S',
                     'PWPs/#toegevoegd: ' || TO_CHAR (v_count_upd),
                     '');
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=
            v_errormsg
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_errormsg,
                        'Importproces PWP afgebroken!');
END;
/


/* Formatted on 17-2-2014 11:48:12 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW uwva_v_email_schrijfwijzer
(
   prs_key,
   fac_id,
   imp_id,
   imp_empnum,
   imp_nickname,
   imp_lastname,
   imp_spousename,
   fac_email,
   imp_email,
   sw_email
)
AS
   SELECT DISTINCT
          p.prs_perslid_key,
          kl.prs_kenmerklink_waarde,
          ip.id,
          ip.empnum,
          ip.nickname,
          ip.lastname,
          ip.spousename,
          p.prs_perslid_email,
          ip.email,
          DECODE (
             INSTR (COALESCE (p.prs_perslid_email, ip.email), '@'),
             NULL,                         -- geen email bekend -> ongewijzigd
             COALESCE (p.prs_perslid_email, ip.email),
             0,                            -- geen '@' in email -> ongewijzigd
             COALESCE (p.prs_perslid_email, ip.email),
             CASE                                         -- email met een '@'
                WHEN INSTR (COALESCE (p.prs_perslid_email, ip.email) || '.', '.') <
                        INSTR (COALESCE (p.prs_perslid_email, ip.email), '@')
                THEN                         -- . voor @ (dus meeste gevallen)
                   REPLACE (
                      REPLACE (
                         REPLACE (
                            REPLACE (
                               INITCAP(SUBSTR (LOWER(COALESCE (p.prs_perslid_email, ip.email)),
                                          1,
                                          INSTR (COALESCE (p.prs_perslid_email, ip.email), '.', -1, 2) - 1))
                               || SUBSTR (LOWER(COALESCE (p.prs_perslid_email, ip.email)),
                                     INSTR (COALESCE (p.prs_perslid_email, ip.email), '.', -1, 2)),
                               INITCAP(REPLACE (COALESCE (nickname, vnaam), ' ', '') || '.'),
                               REPLACE (INITCAP (COALESCE (nickname, vnaam)), ' ', '') || '.'),
                            LOWER(SUBSTR (TRIM (COALESCE (lastname, anaam)),
                                     1,
                                     INSTR (TRIM (COALESCE (lastname, anaam)), ' ') - 1)),
                            SUBSTR (INITCAP (TRIM (COALESCE (lastname, anaam))),
                               1,
                               INSTR (TRIM (COALESCE (lastname, anaam)), ' ') - 1)),
                         LOWER(SUBSTR (TRIM (COALESCE (lastname, anaam)),
                                  INSTR (TRIM (COALESCE (lastname, anaam)), ' ', -1) + 1)),
                         SUBSTR (INITCAP (TRIM (COALESCE (lastname, anaam))),
                            INSTR (TRIM (COALESCE (lastname, anaam)), ' ', -1) + 1)),
                      LOWER (REPLACE (spousename, ' ', '')),
                      REPLACE (INITCAP (spousename), ' ', ''))
                ELSE -- geen . voor @ (bkwi.nl/uwv.local; <30!) -> ongewijzigd
                   COALESCE (p.prs_perslid_email, ip.email)
             END)
             email_schrijfwijzer
     FROM (SELECT prs_perslid_key,
                  REPLACE (prs_perslid_email, '$', '@') prs_perslid_email,
                  prs_perslid_voornaam vnaam,
                  prs_perslid_naam anaam
             FROM prs_v_aanwezigperslid) p
          LEFT JOIN prs_v_aanwezigkenmerklink kl
             ON p.prs_perslid_key = kl.prs_link_key
                AND kl.prs_kenmerk_key = 1232                        -- ABS-ID
          FULL JOIN (SELECT *
                       FROM uwva_imp_abs
                      WHERE SUBSTR (empnum, 1, 1) IN ('C', 'I', 'E', 'F', 'D', 'K')) ip
             ON kl.prs_kenmerklink_waarde = ip.id;

/* Formatted on 4-7-2016 16:45:15 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW uwva_v_rap_uitdienst
(
   extra_key,
   perslid_nr,
   absid,
   perslid_naam_full,
   kpn_nr,
   kpn_oms,
   verplichting
)
AS           -- Voorgaande import uitdienst ‚n lopende/actuele verplichtingen!
   SELECT p.prs_perslid_key,
          p.prs_perslid_nr,
          kl2.prs_kenmerklink_waarde,
          pf.prs_perslid_naam_full,
          kp.prs_kostenplaats_nr,
          kp.prs_kostenplaats_omschrijving,
          lcl.fac_locale_xsl_tekst || ' ' || vp.item
     FROM prs_v_aanwezigperslid p,
          prs_afdeling a,
          prs_kostenplaats kp,
          prs_v_perslid_fullnames_all pf,
          prs_v_verplichting vp, --_keys vp,
          prs_kenmerklink kl1,
          prs_kenmerklink kl2,
          fac_locale_xsl lcl
    WHERE     p.prs_afdeling_key = a.prs_afdeling_key
          AND a.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
          AND p.prs_perslid_key = pf.prs_perslid_key
          AND p.prs_perslid_key = vp.prs_perslid_key(+)
          AND p.prs_perslid_key = kl1.prs_link_key
          AND kl1.prs_kenmerk_key = 1040                    -- Type Medewerker
          AND kl1.prs_kenmerklink_waarde IN
                   (SELECT TO_CHAR (fac_usrdata_key)
                      FROM fac_usrdata
                     WHERE fac_usrtab_key = 301             -- Type_medewerker
                           AND fac_usrdata_upper IN ('C', 'I', 'E', 'F', 'D', 'K'))
          AND p.prs_perslid_key = kl2.prs_link_key
          AND kl2.prs_kenmerk_key = 1232                             -- ABS-ID
          AND NOT EXISTS (SELECT 1
                            FROM uwva_imp_abs uia
                           WHERE uia.id = kl2.prs_kenmerklink_waarde)
          AND vp.fac_message_code = lcl.fac_locale_xsl_label
          AND lcl.fac_locale_xsl_lang = 'NL';

-- ABS importfunctie, herziene versie volgens UWVA#18115, met aanvullingen voor Vinder (UWVA#19010)
CREATE OR REPLACE PROCEDURE uwva_import_abs (p_import_key IN NUMBER)
AS
   CURSOR c1
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;

   v_newline          VARCHAR2 (1000);           -- Import line
   v_field            VARCHAR2 (100);            -- Import field
   v_fielddelimitor   VARCHAR2 (1)     := ';';   -- Field seperator
   v_count_import     NUMBER   (10);
   v_count            NUMBER;
   v_errormsg         VARCHAR2 (200);
   v_errorhint        VARCHAR2 (200);
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   v_buffercount      NUMBER           := 0;
   c_commitbuffer     NUMBER           := 2000;  -- om de zoveel committen
   -- De importvelden
   v_prefname         VARCHAR2 (100);
   v_lastname         VARCHAR2 (100);
   v_prefix           VARCHAR2 (100);
   v_spousename       VARCHAR2 (100);
   v_spouseprefix     VARCHAR2 (100);
   v_nickname         VARCHAR2 (100);
   v_titel            VARCHAR2 (100);
   v_account          VARCHAR2 (100);
   v_altaccnt         VARCHAR2 (100);
   v_funcdscr         VARCHAR2 (100);
   v_telno            VARCHAR2 (100);
   v_mobno            VARCHAR2 (100);
   v_faxno            VARCHAR2 (100);
   v_email            VARCHAR2 (255);
   v_initials         VARCHAR2 (100);
   v_empnum           VARCHAR2 (100);
   v_costcent         VARCHAR2 (100);
   v_gender           VARCHAR2 (100);
   v_employeetype     VARCHAR2 (100);
   v_pandcode         VARCHAR2 (100);
   v_grpfname         VARCHAR2 (100);
   v_grpid            VARCHAR2 (100);
   v_id               VARCHAR2 (100);
   header_found       BOOLEAN          := FALSE;
BEGIN
   -- Clear my previous imported rows
   DELETE FROM uwva_imp_abs;

   v_count_import := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;

         fac.imp_getfield (v_newline, v_fielddelimitor, v_prefname);     -- prefname
         fac.imp_getfield (v_newline, v_fielddelimitor, v_nickname);     -- nickname
         fac.imp_getfield (v_newline, v_fielddelimitor, v_titel);        -- titel
         fac.imp_getfield (v_newline, v_fielddelimitor, v_account);      -- accnt
         fac.imp_getfield (v_newline, v_fielddelimitor, v_altaccnt);     -- altaccnt
         fac.imp_getfield (v_newline, v_fielddelimitor, v_funcdscr);     -- funcdscr
         fac.imp_getfield (v_newline, v_fielddelimitor, v_telno);        -- telno
         fac.imp_getfield (v_newline, v_fielddelimitor, v_mobno);        -- mobnr
         fac.imp_getfield (v_newline, v_fielddelimitor, v_faxno);        -- faxnr
         fac.imp_getfield (v_newline, v_fielddelimitor, v_email);        -- email
         fac.imp_getfield (v_newline, v_fielddelimitor, v_initials);     -- initials
         fac.imp_getfield (v_newline, v_fielddelimitor, v_prefix);       -- prefix
         fac.imp_getfield (v_newline, v_fielddelimitor, v_empnum);       -- empnum
         fac.imp_getfield (v_newline, v_fielddelimitor, v_costcent);     -- costcent
         fac.imp_getfield (v_newline, v_fielddelimitor, v_gender);       -- gender
         fac.imp_getfield (v_newline, v_fielddelimitor, v_employeetype); -- type
         fac.imp_getfield (v_newline, v_fielddelimitor, v_pandcode);     -- location
         fac.imp_getfield (v_newline, v_fielddelimitor, v_id);           -- id
         fac.imp_getfield (v_newline, v_fielddelimitor, v_grpfname);     -- grpfname
         fac.imp_getfield (v_newline, v_fielddelimitor, v_grpid);        -- grpid
         fac.imp_getfield (v_newline, v_fielddelimitor, v_lastname);     -- lastname
         fac.imp_getfield (v_newline, v_fielddelimitor, v_spousename);   -- spousename
         fac.imp_getfield (v_newline, v_fielddelimitor, v_spouseprefix); -- spouseprefix

         -- Skip until the header is found
         IF (header_found = FALSE)
         THEN
            IF     UPPER (v_prefname)     = 'PREFNAME'       -- PREFNAME
               AND UPPER (v_nickname)     = 'NICKNAME'       -- NICKNAME
               AND UPPER (v_titel)        = 'TITEL'          -- TITEL
               AND UPPER (v_account)      = 'ACCNT'          -- ACCNT
               AND UPPER (v_altaccnt)     = 'ALTACCNT'       -- ALTACCNT
               AND UPPER (v_funcdscr)     = 'FUNCDSCR'       -- FUNCDSCR
               AND UPPER (v_telno)        = 'TELNO'          -- TELNO
               AND UPPER (v_mobno)        = 'MOBNR'          -- MOBNR
               AND UPPER (v_faxno)        = 'FAXNR'          -- FAXNR
               AND UPPER (v_email)        = 'EMAIL'          -- EMAIL
               AND UPPER (v_initials)     = 'INITIALS'       -- INITIALS
               AND UPPER (v_prefix)       = 'PREFIX'         -- PREFIX
               AND UPPER (v_empnum)       = 'EMPNUM'         -- EMPNUM
               AND UPPER (v_costcent)     = 'COSTCENT'       -- COSTCENT
               AND UPPER (v_gender)       = 'GENDER'         -- GENDER
               AND UPPER (v_employeetype) = 'TYPE'           -- TYPE
               AND UPPER (v_pandcode)     = 'LOCATION'       -- LOCATION
               AND UPPER (v_id)           = 'ID'             -- ID
               AND UPPER (v_grpfname)     = 'GRPFNAME'       -- GRPFNAME
               AND UPPER (v_grpid)        = 'GRPID'          -- GRPID
               AND UPPER (v_lastname)     = 'LASTNAME'       -- LASTNAME
               AND UPPER (v_spousename)   = 'SPOUSENAME'     -- SPOUSENAME
               AND UPPER (v_spouseprefix) = 'SPOUSEPREFIX'   -- SPOUSEPREFIX
            THEN
               header_found := TRUE;
            END IF;
         ELSE
            INSERT INTO uwva_imp_abs (id,
                                      prefname,
                                      nickname,
                                      titel,
                                      account,
                                      funcdscr,
                                      telno,
                                      mobno,
                                      faxno,
                                      email,
                                      initials,
                                      prefix,
                                      empnum,                  -- personeelsnummer incl. prefix voor werknemertype (zoals in importbestand)
                                      empnum_noprefix,         -- personeelsnummer excl. prefix voor werknemertype (zoals initieel in Facilitor)
                                      costcent,
                                      gender,
                                      employeetype,
                                      pandcode,
                                      grpfname,
                                      grpid,
                                      lastname,
                                      spousename,
                                      spouseprefix)
                VALUES (fac.safe_to_number(v_id),              -- flexkenmerk heeft type Numeriek, dus hier vast omzetten (voorloopnullen eraf)
                        SUBSTR (v_prefname, 1, 100),           -- kan samenvoeging van voor- en achternaam bevatten, dus lekker lang laten
                        SUBSTR (v_nickname, 1, 30),
                        SUBSTR (v_titel, 1, 15),
                        UPPER ( SUBSTR (v_account, 1, 30) ),   -- UPPER, dat scheelt executietijd bij update_abs, ivm indexing e.d.
                        SUBSTR ( TRIM (v_funcdscr), 1, 60),
                        SUBSTR (v_telno, 1, 20),
                        SUBSTR (v_mobno, 1, 20),
                        SUBSTR (v_faxno, 1, 20),
                        SUBSTR (v_email, 1, 200),
                        SUBSTR (v_initials, 1, 10),
                        SUBSTR (v_prefix, 1, 15),
                        UPPER ( SUBSTR (v_empnum, 1, 16) ),    -- UPPER, dat scheelt executietijd bij update_abs, ivm indexing e.d.
                        UPPER ( SUBSTR (v_empnum, 3, 16) ),    -- UPPER, dat scheelt executietijd bij update_abs, ivm indexing e.d.
                        LPAD (v_costcent, 6, 0),
                        UPPER ( SUBSTR (v_gender, 1, 1) ),     -- UPPER, dat scheelt executietijd bij update_abs, ivm indexing e.d.
                        UPPER ( SUBSTR (v_empnum, 1, 1) ),     -- UPPER, dat scheelt executietijd bij update_abs, ivm indexing e.d.
                        SUBSTR (v_pandcode, 1, 6),
                        SUBSTR (v_grpfname, 1, 40),
                        SUBSTR (v_grpid, 1, 40),
                        SUBSTR (v_lastname, 1, 30),
                        SUBSTR (v_spousename, 1, 30),
                        SUBSTR (v_spouseprefix, 1, 15));

            v_count_import := v_count_import + 1;
         END IF;

         -- Elke c_commitbuffer regels committen
         v_buffercount := v_buffercount + 1;
         IF (v_buffercount >= c_commitbuffer)
         THEN
            COMMIT;
            v_buffercount := 0;
         END IF;
      END;
   END LOOP;

   IF (header_found = FALSE)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!'
                       );
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                           'Aantal ingelezen regels: '
                        || TO_CHAR (v_count_import),
                        ''
                       );
   END IF;

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

-- Functies om werknemertype te bepalen en flexkenmerken op te halen
CREATE OR REPLACE PACKAGE uwva_abs
AS
   FUNCTION get_flexval (p_import_key IN NUMBER, perslid_key IN NUMBER, flex_key IN NUMBER) RETURN VARCHAR2;
   FUNCTION get_employeetype (p_import_key IN NUMBER, perslid_key IN NUMBER, employeetype_key IN NUMBER) RETURN VARCHAR2;
END uwva_abs;
/

CREATE OR REPLACE PACKAGE BODY uwva_abs
AS
   FUNCTION get_flexval (p_import_key IN NUMBER, perslid_key IN NUMBER, flex_key IN NUMBER) RETURN VARCHAR2
   IS
      vf_flexval            VARCHAR(60)            := '';
   BEGIN
      SELECT prs_kenmerklink_waarde
        INTO vf_flexval
        FROM prs_kenmerklink
       WHERE prs_link_key = perslid_key
         AND prs_kenmerk_key = flex_key
         AND prs_kenmerklink_verwijder IS NULL;

      RETURN vf_flexval;
   EXCEPTION
      WHEN OTHERS
      THEN
         RETURN '';
   END get_flexval;

   FUNCTION get_employeetype (p_import_key IN NUMBER, perslid_key IN NUMBER, employeetype_key IN NUMBER) RETURN VARCHAR2
   IS
      vf_employeetype            VARCHAR(5)            := '';
   BEGIN
      SELECT ud.fac_usrdata_upper
        INTO vf_employeetype
        FROM prs_perslid p,
             prs_kenmerklink km,
             fac_usrdata ud
       WHERE     km.prs_link_key = p.prs_perslid_key
             AND km.prs_kenmerk_key = employeetype_key
             AND ud.fac_usrdata_key = km.prs_kenmerklink_waarde
             AND p.prs_perslid_key = perslid_key;

      RETURN vf_employeetype;
   EXCEPTION
      WHEN OTHERS
      THEN
         RETURN '';
   END get_employeetype;

END uwva_abs;
/

-- ABS importfunctie, herziene versie volgens UWVA#18115, met aanvullingen voor Vinder (UWVA#19010)
CREATE OR REPLACE PROCEDURE uwva_update_abs (p_import_key IN NUMBER)
AS
   -- Constanten
   et_check                      INTEGER;
   c_functie_onbekend            VARCHAR2 (60)      := 'Functie onbekend in ABS';
   c_absid_key                   NUMBER (10)        := 1232;    -- PROD
   c_grp_default_key             NUMBER (10)        := 241;     -- PROD
   c_employeetype_key            NUMBER (10)        := 1040;    -- Het flexkenmerk dat het employeetype registreert
                                                                -- C(contract), I(intern), E(extern), F(flexplek), D(dummy), K(ketenpartner), W(wonga)
   c_usrtab_employeetype_key     NUMBER (10)        := 301;     -- Dat is een referentiekenmerk naar fac_userdata die we opzoeken
   c_usrtab_pandcodes_key        NUMBER (10)        := 1;       -- Het flexkenmerk dat de pandcode registreert
   c_usrtab_pandcoderegio_key    NUMBER (10)        := 782;
   c_usrtab_regiovinder_key      NUMBER (10)        := 783;
   c_usrdata_onbekend_omschr     VARCHAR2 (60)      := 'ONBEKEND';
   c_usrdata_onbekend_key        NUMBER (10)        := 4889;
   c_regio_key                   NUMBER (10)        := 1193;
   c_faxnr_key                   NUMBER (10)        := 7;
   c_srtgebouw_default           INTEGER            := 1;
   c_srtruimte_default           INTEGER            := 1;
   c_ruimte_code                 VARCHAR2 (4)       := '_000';
   c_ruimte_omschr_default       VARCHAR2 (16)      := 'Onbekend';
   c_verdieping_omschr_default   VARCHAR2 (16)      := 'BG';
   c_werkplek_volgnr_default     INTEGER            := 1;
   c_prs_werkplek_omschrijving   VARCHAR2 (16)      := 'imp';
   c_def_pandcode_ketenpartner   VARCHAR2 (6)       := 'GAMSG3';
   -- Voor budgethouders (uit voormalige budgethouderimport)
   c_kpn_maxvariation            NUMBER             := 0.5;     -- Max new/old ratio to prevent undesired changes
   l_oldcount                    NUMBER;
   l_impcount                    NUMBER;
   l_impcount_prj                NUMBER;
   c_grp_budgh_key               NUMBER             := 1061;
   c_grp_medewerker_key          NUMBER             := 1601;
   nrbh1                         NUMBER;
   nrbh2                         NUMBER;

   c_maxvariation                NUMBER             := 20;
   c_commitbuffer                NUMBER             := 5000;    -- om de zoveel committen
   v_buffercount                 NUMBER             := 0;
   v_time                        VARCHAR2 (50);
   v_deelkey                     NUMBER (10);
   v_deeloms                     VARCHAR2 (60);
   v_deelstat                    VARCHAR2 (60);

   -- Alle personen in Facilitor die (nog) geen ABS-ID (het unieke ID binnen ABS) hebben.
   -- Deze personen worden gematcht op basis van: 1) account
   --                                             2) personeelsnr-met-prefix
   --                                             3) personeelsnr-zonder-prefix + type
   -- Hierbij worden alle medewerkertypen (en mensen zonder type) aangepast, dus ook types
   -- die ABS vervolgens niet aanpast(!).
   -- Mensen die niet gevonden kunnen worden, krijgen type 'P'.
   CURSOR c_prs_no_absid
   IS
        SELECT prs_perslid_key, prs_perslid_naam, prs_perslid_oslogin, prs_perslid_nr
          FROM prs_perslid
         WHERE prs_perslid_key IN
                     (SELECT prs_perslid_key
                        FROM prs_v_aanwezigperslid
                     MINUS
                      SELECT prs_link_key
                        FROM prs_v_aanwezigkenmerklink
                       WHERE prs_kenmerk_key = c_absid_key
                             AND prs_kenmerklink_waarde IS NOT NULL
                     MINUS
                      SELECT prs_link_key
                        FROM prs_v_aanwezigkenmerklink
                       WHERE prs_kenmerk_key = c_employeetype_key
                             AND prs_kenmerklink_waarde = 24747)  -- X(derden)
      ORDER BY 1;

   -- Om te kunnen bepalen wat we met mensen moeten doen, moeten we weten welk werknemertype iemand heeft.
   -- Het type in Facilitor kan leeg zijn (sowieso bij de eerste import), dus we proberen dit aan te
   -- vullen vanuit het importbestand. Zodra het type gevuld is, kunnen we kijken of iemand I,E,C,F,D,K,W
   -- is en of hij/zij bijgewerkt/verwijderd moet worden.
   CURSOR c_prs_no_type
   IS
      SELECT prs_perslid_key,
             prs_perslid_naam,
             uwva_abs.get_flexval( p_import_key, prs_perslid_key, c_absid_key ) absid,
             prs_perslid_oslogin,
             prs_perslid_nr
        FROM prs_perslid
       WHERE prs_perslid_key IN
                   (SELECT prs_perslid_key
                      FROM prs_v_aanwezigperslid
                   MINUS
                    SELECT prs_link_key
                      FROM prs_kenmerklink
                     WHERE     prs_kenmerk_key = c_employeetype_key
                           AND prs_kenmerklink_waarde IS NOT NULL)
             ;

   -- Welke personen vervallen uit Facilitor? Zij die niet in het ingelezen bestand voorkomen
   -- en wel van een employeetype zijn dat uit ABS had moeten komen (I, E, C, F, D, K of W dus).
   -- We matchen daarbij op ABS-ID, dus personen zonder ABS-ID worden ook verwijderd.
   CURSOR c_prs_del
   IS
      SELECT pl.prs_perslid_key,
             pl.prs_perslid_naam_full prs_perslid_naam,
             pl.prs_perslid_oslogin,
             pl.prs_perslid_nr,
             pl.absid
              -- Personen in Facilitor waarvoor ABS leidend is (en die dus
              -- in het importbestand zouden moeten voorkomen)
        FROM (SELECT p.*,
                     pf.prs_perslid_naam_full,
                     km2.prs_kenmerklink_waarde absid
                FROM prs_v_perslid_fullnames_all pf,
                     prs_kenmerklink km1,
                     prs_kenmerklink km2,
                     prs_v_aanwezigperslid p
               WHERE     km1.prs_link_key = p.prs_perslid_key
                     AND km2.prs_link_key(+) = p.prs_perslid_key
                     AND km1.prs_kenmerk_key = c_employeetype_key
                     AND km2.prs_kenmerk_key(+) = c_absid_key
                     AND fac.safe_to_number (km1.prs_kenmerklink_waarde) IN
                              (SELECT fac_usrdata_key
                                 FROM fac_usrdata
                                WHERE     fac_usrtab_key = c_usrtab_employeetype_key
                                      AND fac_usrdata_upper IN
                                               ('C', 'I', 'E', 'F', 'D', 'K', 'W'))
                     AND pf.prs_perslid_key = p.prs_perslid_key) pl
             -- Match op ABS-ID
             LEFT OUTER JOIN uwva_imp_abs uia
                ON pl.absid = uia.id
             -- Iedereen die niet matcht (en dus niet in ABS voorkomt)
       WHERE uia.id IS NULL
             ;

   -- Alle personen uit het importbestand met een type waarvoor ABS leidend is (C, I, E, F, D, K of W).
   -- Deze types noem ik hieronder voor het gemak even ABS-types.
   -- Iedere persoon wordt bij het doorlopen van de cursor gematched met Facilitor, als volgt:
   -- * Personen in ABS zónder ABS-type worden volledig genegeerd
   -- * Personen in Facilitor met types L, O, P, X (dus géén ABS-type) worden volledig genegeerd. Om
   --   dergelijke personen wel met ABS te kunnen laten matchen, moeten ze eerst handmatig worden
   --   gemuteerd in Facilitor.
   -- * Matching tussen personen in ABS en Facilitor vindt plaats op basis van het ABS-ID (het ID is
   --   een uniek nummer in ABS, dat middels een flexkenmerk in Facilitor is opgenomen. Dit kenmerk
   --   wordt door bovenstaande cursor (aan)gevuld. NB: matching vind niet in de cursor plaats,
   --   omdat een ABS-ID niet uniek hoeft te zijn in Facilitor en omdat uit te voeren acties afhangen
   --   van het medewerkertype in Facilitor.
   -- * Personen met een ABS-ID (en account of persoonsnummer-met-prefix?) dat /niet uniek/ is, worden /niet/
   --   gemuteerd! Dit om te voorkomen dat de verkeerde persoon bijgewerkt wordt.
   -- * Als een persoon in Facilitor wél een ABS-type heeft, maar dit wijkt af van het ABS-type in
   --   ABS, dan wordt het type in Facilitor bijgewerkt (bijv van E naar I).
   CURSOR c_prs_upd
   IS
SELECT DISTINCT
       SUBSTR (prefname, 1, 30) prs_perslid_naam,
       nickname prs_perslid_voornaam,
       titel prs_perslid_titel,
       account prs_perslid_oslogin,
       funcdscr prs_srtperslid_omschrijving,
       telno prs_perslid_telefoonnr,
       mobno prs_perslid_mobiel,
       faxno prs_perslid_faxnr,
       email email,
       initials prs_perslid_voorletters,
       DECODE (
          COALESCE (INSTR (prefname, spousename), 0),
          0,
          prefix,
          DECODE (
             INSTR (prefname, lastname),
             0,
             spouseprefix,
             CASE
                WHEN INSTR (prefname, lastname) <=
                        INSTR (prefname, spousename)
                THEN
                   prefix
                ELSE
                   spouseprefix
             END))
          prs_perslid_tussenvoegsel,
       empnum prs_perslid_nr,
       empnum_noprefix prs_perslid_nr_noprefix,
       costcent prs_afdeling_naam,
       DECODE (gender, 'M', 1, 'V', 0, NULL) prs_perslid_geslacht,
       SUBSTR (empnum, 1, 1) employeetype,
       pandcode,
       id,
       sw.sw_email
  FROM    (SELECT *
             FROM uwva_imp_abs
            WHERE SUBSTR (empnum, 1, 1) IN ('C', 'I', 'E', 'F', 'D', 'K', 'W')) ip
       LEFT JOIN -- UWVA#27483: E-mail volgens schrijfwijzer (INSERT-only)!
          uwva_v_email_schrijfwijzer sw
       ON ip.id = sw.imp_id;

   CURSOR c_prs_wp
   IS
SELECT hrmloc.prs_perslid_key,
       hrmloc.alg_locatie_key,
       hrmloc.alg_gebouw_key,
       hrmloc.pandcode,
       hrmloc.employeetype,
       hrmloc.aanduiding,
       COALESCE (hrmall.aant, 0) hrmall_wp_aant,
       hrmall.pw_key hrmall_pw_key,
       COALESCE (faclo1.aant, 0) facloc_wp_aant,
       faclo2.pw_key facloc_pw_key,
       faclo2.volgnr facloc_volgnr,
       COALESCE (facall.aant, 0) facall_wp_aant,
       facall.pw_key facall_pw_key
  FROM (SELECT DISTINCT
               p.prs_perslid_key,
               l.alg_locatie_key,
               g.alg_gebouw_key,
               uia.pandcode,
               et.fac_usrdata_upper employeetype,
               p.prs_perslid_naam || '/' || p.prs_perslid_nr || '/' || p.prs_perslid_oslogin || '/' || l.alg_locatie_code
                  aanduiding
          FROM prs_v_aanwezigperslid p,                 -- update HRM-WP van..
               prs_kenmerklink km1,                   -- ..personen met ABS-ID
               uwva_imp_abs uia,                 -- (..in import en Facilitor)
               prs_kostenplaats kp,               -- ..en HRM-pandcode bestaat
               alg_gebouw g,                     -- (..in import en Facilitor)
               alg_locatie l,
               prs_kenmerklink km2,                -- ..en type C/I/E/F/D/K/W!
               (SELECT *
                  FROM fac_usrdata
                 WHERE fac_usrtab_key = c_usrtab_employeetype_key
                       AND fac_usrdata_upper IN ('C', 'I', 'E', 'F', 'D', 'K', 'W')) et
         WHERE p.prs_perslid_key = km1.prs_link_key
               AND km1.prs_kenmerk_key = c_absid_key
               AND km1.prs_kenmerklink_verwijder IS NULL
               AND km1.prs_kenmerklink_waarde = uia.id
               AND uia.pandcode = kp.prs_kostenplaats_nr
               AND kp.prs_kostenplaats_verwijder IS NULL
               AND kp.prs_kostenplaats_key = g.prs_kostenplaats_key
               AND g.alg_gebouw_verwijder IS NULL
               AND g.alg_locatie_key = l.alg_locatie_key
               AND l.alg_locatie_verwijder IS NULL
               AND p.prs_perslid_key = km2.prs_link_key
               AND km2.prs_kenmerk_key = c_employeetype_key
               AND km2.prs_kenmerklink_verwijder IS NULL
               AND fac.safe_to_number (km2.prs_kenmerklink_waarde) = et.fac_usrdata_key) hrmloc
       LEFT JOIN (  SELECT pw.prs_perslid_key,
                           COUNT ( * ) aant,        -- >1 -> PW-key irrelevant
                           MAX (pw.prs_perslidwerkplek_key) pw_key
                      FROM prs_perslidwerkplek pw, prs_werkplek wp
                     WHERE pw.prs_perslidwerkplek_volgnr = 2
                           AND pw.prs_werkplek_key = wp.prs_werkplek_key
                           AND wp.prs_werkplek_virtueel = 0
                  GROUP BY pw.prs_perslid_key) hrmall
          ON hrmloc.prs_perslid_key = hrmall.prs_perslid_key
       LEFT JOIN (  SELECT pw.prs_perslid_key,
                           g.alg_locatie_key,
                           COUNT ( * ) aant       -- >1 -> PW/volgnr RELEVANT!
                      FROM prs_perslidwerkplek pw, prs_werkplek wp, alg_v_onrgoed_boom ogb, alg_v_aanweziggebouw g
                     WHERE pw.prs_werkplek_key = wp.prs_werkplek_key
                           AND wp.prs_werkplek_virtueel = 0
                           AND wp.prs_alg_ruimte_key = ogb.alg_ruimte_key
                           AND ogb.alg_gebouw_key = g.alg_gebouw_key
                  GROUP BY pw.prs_perslid_key, g.alg_locatie_key) faclo1
          ON hrmloc.prs_perslid_key = faclo1.prs_perslid_key
             AND hrmloc.alg_locatie_key = faclo1.alg_locatie_key
       LEFT JOIN (SELECT pw.prs_perslid_key,
                         g.alg_locatie_key,
                         pw.prs_perslidwerkplek_key pw_key, -- laagste/oudste PW!
                         pw.prs_perslidwerkplek_volgnr volgnr -- ter info: volgnr
                    FROM prs_perslidwerkplek pw, prs_werkplek wp, alg_v_onrgoed_boom ogb, alg_v_aanweziggebouw g
                   WHERE pw.prs_werkplek_key = wp.prs_werkplek_key
                         AND wp.prs_werkplek_virtueel = 0
                         AND wp.prs_alg_ruimte_key = ogb.alg_ruimte_key
                         AND ogb.alg_gebouw_key = g.alg_gebouw_key
                         AND NOT EXISTS
                               (SELECT 1
                                  FROM prs_perslidwerkplek pw2, prs_werkplek wp2, alg_v_onrgoed_boom ogb2, alg_v_aanweziggebouw g2
                                 WHERE pw2.prs_perslid_key = pw.prs_perslid_key
                                       AND pw2.prs_werkplek_key = wp2.prs_werkplek_key
                                       AND wp2.prs_werkplek_virtueel = 0
                                       AND wp2.prs_alg_ruimte_key = ogb2.alg_ruimte_key
                                       AND ogb2.alg_gebouw_key = g2.alg_gebouw_key
                                       AND g2.alg_locatie_key = g.alg_locatie_key
                                       AND COALESCE (pw2.prs_perslidwerkplek_volgnr, 10000 + pw2.prs_perslidwerkplek_key) <
                                             COALESCE (pw.prs_perslidwerkplek_volgnr, 10000 + pw.prs_perslidwerkplek_key)))
                 faclo2
          ON hrmloc.prs_perslid_key = faclo2.prs_perslid_key
             AND hrmloc.alg_locatie_key = faclo2.alg_locatie_key
       LEFT JOIN (  SELECT pw.prs_perslid_key,
                           COUNT ( * ) aant,        -- >1 -> PW-key irrelevant
                           MAX (pw.prs_perslidwerkplek_key) pw_key
                      FROM prs_perslidwerkplek pw, prs_werkplek wp
                     WHERE pw.prs_werkplek_key = wp.prs_werkplek_key
                           AND wp.prs_werkplek_virtueel = 0
                  GROUP BY pw.prs_perslid_key) facall
          ON hrmloc.prs_perslid_key = facall.prs_perslid_key
 WHERE COALESCE (hrmall.aant, 0) != 1                    -- geen/teveel HRM-WP
       OR COALESCE (faclo1.aant, 0) != 1      -- geen/teveel WP op HRM-locatie
       OR COALESCE (hrmall.pw_key, 0) != COALESCE (faclo2.pw_key, 0) -- niet dezelfde?
;

   -- Gegeven een persoon (ABS-ID en perslid_key), bepaal op basis van de rollen
   -- die deze persoon heeft, welke authorisatiegroepen verwijderd moeten worden.
   -- UWVA#20021: negeer daarbij de groep 'Budgethouders' (key 1061); daar gaat ABS
   -- niet over. (Die groep wordt onderaan de import door de voormalige budgethouder-
   -- import geregeld.)
   -- UWVA#30547: Ketenpartners (type K) hebben voortaan beperktere rechten dan 'normale'
   -- medewerkers. Daarom alleen andere medewerkertypes in groep 'Medewerker' laten.
   CURSOR c_groep (in_absid VARCHAR2, in_perslid_key NUMBER)
   IS
      SELECT fg.fac_groep_key, fg.fac_groep_omschrijving
        FROM fac_gebruikersgroep fgg, fac_groep fg
       WHERE     fgg.fac_groep_key = fg.fac_groep_key
             AND fgg.prs_perslid_key = in_perslid_key
             AND fgg.fac_groep_key != c_grp_default_key
             AND fgg.fac_groep_key != c_grp_budgh_key
      MINUS
      (SELECT DISTINCT fg.fac_groep_key, fg.fac_groep_omschrijving
         FROM uwva_imp_abs uia, uwva_provisioning up, fac_groep fg
        WHERE     up.fac_groep_key = fg.fac_groep_key
              AND up.uwva_rol_omschr = uia.grpfname
              AND uia.id = in_absid
       UNION
       SELECT fac_groep_key, fac_groep_omschrijving
         FROM fac_groep fg, prs_kenmerklink km, fac_usrdata ud
        WHERE     fg.fac_groep_key = c_grp_medewerker_key
              AND km.prs_link_key = in_perslid_key
              AND km.prs_kenmerk_key = c_employeetype_key
              AND km.prs_kenmerklink_verwijder IS NULL
              AND ud.fac_usrtab_key = c_usrtab_employeetype_key
              AND ud.fac_usrdata_verwijder IS NULL
              AND ud.fac_usrdata_key(+) = fac.safe_to_number(km.prs_kenmerklink_waarde)
              AND ud.fac_usrdata_upper IN ('C', 'I', 'E', 'F', 'D', 'W'));

   -- Gegeven een persoon (ABS-ID en perslid_key), bepaal op basis van de rollen
   -- die deze persoon heeft, welke authorisatiegroepen nog ontbreken.
   -- UWVA#30547: Ketenpartners (type K) hebben voortaan beperktere rechten dan 'normale'
   -- medewerkers. Daarom alleen de andere medewerkertypes in groep 'Medewerker' zetten.
   CURSOR c_rol (in_absid VARCHAR2, in_perslid_key NUMBER)
   IS
      (SELECT DISTINCT fg.fac_groep_key, fg.fac_groep_omschrijving
         FROM uwva_imp_abs uia, uwva_provisioning up, fac_groep fg
        WHERE     up.fac_groep_key = fg.fac_groep_key
              AND up.uwva_rol_omschr = uia.grpfname
              AND uia.id = in_absid
       UNION
       SELECT fac_groep_key, fac_groep_omschrijving
         FROM fac_groep fg, prs_kenmerklink km, fac_usrdata ud
        WHERE     fg.fac_groep_key = c_grp_medewerker_key
              AND km.prs_link_key = in_perslid_key
              AND km.prs_kenmerk_key = c_employeetype_key
              AND km.prs_kenmerklink_verwijder IS NULL
              AND ud.fac_usrtab_key = c_usrtab_employeetype_key
              AND ud.fac_usrdata_verwijder IS NULL
              AND ud.fac_usrdata_key(+) = fac.safe_to_number(km.prs_kenmerklink_waarde)
              AND ud.fac_usrdata_upper IN ('C', 'I', 'E', 'F', 'D', 'W'))
      MINUS
      SELECT fg.fac_groep_key, fg.fac_groep_omschrijving
        FROM fac_gebruikersgroep fgg, fac_groep fg
       WHERE fgg.fac_groep_key = fg.fac_groep_key
             AND fgg.prs_perslid_key = in_perslid_key;

   -- Door ABS niet meer gebruikte rollen, die toch nog in de provisioning-tabel
   -- voorkomen.
   CURSOR c_rol_not_used
   IS
      SELECT DISTINCT uwva_rol_omschr rol FROM uwva_provisioning
      MINUS
      SELECT DISTINCT grpfname rol FROM uwva_imp_abs;

   CURSOR c_functie
   IS
      SELECT DISTINCT sp.prs_srtperslid_key, uia.funcdscr
        FROM prs_srtperslid sp, uwva_imp_abs uia
       WHERE sp.prs_srtperslid_upper = UPPER (uia.funcdscr)
             AND sp.prs_srtperslid_omschrijving != uia.funcdscr;

   -- Personen met ABS-type waarvan het flexveld 'Regio' afwijkt van het
   -- gebouw waar de zitten, of die nog geen flexveld hebben.
   CURSOR c_prs_regio
   IS
      SELECT *
        FROM    (SELECT hpw.prs_perslid_key,
                        g.alg_gebouw_code,
                        COALESCE (rv.fac_usrdata_key, c_usrdata_onbekend_key)
                           fac_usrdata_key,
                        COALESCE (rv.fac_usrdata_omschr, c_usrdata_onbekend_omschr)
                           fac_usrdata_omschr
                   FROM prs_v_hoofdperslidwerkplek hpw,
                        prs_werkplek w,
                        alg_v_onrgoed_boom ogb,
                        alg_gebouw g,
                        fac_usrdata pcr,
                        fac_usrdata rv,
                        prs_kenmerklink emp
                  WHERE     w.prs_werkplek_key = hpw.prs_werkplek_key
                        AND w.prs_alg_ruimte_key = ogb.alg_ruimte_key
                        AND g.alg_gebouw_key = ogb.alg_gebouw_key
                        AND pcr.fac_usrdata_code(+) = g.alg_gebouw_code
                        AND rv.fac_usrdata_omschr(+) = pcr.fac_usrdata_omschr
                        AND pcr.fac_usrtab_key(+) = c_usrtab_pandcoderegio_key
                        AND rv.fac_usrtab_key(+) = c_usrtab_regiovinder_key
                        AND emp.prs_link_key = hpw.prs_perslid_key
                        AND emp.prs_kenmerk_key = c_employeetype_key
                        AND fac.safe_to_number (emp.prs_kenmerklink_waarde) IN
                                 (SELECT fac_usrdata_key
                                    FROM fac_usrdata
                                   WHERE     fac_usrtab_key = c_usrtab_employeetype_key
                                         AND fac_usrdata_upper IN
                                                  ('C', 'I', 'E', 'F', 'D', 'K', 'W'))) wprv
             LEFT OUTER JOIN
                (SELECT prs_link_key, prs_kenmerklink_key, prs_kenmerklink_waarde
                   FROM prs_kenmerklink kl
                  WHERE prs_kenmerklink_verwijder IS NULL
                        AND kl.prs_kenmerk_key = c_regio_key) km
             ON km.prs_link_key = wprv.prs_perslid_key
       WHERE km.prs_kenmerklink_waarde != wprv.fac_usrdata_key
          OR km.prs_kenmerklink_waarde IS NULL;

   -- UWVA#23788: (tijdelijke) logging die de pandcodes in het importbestand uitlijst,
   -- waarvoor geen kostenplaats danwel gebouw gevonden kan worden, met het aantal personen.
   CURSOR c_pandcode_onbekend
   IS
      SELECT pandcode,
             prs_kostenplaats_nr,
             COUNT (account) aantal
        FROM (SELECT DISTINCT account,
                     uia.pandcode,
                     kp.prs_kostenplaats_nr
                FROM uwva_imp_abs uia,
                     prs_v_aanwezigkostenplaats kp,
                     alg_v_aanweziggebouw g
               WHERE     uia.pandcode IS NOT NULL
                     AND uia.pandcode = kp.prs_kostenplaats_nr(+)
                     AND kp.prs_kostenplaats_key = g.prs_kostenplaats_key(+)
                     AND g.alg_gebouw_key IS NULL)
      GROUP BY pandcode, prs_kostenplaats_nr
      ORDER BY 1;

   -- UWVA#20021: voormalige budgethouderimport
   -- Record for update: relatie kostenplaats en persoon (evt leeg) kan worden gelegd.
   CURSOR c_budgethouder
   IS
        SELECT   kpn.prs_kostenplaats_key,
                 kpn.prs_kostenplaats_nr,
                 p.prs_perslid_key,
                 imp.perslid_nr imp_perslid_nr,
                 imp.mandaatcode imp_mandaatcode
          FROM   uwva_imp_kpn imp,
                 prs_v_aanwezigkostenplaats kpn,
                 prs_v_aanwezigperslid p
         WHERE       imp.afdeling = kpn.prs_kostenplaats_nr
                 AND p.prs_perslid_nr(+) = imp.perslid_nr
      ORDER BY   2;

   -- Onbekende kostenplaats
   CURSOR c_kpn_onbekend
   IS
        SELECT   kpn.prs_kostenplaats_key,
                 imp.afdeling prs_kostenplaats_nr,
                 imp.perslid_nr prs_perslid_nr
          FROM   uwva_imp_kpn imp,
                 prs_v_aanwezigkostenplaats kpn
         WHERE       imp.afdeling = kpn.prs_kostenplaats_nr(+)
                 AND kpn.prs_kostenplaats_nr IS NULL
                 AND imp.afdeling IS NOT NULL
                 AND imp.status = 'A'
      ORDER BY   2;

   -- Aanmaken pas-object voor nieuwe medewerkers op Andover-CMS enabled pand.
   CURSOR abs_pas_mdw
   IS
        SELECT DISTINCT p.prs_perslid_key, p.prs_perslid_oslogin
          FROM prs_v_aanwezigperslid p, prs_v_werkplekperslid_gegevens ps, alg_onrgoedkenmerk ao, prs_kenmerklink pk, uwva_imp_abs uia
         WHERE p.prs_perslid_aanmaak >= SYSDATE - (3 / 24) -- Afgelopen 3 uur aangemaakt
               AND p.prs_perslid_key = ps.prs_perslid_key
               AND ps.prs_werkplek_volgnr = 2                         -- HRM-WP
               AND ps.alg_locatie_key = ao.alg_onrgoed_key
               AND ao.alg_onrgoed_niveau = 'L'
               AND ao.alg_kenmerk_key = 1580       -- Toegangscontrole systeem
               AND ao.alg_onrgoedkenmerk_waarde = 28809         -- Andover-CMS
               AND p.prs_perslid_key = pk.prs_link_key
               AND pk.prs_kenmerk_key = 1232                         -- ABS-ID
               AND pk.prs_kenmerklink_waarde = uia.id
               AND SUBSTR (uia.empnum, 1, 1) IN ('C', 'I', 'E', 'F', 'D', 'K', 'W')
               --AND p.prs_perslid_key NOT IN (SELECT ins_alg_ruimte_key
               --                                FROM ins_deel
               --                               WHERE ins_srtdeel_key = 258998)
               AND NOT EXISTS (SELECT 1   -- Niet al een NIET VERWIJDERDE pas!
                                 FROM ins_v_aanwezigdeel
                                WHERE ins_srtdeel_key = 259000 -- Toegangspas Andover
                                      AND ins_alg_ruimte_type = 'P'
                                      AND ins_alg_ruimte_key = p.prs_perslid_key)
      ORDER BY 1;

   -- Aanmaken pas-object voor bestaande medewerkers op Andover-CMS enabled pand (verhuisd).
   CURSOR abs_pas_mdw_bestaand
   IS
        SELECT DISTINCT p.prs_perslid_key, p.prs_perslid_oslogin
          FROM prs_v_aanwezigperslid p, prs_perslidwerkplek pw, prs_v_werkplekperslid_gegevens ps, alg_onrgoedkenmerk ao, prs_kenmerklink pk, uwva_imp_abs uia
         WHERE p.prs_perslid_aanmaak < SYSDATE - (3 / 24) -- Eerder al eens aangemaakt
               AND p.prs_perslid_key = pw.prs_perslid_key
               AND pw.prs_perslidwerkplek_volgnr = 2                         -- HRM-WP
               AND pw.prs_perslidwerkplek_aanmaak >= SYSDATE - (3 / 24) -- Afgelopen 3 uur aangemaakt
               AND pw.prs_perslidwerkplek_key = ps.prs_perslidwerkplek_key
               AND ps.alg_locatie_key = ao.alg_onrgoed_key
               AND ao.alg_onrgoed_niveau = 'L'
               AND ao.alg_kenmerk_key = 1580       -- Toegangscontrole systeem
               AND ao.alg_onrgoedkenmerk_waarde = 28809         -- Andover-CMS
               AND p.prs_perslid_key = pk.prs_link_key
               AND pk.prs_kenmerk_key = 1232                         -- ABS-ID
               AND pk.prs_kenmerklink_waarde = uia.id
               AND SUBSTR (uia.empnum, 1, 1) IN ('C', 'I', 'E', 'F', 'D', 'K', 'W')
               --AND p.prs_perslid_key NOT IN (SELECT ins_alg_ruimte_key
               --                                FROM ins_deel
               --                               WHERE ins_srtdeel_key = 258998)
               AND NOT EXISTS (SELECT 1   -- Niet al een NIET VERWIJDERDE pas!
                                 FROM ins_v_aanwezigdeel
                                WHERE ins_srtdeel_key = 259000 -- Toegangspas Andover
                                      AND ins_alg_ruimte_type = 'P'
                                      AND ins_alg_ruimte_key = p.prs_perslid_key)
      ORDER BY 1;

   -- Deactiveren/blokkeren extra actieve pas(sen) van medewerkers; alleen de nieuwste/hoogste ins_deel_key blijft behouden/actief.
   -- NB. Medewerkers die verhuizen naar een pand zonder Andover behouden gewoon hun pas.
   -- NB. Passen met status Vermist of Defect worden niet door ABS-import geblokkeerd.
   CURSOR abs_pas_disable
   IS
      SELECT i.ins_deel_key, p.prs_perslid_key, 'Dubbele pas' aanduiding
        FROM ins_v_aanwezigdeel i, prs_perslid p
       WHERE i.ins_srtdeel_key = 259000                 -- Toegangspas Andover
             AND i.ins_alg_ruimte_type = 'P'
             AND i.ins_alg_ruimte_key = p.prs_perslid_key
             AND EXISTS (SELECT 1               -- Er bestaat een nieuwere pas
                           FROM ins_v_aanwezigdeel
                          WHERE ins_srtdeel_key = 259000
                                AND ins_alg_ruimte_type = 'P'
                                AND ins_alg_ruimte_key = i.ins_alg_ruimte_key
                                AND ins_deel_key > i.ins_deel_key)
      ORDER BY 1;

   v_prs_omschr                  VARCHAR2 (150);
   v_perslid                     prs_perslid%ROWTYPE;
   v_perslid_key                 NUMBER (10);
   v_perslid_type                VARCHAR2 (10);
   v_prs_key_cnt                 NUMBER (10);
   v_srtperslid_key              NUMBER (10);
   v_srtperslid_db_oms           VARCHAR2 (60);
   v_afdeling_key                NUMBER (10);
   v_profiel_key                 NUMBER (10);
   v_profiel_omschr              VARCHAR2 (30);
   v_limiet                      NUMBER (10);
   v_groep_key                   NUMBER (10);
   v_groep_omschr                VARCHAR2 (30);

   v_locatie_key                 NUMBER (10);
   v_gebouw_key                  NUMBER (10);
   v_verdieping_key              NUMBER (10);
   v_ruimte_key                  NUMBER (10);
   v_ruimte_nr                   VARCHAR2 (10);
   v_werkplek_key                NUMBER (10);
   v_new_werkplek_key            NUMBER (10);
   v_werkplek_volgnr             NUMBER (10);
   v_pwp_key                     NUMBER (10);
   v_pwp_volgnr                  NUMBER (10);
   v_gebouw_code                 VARCHAR2 (10);
   v_srtperslid_omschr           VARCHAR (60);
   v_srtperslid_upper            VARCHAR (60);
   recl                          c_prs_no_type%ROWTYPE;
   rec_id                        c_prs_no_absid%ROWTYPE;
   rec_del                       c_prs_del%ROWTYPE;
   rec_upd                       c_prs_upd%ROWTYPE;
   rec_groep                     c_groep%ROWTYPE;
   rec_rol                       c_rol%ROWTYPE;
   rec_rnu                       c_rol_not_used%ROWTYPE;
   rec_func                      c_functie%ROWTYPE;
   rec_regio                     c_prs_regio%ROWTYPE;
   rec_pcon                      c_pandcode_onbekend%ROWTYPE;
   rec_budgh                     c_budgethouder%ROWTYPE;
   rec_kpnon                     c_kpn_onbekend%ROWTYPE;
   oracle_err_num                NUMBER;
   oracle_err_mes                VARCHAR2 (250);
   v_errormsg                    VARCHAR2 (1024);
   v_errorhint                   VARCHAR2 (1024);
   v_action                      VARCHAR (10);
   v_count                       NUMBER (10);
   v_count_regio_edit            NUMBER (10);
   v_count_regio_add             NUMBER (10);
   v_update                      BOOLEAN;
   v_aktie                       VARCHAR (10);
   v_prsMatched                  BOOLEAN;
   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;
   o_afdeling_key                NUMBER (10);                             -- huidige (oude) afdeling
   l_nrkps                       NUMBER;
   v_nr_werkplek                 NUMBER;
   v_current_locatie_key         NUMBER;
   v_new_locatie_key             NUMBER;
   v_new_gebouw_key              NUMBER;
   v_prs_kenmerklink_key         NUMBER;
   v_imp_account                 VARCHAR2 (30);
   v_imp_empnum                  VARCHAR2 (16);
   v_imp_prefname                VARCHAR2 (30);
   v_imp_employeetype            VARCHAR2 (30);
   v_imp_absid                   NUMBER;
   v_emptype                     VARCHAR2 (5);
   v_validtype                   BOOLEAN;
   v_budgh_key                   NUMBER;

   PROCEDURE uwva_set_werknemertype(perslid_key IN NUMBER, perslid_naam IN VARCHAR2, werknemertype IN VARCHAR2, logstr IN VARCHAR2, logtype in VARCHAR2)
   AS
   BEGIN
      -- Kijk of meegegeven werknemertype in Facilitor bestaat
      SELECT COUNT (*)
        INTO v_count
        FROM fac_usrdata
       WHERE fac_usrtab_key = c_usrtab_employeetype_key
         AND fac_usrdata_upper = werknemertype;

      IF (v_count = 0)
      THEN
         -- Geen bekend werknemertype --> ERROR
         v_validtype := FALSE;
         fac.imp_writelog (p_import_key,
                           'W',
                           logstr || '. Naam: ' || perslid_naam,
                           'Onbekend werknemertype "' || werknemertype || '"! Graag toevoegen in Eigen tabel!');
      ELSE
         v_validtype := TRUE;
      END IF;

      -- Kijk of er al een werknemertype is gedefinieerd voor perslid
      SELECT COUNT(*)
        INTO v_count
        FROM prs_perslid p,
             prs_kenmerklink km
       WHERE p.prs_perslid_key = km.prs_link_key
         AND km.prs_kenmerk_key = c_employeetype_key
         AND p.prs_perslid_key = perslid_key;

      IF (v_count = 0)
      THEN
         ---- Nog geen type --> maak aan (waarde: werknemertype)
         INSERT INTO prs_kenmerklink
                     (prs_link_key,
                      prs_kenmerklink_niveau,
                      prs_kenmerk_key,
                      prs_kenmerklink_waarde
                     )
              VALUES (perslid_key,
                      'P',
                      c_employeetype_key,
                      (SELECT fac_usrdata_key
                         FROM fac_usrdata
                        WHERE     fac_usrtab_key = c_usrtab_employeetype_key
                              AND fac_usrdata_upper = werknemertype)
                     );

         IF     v_validtype
            AND logstr IS NOT NULL AND logtype IS NOT NULL
         THEN
            fac.imp_writelog (p_import_key,
                              UPPER (logtype),
                              logstr || '. Naam: ' || perslid_naam,
                              'Type ' || werknemertype || ' aangemaakt');
         END IF;
      ELSE
         -- Al een type gedefinieerd --> dat wordt dan werknemertype
         SELECT prs_kenmerklink_key
           INTO v_prs_kenmerklink_key
           FROM prs_perslid p,
                prs_kenmerklink km
          WHERE p.prs_perslid_key = km.prs_link_key
            AND km.prs_kenmerk_key = c_employeetype_key
            AND p.prs_perslid_key = perslid_key;

         UPDATE prs_kenmerklink
            SET prs_kenmerklink_waarde = (SELECT fac_usrdata_key
                                            FROM fac_usrdata
                                           WHERE     fac_usrtab_key = c_usrtab_employeetype_key
                                                 AND fac_usrdata_upper = werknemertype)
          WHERE prs_kenmerklink_key = v_prs_kenmerklink_key;

         IF     v_validtype
            AND logstr IS NOT NULL AND logtype IS NOT NULL
         THEN
            fac.imp_writelog (p_import_key,
                              UPPER (logtype),
                              logstr || '. Naam: ' || perslid_naam,
                              'Type gewijzigd naar ' || werknemertype);
         END IF;
      END IF;
   EXCEPTION
      WHEN OTHERS
      THEN
         fac.imp_writelog (p_import_key,
                           'W',
                           perslid_naam || ':',
                           'Fout bij toevoegen/wijzigen werknemertype');
   END;

   PROCEDURE uwva_set_flexveld(perslid_key IN NUMBER, perslid_naam IN VARCHAR2, flexkey IN NUMBER, flexval IN VARCHAR2)
   AS
   BEGIN
      v_errormsg :=    perslid_naam || ': Fout bij toevoegen/wijzigen flexveld (key/waarde: '
                    || flexkey || '/' || flexval || ')';

      -- Bestaat flexkenmerk?
      SELECT COUNT(*)
        INTO v_count
        FROM prs_kenmerk
       WHERE prs_kenmerk_key = flexkey;

      IF (v_count = 0)
      THEN
         fac.imp_writelog (p_import_key,
                           'W',
                           'Onbekend flexkenmerk met key ' || flexkey,
                           'Graag aanmaken');
         RETURN;
      END IF;

      -- Kijk of flexveld al is gedefinieerd voor perslid
      SELECT COUNT(*)
        INTO v_count
        FROM prs_kenmerklink
       WHERE prs_kenmerk_key = flexkey
         AND prs_link_key = perslid_key;

      IF (v_count = 0)
      THEN
         BEGIN
            v_errormsg :=    perslid_naam || ': Fout bij toevoegen flexveld (key/waarde: '
                          || flexkey || '/' || flexval || ')';
            -- Flexveld nog niet gevuld --> maak aan (waarde: flexval)
            INSERT INTO prs_kenmerklink
                        (prs_link_key,
                         prs_kenmerklink_niveau,
                         prs_kenmerk_key,
                         prs_kenmerklink_waarde
                        )
                 VALUES (perslid_key,
                         'P',
                         flexkey,
                         flexval
                        );
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
               v_errorhint :=    'ins_flex: (ORACLE error '
                              || oracle_err_num
                              || '/'
                              || oracle_err_mes
                              || ')';
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_errormsg,
                                 v_errorhint);
         END;
      ELSE
         BEGIN
            v_errormsg :=    perslid_naam || ': Fout bij wijzigen flexveld (key/waarde: '
                          || flexkey || '/' || flexval || ')';
            -- Flexveld al gevuld --> overschrijven
            SELECT prs_kenmerklink_key
              INTO v_prs_kenmerklink_key
              FROM prs_kenmerklink
             WHERE prs_kenmerk_key = flexkey
               AND prs_link_key = perslid_key;

            UPDATE prs_kenmerklink
               SET prs_kenmerklink_waarde = flexval
             WHERE prs_kenmerklink_key = v_prs_kenmerklink_key;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
               v_errorhint :=    'upd_flex: (ORACLE error '
                              || oracle_err_num
                              || '/'
                              || oracle_err_mes
                              || ')';
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_errormsg,
                                 v_errorhint);
         END;
      END IF;
   EXCEPTION
      WHEN OTHERS
      THEN
         oracle_err_num := SQLCODE;
         oracle_err_mes := SUBSTR (SQLERRM, 1, 130);
         v_errorhint :=    'set_flex: (ORACLE error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
         fac.imp_writelog (p_import_key,
                           'W',
                           v_errormsg,
                           v_errorhint);
   END;

   PROCEDURE uwva_upsert_wp(in_perslid_key IN NUMBER,
                            in_ruimte_key  IN NUMBER, in_ruimte_nr IN VARCHAR2,
                            in_wp_oud_key  IN NUMBER)
   AS
   BEGIN
      -- Persoon krijgt wp op fictieve of echte ruimte.
      -- (Nieuwe werkplek aanmaken, eventuele oude wp daarna verwijderen)
      v_errormsg := 'Fout bij bepalen volgnummer nieuwe werkplek in ruimte ' || in_ruimte_nr;

      -- UWVA#21256: De werkplekvolgnummers worden hoger dan past in prs_werkplek_volgnr.
      --             Voortaan dus het laagste beschikbare volgnummer gebruiken.
      SELECT COALESCE (MIN (pw1.prs_werkplek_volgnr), 0) + 1
        INTO v_werkplek_volgnr
        FROM prs_werkplek pw1
       WHERE     pw1.prs_alg_ruimte_key = in_ruimte_key
             AND NOT EXISTS
                   (SELECT 1
                      FROM prs_werkplek pw2
                     WHERE     pw2.prs_alg_ruimte_key = pw1.prs_alg_ruimte_key
                           AND pw2.prs_werkplek_volgnr = pw1.prs_werkplek_volgnr + 1);

      v_errormsg := 'Fout bij toevoegen nieuwe werkplek in ruimte ' || in_ruimte_nr;
      INSERT INTO prs_werkplek (prs_werkplek_module,
                                prs_werkplek_volgnr,
                                prs_werkplek_omschrijving,
                                prs_werkplek_virtueel,
                                prs_alg_ruimte_key)
           VALUES ('PRR',
                   v_werkplek_volgnr,
                   '',
                   0,
                   in_ruimte_key)
        RETURNING prs_werkplek_key
             INTO v_new_werkplek_key;
      --fac.imp_writelog (p_import_key, 'D',
      --                  'in_perslid_key/in_ruimte_key/in_wp_oud_key'
      --                  || '/' || in_perslid_key
      --                  || '/' || in_ruimte_key
      --                  || '/' || in_wp_oud_key,
      --                  'upsert: Nieuwe wp #'||v_new_werkplek_key||' ('
      --                  ||'PRR, '||v_werkplek_volgnr||', ,0 , '||in_ruimte_key||')'
      --                  );

      --UWVA#21256: ABS-werkplek heeft /altijd/ volgnr 2. (Da's hoger dan de Vinder-import (die heeft 3 en
      --            4 gebruikt), maar laat volgnr 1 over om met de hand een hoofdwerkplek in te stellen
      IF (in_wp_oud_key IS NOT NULL)
      THEN
         -- Update
         v_errormsg := 'Fout bij verplaatsen persoon naar nieuwe werkplek in ruimte ' || in_ruimte_nr;
         UPDATE prs_perslidwerkplek
            SET prs_perslidwerkplek_volgnr = 2,
                prs_werkplek_key = v_new_werkplek_key
          WHERE prs_werkplek_key = in_wp_oud_key
            AND prs_perslid_key = in_perslid_key;

         v_errormsg := 'Fout bij verwijderen oude werkplek (' || in_wp_oud_key || ')';
         DELETE FROM prs_werkplek
               WHERE prs_werkplek_key = in_wp_oud_key;
         --fac.imp_writelog (p_import_key, 'D',
         --                  'in_perslid_key/in_ruimte_key/in_wp_oud_key'
         --                  || '/' || in_perslid_key
         --                  || '/' || in_ruimte_key
         --                  || '/' || in_wp_oud_key,
         --                  'upsert: pwp bijgewerkt ('
         --                  ||'volgnr='||v_pwp_volgnr||', wp_key='||v_new_werkplek_key||'), '
         --                  || 'wp #'||in_wp_oud_key||' verwijderd'
         --                  );
      ELSE
         -- Insert
         v_errormsg := 'Fout bij koppelen persoon aan nieuwe werkplek in ruimte ' || in_ruimte_nr || '.';
         INSERT INTO prs_perslidwerkplek ( prs_perslid_key,
                                           prs_werkplek_key,
                                           prs_perslidwerkplek_bezetting,
                                           prs_perslidwerkplek_volgnr)
              VALUES (in_perslid_key, v_new_werkplek_key, 100, 2);
         --fac.imp_writelog (p_import_key, 'D',
         --                  'in_perslid_key/in_ruimte_key/in_wp_oud_key'
         --                  || '/' || in_perslid_key
         --                  || '/' || in_ruimte_key
         --                  || '/' || in_wp_oud_key,
         --                  'upsert: Nieuwe pwp  ('
         --                  ||in_perslid_key||', '||v_new_werkplek_key||', 100, '||v_pwp_volgnr||')'
         --                  );
      END IF;
   EXCEPTION
      WHEN OTHERS
      THEN
         oracle_err_num := SQLCODE;
         oracle_err_mes := SUBSTR (SQLERRM, 1, 130);
         fac.imp_writelog (p_import_key,
                           'W',
                           v_errormsg
                           || ' set_wp: (ORACLE error ' || oracle_err_num
                           || '/' || oracle_err_mes
                           || ')',
                           v_errorhint
                           || '/' || in_perslid_key
                           || '/' || in_ruimte_key
                           || '/' || in_wp_oud_key
                           );
   END;

BEGIN
   -- Rapportlogs van meer dan een maand geleden wegdoen

   -- Klopt de eigen tabel Werknemertype?
   SELECT COUNT (fac_usrdata_key)
     INTO et_check
     FROM fac_usrdata
    WHERE fac_usrtab_key = c_usrtab_employeetype_key
      AND fac_usrdata_upper IN ('C', 'I', 'E', 'F', 'D', 'K', 'W');

   IF et_check != 6
   THEN
      fac.imp_writelog (p_import_key,
                        'W',
                        'Gebruikerstabel werknemertype is onvolledig',
                        '$Revision$'
                       );
   END IF;

   -- Init
   SELECT MAX (fac_module_version)
     INTO currentversion
     FROM fac_module;

   fac.imp_writelog (p_import_key,
                     'S',
                        'Facilitor ABS import versie '
                     || currentversion,
                     '$Revision$'
                    );

   -- Aantal potentieel matchbare personen in importbestand
   SELECT COUNT ( DISTINCT(id) )
     INTO v_perslid_count_imp
     FROM uwva_imp_abs
    WHERE SUBSTR(empnum, 1, 1) IN ('C', 'I', 'E', 'F', 'D', 'K', 'W');

   -- Aantal actieve, potentieel matchbare personen in Facilitor
   -- (dus mét account en/of personeelsnummer en met een juist werknemertype)
   -- (DECODE ivm vermijden deling door 0)
   SELECT DECODE (COUNT (*), 0, 1, COUNT (*))
     INTO v_perslid_count_fclt
     FROM prs_perslid
    WHERE (   prs_perslid_nr      IS NOT NULL
           OR prs_perslid_oslogin IS NOT NULL)
      AND prs_perslid_verwijder IS NULL
      AND uwva_abs.get_employeetype(p_import_key, prs_perslid_key, c_employeetype_key) IN ('C', 'I', 'E', 'F', 'D', 'K', 'W');

   -- v_perslid_count_fclt is heel klein (<<100) bij de initiele situatie, omdat dan nog vrijwel niemand een type heeft.
   IF ( v_perslid_count_fclt < 100 )
   THEN
      -- Check of het importbestand wel geldig is, om narigheden te voorkomen.
      SELECT COUNT(*)
        INTO v_count
        FROM imp_log
       WHERE imp_log_applicatie = 'ABS'
         AND imp_log_omschrijving = 'Ongeldig importbestand';

      IF (v_count > 0)
      THEN
         fac.imp_writelog (p_import_key, 'S',
                           'Ongeldig importbestand bij initiële import',
                           'Verwerking wordt afgebroken.'
                          );
         RETURN;
      ELSE
         fac.imp_writelog (p_import_key, 'S',
                           'Initiële import',
                           'Controle aantal personen wordt overgeslagen.'
                          );
      END IF;
   ELSE
      IF ( (100 * ABS (v_perslid_count_imp - v_perslid_count_fclt) / v_perslid_count_fclt ) > c_maxvariation )
      THEN
         fac.imp_writelog (p_import_key, 'W',
                           'Het verschil tussen de actieve personen ('
                           || TO_CHAR (v_perslid_count_fclt)
                           || ') en te importeren aantallen ('
                           || TO_CHAR (v_perslid_count_imp)
                           || ') is te groot',
                           'Zie Specificaties: De afwijking is teveel en bedraagt '
                           || TO_CHAR (100 * ABS (v_perslid_count_fclt - v_perslid_count_imp) / v_perslid_count_fclt, '9999999D9')
                           || '%.'
                          );
         RETURN;
      END IF;
   END IF;

   -- *** Personen zonder ABS-ID *****************************************************************
   FOR rec_id IN c_prs_no_absid
   LOOP
      BEGIN
         v_errormsg := 'Personen zonder ABS-ID';

         v_prs_omschr := 'Achternaam/persoonsnr/login: '
                         || rec_id.prs_perslid_naam
                         || '/' || rec_id.prs_perslid_nr
                         || '/' || rec_id.prs_perslid_oslogin;

         IF (rec_id.prs_perslid_oslogin IS NULL AND rec_id.prs_perslid_nr IS NULL)
         THEN
            -- Geen account en personeelsnummer --> probleemgeval --> werknemertype = P
            v_errormsg := 'Probleemgevallen';
            --uwva_set_werknemertype(rec_id.prs_perslid_key,
            --                       rec_id.prs_perslid_naam || '/' || rec_id.prs_perslid_nr,
            --                       'P',
            --                       'Probleemgeval: geen account en personeelsnummer',
            --                       'W');
            fac.imp_writelog (p_import_key, 'W', 'ABS-ID: geen account en geen persoonsnr', v_prs_omschr);
         ELSE
            -- Account en/of personeelsnummer --> probeer te matchen
            v_errorhint := 'Bepalen uniek persoon. ' || v_prs_omschr;
            -- Komt account van deze persoon uniek voor in het importbestand?
            -- Een persoon kan vaker in het importbestandvoorkomen, met alle gegevens behalve de rol hetzelfde.
            -- Daarom SELECT DISTINCT op alle gegevens behalve rol!
            SELECT COUNT(*)
              INTO v_count
              FROM (SELECT DISTINCT account, empnum, prefname, id
                      FROM uwva_imp_abs
                     WHERE account = rec_id.prs_perslid_oslogin);

            -- Uniek account gevonden --> update persoon
            IF (v_count = 1)
            THEN
               v_errorhint := 'Update ID (adhv account)';
               SELECT DISTINCT account, empnum, prefname, id
                 INTO v_imp_account, v_imp_empnum, v_imp_prefname, v_imp_absid
                 FROM uwva_imp_abs
                WHERE account = rec_id.prs_perslid_oslogin;

               -- ABS-ID
               uwva_set_flexveld(rec_id.prs_perslid_key, rec_id.prs_perslid_naam, c_absid_key, v_imp_absid);

               fac.imp_writelog (p_import_key, 'I', 'ABS-ID ' || v_imp_absid || ' gevuld obv account', v_prs_omschr);
            -- Geen account gevonden --> Komt personeelsnummer uniek voor in het importbestand?
            ELSIF (v_count = 0)
            THEN
               SELECT COUNT(*)
                 INTO v_count
                 FROM (SELECT DISTINCT account, empnum, prefname, id
                         FROM uwva_imp_abs
                        WHERE empnum = rec_id.prs_perslid_nr OR empnum_noprefix = rec_id.prs_perslid_nr);

               -- Uniek personeelsnummer gevonden --> is dat nummer ook uniek in Facilitor?
               IF (v_count = 1)
               THEN
                  SELECT COUNT(*)
                    INTO v_count
                    FROM prs_v_aanwezigperslid
                   WHERE prs_perslid_nr = rec_id.prs_perslid_nr;

                  -- Uniek personeelsnummer in zowel importbestand als Facilitor. It's a match! --> update persoon
                  IF (v_count = 1)
                  THEN
                     v_errorhint := 'Update ID (adhv pers#)';
                     SELECT DISTINCT account, empnum, prefname, id
                       INTO v_imp_account, v_imp_empnum, v_imp_prefname, v_imp_absid
                       FROM uwva_imp_abs
                      WHERE empnum = rec_id.prs_perslid_nr OR empnum_noprefix = rec_id.prs_perslid_nr;

                     -- ABS-ID
                     uwva_set_flexveld(rec_id.prs_perslid_key, rec_id.prs_perslid_naam, c_absid_key, v_imp_absid);

                     fac.imp_writelog (p_import_key, 'I', 'ABS-ID ' || v_imp_absid || ' gevuld obv personeelsnr', v_prs_omschr);
                  ELSE
                     fac.imp_writelog (p_import_key, 'W', 'ABS-ID: geen match', v_prs_omschr);
                  END IF;
               END IF;
            END IF;
         END IF;

         -- Elke c_commitbuffer regels committen
         v_buffercount := v_buffercount + 1;
         IF (v_buffercount >= c_commitbuffer)
         THEN
            COMMIT;
            v_buffercount := 0;
         END IF;
      END;
   END LOOP;

   COMMIT;

   -- *** Personen zonder werknemertype *************************************************************
   -- Probeer werknemertype van mensen zonder type te achterhalen en updaten
   -- Matching: op ABS-ID.
   -- Personen in de database zónder ABS-ID, kunnen niet gematcht worden met de personen in het
   -- importbestand. Deze personen dienen werknemertype P te krijgen, zodat ze handmatig nagelopen
   -- kunnen worden.
   -- (Personen zónder ABS-ID, zijn óf al van een type dat nagekeken moet worden (D, L, O, P, U, X, Z),
   -- óf van type I, E, C, F of W(?) zodat ze automatisch verwijderd worden.)
   FOR recl IN c_prs_no_type
   LOOP
      BEGIN
         v_errormsg := 'Personen zonder type';

         v_prs_omschr :=    'Achternaam/persoonsnr/login/ABS-ID: '
                         || recl.prs_perslid_naam
                         || '/' || recl.prs_perslid_nr
                         || '/' || recl.prs_perslid_oslogin
                         || '/' || recl.absid;

         IF (recl.absid IS NULL)
         THEN
            -- Geen ABS-ID --> probleemgeval --> werknemertype = P
            v_errormsg := 'Probleemgevallen';
            uwva_set_werknemertype(recl.prs_perslid_key,
                                   recl.prs_perslid_naam || '/' || recl.prs_perslid_nr,
                                   'P',
                                   'Probleemgeval: geen ABS-ID',
                                   'W');
         ELSE
            -- ABS-ID --> probeer te matchen
            v_errorhint := 'Bepalen uniek persoon. ' || v_prs_omschr;
            -- Komt ABS-ID van deze persoon uniek voor in het importbestand?
            -- Een persoon kan vaker in het importbestandvoorkomen, met alle gegevens behalve de rol hetzelfde.
            -- Daarom SELECT DISTINCT op ABS-ID en (omdat die ook uniek moet zijn) accountnaam!
            SELECT COUNT(*)
              INTO v_count
              FROM (SELECT DISTINCT id,
                                    account
                      FROM uwva_imp_abs
                     WHERE id = recl.absid );

            -- Uniek ABS-ID gevonden --> is dat nummer ook uniek in Facilitor?
            IF (v_count = 1)
            THEN
               SELECT COUNT(*)
                 INTO v_count
                 FROM prs_kenmerklink
                WHERE prs_kenmerk_key = c_absid_key
                  AND prs_kenmerklink_waarde = recl.absid
                  AND prs_kenmerklink_verwijder IS NULL;

               -- Uniek ABS-ID in zowel importbestand als Facilitor. It's a match! --> update persoon
               IF (v_count = 1)
               THEN
                  v_errorhint := 'Update type';
                  SELECT DISTINCT id,
                                  employeetype
                    INTO v_imp_absid, v_imp_employeetype
                    FROM uwva_imp_abs
                   WHERE id = recl.absid;

                  -- Werknemertype
                  uwva_set_werknemertype(recl.prs_perslid_key,
                                         recl.prs_perslid_naam || '/' || recl.prs_perslid_nr,
                                         v_imp_employeetype,
                                         v_errorhint,
                                         'I');

               -- Geen uniek ABS-ID in Facilitor! Kan dus niet zeker weten of gegevens in importbestand
               -- wel voor deze persoon zijn... --> ERROR
               ELSE
                  v_errorhint := 'Ander persoon met hetzelfde ABS-ID in Facilitor';
                  uwva_set_werknemertype(recl.prs_perslid_key,
                                         recl.prs_perslid_naam || '/' || recl.prs_perslid_nr,
                                         'P',
                                         v_errorhint,
                                         'W');
               END IF;

            -- ABS-ID niet gevonden --> Persoon komt niet in import voor, dus type kan niet bepaald worden --> type 'O'
            ELSIF (v_count = 0)
            THEN
               v_errorhint := 'Persoon niet gevonden in importbestand';
                  uwva_set_werknemertype(recl.prs_perslid_key,
                                         recl.prs_perslid_naam || '/' || recl.prs_perslid_nr,
                                         'O',
                                         v_errorhint || ', account/ABS-ID: '
                                         || recl.prs_perslid_oslogin || '/' || recl.absid,
                                         'W');

            -- ABS-ID komt meermalen voor en is dus NIET uniek! --> ERROR (type probleemgeval)
            ELSE
               v_errorhint := 'Kan personeelsnummer niet eenduidig bepalen in importbestand';
               uwva_set_werknemertype(recl.prs_perslid_key,
                                      recl.prs_perslid_naam || '/' || recl.prs_perslid_nr,
                                      'P',
                                      v_errorhint,
                                      'W');
            END IF;
         END IF;

         -- Elke c_commitbuffer regels committen
         v_buffercount := v_buffercount + 1;
         IF (v_buffercount >= c_commitbuffer)
         THEN
            COMMIT;
            v_buffercount := 0;
         END IF;
      END;
   END LOOP;

   COMMIT;

   -- *** Personen verwijderen die niet in het importbestand voorkomen *****************************
   -- Delete
   v_errormsg := 'Try to open cursor';
   v_action := 'DELETE';

   FOR rec_del IN c_prs_del
   LOOP
      BEGIN
         v_errormsg := 'Verwijderen van de persoon is NIET gelukt';

         v_prs_omschr :=    'Achternaam/persoonsnr/login/ABS-ID: '
                         || rec_del.prs_perslid_naam
                         || '/' || rec_del.prs_perslid_nr
                         || '/' || rec_del.prs_perslid_oslogin
                         || '/' || rec_del.absid;

         v_perslid_key := rec_del.prs_perslid_key;

         BEGIN
            v_errorhint := 'SP zoeken';
            -- Zoek welk SP verantwoordelijk is voor deze persoon
            -- Deze wordt gerapporteerd, zodat vertek kan worden afgehandeld
            SELECT MIN (alg_gebouw_key)
              INTO v_gebouw_key
              FROM prs_v_werkplek_gegevens w,
                   prs_perslidwerkplek pw
             WHERE w.prs_werkplek_key = pw.prs_werkplek_key
               AND pw.prs_perslid_key = v_perslid_key;

            fac.imp_writelog (p_import_key,
                              'R',
                              rec_del.prs_perslid_naam || '/' || rec_del.prs_perslid_nr,
                              v_gebouw_key
                             );
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               NULL;
         END;

         -- *** Budgethouderschap ***
         v_errorhint := 'Budgethouderschap zoeken';
         -- N.a.v. UWVA#16008: verwijder budgethouderschappen van persoon (budgethouderimport zou dit vanzelf weer moeten vullen).
         -- Voor hoeveel kostenplaatsen is deze persoon budgethouder?
         SELECT COUNT(*)
           INTO v_count
           FROM prs_kostenplaats
          WHERE prs_perslid_key = rec_del.prs_perslid_key;

         IF (v_count > 0)
         THEN
            v_errorhint := 'Budgethouderschap verwijderen';
            UPDATE prs_kostenplaats
               SET prs_perslid_key = NULL
             WHERE prs_perslid_key = rec_del.prs_perslid_key;

            fac.imp_writelog (p_import_key,
                              'W',
                              'Budgethouderschap van te verwijderen persoon ('||v_count||' stuks) vervallen.',
                              v_prs_omschr);
         END IF;

         -- *** Vervangers ***
         v_errorhint := 'Vervangers zoeken';
         -- N.a.v. UWVA#16617: koppelingen met vervangers dienen ook verwijderd te worden
         SELECT COUNT(*)
           INTO v_count
           FROM prs_collega
          WHERE    prs_perslid_key     = rec_del.prs_perslid_key
                OR prs_perslid_key_alt = rec_del.prs_perslid_key;

         IF (v_count > 0)
         THEN
            v_errorhint := 'Vervangers verwijderen';
            DELETE FROM prs_collega
                  WHERE    prs_perslid_key     = rec_del.prs_perslid_key
                        OR prs_perslid_key_alt = rec_del.prs_perslid_key;

            fac.imp_writelog (p_import_key,
                              'I',
                              'Te verwijderen persoon heeft vervanger(s). Koppeling(en) verwijderd.',
                              v_prs_omschr);
         END IF;

/*       --UWVA#39432: Vervallen per overgang van Infotrading naar P&C (abonnementen worden nooit
         --            verlengd en moeten jaarlijks opnieuw worden afgesloten.
         --            Nog even aanhouden met oog op evt. nieuwe functionaliteit bij uitdienst!
         -- *** Abonnementen ***
         v_errorhint := 'Abonnementen zoeken';

         -- UWVA#23124: Als deze persoon abonnee (eigenaar) van een of meer - lopende - abonnementen
         -- is, dan moet(en) deze worden stopgezet. Contracten met cnt_contract_verlenging = 2 zijn
         -- al stopgezet.
         -- Stopzetten betekent: cnt_contract_verlenging = 2 (niet verlengen + niet vragen) en wordt
         -- vanzelf aan de intermediair doorgegeven (1 week vóór opzegtermijn).
         -- (Hierbij kijken we dus alleen naar abonnementen (ins_discipline_key = 360).
         SELECT   COUNT ( * )
           INTO   v_count
           FROM   cnt_v_aanwezigcontract c
          WHERE       c.prs_perslid_key_eig = rec_del.prs_perslid_key
                  AND c.ins_discipline_key = 360               -- Abonnementen
                  AND c.cnt_contract_status = 0              -- NIET Gesloten!
                  AND COALESCE (c.cnt_contract_verlenging, 0) IN (0, 1)
                  AND c.cnt_contract_looptijd_tot >= SYSDATE
                  AND NOT EXISTS -- Beschouw alleen laatste versie van contracten
                        (SELECT   1
                           FROM   cnt_v_aanwezigcontract
                          WHERE   cnt_contract_nummer_intern =
                                     c.cnt_contract_nummer_intern
                                  AND cnt_contract_versie >
                                        c.cnt_contract_versie);

         IF (v_count > 0)
         THEN
            UPDATE   cnt_contract c
               SET   cnt_contract_verlenging = 2
             WHERE       c.prs_perslid_key_eig = rec_del.prs_perslid_key
                     AND c.ins_discipline_key = 360            -- Abonnementen
                     AND c.cnt_contract_status = 0           -- NIET Gesloten!
                     AND COALESCE (c.cnt_contract_verlenging, 0) IN (0, 1)
                     AND c.cnt_contract_looptijd_tot >= SYSDATE
                     AND NOT EXISTS -- Beschouw alleen laatste versie van contracten
                           (SELECT   1
                              FROM   cnt_v_aanwezigcontract
                             WHERE   cnt_contract_nummer_intern =
                                        c.cnt_contract_nummer_intern
                                     AND cnt_contract_versie >
                                           c.cnt_contract_versie);

            fac.imp_writelog (
               p_import_key,
               'I',
                  'Abonnementen van te verwijderen persoon ('
               || v_count
               || ' stuks) worden opgezegd.',
               v_prs_omschr
            );
         END IF;
*/
         -- *** Verplichtingen ***
         v_errorhint := 'Verplichtingen zoeken';
         SELECT COUNT (*)
           INTO v_count
           FROM (SELECT prs_perslid_key FROM prs_v_verplichting_refcheck
                 UNION ALL
                 SELECT cnt_prs_perslid_key prs_perslid_key
                   FROM cnt_v_aanwezigcontract
                  WHERE cnt_contract_status = 0              -- NIET Gesloten!
                        AND cnt_contract_looptijd_tot >= SYSDATE) vp
           WHERE vp.prs_perslid_key = v_perslid_key;

         IF v_count = 0
         THEN
            -- Persoon heeft geen enkele (actuele of historische) verplichting
            v_errorhint :=    'Verwijderen van persoon met key '
                           || TO_CHAR (v_perslid_key);

            -- UWVA#41099: Oplossen "audit-problemen"
            --DELETE FROM prs_perslid
            --      WHERE prs_perslid_key = v_perslid_key;
            PRS.delete_perslid (p_import_key, v_perslid_key);

            fac.imp_writelog (p_import_key,
                              'I',
                              'Persoon verwijderd.',
                              v_prs_omschr);
         ELSE
            FOR rec IN (
            SELECT i.ins_deel_key, i.ins_deel_omschrijving, ik.ins_kenmerkdeel_waarde uitgifte, 'Uitdienst' aanduiding
              FROM ins_v_aanwezigdeel i, ins_v_aanwezigkenmerkdeel ik
             WHERE i.ins_srtdeel_key = 259000           -- Toegangspas Andover
                   AND i.ins_alg_ruimte_type = 'P'
                   AND i.ins_alg_ruimte_key = v_perslid_key
                   AND i.ins_deel_key = ik.ins_deel_key
                   AND ik.ins_kenmerk_key = 502)                   -- Uitgifte
            LOOP
               BEGIN
                  v_errormsg := 'Blokkeren pas NIET gelukt';

                  -- Ophalen passtatus voordat deze op Geblokkeerd wordt gezet (v_deelstat) tbv. logging.
                  SELECT f.fac_usrdata_omschr
                    INTO v_deelstat
                    FROM fac_usrdata f, ins_kenmerkdeel ik
                   WHERE f.fac_usrdata_key = ik.ins_kenmerkdeel_waarde
                     AND ik.ins_kenmerk_key = 489
                     AND ik.ins_deel_key = rec.ins_deel_key;

                  -- Status-kenmerk op Geblokkeerd zetten.
                  UPDATE ins_kenmerkdeel
                     SET ins_kenmerkdeel_waarde = '29875'       -- Geblokkeerd
                   WHERE ins_kenmerk_key = 489 AND ins_deel_key = rec.ins_deel_key;

                  fac.trackaction ('INSUPD', rec.ins_deel_key, NULL, NULL, 'Status gewijzigd: ' || v_deelstat || ' --> Geblokkeerd');

                  IF rec.uitgifte = '29742'                 -- Nog Uitgegeven?
                  THEN
                     fac.imp_writelog (p_import_key, 'I',
                                       'Toegangspas ' || rec.ins_deel_omschrijving || ' geblokkeerd voor medewerker met key ' || TO_CHAR (v_perslid_key), rec.aanduiding);
                  ELSE
                     v_errormsg := 'Verwijderen pas NIET gelukt';

                     UPDATE ins_deel
                        SET ins_deel_verwijder = SYSDATE,
                            ins_deel_vervaldatum = SYSDATE
                      WHERE ins_deel_key = rec.ins_deel_key;

                     fac.trackaction ('INSDEL', rec.ins_deel_key, NULL, NULL, NULL);

                     fac.imp_writelog (p_import_key, 'I',
                                       'Toegangspas ' || rec.ins_deel_omschrijving || ' verwijderd voor medewerker met key ' || TO_CHAR (v_perslid_key), rec.aanduiding);
                  END IF;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg := v_errormsg || ' (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                     fac.imp_writelog (p_import_key, 'W', v_errormsg, rec.aanduiding);
               END;
            END LOOP;

            v_errorhint := 'Actuele verplichtingen zoeken';
            -- Controleer of er ACTUELE verplichtingen zijn
            SELECT COUNT (*)
              INTO v_count
              FROM (SELECT prs_perslid_key FROM prs_v_verplichting_keys
                    UNION ALL
                    SELECT cnt_prs_perslid_key prs_perslid_key
                      FROM cnt_v_aanwezigcontract
                     WHERE cnt_contract_status = 0           -- NIET Gesloten!
                           AND cnt_contract_looptijd_tot >= SYSDATE) vp
             WHERE vp.prs_perslid_key = v_perslid_key;

            IF v_count > 0
            THEN
               v_errorhint := 'Persoon inactief markeren';
               -- Persoon inactief maken (alleen als nog niet inactief)
               UPDATE prs_perslid
                  SET prs_perslid_naam = SUBSTR ('INACTIEF:'|| prs_perslid_naam, 1, 30),
                      prs_perslid_oslogin = NULL,
                      prs_perslid_oslogin2 = NULL
                WHERE prs_perslid_key = v_perslid_key
                  AND prs_perslid_naam NOT LIKE 'INACTIEF:%';

               -- UWVA#20219: 'Toon in gids' uitzetten, ook als persoon al inactief is
               UPDATE prs_perslid
                  SET prs_perslid_ingids = NULL
                WHERE prs_perslid_key = v_perslid_key;

               fac.imp_writelog
                  (p_import_key,
                   'I',
                   'Persoon als INACTIEF gemarkeerd of was al INACTIEF gemarkeerd.',
                   v_prs_omschr);

               -- UWA#249970: notificatie naar budgethouder
               SELECT k.prs_perslid_key
                 INTO v_budgh_key
                 FROM prs_perslid p,
                      prs_afdeling a,
                      prs_kostenplaats k
                WHERE a.prs_afdeling_key = p.prs_afdeling_key
                  AND k.prs_kostenplaats_key = a.prs_kostenplaats_key
                  AND p.prs_perslid_key = v_perslid_key;

               fac.putnotificationsrtprio (88602,         -- pfrom (UWVA#37656: Met usesenderasreplyto=true haalt psender niets uit en moet pfrom zijn gevuld: 88602=_EMAIL-user)
                                           v_budgh_key,   -- pto
                                           'CUST21',      -- pcode
                                           1675,          -- pref (naar UWVA_V_RAP_UITDIENST)
                                           NULL,          -- poptmessage
                                           NULL,          -- poptstatus
                                           NULL,          -- poptemail
                                           NULL,          -- poptmobile
                                           v_perslid_key, -- pxref
                                           2,             -- pprio
                                           'infobeheer.fi@uwv.nl');  -- psender

               fac.trackaction ('PRSUPD', v_perslid_key, NULL, NULL, 'Persoon INACTIEF');
            ELSE
               BEGIN
                  v_errorhint := 'Persoon logisch verwijderen';
                  UPDATE prs_perslid
                     SET prs_perslid_verwijder = SYSDATE
                   WHERE prs_perslid_key = v_perslid_key;

                  fac.imp_writelog (p_import_key,
                                    'I',
                                    'Persoon geïnactiveerd.',
                                    v_prs_omschr);

                  fac.trackaction ('PRSDEL', v_perslid_key, NULL, NULL, NULL);
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     -- Kennelijk heeft de persoon toch ernstige verplichtingen
                     v_errorhint :=    'Persoon heeft nog (max. '
                                    || TO_CHAR (v_count)
                                    || ') verplichtingen. ' || v_prs_omschr;
                     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 (DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, 1, 100 )
                              || '|'
                              || SUBSTR (SQLERRM, 1, 100);
            v_errormsg :=    '(ORACLE error '
                          || oracle_err_num || '/' || oracle_err_mes
                          || ')';
            fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
      END;
   END LOOP;

   COMMIT;

   -- UWVA#22892: Eerst alle bewaarde mandaten (eigen tabel met key=3) en
   --             usrrap-relaties (hidden kenmerk met key=1111) uit voorgaande
   --             import verwijderen. Per persoon die deze run naar een andere
   --             afdeling verhuist, worden deze dan weer records toegevoegd.
   DELETE FROM   fac_usrdata
         WHERE   fac_usrtab_key = 3;

   DELETE FROM   prs_kenmerklink
         WHERE   prs_kenmerklink_niveau = 'P' AND prs_kenmerk_key = 1111;

   -- *** Update ***********************************************************************************
   v_errormsg := 'Try to open cursor';
   v_action := 'UPDATE';

   FOR rec_upd IN c_prs_upd
   LOOP
      BEGIN
         v_errormsg := 'Update init';

         v_prs_omschr :=    'Achternaam/persoonsnr/login/ABS-ID: '
                         || rec_upd.prs_perslid_naam
                  || '/' || rec_upd.prs_perslid_nr
                  || '/' || rec_upd.prs_perslid_oslogin
                  || '/' || rec_upd.id;

         -- Init
         v_update := TRUE;
         v_prsMatched := FALSE;
         v_afdeling_key := 0;
         v_srtperslid_key := NULL;
         v_perslid := NULL;
         v_perslid_key := 0;

         -- *** Matching ***********************************
         -- NB: zie uitleg bij cursor
         IF v_update
         THEN
            -- *** Matching op ABS-ID ***
            v_errormsg := 'Uniek ABS-ID';

            -- Check of ABS-ID wel uniek is in importbestand
            -- Een persoon kan vaker in het importbestandvoorkomen, met alle gegevens behalve de rol hetzelfde.
            -- Daarom SELECT DISTINCT op ABS-ID en (omdat die ook uniek moet zijn) accountnaam!
            SELECT COUNT(*)
              INTO v_count
              FROM (SELECT DISTINCT id,
                                    account
                      FROM uwva_imp_abs
                     WHERE id = rec_upd.id );

            -- Niet uniek --> error
            IF (v_count != 1)
            THEN
               v_errorhint := 'ABS-ID is niet uniek in importbestand. ' || v_prs_omschr;
               fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
               v_update := FALSE;

            -- Wel uniek --> komt het ook (uniek) voor in Facilitor?
            ELSE
               v_errormsg := 'Matching op ABS-ID';
               -- Probeer persoon op ABS-ID te matchen
               -- NB: dit doorzoekt alleen personen in Facilitor met een ABS-type, maar een persoon
               -- met een ander type kan best deze ABS-ID hebben (bijv. O of P).
               -- Type buiten beschouwing laten?
               -- Extragratis bonus is om die persoon-met-een-ander type dan te rapporteren,
               -- of als P te markeren.
               SELECT COUNT(*)
                 INTO v_count
                 FROM prs_v_aanwezigperslid ap,
                      prs_kenmerklink km
                WHERE     km.prs_link_key = ap.prs_perslid_key
                      AND km.prs_kenmerk_key = c_absid_key
                      AND km.prs_kenmerklink_waarde = rec_upd.id
                      AND uwva_abs.get_employeetype(p_import_key, prs_perslid_key, c_employeetype_key)
                             IN ('C', 'I', 'E', 'F', 'D', 'K', 'W');

               -- Komt niet voor --> INSERT
               IF (v_count = 0)
               THEN
                  v_aktie := 'INSERT';

               -- Komt uniek voor --> match! --> UPDATE
               ELSIF (v_count = 1)
               THEN
                  v_errormsg := 'Gegevens ophalen o.b.v. ABS-ID';
                  SELECT ap.*
                    INTO v_perslid
                    FROM prs_v_aanwezigperslid ap,
                         prs_kenmerklink km
                   WHERE     km.prs_link_key = ap.prs_perslid_key
                         AND km.prs_kenmerk_key = c_absid_key
                         AND km.prs_kenmerklink_waarde = rec_upd.id
                         AND uwva_abs.get_employeetype(p_import_key, prs_perslid_key, c_employeetype_key)
                                IN ('C', 'I', 'E', 'F', 'D', 'K', 'W');

                  v_aktie := 'UPDATE';

                  -- ABS-ID gevonden. Klopt het type ook (of: nog)?
                  v_errormsg := 'Bepalen werknemertype';
                  v_perslid_type := uwva_abs.get_employeetype(p_import_key, v_perslid.prs_perslid_key, c_employeetype_key);

                  -- Als werknemertypes in ABS en Facilitor verschillen (maar wel beide C, I, E, F, D, K of W zijn),
                  -- dan type in Facilitor updaten.
                  IF (v_perslid_type != rec_upd.employeetype)
                  THEN
                     uwva_set_werknemertype(v_perslid.prs_perslid_key, rec_upd.prs_perslid_naam,
                                            rec_upd.employeetype,
                                            'Bijstellen werknemertype', 'I');
                  END IF;

               -- Is niet uniek --> error
               ELSE
                  v_errorhint := 'Kan ABS-ID niet eenduidig bepalen in Facilitor. ' || v_prs_omschr;
                  fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
                  v_update := FALSE;
               END IF; -- komt account (uniek) voor in FAC?
            END IF; -- account uniek in ABS?
         END IF;

         -- *** Controle verplichte gegevens + ophalen extra informatie ***
         v_errormsg := 'Ontbrekende of incorrecte verplichte gegevens. Persoon wordt overgeslagen.';
         -- Controle: PRS_PERSLID_NAAM
         IF     v_update
            AND rec_upd.prs_perslid_naam IS NULL
         THEN
            v_errorhint :=    'Persoon heeft geen achternaam. Persoonsnummer/login/ABS-ID: '
                           || rec_upd.prs_perslid_nr
                           || '/' || rec_upd.prs_perslid_oslogin
                           || '/' || rec_upd.id;
            fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
            v_update := FALSE;
         END IF;

         ---- Controle: PRS_PERSLID_OSLOGIN en PRS_PERSLID_NR
         --IF     v_update
         --   AND rec_upd.prs_perslid_oslogin IS NULL
         --   AND rec_upd.prs_perslid_nr IS NULL
         --THEN
         --   v_errorhint :=    'Persoon heeft systeemaccount noch personeelsnummer. Achternaam: '
         --                  || rec_upd.prs_perslid_naam;
         --   fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
         --   v_update := FALSE;
         --END IF;

         -- Controle: PRS_AFDELING_NAAM
         IF v_update
         THEN
            IF rec_upd.prs_afdeling_naam IS NULL
            THEN
               v_errorhint := 'Persoon heeft geen afdeling. ' || v_prs_omschr;
               fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
               v_update := FALSE;
            -- Check of afdelingscode wel 6 karakters lang is (ontbrekend voorloopnullen?)
            ELSIF LENGTH(rec_upd.prs_afdeling_naam) != 6
            THEN
               v_errorhint :=    'Afdeling moet 6 karakters lang zijn (' || rec_upd.prs_afdeling_naam || '). '
                              || v_prs_omschr;
               fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
               v_update := FALSE;
            ELSE
               BEGIN
                  -- Bepaal de afdelingskey; afdelingen worden met een andere import beheerd
                  SELECT prs_afdeling_key
                    INTO v_afdeling_key
                    FROM prs_afdeling
                   WHERE prs_afdeling_naam = rec_upd.prs_afdeling_naam
                     AND prs_afdeling_verwijder IS NULL;
               EXCEPTION
                  WHEN NO_DATA_FOUND
                  THEN
                     v_errorhint :=    'Afdeling ' || rec_upd.prs_afdeling_naam || ' bestaat niet. '
                                    || v_prs_omschr;
                     fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
                     v_update := FALSE;
                  WHEN OTHERS
                  THEN
                     v_errorhint :=    'Kan Afdeling ' || rec_upd.prs_afdeling_naam || ' niet eenduidig bepalen. '
                                    || v_prs_omschr;
                     fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
                     v_update := FALSE;
               END;
            END IF;
         END IF;

         -- *** Controle niet-verplichte gegevens  ***
         -- Controle: PRS_SRTPERSLID_OMSCHRIJVING
         IF v_update
         THEN
            -- Geen functie --> Geef standaardfunctie
            IF rec_upd.prs_srtperslid_omschrijving IS NULL
            THEN
               v_errormsg := 'Functieomschrijving ontbreekt';
               v_errorhint :=   'Persoon heeft geen functieomschrijving. ' || v_prs_omschr
                              || '. Persoon krijgt functie "' || c_functie_onbekend || '" toegewezen.';
               fac.imp_writelog (p_import_key, 'I', v_errormsg, v_errorhint);

               v_srtperslid_omschr := c_functie_onbekend;
            ELSE
               -- UWVA#20033: functienaam letterlijk overnemen uit ABS (afgezien van voor- en naloopspaties)
               v_srtperslid_omschr := RTRIM (rec_upd.prs_srtperslid_omschrijving);
            END IF;

            BEGIN
               v_srtperslid_upper := UPPER (v_srtperslid_omschr);
               -- Bepaal de key van de functie
               SELECT prs_srtperslid_key, prs_srtperslid_omschrijving
                 INTO v_srtperslid_key, v_srtperslid_db_oms
                 FROM prs_srtperslid
                WHERE     prs_srtperslid_upper = v_srtperslid_upper
                      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. ' || v_prs_omschr;
                  fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
                  v_update := FALSE;
            END;
         END IF;

         -- Controle: PRS_PERSLID_EMAIL
         IF     v_update
            AND rec_upd.email IS NULL
         THEN
            v_errormsg := 'E-mailadres ontbreekt';
            v_errorhint := v_prs_omschr;
            --fac.imp_writelog (p_import_key, 'I', v_errormsg, v_errorhint);
         END IF;

         ---- Controle: PRS_PERSLID_MOBIEL
         --IF     v_update
         --   AND rec_upd.prs_perslid_mobiel IS NOT NULL
         --   AND rec_upd.prs_perslid_mobiel NOT LIKE '00316________'
         --THEN
         --   v_errormsg := 'Incorrect formaat mobielnr (' || rec_upd.prs_perslid_mobiel || ')';
         --   v_errorhint := v_prs_omschr;
         --   fac.imp_writelog (p_import_key, 'I', v_errormsg, v_errorhint);
         --END IF;


         -- Kan persoon gereactiveerd worden of is er al een persoon met hetzelfde ABS-ID actief
         IF     v_update
            AND v_aktie = 'UPDATE'
            -- UWVA#27192: logisch verwijderde personen worden niet gereactiveerd, alleen inactieve personen ("INACTIEF: ...")
            AND v_perslid.prs_perslid_upper LIKE 'INACTIEF%'
            --AND v_perslid.prs_perslid_verwijder IS NOT NULL
         THEN
            BEGIN
               -- Is er al een actieve persoon met dezelfde ABS-ID
               SELECT COUNT (ap.prs_perslid_key)
                 INTO v_prs_key_cnt
                 FROM prs_v_aanwezigperslid ap,
                      prs_kenmerklink km
                WHERE     km.prs_link_key = ap.prs_perslid_key
                      AND km.prs_kenmerk_key = c_absid_key
                      AND km.prs_kenmerklink_waarde = rec_upd.id
                      AND ap.prs_perslid_key != v_perslid.prs_perslid_key;

               IF v_prs_key_cnt > 0
               THEN
                  -- (UWVA#13270)
                  -- Waarde(n) gevonden: Er is al een actieve persoon met dezelfde ABS-ID gevonden: Niet updaten!!!
                  --v_errormsg := 'Persoon hoeft niet gereactiveerd te worden; prs_perslid_nr: ' || rec_upd.prs_perslid_nr;
                  --v_errorhint := 'Er bestaat al een persoon met dezelfde persooneelsnummer die actief is, GEEN ACTIE NODIG; personeelsnummer: ' || rec_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 ABS-ID
                  -- Persoon kan gereactiveerd worden (naam en oslogin herstellen wordt bij UPDATE statement verderop gedaan)
                  -- v_update := TRUE;
                  -- UWVA#20219: bij inactiveren wordt persoon niet meer getoond in gids. Bij reactiveren dus weer wel.
                  v_errormsg := 'Persoon reactiveren: tonen in gids';
                  UPDATE prs_perslid
                     SET prs_perslid_ingids = DECODE (rec_upd.employeetype, 'K', NULL, 1)
                   WHERE prs_perslid_key = v_perslid.prs_perslid_key;

                  -- Heractiveren van eventuele inactieve pas.
                  BEGIN
                     v_errormsg := 'Heractiveren pas NIET gelukt';

                     SELECT MAX (i.ins_deel_key)
                       INTO v_deelkey
                       FROM ins_deel i -- Ook een verwijderde pas kan worden gereanimeerd!
                      WHERE i.ins_srtdeel_key = 259000  -- Toegangspas Andover
                            AND i.ins_alg_ruimte_type = 'P'
                            AND i.ins_alg_ruimte_key = v_perslid.prs_perslid_key
                            AND NOT EXISTS (SELECT 1 -- Geen defecte/vermiste pas
                                              FROM ins_v_aanwezigkenmerkdeel
                                             WHERE ins_kenmerkdeel_waarde IN ('29874', '29877') -- Defect/Vermist
                                                   AND ins_kenmerk_key = 489 -- Status
                                                   AND ins_deel_key = i.ins_deel_key);

                     IF v_deelkey IS NOT NULL
                     THEN
                           UPDATE ins_deel
                              SET ins_deel_actief = 1,
                                  ins_deel_verwijder = NULL
                            WHERE ins_deel_key = v_deelkey;

                        -- Ophalen passtatus voordat deze op Actief wordt gezet (v_deelstat) tbv. logging.
                        SELECT f.fac_usrdata_omschr, i.ins_deel_omschrijving
                          INTO v_deelstat, v_deeloms
                          FROM fac_usrdata f, ins_kenmerkdeel ik, ins_deel i
                         WHERE TO_CHAR (f.fac_usrdata_key) = ik.ins_kenmerkdeel_waarde
                           AND ik.ins_kenmerk_key = 489
                           AND ik.ins_deel_key = i.ins_deel_key
                           AND i.ins_deel_key = v_deelkey;

                        -- Ook Status-kenmerk op Actief zetten.
                        UPDATE ins_kenmerkdeel
                           SET ins_kenmerkdeel_waarde = '29873'      -- Actief
                         WHERE ins_kenmerk_key = 489 AND ins_deel_key = v_deelkey;

                        fac.trackaction ('INSUPD', v_deelkey, NULL, NULL, 'Object geheractiveerd, status: ' || v_deelstat || ' --> Actief');

                        fac.imp_writelog (p_import_key, 'I',
                                          'Toegangspas ' || v_deeloms || ' geheractiveerd voor medewerker met key ' || TO_CHAR (v_perslid.prs_perslid_key), 'Heractiveren');
                     END IF;
                  EXCEPTION
                     WHEN OTHERS
                     THEN
                        oracle_err_num := SQLCODE;
                        oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                        v_errormsg := v_errormsg || ' (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                        fac.imp_writelog (p_import_key, 'W', v_errormsg, '');
                  END;

                  v_errormsg := 'Persoon wordt gereactiveerd.';
                  fac.imp_writelog (p_import_key, 'I', v_errormsg, v_prs_omschr);
               END IF;
            EXCEPTION
               WHEN OTHERS
               THEN
                  v_update := FALSE;
                  v_errorhint := 'Fout in het vinden aantal actieve personen. ' || v_prs_omschr;
            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';

                  -- Bestaat dit account al?
                  SELECT   COUNT ( * )
                    INTO   v_count
                    FROM   prs_perslid
                   WHERE   prs_perslid_oslogin = rec_upd.prs_perslid_oslogin;

                  -- Ja --> error
                  IF (v_count > 0)
                  THEN
                     v_errorhint := 'Account bestaat al.';
                     v_update := FALSE;
                     fac.imp_writelog (
                        p_import_key,
                        'W',
                        v_errormsg,
                           'Persoon toevoegen: account '
                        || rec_upd.prs_perslid_oslogin
                        || ' bestaat al. '
                        || v_prs_omschr
                     );
                  -- Nee --> toevoegen
                  ELSE
                     -- JvdM_14-10-10: "In het sheet met specificaties staat bij een aantal velden,
                     --   waaronder TELNO, MOBNR, FAXNR, ALTACCNT, géén actie vermeld. Hiermee
                     --   is bedoeld dat deze velden niet gebruikt moeten worden en dus niet voor
                     --   mutaties in Facilitor mogen dienen."
                     -- UWVA#27483: gebruik/formatteer e-mail adres volgens schrijfwijzer
                     -- UWVA#30417: 'prs_perslid_ingids' voor K(etenpartners) initieel onzichtbaar
                     INSERT INTO prs_perslid (prs_perslid_naam,
                                              prs_perslid_tussenvoegsel,
                                              prs_perslid_voorletters,
                                              prs_perslid_voornaam,
                                              --prs_perslid_telefoonnr,
                                              --prs_perslid_mobiel,
                                              prs_perslid_nr,
                                              prs_perslid_titel,
                                              prs_perslid_email,
                                              prs_perslid_oslogin,
                                              prs_perslid_geslacht,
                                              prs_perslid_ingids,
                                              prs_srtperslid_key,
                                              prs_afdeling_key)
                        VALUES   (rec_upd.prs_perslid_naam,
                                  rec_upd.prs_perslid_tussenvoegsel,
                                  rec_upd.prs_perslid_voorletters,
                                  rec_upd.prs_perslid_voornaam,
                                  --rec_upd.prs_perslid_telefoonnr,
                                  --rec_upd.prs_perslid_mobiel,
                                  rec_upd.prs_perslid_nr,
                                  rec_upd.prs_perslid_titel,
                                  rec_upd.sw_email,   -- Volgens schrijfwijzer
                                  rec_upd.prs_perslid_oslogin,
                                  rec_upd.prs_perslid_geslacht,
                                  DECODE (rec_upd.employeetype, 'K', NULL, 1),
                                  v_srtperslid_key,
                                  v_afdeling_key)
                     RETURNING   prs_perslid_key      INTO   v_perslid_key;

                     -- *** Employee type ***
                     uwva_set_werknemertype (
                        v_perslid_key,
                           rec_upd.prs_perslid_naam
                        || '/'
                        || rec_upd.prs_perslid_nr,
                        rec_upd.employeetype,
                        NULL,
                        NULL
                     );

                     -- *** ABS-ID ***
                     uwva_set_flexveld (
                        v_perslid_key,
                           rec_upd.prs_perslid_naam
                        || '/'
                        || rec_upd.prs_perslid_nr,
                        c_absid_key,
                        rec_upd.id
                     );

                     fac.imp_writelog (p_import_key,
                                       'I',
                                       'Persoon toegevoegd.',
                                       v_prs_omschr);
                  END IF;
               ELSE
                  v_errormsg := 'Persoon kan niet worden gewijzigd';
                  v_errorhint := 'Verwijderen budgetten en mandaten.';

                  -- Voor later gebruik bewaren (specifiek voor toevoegen werkplek)
                  -- (v_perslid_key wordt bij een nieuw persoon met bovenstaande INSERT gevuld
                  -- en wordt bij toevoegen werkplek gebruikt)
                  v_perslid_key := v_perslid.prs_perslid_key;

                  -- UWVA#687: Mandaten vervallen indien persoon naar andere afdeling verhuist
                  SELECT   prs_afdeling_key
                    INTO   o_afdeling_key
                    FROM   prs_perslid
                   WHERE   prs_perslid_key = v_perslid_key;

                  IF o_afdeling_key != v_afdeling_key
                  THEN
                     -- Voor hoeveel kostenplaatsen is deze budgethouder?
                     SELECT   COUNT ( * )
                       INTO   l_nrkps
                       FROM   prs_kostenplaats
                      WHERE   prs_perslid_key = v_perslid_key;

                     IF l_nrkps > 0
                     THEN
                        UPDATE   prs_kostenplaats
                           SET   prs_perslid_key = NULL
                         WHERE   prs_perslid_key = v_perslid_key;

                        fac.imp_writelog (
                           p_import_key,
                           'I',
                              'Budgethouderschap van persoon ('
                           || l_nrkps
                           || ' stuks) vervallen vanwege afdelingswijziging.',
                           v_prs_omschr
                        );
                     END IF;

                     -- En verwijder ook alle toegekende mandaten
                     SELECT   COUNT ( * )
                       INTO   l_nrkps
                       FROM   prs_perslidkostenplaats
                      WHERE   prs_perslid_key = v_perslid_key;

                     IF l_nrkps > 0
                     THEN
                        -- UWVA#22892: Bewaar -deze ABS-import!- verwijderde mandaten tbv.
                        --             CUST13-notificatie en leg relatie van persoon naar
                        --             rapport met deze verwijderde mandaten.
                        INSERT INTO fac_usrdata (fac_usrtab_key,
                                                 fac_usrdata_code,
                                                 fac_usrdata_omschr,
                                                 fac_usrdata_volgnr,
                                                 fac_usrdata_prijs)
                             SELECT   3,                    -- Bewaarde mandaten
                                         TO_CHAR (pk.prs_perslid_key)
                                      || '-'
                                      || TO_CHAR (COALESCE (pk.prs_kostenplaats_key, 0)),
                                      TO_CHAR (o_afdeling_key), -- Oude afdeling
                                      COALESCE (pk.prs_perslidkostenplaats_boeken, 0),
                                      COALESCE (pk.prs_perslidkostenplaats_inzage, 0)
                               FROM   prs_perslidkostenplaats pk,
                                      prs_kostenplaats k
                              WHERE   pk.prs_perslid_key = v_perslid_key
                                      AND pk.prs_kostenplaats_key =
                                            k.prs_kostenplaats_key(+)
                           ORDER BY   pk.prs_perslid_key,
                                      pk.prs_kostenplaats_key;

                        INSERT INTO prs_kenmerklink (prs_link_key,
                                                     prs_kenmerklink_niveau,
                                                     prs_kenmerk_key,
                                                     prs_kenmerklink_waarde)
                          VALUES   (v_perslid_key,
                                    'P',
                                    1111,                        -- usrrap-relatie
                                    '555');    -- UWVA_V_RAP_GESCHOOND_MANDAAT-key

                        DELETE FROM   prs_perslidkostenplaats
                              WHERE   prs_perslid_key = v_perslid_key;

                        fac.imp_writelog (
                           p_import_key,
                           'I',
                              'Mandaten van persoon ('
                           || l_nrkps
                           || ' stuks) vervallen vanwege afdelingswijziging.',
                           v_prs_omschr
                        );
                     END IF;
                  END IF;

                  v_errorhint := 'Bijwerken persoon.';

                  -- Kijk of persoon bijgewerkt moet worden
                  -- JvdM_14-10-10: "In het sheet met specificaties staat bij een aantal velden,
                  --   waaronder TELNO, MOBNR, FAXNR, ALTACCNT, géén actie vermeld. Hiermee
                  --   is bedoeld dat deze velden niet gebruikt moeten worden en dus niet voor
                  --   mutaties in Facilitor mogen dienen."
                  -- UWVA#19010: e-mail updaten als leeg in Facilitor (alleen aanvullen dus)!
                  -- UWVA#19189: voornaam updaten als leeg in Facilitor (alleen aanvullen dus)!
                  -- UWVA#19957: voornaam overschrijven als gevuld in ABS (geslacht ook)!
                  IF (v_perslid.prs_perslid_naam != rec_upd.prs_perslid_naam
                      OR COALESCE (v_perslid.prs_perslid_nr, '-') !=
                           COALESCE (rec_upd.prs_perslid_nr, '-')
                      OR COALESCE (v_perslid.prs_perslid_oslogin, '-') !=
                           COALESCE (rec_upd.prs_perslid_oslogin, '-')
                      OR COALESCE (v_perslid.prs_perslid_tussenvoegsel, '-') !=
                           COALESCE (rec_upd.prs_perslid_tussenvoegsel, '-')
                      OR COALESCE (v_perslid.prs_perslid_voorletters, '-') !=
                           COALESCE (rec_upd.prs_perslid_voorletters, '-')
                      OR COALESCE (v_perslid.prs_perslid_voornaam, '-') !=
                           COALESCE (rec_upd.prs_perslid_voornaam, '-')
                      OR COALESCE (v_perslid.prs_perslid_titel, '-') !=
                           COALESCE (rec_upd.prs_perslid_titel, '-')
                      OR COALESCE (v_perslid.prs_perslid_email, '-') !=
                           COALESCE (v_perslid.prs_perslid_email,
                                     rec_upd.email,
                                     '-')
                      OR COALESCE (v_perslid.prs_perslid_geslacht, -1) !=
                           COALESCE (rec_upd.prs_perslid_geslacht, -1)
                      OR COALESCE (v_perslid.prs_srtperslid_key, 0) !=
                           COALESCE (v_srtperslid_key, 0)
                      OR v_perslid.prs_afdeling_key != v_afdeling_key
                      OR v_perslid.prs_perslid_verwijder IS NOT NULL)
                  THEN
                     BEGIN
                        -- Moet het account gewijzigd worden?
                        -- #UWVA20003: als v_perslid.- of rec_upd.prs_perslid_oslogin is NULL, was
                        -- onderstaande conditie altijd FALSE en werd account dus niet bijgewerkt.
                        -- Concateneren met een loze string lost dit op.
                        IF (v_perslid.prs_perslid_oslogin || '-' !=
                               rec_upd.prs_perslid_oslogin || '-')
                        THEN
                           v_errorhint := 'Bijwerken account.';

                           -- Ja --> Bestaat dit account al?
                           SELECT   COUNT ( * )
                             INTO   v_count
                             FROM   prs_perslid
                            WHERE   prs_perslid_oslogin =
                                       rec_upd.prs_perslid_oslogin;

                           IF (v_count = 0)
                           THEN
                              -- Nee --> Update
                              v_errorhint := 'Update account.';

                              UPDATE   prs_perslid
                                 SET   prs_perslid_oslogin =
                                          rec_upd.prs_perslid_oslogin
                               WHERE   prs_perslid_key = v_perslid_key;
                           ELSE
                              -- Ja --> error
                              v_errorhint := 'Dubbel account.';
                              v_update := FALSE;
                              fac.imp_writelog (
                                 p_import_key,
                                 'W',
                                 v_errormsg,
                                 'Account bijwerken: '
                                 || rec_upd.prs_perslid_oslogin
                                 || ' bestaat al. Werknemertype P wordt gezet. '
                                 || v_prs_omschr
                              );
                              uwva_set_werknemertype (
                                 v_perslid_key,
                                    rec_upd.prs_perslid_naam
                                 || '/'
                                 || rec_upd.prs_perslid_nr,
                                 'P',
                                 NULL,
                                 NULL
                              );
                           END IF;
                        END IF;

                        -- UWVA#19010: e-mail updaten als leeg in Facilitor (alleen aanvullen dus)!
                        -- UWVA#19957: voornaam overschrijven als gevuld in ABS (geslacht ook)!
                        -- UWVA#23124: kwaliteit gegevens in ABS is dusdanig dat ABS voor alles
                        -- leidend is, muv e-mail. Dat wordt soms handmatig aangepast in Facilitor,
                        -- dus alleen vullen, niet overschrijven.
                        -- Personen die al bestonden en veranderd zijn in Ketenpartner (K) krijgen geen vinkje ingids.
                        UPDATE   prs_perslid
                           SET   prs_perslid_naam = rec_upd.prs_perslid_naam,
                                 prs_perslid_nr = rec_upd.prs_perslid_nr,
                                 prs_perslid_tussenvoegsel = rec_upd.prs_perslid_tussenvoegsel,
                                 prs_perslid_voorletters = rec_upd.prs_perslid_voorletters,
                                 prs_perslid_voornaam = rec_upd.prs_perslid_voornaam,
                                 prs_perslid_titel = rec_upd.prs_perslid_titel,
                                 prs_perslid_email = COALESCE (prs_perslid_email, rec_upd.email),
                                 prs_perslid_geslacht = rec_upd.prs_perslid_geslacht,
                                 prs_perslid_ingids = DECODE (rec_upd.employeetype, 'K', NULL, 1),
                                 prs_srtperslid_key = v_srtperslid_key,
                                 prs_afdeling_key = v_afdeling_key,
                                 prs_perslid_verwijder = NULL
                         WHERE   prs_perslid_key = v_perslid_key;

                        -- *** Employee type ***
                        uwva_set_werknemertype (
                           v_perslid_key,
                              rec_upd.prs_perslid_naam
                           || '/'
                           || rec_upd.prs_perslid_nr,
                           rec_upd.employeetype,
                           NULL,
                           NULL
                        );

                     EXCEPTION
                        WHEN DUP_VAL_ON_INDEX
                        THEN
                           v_update := FALSE;
                           fac.imp_writelog (
                              p_import_key,
                              'W',
                              v_errormsg,
                                 'Account '
                              || rec_upd.prs_perslid_oslogin
                              || ' bestaat al. Werknemertype P wordt gezet. '
                              || v_prs_omschr
                           );

                           uwva_set_werknemertype (
                              v_perslid_key,
                                 rec_upd.prs_perslid_naam
                              || '/'
                              || rec_upd.prs_perslid_nr,
                              'P',
                              NULL,
                              NULL
                           );
                        WHEN OTHERS
                        THEN
                           v_update := FALSE;
                           fac.imp_writelog (
                              p_import_key,
                              'W',
                              v_errormsg,
                              'Fout bij updaten persoon' || v_prs_omschr
                           );
                     END;
                  END IF;
               END IF;
            EXCEPTION
               WHEN OTHERS
               THEN
                  oracle_err_num := SQLCODE;
                  oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                  v_errormsg :=
                     'update: '
                     || SUBSTR (DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, 1, 100);
                  v_errorhint :=
                        '(ORACLE error '
                     || oracle_err_num
                     || '/'
                     || oracle_err_mes
                     || '). '
                     || v_prs_omschr;
                  v_update := FALSE;
                  fac.imp_writelog (p_import_key,
                                    'W',
                                    v_errormsg,
                                    v_errorhint);
            END;
         END IF;

         -- *** Rol(len) ***************************************************************************
         --v_update := FALSE;--TODO
         IF v_update
         THEN
            BEGIN
               -- *** Profiel/Limiet ***********************
               -- Kan ik uit de rol(len) die deze persoon heeft een profiel/limiet afleiden?
               -- (i.e. bepaal aantal rollen van persoon dat naar een profiel verwijst)
               v_errormsg := 'Aantal profielen bepalen';
               SELECT COUNT(*)
                 INTO v_count
                 FROM uwva_imp_abs uia,
                      prs_kenmerklink km,
                      uwva_provisioning up,
                      fac_profiel fp
                WHERE     fp.fac_profiel_key = up.fac_profiel_key
                      AND up.uwva_rol_omschr = uia.grpfname
                      AND km.prs_link_key = v_perslid_key
                      AND km.prs_kenmerk_key = c_absid_key
                      AND uia.id = km.prs_kenmerklink_waarde;

               -- Ja --> bepaal profiel met hoogste limiet
               IF (v_count > 0)
               THEN
                  v_errormsg := 'Rol->Profiel+Limiet';
                  SELECT fac_profiel_key, fac_profiel_omschrijving, limiet
                    INTO v_profiel_key, v_profiel_omschr, v_limiet
                    FROM (  SELECT DISTINCT
                                   fp.fac_profiel_key,
                                   fp.fac_profiel_omschrijving,
                                   COALESCE (fp.fac_profiel_limiet,
                                             (SELECT MAX (fpw.fac_profielwaarde_limiet)
                                                FROM fac_profielwaarde fpw
                                               WHERE fp.fac_profiel_key = fpw.fac_profiel_key))
                                      limiet
                              FROM uwva_imp_abs uia,
                                   prs_kenmerklink km,
                                   uwva_provisioning up,
                                   fac_profiel fp
                             WHERE     fp.fac_profiel_key = up.fac_profiel_key
                                   AND up.uwva_rol_omschr = uia.grpfname
                                   AND km.prs_link_key = v_perslid_key
                                   AND km.prs_kenmerk_key = c_absid_key
                                   AND uia.id = km.prs_kenmerklink_waarde
                          ORDER BY limiet DESC)
                   WHERE ROWNUM = 1;

                  v_errormsg := 'Wijzigen limiet';
                  UPDATE prs_perslid
                     SET fac_profiel_key = v_profiel_key
                   WHERE prs_perslid_key = v_perslid_key;

                  fac.imp_writelog (p_import_key,
                                    'I',
                                    v_prs_omschr,
                                    'Profiel gewijzigd: '||v_profiel_omschr||' ('||v_profiel_key||'): E '||v_limiet||',-');
               -- Nee --> Verwijder eventueel aanwezige profiel(limiet)en
               ELSE
                  v_errormsg := 'Verwijderen profiel(-limiet)';
                  UPDATE prs_perslid
                     SET fac_profiel_key = NULL
                   WHERE prs_perslid_key = v_perslid_key;

                  --fac.imp_writelog (p_import_key,
                  --                  'I',
                  --                  v_prs_omschr,
                  --                  'Profiel verwijderd.');
               END IF; -- v_count>0

               -- *** Authorisatiegroepen *********************
               -- Verwijder alle rechten, die iemand volgens ABS niet heeft.
               FOR rec_groep IN c_groep (rec_upd.id, v_perslid_key)
               LOOP
                  v_errormsg := 'Rol->Authgroep verwijderen';
                  DELETE FROM fac_gebruikersgroep
                        WHERE fac_groep_key = rec_groep.fac_groep_key
                          AND prs_perslid_key = v_perslid_key;

                  fac.imp_writelog (p_import_key,
                                    'I',
                                    v_prs_omschr,
                                    'Groep verwijderd: ' || rec_groep.fac_groep_omschrijving||' (#'||rec_groep.fac_groep_key||')');
               END LOOP;

               -- Voeg alle rechten-volgens-ABS toe, die iemand nog niet heeft.
               FOR rec_rol IN c_rol (rec_upd.id, v_perslid_key)
               LOOP
                  v_errormsg := 'Rol->Authgroep toevoegen';
                  INSERT INTO fac_gebruikersgroep
                              (fac_groep_key, prs_perslid_key)
                       VALUES (rec_rol.fac_groep_key, v_perslid_key);

                  fac.imp_writelog (p_import_key,
                                    'I',
                                    v_prs_omschr,
                                    'Groep toegevoegd: ' || rec_rol.fac_groep_omschrijving||' (#'||rec_rol.fac_groep_key||')');
               END LOOP;

               -- Iedereen uit ABS met een oslogin moet ook groep _default krijgen, als 'ie die nog niet heeft
               IF (rec_upd.prs_perslid_oslogin IS NOT NULL)
               THEN
                  v_errormsg := '_default toevoegen?';
                  SELECT COUNT (*)
                    INTO v_count
                    FROM fac_gebruikersgroep fgg
                   WHERE     fgg.prs_perslid_key = v_perslid_key
                         AND fac_groep_key = c_grp_default_key;

                  IF (v_count = 0)
                  THEN
                     v_errormsg := '_default toevoegen';
                     INSERT INTO fac_gebruikersgroep
                                 (fac_groep_key, prs_perslid_key)
                          VALUES (c_grp_default_key, v_perslid_key);
                  END IF;
               END IF;

            EXCEPTION
               WHEN OTHERS
               THEN
                  fac.imp_writelog (p_import_key,
                  'W',
                  'Rollen: ' || v_errormsg,
                  v_prs_omschr);
            END;
         END IF; -- v_update

         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 :=    v_errorhint
                           || ' {' || v_errormsg || '}';
            v_errormsg :=    '(ORACLE error '
                          || oracle_err_num || '/' || oracle_err_mes
                          || ')';
            fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
      END;
   END LOOP;

   COMMIT;

   -- UWVA#30547: Ketenpartners krijgen geen (zelden een) werkplek mee vanuit ABS, maar moeten wel een werkplek
   -- in AMSG3 krijgen, met in basis dezelfde voorwaarden als een normale HRM-werkplek. Verschil is dat een normale
   -- HRM-werkplek wordt toegewezen in het eerste gebouw op de locatie (hier AMSG0), terwijl dat hier expliciet AMSG3
   -- moet zijn. Daarom in de importtabel voor alle personen met type K 'GAMSG3' als pandcode invullen, zodat de
   -- locatie klopt, en daarna bij het bepalen van het gebouw 'hard' AMSG3 gebruiken ipv 'het eerste gebouw'. De rest
   -- gaat daarna vanzelf.
   UPDATE uwva_imp_abs
      SET pandcode = c_def_pandcode_ketenpartner
    WHERE employeetype = 'K'
      AND pandcode IS NULL;

   -- *** Update HRM-WP voor personen **************************************************************
   v_errormsg := 'Try to open cursor c_prs_wp ';

   -- Cursor levert alleen personen waarvoor iets moet gebeuren!
   FOR rec_wp IN c_prs_wp
   LOOP
      BEGIN
         v_aktie := 'NONE';
         v_errormsg := 'NONE';

         -- Eerst eens de huidige HRM-WP(s) opruimen, tenzij dit toevallig
         -- de laagste/oudste WP op beoogde HRM-locatie is (dan behouden).
         -- Per 5.3.2/FSN#26947 verdwijnt via trigger vanzelf de bezetting!
         v_errormsg := 'Fout bij verwijderen (oude) HRM-WP(s)';

         DELETE FROM prs_werkplek wp
          WHERE EXISTS
                        (SELECT   1
                           FROM   prs_perslidwerkplek pw
                          WHERE   pw.prs_perslid_key = rec_wp.prs_perslid_key
                                  AND pw.prs_werkplek_key = wp.prs_werkplek_key
                                  AND pw.prs_perslidwerkplek_volgnr = 2
                                  AND pw.prs_perslidwerkplek_key != COALESCE (rec_wp.facloc_pw_key, 0));

         -- Gekke situatie (zou niet mogen voorkomen), maar even loggen.
         IF (rec_wp.hrmall_wp_aant > 1)
         THEN
            fac.imp_writelog (
               p_import_key, 'I',
               rec_wp.aanduiding || ': >1 HRM-WP; opruiming uitgevoerd!',
               'WP'
            );
         END IF;

         -- Het aantal WP(s) op HRM-locatie bepaalt wat er moet gebeuren.
         IF (rec_wp.facloc_wp_aant = 0)      -- Geen enkele WP op HRM-locatie!
         THEN
            -- Als persoon totaal maar 1 WP had, dan "verhuist" die nu naar de
            -- nieuwe HRM-WP (en blijft het totaal bij 1 WP).
            -- Was die ene WP een HRM-WP, dan is die hierboven reeds opgeruimd
            -- (en hoeft dat hier niet nog eens).
            IF (rec_wp.facall_wp_aant = 1 AND rec_wp.hrmall_wp_aant <> 1)
            THEN
               -- Per 5.3.2 verdwijnt via trigger vanzelf de bezetting!
               v_errormsg := 'Fout bij verwijderen enige WP op andere locatie';

               DELETE FROM prs_werkplek wp
                WHERE prs_werkplek_key =
                              (SELECT   prs_werkplek_key
                                 FROM   prs_perslidwerkplek
                                WHERE   prs_perslidwerkplek_key = rec_wp.facall_pw_key);
            END IF;

            v_aktie := 'INSERT';
         ELSE                                -- Een of meer WP op HRM-locatie!
            v_errormsg := 'Fout bij promoveren WP op HRM-locatie';

            UPDATE   prs_perslidwerkplek
               SET   prs_perslidwerkplek_volgnr = 2
             WHERE   prs_perslidwerkplek_key = rec_wp.facloc_pw_key;

            fac.imp_writelog (
               p_import_key, 'I',
               rec_wp.aanduiding || ': Bestaande WP op HRM-locatie naar 2',
               'WP'
            );

            IF (rec_wp.facloc_wp_aant > 1)        -- Teveel WP op HRM-locatie!
            THEN
               -- Per 5.3.2 verdwijnt via trigger vanzelf de bezetting!
               v_errormsg := 'Fout bij verwijderen overige WP op HRM-locatie';

               DELETE FROM prs_werkplek wp
                WHERE   EXISTS
                              (SELECT   1
                                 FROM   prs_perslidwerkplek pw
                                WHERE   pw.prs_perslid_key = rec_wp.prs_perslid_key
                                        AND pw.prs_werkplek_key = wp.prs_werkplek_key
                                        AND pw.prs_perslidwerkplek_key != rec_wp.facloc_pw_key);

               fac.imp_writelog (
                  p_import_key, 'I',
                  rec_wp.aanduiding || ': Overige WP(s) op HRM-locatie weg',
                  'WP'
               );
            END IF;
         END IF;

         v_update := TRUE;

         IF (v_aktie = 'INSERT')
         THEN
            -- Dan hebben we hier dus te maken met een persoon die nog geen
            -- HRM-WP heeft op de via pandcode voorgeschreven HRM-locatie. Hier
            -- moeten we een gebouw, verdieping, ruimte en werkplek bij zoeken.
            BEGIN
               IF (rec_wp.employeetype = 'K')
               THEN
                  -- UWVA#30547: Voor ketenpartners niet het 'eerste' gebouw kiezen,
                  -- maar het gebouw bij de pandcode (AMGS3). Dat is al bepaald in de cursor.
                  v_new_gebouw_key := rec_wp.alg_gebouw_key;
               ELSE
                  v_errormsg :=
                        'Fout bij bepalen gebouw op locatie/pandcode '
                     || rec_wp.alg_locatie_key
                     || '/'
                     || rec_wp.pandcode;

                  SELECT   MIN (alg_gebouw_code)
                    INTO   v_gebouw_code
                    FROM   alg_v_aanweziggebouw
                   WHERE   alg_locatie_key = rec_wp.alg_locatie_key
                           AND COALESCE (alg_gebouw_vervaldatum, SYSDATE) > TRUNC (SYSDATE);

                  SELECT   alg_gebouw_key
                    INTO   v_new_gebouw_key
                    FROM   alg_v_aanweziggebouw
                   WHERE   alg_locatie_key = rec_wp.alg_locatie_key
                           AND alg_gebouw_code = v_gebouw_code;
               END IF;
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  v_errormsg :=
                        'Fout bij toevoegen gebouw op locatie/pandcode '
                     || rec_wp.alg_locatie_key
                     || '/'
                     || rec_wp.pandcode;

                  v_gebouw_code := '0';

                  INSERT INTO alg_gebouw (alg_locatie_key,
                                          alg_srtgebouw_key,
                                          alg_gebouw_code,
                                          alg_gebouw_naam)
                     VALUES   (rec_wp.alg_locatie_key,
                               c_srtgebouw_default,
                               v_gebouw_code,
                               'Onbekend')
                  RETURNING   alg_gebouw_key      INTO   v_new_gebouw_key;
               WHEN OTHERS
               THEN
                  fac.imp_writelog (p_import_key, 'W',
                                    rec_wp.aanduiding || v_errormsg,
                                    'WP');
                  v_update := FALSE;
            END;

            IF v_update
            THEN
               BEGIN
                  v_errormsg :=
                     'Fout bij bepalen verdieping in gebouw '
                     || v_gebouw_code;

                  SELECT   alg_verdieping_key
                    INTO   v_verdieping_key
                    FROM   alg_v_aanwezigverdieping
                   WHERE   alg_gebouw_key = v_new_gebouw_key
                           AND alg_verdieping_volgnr = 0;     -- Begane grond!
               EXCEPTION
                  WHEN NO_DATA_FOUND
                  THEN
                     v_errormsg :=
                        'Fout bij toevoegen verdieping in gebouw '
                        || v_gebouw_code;

                     INSERT INTO alg_verdieping (alg_gebouw_key,
                                                 alg_verdieping_omschrijving,
                                                 alg_verdieping_volgnr,
                                                 alg_verdieping_code)
                        VALUES   (v_new_gebouw_key,
                                  c_verdieping_omschr_default,
                                  0,
                                  '0')
                     RETURNING   alg_verdieping_key
                          INTO   v_verdieping_key;
                  WHEN OTHERS
                  THEN
                     fac.imp_writelog (p_import_key, 'W',
                                       rec_wp.aanduiding || v_errormsg,
                                       'WP');
                     v_update := FALSE;
               END;
            END IF;

            IF v_update
            THEN
               BEGIN
                  v_errormsg :=
                        'Fout bij bepalen ruimte in gebouw '
                     || v_gebouw_code
                     || ' (verdieping '
                     || TO_CHAR (v_verdieping_key)
                     || ').';

                  SELECT   alg_ruimte_key, alg_ruimte_nr
                    INTO   v_ruimte_key, v_ruimte_nr
                    FROM   alg_v_aanwezigruimte
                   WHERE   alg_verdieping_key = v_verdieping_key
                           AND alg_ruimte_nr = c_ruimte_code;
               EXCEPTION
                  WHEN NO_DATA_FOUND
                  THEN
                     v_errormsg :=
                           'Fout bij toevoegen ruimte in gebouw '
                        || v_gebouw_code
                        || ' (verdieping '
                        || TO_CHAR (v_verdieping_key)
                        || ').';

                     INSERT INTO alg_ruimte (alg_verdieping_key,
                                             alg_ruimte_nr,
                                             alg_ruimte_omschrijving)
                        VALUES   (v_verdieping_key,
                                  c_ruimte_code,
                                  c_ruimte_omschr_default)
                     RETURNING   alg_ruimte_key, alg_ruimte_nr
                          INTO   v_ruimte_key, v_ruimte_nr;
                  WHEN OTHERS
                  THEN
                     fac.imp_writelog (p_import_key, 'W',
                                       rec_wp.aanduiding || v_errormsg,
                                       'WP');
                     v_update := FALSE;
               END;
            END IF;

            IF v_update
            THEN
               uwva_upsert_wp (rec_wp.prs_perslid_key,
                               v_ruimte_key, v_ruimte_nr,
                               NULL);

               fac.imp_writelog (p_import_key, 'I',
                                 rec_wp.aanduiding || ': HRM-WP aangemaakt',
                                 'WP');
            END IF;
         END IF;

         --UWVA#23124: Verhuisbericht naar intermediair Abonnementen
         --UWVA#39432: Per overgang Infotrading naar P&C ongewijzigd
         v_errorhint := 'Abonnementen zoeken (verhuizing)';
         IF v_update
         THEN
            SELECT COUNT(*)
              INTO v_count
              FROM cnt_contract c,
                   cnt_discipline d,
                   bes_disc_params dp
             WHERE     c.prs_perslid_key_eig IS NOT NULL
                   AND c.prs_perslid_key_eig = rec_wp.prs_perslid_key
                   AND d.ins_discipline_key = c.ins_discipline_key
                   AND dp.bes_disc_params_cnt_disckey = d.ins_discipline_key;

            IF (v_count > 0)
            THEN
               uwva.abo_verhuisd (p_import_key,
                                  rec_wp.prs_perslid_key,
                                  rec_wp.alg_locatie_key);

               fac.imp_writelog (p_import_key, 'I',
                                 rec_wp.aanduiding,
                                 'Verhuizing doorgegeven aan intermediair abonnementen');
            END IF;
         END IF;

         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 := 'WP {' || v_errormsg || '}';
            v_errormsg :=
                  rec_wp.aanduiding
               || '(ORACLE error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'W',
                              v_errormsg,
                              v_errorhint);
      END;
   END LOOP;

   COMMIT;

   -- UWVA#20232: Tijdelijk(!) flexveld (Vinder-)Regio bijwerken/toevoegen
   --             a.d.h.v. gebouw waar persoon werkplek heeft.
   v_count_regio_edit := 0;
   v_count_regio_add  := 0;
   FOR rec_regio IN c_prs_regio
   LOOP
      BEGIN
         v_errorhint := 'Regio: fout! ('||rec_regio.prs_perslid_key||' in '||rec_regio.alg_gebouw_code
                        ||': '||rec_regio.prs_kenmerklink_key||'/'||rec_regio.prs_kenmerklink_waarde||'->'||rec_regio.fac_usrdata_key
                        ||'/'||rec_regio.fac_usrdata_omschr||')';
         IF (rec_regio.prs_kenmerklink_key IS NULL)
         THEN
            INSERT INTO prs_kenmerklink
                        (prs_link_key,
                         prs_kenmerklink_niveau, prs_kenmerk_key,
                         prs_kenmerklink_waarde)
                 VALUES (rec_regio.prs_perslid_key,
                         'P', c_regio_key,
                         rec_regio.fac_usrdata_key);

            v_count_regio_add := v_count_regio_add + 1;
         ELSE
            UPDATE prs_kenmerklink
               SET prs_kenmerklink_waarde = rec_regio.fac_usrdata_key
             WHERE prs_kenmerklink_key = rec_regio.prs_kenmerklink_key;

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

   COMMIT;

   fac.imp_writelog (p_import_key, 'S',
                     'Regio: ' || v_count_regio_add  || ' flexvelden toegevoegd, '
                     || v_count_regio_edit || ' flexvelden bijgewerkt.',
                     '');

   SELECT COUNT (*)
     INTO v_perslid_newcount_fclt
     FROM prs_perslid
    WHERE (   prs_perslid_nr      IS NOT NULL
           OR prs_perslid_oslogin IS NOT NULL)
      AND prs_perslid_verwijder IS NULL
      AND uwva_abs.get_employeetype(p_import_key, prs_perslid_key, c_employeetype_key) IN ('C', 'I', 'E', 'F', 'D', 'K', 'W');

   -- Vergelijking aantal personen voor en na import
   -- (zelfde query als vóór, anders vergelijk je appels met peren)
   fac.imp_writelog (p_import_key,
                     'S',
                        'Aantal actieve personen (met account/personeelsnr en type) vooraf: '
                     || TO_CHAR (v_perslid_count_fclt)
                     || '  nu: '
                     || TO_CHAR (v_perslid_newcount_fclt),
                     ''
                    );

   -- Aantal personen zonder login én personeelsnummer
   SELECT COUNT (*)
     INTO v_perslid_newcount_fclt -- hergebruik (misbruik) variabele
     FROM prs_perslid
    WHERE prs_perslid_oslogin IS NULL
      AND prs_perslid_nr      IS NULL
      AND prs_perslid_verwijder IS NULL;

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

   -- Ongebruikte rollen
   SELECT COUNT(*)
     INTO v_count
     FROM (SELECT DISTINCT uwva_rol_omschr rol FROM uwva_provisioning
           MINUS
           SELECT DISTINCT grpfname rol FROM uwva_imp_abs);

   IF (v_count > 0)
   THEN
      BEGIN
         FOR rec_rnu IN c_rol_not_used
         LOOP
            fac.imp_writelog (p_import_key, 'S', 'Ongebruikte rol in provisioning-tabel', rec_rnu.rol);
         END LOOP;
      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, 'W', v_errormsg, v_errorhint);
      END;
   END IF;

   -- *** Ongebruikte functieomschrijvingen verwijderen ********************************************
   -- Functies die niemand meer heeft, compleet verwijderen
   DELETE FROM prs_srtperslid sp
         WHERE NOT EXISTS
                 (SELECT 1
                    FROM prs_perslid p
                   WHERE p.prs_srtperslid_key = sp.prs_srtperslid_key);
   -- UWVA#23714: Functies die alleen verwijderde mensen nog hebben, logisch verwijderen
   UPDATE prs_srtperslid sp
      SET prs_srtperslid_verwijder = SYSDATE
    WHERE     prs_srtperslid_verwijder IS NULL
          AND NOT EXISTS
                 (SELECT 1
                    FROM prs_v_aanwezigperslid
                   WHERE prs_srtperslid_key = sp.prs_srtperslid_key);

   -- Ook kenmerken 'Alternatieve functie' (key 1192) verwijderen die naar niet-meer-bestaande
   -- functies verwijzen.
   DELETE FROM prs_kenmerklink kl
         WHERE prs_kenmerk_key = 1192
           AND NOT EXISTS
                 (SELECT 1
                    FROM prs_srtperslid
                   WHERE prs_srtperslid_verwijder IS NULL
                     AND prs_srtperslid_key = fac.safe_to_number(kl.prs_kenmerklink_waarde) );

   -- UWVA#20033: Functienamen uit ABS overnemen (hoofdletters matchen)
   FOR rec_func IN c_functie
   LOOP
      BEGIN
         v_errorhint := rec_func.funcdscr;
         v_errormsg := 'Functienamen bijwerken';

         UPDATE prs_srtperslid
            SET prs_srtperslid_omschrijving = rec_func.funcdscr
          WHERE prs_srtperslid_key = rec_func.prs_srtperslid_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, 'W', v_errormsg, v_errorhint);
      END;
   END LOOP;

   -- UWVA#23788: Onbekende pandcodes
   FOR rec_pcon IN c_pandcode_onbekend
   LOOP
      BEGIN
         v_errorhint := rec_pcon.pandcode;
         v_errormsg := 'Onbekende pandcodes uitlijsten';

         -- Kennen we de kostenplaats niet, of het gebouw niet?
         IF (rec_pcon.prs_kostenplaats_nr IS NULL)
         THEN
            fac.imp_writelog (p_import_key, 'W',
                                 'Pandcode ' || rec_pcon.pandcode
                              || ': onbekende kostenplaats.',
                              'Betreft ' || rec_pcon.aantal || ' personen.');
         ELSE
            fac.imp_writelog (p_import_key, 'W',
                                 'Pandcode ' || rec_pcon.pandcode
                              || ': geen gebouw bij kostenplaats.',
                              'Betreft ' || rec_pcon.aantal || ' personen.');
         END IF;
      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, 'W', v_errormsg, v_errorhint);
      END;
   END LOOP;

   -- *** Budgethouders ****************************************************************************
   -- UWVA#20021: Onderstaande was voorheen een aparte budgethouder-import. Sinds het smoelenboek
   -- zijn de importbestanden voor de KPN- en budgethouderimports samengevoegd tot één bestand met
   -- de mandateringsboom, inclusief volledige organisatiestructuur. De KPN-import 'maakt' voortaan
   -- de afdelingen en kostenplaatsen (PRS én PRJ), terwijl de ABS-import eerst de personeelsleden
   -- aanmaakt en rechten geeft en vervolgens de taken van de budgethouder-import uitvoert:
   -- budgethouders instellen, mandaat (profiel) instellen en personen aan de Budgethouder-autori-
   -- satiegroep (key 1061) toevoegen.
   -- (NB: budgethouderimport moet ná KPN en ABS, omdat KPN de kostenplaatsen en ABS de personen
   --      importeert die de budgethouderimport nodig heeft)

   -- UWVA#23269: Eerst dezelfde check als in uwva_update_kpn(), want als die is overgeslagen, dan
   -- ook hier overslaan (ie. geen budgethouders wijzigen)!
   -- How many active records are now present?
   SELECT   COUNT ( * )
     INTO   l_oldcount
     FROM   prs_kostenplaats
    WHERE   prs_kostenplaats_verwijder IS NULL;

   -- How many (in)active records are imported?
   SELECT   COUNT ( * )
     INTO   l_impcount
     FROM   uwva_imp_kpn
    WHERE   status = 'A';

   SELECT   COUNT ( * )
     INTO   l_impcount_prj
     FROM   uwva_imp_kpn_prj
    WHERE   status = 'A';

   IF (ABS ( (l_impcount + l_impcount_prj) - l_oldcount) >
          c_kpn_maxvariation * l_oldcount)
   THEN
      fac.imp_writelog (
         p_import_key,
         'E',
            'Het verschil tussen de actieve kostenplaatsen ('
         || TO_CHAR (l_oldcount)
         || ') en geimporteerde aantallen ('
         || TO_CHAR (l_impcount + l_impcount_prj)
         || ') is te groot',
         'Budgethouders niet bijgewerkt!'
      );
   ELSE
      FOR rec_budgh IN c_budgethouder
      LOOP
         BEGIN
            v_errormsg :=
                  'Fout bij wijzigen kostenplaats "'
               || rec_budgh.prs_kostenplaats_nr
               || '" met budgethouder "'
               || rec_budgh.imp_perslid_nr
               || '" ';

            -- Ken budgethouder toe aan kostenplaats (of verwijder als NULL)
            UPDATE   prs_kostenplaats
               SET   prs_perslid_key = rec_budgh.prs_perslid_key
             WHERE   prs_kostenplaats_key = rec_budgh.prs_kostenplaats_key
                     AND prs_kostenplaats_verwijder IS NULL;

            -- Als de kostenplaats een budgethouder heeft, stel hiervoor dan mandaat
            -- en autorisatiegroep in
            IF (rec_budgh.prs_perslid_key IS NOT NULL)
            THEN
               v_errormsg :=
                     'Fout bij zetten profiel budgethouder "'
                  || rec_budgh.imp_perslid_nr
                  || '" voor KPN "'
                  || rec_budgh.prs_kostenplaats_nr
                  || '" ';

               -- Mandaatcode bepaalt welk profiel een budgethouder heeft
               -- *lege mandaatcode --> E500,-  ('Budgethouder 500', key 81)
               -- *code '23bd'      --> E500,-
               -- *code '23m'       --> E500,-
               -- *overige codes    --> E7000,- ('Budgethouder', key 22)
               --UPDATE   prs_perslid
               --   SET   fac_profiel_key =
               --            DECODE (rec_budgh.imp_mandaatcode,
               --                    NULL, 81,
               --                    '23bd', 81,
               --                    '23m', 81,
               --                    22)
               -- WHERE   prs_perslid_key = rec_budgh.prs_perslid_key;
               --UWVA#36421: Flexibel - via Eigen tabel met key=1342 - toekennen van profiel aan budgethouders, als
               --            geen entry wordt gevonden, dan wordt profiel met key=81 toegekend!
               UPDATE   prs_perslid
                  SET   fac_profiel_key = COALESCE ((SELECT MAX (fac.safe_to_number (ud.fac_usrdata_omschr))
                                                       FROM fac_v_aanwezigusrdata ud
                                                      WHERE ud.fac_usrtab_key = 1342 AND ud.fac_usrdata_code = rec_budgh.imp_mandaatcode),
                                                    81)
                WHERE   prs_perslid_key = rec_budgh.prs_perslid_key;

               -- UWVA#21163: Budgethouders ook mandaat geven op hun kostenplaats
               -- Eerst kijken of er al een mandaat voor die kostenplaats is. Zoniet, dan toevoegen.
               -- NB: bij een lege kostenplaats_key heeft de persoon al mandaat op alle kostenplaatsen!
               v_errormsg :=
                     'Fout bij tellen mandaten van "'
                  || rec_budgh.imp_perslid_nr
                  || '" voor KPN "'
                  || rec_budgh.prs_kostenplaats_nr
                  || '" ';

               SELECT COUNT ( * )
                 INTO v_count
                 FROM prs_perslidkostenplaats
                WHERE prs_perslid_key = rec_budgh.prs_perslid_key
                      AND (prs_kostenplaats_key = rec_budgh.prs_kostenplaats_key
                           OR prs_kostenplaats_key IS NULL);

               -- Nog geen mandaat --> toevoegen
               IF (v_count = 0)
               THEN
                  v_errormsg :=
                        'Fout bij toekennen mandaat voor KPN "'
                     || rec_budgh.prs_kostenplaats_nr
                     || '" aan budgethouder "'
                     || rec_budgh.imp_perslid_nr
                     || '"';

                  INSERT INTO prs_perslidkostenplaats (
                                                          prs_perslid_key,
                                                          prs_kostenplaats_key,
                                                          prs_perslidkostenplaats_boeken,
                                                          prs_perslidkostenplaats_inzage
                             )
                    VALUES   (rec_budgh.prs_perslid_key,
                              rec_budgh.prs_kostenplaats_key,
                              1,
                              1);

                  fac.imp_writelog (
                     p_import_key,
                     'I',
                        'Mandaat voor budgethouder "'
                     || rec_budgh.imp_perslid_nr
                     || '" op KPN "'
                     || rec_budgh.prs_kostenplaats_nr
                     || '"',
                     ''
                  );
               END IF;

               -- UWVA#17365: Zorg dat alle budgethouders en alleen budgethouders in
               -- de groep van budgethouders zit (1/2)
               v_errormsg :=
                     'Fout bij toekennen budgethouder "'
                  || rec_budgh.imp_perslid_nr
                  || '" aan autorisatiegroep budgethouders ('
                  || TO_CHAR (c_grp_budgh_key)
                  || ')';

               INSERT INTO fac_gebruikersgroep (fac_groep_key, prs_perslid_key)
                  SELECT   c_grp_budgh_key, rec_budgh.prs_perslid_key
                    FROM   DUAL
                   WHERE   NOT EXISTS
                              (SELECT   'x'
                                 FROM   fac_gebruikersgroep
                                WHERE   prs_perslid_key =
                                           rec_budgh.prs_perslid_key
                                        AND fac_groep_key = c_grp_budgh_key);
            ELSE
               -- Wel een budgethouder gegeven in importbestand (perslid_nr), maar
               -- persoon niet gevonden in Facilitor (geen perslid_key).
               IF (rec_budgh.imp_perslid_nr IS NOT NULL)
               THEN
                  fac.imp_writelog (
                     p_import_key,
                     'W',
                        'Onbekende budgethouder "'
                     || rec_budgh.imp_perslid_nr
                     || '" bij kostenplaats '
                     || rec_budgh.prs_kostenplaats_nr,
                     ''
                  );
               END IF;
            END IF;

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

      FOR rec_kpnon IN c_kpn_onbekend
      LOOP
         BEGIN
            v_errormsg :=
                  'Fout bij wijzigen kostenplaats "'
               || rec_kpnon.prs_kostenplaats_nr
               || '" met budgethouder "'
               || rec_kpnon.prs_perslid_nr
               || '": kostenplaats komt niet voor';
            fac.imp_writelog (p_import_key,
                              'W',
                              v_errormsg,
                              '');
            v_errormsg := '';
         END;
      END LOOP;

      -- Nieuw pas-object aanmaken en toekennen aan nieuwe medewerker (werkzaam op een Andover-CMS enabled pand).
      FOR rec IN abs_pas_mdw
      LOOP
         BEGIN
            v_errormsg := 'Aanmaken pas nieuwe medewerker NIET gelukt';

            SELECT fac_s_user01.NEXTVAL INTO v_count FROM DUAL;

            INSERT INTO ins_deel (ins_deel_module,
                                  ins_srtdeel_key,
                                  ins_alg_ruimte_key,
                                  ins_alg_ruimte_type,
                                  ins_deel_omschrijving,
                                  ins_deel_actief)
                VALUES ('INS',
                        259000,                                 -- Toegangspas
                        rec.prs_perslid_key,
                        'P',
                        'XXXX' || TO_CHAR (v_count),
                        1)                                           -- Actief
             RETURNING ins_deel_key, ins_deel_omschrijving
                  INTO v_deelkey, v_deeloms;

            INSERT INTO ins_kenmerkdeel (ins_kenmerk_key,
                                         ins_kenmerkdeel_waarde,
                                         ins_deel_key)
                VALUES (489,                                         -- Status
                        29873,                                       -- Actief
                        v_deelkey);

            INSERT INTO ins_kenmerkdeel (ins_kenmerk_key,
                                         ins_kenmerkdeel_waarde,
                                         ins_deel_key)
                VALUES (490,                                       -- Template
                        29072,                                   -- Medewerker
                        v_deelkey);

            INSERT INTO ins_kenmerkdeel (ins_kenmerk_key,
                                         ins_kenmerkdeel_waarde,
                                         ins_deel_key)
                VALUES (501,                                       -- Sitecode
                        29879,                                          -- 171
                        v_deelkey);

            INSERT INTO ins_kenmerkdeel (ins_kenmerk_key,
                                         ins_kenmerkdeel_waarde,
                                         ins_deel_key)
                VALUES (502,                                       -- Uitgifte
                        29739,                                   -- Aangemaakt
                        v_deelkey);

            fac.trackaction ('INSNEW', v_deelkey, NULL, NULL, NULL);

            fac.imp_writelog (p_import_key, 'I',
                              'Toegangspas ' || v_deeloms || ' aangemaakt voor medewerker met key ' || TO_CHAR (rec.prs_perslid_key), 'Pas nieuwe medewerker');
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
               v_errormsg := v_errormsg || ' (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
               fac.imp_writelog (p_import_key, 'W', v_errormsg, 'abs_pas_mdw');
         END;
      END LOOP;

      COMMIT;

      -- Nieuw pas-object aanmaken en toekennen aan bestaande medewerker die is verhuisd naar een Andover-CMS enabled pand.
      FOR rec IN abs_pas_mdw_bestaand
      LOOP
         BEGIN
            v_errormsg := 'Aanmaken pas bestaande medewerker NIET gelukt';

            SELECT fac_s_user01.NEXTVAL INTO v_count FROM DUAL;

            INSERT INTO ins_deel (ins_deel_module,
                                  ins_srtdeel_key,
                                  ins_alg_ruimte_key,
                                  ins_alg_ruimte_type,
                                  ins_deel_omschrijving,
                                  ins_deel_actief)
                VALUES ('INS',
                        259000,                                 -- Toegangspas
                        rec.prs_perslid_key,
                        'P',
                        'XXXX' || TO_CHAR (v_count),
                        1)                                           -- Actief
             RETURNING ins_deel_key, ins_deel_omschrijving
                  INTO v_deelkey, v_deeloms;

            INSERT INTO ins_kenmerkdeel (ins_kenmerk_key,
                                         ins_kenmerkdeel_waarde,
                                         ins_deel_key)
                VALUES (489,                                         -- Status
                        29873,                                       -- Actief
                        v_deelkey);

            INSERT INTO ins_kenmerkdeel (ins_kenmerk_key,
                                         ins_kenmerkdeel_waarde,
                                         ins_deel_key)
                VALUES (490,                                       -- Template
                        29072,                                   -- Medewerker
                        v_deelkey);

            INSERT INTO ins_kenmerkdeel (ins_kenmerk_key,
                                         ins_kenmerkdeel_waarde,
                                         ins_deel_key)
                VALUES (501,                                       -- Sitecode
                        29879,                                          -- 171
                        v_deelkey);

            INSERT INTO ins_kenmerkdeel (ins_kenmerk_key,
                                         ins_kenmerkdeel_waarde,
                                         ins_deel_key)
                VALUES (502,                                       -- Uitgifte
                        29739,                                   -- Aangemaakt
                        v_deelkey);

            fac.trackaction ('INSNEW', v_deelkey, NULL, NULL, NULL);

            fac.imp_writelog (p_import_key, 'I',
                              'Toegangspas ' || v_deeloms || ' aangemaakt voor medewerker met key ' || TO_CHAR (rec.prs_perslid_key), 'Pas verhuisde medewerker');
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
               v_errormsg := v_errormsg || ' (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
               fac.imp_writelog (p_import_key, 'W', v_errormsg, 'abs_pas_mdw_bestaand');
         END;
      END LOOP;

      COMMIT;

      -- Deactiveren/blokkeren extra actieve pas(sen) van medewerkers; alleen de nieuwste/hoogste ins_deel_key blijft behouden/actief.
      -- NB. Medewerkers die verhuizen naar een pand zonder Andover behouden gewoon hun pas.
      -- NB. Passen met status Vermist of Defect worden niet door ABS-import geblokkeerd.
      FOR rec IN abs_pas_disable
      LOOP
         BEGIN
            v_errormsg := 'Deactiveren pas NIET gelukt';

            -- Ophalen passtatus voordat deze op Geblokkeeerd wordt gezet (v_deelstat) tbv. logging.
            SELECT f.fac_usrdata_omschr
              INTO v_deelstat
              FROM fac_usrdata f, ins_kenmerkdeel ik
             WHERE f.fac_usrdata_key = ik.ins_kenmerkdeel_waarde
               AND ik.ins_kenmerk_key = 489
               AND ik.ins_deel_key = rec.ins_deel_key;

            -- Status-kenmerk op Geblokkeerd zetten.
            UPDATE ins_kenmerkdeel
               SET ins_kenmerkdeel_waarde = '29875'             -- Geblokkeerd
             WHERE ins_kenmerk_key = 489 AND ins_deel_key = rec.ins_deel_key;

            fac.trackaction ('INSUPD', rec.ins_deel_key, NULL, NULL, 'Status gewijzigd: ' || v_deelstat || ' --> Geblokkeerd');

               UPDATE ins_deel
                  SET ins_deel_verwijder = SYSDATE,
                      ins_deel_vervaldatum = SYSDATE
                WHERE ins_deel_key = rec.ins_deel_key
            RETURNING ins_deel_omschrijving
                 INTO v_deeloms;

            fac.trackaction ('INSDEL', rec.ins_deel_key, NULL, NULL, NULL);

            fac.imp_writelog (p_import_key, 'I',
                              'Toegangspas ' || v_deeloms || ' verwijderd voor medewerker met key ' || TO_CHAR (rec.prs_perslid_key), rec.aanduiding);
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
               v_errormsg := v_errormsg || ' (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
               fac.imp_writelog (p_import_key, 'W', v_errormsg, 'abs_pas_disable/' || rec.aanduiding);
         END;
      END LOOP;

      COMMIT;

      SELECT   COUNT ( * )
        INTO   nrbh1
        FROM   fac_gebruikersgroep
       WHERE   fac_groep_key = c_grp_budgh_key;

      -- UWVA#17365: Zorg dat alle budgethouders en alleen budgethouders in
      -- de groep van budgethouders zit (2/2)
      DELETE FROM   fac_gebruikersgroep
            WHERE   fac_groep_key = c_grp_budgh_key
                    AND prs_perslid_key NOT IN
                             (SELECT   p.prs_perslid_key
                                FROM   uwva_imp_kpn imp,
                                       prs_v_aanwezigperslid p
                               WHERE   p.prs_perslid_nr = imp.perslid_nr);

      SELECT   COUNT ( * )
        INTO   nrbh2
        FROM   fac_gebruikersgroep
       WHERE   fac_groep_key = c_grp_budgh_key;

      fac.imp_writelog (
         p_import_key,
         'S',
           nrbh1 - nrbh2
         || ' budgethouder(s) uit autorisatiegroep '
         || TO_CHAR (c_grp_budgh_key)
         || ' verwijderd.',
         ''
      );
   -- Einde voormalige budgethoudersimport
   END IF;

   COMMIT;

   -- Mooie plek om de telefoonnummers, faxnummers en mobiele nummers te formatteren.
   uwva.format_telefoonnummers (p_import_key);

   SELECT TO_CHAR ( SYSDATE, 'YYYYMMDDHH24MISS' )
     INTO v_time
     FROM DUAL;
   fac.imp_writelog (p_import_key, 'S', 'Import voltooid', v_time);

   COMMIT;

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 uwva_update_abs;
/

-- Persoonsgegevens met werknemertype, login en rollen (UWVA#18115)
CREATE OR REPLACE VIEW uwva_v_rap_prs_abs
(
   fclt_f_type,
   fclt_f_account,
   persnr,
   fclt_f_naam,
   last_login,
   aantal_rollen
)
AS
   (SELECT COALESCE(emptype.fac_usrdata_omschr, '<geen type>'),
           pers.prs_perslid_oslogin,
           pers.prs_perslid_nr,
           pers.prs_perslid_naam_full,
           pers.prs_perslid_login,
           TO_CHAR (0)
      FROM ( (SELECT p.*, pf.prs_perslid_naam_full
                FROM prs_v_perslid_fullnames_all pf, prs_perslid p
               WHERE p.prs_perslid_key = pf.prs_perslid_key
                     AND p.prs_perslid_verwijder IS NULL) pers
             LEFT OUTER JOIN
             (SELECT p.prs_perslid_key, ud.fac_usrdata_omschr
                FROM prs_perslid p,
                     prs_kenmerklink km,
                    fac_usrdata ud
              WHERE p.prs_perslid_key = km.prs_link_key
                    AND km.prs_kenmerk_key = 1040
                    AND ud.fac_usrdata_key =
                          km.prs_kenmerklink_waarde
                    AND km.prs_kenmerklink_verwijder IS NULL
                    AND ud.fac_usrdata_verwijder IS NULL) emptype
             ON pers.prs_perslid_key = emptype.prs_perslid_key) );

-- Inhoud eigen tabel pandcodes (UWVA#18115)
CREATE OR REPLACE VIEW uwva_v_rap_abs_pandcodes
(
   key,
   fclt_f_locatie,
   fclt_f_pandcode
)
AS
   (SELECT TO_CHAR (fac_usrdata_key), fac_usrdata_omschr, fac_usrdata_code
      FROM fac_usrdata
     WHERE fac_usrtab_key = 1
       AND fac_usrdata_verwijder IS NULL);

COMMIT;

-- *** Oude PVIEW-rapportages, maar nu in een ABS-jasje ***

-- Toon verplichtingen van de personen die vervallen zijn volgens abs.
CREATE OR REPLACE VIEW uwva_v_imp_abs_01_verpl
(
   fclt_f_servicepunt,
   fclt_f_locatie,
   personeelsnr,
   prs_perslid_naam,
   omschrijving,
   verplichting,
   fclt_3d_locatie_key
)
AS
   SELECT di.alg_district_omschrijving fclt_f_servicepunt,
          l.alg_locatie_code fclt_f_locatie,
          p.prs_perslid_nr,
          p.prs_perslid_naam,
          COALESCE (t.fac_message_text, vp.fac_message_code) omschrijving,
          vp.item verplichting,
          vp.locatie_key
     FROM prs_v_aanwezigperslid p,
          prs_v_verplichting vp,
          alg_locatie l,
          alg_district di,
          fac_message t
    WHERE     p.prs_perslid_naam LIKE 'INACTIEF:%'
          AND p.prs_perslid_key = vp.prs_perslid_key
          AND vp.locatie_key = l.alg_locatie_key
          AND l.alg_district_key = di.alg_district_key
          AND vp.fac_message_code = t.fac_message_code(+);


-- Personen die bij de laatste import zijn verwijderd (o.b.v. prs_perslid_verwijder).
CREATE OR REPLACE VIEW uwva_v_imp_abs_02_verwijderd
(
   fclt_f_personeelsnummer,
   fclt_f_naam,
   fclt_3d_locatie_key,
   fclt_f_locatie,
   fclt_f_afdeling,
   verwijderd,
   key
)
AS
   SELECT p.prs_perslid_nr,
          pf.prs_perslid_naam_full,
          l.alg_locatie_key,
          l.alg_locatie_code,
          d.prs_afdeling_naam,
          TO_CHAR (p.prs_perslid_verwijder, 'YYYY-MM-DD') verwijderd,
          TO_CHAR (p.prs_perslid_key)
     FROM prs_perslid p,
          prs_v_perslid_fullnames_all pf,
          prs_afdeling d,
          prs_v_werkplek_gegevens w,
          prs_perslidwerkplek pw,
          alg_locatie l
    WHERE p.prs_perslid_nr IS NOT NULL
      AND p.prs_perslid_key = pf.prs_perslid_key
      AND w.prs_werkplek_key(+) = pw.prs_werkplek_key
      AND p.prs_perslid_key = pw.prs_perslid_key(+)
      AND w.alg_locatie_key = l.alg_locatie_key(+)
      AND d.prs_afdeling_key(+) = p.prs_afdeling_key
      AND SYSDATE - p.prs_perslid_verwijder < 31;

-- Personen die bij de laatste import zijn toegevoegd (o.b.v. prs_perslid_aanmaak).
CREATE OR REPLACE VIEW uwva_v_imp_abs_03_toegevoegd
(
   fclt_f_personeelsnummer,
   fclt_f_naam,
   fclt_f_afdeling,
   aanmaak,
   key
)
AS
   SELECT p.prs_perslid_nr,
          pf.prs_perslid_naam_full,
          d.prs_afdeling_naam,
          TO_CHAR (p.prs_perslid_aanmaak, 'YYYY-MM-DD') aanmaak,
          TO_CHAR(p.prs_perslid_key)
     FROM prs_v_aanwezigperslid p,
          prs_v_perslid_fullnames_all pf,
          prs_afdeling d
    WHERE p.prs_perslid_nr IS NOT NULL
      AND d.prs_afdeling_key = p.prs_afdeling_key
      AND SYSDATE - p.prs_perslid_aanmaak < 31;

-- Onbekende pandcodes in de importfile, met aantal personen
CREATE OR REPLACE VIEW uwva_v_abs_05_pponbekendloc
(
   locatiecode,
   aantal_personen
)
AS
   SELECT ab.pandcode, COUNT (*)
     FROM uwva_imp_abs ab
    WHERE ab.pandcode IS NOT NULL
      AND NOT EXISTS (SELECT 'x'
                        FROM fac_usrdata fu
                       WHERE ab.pandcode = fu.fac_usrdata_code)
   GROUP BY ab.pandcode;

---- Personen die geimporteerd worden maar die ondertussen handmatig zijn verwijderd UWVA#679 (OBSOLETE?)
--CREATE OR REPLACE VIEW uwva_v_imp_abs_06_verwijderd
--(
--   fclt_f_personeelsnr,
--   naam,
--   voorletters,
--   fclt_3d_locatie_key,
--   fclt_f_locatie,
--   verwijderdatum,
--   importdatum,
--   KEY
--)
--AS
--     SELECT p.prs_perslid_nr, p.prs_perslid_naam, p.prs_perslid_voorletters,
--            l.alg_locatie_key, l.alg_locatie_code,
--            p.prs_perslid_verwijder verwijderdatum,
--            ab.uwva_imp_abs_aanmaak importdatum,
--            p.prs_perslid_key
--       FROM prs_perslid p,
--            uwva_imp_abs ab,
--            prs_v_werkplek_gegevens w,
--            prs_perslidwerkplek pw,
--            alg_locatie l
--      WHERE p.prs_perslid_nr = ab.empnum
--        AND p.prs_perslid_verwijder IS NOT NULL
--        AND w.prs_werkplek_key(+) = pw.prs_werkplek_key
--        AND p.prs_perslid_key = pw.prs_perslid_key(+)
--        AND w.alg_locatie_key = l.alg_locatie_key(+)
--   ORDER BY p.prs_perslid_verwijder DESC;

-- Verwijderde personen per SP en per pand (UWVA#12158)
CREATE OR REPLACE VIEW uwva_v_imp_abs_07_verwijderd
AS
   SELECT d.alg_district_omschrijving fclt_f_servicepunt,
          g.alg_gebouw_omschrijving gebouw,
          l.imp_log_omschrijving fclt_f_medewerker,
          TO_CHAR (MIN(l.imp_log_datum), 'YYYY-MM-DD') datum,
          l.imp_log_hint fclt_3d_gebouw_key
     FROM IMP_LOG l, ALG_GEBOUW g, ALG_LOCATIE ll, ALG_DISTRICT d
    WHERE l.imp_log_applicatie = 'ABS0'
      AND l.imp_log_hint = g.alg_gebouw_key
      AND g.alg_locatie_key = ll.alg_locatie_key
      AND ll.alg_district_key = d.alg_district_key
GROUP BY  d.alg_district_omschrijving, g.alg_gebouw_omschrijving, l.imp_log_omschrijving, l.imp_log_hint;


CREATE OR REPLACE VIEW uwva_v_export_vinderdump (result, result_order)
AS
     SELECT '"volledige naam";' ||
            '"achternaam";' ||
            '"tussenvoegsel";' ||
            '"voorletters";' ||
            '"voornaam";' ||
            '"divisie";' ||
            '"afdeling";' ||
            '"functie";' ||
            '"alt_divisie";' ||
            '"alt_afdeling";' ||
            '"alt_functie";' ||
            '"persoonsnr";' ||
            '"account";' ||
            '"werknemertype";' ||
            '"regio";' ||
            '"locatie";' ||
            '"gebouw";' ||
            '"verdieping";' ||
            '"ruimte";' ||
            '"e-mail";' ||
            '"telefoon";' ||
            '"mobiel";' ||
            '"faxnummer";' ||
            '"maandag";' ||
            '"dinsdag";' ||
            '"woensdag";' ||
            '"donderdag";' ||
            '"vrijdag";' ||
            '"geslacht";' ||
            '"toon in gids"' result,
            0 result_order
       FROM DUAL
     UNION ALL
     SELECT '"' || prs_perslid_naam_full || '";"' ||
            prs_perslid_naam || '";"' ||
            prs_perslid_tussenvoegsel || '";"' ||
            prs_perslid_voorletters || '";"' ||
            prs_perslid_voornaam || '";"' ||
            divisie || '";"' ||
            afdeling || '";"' ||
            prs_srtperslid_omschrijving || '";"' ||
            alt_divisie || '";"' ||
            alt_afdeling || '";"' ||
            alt_functie || '";"' ||
            prs_perslid_nr || '";"' ||
            prs_perslid_oslogin || '";"' ||
            emptype || '";"' ||
            regio || '";"' ||
            alg_locatie_code || '";"' ||
            alg_gebouw_code || '";"' ||
            alg_verdieping_code || '";"' ||
            alg_ruimte_nr || '";"' ||
            prs_perslid_email || '";"' ||
            prs_perslid_telefoonnr || '";"' ||
            prs_perslid_mobiel || '";"' ||
            faxnr || '";"' ||
            maandag || '";"' ||
            dinsdag || '";"' ||
            woensdag || '";"' ||
            donderdag || '";"' ||
            vrijdag || '";"' ||
            DECODE (prs_perslid_geslacht, 0, 'V', 1, 'M', 'O') || '";"' ||
            DECODE (prs_perslid_ingids, 0, 'Nee', 1, 'Ja', 'O') || '"' result,
            1 result_order
       FROM (SELECT apl.*,
                    wpg.*,
                    pfn.prs_perslid_naam_full,
                    afd.prs_afdeling_naam6 afdeling,
                    div.prs_afdeling_naam6 divisie,
                    aspl.prs_srtperslid_omschrijving
               FROM prs_v_aanwezigperslid apl,
                    prs_v_perslid_fullnames pfn,
                    prs_v_aanwezigafdeling afd,
                    prs_v_afdeling_boom ab,
                    prs_v_aanwezigafdeling div,
                    prs_v_aanwezigsrtperslid aspl,
                    prs_v_hoofdperslidwerkplek hpwp,
                    prs_v_werkplek_gegevens wpg
              WHERE     pfn.prs_perslid_key = apl.prs_perslid_key
                    AND apl.prs_afdeling_key = afd.prs_afdeling_key
                    AND afd.prs_afdeling_key = ab.prs_afdeling_key
                    AND ab.prs_afdeling_key1 = div.prs_afdeling_key
                    AND apl.prs_srtperslid_key = aspl.prs_srtperslid_key
                    AND apl.prs_perslid_key = hpwp.prs_perslid_key(+)
                    AND hpwp.prs_werkplek_key = wpg.prs_werkplek_key(+)
              ORDER BY prs_perslid_ingids, prs_perslid_naam_full, prs_perslid_nr) pl
                             --1040 = Type Medewerker (R)
                             -- 301 = Type_medewerker (fac_usrtab)
            LEFT OUTER JOIN (SELECT prs_link_key, fac_usrdata_omschr emptype
                               FROM fac_usrdata, prs_kenmerklink
                              WHERE fac_usrtab_key = 301
                                    AND prs_kenmerk_key = 1040
                                    AND prs_kenmerklink_waarde = fac_usrdata_key
                                    AND fac_usrdata_verwijder IS NULL
                                    AND prs_kenmerklink_verwijder IS NULL) f1
               ON pl.prs_perslid_key = f1.prs_link_key
                             --1193 = Regio (R)
                             -- 783 = RegioVinder (fac_usrtab)
            LEFT OUTER JOIN (SELECT prs_link_key, fac_usrdata_omschr regio
                               FROM fac_usrdata, prs_kenmerklink
                              WHERE fac_usrtab_key = 783
                                    AND prs_kenmerk_key = 1193
                                    AND prs_kenmerklink_waarde = fac_usrdata_key
                                    AND fac_usrdata_verwijder IS NULL
                                    AND prs_kenmerklink_verwijder IS NULL) f2
               ON pl.prs_perslid_key = f2.prs_link_key
                             --1173 = Alternatieve afdeling (S)
            LEFT OUTER JOIN (SELECT prs_link_key,
                                    afd.prs_afdeling_naam6 alt_afdeling,
                                    div.prs_afdeling_naam6 alt_divisie
                               FROM prs_kenmerklink,
                                    prs_v_aanwezigafdeling afd,
                                    prs_v_afdeling_boom ab,
                                    prs_v_aanwezigafdeling div
                              WHERE prs_kenmerk_key = 1173
                                    AND afd.prs_afdeling_key = fac.safe_to_number(prs_kenmerklink_waarde)
                                    AND ab.prs_afdeling_key = afd.prs_afdeling_key
                                    AND div.prs_afdeling_key = ab.prs_afdeling_key1
                                    AND prs_kenmerklink_verwijder IS NULL) f3
               ON pl.prs_perslid_key = f3.prs_link_key
                             --1192 = Alternatieve functie (S)
            LEFT OUTER JOIN (SELECT prs_link_key,
                                    prs_srtperslid_omschrijving alt_functie
                               FROM prs_kenmerklink, prs_v_aanwezigsrtperslid
                              WHERE prs_kenmerk_key = 1192
                                    AND prs_srtperslid_key = prs_kenmerklink_waarde
                                    AND prs_kenmerklink_verwijder IS NULL) f4
               ON pl.prs_perslid_key = f4.prs_link_key
                             --   7 = Faxnr (C)
            LEFT OUTER JOIN (SELECT prs_link_key, prs_kenmerklink_waarde faxnr
                               FROM prs_kenmerklink
                              WHERE prs_kenmerk_key = 7
                                    AND prs_kenmerklink_verwijder IS NULL) f7
               ON pl.prs_perslid_key = f7.prs_link_key
                             --1163 = Maandag (R)
                             -- 761 = AanwezigOp (fac_usrtab)
            LEFT OUTER JOIN (SELECT prs_link_key, fac_usrdata_omschr maandag
                               FROM fac_usrdata, prs_kenmerklink
                              WHERE fac_usrtab_key = 761
                                    AND prs_kenmerk_key = 1163
                                    AND prs_kenmerklink_waarde = fac_usrdata_key
                                    AND fac_usrdata_verwijder IS NULL
                                    AND prs_kenmerklink_verwijder IS NULL) f8
               ON pl.prs_perslid_key = f8.prs_link_key
                             --1164 = Dinsdag (R)
                             -- 761 = AanwezigOp (fac_usrtab)
            LEFT OUTER JOIN (SELECT prs_link_key, fac_usrdata_omschr dinsdag
                               FROM fac_usrdata, prs_kenmerklink
                              WHERE fac_usrtab_key = 761
                                    AND prs_kenmerk_key = 1164
                                    AND prs_kenmerklink_waarde = fac_usrdata_key
                                    AND fac_usrdata_verwijder IS NULL
                                    AND prs_kenmerklink_verwijder IS NULL) f9
               ON pl.prs_perslid_key = f9.prs_link_key
                             --1165 = Woensdag (R)
                             -- 761 = AanwezigOp (fac_usrtab)
            LEFT OUTER JOIN (SELECT prs_link_key, fac_usrdata_omschr woensdag
                               FROM fac_usrdata, prs_kenmerklink
                              WHERE fac_usrtab_key = 761
                                    AND prs_kenmerk_key = 1165
                                    AND prs_kenmerklink_waarde = fac_usrdata_key
                                    AND fac_usrdata_verwijder IS NULL
                                    AND prs_kenmerklink_verwijder IS NULL) f10
               ON pl.prs_perslid_key = f10.prs_link_key
                             --1166 = Donderdag (R)
                             -- 761 = AanwezigOp (fac_usrtab)
            LEFT OUTER JOIN (SELECT prs_link_key, fac_usrdata_omschr donderdag
                               FROM fac_usrdata, prs_kenmerklink
                              WHERE fac_usrtab_key = 761
                                    AND prs_kenmerk_key = 1166
                                    AND prs_kenmerklink_waarde = fac_usrdata_key
                                    AND fac_usrdata_verwijder IS NULL
                                    AND prs_kenmerklink_verwijder IS NULL) f11
               ON pl.prs_perslid_key = f11.prs_link_key
                             --1167 = Vrijdag (R)
                             -- 761 = AanwezigOp (fac_usrtab)
            LEFT OUTER JOIN (SELECT prs_link_key, fac_usrdata_omschr vrijdag
                               FROM fac_usrdata, prs_kenmerklink
                              WHERE fac_usrtab_key = 761
                                    AND prs_kenmerk_key = 1167
                                    AND prs_kenmerklink_waarde = fac_usrdata_key
                                    AND fac_usrdata_verwijder IS NULL
                                    AND prs_kenmerklink_verwijder IS NULL) f12
               ON pl.prs_perslid_key = f12.prs_link_key;


-- View voor phonebook, met contactgegevens per afdeling
CREATE OR REPLACE VIEW uwva_v_rap_afd_contact
(
   fclt_f_afdeling,
   fclt_f_telefoonnummer,
   fclt_f_emailadres,
   fclt_3d_afdeling_key
)
AS
   SELECT afdeling,
          telefoonnummer,
          mail,
          prs_afdeling_key
     FROM (SELECT afd.prs_afdeling_naam6 afdeling,
                  kml_tel.prs_kenmerklink_waarde telefoonnummer,
                  kml_mail.prs_kenmerklink_waarde mail,
                  afd.prs_afdeling_key
             FROM prs_v_aanwezigafdeling afd,
                  prs_kenmerklink kml_tel,
                  prs_kenmerklink kml_mail
            WHERE     kml_tel.prs_link_key(+)  = afd.prs_afdeling_key
                  AND kml_mail.prs_link_key(+) = afd.prs_afdeling_key
                  AND kml_tel.prs_kenmerk_key(+)  = 1212   --PROD
                  AND kml_mail.prs_kenmerk_key(+) = 1213)  --PROD
    WHERE telefoonnummer IS NOT NULL OR mail IS NOT NULL;


-- UWVA#19010: Importfuncties voor provisioning met ABS
-- (mapping van ABS-rollen op Facilitor authorisatiegroepen en profielen)
CREATE OR REPLACE PROCEDURE uwva_import_rolprofiel (p_import_key IN NUMBER)
AS
   CURSOR c1
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;

   v_newline          VARCHAR2 (1000);           -- Import line
   v_field            VARCHAR2 (100);            -- Import field
   v_fielddelimitor   VARCHAR2 (1)     := ';';   -- Field seperator
   v_count_import     NUMBER   (10);
   v_count            NUMBER;
   v_errormsg         VARCHAR2 (200);
   v_errorhint        VARCHAR2 (200);
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   v_buffercount      NUMBER           := 0;
   c_commitbuffer     NUMBER           := 5;  -- om de zoveel committen
   -- De importvelden
   v_rol              VARCHAR2 (100);
   v_profiel          VARCHAR2 (100);
   header_found       BOOLEAN          := FALSE;
BEGIN
   -- Clear my previous imported rows
   DELETE FROM uwva_imp_provisioning;

   v_count_import := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;

         fac.imp_getfield (v_newline, v_fielddelimitor, v_rol);       -- rol
         fac.imp_getfield (v_newline, v_fielddelimitor, v_profiel);   -- profiel

         -- Skip until the header is found
         IF (header_found = FALSE)
         THEN
            IF     UPPER (v_rol)         = 'ROL'
               AND UPPER (v_profiel)     = 'PROFIELNAAM'
            THEN
               header_found := TRUE;
            END IF;
         ELSE
            INSERT INTO uwva_imp_provisioning (rol,
                                               naam)
                VALUES (SUBSTR ( TRIM (v_rol),     1, 50),
                        SUBSTR ( TRIM (v_profiel), 1, 30));

            v_count_import := v_count_import + 1;
         END IF;

         -- Elke c_commitbuffer regels committen
         v_buffercount := v_buffercount + 1;
         IF (v_buffercount >= c_commitbuffer)
         THEN
            COMMIT;
            v_buffercount := 0;
         END IF;
      END;
   END LOOP;

   IF (header_found = FALSE)
   THEN
      fac.imp_writelog (p_import_key,
                        'W',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!'
                       );
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                           'Aantal ingelezen regels: '
                        || TO_CHAR (v_count_import),
                        ''
                       );
   END IF;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=     'OTHERS (error '
                     || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'W',
                        v_errormsg,
                        '');
END;
/


CREATE OR REPLACE PROCEDURE uwva_import_rolgroep (p_import_key IN NUMBER)
AS
   CURSOR c1
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;

   v_newline          VARCHAR2 (1000);           -- Import line
   v_field            VARCHAR2 (100);            -- Import field
   v_fielddelimitor   VARCHAR2 (1)     := ';';   -- Field seperator
   v_count_import     NUMBER   (10);
   v_count            NUMBER;
   v_errormsg         VARCHAR2 (200);
   v_errorhint        VARCHAR2 (200);
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   v_buffercount      NUMBER           := 0;
   c_commitbuffer     NUMBER           := 5;  -- om de zoveel committen
   -- De importvelden
   v_rol              VARCHAR2 (100);
   v_groep            VARCHAR2 (100);
   header_found       BOOLEAN          := FALSE;
BEGIN
   -- Clear my previous imported rows
   DELETE FROM uwva_imp_provisioning;

   v_count_import := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;

         fac.imp_getfield (v_newline, v_fielddelimitor, v_rol);     -- rol
         fac.imp_getfield (v_newline, v_fielddelimitor, v_groep);   -- groep

         -- Skip until the header is found
         IF (header_found = FALSE)
         THEN
            IF     UPPER (v_rol)         = 'ROL'
               AND UPPER (v_groep)       = 'AUTHORISATIEGROEPNAAM'
            THEN
               header_found := TRUE;
            END IF;
         ELSE
            INSERT INTO uwva_imp_provisioning (rol,
                                               naam)
                VALUES (SUBSTR ( TRIM (v_rol),   1, 50),
                        SUBSTR ( TRIM (v_groep), 1, 30));

            v_count_import := v_count_import + 1;
         END IF;

         -- Elke c_commitbuffer regels committen
         v_buffercount := v_buffercount + 1;
         IF (v_buffercount >= c_commitbuffer)
         THEN
            COMMIT;
            v_buffercount := 0;
         END IF;
      END;
   END LOOP;

   IF (header_found = FALSE)
   THEN
      fac.imp_writelog (p_import_key,
                        'W',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!'
                       );
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                           'Aantal ingelezen regels: '
                        || TO_CHAR (v_count_import),
                        ''
                       );
   END IF;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=     'OTHERS (error '
                     || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'W',
                        v_errormsg,
                        '');
END;
/


CREATE OR REPLACE PROCEDURE uwva_update_rolprofiel (p_import_key IN NUMBER)
AS
   -- Constanten
   c_num_rows                    NUMBER             := 10;
   c_maxvariation                NUMBER             := 20;
   c_commitbuffer                NUMBER             := 5;
   -- om de zoveel committen
   v_buffercount                 NUMBER             := 0;

   CURSOR c_rol
   IS
      SELECT rol,
             naam
        FROM uwva_imp_provisioning
       WHERE naam IS NOT NULL;

   v_rol_omschr                  VARCHAR2 (100);
   recl                          c_rol%ROWTYPE;
   oracle_err_num                NUMBER;
   oracle_err_mes                VARCHAR2 (200);
   v_errormsg                    VARCHAR2 (1024);
   v_errorhint                   VARCHAR2 (1024);
   v_count                       NUMBER (10);
   v_update                      BOOLEAN;
   v_aktie                       VARCHAR (10);
   currentversion                fac_module.fac_module_version%TYPE;

   v_rol_naam                    VARCHAR2 (100);
   v_profiel_key                 NUMBER (10);

BEGIN
   -- Init
   SELECT MAX (fac_module_version)
     INTO currentversion
     FROM fac_module;

   -- Zinnige data in importbestand?
   SELECT COUNT(*)
     INTO v_count
     FROM uwva_imp_provisioning
    WHERE naam IS NOT NULL;

   IF (v_count = 0)
   THEN
      fac.imp_writelog (p_import_key,
                  'W',
                  'Importtabel is leeg!',
                  currentversion || ', $Revision$'
                 );
      RETURN;
   END IF;

   -- Huidige mappings rol-->profiel verwijderen (dus alle regels zonder fac_groep_key)
   SELECT COUNT(*)
     INTO v_count
     FROM uwva_provisioning
    WHERE fac_groep_key IS NULL;

   DELETE FROM uwva_provisioning
         WHERE fac_groep_key IS NULL;

   fac.imp_writelog (p_import_key,
                     'S',
                     'Provisioning-tabel (profielen): ' || v_count || ' regels verwijderd',
                     currentversion || ', $Revision$'
                    );

   -- *** Rol-->Profiel ****************************************************************************
   FOR recl IN c_rol
   LOOP
      BEGIN
         v_errormsg := 'Zoek groep';

         v_rol_omschr :=    'Rol/Profiel: '
                         || recl.rol
                         || '/' || recl.naam;

         v_update := TRUE;

         -- Bestaat profiel in fac_profiel?
         SELECT COUNT(*)
           INTO v_count
           FROM fac_profiel
          WHERE UPPER(fac_profiel_omschrijving) = UPPER(recl.naam);

         -- Nee --> error
         IF (v_count = 0)
         THEN
            v_update := FALSE;
            fac.imp_writelog (p_import_key,
                              'W',
                              'Profiel "' || recl.naam || '" bestaat niet!',
                              v_rol_omschr
                             );
         ELSIF (v_count > 1)
         THEN
            v_update := FALSE;
            fac.imp_writelog (p_import_key,
                              'S',
                              'Kan profiel "' || recl.naam || '" niet uniek bepalen!',
                              v_rol_omschr
                             );
         END IF;

         IF (v_update)
         THEN
            v_errormsg := 'Key profiel ophalen';
            -- Haal profiel_key op uit fac_profiel
            SELECT fac_profiel_key
              INTO v_profiel_key
              FROM fac_profiel
             WHERE UPPER(fac_profiel_omschrijving) = UPPER(recl.naam);

            v_errormsg := 'Toevoegen rol-->profiel';
            -- Voeg rol-->profiel toe aan uwva_provisioning
            INSERT INTO uwva_provisioning
                        (uwva_rol_omschr,
                         fac_profiel_key,
                         fac_groep_key)
                 VALUES (recl.rol,
                         v_profiel_key,
                         NULL);
         END IF;

      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, 'W', v_errormsg, v_errorhint);
      END;
   END LOOP;

   SELECT COUNT(*)
     INTO v_count
     FROM uwva_provisioning
    WHERE fac_groep_key IS NULL;

   fac.imp_writelog (p_import_key,
                     'S',
                     'Provisioning-tabel (profielen): ' || v_count || ' regels toegevoegd',
                     currentversion || ', $Revision$'
                    );

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, 'W', v_errormsg, v_errorhint);
END;
/


CREATE OR REPLACE PROCEDURE uwva_update_rolgroep (p_import_key IN NUMBER)
AS
   -- Constanten
   c_num_rows                    NUMBER             := 10;
   c_maxvariation                NUMBER             := 20;
   c_commitbuffer                NUMBER             := 5;
   -- om de zoveel committen
   v_buffercount                 NUMBER             := 0;

   CURSOR c_rol
   IS
      SELECT rol,
             naam
        FROM uwva_imp_provisioning
       WHERE naam IS NOT NULL;

   v_rol_omschr                  VARCHAR2 (100);
   recl                          c_rol%ROWTYPE;
   oracle_err_num                NUMBER;
   oracle_err_mes                VARCHAR2 (200);
   v_errormsg                    VARCHAR2 (1024);
   v_errorhint                   VARCHAR2 (1024);
   v_count                       NUMBER (10);
   v_update                      BOOLEAN;
   v_aktie                       VARCHAR (10);
   currentversion                fac_module.fac_module_version%TYPE;

   v_rol_naam                    VARCHAR2 (100);
   v_groep_key                   NUMBER (10);

BEGIN
   -- Init
   SELECT MAX (fac_module_version)
     INTO currentversion
     FROM fac_module;

   -- Zinnige data in importbestand?
   SELECT COUNT(*)
     INTO v_count
     FROM uwva_imp_provisioning
    WHERE naam IS NOT NULL;

   IF (v_count = 0)
   THEN
      fac.imp_writelog (p_import_key,
                  'W',
                  'Importtabel is leeg!',
                  currentversion || ', $Revision$'
                 );
      RETURN;
   END IF;

   -- Huidige mappings rol-->groep verwijderen (dus alle regels zonder fac_groep_key)
   SELECT COUNT(*)
     INTO v_count
     FROM uwva_provisioning
    WHERE fac_profiel_key IS NULL;

   DELETE FROM uwva_provisioning
         WHERE fac_profiel_key IS NULL;

   fac.imp_writelog (p_import_key,
                     'S',
                     'Provisioning-tabel (groepen): ' || v_count || ' regels verwijderd',
                     currentversion || ', $Revision$'
                    );

   -- *** Rol-->Groep ****************************************************************************
   FOR recl IN c_rol
   LOOP
      BEGIN
         v_errormsg := 'Zoek groep';

         v_rol_omschr :=    'Rol/Groep: '
                         || recl.rol
                         || '/' || recl.naam;

         v_update := TRUE;

         -- Bestaat groep in fac_groep?
         SELECT COUNT(*)
           INTO v_count
           FROM fac_groep
          WHERE UPPER(fac_groep_omschrijving) = UPPER(recl.naam);

         -- Nee --> error
         IF (v_count = 0)
         THEN
            v_update := FALSE;
            fac.imp_writelog (p_import_key,
                              'W',
                              'Groep "' || recl.naam || '" bestaat niet!',
                              v_rol_omschr
                             );
         ELSIF (v_count > 1)
         THEN
            v_update := FALSE;
            fac.imp_writelog (p_import_key,
                              'S',
                              'Kan groep "' || recl.naam || '" niet uniek bepalen!',
                              v_rol_omschr
                             );
         END IF;

         IF (v_update)
         THEN
            v_errormsg := 'Key groep ophalen';
            -- Haal groep_key op uit fac_groep
            SELECT fac_groep_key
              INTO v_groep_key
              FROM fac_groep
             WHERE UPPER(fac_groep_omschrijving) = UPPER(recl.naam);

            v_errormsg := 'Toevoegen rol-->groep';
            -- Voeg rol-->groep toe aan uwva_provisioning
            INSERT INTO uwva_provisioning
                        (uwva_rol_omschr,
                         fac_profiel_key,
                         fac_groep_key)
                 VALUES (recl.rol,
                         NULL,
                         v_groep_key);
         END IF;

      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, 'W', v_errormsg, v_errorhint);
      END;
   END LOOP;

   SELECT COUNT(*)
     INTO v_count
     FROM uwva_provisioning
    WHERE fac_profiel_key IS NULL;

   fac.imp_writelog (p_import_key,
                     'S',
                     'Provisioning-tabel (groepen): ' || v_count || ' regels toegevoegd',
                     currentversion || ', $Revision$'
                    );

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, 'W', v_errormsg, v_errorhint);
END;
/


CREATE OR REPLACE VIEW uwva_v_rap_provisioning
AS
     SELECT up.uwva_rol_omschr fclt_f_rol,
            fp.fac_profiel_omschrijving fclt_f_profiel,
            fg.fac_groep_omschrijving fclt_f_authorisatiegroep
       FROM uwva_provisioning up, fac_profiel fp, fac_groep fg
      WHERE     up.fac_profiel_key = fp.fac_profiel_key(+)
            AND up.fac_groep_key = fg.fac_groep_key(+)
   ORDER BY 1, 2, 3;


-- UWVA#21045: Vinder-export voor ABS
-- UWVA#24931: ABS-id met voorloopnullen
-- UWVA#40346: Toestel-kolom zomder data
CREATE OR REPLACE VIEW uwva_v_export_vinder2abs
(
   RESULT,
   result_order
)
AS
   SELECT '"ABS-ID","Telefoon","Mobielnr","Toestel"', 0 FROM DUAL
   UNION ALL
   SELECT    '"'
          || LPAD( kl1.prs_kenmerklink_waarde, 8, '0' )
          || '","'
          || p.prs_perslid_telefoonnr
          || '","'
          || p.prs_perslid_mobiel
          || '","'
          || '"',
          1
     FROM (SELECT *
             FROM prs_perslid
            WHERE prs_perslid_verwijder IS NULL) p
          LEFT OUTER JOIN (SELECT *
                             FROM prs_kenmerklink
                            WHERE prs_kenmerk_key = 1232) kl1
             ON kl1.prs_link_key = p.prs_perslid_key;


-- UWVA#22892: Noti geschoond mandaat naar (onder)gemandateerde bij wijziging
--             van afdeling op basis van gegevens uit eigen tabel zoals gevuld
--             tijdens ABS-import (via rapportage), zo is dat!
/* Formatted on 12-6-2012 16:18:12 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW uwva_v_rap_geschoond_mandaat
(
   hide_f_prs_key,
   fclt_f_prs_naam_full,
   cur_afd_naam,
   cur_afd_oms,
   cur_kpn_nr,
   cur_kpn_oms,
   old_afd_naam,
   old_afd_oms,
   old_kpn_nr,
   old_kpn_oms,
   hide_f_kpn_key,
   kpn_nr,
   kpn_oms,
   kpn_boeken,
   kpn_inzage,
   budgethouder
)
AS
   SELECT   pf.prs_perslid_key,
            pf.prs_perslid_naam_full,
            cur_a.prs_afdeling_naam,
            cur_a.prs_afdeling_omschrijving,
            cur_k.prs_kostenplaats_nr,
            cur_k.prs_kostenplaats_omschrijving,
            old_a.prs_afdeling_naam,
            old_a.prs_afdeling_omschrijving,
            old_k.prs_kostenplaats_nr,
            old_k.prs_kostenplaats_omschrijving,
            k.prs_kostenplaats_key,
            k.prs_kostenplaats_nr,
            k.prs_kostenplaats_omschrijving,
            ud.boeken,
            ud.inzage,
            bh.prs_perslid_naam_full
     FROM   (SELECT   fac.safe_to_number(SUBSTR (
                                            fac_usrdata_code,
                                            1,
                                            INSTR (fac_usrdata_code, '-') - 1
                                         ))
                         prs_perslid_key,
                      fac.safe_to_number (fac_usrdata_omschr)
                         prs_afdeling_key,
                      fac.safe_to_number(SUBSTR (
                                            fac_usrdata_code,
                                            INSTR (fac_usrdata_code, '-') + 1
                                         ))
                         prs_kostenplaats_key,
                      fac_usrdata_volgnr boeken,
                      fac_usrdata_prijs inzage
               FROM   fac_v_aanwezigusrdata
              WHERE   fac_usrtab_key = 3
                      AND TRUNC (fac_usrdata_aanmaak) = TRUNC (SYSDATE)) ud,
            prs_v_aanwezigperslid p,
            prs_v_perslid_fullnames_all pf,
            prs_afdeling cur_a,
            prs_afdeling old_a,
            prs_kostenplaats cur_k,
            prs_kostenplaats old_k,
            prs_kostenplaats k,
            prs_v_perslid_fullnames_all bh
    WHERE       ud.prs_perslid_key = p.prs_perslid_key
            AND p.prs_perslid_key = pf.prs_perslid_key
            AND p.prs_afdeling_key = cur_a.prs_afdeling_key
            AND cur_a.prs_kostenplaats_key = cur_k.prs_kostenplaats_key(+)
            AND ud.prs_afdeling_key = old_a.prs_afdeling_key
            AND old_a.prs_kostenplaats_key = old_k.prs_kostenplaats_key(+)
            AND ud.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
            AND k.prs_perslid_key = bh.prs_perslid_key(+);

/* Formatted on 11-6-2012 15:26:45 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW uwva_v_noti_geschoond_mandaat
(
   code,
   sender,
   receiver,
   text,
   KEY,
   par1,
   par2,
   xkey
)
AS
   SELECT   DISTINCT
            sn.fac_srtnotificatie_code,
            NULL,
            x.hide_f_prs_key,
            sn.fac_srtnotificatie_oms,
            x.hide_f_prs_key,
            NULL,
            NULL,
            NULL
     FROM   uwva_v_rap_geschoond_mandaat x, fac_srtnotificatie sn
    WHERE   sn.fac_srtnotificatie_code = 'CUST13';

CREATE OR REPLACE VIEW uwva_v_noti_prs_inactalg
(
   code,
   sender,
   receiver,
   text,
   key,
   par1,
   par2,
   xkey
)
AS
   SELECT 'CUST26',
          NULL,
          p2.prs_perslid_key,
             'Medewerker gekoppeld aan gesloten pand ('
          || pf.prs_perslid_naam_friendly
          || ')',
          p.prs_perslid_key,
          NULL,
          NULL,
          NULL
     FROM prs_perslidwerkplek pw,
          prs_werkplek w,
          alg_v_allonrgoed_gegevens aog,
          alg_gebouw g,
          alg_srtgebouw sg,
          prs_v_aanwezigperslid p,
          prs_afdeling a,
          prs_kostenplaats k,
          prs_v_aanwezigperslid p2,
          prs_v_perslid_fullnames pf
    WHERE pw.prs_werkplek_key = w.prs_werkplek_key
      AND w.prs_alg_ruimte_key = aog.alg_ruimte_key
      AND aog.alg_gebouw_key = g.alg_gebouw_key
      AND g.alg_srtgebouw_key = sg.alg_srtgebouw_key
      AND sg.alg_srtgebouw_passief = 1
      AND p.prs_perslid_key = pw.prs_perslid_key
      AND p.prs_afdeling_key = a.prs_afdeling_key
      AND a.prs_kostenplaats_key = k.prs_kostenplaats_key
      AND k.prs_perslid_key = p2.prs_perslid_key
      AND p.prs_perslid_key = pf.prs_perslid_key
      AND pw.prs_perslidwerkplek_volgnr = 2
   UNION
   SELECT 'CUST27',
          NULL,
          p.prs_perslid_key,
          'Account gekoppeld aan gesloten pand',
          p.prs_perslid_key,
          NULL,
          NULL,
          NULL
     FROM prs_perslidwerkplek pw,
          prs_werkplek w,
          alg_v_allonrgoed_gegevens aog,
          alg_gebouw g,
          alg_srtgebouw sg,
          prs_v_aanwezigperslid p
    WHERE pw.prs_werkplek_key = w.prs_werkplek_key
      AND w.prs_alg_ruimte_key = aog.alg_ruimte_key
      AND aog.alg_gebouw_key = g.alg_gebouw_key
      AND g.alg_srtgebouw_key = sg.alg_srtgebouw_key
      AND sg.alg_srtgebouw_passief = 1
      AND p.prs_perslid_key = pw.prs_perslid_key
      AND pw.prs_perslidwerkplek_volgnr = 2;

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