#ifdef PRS
/*
 *  $Revision$
 *  $Id$
 */

CREATE OR REPLACE PACKAGE aut AS
  FUNCTION fac_get_prs_same_level(userkey IN NUMBER, perslidkey IN NUMBER) RETURN NUMBER;
END aut;
/

CREATE OR REPLACE PACKAGE BODY aut AS

  FUNCTION fac_get_prs_same_level(userkey IN NUMBER, perslidkey IN NUMBER) RETURN NUMBER IS
  CURSOR usr_deps IS
   SELECT paf.prs_afdeling_key, prs_afdeling_elder_key, niveau
      FROM prs_v_afdeling_familie paf, prs_perslid pp
     WHERE paf.prs_afdeling_key = pp.prs_afdeling_key
       AND pp.prs_perslid_key=userkey
    ORDER BY niveau DESC;

  CURSOR pers_deps IS
   SELECT paf.prs_afdeling_key, prs_afdeling_elder_key, niveau
      FROM prs_v_afdeling_familie paf, prs_perslid pp
     WHERE paf.prs_afdeling_key = pp.prs_afdeling_key
       AND pp.prs_perslid_key=perslidkey
    ORDER BY niveau DESC;

  usr_orglevel		NUMBER(1);
  pers_orglevel		NUMBER(1);
  samelevelFound	BOOLEAN;
  samelevel		NUMBER(1);

  BEGIN
    BEGIN
      samelevelFound := FALSE;
      FOR c1 IN usr_deps
      LOOP
        FOR c2 IN pers_deps
        LOOP
          IF c1.prs_afdeling_elder_key = c2.prs_afdeling_elder_key
          THEN
            samelevelFound := TRUE;
            samelevel := c2.niveau;
            EXIT;
          END IF;
        END LOOP;
        IF samelevelFound
        THEN
          EXIT;
        END IF;
      END LOOP;
      IF NOT samelevelFound
      THEN
        samelevel := 0; 	-- no same level found,then assume same company
      END IF;			-- multi_company will be detected in ASP so no problem here
    EXCEPTION
      WHEN OTHERS THEN
        samelevel:= 9;
    END;
    RETURN samelevel;
  END;
END aut;
/

/* Formatted on 3-11-2010 11:50:08 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PACKAGE prs
AS
   FUNCTION getkpverantwoordelijke (pkostenplaats_key IN NUMBER,
                                    pmethode IN NUMBER,
                                    pexcludekey IN NUMBER)
      RETURN NUMBER;

   FUNCTION getkostenplaats (pperslid_key IN NUMBER, pmethode IN NUMBER, pexcludekey IN NUMBER)
      RETURN NUMBER;

   FUNCTION getprofiellimiet (pperslidkey IN NUMBER, pdisckey IN NUMBER)
      RETURN NUMBER;

   FUNCTION getlimietagb (pkostenplaatskey IN NUMBER, pmethode IN NUMBER, pdisckey IN NUMBER)
      RETURN NUMBER;

   FUNCTION getfiatteur (pkostenplaats_key   IN NUMBER,
                         pexcludekey         IN NUMBER,
                         pondergrens         IN NUMBER,
                         pdisckey            IN NUMBER,
                         pfiatbedrag         IN NUMBER DEFAULT -1
                        )
      RETURN NUMBER;

   FUNCTION nextfiatteur (pkey        IN NUMBER,
                          pmodule     IN VARCHAR2,
                          pexcludekey IN NUMBER DEFAULT -1)
      RETURN NUMBER;

   PROCEDURE setpassword(pperslidkey IN NUMBER, pwachtwoord IN VARCHAR2);

   FUNCTION testpassword(pperslidkey IN NUMBER, pwachtwoord IN VARCHAR2)
      RETURN NUMBER;

   PROCEDURE upsertkenmerk (p_kenmerk_key IN NUMBER, p_prs_key IN NUMBER, p_waarde IN VARCHAR2);

   PROCEDURE movetoruimte (p_prs_key IN NUMBER, p_ruimte_key IN NUMBER, p_alg_type IN VARCHAR2, p_virtual IN NUMBER DEFAULT 0);

   PROCEDURE import_perslid (p_import_key IN NUMBER, p_seq_of_columns IN VARCHAR2, p_header IN VARCHAR2);

   PROCEDURE update_perslid (p_import_key IN NUMBER, p_sleutelkolom IN VARCHAR2, p_alg_type IN VARCHAR2);

   PROCEDURE delete_perslid (p_import_key IN NUMBER, p_perslid_key IN NUMBER);
END prs;
/

CREATE OR REPLACE PACKAGE BODY prs
AS
   -- Levert de prs_perslid_key op van de budgethouder van een kostenplaats
   -- Simpele versie van getfiatteur: hij negeert limieten
   FUNCTION getkpverantwoordelijke (pkostenplaats_key IN NUMBER,
                                    pmethode IN NUMBER, -- deze gebruiken we eigenlijk niet meer sinds 2017.2
                                    pexcludekey IN NUMBER)
      RETURN NUMBER
   IS
   BEGIN
    IF pmethode = 3 THEN
        raise_application_error (-20001, 'Cannot use prs.getkpverantwoordelijke with prs_approvemethod = 3');
    END IF;
    RETURN  getfiatteur (pkostenplaats_key,
                         pexcludekey,
                         NULL,
                         NULL
                        );
   END;

   -- Levert de prs_kostenplaats_key op van de persoon volgens
   -- de door ons gedefinieerde regels.
   -- Levert -1 op indien er geen gevonden wordt.
   -- Controleert niet of de meegegeven persoon nog wel actief is
   -- pmethode geeft .. inderdaad, waarbij
   -- methode 1 = 1-laagsmethode via eigen afdeling - kostenplaats
   -- methode 2 = n-laagsmethode via afdelingsboom
   -- Met pexcludekey kan een kostenplaats_key worden opgegeven die je niet wilt
   -- Dat leek me wel een aardige feature. Geef -1 mee als je geen kostenplaats wilt excluden
   FUNCTION getkostenplaats (pperslid_key IN NUMBER, pmethode IN NUMBER, pexcludekey IN NUMBER)
      RETURN NUMBER
   IS
      lkostenplaatskey prs_afdeling.prs_kostenplaats_key%TYPE;
      lparentafdkey prs_afdeling.prs_afdeling_parentkey%TYPE;
   BEGIN
      BEGIN
         SELECT   COALESCE (a.prs_kostenplaats_key, -1),
                  a.prs_afdeling_parentkey
           INTO   lkostenplaatskey,
                  lparentafdkey
           FROM   prs_perslid p,
                  prs_afdeling a
          WHERE   p.prs_afdeling_key = a.prs_afdeling_key
            AND   p.prs_perslid_key = pperslid_key;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            -- persoon bestaat niet
            RETURN -1;
      END;

      IF (lkostenplaatskey = -1 OR lkostenplaatskey = pexcludekey) AND pmethode = 2
      -- doorloop de boom naar boven, met allerlei aannames
      THEN
         WHILE (lkostenplaatskey = -1 OR lkostenplaatskey = pexcludekey) AND lparentafdkey IS NOT NULL
         LOOP
            SELECT   COALESCE (a.prs_kostenplaats_key, -1),
                     a.prs_afdeling_parentkey
              INTO   lkostenplaatskey,
                     lparentafdkey
              FROM   prs_afdeling a
             WHERE   a.prs_afdeling_verwijder IS NULL
                     AND a.prs_afdeling_key = lparentafdkey;
         END LOOP;
      -- nu heb ik er een of kan ik er geen vinden
      END IF;

      RETURN lkostenplaatskey;
   END;

    -- Levert de limiet (maximaal bestelbedrag) van persoon pperslidkey,
    -- eventueel specifiek voor pdisckey indien dat gedefinieerd zou zijn.
   FUNCTION getprofiellimiet (pperslidkey IN NUMBER, pdisckey IN NUMBER)
      RETURN NUMBER
   IS
      llimiet fac_profiel.fac_profiel_limiet%TYPE;
   BEGIN
      -- de algemene limiet telt het zwaarst indien ingevuld
      IF pperslidkey IS NULL
      THEN
        RETURN NULL;
      END IF;
      -- persoon wordt geacht te bestaan, profiel is optioneel
      SELECT   fp.fac_profiel_limiet
        INTO   llimiet
        FROM   prs_perslid p, fac_profiel fp
       WHERE   p.fac_profiel_key = fp.fac_profiel_key(+) AND p.prs_perslid_key = pperslidkey;

      IF llimiet IS NULL AND pdisckey IS NOT NULL
      THEN
         -- geen algemene limiet; zoek de disciplineafhankelijke (max() to prevent no data found)
         SELECT   MAX (fpw.fac_profielwaarde_limiet)
           INTO   llimiet
           FROM   prs_perslid p, fac_profielwaarde fpw
          WHERE       p.fac_profiel_key = fpw.fac_profiel_key
                  AND fpw.ins_discipline_key = pdisckey
                  AND p.prs_perslid_key = pperslidkey;
      END IF;

      RETURN llimiet;
   END;

    -- Levert de limiet (maximaal bestelbedrag) van persoon pperslidkey i.v.m. Afdelings Gebonden Budget (AGB),
   FUNCTION getlimietagb (pkostenplaatskey IN NUMBER, pmethode IN NUMBER, pdisckey IN NUMBER)
      RETURN NUMBER
   IS
      llimiet prs_kostenplaats.prs_kostenplaats_limiet%TYPE;
   BEGIN
      IF pkostenplaatskey > 0
      THEN
        -- Er is een kostenplaats meegegeven
        SELECT k.prs_kostenplaats_limiet
          INTO llimiet
          FROM prs_kostenplaats k
          WHERE k.prs_kostenplaats_key = pkostenplaatskey;
        -- AGB per kostenplaats of catalogus
        IF llimiet IS NULL
        THEN
          BEGIN
            SELECT prs_kostenplaatsdisc_limiet
              INTO llimiet
              FROM prs_kostenplaatsdisc
             WHERE prs_kostenplaats_key = pkostenplaatskey
               AND ins_discipline_key = pdisckey;
          EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               -- er is geen limiet voor deze kostenplaats-discipline.
              RETURN NULL;
          END;
        END IF;
      ELSE
        RETURN NULL;
      END IF;

      RETURN llimiet;
   END;

   -- De functie levert de prs_perslid_key op van de perslid die een item (opdracht/bestelling) van
   -- discipline pdisckey boven bedrag COALESCE(pfiatbedrag, pondergrens) mag fiatteren
   -- volgens de door ons gedefinieerde regels. Werkt analoog aan getkpverantwoordelijke
   -- Maar houdt hierbij rekening met de profielen van de budgethouders als prs_approvemethod==3
   --
   -- Levert dus in eerste instantie de kostenplaatsverantwoordelijke (budgethouder) op.
   -- Levert de kostenplaatsgroepverantwoordelijke op indien geen goede budgethouder
   -- wordt gevonden.
   -- Afhankelijk van de pfiatbedrag levert de functie dan de kostenplaatsgroepverantwoordelijke op
   -- die boven het bedrag van COALESCE(pfiatbedrag, pondergrens) mag fiatteren.
   -- De parameter pondergrens wordt ook gebruikt voor mode 3 om het profiel van de budgethouder te controleren. Daarom extra parameter pfiatbedrag nodig.
   --
   FUNCTION getfiatteur (pkostenplaats_key   IN NUMBER,
                         pexcludekey         IN NUMBER,
                         pondergrens         IN NUMBER,
                         pdisckey            IN NUMBER,
                         pfiatbedrag         IN NUMBER DEFAULT -1
                        )
      RETURN NUMBER
   IS
      lkpverantwkey prs_kostenplaats.prs_perslid_key%TYPE;
      lkpgverantwkey prs_kostenplaatsgrp.prs_perslid_key%TYPE;
      lkpgverantwkey1 prs_kostenplaatsgrp.prs_perslid_key%TYPE;
      lkpgverantwkey2 prs_kostenplaatsgrp.prs_kostenplaatsgrp_fiat2_key%TYPE;
      lkpgverantwkey3 prs_kostenplaatsgrp.prs_kostenplaatsgrp_fiat3_key%TYPE;
      lexcludeisvervanger NUMBER;
      lexcludeiskpgverantw NUMBER;
      lkpverantwlimiet fac_profiel.fac_profiel_limiet%TYPE;
      afdkey prs_afdeling.prs_afdeling_key%TYPE;
      parentafdkey prs_afdeling.prs_afdeling_parentkey%TYPE;
      lmethode NUMBER;
      lteller NUMBER;
      lfoundfiatteur NUMBER;
      lfiatteur prs_kostenplaats.prs_perslid_key%TYPE;
      llastfiat	BOOLEAN;
      lgrens NUMBER;
   BEGIN
      BEGIN
         lkpverantwkey := -1;
         SELECT   COALESCE (prs_perslid_key, -1)
           INTO   lkpverantwkey
           FROM   prs_kostenplaats
          WHERE   prs_kostenplaats_key = pkostenplaats_key;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            -- kostenplaats bestaat niet
            RETURN -1;
      END;
      dbms_output.put_line('Budgethouder: '||lkpverantwkey);
      -- lkpverantwkey is (mits gedefinieerd) de budgethouder van de kp. Het is nog niet gezegd of dit de gevraagde fiatteur is
      -- Is de meegegeven pexcludekey wellicht een vervanger van kostenplaatsverantwoordelijke van de kostenplaats?
      -- Zo ja, dan is in dat geval lkpverantwkey de pexcludekey
      IF pexcludekey > 0 AND lkpverantwkey <> pexcludekey THEN
          SELECT COUNT(prs_perslid_key)
            INTO lexcludeisvervanger
            FROM prs_collega
           WHERE prs_perslid_key_alt = pexcludekey
             AND prs_perslid_key = lkpverantwkey;
      END IF;
      dbms_output.put_line('ExcludeIsVervanger: '||lexcludeisvervanger);
      lmethode := fac.getSetting('prs_approvemethod');
      dbms_output.put_line('Approvemethod: '||lmethode);
      dbms_output.put_line('Ondergrens: '||pondergrens);

      IF lmethode = 3 THEN -- ook profiel budgethouder controleren
        lkpverantwlimiet := prs.getprofiellimiet (lkpverantwkey, pdisckey);
        dbms_output.put_line('Zijn limiet: '||lkpverantwlimiet);
        IF (lkpverantwlimiet < pondergrens) -- lkpverantwkey != -1 is impliciet in die limiet
        THEN -- het profiel van deze budgethouder is niet genoeg
          lkpverantwkey := -1; -- niet meer interessant wie dit was
        END IF;
      END IF;

      IF (lkpverantwkey = -1 OR lkpverantwkey = pexcludekey OR lexcludeisvervanger = 1)
          AND (lmethode = 2 OR lmethode = 3)
      -- doorloop de boom naar boven, met allerlei aannames
      THEN
        dbms_output.put_line('We gaan de boom in');
         -- waar hoort deze kp bij?
         BEGIN
            SELECT   prs_afdeling_key, prs_afdeling_parentkey
              INTO   afdkey, parentafdkey
              FROM   prs_afdeling
             WHERE   prs_kostenplaats_key = pkostenplaats_key AND prs_afdeling_verwijder IS NULL;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               -- kp is niet aan een afdeling gerelateerd, dan weet ik het met deze methode niet
               RETURN -1;
         END;
         -- Zolang nog geen goede en we kunnen hogerop
         WHILE (lkpverantwkey = -1 OR lkpverantwkey = pexcludekey OR lexcludeisvervanger = 1)
              AND parentafdkey IS NOT NULL
         LOOP
            SELECT   COALESCE (k.prs_perslid_key, -1), prs_afdeling_parentkey
              INTO   lkpverantwkey, parentafdkey
              FROM   prs_kostenplaats k, prs_afdeling a
             WHERE       k.prs_kostenplaats_key(+) = a.prs_kostenplaats_key
                     AND a.prs_afdeling_verwijder IS NULL
                         AND a.prs_afdeling_key = parentafdkey;
            dbms_output.put_line('Volgende budgethouder: '||lkpverantwkey);

            IF lmethode = 3 THEN -- ook profiel budgethouder controleren
              lkpverantwlimiet := prs.getprofiellimiet (lkpverantwkey, pdisckey);
              dbms_output.put_line('Zijn limiet B: '||lkpverantwlimiet);
              IF (lkpverantwlimiet < pondergrens)
              THEN -- het profiel van deze budgethouder is niet genoeg
                lkpverantwkey := -1; -- niet meer interessant wie dit was
              END IF;
            END IF;

            IF pexcludekey > 0 AND lkpverantwkey <> pexcludekey THEN
                SELECT COUNT(prs_perslid_key)
                  INTO lexcludeisvervanger
                  FROM prs_collega
                 WHERE prs_perslid_key_alt = pexcludekey
                   AND prs_perslid_key = lkpverantwkey;
            END IF;
         END LOOP;
      -- nu heb ik er een of kan ik er geen vinden
      END IF;
      dbms_output.put_line('Gevonden budgethouder voor de kpgroep-tak: '||lkpverantwkey);
      -- Nu: als ik methode 1 heb, of methode 2 niemand opleverde (ondanks afdelingskostenplaats): de kpngroepverantwoordelijke
      IF lkpverantwkey = -1 OR lkpverantwkey = pexcludekey OR lexcludeisvervanger = 1
      THEN
         -- vindt de kostenplaatsGROEPverantwoordelijke van de altijd meegegeven kp
         BEGIN
            SELECT COALESCE(kg.prs_perslid_key, -1),
                   COALESCE(kg.prs_kostenplaatsgrp_fiat2_key, -1),
                   COALESCE(kg.prs_kostenplaatsgrp_fiat3_key, -1)
              INTO lkpgverantwkey1,
                   lkpgverantwkey2,
                   lkpgverantwkey3
              FROM prs_kostenplaats k,
                   prs_kostenplaatsgrp kg
             WHERE prs_kostenplaats_key = pkostenplaats_key
               AND kg.prs_kostenplaatsgrp_key = k.prs_kostenplaatsgrp_key;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               -- Er is geen kpgroep bij.
               RETURN -1;
         END;

         lteller := 1;
         lfoundfiatteur := 0;
         lfiatteur := -1;

         -- Als er een fiatbedrag is meegegeven dan de volgende fiatteur opleveren en niet de laatste die moet fiatteren.
         -- Dan het de ondergrens het fiatbedrag en niet het totale opdrachtbedrag.
         IF pfiatbedrag >= 0
         THEN
             lgrens := pfiatbedrag;
         ELSE
             lgrens := pondergrens;
         END IF;

         WHILE lteller <= 3 AND lfoundfiatteur = 0
         LOOP
             CASE
             WHEN lteller = 1
             THEN
                lkpgverantwkey := lkpgverantwkey1;
                llastfiat := lgrens < fac.getsetting ('mld_opdr_kpg_fin_limit1');
             WHEN lteller = 2
             THEN
                lkpgverantwkey := lkpgverantwkey2;
                llastfiat := lgrens < fac.getsetting ('mld_opdr_kpg_fin_limit2');
             WHEN lteller = 3
             THEN
                lkpgverantwkey := lkpgverantwkey3;
                llastfiat := lgrens >= fac.getsetting ('mld_opdr_kpg_fin_limit2');
             END CASE;

             IF lkpgverantwkey = pexcludekey
             THEN
                 lexcludeiskpgverantw := 1;
             ELSE
                 SELECT CASE
                        WHEN COUNT(prs_perslid_key) > 0
                        THEN 1
                        ELSE 0
                        END
                   INTO lexcludeiskpgverantw
                   FROM prs_collega
                  WHERE prs_perslid_key_alt = pexcludekey
                    AND prs_perslid_key = lkpgverantwkey;
             END IF;

             IF lexcludeiskpgverantw = 0 AND llastfiat
             THEN
                 lfiatteur := lkpgverantwkey;
                 lfoundfiatteur := 1;
             END IF;
             lteller := lteller + 1;
         END LOOP;
      ELSE
        lfiatteur := lkpverantwkey;
      END IF;
      dbms_output.put_line('Resultaat budgethouder: '||lfiatteur);
      RETURN lfiatteur;
   END;

   -- Levert de volgende fiatteur in de rij op. Indien geen volgende fiatteur gevonden kan worden wordt -1 teruggegeven.
   -- Er wordt hier niet gecontroleerd of de opdracht gefiatteerd dient te worden. Dat dien je voor de aanroep te bepalen.
   FUNCTION nextfiatteur (pkey        IN NUMBER,
                          pmodule     IN VARCHAR2,
                          pexcludekey IN NUMBER DEFAULT -1)
      RETURN NUMBER
   IS
      lnextfiatteur prs_kostenplaats.prs_perslid_key%TYPE;
   BEGIN
       CASE pmodule
       WHEN 'MLD'
       THEN
           SELECT CASE
                  WHEN NOT EXISTS (SELECT prs_perslid_key
                                     FROM fac_tracking t,
                                          fac_srtnotificatie st
                                    WHERE t.fac_srtnotificatie_key = st.fac_srtnotificatie_key
                                      AND st.fac_srtnotificatie_code = 'ORDFOK'
                                      AND fac_tracking_refkey = o.mld_opdr_key)
                  THEN
                     prs.getfiatteur(o.prs_kostenplaats_key, pexcludekey, mld_opdr_kosten, std.mld_ins_discipline_key, COALESCE(mld_opdr_fiatbedrag, -1))
                  WHEN mld_opdr_fiatbedrag >= fac.getsetting ('mld_opdr_kpg_fin_limit2')
                  THEN
                     COALESCE(prs_kostenplaatsgrp_fiat3_key, -1)
                  WHEN mld_opdr_fiatbedrag >= fac.getsetting ('mld_opdr_kpg_fin_limit1')
                  THEN
                     COALESCE(prs_kostenplaatsgrp_fiat2_key, -1)
                  ELSE
                     COALESCE(kpg.prs_perslid_key, -1)
                  END nextfiatteur
             INTO lnextfiatteur
             FROM mld_opdr o,
                  mld_melding m,
                  mld_stdmelding std,
                  prs_kostenplaats kp,
                  prs_kostenplaatsgrp kpg
            WHERE o.mld_melding_key = m.mld_melding_key
              AND m.mld_stdmelding_key = std.mld_stdmelding_key
              AND o.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
              AND kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)
              AND o.mld_opdr_key = pkey;
       WHEN 'BES'
       THEN
           SELECT CASE
                      WHEN NOT EXISTS
                               (SELECT prs_perslid_key
                                  FROM fac_tracking t,
                                       fac_srtnotificatie st
                                 WHERE t.fac_srtnotificatie_key = st.fac_srtnotificatie_key
                                   AND st.fac_srtnotificatie_code = 'BESFIT'
                                   AND fac_tracking_refkey = b.bes_bestelling_key)
                      THEN
                          prs.getfiatteur(b.prs_kostenplaats_key, -1, binfo.totaal, binfo.ins_discipline_key, COALESCE(bes_bestelling_fiatbedrag, -1))
                      WHEN bes_bestelling_fiatbedrag >= fac.getsetting('mld_opdr_kpg_fin_limit2')
                      THEN
                          COALESCE(prs_kostenplaatsgrp_fiat3_key, -1)
                      WHEN bes_bestelling_fiatbedrag >= fac.getsetting('mld_opdr_kpg_fin_limit1')
                      THEN
                          COALESCE(prs_kostenplaatsgrp_fiat2_key, -1)
                      ELSE
                          COALESCE(kpg.prs_perslid_key, -1)
                  END
                      nextfiatteur
             INTO lnextfiatteur
             FROM bes_bestelling b,
                  (SELECT MAX(bsg.ins_discipline_key) ins_discipline_key,
                          SUM(bi.bes_bestelling_item_aantal * bi.bes_bestelling_item_prijs) totaal
                     FROM bes_bestelling_item bi,
                          bes_srtdeel bsd,
                          bes_srtgroep bsg
                    WHERE bi.bes_srtdeel_key = bsd.bes_srtdeel_key
                      AND bsd.bes_srtgroep_key = bsg.bes_srtgroep_key
                      AND bes_bestelling_key = pkey) binfo,
                  prs_kostenplaats kp,
                  prs_kostenplaatsgrp kpg
            WHERE b.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
              AND kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)
              AND b.bes_bestelling_key = pkey;
       END CASE;
       RETURN lnextfiatteur;
   END;

  PROCEDURE setpassword(pperslidkey IN NUMBER, pwachtwoord IN VARCHAR2)
  IS
  BEGIN
      IF pwachtwoord IS NULL
      THEN
          UPDATE prs_perslid
             SET prs_perslid_salt = NULL,
                 prs_perslid_wachtwoord_hash = NULL,
                 prs_perslid_wachtwoord_exp = NULL,
                 prs_perslid_otpsecret = NULL
           WHERE prs_perslid_key = pperslidkey;
      ELSE
          UPDATE prs_perslid
             SET prs_perslid_salt = DBMS_RANDOM.string ('a', 32)
           WHERE prs_perslid_key = pperslidkey;
          UPDATE prs_perslid
             SET prs_perslid_wachtwoord_hash = fac.makehash(prs_perslid_salt || pwachtwoord),
                 prs_perslid_wachtwoord_exp = NULL -- of ooit: SYSDATE + fac.getsetting ('prs_password_expiration') als die is gevuld
           WHERE prs_perslid_key = pperslidkey;
      END IF;
  END;

  FUNCTION testpassword(pperslidkey IN NUMBER, pwachtwoord IN VARCHAR2)
    RETURN NUMBER
  IS
      perslid_key prs_perslid.prs_perslid_key%TYPE;
  BEGIN
      IF pwachtwoord IS NULL
      THEN
          RETURN 0;
      END IF;
      BEGIN
          SELECT prs_perslid_key
            INTO perslid_key
            FROM prs_perslid
           WHERE fac.testhash(prs_perslid_wachtwoord_hash, prs_perslid_salt || pwachtwoord) = 1
             AND prs_perslid_key = pperslidkey;
      EXCEPTION
        WHEN NO_DATA_FOUND
          THEN RETURN 0;
      END;
      RETURN 1;
  END;

  -- Er wordt nu niet getrackt (wat eigenlijk niet zo goed is)
  PROCEDURE upsertkenmerk (p_kenmerk_key   IN NUMBER,
                           p_prs_key       IN NUMBER,
                           p_waarde        IN VARCHAR2)
  IS
      v_count    NUMBER;
      v_niveau   VARCHAR2 (1);
  BEGIN
      -- niveau van prs_kenmerk ophalen, omdat deze ook in prs_kenmerklink wordt opgeslagen
      SELECT prs_kenmerk_niveau
        INTO v_niveau
        FROM prs_kenmerk
       WHERE prs_kenmerk_key = p_kenmerk_key;

      SELECT COUNT ( * )
        INTO v_count
        FROM prs_kenmerklink
       WHERE     prs_link_key = p_prs_key
             AND prs_kenmerk_key = p_kenmerk_key
             AND prs_kenmerklink_verwijder IS NULL;

      IF v_count = 1
      THEN
          IF p_waarde IS NULL
          THEN
              DELETE prs_kenmerklink
               WHERE     prs_link_key = p_prs_key
                     AND prs_kenmerk_key = p_kenmerk_key
                     AND prs_kenmerklink_verwijder IS NULL;
          ELSE
              UPDATE prs_kenmerklink
                 SET prs_kenmerklink_waarde = p_waarde
               WHERE     prs_link_key = p_prs_key
                     AND prs_kenmerk_key = p_kenmerk_key
                     AND prs_kenmerklink_verwijder IS NULL;
          END IF;
      ELSE
          IF p_kenmerk_key IS NOT NULL AND p_waarde IS NOT NULL
          THEN
              INSERT INTO prs_kenmerklink (prs_kenmerk_key,
                                           prs_link_key,
                                           prs_kenmerklink_niveau,
                                           prs_kenmerklink_waarde)
                  VALUES (p_kenmerk_key,
                          p_prs_key,
                          v_niveau,
                          p_waarde);
          END IF;
      END IF;
  END;
   -- Verhuist een persoon p_prs_key naar een werkplek in p_ruimte_key
   -- Als er al vaste werkplekken waren binnen het niveau van p_alg_type (R,V,G,L,D,NULL,A)
   -- dan worden die geleegd/gewist. Bij NULL wordt niks gewist, bij A wordt altijd gewist.
   PROCEDURE movetoruimte (p_prs_key      IN NUMBER,
                           p_ruimte_key   IN NUMBER,
                           p_alg_type     IN VARCHAR2,
                           p_virtual      IN NUMBER DEFAULT 0)
    IS
        v_count       NUMBER;
        v_wp_key      NUMBER (10);
        v_wp_volgnr   prs_werkplek.prs_werkplek_volgnr%TYPE;
        v_ruimte_nr   alg_ruimte.alg_ruimte_nr%TYPE;
        v_wp_oms      prs_werkplek.prs_werkplek_omschrijving%TYPE;
        v_alg_key     NUMBER (10);
    BEGIN
        -- Bepalen of werkplek gewijzigd is tov de huidige situatie
        -- door te tellen hoe vaak (1) we al in de nieuwe situatie zitten
        SELECT COUNT ( * )
          INTO v_count
          FROM prs_perslidwerkplek pw, prs_werkplek wp
         WHERE     pw.prs_perslid_key = p_prs_key
               AND pw.prs_werkplek_key = wp.prs_werkplek_key
               AND wp.prs_alg_ruimte_key = p_ruimte_key
               AND wp.prs_werkplek_type = 0  -- alleen vaste plekken
               AND wp.prs_werkplek_virtueel = p_virtual;

        IF (v_count = 0)
        THEN
            -- Persoon zit nog niet op de bestemming
            -- Verwijderen oude -vaste- werkplek(ken) op meegegeven niveau.
            SELECT MIN(DECODE (p_alg_type,
                               'R', alg_ruimte_key,
                               'V', alg_verdieping_key,
                               'G', alg_gebouw_key,
                               'L', alg_locatie_key,
                               'D', alg_district_key,
                               NULL))
              INTO v_alg_key
              FROM alg_v_ruimte_gegevens_all
             WHERE alg_ruimte_key = p_ruimte_key;

            IF fac.getsetting ('prs_werkplek_implicit') = '0'                                --expliciet
            THEN
                -- Wis de bezetting maar laat de werkplek bestaan
                DELETE FROM prs_perslidwerkplek pw
                      WHERE pw.prs_perslid_key = p_prs_key
                            AND EXISTS
                                   (SELECT 1
                                      FROM prs_werkplek wp,
                                           (SELECT alg_ruimte_key,
                                                   DECODE (p_alg_type,
                                                           'R', alg_ruimte_key,
                                                           'V', alg_verdieping_key,
                                                           'G', alg_gebouw_key,
                                                           'L', alg_locatie_key,
                                                           'D', alg_district_key,
                                                           NULL)
                                                       alg_key
                                              FROM alg_v_ruimte_gegevens_all) og
                                     WHERE     wp.prs_werkplek_key = pw.prs_werkplek_key
                                           AND wp.prs_werkplek_virtueel = p_virtual
                                           AND wp.prs_werkplek_type = 0  -- alleen vaste plekken
                                           AND wp.prs_alg_ruimte_key = og.alg_ruimte_key
                                           AND (og.alg_key = v_alg_key OR p_alg_type = 'A'));
            ELSE
                -- Wis de werkplek, automatisch inclusief de bezetting
                DELETE FROM prs_werkplek wp
                      WHERE wp.prs_werkplek_virtueel = p_virtual
                            AND wp.prs_werkplek_type = 0  -- alleen vaste plekken
                            AND EXISTS
                                   (SELECT 1
                                      FROM prs_perslidwerkplek pw,
                                           (SELECT alg_ruimte_key,
                                                   DECODE (p_alg_type,
                                                           'R', alg_ruimte_key,
                                                           'V', alg_verdieping_key,
                                                           'G', alg_gebouw_key,
                                                           'L', alg_locatie_key,
                                                           'D', alg_district_key,
                                                           NULL)
                                                       alg_key
                                              FROM alg_v_ruimte_gegevens_all) og
                                     WHERE     pw.prs_perslid_key = p_prs_key
                                           AND pw.prs_werkplek_key = wp.prs_werkplek_key
                                           AND wp.prs_alg_ruimte_key = og.alg_ruimte_key
                                           AND (og.alg_key = v_alg_key OR p_alg_type = 'A'));
            END IF;

            -- Persoon krijgt wp op de meegegeven ruimte.
            IF p_ruimte_key IS NOT NULL
            THEN
                -- Bepalen vrije werkplek (kan alleen igv expliciete werkplekken).
                IF fac.getsetting ('prs_werkplek_implicit') = '0'                                --expliciet
                THEN
                    SELECT MIN (wp.prs_werkplek_key)
                      INTO v_wp_key
                      FROM prs_werkplek wp
                     WHERE wp.prs_alg_ruimte_key = p_ruimte_key
                           AND wp.prs_werkplek_virtueel = p_virtual
                           AND wp.prs_werkplek_type = 0  -- alleen vaste plekken
                           AND NOT EXISTS (SELECT 1
                                             FROM prs_perslidwerkplek pw
                                            WHERE pw.prs_werkplek_key = wp.prs_werkplek_key);
                END IF;

                IF v_wp_key IS NULL
                THEN
                    -- Er is geen vrije (kan ook omdat we impliciet zijn), maak dan een nieuwe vrije werkplek.
                    SELECT MIN (ll) eerstvrije
                      INTO v_wp_volgnr
                      FROM (    SELECT   LEVEL ll
                                  FROM   DUAL
                            CONNECT BY   LEVEL <= 9999
                            MINUS
                            SELECT   prs_werkplek_volgnr
                              FROM   prs_werkplek
                             WHERE   prs_alg_ruimte_key = p_ruimte_key);

                    SELECT alg_ruimte_nr
                      INTO v_ruimte_nr
                      FROM alg_ruimte
                     WHERE alg_ruimte_key = p_ruimte_key;

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

                    -- Toevoegen nieuwe werkplek in meegegeven ruimte.
                    INSERT INTO prs_werkplek (prs_werkplek_volgnr,
                                              prs_werkplek_omschrijving,
                                              prs_alg_ruimte_key,
                                              prs_werkplek_type,
                                              prs_werkplek_virtueel)
                        VALUES (v_wp_volgnr, v_wp_oms, p_ruimte_key, 0, p_virtual)
                     RETURNING prs_werkplek_key
                          INTO v_wp_key;
                END IF;

                -- Koppelen persoon aan de (nieuwe of bestaande) vrije werkplek
                INSERT INTO prs_perslidwerkplek (prs_perslid_key,
                                                 prs_werkplek_key,
                                                 prs_perslidwerkplek_bezetting)
                    VALUES (p_prs_key, v_wp_key, 100);
            END IF;
        END IF;
    END;

  -- Procedure om op een standaard wijze de import tabel voor personen te vullen
  --     p_import_key
  --     p_seq_of_columns   string met puntkomma gescheiden reeks van kolomnummers waar onderstaande kolom
  --                        in het import bestand gevonden kan worden.
  --
  --                        Naar analogie met de factuur import.
  --                        v_seq_of_columns ListOfInteger := (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 .....,46);
  --                        Het getal op een bepaalde postitie geeft aan in welke kolom dit veld in de csv staat
  --                        Voorbeeld: Als de derde waarde een 8 bevat betekent dit dat de verdieping volgnummer in kolom 8 van de csv staat.
  --
  --                        Dus dan maar via een string, en ook op slimme wijze, nl alsof het een ingelezen perslid-record is met p_fielddelimitor
  --
  --                        Afwijkingen op deze volgorde zijn in eigen cust_import_perslid te regelen.
  --
  --                        Als locatiecode en gebouwcode b.v. zijn omgedraaid in het CSV-formaat,
  --                        dan perslid import ListOfInteger := (2,1,3,4,5,6,7,8,9,10,11,12);
  --                        v_seq_of_columns := '2;1;3;4;5;6;7;8;9;10;11;12';
  --
  --                        Als locatiecode NIET in CSV staat, dan perslid import ListOfInteger := (0,2,3,4,5,6,7,8,9,10,11,12);
  --                        v_seq_of_columns := '0;2;3;4;5;6;7;8;9;10;11;12';
  --                        M.a.w. waar een 0 staat, wordt de variabele niet ingelezen en blijft LEEG.
  --
  --     p_header           header waarop gecontroleerd moet worden. Indien null dan wordt er niet op een header gecontroleerd.
  --                        Het is mogelijk om wildcards in de string op te geven.
  -- Standaard volgorde van de kolommen in het CSV-formaat)
  -- Variabelelijst
  -- v_alg_locatie_code 1
  -- v_alg_gebouw_code 2
  -- v_alg_verdieping_volgnr 3
  -- v_alg_ruimte_nr 4
  -- v_prs_werkplek_volgnr 5
  -- v_prs_werkplek_omschrijving 6
  -- v_prs_afdeling_naam 7
  -- v_prs_perslid_naam 8
  -- v_prs_perslid_tussenvoegsel 9
  -- v_prs_perslid_voornaam 10
  -- v_prs_perslid_voorletters 11
  -- v_prs_perslid_partner_naam 12
  -- v_prs_perslid_partner_tussenv 13
  -- v_prs_naamgebruik_code 14             0 (default) perslid_naam en perslid_tussenvoegsel worden gebruikt
  --                                       1 personen die de geboortenaam van de partner icm de eigen naam willen gebruiken
  --                                       2 personen die de geboortenaam van de partner willen gebruiken
  --                                       3 personen die de eigen naam icm de geboortenaam van de partner willen gebruiken
  -- v_prs_perslid_geslacht 15             Gebruik 'man', 'm' of 1 voor man en 'vrouw', 'v' of 0 voor vrouw case insensitive geen default
  -- v_prs_perslid_telefoonnr 16
  -- v_prs_perslid_mobiel 17
  -- v_prs_perslid_email 18
  -- v_prs_perslid_dienstverband 19
  -- v_prs_perslid_nr 20
  -- v_prs_srtperslid_omschrijving 21
  -- v_prs_perslid_oslogin 22
  -- v_prs_perslid_wachtwoord 23
  -- v_prs_perslid_titel 24
  -- v_prs_perslid_apikey 25
  -- v_dummy 26
  -- v_prs_kenmerk1 27
  -- v_prs_kenmerk2 28
  -- v_prs_kenmerk3 29
  -- v_prs_kenmerk4 30
  -- v_prs_kenmerk5 31
  -- v_prs_kenmerk6 32
  -- v_prs_kenmerk7 33
  -- v_prs_kenmerk8 34
  -- v_prs_kenmerk9 35
  -- v_prs_kenmerk10 36
  -- v_prs_kenmerk11 37
  -- v_prs_kenmerk12 38
  -- v_prs_kenmerk13 39
  -- v_prs_kenmerk14 40
  -- v_prs_kenmerk15 41
  -- v_prs_kenmerk16 42
  -- v_prs_kenmerk17 43
  -- v_prs_kenmerk18 44
  -- v_prs_kenmerk19 45
  -- v_prs_kenmerk20 46
  PROCEDURE import_perslid (
     p_import_key       IN NUMBER,
     p_seq_of_columns   IN VARCHAR2,
     p_header           IN VARCHAR2)
  AS
     v_newline                       fac_imp_file.fac_imp_file_line%TYPE; -- Input line
     v_field                         VARCHAR2 (100);
     v_fielddelimitor                VARCHAR2 (1);
     v_aanduiding                    VARCHAR2 (400);
     v_errormsg                      VARCHAR (200);
     v_errorhint                     VARCHAR2 (200);
     v_count                         NUMBER (10) := 0;
     v_count_tot                     NUMBER (10) := 0;
     v_count_import                  NUMBER (10) := 0;
     v_index                         NUMBER (10);
     v_ongeldig                      NUMBER (10);
     v_header_is_valid               NUMBER (1) := 0;
     oracle_err_num                  NUMBER;
     oracle_err_mes                  VARCHAR2 (200);

     -- De importvelden
     v_empty                         VARCHAR2 (100);
     v_alg_locatie_code              VARCHAR2 (256);
     v_alg_gebouw_code               VARCHAR2 (256);
     v_alg_verdieping_volgnr         VARCHAR2 (256);
     v_alg_ruimte_nr                 VARCHAR2 (256);
     v_prs_werkplek_volgnr           VARCHAR2 (256);
     v_prs_werkplek_omschrijving     VARCHAR2 (256);
     v_prs_afdeling_naam             VARCHAR2 (256);
     v_prs_perslid_naam              VARCHAR2 (256);
     v_prs_perslid_tussenvoegsel     VARCHAR2 (256);
     v_prs_perslid_voornaam          VARCHAR2 (256);
     v_prs_perslid_voorletters       VARCHAR2 (256);
     v_prs_perslid_partner_naam      VARCHAR2 (256);
     v_prs_perslid_partner_tussenv   VARCHAR2 (256);
     v_prs_naamgebruik_code          VARCHAR2 (256);
     v_prs_perslid_geslacht          VARCHAR2 (256);
     v_prs_perslid_telefoonnr        VARCHAR2 (256);
     v_prs_perslid_mobiel            VARCHAR2 (256);
     v_prs_perslid_email             VARCHAR2 (256);
     v_prs_perslid_dienstverband     VARCHAR2 (256);
     v_prs_perslid_nr                VARCHAR2 (256);
     v_prs_srtperslid_omschrijving   VARCHAR2 (256);
     v_prs_perslid_titel             VARCHAR2 (256);
     v_prs_perslid_oslogin           VARCHAR2 (256);
     v_prs_perslid_wachtwoord        VARCHAR2 (256);
     v_prs_perslid_apikey            VARCHAR2 (256);
     v_prs_kenmerk1                  VARCHAR2 (256);
     v_prs_kenmerk2                  VARCHAR2 (256);
     v_prs_kenmerk3                  VARCHAR2 (256);
     v_prs_kenmerk4                  VARCHAR2 (256);
     v_prs_kenmerk5                  VARCHAR2 (256);
     v_prs_kenmerk6                  VARCHAR2 (256);
     v_prs_kenmerk7                  VARCHAR2 (256);
     v_prs_kenmerk8                  VARCHAR2 (256);
     v_prs_kenmerk9                  VARCHAR2 (256);
     v_prs_kenmerk10                 VARCHAR2 (256);
     v_prs_kenmerk11                 VARCHAR2 (256);
     v_prs_kenmerk12                 VARCHAR2 (256);
     v_prs_kenmerk13                 VARCHAR2 (256);
     v_prs_kenmerk14                 VARCHAR2 (256);
     v_prs_kenmerk15                 VARCHAR2 (256);
     v_prs_kenmerk16                 VARCHAR2 (256);
     v_prs_kenmerk17                 VARCHAR2 (256);
     v_prs_kenmerk18                 VARCHAR2 (256);
     v_prs_kenmerk19                 VARCHAR2 (256);
     v_prs_kenmerk20                 VARCHAR2 (256);
     v_alg_verdieping_volgnr_num     NUMBER;
     v_prs_werkplek_volgnr_num       NUMBER;
     v_prs_perslid_dienstv_num       NUMBER;

     v_seq_of_columns                VARCHAR2 (200);

     TYPE array_t IS VARRAY (46) OF NUMBER (10);

     v_colnr                         array_t := array_t ();

     CURSOR c
     IS
          SELECT *
            FROM fac_imp_file
           WHERE fac_import_key = p_import_key
        ORDER BY fac_imp_file_index;
  BEGIN
     // JGL: Ik zou graag een WHERE fac_import_key = p_import_key hieronder
     //      toevoegen zodat het script ook multi-user veilig is,
     //      Heel veel klant-specifieke imports(/aanvullingen) controleren
     //      echter niet op de fac_import_key en zouden flink de fout in gaan.
     //      Daarom vooralsnog hier toch maar alles verwijderen
     DELETE FROM   fac_imp_perslid;

     SELECT COALESCE (MAX (fac_imp_file_index), 0) + 1
       INTO v_count
       FROM fac_imp_factuur;

     -- Init
     v_fielddelimitor := ';';
     v_seq_of_columns := p_seq_of_columns;
     v_errorhint := 'Bepalen volgorde kolommen';

     FOR v_index IN 1 .. 46
     LOOP
        v_colnr.EXTEND;
        -- De volgorde de te importeren kolommen in de CSV uitlezen uit v_seq_of_columns
        fac.imp_getfield (v_seq_of_columns,
                          v_fielddelimitor,
                          v_colnr (v_index));
     END LOOP;

     -- Indien geen header check is opgegeven, gaan we niet op zoek naar een geldige header
     IF p_header IS NULL
     THEN
        v_header_is_valid := 1;
     END IF;

     FOR rec1 IN c
     LOOP
        BEGIN
           v_errormsg := 'Fout FETCH te importeren rij';

           v_newline := rec1.fac_imp_file_line;
           v_errormsg := '';
           v_errorhint := 'Fout opvragen te importeren rij';
           v_aanduiding := '';
           v_ongeldig := 0;

           IF v_header_is_valid = 0
           THEN
              IF UPPER (v_newline) LIKE UPPER (p_header)
              THEN
                 v_header_is_valid := 1;
              END IF;
           ELSE
              -- Lees alle veldwaarden
              v_errorhint := 'Inlezen alg_locatie_code kolom:' || v_colnr (1);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (1),
                                   v_alg_locatie_code);
              v_errorhint := 'Inlezen alg_lcoatie_code kolom:' || v_colnr (2);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (2),
                                   v_alg_gebouw_code);
              v_errorhint := 'Inlezen alg_verdieping_volgnr kolom:' || v_colnr (3);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (3),
                                   v_alg_verdieping_volgnr);
              v_errorhint := 'Inlezen alg_ruimte_nr kolom:' || v_colnr (4);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (4),
                                   v_alg_ruimte_nr);
              v_errorhint := 'Inlezen prs_werkplek_volgnr kolom:' || v_colnr (5);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (5),
                                   v_prs_werkplek_volgnr);
              v_errorhint := 'Inlezen prs_werkplek_omschrijving kolom:' || v_colnr (6);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (6),
                                   v_prs_werkplek_omschrijving);
              v_errorhint := 'Inlezen prs_afdeling_naam kolom:' || v_colnr (7);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (7),
                                   v_prs_afdeling_naam);
              v_errorhint := 'Inlezen prs_perslid_naam kolom:' || v_colnr (8);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (8),
                                   v_prs_perslid_naam);
              v_errorhint := 'Inlezen prs_perslid_tussenvoegsel kolom:' || v_colnr (9);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (9),
                                   v_prs_perslid_tussenvoegsel);
              v_errorhint := 'Inlezen prs_perslid_voornaam kolom:' || v_colnr (10);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (10),
                                   v_prs_perslid_voornaam);
              v_errorhint := 'Inlezen prs_perslid_voorletters kolom:' || v_colnr (11);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (11),
                                   v_prs_perslid_voorletters);
              v_errorhint := 'Inlezen prs_perslid_partner_naam kolom:' || v_colnr (12);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (12),
                                   v_prs_perslid_partner_naam);
              v_errorhint := 'Inlezen prs_perslid_partner_tussenv kolom:' || v_colnr (13);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (13),
                                   v_prs_perslid_partner_tussenv);
              v_errorhint := 'Inlezen prs_perslid_geslacht kolom:' || v_colnr (14);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (14),
                                   v_prs_naamgebruik_code);
              v_errorhint := 'Inlezen alg_lcoatie_code kolom:' || v_colnr (15);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (15),
                                   v_prs_perslid_geslacht);
              v_errorhint := 'Inlezen prs_perslid_telefoonnr kolom:' || v_colnr (16);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (16),
                                   v_prs_perslid_telefoonnr);
              v_errorhint := 'Inlezen prs_perslid_mobiel kolom:' || v_colnr (17);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (17),
                                   v_prs_perslid_mobiel);
              v_errorhint := 'Inlezen prs_perslid_email kolom:' || v_colnr (18);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (18),
                                   v_prs_perslid_email);
              v_errorhint := 'Inlezen prs_perslid_dienstverband kolom:' || v_colnr (19);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (19),
                                   v_prs_perslid_dienstverband);
              v_errorhint := 'Inlezen prs_perslid_nr kolom:' || v_colnr (20);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (20),
                                   v_prs_perslid_nr);
              v_errorhint := 'Inlezen prs_srtperslid_omschrijving kolom:' || v_colnr (21);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (21),
                                   v_prs_srtperslid_omschrijving);
              v_errorhint := 'Inlezen prs_perslid_oslogin kolom:' || v_colnr (22);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (22),
                                   v_prs_perslid_oslogin);
              v_errorhint := 'Inlezen prs_perslid_wachtwoord kolom:' || v_colnr (23);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (23),
                                   v_prs_perslid_wachtwoord);
              v_errorhint := 'Inlezen prs_perslid_titel kolom:' || v_colnr (24);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (24),
                                   v_prs_perslid_titel);
              v_errorhint := 'Inlezen prs_perslid_apikey kolom:' || v_colnr (25);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (25),
                                   v_prs_perslid_apikey);
              v_errorhint := 'Inlezen prs_kenmerk1 kolom:' || v_colnr (27);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (27),
                                   v_prs_kenmerk1);
              v_errorhint := 'Inlezen prs_kenmerk2 kolom:' || v_colnr (28);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (28),
                                   v_prs_kenmerk2);
              v_errorhint := 'Inlezen prs_kenmerk3 kolom:' || v_colnr (29);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (29),
                                   v_prs_kenmerk3);
              v_errorhint := 'Inlezen prs_kenmerk4 kolom:' || v_colnr (30);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (30),
                                   v_prs_kenmerk4);
              v_errorhint := 'Inlezen prs_kenmerk5 kolom:' || v_colnr (31);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (31),
                                   v_prs_kenmerk5);
              v_errorhint := 'Inlezen prs_kenmerk6 kolom:' || v_colnr (32);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (32),
                                   v_prs_kenmerk6);
              v_errorhint := 'Inlezen prs_kenmerk7 kolom:' || v_colnr (33);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (33),
                                   v_prs_kenmerk7);
              v_errorhint := 'Inlezen prs_kenmerk8 kolom:' || v_colnr (34);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (34),
                                   v_prs_kenmerk8);
              v_errorhint := 'Inlezen prs_kenmerk9 kolom:' || v_colnr (35);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (35),
                                   v_prs_kenmerk9);
              v_errorhint := 'Inlezen prs_kenmerk10 kolom:' || v_colnr (36);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (36),
                                   v_prs_kenmerk10);
              v_errorhint := 'Inlezen prs_kenmerk11 kolom:' || v_colnr (37);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (37),
                                   v_prs_kenmerk11);
              v_errorhint := 'Inlezen prs_kenmerk12 kolom:' || v_colnr (38);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (38),
                                   v_prs_kenmerk12);
              v_errorhint := 'Inlezen prs_kenmerk13 kolom:' || v_colnr (39);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (39),
                                   v_prs_kenmerk13);
              v_errorhint := 'Inlezen prs_kenmerk14 kolom:' || v_colnr (40);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (40),
                                   v_prs_kenmerk14);
              v_errorhint := 'Inlezen prs_kenmerk15 kolom:' || v_colnr (41);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (41),
                                   v_prs_kenmerk15);
              v_errorhint := 'Inlezen prs_kenmerk16 kolom:' || v_colnr (42);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (42),
                                   v_prs_kenmerk16);
              v_errorhint := 'Inlezen prs_kenmerk17 kolom:' || v_colnr (43);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (43),
                                   v_prs_kenmerk17);
              v_errorhint := 'Inlezen prs_kenmerk18 kolom:' || v_colnr (44);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (44),
                                   v_prs_kenmerk18);
              v_errorhint := 'Inlezen prs_kenmerk19 kolom:' || v_colnr (45);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (45),
                                   v_prs_kenmerk19);
              v_errorhint := 'Inlezen prs_kenmerk20 kolom:' || v_colnr (46);
              fac.imp_getfield_nr (v_newline,
                                   v_fielddelimitor,
                                   v_colnr (46),
                                   v_prs_kenmerk20);

              v_aanduiding :=
                 v_prs_perslid_naam || '|' || v_prs_perslid_voornaam || '| ';

              v_count_tot := v_count_tot + 1;
              v_errorhint := 'Ongeldige locatiecode';
              v_alg_locatie_code := TRIM (v_alg_locatie_code);

              IF LENGTH (v_alg_locatie_code) > 10
              THEN
                 v_alg_locatie_code := SUBSTR (v_alg_locatie_code, 1, 10);
                 fac.imp_writelog (
                    p_import_key,
                    'W',
                    v_aanduiding || 'Locatie-aanduiding is te lang',
                       'Aanduiding wordt afgebroken tot ['
                    || v_alg_locatie_code
                    || ']');
              END IF;

              --
              v_errorhint := 'Ongeldige gebouw code';
              v_alg_gebouw_code := TRIM (v_alg_gebouw_code);

              IF LENGTH (v_alg_gebouw_code) > 12
              THEN
                 v_alg_gebouw_code := SUBSTR (v_alg_gebouw_code, 1, 12);
                 fac.imp_writelog (
                    p_import_key,
                    'W',
                    v_aanduiding || 'Gebouw-aanduiding is te lang',
                       'Aanduiding wordt afgebroken tot ['
                    || v_alg_gebouw_code
                    || ']');
              END IF;

              --
              v_errorhint := 'Ongeldig verdieping volgnummer';
              v_alg_verdieping_volgnr := TRIM (v_alg_verdieping_volgnr);

              IF (v_alg_verdieping_volgnr IS NULL)
              THEN
                 v_alg_verdieping_volgnr_num :=
                    TO_NUMBER (v_alg_verdieping_volgnr);
              ELSE
                 BEGIN
                    v_alg_verdieping_volgnr_num :=
                       TO_NUMBER (v_alg_verdieping_volgnr);
                 EXCEPTION
                    WHEN OTHERS
                    THEN
                       v_ongeldig := 1;
                       oracle_err_num := SQLCODE;
                       oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                       v_errormsg :=
                          'Error ' || oracle_err_num || '/' || oracle_err_mes;
                       fac.imp_writelog (p_import_key,
                                         'E',
                                         v_aanduiding || v_errormsg,
                                         v_errorhint);
                 END;
              END IF;

              --
              v_errorhint := 'Ongeldige ruimte nr';
              v_alg_ruimte_nr := TRIM (v_alg_ruimte_nr);

              IF LENGTH (v_alg_ruimte_nr) > 10
              THEN
                 v_alg_ruimte_nr := SUBSTR (v_alg_ruimte_nr, 1, 10);
                 fac.imp_writelog (
                    p_import_key,
                    'W',
                    v_aanduiding || 'Ruimtenr-aanduiding is te lang',
                       'Aanduiding wordt afgebroken tot ['
                    || v_alg_ruimte_nr
                    || ']');
              END IF;

              --
              v_errorhint := 'Ongeldig werkplek volgnummer';
              v_prs_werkplek_volgnr := TRIM (v_prs_werkplek_volgnr);

              IF (v_prs_werkplek_volgnr IS NULL)
              THEN
                 v_prs_werkplek_volgnr_num := TO_NUMBER (v_prs_werkplek_volgnr);
              ELSE
                 BEGIN
                    v_alg_verdieping_volgnr_num :=
                       TO_NUMBER (v_alg_verdieping_volgnr);
                 EXCEPTION
                    WHEN OTHERS
                    THEN
                       v_ongeldig := 1;
                       oracle_err_num := SQLCODE;
                       oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                       v_errormsg :=
                          'Error ' || oracle_err_num || '/' || oracle_err_mes;
                       fac.imp_writelog (p_import_key,
                                         'E',
                                         v_aanduiding || v_errormsg,
                                         v_errorhint);
                 END;
              END IF;

              --
              v_errorhint := 'Ongeldige werkplek omschrijving';
              v_prs_werkplek_omschrijving := TRIM (v_prs_werkplek_omschrijving);

              IF LENGTH (v_prs_werkplek_omschrijving) > 30
              THEN
                 v_prs_werkplek_omschrijving :=
                    SUBSTR (v_prs_werkplek_omschrijving, 1, 30);
                 fac.imp_writelog (
                    p_import_key,
                    'W',
                    v_aanduiding || 'Werkplek-aanduiding is te lang',
                       'Aanduiding wordt afgebroken tot ['
                    || v_prs_werkplek_omschrijving
                    || ']');
              END IF;

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

              IF LENGTH (v_prs_afdeling_naam) > 15
              THEN
                 v_prs_afdeling_naam := SUBSTR (v_prs_afdeling_naam, 1, 15);
                 fac.imp_writelog (
                    p_import_key,
                    'W',
                    v_aanduiding || 'Afdelingscode is te lang',
                       'Aanduiding wordt afgebroken tot ['
                    || v_prs_afdeling_naam
                    || ']');
              ELSE
                 IF (v_prs_afdeling_naam IS NULL)
                 THEN
                    v_ongeldig := 1;
                    fac.imp_writelog (p_import_key,
                                      'E',
                                      v_aanduiding || 'Afdelingscode onbekend',
                                      'Afdelingscode moet worden opgegeven');
                 END IF;
              END IF;

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

              IF LENGTH (v_prs_perslid_naam) > 60
              THEN
                 v_prs_perslid_naam := SUBSTR (v_prs_perslid_naam, 1, 60);
                 fac.imp_writelog (
                    p_import_key,
                    'W',
                    v_aanduiding || 'Naam persoon is te lang',
                       'Aanduiding wordt afgebroken tot ['
                    || v_prs_perslid_naam
                    || ']');
              ELSE
                 IF (v_prs_perslid_naam IS NULL)
                 THEN
                    v_ongeldig := 1;
                    fac.imp_writelog (p_import_key,
                                      'E',
                                      v_aanduiding || 'Naam persoon onbekend',
                                      'Naam persoon moet worden opgegeven');
                 END IF;
              END IF;

              --
              v_errorhint := 'Ongeldige tussenvoegsel persoon';
              v_prs_perslid_tussenvoegsel := TRIM (v_prs_perslid_tussenvoegsel);

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

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

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

              --
              v_errorhint := 'Voornaam persoon';
              v_prs_perslid_voornaam := TRIM (v_prs_perslid_voornaam);

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

              v_errorhint := 'Ongeldige partnernaam persoon';
              v_prs_perslid_partner_naam := TRIM (v_prs_perslid_partner_naam);

              --
              IF LENGTH (v_prs_perslid_partner_naam) > 60
              THEN
                 v_prs_perslid_partner_naam := SUBSTR (v_prs_perslid_partner_naam, 1, 60);
                 fac.imp_writelog (
                    p_import_key,
                    'W',
                    v_aanduiding || 'Partnernaam is te lang',
                       'Aanduiding wordt afgebroken tot ['
                    || v_prs_perslid_partner_naam
                    || ']');
              END IF;

              --
              v_errorhint := 'Ongeldige tussenvoegsel partner';
              v_prs_perslid_partner_tussenv := TRIM (v_prs_perslid_partner_tussenv);

              IF LENGTH (v_prs_perslid_partner_tussenv) > 10
              THEN
                 v_prs_perslid_partner_tussenv :=
                    SUBSTR (v_prs_perslid_partner_tussenv, 1, 10);
                 fac.imp_writelog (
                    p_import_key,
                    'W',
                    v_aanduiding || 'Tussenvoegsel partner is te lang',
                       'Aanduiding wordt afgebroken tot ['
                    || v_prs_perslid_partner_tussenv
                    || ']');
              END IF;

              --
              v_errorhint := 'Ongeldig geslacht';
              v_prs_perslid_geslacht := TRIM (v_prs_perslid_geslacht);

              IF LENGTH (v_prs_perslid_geslacht) > 1
              THEN
                 SELECT DECODE(UPPER(v_prs_perslid_geslacht), 'MAN', '1', 'VROUW', '0', NULL)
                   INTO v_prs_perslid_geslacht
                   FROM DUAL;
              ELSE
                 IF fac.safe_to_number(v_prs_perslid_geslacht) IS NULL
                 THEN
                    SELECT DECODE(UPPER(v_prs_perslid_geslacht), 'M', '1', 'V', '0', NULL)
                      INTO v_prs_perslid_geslacht
                      FROM DUAL;
                 END IF;
              END IF;

              --
              v_errorhint := 'Ongeldig dienstverband';
              v_prs_perslid_dienstverband := TRIM (v_prs_perslid_dienstverband);

              IF (v_prs_perslid_dienstverband IS NOT NULL)
              THEN
                 BEGIN
                    v_prs_perslid_dienstv_num :=
                       TO_NUMBER (v_prs_perslid_dienstverband);
                 EXCEPTION
                    WHEN OTHERS
                    THEN
                       v_ongeldig := 1;
                       oracle_err_num := SQLCODE;
                       oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                       v_errormsg :=
                          'Error ' || oracle_err_num || '/' || oracle_err_mes;
                       fac.imp_writelog (p_import_key,
                                         'E',
                                         v_aanduiding || v_errormsg,
                                         v_errorhint);
                 END;
              END IF;

              --
              v_errorhint := 'Ongeldige titel persoon';
              v_prs_perslid_titel := TRIM (v_prs_perslid_titel);

              IF LENGTH (v_prs_perslid_titel) > 15
              THEN
                 v_prs_perslid_titel := SUBSTR (v_prs_perslid_titel, 1, 15);
                 fac.imp_writelog (
                    p_import_key,
                    'W',
                    v_aanduiding || 'Titel persoon is te lang',
                       'Aanduiding wordt afgebroken tot ['
                    || v_prs_perslid_titel
                    || ']');
              END IF;

              --
              v_errorhint := 'Ongeldige telefoonnr. persoon';
              v_prs_perslid_telefoonnr := TRIM (v_prs_perslid_telefoonnr);

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

              --
              v_errorhint := 'Ongeldige mobielnr. persoon';
              v_prs_perslid_mobiel := TRIM (v_prs_perslid_mobiel);

              IF LENGTH (v_prs_perslid_mobiel) > 15
              THEN
                 v_prs_perslid_mobiel := SUBSTR (v_prs_perslid_mobiel, 1, 15);
                 fac.imp_writelog (
                    p_import_key,
                    'W',
                    v_aanduiding || 'Mobielnr. persoon is te lang',
                       'Aanduiding wordt afgebroken tot ['
                    || v_prs_perslid_mobiel
                    || ']');
              END IF;

              --
              v_errorhint := 'Ongeldige email persoon';
              v_prs_perslid_email := TRIM (v_prs_perslid_email);

              IF LENGTH (v_prs_perslid_email) > 200
              THEN
                 v_prs_perslid_email := SUBSTR (v_prs_perslid_email, 1, 200);
                 fac.imp_writelog (
                    p_import_key,
                    'W',
                    v_aanduiding || 'Email persoon is te lang',
                       'Aanduiding wordt afgebroken tot ['
                    || v_prs_perslid_email
                    || ']');
              END IF;

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

              IF LENGTH (v_prs_srtperslid_omschrijving) > 60
              THEN
                 v_prs_srtperslid_omschrijving :=
                    SUBSTR (v_prs_srtperslid_omschrijving, 1, 60);
                 fac.imp_writelog (
                    p_import_key,
                    'W',
                    v_aanduiding || 'Functie-aanduiding persoon is te lang',
                       'Aanduiding wordt afgebroken tot ['
                    || v_prs_srtperslid_omschrijving
                    || ']');
              ELSE
                 IF (v_prs_srtperslid_omschrijving IS NULL)
                 THEN
                    v_ongeldig := 1;
                    fac.imp_writelog (
                       p_import_key,
                       'E',
                       v_aanduiding || 'Functie persoon onbekend',
                       'Functie persoon moet worden opgegeven');
                 END IF;
              END IF;

              --
              v_errorhint := 'Ongeldige persoonnr.';
              v_prs_perslid_nr := TRIM (v_prs_perslid_nr);

              IF LENGTH (v_prs_perslid_nr) > 16
              THEN
                 v_prs_perslid_nr := SUBSTR (v_prs_perslid_nr, 1, 16);
                 fac.imp_writelog (
                    p_import_key,
                    'W',
                    v_aanduiding || 'Persoonnr. persoon is te lang',
                       'Aanduiding wordt afgebroken tot ['
                    || v_prs_perslid_nr
                    || ']');
              END IF;

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

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

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

              --
              -- Insert geformatteerde import record
              IF v_ongeldig = 0
              THEN
                 v_errorhint := 'Toevoegen record';
                 v_errormsg :=
                       'Fout bij toevoegen te impoteren bedrijf/afdeling ['
                    || v_prs_afdeling_naam
                    || ']';

                 INSERT INTO fac_imp_perslid (alg_locatie_code,
                                              alg_gebouw_code,
                                              alg_verdieping_volgnr,
                                              alg_ruimte_nr,
                                              prs_werkplek_volgnr,
                                              prs_werkplek_omschrijving,
                                              prs_afdeling_naam,
                                              prs_perslid_naam,
                                              prs_perslid_tussenvoegsel,
                                              prs_perslid_voornaam,
                                              prs_perslid_voorletters,
                                              prs_perslid_partner_naam,
                                              prs_perslid_partner_tussenv,
                                              prs_perslid_naamgebruik_code,
                                              prs_perslid_geslacht,
                                              prs_perslid_telefoonnr,
                                              prs_perslid_mobiel,
                                              prs_perslid_email,
                                              prs_perslid_dienstverband,
                                              prs_perslid_nr,
                                              prs_srtperslid_omschrijving,
                                              prs_perslid_oslogin,
                                              prs_perslid_wachtwoord,
                                              prs_perslid_titel,
                                              prs_perslid_apikey,
                                              prs_kenmerk1,
                                              prs_kenmerk2,
                                              prs_kenmerk3,
                                              prs_kenmerk4,
                                              prs_kenmerk5,
                                              prs_kenmerk6,
                                              prs_kenmerk7,
                                              prs_kenmerk8,
                                              prs_kenmerk9,
                                              prs_kenmerk10,
                                              prs_kenmerk11,
                                              prs_kenmerk12,
                                              prs_kenmerk13,
                                              prs_kenmerk14,
                                              prs_kenmerk15,
                                              prs_kenmerk16,
                                              prs_kenmerk17,
                                              prs_kenmerk18,
                                              prs_kenmerk19,
                                              prs_kenmerk20,
                                              fac_import_key,
                                              fac_imp_file_index)
                     VALUES (v_alg_locatie_code,
                             v_alg_gebouw_code,
                             v_alg_verdieping_volgnr,
                             v_alg_ruimte_nr,
                             v_prs_werkplek_volgnr,
                             v_prs_werkplek_omschrijving,
                             v_prs_afdeling_naam,
                             v_prs_perslid_naam,
                             v_prs_perslid_tussenvoegsel,
                             v_prs_perslid_voornaam,
                             v_prs_perslid_voorletters,
                             v_prs_perslid_partner_naam,
                             v_prs_perslid_partner_tussenv,
                             COALESCE(fac.safe_to_number(v_prs_naamgebruik_code), 0),
                             v_prs_perslid_geslacht,
                             v_prs_perslid_telefoonnr,
                             v_prs_perslid_mobiel,
                             v_prs_perslid_email,
                             v_prs_perslid_dienstverband,
                             v_prs_perslid_nr,
                             v_prs_srtperslid_omschrijving,
                             v_prs_perslid_oslogin,
                             v_prs_perslid_wachtwoord,
                             v_prs_perslid_titel,
                             v_prs_perslid_apikey,
                             v_prs_kenmerk1,
                             v_prs_kenmerk2,
                             v_prs_kenmerk3,
                             v_prs_kenmerk4,
                             v_prs_kenmerk5,
                             v_prs_kenmerk6,
                             v_prs_kenmerk7,
                             v_prs_kenmerk8,
                             v_prs_kenmerk9,
                             v_prs_kenmerk10,
                             v_prs_kenmerk11,
                             v_prs_kenmerk12,
                             v_prs_kenmerk13,
                             v_prs_kenmerk14,
                             v_prs_kenmerk15,
                             v_prs_kenmerk16,
                             v_prs_kenmerk17,
                             v_prs_kenmerk18,
                             v_prs_kenmerk19,
                             v_prs_kenmerk20,
                             rec1.fac_import_key,
                             rec1.fac_imp_file_index);

                 v_count_import := v_count_import + 1;
              END IF;
           END IF;
        END;
     END LOOP;

     IF v_header_is_valid = 0
     THEN
        fac.imp_writelog (p_import_key,
                          'E',
                          v_aanduiding || 'Ongeldig importbestand',
                          'Geen geldige headerregel aanwezig');
     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 := 'Error ' || oracle_err_num || '/' || oracle_err_mes;
        fac.imp_writelog (p_import_key,
                          'E',
                          v_aanduiding || v_errormsg,
                          v_errorhint);
  END;

  -- Procedure om generiek personen in te lezen of aan te passen.
  -- p_sleutelkolom    Bevat het veld die als sleutel bij de import dient.
  --                     NR     - personeelsnummer
  --                     EMAIL  - emailadres
  --                     LOGIN  - logincode
  --                     APIKEY - API-key voor distributie van persoonsgegevens over FACILITORs
  -- p_alg_type        Werkplekken binnen dit niveau verwijderen
  --                     NULL      - geen werkplekken verwijderen
  --                     A         - altijd vaste werkplek verwijderen
  --                     R,V,G,L,D - werkplek(en) op dit niveau verwijderen
  PROCEDURE update_perslid (p_import_key         IN NUMBER,
                            p_sleutelkolom       IN VARCHAR2,
                            p_alg_type           IN VARCHAR2)
  IS
     c_fielddelimitor   VARCHAR2 (1) := ';';

     v_errormsg         VARCHAR2 (1000);
     v_errorhint        VARCHAR2 (1000);
     oracle_err_num     NUMBER;
     oracle_err_mes     VARCHAR2 (200);
     v_aanduiding       VARCHAR2 (200);

     v_count            NUMBER (10);
     v_ongeldig         NUMBER (1);
     v_count_update     NUMBER (10);
     v_count_error      NUMBER (10);
     v_count_tot        NUMBER (10);
     v_wpcount_error    NUMBER (10);

     --
     v_perslid_key      NUMBER (10);
     v_afdeling_key     NUMBER (10);
     v_srtperslid_key   NUMBER (10);
     v_prs_perslid_naam VARCHAR2(200);
     v_prs_perslid_tussenvoegsel VARCHAR2(200);

     v_locatie_key      NUMBER (10);
     v_gebouw_key       NUMBER (10);
     v_verdieping_key   NUMBER (10);
     v_ruimte_key       NUMBER (10);
     v_space            VARCHAR2(1);


     CURSOR cSPERSLID
     IS
          SELECT MIN (prs_srtperslid_omschrijving) prs_srtperslid_omschrijving
            FROM fac_imp_perslid i
           WHERE NOT EXISTS
                    (SELECT prs_srtperslid_key
                       FROM prs_srtperslid sp
                      WHERE UPPER (sp.prs_srtperslid_omschrijving) =
                               UPPER (i.prs_srtperslid_omschrijving))
        GROUP BY UPPER (prs_srtperslid_omschrijving);

     recSPersLid        cSPersLid%ROWTYPE;

     CURSOR cPERSLID
     IS
        SELECT * FROM fac_imp_perslid;

     recPersLid         cPersLid%ROWTYPE;
  BEGIN

     v_count_update := 0;
     v_count_tot := 0;
     v_count_error := 0;
     v_wpcount_error := 0;

     FOR recSPersLid IN cSPersLid
     LOOP
        BEGIN
           v_aanduiding := '';
           v_errormsg := '';
           v_errorhint := '';
           v_count_tot := v_count_tot + 1;

           v_aanduiding := recSPersLid.PRS_SRTPERSLID_OMSCHRIJVING;

           v_errorhint := 'Fout bij toevoegen functie';

           INSERT INTO prs_srtperslid (prs_srtperslid_omschrijving)
               VALUES (recSPersLid.prs_srtperslid_omschrijving);

           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 :=
                    ' (ORACLE error number = <'
                 || ORACLE_err_num
                 || '> ORACLE error message = <'
                 || ORACLE_err_mes
                 || '>)';

              fac.imp_writelog (p_import_key,
                                'E',
                                v_aanduiding || v_errormsg,
                                v_errorhint);

              COMMIT;                                          -- tbv logging
        END;
     END LOOP;

     fac.imp_writelog (
        p_import_key,
        'S',
        'Personeelsfunctie: toegevoegde regels zonder foutmelding: '
        || TO_CHAR (v_count_tot - v_count_error),
        '');

     fac.imp_writelog (
        p_import_key,
        'S',
        'Personeelsfunctie: toegevoegde regels met foutmelding: '
        || TO_CHAR (v_count_error),
        '');
     COMMIT;                                                       -- logging


     v_count_update := 0;
     v_count_tot := 0;
     v_count_error := 0;

     FOR recPersLid IN cPersLid
     LOOP
        BEGIN
           v_aanduiding := '';
           v_errormsg := '';
           v_errorhint := '';
           v_count_tot := v_count_tot + 1;

           v_aanduiding :=
                 recPersLid.prs_perslid_naam
              || '|'
              || recPersLid.prs_perslid_voornaam
              || '| ';
           v_errormsg := '';

           v_errorhint := 'Fout bij bepalen functie';

           SELECT prs_srtperslid_key
             INTO v_srtperslid_key
             FROM prs_srtperslid
            WHERE prs_srtperslid_verwijder IS NULL
                  AND UPPER (prs_srtperslid_omschrijving) =
                      UPPER (recPersLid.prs_srtperslid_omschrijving);

           v_errorhint :=
                 'Afdeling niet gevonden ['
              || recPersLid.prs_afdeling_naam
              || ']';

           SELECT a.prs_afdeling_key
             INTO v_afdeling_key
             FROM prs_v_aanwezigafdeling_boom b, prs_afdeling a
            WHERE UPPER (a.prs_afdeling_naam) = UPPER (recPersLid.prs_afdeling_naam)
              AND a.prs_afdeling_verwijder IS NULL
              AND a.prs_afdeling_key = b.prs_afdeling_key;

           v_space := '';
           -- kijk hoe we met partnernamen moeten omgaan:
           IF recPersLid.prs_perslid_naamgebruik_code = 0
           THEN
              -- normaal gebruik van naam. Eigen naam wordt gebruikt
              v_prs_perslid_naam := recPersLid.prs_perslid_naam;
              v_prs_perslid_tussenvoegsel := recPersLid.prs_perslid_tussenvoegsel;
           ELSIF recPersLid.prs_perslid_naamgebruik_code = 1
           THEN
              -- personen die de geboortenaam van de partner icm de eigen naam willen gebruiken
              IF recPersLid.prs_perslid_tussenvoegsel IS NOT NULL
              THEN
                 v_space := ' ';
              END IF;
              v_prs_perslid_naam := recPersLid.prs_perslid_partner_naam || ' - ' || recPersLid.prs_perslid_tussenvoegsel || v_space || recPersLid.prs_perslid_naam;
              v_prs_perslid_tussenvoegsel := recPersLid.prs_perslid_partner_tussenv;
           ELSIF recPersLid.prs_perslid_naamgebruik_code = 2
           THEN
              -- personen die de geboortenaam van de partner willen gebruiken
              v_prs_perslid_naam := recPersLid.prs_perslid_partner_naam;
              v_prs_perslid_tussenvoegsel := recPersLid.prs_perslid_partner_tussenv;
           ELSIF recPersLid.prs_perslid_naamgebruik_code = 3
           THEN
              -- personen die de eigen naam icm de geboortenaam van de partner willen gebruiken
              IF recPersLid.prs_perslid_partner_tussenv IS NOT NULL
              THEN
                 v_space := ' ';
              END IF;
              v_prs_perslid_naam := recPersLid.prs_perslid_naam || ' - ' || recPersLid.prs_perslid_partner_tussenv || v_space || recPersLid.prs_perslid_partner_naam;
              v_prs_perslid_tussenvoegsel := recPersLid.prs_perslid_tussenvoegsel;
           END IF;

           IF length(v_prs_perslid_naam) > 60
           THEN
              v_prs_perslid_naam := SUBSTR(v_prs_perslid_naam, 1,60);
              fac.imp_writelog (
                   p_import_key,
                   'W',
                   recPersLid.prs_perslid_naam || '|' || recPersLid.prs_perslid_voornaam || '| ' || 'Samengestelde achternaam is te lang',
                    'Aanduiding wordt afgebroken tot ['
                 || v_prs_perslid_naam
                 || ']');
           END IF;

           -- p_sleutelkolom
           --   NR     = prs_perslid_nr
           --   EMAIL  = prs_perslid_email
           --   LOGIN  = prs_perslid_oslogin
           --   APIKEY = prs_perslid_apikey
           v_errorhint := 'Kijken of de persoon al bestaat';

           SELECT MAX (prs_perslid_key), COUNT ( * )
             INTO v_perslid_key, v_count
             FROM prs_perslid
            WHERE prs_perslid_verwijder IS NULL
                  AND ( (p_sleutelkolom IS NULL
                         AND UPPER (prs_perslid_naam) =
                               UPPER (recPersLid.prs_perslid_naam)
                         AND UPPER (prs_perslid_voornaam) =
                               UPPER (recPersLid.prs_perslid_voornaam))
                       OR (UPPER (p_sleutelkolom) = 'NR'
                           AND UPPER (prs_perslid_nr) =
                                 UPPER (recPersLid.prs_perslid_nr)
                           OR UPPER (p_sleutelkolom) = 'EMAIL'
                             AND UPPER (prs_perslid_email) =
                                   UPPER (recPersLid.prs_perslid_email)
                           OR UPPER (p_sleutelkolom) = 'LOGIN'
                             AND UPPER (prs_perslid_oslogin) =
                                   UPPER (recPersLid.prs_perslid_oslogin)
                           OR UPPER (p_sleutelkolom) = 'APIKEY'
                             AND UPPER (prs_perslid_apikey) =
                                   UPPER (recPersLid.prs_perslid_apikey)));

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

              INSERT INTO prs_perslid (prs_perslid_module,
                                       prs_srtperslid_key,
                                       prs_afdeling_key,
                                       prs_perslid_naam,
                                       prs_perslid_voorletters,
                                       prs_perslid_tussenvoegsel,
                                       prs_perslid_voornaam,
                                       prs_perslid_telefoonnr,
                                       prs_perslid_mobiel,
                                       prs_perslid_email,
                                       prs_perslid_nr,
                                       prs_perslid_geslacht,
                                       prs_perslid_titel,
                                       prs_perslid_dienstverband,
                                       prs_perslid_oslogin,
                                       prs_perslid_apikey)
                  VALUES ('PRS',
                          v_srtperslid_key,
                          v_afdeling_key,
                          v_prs_perslid_naam,
                          recPersLid.prs_perslid_voorletters,
                          v_prs_perslid_tussenvoegsel,
                          recPersLid.prs_perslid_voornaam,
                          recPersLid.prs_perslid_telefoonnr,
                          recPersLid.prs_perslid_mobiel,
                          recPersLid.prs_perslid_email,
                          recPersLid.prs_perslid_nr,
                          recPersLid.prs_perslid_geslacht,
                          recPersLid.prs_perslid_titel,
                          recPersLid.prs_perslid_dienstverband,
                          recPersLid.prs_perslid_oslogin,
                          recPersLid.prs_perslid_apikey)
               RETURNING prs_perslid_key
                    INTO v_perslid_key;

               prs.setpassword(v_perslid_key, recPersLid.prs_perslid_wachtwoord);

              COMMIT;
              v_count_update := v_count_update + 1;
           ELSIF v_count = 1
           THEN
              UPDATE prs_perslid
                 SET prs_srtperslid_key = v_srtperslid_key,
                     prs_afdeling_key = v_afdeling_key,
                     prs_perslid_naam = v_prs_perslid_naam,
                     prs_perslid_voorletters =
                        recPersLid.prs_perslid_voorletters,
                     prs_perslid_tussenvoegsel =
                        v_prs_perslid_tussenvoegsel,
                     prs_perslid_voornaam = recPersLid.prs_perslid_voornaam,
                     prs_perslid_nr = recPersLid.prs_perslid_nr,
                     prs_perslid_dienstverband = recPersLid.prs_perslid_dienstverband,
                     prs_perslid_geslacht = recPersLid.prs_perslid_geslacht,
                     prs_perslid_titel = recPersLid.prs_perslid_titel,
                     prs_perslid_telefoonnr = recPersLid.prs_perslid_telefoonnr,
                     prs_perslid_mobiel = recPersLid.prs_perslid_mobiel,
                     prs_perslid_email = recPersLid.prs_perslid_email,
                     prs_perslid_oslogin = recPersLid.prs_perslid_oslogin,
                     prs_perslid_apikey = recPersLid.prs_perslid_apikey
               WHERE prs_perslid_key = v_perslid_key;

              IF recPersLid.prs_perslid_wachtwoord IS NOT NULL
              THEN
                 prs.setpassword(v_perslid_key, recPersLid.prs_perslid_wachtwoord);
              END IF;
           END IF;

           -- Voor CUST-postprocessing (van de kenmerken) is het handig te onthouden:
           UPDATE fac_imp_perslid
              SET prs_perslid_key = v_perslid_key
            WHERE fac_import_key = recPersLid.fac_import_key
               AND fac_imp_file_index = recPersLid.fac_imp_file_index;

           COMMIT;                      -- persoon in ieder geval toegevoegd.

           v_aanduiding :=
                 recPersLid.prs_perslid_nr
              || '|'
              || recPersLid.prs_perslid_naam
              || '|'
              || recPersLid.prs_perslid_voornaam
              || '|'
              || recPersLid.alg_locatie_code
              || '|'
              || recPersLid.alg_gebouw_code
              || '|'
              || recPersLid.alg_verdieping_volgnr
              || '|'
              || recPersLid.alg_ruimte_nr
              || ' - ';


           v_locatie_key := NULL;
           v_gebouw_key := NULL;
           v_verdieping_key := NULL;
           v_ruimte_key := NULL;

           v_errorhint := 'Fout bij bepalen locatie';
           SELECT   MAX(alg_locatie_key)
             INTO   v_locatie_key
             FROM   alg_v_aanweziglocatie
            WHERE   UPPER (alg_locatie_code) = UPPER (recPersLid.alg_locatie_code);

           v_errorhint := 'Fout bij bepalen gebouw';
           SELECT   MAX(alg_gebouw_key)
             INTO   v_gebouw_key
             FROM   alg_v_aanweziggebouw
            WHERE   UPPER (alg_gebouw_code) = UPPER (recPersLid.alg_gebouw_code)
                    AND alg_locatie_key = v_locatie_key;

           v_errorhint := 'Fout bij bepalen verdieping';
           SELECT   MAX(alg_verdieping_key)
             INTO   v_verdieping_key
             FROM   alg_v_aanwezigverdieping
            WHERE   UPPER (alg_verdieping_volgnr) = UPPER (recPersLid.alg_verdieping_volgnr)
                    AND alg_gebouw_key = v_gebouw_key;

           v_errorhint := 'Fout bij bepalen beoogde ruimte';
           SELECT   MAX(alg_ruimte_key)
             INTO   v_ruimte_key
             FROM   alg_v_aanwezigruimte r
            WHERE   r.alg_ruimte_upper_nr = UPPER (recPersLid.alg_ruimte_nr)
                    AND r.alg_verdieping_key = v_verdieping_key;

           -- standaard ruimte moet door cust gedeelte van deFout bij bepalen beoogde ruimte import ingevuld worden.

           -- als er een locatie ingevuld is willen we ook een ruimte vinden.
           IF v_ruimte_key IS NULL AND recPersLid.alg_locatie_code IS NOT NULL
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || ' Ruimte kan niet gevonden worden',
                                'Controleer locatie,gebouw en verdieping');
           END IF;

           -- fouten bij het bepalen van de werkplek worden als waarschuwing weergegeven.
           BEGIN
               v_errorhint := 'Fout bij het aanpassen van de werkplek';
               PRS.movetoruimte (v_perslid_key, v_ruimte_key, p_alg_type);
           EXCEPTION WHEN OTHERS
           THEN
              v_wpcount_error := v_wpcount_error + 1;
              oracle_err_num := SQLCODE;
              oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
              v_errormsg := ' (ORACLE error number = <' || ORACLE_err_num || '> ORACLE error message = <' || ORACLE_err_mes || '>)';
              fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, v_errorhint);
           END;

        EXCEPTION WHEN OTHERS
        THEN
           v_count_error := v_count_error + 1;
           oracle_err_num := SQLCODE;
           oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
           v_errormsg := ' (ORACLE error number = <' || ORACLE_err_num || '> ORACLE error message = <' || ORACLE_err_mes || '>)';
           fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, v_errorhint);
           COMMIT;                                          -- tbv logging
        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),
        '');

     fac.imp_writelog (
        p_import_key,
        'S',
        'Werkplek: verwerkte regels met foutmelding: '
        || TO_CHAR (v_wpcount_error),
        '');
  END update_perslid;


  PROCEDURE delete_perslid (p_import_key     IN NUMBER,
                            p_perslid_key    IN NUMBER)
  IS
     v_errormsg       VARCHAR2 (1000);
     v_errorhint      VARCHAR2 (1000);
     oracle_err_num   NUMBER;
     oracle_err_mes   VARCHAR2 (200);

     v_count          NUMBER (10);

     --
     v_perslid_naam   VARCHAR (100);
     v_perslid_nr     VARCHAR (30);
  BEGIN
     BEGIN
        v_errormsg := 'Verwijderen van de persoon is NIET gelukt';
        v_errorhint :=
              'Heeft de persoon met prs_perslid_key '
           || TO_CHAR (p_perslid_key)
           || ' historie?';

        SELECT prs_perslid_naam_full, prs_perslid_nr
          INTO v_perslid_naam, v_perslid_nr
          FROM prs_perslid p, prs_v_perslid_fullnames pf
         WHERE p.prs_perslid_key = pf.prs_perslid_key
               AND p.prs_perslid_key = p_perslid_key;

        -- *** Budgethouderschap ***
        -- Voor hoeveel kostenplaatsen is deze persoon budgethouder?
        SELECT COUNT ( * )
          INTO v_count
          FROM prs_kostenplaats
         WHERE prs_perslid_key = p_perslid_key;

        IF (v_count > 0)
        THEN
           UPDATE prs_kostenplaats
              SET prs_perslid_key = NULL
            WHERE prs_perslid_key = p_perslid_key;

           fac.imp_writelog (
              p_import_key,
              'I',
                 'Budgethouderschap van te verwijderen persoon ('
              || v_count
              || ' stuks) vervallen.',
              'Naam/persoonsnr: ' || v_perslid_naam || '/' || v_perslid_nr);
        END IF;

        -- *** Vervangers ***
        -- koppelingen met vervangers dienen ook verwijderd te worden
        SELECT COUNT ( * )
          INTO v_count
          FROM prs_collega
         WHERE prs_perslid_key = p_perslid_key
               OR prs_perslid_key_alt = p_perslid_key;

        IF (v_count > 0)
        THEN
           DELETE FROM prs_collega
                 WHERE prs_perslid_key = p_perslid_key
                       OR prs_perslid_key_alt = p_perslid_key;

           fac.imp_writelog (
              p_import_key,
              'I',
              'Te verwijderen persoon heeft vervanger(s). Koppeling(en) verwijderd.',
              'Naam/persoonsnr: ' || v_perslid_naam || '/' || v_perslid_nr);
        END IF;

        -- *** werkplekken ***
        -- per 5.3.2 worden impliciete werkplekken via trigger verwijderd!

        DELETE prs_perslidwerkplek
         WHERE prs_perslid_key = p_perslid_key;

        -- *** Verplichtingen ***
        SELECT COUNT ( * )
          INTO v_count
          FROM prs_v_verplichting_refcheck vp
         WHERE vp.prs_perslid_key = p_perslid_key;

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

           -- Referenties in tabellen naar deze pers_perslid_key moeten eerst verwijderd worden.
           -- Door cascade verwijderen van deze record onstaan audits op die tabellen die audit tracking hebben.
           -- Daardoor onstaan "ORxA-04091:table VLKC.FAC_AUDIT is mutating, trigger/function may not see it" foutmeldingen
           -- op de delete van de prs_perslid_key uit de prs_perslid tabel.
           -- De tabellen prs_kostenplaats, prs_kostenplaatsgrp, prs_perslidkostenplaats en fac_gebruikersgroep hebben een prs_perslid_key referentie en audit tracking.
           DELETE FROM prs_kostenplaats
                 WHERE prs_perslid_key = p_perslid_key;
           DELETE FROM prs_kostenplaatsgrp
                 WHERE prs_perslid_key = p_perslid_key;
           DELETE FROM prs_perslidkostenplaats
                 WHERE prs_perslid_key = p_perslid_key;
           DELETE FROM fac_gebruikersgroep
                 WHERE prs_perslid_key = p_perslid_key;

           DELETE FROM prs_perslid
                 WHERE prs_perslid_key = p_perslid_key;

           fac.imp_writelog (
              p_import_key,
              'I',
              'Persoon verwijderd.',
                 'Achternaam/persoonsnr: '
              || v_perslid_naam
              || '/'
              || v_perslid_nr);
        ELSE
           -- Controleer of er ACTUELE verplichtingen zijn
           SELECT COUNT ( * )
             INTO v_count
             FROM prs_v_verplichting_keys vp
            WHERE vp.prs_perslid_key = p_perslid_key;

           IF v_count > 0
           THEN
              UPDATE prs_perslid
                 SET prs_perslid_naam =
                        SUBSTR ('INACTIEF:' || prs_perslid_naam, 1, 60),
                     prs_perslid_oslogin = NULL,
                     prs_perslid_oslogin2 = NULL
               WHERE prs_perslid_key = p_perslid_key
                     AND prs_perslid_naam NOT LIKE 'INACTIEF:%';

              fac.imp_writelog (
                 p_import_key,
                 'I',
                 'Persoon als INACTIEF gemarkeerd of was al INACTIEF gemarkeerd.',
                    'Achternaam/persoonsnr: '
                 || v_perslid_naam
                 || '/'
                 || v_perslid_nr);
           ELSE
              BEGIN
                 UPDATE prs_perslid
                    SET prs_perslid_verwijder = SYSDATE
                  WHERE prs_perslid_key = p_perslid_key;

                 fac.imp_writelog (
                    p_import_key,
                    'I',
                    'Persoon geïnactiveerd.',
                       'Achternaam/persoonsnr: '
                    || v_perslid_naam
                    || '/'
                    || v_perslid_nr);
              EXCEPTION
                 WHEN OTHERS
                 THEN
                    -- Kennelijk heeft de persoon toch ernstige verplichtingen
                    v_errorhint :=
                          'Persoon heeft nog (max. '
                       || TO_CHAR (v_count)
                       || ') verplichtingen. Naam/persoonsnr: '
                       || v_perslid_naam
                       || '/'
                       || v_perslid_nr;
                    fac.imp_writelog (p_import_key,
                                      'I',
                                      'Inactiveren persoon is niet gelukt',
                                      v_errorhint);
              END;
           END IF;
        END IF;
     EXCEPTION
        WHEN OTHERS
        THEN
           oracle_err_num := SQLCODE;
           oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
           v_errormsg :=
                 '(ORACLE error '
              || oracle_err_num
              || '/'
              || oracle_err_mes
              || ')';
           fac.imp_writelog (p_import_key,
                             'E',
                             v_errormsg,
                             v_errorhint);
     END;
  END delete_perslid;

END prs;
/

REGISTERRUN('$Id$')
#endif // PRS
