CREATE OR REPLACE PACKAGE AAXX
AS
   -- PACKAGES voor de perslid import functions

   PROCEDURE set_prs_kenmerk (p_import_key       IN NUMBER,
                              p_niveau           IN VARCHAR2,
                              p_kenmerk_key      IN NUMBER,
                              p_link_key         IN NUMBER,
                              p_kenmerk_waarde   IN VARCHAR2);

   PROCEDURE prs_set_werkplek (p_perslid_key             IN     NUMBER,
                               p_ruimte_key              IN     NUMBER,
                               p_werkplek_volgnr         IN     NUMBER,
                               p_werkplek_omschrijving   IN     VARCHAR2,
                               p_wp_expliciet            IN     NUMBER,
                               p_errormsg                   OUT VARCHAR2,
                               p_errorhint                  OUT VARCHAR2);

   PROCEDURE prs_update_werkplek (p_locatie_code            IN     VARCHAR2,
                                  p_gebouw_code             IN     VARCHAR2,
                                  p_verdieping_volgnr       IN     VARCHAR2,
                                  p_ruimte_nr               IN     VARCHAR2,
                                  p_werkplek_volgnr         IN     NUMBER,
                                  p_werkplek_omschrijving   IN     VARCHAR2,
                                  p_perslid_key             IN     NUMBER,
                                  p_wp_expliciet            IN     NUMBER,
                                  p_std_wp_ruimte_nr        IN     VARCHAR2,
                                  p_errormsg                   OUT VARCHAR2,
                                  p_errorhint                  OUT VARCHAR2);

   PROCEDURE fac_gen_update_perslid (p_import_key         IN NUMBER,
                                     p_sleutelkolom       IN VARCHAR2,
                                     p_wp_mode            IN NUMBER,
                                     p_std_wp_ruimte_nr   IN VARCHAR2);

   PROCEDURE prs_del_perslid (p_import_key     IN NUMBER,
                              p_perslid_key    IN NUMBER,
                              p_wp_expliciet   IN NUMBER,
                              p_delete         IN NUMBER);

   PROCEDURE insert_perslid_from_mld (p_applname       IN VARCHAR2,
                                      p_applrun        IN VARCHAR2);

   FUNCTION count_Work_Days_InclTime( pdate1 IN DATE , pdate2 IN DATE ) RETURN NUMBER;

   FUNCTION count_Work_Days( pdate1 IN DATE , pdate2 IN DATE ) RETURN NUMBER;
END;
/


/* Formatted on 3/18/2011 10:07:59 AM (QP5 v5.136.908.31019) */
CREATE OR REPLACE PACKAGE BODY AAXX
AS
   -- PACKAGE voor de perslid import functions



   PROCEDURE set_prs_kenmerk (p_import_key IN NUMBER,
                              p_niveau           IN VARCHAR2,
                              p_kenmerk_key      IN NUMBER,
                              p_link_key         IN NUMBER,
                              p_kenmerk_waarde   IN VARCHAR2)
   AS
      v_count          NUMBER;
      v_hint           VARCHAR2 (100);
      v_aktie          VARCHAR2 (100);
      oracle_err_num   NUMBER;
      oracle_err_mes   VARCHAR2 (200);
      v_errormsg       VARCHAR2 (200);
   BEGIN
      v_hint :=
            ' kenmerk '
         || p_niveau
         || ' kenmerk_key: '
         || p_kenmerk_key
         || ' link: '
         || p_link_key
         || ' waarde: '
         || p_kenmerk_waarde;
      v_aktie := 'Toevoegen';

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

      IF v_count = 1
      THEN
         IF p_kenmerk_waarde IS NULL
         THEN
            v_aktie := 'Verwijder';

            DELETE prs_kenmerklink
             WHERE     prs_link_key = p_link_key
                   AND prs_kenmerklink_niveau = p_niveau
                   AND prs_kenmerk_key = p_kenmerk_key
                   AND prs_kenmerklink_verwijder IS NULL;
         ELSE
            v_aktie := 'Wijzigen';

            UPDATE prs_kenmerklink
               SET prs_kenmerklink_waarde = p_kenmerk_waarde
             WHERE     prs_link_key = p_link_key
                   AND prs_kenmerklink_niveau = p_niveau
                   AND prs_kenmerk_key = p_kenmerk_key
                   AND prs_kenmerklink_verwijder IS NULL;
         END IF;
      ELSE
         v_aktie := 'Toevoegen';

         IF p_kenmerk_key IS NOT NULL AND p_kenmerk_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_link_key,
                        p_niveau,
                        p_kenmerk_waarde);
         END IF;
      END IF;
   --fac.imp_writelog (p_import_key, 'I', 'Verwerken kenmerk ' || v_aktie || ' kenmerk_key:' || p_kenmerk_key || ' waarde:'|| p_kenmerk_waarde || '-','');
   EXCEPTION
      WHEN OTHERS
      THEN
         oracle_err_num := SQLCODE;
         oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
         v_errormsg :=
               'OTHERS (error '
            || oracle_err_num
            || '/'
            || oracle_err_mes
            || ')';
         fac.imp_writelog (p_import_key,
                           'E',
                           v_errormsg,
                           v_aktie || ' - ' || v_hint);
   END;


   PROCEDURE prs_set_werkplek (p_perslid_key             IN     NUMBER,
                               p_ruimte_key              IN     NUMBER,
                               p_werkplek_volgnr         IN     NUMBER,
                               p_werkplek_omschrijving   IN     VARCHAR2,
                               p_wp_expliciet            IN     NUMBER,
                               p_errormsg                   OUT VARCHAR2,
                               p_errorhint                  OUT VARCHAR2)
   IS
      v_ruimte_nr               VARCHAR2 (10);
      v_werkplek_volgnr         NUMBER (3);
      v_werkplek_omschrijving   VARCHAR2 (30);
      v_werkplek_key            NUMBER (10);
      v_perslidwerkplek_key     NUMBER (10);
      v_huidige_ruimte_key      NUMBER (10);
      v_huidige_pwp_key         NUMBER (10);
      v_huidige_wp_key          NUMBER (10);
      oracle_err_num            NUMBER;
      oracle_err_mes            VARCHAR2 (200);
   BEGIN
      -- bepaal het ruimte_nummer voor de omschrijving van de werkplek
      p_errorhint := 'Fout bij bepalen nieuwe ruimte ruimte_key:' || p_ruimte_key;
      SELECT alg_ruimte_nr
        INTO v_ruimte_nr
        FROM alg_ruimte
       WHERE alg_ruimte_key = p_ruimte_key;

      -- vind de huidige hoofdwerkplek
      p_errorhint := 'Fout bij zoeken naar de hoofdwerkplek.';
      SELECT MAX (pwp.prs_perslidwerkplek_key)
        INTO v_huidige_pwp_key
        FROM prs_perslid p, prs_perslidwerkplek pwp, prs_werkplek wp
       WHERE     p.prs_perslid_key = p_perslid_key
             AND p.prs_perslid_key = pwp.prs_perslid_key
             AND pwp.prs_werkplek_key = wp.prs_werkplek_key
             AND COALESCE (wp.prs_werkplek_virtueel, 0) <> '1'
             AND pwp.prs_perslidwerkplek_volgnr = 1;

      -- met de bijbehorende werkplek
      IF v_huidige_pwp_key IS NOT NULL
      THEN
         p_errorhint := 'Fout bij bepalen of persoon al een werkplek heeft';

         SELECT pwp.prs_werkplek_key
           INTO v_huidige_wp_key
           FROM prs_perslidwerkplek pwp
          WHERE pwp.prs_perslidwerkplek_key = v_huidige_pwp_key;
      END IF;


      IF p_wp_expliciet = 1
      THEN
         IF p_werkplek_omschrijving IS NULL
         THEN
            v_werkplek_omschrijving :=
               v_ruimte_nr || '/' || TO_CHAR (v_werkplek_volgnr);
         ELSE
            v_werkplek_omschrijving := p_werkplek_omschrijving;
         END IF;

         p_errorhint := 'Fout bij bepalen werkplekvolgnr.';

         IF (p_werkplek_volgnr IS NOT NULL)
         THEN
            BEGIN
               -- expliciete werkplekken
               SELECT prs_werkplek_key
                 INTO v_werkplek_key
                 FROM prs_werkplek
                WHERE prs_alg_ruimte_key = p_ruimte_key
                      AND prs_werkplek_volgnr = p_werkplek_volgnr;
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  -- voeg werkplek maar toe
                  INSERT INTO prs_werkplek (prs_werkplek_module,
                                            prs_werkplek_volgnr,
                                            prs_werkplek_omschrijving,
                                            prs_alg_ruimte_key)
                      VALUES ('PRR',
                              v_werkplek_volgnr,
                              v_werkplek_omschrijving,
                              p_ruimte_key)
                   RETURNING prs_werkplek_key
                        INTO v_werkplek_key;
            END;

            IF v_huidige_wp_key <> v_werkplek_key OR v_huidige_wp_key IS NULL
            THEN
               IF v_huidige_pwp_key IS NOT NULL
               THEN
                  p_errorhint := 'Omhangen perslidwerkplek record.';

                  -- verplaatsen van de persoon
                  UPDATE prs_perslidwerkplek
                     SET prs_werkplek_key = v_werkplek_key
                   WHERE prs_perslidwerkplek_key = v_huidige_pwp_key;

                  v_perslidwerkplek_key := v_huidige_pwp_key;
               ELSE
                  -- toevoegen van perslidwerkplek record
                  p_errorhint := 'Toevoegen perslidwerkplek record.';

                  INSERT INTO prs_perslidwerkplek (prs_perslid_key,
                                                   prs_werkplek_key,
                                                   prs_perslidwerkplek_volgnr)
                      VALUES (p_perslid_key, v_werkplek_key, 1)
                   RETURNING prs_perslidwerkplek_key
                        INTO v_perslidwerkplek_key;
               END IF;
            END IF;
         ELSE
            p_errormsg :=
               'Geen werkplekvolgnummer gevonden bij expliciete werkplekken';
         END IF;
      ELSE                                           -- impliciete werkplekken
         -- kijk of de ruimte gelijk is aan de huidige ruimte
         p_errorhint := 'Bepalen huidige ruimte.';

         SELECT MAX (prs_alg_ruimte_key)
           INTO v_huidige_ruimte_key
           FROM prs_werkplek
          WHERE prs_werkplek_key = v_huidige_wp_key;

         IF v_huidige_ruimte_key <> p_ruimte_key
            OR v_huidige_ruimte_key IS NULL
         THEN
               -- geen lege werkplekken gevonden.
               -- maak een nieuwe werkplek aan met als volgnummer het hoogste gevonden nummmer + 1
               p_errorhint := 'Maak een nieuwe werkplek aan';

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

               INSERT INTO prs_werkplek (prs_werkplek_module,
                                         prs_werkplek_volgnr,
                                         prs_werkplek_omschrijving,
                                         prs_alg_ruimte_key)
                   VALUES ('PRR',
                           v_werkplek_volgnr,
                           v_ruimte_nr || '/' || TO_CHAR (v_werkplek_volgnr),
                           p_ruimte_key)
                RETURNING prs_werkplek_key
                     INTO v_werkplek_key;

            -- nu hebben we een vrije werkplek

            IF v_huidige_pwp_key IS NOT NULL
            THEN
               p_errorhint := 'Omhangen perslidwerkplek record.';

               -- verplaatsen van de persoon
               UPDATE prs_perslidwerkplek
                  SET prs_werkplek_key = v_werkplek_key
                WHERE prs_perslidwerkplek_key = v_huidige_pwp_key;

               v_perslidwerkplek_key := v_huidige_pwp_key;
            ELSE
               -- toevoegen van perslidwerkplek record
               p_errorhint := 'Toevoegen perslidwerkplek record.';

               INSERT INTO prs_perslidwerkplek (prs_perslid_key,
                                                prs_werkplek_key,
                                                prs_perslidwerkplek_volgnr)
                   VALUES (p_perslid_key, v_werkplek_key, 1)
                RETURNING prs_perslidwerkplek_key
                     INTO v_perslidwerkplek_key;
            END IF;
         END IF;
      END IF;

      -- check of we nog iets moeten weggooien
      -- FSN#26947/MvdH: hierboven wordt altijd een nieuwe werkplek aangemaakt
      -- en die wordt gekoppeld aan een bestaande of nieuwe perslidwerkplek
      -- (indien bestaand dan huidige_pwp_key:=v_perslidwerkplek_key en indien
      -- nieuw dan huidige_pwp_key IS NULL) => beide if-condities nooit waar!
      --IF v_huidige_pwp_key <> v_perslidwerkplek_key
      --   OR (v_perslidwerkplek_key IS NULL AND v_huidige_pwp_key IS NOT NULL)
      --THEN
      --   DELETE prs_perslidwerkplek
      --    WHERE prs_perslidwerkplek_key = v_huidige_pwp_key;
      --END IF;

      -- FSN#26947/MvdH: hierboven wordt altijd een nieuwe werkplek aangemaakt
      -- en, alleen als er ook al een was, dan is onderstaande conditie waar!
      -- => alleen igv. impliciet in dat geval de oude verwijderen!
      --IF p_wp_expliciet <> 1
      --   AND (v_huidige_wp_key <> v_werkplek_key
      --        OR (v_werkplek_key IS NULL AND v_huidige_wp_key IS NOT NULL))
      --THEN
      --   UPDATE prs_werkplek
      --      SET prs_werkplek_verwijder = SYSDATE
      --    WHERE prs_werkplek_key = v_huidige_wp_key;
      --END IF;
      IF p_wp_expliciet <> 1 AND v_huidige_wp_key IS NOT NULL
      THEN
         DELETE FROM prs_werkplek
               WHERE prs_werkplek_key = v_huidige_wp_key;
      END IF;
   EXCEPTION
      WHEN OTHERS
      THEN
         oracle_err_num := SQLCODE;
         oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
         p_errormsg :=
               ' (ORACLE error number = <'
            || ORACLE_err_num
            || '> ORACLE error message = <'
            || ORACLE_err_mes
            || '>)';
   END prs_set_werkplek;


   PROCEDURE prs_update_werkplek (p_locatie_code            IN     VARCHAR2,
                                  p_gebouw_code             IN     VARCHAR2,
                                  p_verdieping_volgnr       IN     VARCHAR2,
                                  p_ruimte_nr               IN     VARCHAR2,
                                  p_werkplek_volgnr         IN     NUMBER,
                                  p_werkplek_omschrijving   IN     VARCHAR2,
                                  p_perslid_key             IN     NUMBER,
                                  p_wp_expliciet            IN     NUMBER,
                                  p_std_wp_ruimte_nr        IN     VARCHAR2,
                                  p_errormsg                   OUT VARCHAR2,
                                  p_errorhint                  OUT VARCHAR2)
   IS
      v_ruimte_key           NUMBER (10);
      v_locatie_key          NUMBER (10);
      v_gebouw_key           NUMBER (10);
      v_verdieping_key       NUMBER (10);
      v_ruimte_onveranderd   NUMBER (1);
      v_count                NUMBER (10);
      oracle_err_num         NUMBER;
      oracle_err_mes         VARCHAR2 (200);
   BEGIN
      p_errorhint :=
         'Fout bij bepalen of persoon al een perslidwerkplek heeft';
      v_ruimte_key := -1;
      v_ruimte_onveranderd := 0;

      -- laten we eerst maar even zoeken welke gegevens er boven tafel te krijgen zijn.
      IF p_locatie_code IS NOT NULL
      THEN
         p_errorhint := 'Fout bij bepalen locatie [' || p_locatie_code || ']';

         SELECT alg_locatie_key
           INTO v_locatie_key
           FROM alg_locatie
          WHERE UPPER (alg_locatie_code) = UPPER (p_locatie_code)
                AND alg_locatie_verwijder IS NULL;

         IF p_gebouw_code IS NOT NULL
         THEN
            p_errorhint := 'Fout bij bepalen gebouw [' || p_gebouw_code || ']';

            SELECT alg_gebouw_key
              INTO v_gebouw_key
              FROM alg_gebouw
             WHERE     UPPER (alg_gebouw_code) = UPPER (p_gebouw_code)
                   AND alg_gebouw_verwijder IS NULL
                   AND alg_locatie_key = v_locatie_key;

            IF p_verdieping_volgnr IS NOT NULL
            THEN
               p_errorhint := 'Fout bij bepalen verdieping';

               SELECT alg_verdieping_key
                 INTO v_verdieping_key
                 FROM alg_verdieping
                WHERE     alg_gebouw_key = v_gebouw_key
                      AND alg_verdieping_volgnr = p_verdieping_volgnr
                      AND alg_verdieping_verwijder IS NULL;

               IF p_ruimte_nr IS NOT NULL
               THEN
                  p_errorhint :=
                        'Fout bij bepalen ruimte ['
                     || TO_CHAR (p_ruimte_nr)
                     || ']';

                  SELECT alg_ruimte_key
                    INTO v_ruimte_key
                    FROM alg_ruimte
                   WHERE     alg_verdieping_key = v_verdieping_key
                         AND alg_ruimte_verwijder IS NULL
                         AND UPPER (alg_ruimte_nr) = UPPER (p_ruimte_nr);

                  -- kijk of ik al een werkplek heb in deze kamer
                  SELECT COUNT (wp.prs_werkplek_key)
                    INTO v_count
                    FROM prs_werkplek wp, prs_perslidwerkplek pwp
                   WHERE     pwp.prs_perslid_key = p_perslid_key
                         AND wp.prs_werkplek_key = pwp.prs_werkplek_key
                         AND wp.prs_alg_ruimte_key = v_ruimte_key
                         AND COALESCE (wp.prs_werkplek_virtueel, 0) = 0;

                  IF v_count = 0
                  THEN
                     v_ruimte_onveranderd := 0;
                  ELSE
                     v_ruimte_onveranderd := 1;
                  END IF;
               ELSE
                  -- kijk of ik al een werkplek heb op deze verdieping
                  SELECT COUNT (wp.prs_werkplek_key)
                    INTO v_count
                    FROM prs_werkplek wp,
                         prs_perslidwerkplek pwp,
                         alg_ruimte r
                   WHERE     pwp.prs_perslid_key = p_perslid_key
                         AND wp.prs_werkplek_key = pwp.prs_werkplek_key
                         AND wp.prs_alg_ruimte_key = r.alg_ruimte_key
                         AND COALESCE (wp.prs_werkplek_virtueel, 0) = 0
                         AND r.alg_verdieping_key = v_verdieping_key;

                  IF v_count = 0
                  THEN
                     -- vind de standaardruimte binnen de gevonden verdieping
                     SELECT MAX (alg_ruimte_key)
                       INTO v_ruimte_key
                       FROM alg_ruimte
                      WHERE     alg_verdieping_key = v_verdieping_key
                            AND alg_ruimte_verwijder IS NULL
                            AND alg_ruimte_nr = p_std_wp_ruimte_nr;
                  ELSE
                     v_ruimte_onveranderd := 1;
                  END IF;
               END IF;
            ELSE
               -- kijk of ik al een werkplek heb in dit gebouw
               SELECT COUNT (wp.prs_werkplek_key)
                 INTO v_count
                 FROM prs_werkplek wp,
                      prs_perslidwerkplek pwp,
                      alg_ruimte r,
                      alg_verdieping v
                WHERE     pwp.prs_perslid_key = p_perslid_key
                      AND wp.prs_werkplek_key = pwp.prs_werkplek_key
                      AND wp.prs_alg_ruimte_key = r.alg_ruimte_key
                      AND COALESCE (wp.prs_werkplek_virtueel, 0) = 0
                      AND r.alg_verdieping_key = v.alg_verdieping_key
                      AND v.alg_gebouw_key = v_gebouw_key;

               IF v_count = 0
               THEN
                  -- vind de standaardruimte binnen het gevonden gebouw
                  SELECT MAX (alg_ruimte_key)
                    INTO v_ruimte_key
                    FROM alg_ruimte r, alg_verdieping v
                   WHERE     v.alg_gebouw_key = v_gebouw_key
                         AND v.alg_verdieping_key = r.alg_verdieping_key
                         AND r.alg_ruimte_verwijder IS NULL
                         AND r.alg_ruimte_nr = p_std_wp_ruimte_nr;
               ELSE
                  v_ruimte_onveranderd := 1;
               END IF;
            END IF;
         ELSE
            -- kijk of ik al een werkplek heb op deze locatie
            SELECT COUNT (wp.prs_werkplek_key)
              INTO v_count
              FROM prs_werkplek wp,
                   prs_perslidwerkplek pwp,
                   alg_ruimte r,
                   alg_verdieping v,
                   alg_gebouw g
             WHERE     pwp.prs_perslid_key = p_perslid_key
                   AND wp.prs_werkplek_key = pwp.prs_werkplek_key
                   AND wp.prs_alg_ruimte_key = r.alg_ruimte_key
                   AND COALESCE (wp.prs_werkplek_virtueel, 0) = 0
                   AND r.alg_verdieping_key = v.alg_verdieping_key
                   AND v.alg_gebouw_key = g.alg_gebouw_key
                   AND g.alg_locatie_key = v_locatie_key;

            IF v_count = 0
            THEN
               -- vind de standaardruimte binnen de gevonden locatie
               SELECT MAX (alg_ruimte_key)
                 INTO v_ruimte_key
                 FROM alg_ruimte r, alg_verdieping v, alg_gebouw g
                WHERE     g.alg_locatie_key = v_locatie_key
                      AND g.alg_gebouw_key = v.alg_gebouw_key
                      AND v.alg_verdieping_key = r.alg_verdieping_key
                      AND r.alg_ruimte_verwijder IS NULL
                      AND r.alg_ruimte_nr = p_std_wp_ruimte_nr;
            ELSE
               v_ruimte_onveranderd := 1;
            END IF;
         END IF;

         -- we hebben nu een ruimte_key voor de nieuwe werkplek
         IF v_ruimte_onveranderd = 0
         THEN
            IF v_ruimte_key IS NOT NULL
            THEN
               prs_set_werkplek (p_perslid_key,
                                 v_ruimte_key,
                                 p_werkplek_volgnr,
                                 p_werkplek_omschrijving,
                                 p_wp_expliciet,
                                 p_errormsg,
                                 p_errorhint);
            ELSE
               p_errormsg := 'Kan geen standaardruimte met ruimtenr:<' || p_std_wp_ruimte_nr || '> vinden';
            END IF;
         END IF;
      END IF;

      COMMIT;
   EXCEPTION
      WHEN OTHERS
      THEN
         oracle_err_num := SQLCODE;
         oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
         p_errormsg :=
               ' (ORACLE error number = <'
            || ORACLE_err_num
            || '> ORACLE error message = <'
            || ORACLE_err_mes
            || '>)';
   END prs_update_werkplek;


   --
   -- p_wp_mode   (0 geen werkplekken 1, impliciet  2 expliciet)
   --
   PROCEDURE fac_gen_update_perslid (p_import_key         IN NUMBER,
                                     p_sleutelkolom       IN VARCHAR2,
                                     p_wp_mode            IN NUMBER,
                                     p_std_wp_ruimte_nr   IN VARCHAR2)
   IS
      c_fielddelimitor   VARCHAR2 (1) := ';';

      v_newline          VARCHAR2 (1000);                        -- Input line
      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_wp_expliciet     NUMBER (10);

      --
      v_perslid_key      NUMBER (10);
      v_afdeling_key     NUMBER (10);
      v_srtperslid_key   NUMBER (10);


      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 prs_afdeling_key
              INTO v_afdeling_key
              FROM prs_afdeling
             WHERE UPPER (prs_afdeling_naam) =
                      UPPER (recPersLid.prs_afdeling_naam)
                   AND prs_afdeling_verwijder IS NULL;

            -- p_sleutelkolom
            --   NR = prs_perslid_nr
            --   EMAIL = prs_perslid_email
            --   LOGIN = prs_perslid_oslogin
            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)));

            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_titel,
                                        prs_perslid_oslogin)
                   VALUES ('PRS',
                           v_srtperslid_key,
                           v_afdeling_key,
                           recPersLid.prs_perslid_naam,
                           recPersLid.prs_perslid_voorletters,
                           recPersLid.prs_perslid_tussenvoegsel,
                           recPersLid.prs_perslid_voornaam,
                           recPersLid.prs_perslid_telefoonnr,
                           recPersLid.prs_perslid_mobiel,
                           recPersLid.prs_perslid_email,
                           recPersLid.prs_perslid_nr,
                           recPersLid.prs_perslid_titel,
                           recPersLid.prs_perslid_oslogin)
                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 = recPersLid.prs_perslid_naam,
                      prs_perslid_voorletters =
                         recPersLid.prs_perslid_voorletters,
                      prs_perslid_tussenvoegsel =
                         recPersLid.prs_perslid_tussenvoegsel,
                      prs_perslid_voornaam = recPersLid.prs_perslid_voornaam,
                      prs_perslid_nr = recPersLid.prs_perslid_nr,
                      prs_perslid_titel = recPersLid.prs_perslid_titel
                WHERE prs_perslid_key = v_perslid_key;

               IF recPersLid.prs_perslid_telefoonnr IS NOT NULL OR aaxx_get_user = 'ENEXIS'
               THEN
                  UPDATE prs_perslid
                     SET prs_perslid_telefoonnr =
                            recPersLid.prs_perslid_telefoonnr
                   WHERE prs_perslid_key = v_perslid_key;
               END IF;

               IF recPersLid.prs_perslid_mobiel IS NOT NULL OR aaxx_get_user = 'ENEXIS'
               THEN
                  UPDATE prs_perslid
                     SET prs_perslid_mobiel = recPersLid.prs_perslid_mobiel
                   WHERE prs_perslid_key = v_perslid_key;
               END IF;

               IF recPersLid.prs_perslid_email IS NOT NULL OR aaxx_get_user = 'ENEXIS'
               THEN
                  UPDATE prs_perslid
                     SET prs_perslid_email = recPersLid.prs_perslid_email
                   WHERE prs_perslid_key = v_perslid_key;
               END IF;

               IF recPersLid.prs_perslid_oslogin IS NOT NULL OR aaxx_get_user = 'ENEXIS'
               THEN
                  UPDATE prs_perslid
                     SET prs_perslid_oslogin = recPersLid.prs_perslid_oslogin
                   WHERE prs_perslid_key = v_perslid_key;
               END IF;

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

            COMMIT;                      -- persoon in ieder geval toegevoegd.

            IF p_wp_mode <> 0
            THEN
               IF p_wp_mode = 1
               THEN
                  v_wp_expliciet := 0;
               ELSE
                  v_wp_expliciet := 1;
               END IF;

               -- Werkplekken
               v_aanduiding :=
                     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_errormsg := '';

               prs_update_werkplek (recPersLid.alg_locatie_code,
                                    recPersLid.alg_gebouw_code,
                                    recPersLid.alg_verdieping_volgnr,
                                    recPersLid.alg_ruimte_nr,
                                    recPersLid.prs_werkplek_volgnr,
                                    recPersLid.prs_werkplek_omschrijving,
                                    v_perslid_key,
                                    v_wp_expliciet,
                                    p_std_wp_ruimte_nr,
                                    v_errormsg,
                                    v_errorhint);

               IF v_errormsg IS NOT NULL
               THEN
                  v_wpcount_error := v_wpcount_error + 1;
                  fac.imp_writelog (p_import_key,
                                    'W',
                                    v_aanduiding || v_errormsg,
                                    v_errorhint);
               END IF;
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               v_count_error := v_count_error + 1;
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     ' (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 fac_gen_update_perslid;


   PROCEDURE prs_del_perslid (p_import_key     IN NUMBER,
                              p_perslid_key    IN NUMBER,
                              p_wp_expliciet   IN NUMBER,
                              p_delete         IN NUMBER)      -- verwijderen we de persoon (1) of zette we de verwijdervlag(0)
   IS
      v_newline        VARCHAR2 (1000);                          -- Input line
      v_errormsg       VARCHAR2 (1000);
      v_errorhint      VARCHAR2 (1000);
      oracle_err_num   NUMBER;
      oracle_err_mes   VARCHAR2 (200);

      v_count          NUMBER (10);

      --
      v_perslid_key    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 AND p_delete = 1
         THEN
            -- Persoon heeft geen enkele (actuele of historische) verplichting
            v_errorhint :=
               'Verwijderen van persoon met key ' || TO_CHAR (v_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 = DECODE(aaxx_get_user, 'IT', 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 prs_del_perslid;

   PROCEDURE insert_perslid_from_mld (p_applname       IN VARCHAR2,
                                      p_applrun        IN VARCHAR2)
   IS

      CURSOR C
      IS
        SELECT (SELECT mld_kenmerkmelding_waarde
                  FROM mld_kenmerkmelding km, mld_kenmerk k
                 WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                       AND km.mld_melding_key = m.mld_melding_key
                       AND k.mld_srtkenmerk_key = 201)
                  achternaam,
               (SELECT UPPER(SUBSTR(fac_usrdata_omschr,1,1))
                  FROM mld_kenmerkmelding km, mld_kenmerk k, fac_usrdata ud
                 WHERE     km.mld_kenmerkmelding_waarde = ud.fac_usrdata_key
                       AND km.mld_kenmerk_key = k.mld_kenmerk_key
                       AND km.mld_melding_key = m.mld_melding_key
                       AND k.mld_srtkenmerk_key = 202)
                  geslacht,
               (SELECT mld_kenmerkmelding_waarde
                  FROM mld_kenmerkmelding km, mld_kenmerk k
                 WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                       AND km.mld_melding_key = m.mld_melding_key
                       AND k.mld_srtkenmerk_key = 203)
                  tussenvoegsel,
               (SELECT mld_kenmerkmelding_waarde
                  FROM mld_kenmerkmelding km, mld_kenmerk k
                 WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                       AND km.mld_melding_key = m.mld_melding_key
                       AND k.mld_srtkenmerk_key = 204)
                  voorletters,
               (SELECT mld_kenmerkmelding_waarde
                  FROM mld_kenmerkmelding km, mld_kenmerk k
                 WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                       AND km.mld_melding_key = m.mld_melding_key
                       AND k.mld_srtkenmerk_key = 205)
                  voornaam,
               (SELECT mld_kenmerkmelding_waarde
                  FROM mld_kenmerkmelding km, mld_kenmerk k
                 WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                       AND km.mld_melding_key = m.mld_melding_key
                       AND k.mld_srtkenmerk_key = 206)
                  titel,
               (SELECT mld_kenmerkmelding_waarde
                  FROM mld_kenmerkmelding km, mld_kenmerk k
                 WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                       AND km.mld_melding_key = m.mld_melding_key
                       AND k.mld_srtkenmerk_key = 208)
                  telefoon,
               (SELECT mld_kenmerkmelding_waarde
                  FROM mld_kenmerkmelding km, mld_kenmerk k
                 WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                       AND km.mld_melding_key = m.mld_melding_key
                       AND k.mld_srtkenmerk_key = 209)
                  mobiel,
               (SELECT mld_kenmerkmelding_waarde
                  FROM mld_kenmerkmelding km, mld_kenmerk k
                 WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                       AND km.mld_melding_key = m.mld_melding_key
                       AND k.mld_srtkenmerk_key = 210)
                  email,
               (SELECT mld_kenmerkmelding_waarde
                  FROM mld_kenmerkmelding km, mld_kenmerk k
                 WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                       AND km.mld_melding_key = m.mld_melding_key
                       AND k.mld_srtkenmerk_key = 211)
                  login,
               (SELECT mld_kenmerkmelding_waarde
                  FROM mld_kenmerkmelding km, mld_kenmerk k
                 WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                       AND km.mld_melding_key = m.mld_melding_key
                       AND k.mld_srtkenmerk_key = 212)
                  organisatie,
               mld_melding_key
          FROM mld_melding m
         WHERE mld_stdmelding_key = 221 AND mld_melding_status IN (2, 3);
     v_prs_srtperslid_key  NUMBER(10);
     v_count               NUMBER(10);
     v_prs_afdeling_key    NUMBER(10);
     v_fac_profiel_key     NUMBER(10);
     v_facilitor_key       NUMBER(10);
     v_prs_perslid_key     NUMBER(10);
     v_error_msg           VARCHAR2(1000);

   BEGIN
      v_prs_srtperslid_key  := 1;  -- onbekend
      v_fac_profiel_key     := 1;  -- 500 euro
      v_facilitor_key       := 4;  -- key van Facilitor user
      v_error_msg           := NULL;

      FOR rec IN c
      LOOP
         BEGIN
            BEGIN
              SELECT MIN(prs_afdeling_key)
                INTO v_prs_afdeling_key
                FROM prs_afdeling
               WHERE prs_kostenplaats_key = rec.organisatie
                 AND prs_afdeling_verwijder IS NULL;

              IF v_prs_afdeling_key IS NULL THEN
                v_error_msg := 'Geen geldige afdeling gevonden';
              ELSE
                SELECT COUNT(prs_perslid_key)
                  INTO v_count
                  FROM prs_perslid
                 WHERE prs_perslid_oslogin = UPPER(rec.login)
                   AND prs_perslid_verwijder IS NULL;

                IF v_count <> 0 THEN
                  v_error_msg := 'Persoon met deze login komt al voor.';
                ELSE

                  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_titel,
                                          prs_perslid_geslacht,
                                          fac_profiel_key,
                                          prs_perslid_oslogin)
                     VALUES ('PRS',
                             v_prs_srtperslid_key,
                             v_prs_afdeling_key,
                             substr(rec.achternaam,1,30),
                             substr(rec.voorletters,1,10),
                             substr(rec.tussenvoegsel,1,15),
                             substr(rec.voornaam,1,30),
                             substr(rec.telefoon,1,15),
                             substr(rec.mobiel,1,15),
                             substr(rec.email,1,200),
                             substr(rec.titel,1,15),
                             DECODE (rec.geslacht, 'M', 1, 0),
                             v_fac_profiel_key,
                             substr(rec.login,1,30))
                  RETURNING prs_perslid_key
                       INTO v_prs_perslid_key;
                END IF;
              END IF;
            EXCEPTION WHEN OTHERS THEN
              v_error_msg := 'Onbekende fout opgetreden tijdens het toevoegen van de persoon.\nNeem contact op met de beheerder.';
              v_error_msg := v_error_msg + SUBSTR (SQLERRM, 1, 200);
            END;

            IF v_error_msg IS NULL THEN
               BEGIN
                  -- accepteren van de melding.
                  mld.setmeldingstatus(rec.mld_melding_key, 4, v_facilitor_key);
                  mld.setmeldingstatus(rec.mld_melding_key, 5, v_facilitor_key);
                  UPDATE mld_melding
                     SET mld_melding_opmerking = 'Persoon is aangemaakt.'
                   WHERE mld_melding_key = rec.mld_melding_key;
                  mld.mld_nextworkflowstep (rec.mld_melding_key, 0);
               END;
            ELSE
               BEGIN
                  mld.setmeldingstatus(rec.mld_melding_key, 1, v_facilitor_key);
                  UPDATE mld_melding
                     SET mld_melding_opmerking = v_error_msg
                   WHERE mld_melding_key = rec.mld_melding_key;
               END;
            END IF;
         END;
      END LOOP;
   END insert_perslid_from_mld;

    -- Return number of workdays between two dates, not including the startdate, weekends and holidays
    FUNCTION count_Work_Days0( pdate1 IN DATE , pdate2 IN DATE, pInclTime IN BOOLEAN ) RETURN NUMBER IS
    eikdag NUMBER;
    v_date_from DATE;
    v_date_to DATE;
    v_time_from NUMBER;
    v_time_to NUMBER;
    v_extra_day NUMBER;
    lbackwards BOOLEAN;
    v_week NUMBER;
    v_mod NUMBER;
    v_day_from NUMBER;
    v_day_to NUMBER;
    v_holidays NUMBER;
    BEGIN

     -- Remove time-part from dates (ie. set to 0:00) and set dates chronologically
     IF pdate1 > pdate2 THEN
       v_date_from := TRUNC(pdate2);
       v_date_to := TRUNC(pdate1);
       v_time_from := to_char(pdate2,'sssss');
       v_time_to := to_char(pdate1,'sssss');
       lbackwards := TRUE;
     ELSE
       v_date_from := TRUNC(pdate1);
       v_date_to := TRUNC(pdate2);
       v_time_from := to_char(pdate1,'sssss');
       v_time_to := to_char(pdate2,'sssss');
       lbackwards := FALSE;
     END IF;

     -- Determine whole weeks (v_week) and remaining days (v_mod) between FROM and TO
     v_week := trunc((v_date_to - v_date_from)/7);
     v_mod := mod((v_date_to - v_date_from),7);

     -- Correct remaining days (v_mod) depending on the FROM and TO "day-number"
     v_day_from := MOD (TO_CHAR (v_date_from, 'J') + 1, 7) + 1;
     v_day_to := MOD (TO_CHAR (v_date_to, 'J') + 1, 7) + 1;
     IF v_day_from = 1 THEN               /* FROM is sunday */
       IF v_day_to = 7 THEN               /* TO is saturday */
         v_mod := v_mod - 1;              /* should always be 5! */
       END IF;
     ELSIF v_day_from = 7 THEN            /* FROM is saturday */
       IF v_day_to != 7 THEN              /* TO is not saturday */
         v_mod := v_mod - 1;              /* exclude sunday succeding FROM-saturday */
       END IF;
     ELSE                                 /* FROM is workday */
       IF v_day_to = 7 THEN               /* TO is saturday */
         v_mod := v_mod - 1;              /* exclude TO-saturday */
       ELSIF v_day_to < v_day_from THEN   /* weekend between FROM and TO */
         v_mod := v_mod - 2;              /* exclude weekend */
       END IF;
     END IF;

     v_extra_day := 0;
     IF pInclTime THEN
       IF v_time_to > v_time_from THEN
         v_extra_day := 1;
       END IF;
     END IF;

     -- Determine the registered holidays between FROM+1 (excluding startdate!) and TO
     SELECT count(*)
       INTO v_holidays
       FROM MLD_VRIJE_DAGEN
      WHERE MLD_VRIJE_DAGEN_DATUM BETWEEN v_date_from+1 AND v_date_to;

     IF lbackwards THEN
       RETURN  0 - (5 * v_week + v_mod + v_extra_day - v_holidays);
     ELSE
       RETURN  5 * v_week + v_mod + v_extra_day - v_holidays;
     END IF;
    EXCEPTION
     WHEN OTHERS THEN RETURN NULL;
    END;

   FUNCTION count_Work_Days_InclTime( pdate1 IN DATE , pdate2 IN DATE ) RETURN NUMBER IS
   	BEGIN
    	RETURN count_Work_Days0(pdate1,pdate2, TRUE);
    END;

    FUNCTION count_Work_Days( pdate1 IN DATE , pdate2 IN DATE ) RETURN NUMBER IS
   	BEGIN
    	RETURN count_Work_Days0(pdate1,pdate2, FALSE);
    END;

END;
/