/*  $Revision$
 *  $Id$
 */

/*  FAC_PACF.SRC, (F means FIP) to be included from fac_pac.src, isolated for convenience only
 *
 *  Facilitor Import (en Export) routines. Verplichte richtlijnen:
 *
 *  Voor Importfunctie XXXX moeten (uitsluitend) worden gedefinieerd
 *  tabel fac_imp_XXXX
 *  procedure fac_import_XXXX vult die tabel
 *  procedure fac_update_XXXX vult de database op basis van die tabel
 *
 *  evt nodige functies en procedures moeten lokaal of generiek toepasbaar worden gedefinieerd
 */

-- Generieke procedure om csv-regels uit FAC_IMP_FILE
-- te splitsen naar losse kolommen in FAC_IMP_CSV
CREATE OR REPLACE PROCEDURE fac_import_file2csv (p_import_key IN NUMBER)
AS
    CURSOR c1
    IS
          SELECT fac_imp_file_index, fac_imp_file_line
            FROM fac_imp_file
           WHERE fac_import_key = p_import_key
        ORDER BY fac_imp_file_index;

    c_delim       VARCHAR2 (1);
    v_newline     fac_imp_file.fac_imp_file_line%TYPE;                                                               -- Input line
    v_errorhint   VARCHAR2 (1000);

    TYPE array_t IS VARRAY (100) OF VARCHAR2 (4000);

    a_fields      array_t := array_t ();

    rec_count     fac_imp_csv.fac_imp_csv_index%TYPE;
    collist       VARCHAR2 (4000);
    fldlist       VARCHAR2 (4000);

    l_cursor      INTEGER DEFAULT DBMS_SQL.open_cursor;
    l_sql         VARCHAR2 (4000);
    returnValue   PLS_INTEGER;
BEGIN
    SELECT COALESCE (fac_import_app_delimiter, ';')
      INTO c_delim
      FROM fac_import fi, fac_import_app fia
     WHERE fi.fac_import_key = p_import_key AND fi.fac_import_app_key = fia.fac_import_app_key;

    rec_count := 0;

    FOR rec IN c1
    LOOP
        v_errorhint := 'Fout bij splitsen csv regel';
        v_newline := rec.fac_imp_file_line;

        IF TRIM (REPLACE (v_newline, c_delim, '')) IS NULL                                                     -- geen lege regels
        THEN
            CONTINUE;
        END IF;

        rec_count := rec_count + 1;

        FOR f IN 1 .. 100
        LOOP
            IF (rec_count = 1)                                                -- eerste (header) regel bepaalt het aantal kolommen
            THEN
                IF (a_fields.COUNT = 100)
                THEN
                    raise_application_error(-20001, 'More than ' || a_fields.COUNT || ' columns in csv');
                END IF;

                a_fields.EXTEND;
                collist := collist || ', fac_imp_csv_col' || CASE WHEN f < 10 THEN '0' ELSE '' END || f;
                fldlist := fldlist || ', :a_fields' || f;
            ELSIF f > a_fields.COUNT
            THEN
                CONTINUE;
            END IF;

            fac.imp_getfield (v_newline, c_delim, a_fields (f));

            IF v_newline IS NULL                                                                           -- klaar met deze regel
            THEN
                EXIT;
            END IF;
        END LOOP;

        IF (rec_count = 1)
        THEN
            DBMS_OUTPUT.Put_line ('Detected ' || a_fields.COUNT || ' columns in csv');
            fac.imp_writelog (p_import_key,
                              'I',
                              'Detected ' || a_fields.COUNT || ' columns in csv',
                              '');
            l_sql :=
                   'INSERT INTO fac_imp_csv (fac_import_key, fac_imp_csv_index'
                || collist
                || ') VALUES (:import_key, :rec_count'
                || fldlist
                || ')';
            --DBMS_OUTPUT.put_line (l_sql);
            DBMS_SQL.parse (l_cursor, l_sql, DBMS_SQL.native);
            DBMS_SQL.bind_variable (l_cursor, ':import_key', p_import_key);
        END IF;
        DBMS_SQL.bind_variable (l_cursor, ':rec_count', rec.fac_imp_file_index);

        FOR f IN 1 .. a_fields.COUNT
        LOOP
            DBMS_SQL.bind_variable (l_cursor, ':a_fields' || f, a_fields (f));
        END LOOP;

        returnValue := DBMS_SQL.execute (l_cursor);
    END LOOP;

    IF (rec_count > 0)
    THEN
        DBMS_SQL.close_cursor (l_cursor);
    END IF;

    fac.imp_writelog (p_import_key,
                      'S',
                      'Converted ' || rec_count || ' csv lines',
                      '');
EXCEPTION
    WHEN OTHERS
    THEN
        fac.imp_writelog (p_import_key,
                          'E',
                          'ORACLE (error ' || SQLCODE || '/' || SUBSTR (SQLERRM, 1, 200) || ')',
                          v_errorhint);
END;
/

CREATE OR REPLACE PROCEDURE fac_import_genericcsv (
   p_import_key IN NUMBER
)
IS
BEGIN
    fac_import_file2csv(p_import_key);
END;
/

-- Geen PROCEDURE fac_update_genericcsv, dat gebeurt in de praktijk met een custom once script

-- Procedures om catalogi in te lezen en te verwerken
CREATE OR REPLACE PROCEDURE fac_import_catalogus (
   p_import_key IN NUMBER
)
IS
   p_discipline_key   NUMBER(10);
   p_bedrijf_key      NUMBER(10);

   c_delim                     VARCHAR2 (2) := fac.import_delimiter(p_import_key);
   v_newline                   fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
   v_errormsg                  VARCHAR2 (1000);
   v_errorhint                 VARCHAR2 (1000);
   oracle_err_num              NUMBER;
   oracle_err_mes              VARCHAR2 (200);
   v_aanduiding                VARCHAR2 (200);
   header_is_valid             NUMBER := 0;
   v_count_tot                 NUMBER (10) := 0;
   v_count_import              NUMBER (10) := 0;
   v_ongeldig                  NUMBER (1) := 0;

   -- De importvelden
   v_discipline_omschrijving   VARCHAR2 (255);
   v_bedrijf_naam              VARCHAR2 (255);
   v_catalogus_datum           VARCHAR2 (255);
   v_srtdeel_nr                VARCHAR2 (255);
   v_srtgroep_omschrijving     VARCHAR2 (255);
   v_srtdeel_omschrijving      VARCHAR2 (255);
   v_srtdeel_prijs             VARCHAR2 (255);
   v_srtdeel_eenheid           VARCHAR2 (255);
   v_srtdeel_image             VARCHAR2 (255);
   v_srtdeel_veelvoud          VARCHAR2 (255);
   v_srtdeel_btw               VARCHAR2 (255);
   v_srtdeel_vervaldatum       VARCHAR2 (255);
   v_srtdeel_inkprijs          VARCHAR2 (255);
   v_srtdeel_minimum           VARCHAR2 (255);
   v_bes_staffeltabel_naam     VARCHAR2 (255);
   v_srtdeel_wijzigdagen       VARCHAR2 (255);
   v_srtdeel_annuleerdagen     VARCHAR2 (255);
   v_srtdeel_opmerking         VARCHAR2 (4000); -- straks afgekapt op 2000

   -- Overige velden:
   v_discipline_key            NUMBER (10);
   v_bedrijf_key               NUMBER (10);
   v_bes_staffeltabel_key      NUMBER (10);


   CURSOR c1
   IS
        SELECT   fac_imp_file_line,
                 LENGTH (TRIM (REPLACE (fac_imp_file_line, c_delim, '')))
                    regellengte
          FROM   FAC_IMP_FILE
         WHERE   fac_import_key = p_import_key
      ORDER BY   fac_imp_file_index;
BEGIN
  SELECT ins_discipline_key, prs_bedrijf_key
    INTO p_discipline_key, p_bedrijf_key
    FROM fac_import fi, fac_import_app fia
   WHERE fi.fac_import_key = p_import_key
     AND fi.fac_import_app_key = fia.fac_import_app_key;

   -- Eerst opruiming
   -- LET OP: we ondersteunen geen multi-variant meer
   DELETE FROM fac_imp_catalogus;

   FOR rec IN c1
   LOOP
      BEGIN
         v_aanduiding := '';
         v_errorhint := 'Fout inlezen importregel';
         v_newline := rec.fac_imp_file_line;
         v_ongeldig := 0;

         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_delim, v_discipline_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_bedrijf_naam);
         fac.imp_getfield (v_newline, c_delim, v_catalogus_datum);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_nr);
         fac.imp_getfield (v_newline, c_delim, v_srtgroep_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_prijs);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_eenheid);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_image);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_veelvoud);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_btw);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_vervaldatum);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_inkprijs);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_minimum);
         fac.imp_getfield (v_newline, c_delim, v_bes_staffeltabel_naam);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_wijzigdagen);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_annuleerdagen);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_opmerking);

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij - sinds UWVA#21562 - bijna alle
         -- kolommen (spaties in kolomheaders zijn onhandig bij "round-trip syncen").
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF UPPER (TRIM (v_discipline_omschrijving)) LIKE 'CATALOGUS%'
               AND UPPER (TRIM (v_bedrijf_naam)) = 'LEVERANCIER'
               --AND UPPER (TRIM (v_catalogus_datum)) = 'CAT DATUM' -- Laat maar!
               AND UPPER (TRIM (v_srtdeel_nr)) = 'ARTIKELNR'
               AND UPPER (TRIM (v_srtgroep_omschrijving)) = 'GROEP'
               AND UPPER (TRIM (v_srtdeel_omschrijving)) = 'OMSCHRIJVING'
               AND UPPER (TRIM (v_srtdeel_prijs)) = 'PRIJS'
               AND UPPER (TRIM (v_srtdeel_eenheid)) = 'EENHEID'
               AND UPPER (TRIM (v_srtdeel_image)) = 'PICTURE'
               AND UPPER (TRIM (v_srtdeel_veelvoud)) = 'ORDERAANTAL'
               AND UPPER (TRIM (v_srtdeel_btw)) = 'TAX'
               AND UPPER (TRIM (v_srtdeel_vervaldatum)) = 'DUEDATE'
               AND UPPER (TRIM (v_srtdeel_inkprijs)) = 'INKOOPPRIJS'
               AND UPPER (TRIM (v_srtdeel_minimum)) = 'MINIMUM'
               AND UPPER (TRIM (v_bes_staffeltabel_naam)) = 'STAFFELTABEL'
               --AND UPPER (TRIM (v_srtdeel_wijzigdagen)) = 'WIJZIGDAGEN' -- Laat maar!
               --AND UPPER (TRIM (v_srtdeel_annuleerdagen)) = 'ANNULEERDAGEN' -- Laat maar!
               AND UPPER (TRIM (v_srtdeel_opmerking)) = 'OPMERKING'
            THEN
               header_is_valid := 1;
            END IF;
         ELSIF rec.regellengte > 1                   -- Lege regels overslaan!
         THEN
            v_count_tot := v_count_tot + 1;
            v_aanduiding :=
                  '['
               || TRIM (v_discipline_omschrijving)
               || '|'
               || TRIM (v_bedrijf_naam)
               || '|'
               || TRIM (v_srtdeel_nr)
               || '] ';

            v_discipline_omschrijving := TRIM (v_discipline_omschrijving);
            v_errorhint :=
               'Catalogus onbekend/ongeldig; regel wordt niet ingelezen';

            SELECT   ins_discipline_key
              INTO   v_discipline_key
              FROM   INS_TAB_DISCIPLINE
             WHERE   UPPER (ins_discipline_omschrijving) =
                        UPPER (v_discipline_omschrijving)
                     AND COALESCE (p_discipline_key, ins_discipline_key) =
                           ins_discipline_key -- CONN#20934/Import bedoelt voor catalogus?
                     AND ins_discipline_module = 'BES'
                     AND ins_discipline_verwijder IS NULL;

            v_bedrijf_naam := TRIM (v_bedrijf_naam);
            v_errorhint :=
               'Bedrijf onbekend/ongeldig; regel wordt niet ingelezen';

            SELECT   prs_bedrijf_key
              INTO   v_bedrijf_key
              FROM   PRS_BEDRIJF
             WHERE   UPPER (prs_bedrijf_naam) = UPPER (v_bedrijf_naam)
                     AND COALESCE (p_bedrijf_key, prs_bedrijf_key) =
                           prs_bedrijf_key     -- Import bedoelt voor bedrijf?
                     AND prs_bedrijf_verwijder IS NULL;

            v_errorhint := 'Fout bij controleren importregel';

            -- Indien leeg, dan catalogusdatum=SYSDATE gebruiken!
            v_catalogus_datum :=
               COALESCE (TRIM (v_catalogus_datum),
                         TO_CHAR (SYSDATE, 'yyyymmdd'));

            IF fac.safe_to_date (v_catalogus_datum, 'yyyymmdd') IS NULL
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Ongeldige catalogusdatum',
                                 'Regel wordt niet ingelezen');
               v_ongeldig := 1;
            END IF;

            v_srtdeel_nr := TRIM (v_srtdeel_nr);

            IF LENGTH (v_srtdeel_nr) > 32
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Artikelnummer te lang',
                  'Nummer wordt afgebroken (Nr:' || v_srtdeel_nr || ')'
               );
            END IF;

            v_srtgroep_omschrijving := TRIM (v_srtgroep_omschrijving);

            IF LENGTH (v_srtgroep_omschrijving) > 60
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Groepomschrijving te lang',
                  'Omschrijving wordt afgebroken (Nr:' || v_srtdeel_nr || ')'
               );
            END IF;

            v_srtdeel_omschrijving := TRIM (v_srtdeel_omschrijving);

            IF LENGTH (v_srtdeel_omschrijving) > 100
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Artikelomschrijving te lang',
                  'Omschrijving wordt afgebroken (Nr:' || v_srtdeel_nr || ')'
               );
            END IF;

            -- Indien leeg, dan blijft/wordt prijs=ongedefinieerd=NULL!
            v_srtdeel_prijs := TRIM (v_srtdeel_prijs);

            IF v_srtdeel_prijs IS NOT NULL
               AND fac.safe_to_number (v_srtdeel_prijs) IS NULL
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Ongeldige prijs',
                  'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
               );
               v_ongeldig := 1;
            END IF;

            v_srtdeel_eenheid := TRIM (v_srtdeel_eenheid);

            IF LENGTH (v_srtdeel_eenheid) > 30
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Eenheid te lang',
                  'Eenheid wordt afgebroken (Nr:' || v_srtdeel_nr || ')'
               );
            END IF;

            v_srtdeel_image := TRIM (v_srtdeel_image);

            IF LENGTH (v_srtdeel_image) > 255
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Imagenaam te lang',
                  'Naam wordt afgebroken (Nr:' || v_srtdeel_nr || ')'
               );
            END IF;

            -- Veelvoud mag niet negatief of meer zijn dan 6 posities lang.
            -- Indien leeg, dan veelvoud=1!
            v_srtdeel_veelvoud := COALESCE (TRIM (v_srtdeel_veelvoud), '1');

            IF    fac.safe_to_number (v_srtdeel_veelvoud) IS NULL
               OR fac.safe_to_number (v_srtdeel_veelvoud) < 0
               OR fac.safe_to_number (v_srtdeel_veelvoud) > 999999
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Ongeldig veelvoud',
                  'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
               );
               v_ongeldig := 1;
            END IF;

            -- Indien leeg, dan blijft/wordt BTW-tarief=ongedefinieerd=NULL!
            v_srtdeel_btw := TRIM (v_srtdeel_btw);

            IF v_srtdeel_btw IS NOT NULL
               AND fac.safe_to_number (v_srtdeel_btw) IS NULL
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Ongeldig BTW-tarief',
                  'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
               );
               v_ongeldig := 1;
            END IF;

            -- Indien leeg, dan blijft/wordt vervaldatum=ongedefinieerd=NULL!
            v_srtdeel_vervaldatum := TRIM (v_srtdeel_vervaldatum);

            IF v_srtdeel_vervaldatum IS NOT NULL
               AND fac.safe_to_date (v_srtdeel_vervaldatum, 'yyyymmdd') IS NULL
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Ongeldige vervaldatum',
                  'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
               );
               v_ongeldig := 1;
            END IF;

            -- Indien leeg, dan blijft/wordt inkoopprijs=ongedefinieerd=NULL!
            v_srtdeel_inkprijs := TRIM (v_srtdeel_inkprijs);

            IF v_srtdeel_inkprijs IS NOT NULL
               AND fac.safe_to_number (v_srtdeel_inkprijs) IS NULL
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Ongeldige inkoopprijs',
                  'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
               );
               v_ongeldig := 1;
            END IF;

            -- Minimum mag niet negatief of meer zijn dan 6 posities lang.
            -- Indien leeg, dan blijft/wordt minimum=ongedefinieerd=NULL!
            v_srtdeel_minimum := TRIM (v_srtdeel_minimum);

            IF v_srtdeel_minimum IS NOT NULL
               AND (   fac.safe_to_number (v_srtdeel_minimum) IS NULL
                    OR fac.safe_to_number (v_srtdeel_minimum) < 0
                    OR fac.safe_to_number (v_srtdeel_minimum) > 999999)
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Ongeldig minimum',
                  'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
               );
               v_ongeldig := 1;
            END IF;

            v_bes_staffeltabel_naam := TRIM (v_bes_staffeltabel_naam);
            v_errorhint :=
               'Fout bij bepalen staffeltabel; regel wordt niet ingelezen';

            IF v_bes_staffeltabel_naam IS NOT NULL
            THEN
               SELECT   bes_staffeltabel_key
                 INTO   v_bes_staffeltabel_key
                 FROM   bes_staffeltabel
                WHERE   UPPER (bes_staffeltabel_naam) =
                           UPPER (v_bes_staffeltabel_naam);
            END IF;

            -- Wijzigdagen mag niet negatief of meer zijn dan 3 posities lang.
            -- Indien leeg, dan blijft/wordt wijzigdagen=ongedefinieerd=NULL!
            v_srtdeel_wijzigdagen := TRIM (v_srtdeel_wijzigdagen);

            IF v_srtdeel_wijzigdagen IS NOT NULL
               AND (   fac.safe_to_number (v_srtdeel_wijzigdagen) IS NULL
                    OR fac.safe_to_number (v_srtdeel_wijzigdagen) < 0
                    OR fac.safe_to_number (v_srtdeel_wijzigdagen) > 999)
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Ongeldig aantal wijzigdagen',
                  'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
               );
               v_ongeldig := 1;
            END IF;

            -- Annuleerdagen mag niet negatief of meer zijn dan 3 posities lang.
            -- Indien leeg, dan blijft/wordt annuleerdagen=ongedefinieerd=NULL!
            v_srtdeel_annuleerdagen := TRIM (v_srtdeel_annuleerdagen);

            IF v_srtdeel_annuleerdagen IS NOT NULL
               AND (   fac.safe_to_number (v_srtdeel_annuleerdagen) IS NULL
                    OR fac.safe_to_number (v_srtdeel_annuleerdagen) < 0
                    OR fac.safe_to_number (v_srtdeel_annuleerdagen) > 999)
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Ongeldig aantal annuleerdagen',
                  'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
               );
               v_ongeldig := 1;
            END IF;

            v_srtdeel_opmerking := TRIM (v_srtdeel_opmerking);

            IF LENGTH (v_srtdeel_opmerking) > 2000
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Opmerking te lang',
                  'Opmerking wordt afgebroken (Nr:' || v_srtdeel_nr || ')'
               );
            END IF;

            IF v_ongeldig = 0
            THEN
               v_errorhint := 'Fout toevoegen importregel';

               INSERT INTO FAC_IMP_CATALOGUS (
                                                 fac_import_key,
                                                 ins_discipline_key,
                                                 prs_bedrijf_key,
                                                 fac_imp_catalogus_datum,
                                                 ins_srtdeel_nr,
                                                 ins_srtgroep_omschrijving,
                                                 ins_srtdeel_omschrijving,
                                                 ins_srtdeel_prijs,
                                                 ins_srtdeel_inkprijs,
                                                 ins_srtdeel_eenheid,
                                                 ins_srtdeel_image,
                                                 ins_srtdeel_veelvoud,
                                                 ins_srtdeel_btw,
                                                 ins_srtdeel_vervaldatum,
                                                 ins_srtdeel_minimum,
                                                 bes_staffeltabel_key,
                                                 ins_srtdeel_wijzigdagen,
                                                 ins_srtdeel_annuleerdagen,
                                                 ins_srtdeel_opmerking
                          )
                 VALUES   (
                              p_import_key,
                              v_discipline_key,
                              v_bedrijf_key,
                              fac.safe_to_date (v_catalogus_datum,
                                                'yyyymmdd'),
                              SUBSTR (v_srtdeel_nr, 1, 32),
                              SUBSTR (v_srtgroep_omschrijving, 1, 60),
                              SUBSTR (v_srtdeel_omschrijving, 1, 100),
                              fac.safe_to_number (v_srtdeel_prijs),
                              fac.safe_to_number (v_srtdeel_inkprijs),
                              SUBSTR (v_srtdeel_eenheid, 1, 30),
                              SUBSTR (v_srtdeel_image, 1, 255),
                              fac.safe_to_number (v_srtdeel_veelvoud),
                              fac.safe_to_number (v_srtdeel_btw),
                              fac.safe_to_date (v_srtdeel_vervaldatum,
                                                'yyyymmdd'),
                              fac.safe_to_number (v_srtdeel_minimum),
                              v_bes_staffeltabel_key,
                              fac.safe_to_number (v_srtdeel_wijzigdagen),
                              fac.safe_to_number (v_srtdeel_annuleerdagen),
                              SUBSTR (v_srtdeel_opmerking, 1, 2000)
                          );

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

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

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=
         'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Inlezen catalogus afgebroken!');
END fac_import_catalogus;
/

CREATE OR REPLACE PROCEDURE fac_update_catalogus (
   p_import_key IN NUMBER
)
AS
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_aanduiding     VARCHAR2 (200);
   v_disc_oms       ins_tab_discipline.ins_discipline_omschrijving%TYPE;
   v_bedr_naam      prs_bedrijf.prs_bedrijf_naam%TYPE;

   -- Voor één catalogus
   PROCEDURE l_update_catalogus (pdisc_key IN NUMBER, pbedr_key IN NUMBER)
   AS
      CURSOR c_delsrtdeel (
         cdisc_key   IN            NUMBER,
         cbedr_key   IN            NUMBER
      )
      IS
         SELECT   sd.bes_srtdeel_key,
                  sd.bes_srtdeel_nr,
                  sd.bes_srtdeel_omschrijving
           FROM   bes_srtdeel sd, bes_srtgroep sg
          WHERE       sd.bes_srtgroep_key = sg.bes_srtgroep_key
                  AND sg.ins_discipline_key = cdisc_key
                  AND sd.prs_bedrijf_key = cbedr_key
                  AND sd.bes_srtdeel_verwijder IS NULL
                  AND NOT EXISTS -- Niet meer in importbestand irt. cat/bedrijf!
                        (SELECT   1
                           FROM   fac_imp_catalogus f
                          WHERE   fac_import_key = p_import_key
                                  AND f.ins_discipline_key = cdisc_key
                                  AND f.prs_bedrijf_key = cbedr_key
                                  AND UPPER (f.ins_srtdeel_nr) =
                                        UPPER (sd.bes_srtdeel_nr));

      CURSOR c_delsrtgroep (
         cdisc_key   IN            NUMBER,
         cbedr_key   IN            NUMBER
      )
      IS
         SELECT   sg.bes_srtgroep_key, sg.bes_srtgroep_omschrijving
           FROM   bes_srtgroep sg
          WHERE   sg.ins_discipline_key = cdisc_key
                  AND sg.bes_srtgroep_verwijder IS NULL
                  AND NOT EXISTS -- Niet meer in importbestand irt. alleen cat!
                        (SELECT   1
                           FROM   fac_imp_catalogus f
                          WHERE   fac_import_key = p_import_key
                                  AND f.ins_discipline_key = cdisc_key
                                  AND UPPER (f.ins_srtgroep_omschrijving) =
                                        UPPER (sg.bes_srtgroep_omschrijving))
                  AND NOT EXISTS -- Waaronder geen artikelen van ander bedrijf!
                        (SELECT   1
                           FROM   bes_srtdeel sd
                          WHERE   sd.bes_srtgroep_key = sg.bes_srtgroep_key
                                  AND sd.prs_bedrijf_key <> cbedr_key);

      CURSOR c_inssrtgroep (
         cdisc_key   IN            NUMBER,
         cbedr_key   IN            NUMBER
      )
      IS
         SELECT   DISTINCT f.ins_srtgroep_omschrijving
           FROM   fac_imp_catalogus f
          WHERE   fac_import_key = p_import_key
                  AND f.ins_srtgroep_omschrijving IS NOT NULL
                  AND f.ins_discipline_key = cdisc_key
                  AND f.prs_bedrijf_key = cbedr_key
                  AND NOT EXISTS
                        (SELECT   1
                           FROM   bes_srtgroep sg
                          WHERE   sg.ins_discipline_key = cdisc_key
                                  AND UPPER (sg.bes_srtgroep_omschrijving) =
                                        UPPER (f.ins_srtgroep_omschrijving)
                                  AND sg.bes_srtgroep_verwijder IS NULL);

      CURSOR c_updsrtdeel (
         cdisc_key   IN            NUMBER,
         cbedr_key   IN            NUMBER
      )
      IS
         SELECT   s.bes_srtdeel_key, f.*
           FROM   fac_imp_catalogus f, bes_srtgroep g, bes_srtdeel s
          WHERE       fac_import_key = p_import_key
                  AND f.ins_discipline_key = cdisc_key
                  AND f.prs_bedrijf_key = cbedr_key
                  AND g.ins_discipline_key = cdisc_key
                  AND g.bes_srtgroep_key = s.bes_srtgroep_key
                  AND UPPER (s.bes_srtdeel_nr) = UPPER (f.ins_srtdeel_nr)
                  AND s.prs_bedrijf_key = cbedr_key
                  AND s.bes_srtdeel_verwijder IS NULL;

      CURSOR c_inssrtdeel (
         cdisc_key   IN            NUMBER,
         cbedr_key   IN            NUMBER
      )
      IS
         SELECT   f.*
           FROM   fac_imp_catalogus f
          WHERE   fac_import_key = p_import_key
                  AND f.ins_discipline_key = cdisc_key
                  AND f.prs_bedrijf_key = cbedr_key
                  AND NOT EXISTS
                        (SELECT   1
                           FROM   bes_srtgroep g, bes_srtdeel s
                          WHERE   g.ins_discipline_key = cdisc_key
                                  AND g.bes_srtgroep_key = s.bes_srtgroep_key
                                  AND UPPER (s.bes_srtdeel_nr) =
                                        UPPER (f.ins_srtdeel_nr)
                                  AND s.prs_bedrijf_key = cbedr_key
                                  AND s.bes_srtdeel_verwijder IS NULL);

      ccount            NUMBER (10);
      l_srtgroep_key    NUMBER (10);
      l_bes_srtdeel_key bes_srtdeel.bes_srtdeel_key%TYPE;
      l_omschrijving    bes_srtdeel.bes_srtdeel_omschrijving%TYPE;
      l_prijs           bes_srtdeel_prijs.bes_srtdeel_prijs_prijs%TYPE;
      l_inkprijs        bes_srtdeel_prijs.bes_srtdeel_prijs_inkprijs%TYPE;
      l_veelvoud        bes_srtdeel.bes_srtdeel_veelvoud%TYPE;
      l_minimum         bes_srtdeel.bes_srtdeel_minimum%TYPE;
      l_wijzigdagen     bes_srtdeel.bes_srtdeel_wijzigdagen%TYPE;
      l_annuleerdagen   bes_srtdeel.bes_srtdeel_annuleerdagen%TYPE;
      l_opmerking       bes_srtdeel.bes_srtdeel_opmerking%TYPE;
   BEGIN
      -- DELETE SRTDEEL
      ccount := 0;

      FOR rec IN c_delsrtdeel (pdisc_key, pbedr_key)
      LOOP
         v_errormsg := 'Fout bij verwijderen artikel ' || rec.bes_srtdeel_nr;

         UPDATE   bes_srtdeel
            SET   bes_srtdeel_verwijder = SYSDATE
          WHERE   bes_srtdeel_key = rec.bes_srtdeel_key;

         v_errormsg := 'Fout bij verwijderen artikelkenmerken ' || rec.bes_srtdeel_nr;
         UPDATE   bes_kenmerk
            SET   bes_kenmerk_verwijder = SYSDATE
          WHERE   bes_kenmerk_niveau = 'S'
            AND   bes_srtinstallatie_key = rec.bes_srtdeel_key;

         fac.imp_writelog (
            p_import_key,
            'I',
               v_aanduiding
            || 'Artikel '
            || rec.bes_srtdeel_nr
            || '/'
            || rec.bes_srtdeel_omschrijving
            || ' is verwijderd',
            ''
         );
         ccount := ccount + 1;
      END LOOP;

      fac.imp_writelog (
         p_import_key,
         'S',
            v_aanduiding
         || 'Er zijn '
         || TO_CHAR (ccount)
         || ' artikelen verwijderd',
         ''
      );

      COMMIT;

      -- DELETE SRTGROEP
      ccount := 0;

      FOR rec IN c_delsrtgroep (pdisc_key, pbedr_key)
      LOOP
         v_errormsg := 'Fout bij verwijderen groep ' || rec.bes_srtgroep_omschrijving;

         UPDATE   bes_srtgroep
            SET   bes_srtgroep_verwijder = SYSDATE
          WHERE   bes_srtgroep_key = rec.bes_srtgroep_key;

         v_errormsg := 'Fout bij verwijderen groepskenmerken ' || rec.bes_srtgroep_omschrijving;
         UPDATE   bes_kenmerk
            SET   bes_kenmerk_verwijder = SYSDATE
          WHERE   bes_kenmerk_niveau = 'G'
            AND   bes_srtinstallatie_key = rec.bes_srtgroep_key;

         fac.imp_writelog (
            p_import_key,
            'I',
               v_aanduiding
            || 'Groep '
            || rec.bes_srtgroep_omschrijving
            || ' is verwijderd',
            ''
         );
         ccount := ccount + 1;
      END LOOP;

      fac.imp_writelog (
         p_import_key,
         'S',
            v_aanduiding
         || 'Er zijn '
         || TO_CHAR (ccount)
         || ' groepen verwijderd',
         ''
      );

      COMMIT;

      -- INSERT SRTGROEP
      ccount := 0;

      FOR rec IN c_inssrtgroep (pdisc_key, pbedr_key)
      LOOP
         BEGIN
            v_errormsg :=
               'Fout bij toevoegen groep ' || rec.ins_srtgroep_omschrijving;

            INSERT INTO bes_srtgroep (
                                         ins_discipline_key,
                                         bes_srtgroep_omschrijving
                       )
              VALUES   (pdisc_key, rec.ins_srtgroep_omschrijving);

            fac.imp_writelog (
               p_import_key,
               'I',
                  v_aanduiding
               || 'Groep '
               || rec.ins_srtgroep_omschrijving
               || ' is toegevoegd',
               ''
            );
            ccount := ccount + 1;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     v_errormsg
                  || ' ORACLE (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 '');
         END;
      END LOOP;

      fac.imp_writelog (
         p_import_key,
         'S',
            v_aanduiding
         || 'Er zijn '
         || TO_CHAR (ccount)
         || ' groepen toegevoegd',
         ''
      );

      COMMIT;

      -- UPDATE SRTDEEL
      ccount := 0;

      FOR rec IN c_updsrtdeel (pdisc_key, pbedr_key)
      LOOP
         BEGIN
            v_errormsg :=
               'Fout bij bepalen groep ' || rec.ins_srtgroep_omschrijving;

            SELECT   bes_srtgroep_key
              INTO   l_srtgroep_key
              FROM   bes_srtgroep
             WHERE   bes_srtgroep_verwijder IS NULL
                     AND ins_discipline_key = pdisc_key
                     AND UPPER (bes_srtgroep_omschrijving) =
                           UPPER (rec.ins_srtgroep_omschrijving);

            v_errormsg :=
               'Fout bij bepalen huidige artikel-velden '
               || rec.ins_srtdeel_nr;

            -- Tbv. logging de oude waarden opzoeken.
            SELECT   bes_srtdeel_omschrijving,
                     bes.getsrtdeelprijs (rec.bes_srtdeel_key, NULL),
                     bes.getsrtdeelinkprijs (rec.bes_srtdeel_key, NULL),
                     bes_srtdeel_veelvoud,
                     bes_srtdeel_minimum,
                     bes_srtdeel_wijzigdagen,
                     bes_srtdeel_annuleerdagen,
                     bes_srtdeel_opmerking
              INTO   l_omschrijving,
                     l_prijs,
                     l_inkprijs,
                     l_veelvoud,
                     l_minimum,
                     l_wijzigdagen,
                     l_annuleerdagen,
                     l_opmerking
              FROM   bes_srtdeel
             WHERE   bes_srtdeel_verwijder IS NULL
                     AND bes_srtdeel_key = rec.bes_srtdeel_key;

            v_errormsg := 'Fout bij bijwerken artikel ' || rec.ins_srtdeel_nr;

            -- Codetechnisch zou hier bes.upsert_srtdeel() passen, maar die doet bv nog geen inkprijs.
            -- Later nog eens TODO
            UPDATE   bes_srtdeel
               SET   bes_srtgroep_key = l_srtgroep_key,
                     bes_srtdeel_omschrijving = rec.ins_srtdeel_omschrijving,
                     bes_srtdeel_image = rec.ins_srtdeel_image,
                     bes_srtdeel_btw = rec.ins_srtdeel_btw,
                     bes_srtdeel_eenheid = rec.ins_srtdeel_eenheid,
                     bes_srtdeel_vervaldatum = rec.ins_srtdeel_vervaldatum,
                     bes_srtdeel_veelvoud = rec.ins_srtdeel_veelvoud,
                     bes_srtdeel_minimum = rec.ins_srtdeel_minimum,
                     bes_staffeltabel_key = rec.bes_staffeltabel_key,
                     bes_srtdeel_wijzigdagen = rec.ins_srtdeel_wijzigdagen,
                     bes_srtdeel_annuleerdagen = rec.ins_srtdeel_annuleerdagen,
                     bes_srtdeel_opmerking = rec.ins_srtdeel_opmerking
             WHERE   bes_srtdeel_verwijder IS NULL
                 AND bes_srtdeel_key = rec.bes_srtdeel_key;

            IF l_omschrijving <> rec.ins_srtdeel_omschrijving
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Artikel '
                  || rec.ins_srtdeel_nr
                  || '/'
                  || rec.ins_srtdeel_omschrijving
                  || ' is gewijzigd',
                     'Omschrijving '
                  || l_omschrijving
                  || ' -> '
                  || rec.ins_srtdeel_omschrijving
               );
            END IF;

            bes.upsert_srtdeel_prijs (rec.bes_srtdeel_key, rec.ins_srtdeel_prijs, rec.ins_srtdeel_inkprijs);

            IF l_prijs <> rec.ins_srtdeel_prijs
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Artikel '
                  || rec.ins_srtdeel_nr
                  || '/'
                  || rec.ins_srtdeel_omschrijving
                  || ' is gewijzigd',
                  'Prijs ' || l_prijs || ' -> ' || rec.ins_srtdeel_prijs
               );
            END IF;

            IF l_inkprijs <> rec.ins_srtdeel_inkprijs
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Artikel '
                  || rec.ins_srtdeel_nr
                  || '/'
                  || rec.ins_srtdeel_omschrijving
                  || ' is gewijzigd',
                     'Inkoopprijs '
                  || l_inkprijs
                  || ' -> '
                  || rec.ins_srtdeel_inkprijs
               );
            END IF;

            IF l_veelvoud <> rec.ins_srtdeel_veelvoud
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Artikel '
                  || rec.ins_srtdeel_nr
                  || '/'
                  || rec.ins_srtdeel_omschrijving
                  || ' is gewijzigd',
                     'Bestelveelvoud '
                  || l_veelvoud
                  || ' -> '
                  || rec.ins_srtdeel_veelvoud
               );
            END IF;

            IF l_minimum <> rec.ins_srtdeel_minimum
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Artikel '
                  || rec.ins_srtdeel_nr
                  || '/'
                  || rec.ins_srtdeel_omschrijving
                  || ' is gewijzigd',
                     'Bestelminimum '
                  || l_minimum
                  || ' -> '
                  || rec.ins_srtdeel_minimum
               );
            END IF;

            IF l_wijzigdagen <> rec.ins_srtdeel_wijzigdagen
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Artikel '
                  || rec.ins_srtdeel_nr
                  || '/'
                  || rec.ins_srtdeel_omschrijving
                  || ' is gewijzigd',
                     'Wijzigdagen '
                  || l_wijzigdagen
                  || ' -> '
                  || rec.ins_srtdeel_wijzigdagen
               );
            END IF;

            IF l_annuleerdagen <> rec.ins_srtdeel_annuleerdagen
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Artikel '
                  || rec.ins_srtdeel_nr
                  || '/'
                  || rec.ins_srtdeel_omschrijving
                  || ' is gewijzigd',
                     'Annuleerdagen '
                  || l_annuleerdagen
                  || ' -> '
                  || rec.ins_srtdeel_annuleerdagen
               );
            END IF;

            IF l_opmerking <> rec.ins_srtdeel_opmerking
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Artikel '
                  || rec.ins_srtdeel_nr
                  || '/'
                  || rec.ins_srtdeel_opmerking
                  || ' is gewijzigd',
                     'Opmerking '
                  || l_opmerking
                  || ' -> '
                  || rec.ins_srtdeel_opmerking
               );
            END IF;

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

      fac.imp_writelog (
         p_import_key,
         'S',
            v_aanduiding
         || 'Er zijn '
         || TO_CHAR (ccount)
         || ' artikelen bijgewerkt',
         ''
      );

      COMMIT;

      -- INSERT SRTDEEL
      ccount := 0;

      FOR rec IN c_inssrtdeel (pdisc_key, pbedr_key)
      LOOP
         BEGIN
            v_errormsg :=
               'Fout bij bepalen groep ' || rec.ins_srtgroep_omschrijving;

            SELECT   bes_srtgroep_key
              INTO   l_srtgroep_key
              FROM   bes_srtgroep
             WHERE   bes_srtgroep_verwijder IS NULL
                     AND ins_discipline_key = pdisc_key
                     AND UPPER (bes_srtgroep_omschrijving) =
                           UPPER (rec.ins_srtgroep_omschrijving);

            v_errormsg := 'Fout bij toevoegen artikel ' || rec.ins_srtdeel_nr;

            INSERT INTO bes_srtdeel (bes_srtgroep_key,
                                     bes_srtdeel_nr,
                                     bes_srtdeel_omschrijving,
                                     bes_srtdeel_image,
                                     bes_srtdeel_btw,
                                     bes_srtdeel_eenheid,
                                     bes_srtdeel_dimensie,
                                     prs_bedrijf_key,
                                     bes_srtdeel_vervaldatum,
                                     bes_srtdeel_veelvoud,
                                     bes_srtdeel_minimum,
                                     bes_staffeltabel_key,
                                     bes_srtdeel_wijzigdagen,
                                     bes_srtdeel_annuleerdagen,
                                     bes_srtdeel_opmerking)
              VALUES   (l_srtgroep_key,
                        rec.ins_srtdeel_nr,
                        rec.ins_srtdeel_omschrijving,
                        rec.ins_srtdeel_image,
                        rec.ins_srtdeel_btw,
                        rec.ins_srtdeel_eenheid,
                        0,
                        pbedr_key,
                        rec.ins_srtdeel_vervaldatum,
                        rec.ins_srtdeel_veelvoud,
                        rec.ins_srtdeel_minimum,
                        rec.bes_staffeltabel_key,
                        rec.ins_srtdeel_wijzigdagen,
                        rec.ins_srtdeel_annuleerdagen,
                        rec.ins_srtdeel_opmerking)
            RETURNING   bes_srtdeel_key INTO l_bes_srtdeel_key;

            bes.upsert_srtdeel_prijs (l_bes_srtdeel_key, rec.ins_srtdeel_prijs, rec.ins_srtdeel_inkprijs);

            fac.imp_writelog (
               p_import_key,
               'I',
                  v_aanduiding
               || 'Artikel '
               || rec.ins_srtdeel_nr
               || '/'
               || rec.ins_srtdeel_omschrijving
               || ' is toegevoegd',
               ''
            );
            ccount := ccount + 1;
         EXCEPTION
            WHEN DUP_VAL_ON_INDEX
            THEN
               v_errormsg := 'Artikelnummer dubbel in importbestand';
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 '');
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     v_errormsg
                  || ' ORACLE (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 '');
         END;
      END LOOP;

      fac.imp_writelog (
         p_import_key,
         'S',
            v_aanduiding
         || 'Er zijn '
         || TO_CHAR (ccount)
         || ' artikelen toegevoegd',
         ''
      );

      COMMIT;
   END;
BEGIN
   -- Doorloop alle catalogi/ bedrijven. Er kunnen er in theorie meerdere tegelijk zijn
   FOR rec IN
        (SELECT   DISTINCT ins_discipline_key, prs_bedrijf_key
          FROM   fac_imp_catalogus
         WHERE   fac_import_key = p_import_key)
   LOOP
      BEGIN
         -- Puur voor logging toch even catalogus- en bedrijfsnaam bepalen!
         v_aanduiding := '[' || TO_CHAR (rec.ins_discipline_key) || '] ';
         v_errormsg := 'Fout bepalen catalogus';

         SELECT   ins_discipline_omschrijving
           INTO   v_disc_oms
           FROM   ins_tab_discipline
          WHERE   ins_discipline_key = rec.ins_discipline_key;

         v_aanduiding := '[' || TO_CHAR (rec.prs_bedrijf_key) || '] ';
         v_errormsg := 'Fout bepalen bedrijf';

         SELECT   prs_bedrijf_naam
           INTO   v_bedr_naam
           FROM   prs_v_aanwezigbedrijf
          WHERE   prs_bedrijf_key = rec.prs_bedrijf_key;

         fac.imp_writelog (
            p_import_key,
            'I',
            'Import van catalogus ' || v_disc_oms || '/' || v_bedr_naam,
               'discipline: '
            || rec.ins_discipline_key
            || ', bedrijf: '
            || rec.prs_bedrijf_key
         );

         COMMIT;

         v_aanduiding := '[' || v_disc_oms || '|' || v_bedr_naam || '] ';
         l_update_catalogus (rec.ins_discipline_key, rec.prs_bedrijf_key);
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=
                  v_errormsg
               || ' ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              '');
            COMMIT;
      END;
   END LOOP;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=
            v_errormsg
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Verwerken catalogus afgebroken!');
END fac_update_catalogus;
/

CREATE OR REPLACE PROCEDURE fac_import_oprognose (
   p_import_key IN NUMBER
)
AS
   v_newline          fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
   v_fielddelimitor   VARCHAR2 (2);
   v_errormsg         VARCHAR2 (200);
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   header_is_valid    NUMBER;
   --
   v_objectcode       VARCHAR2 (128);
   v_ele_ondbouw      VARCHAR2 (128);
   v_han_pk           VARCHAR2 (128);
   v_element          VARCHAR2 (128);
   v_locatie          VARCHAR2 (128);
   v_handeling        VARCHAR2 (1024);
   v_gebrek           VARCHAR2 (1024);
   v_hoeveelheid      VARCHAR2 (128);
   v_eenheid          VARCHAR2 (128);
   v_prijs            VARCHAR2 (128);
   v_startjaar        VARCHAR2 (128);
   --
   v_ongeldig         NUMBER;

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

   rec1               c1%ROWTYPE;
BEGIN
   v_fielddelimitor := fac.import_delimiter(p_import_key);
   header_is_valid := 0;

   -- Clear old importdata
   DELETE FROM fac_imp_oprognose;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_ongeldig := 0;

         IF header_is_valid = 0
         THEN
            -- de eerste regel vinden we wel best
            header_is_valid := 1;
            v_ongeldig := 1;
         ELSE
            v_errormsg := 'Fout bij opvragen te importeren rij';
            v_newline := rec1.fac_imp_file_line;
            fac.imp_getfield (v_newline, v_fielddelimitor, v_objectcode);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_ele_ondbouw);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_han_pk);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_element);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_locatie);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_handeling);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_gebrek);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_hoeveelheid);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_eenheid);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_prijs);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_startjaar);
         END IF;

         IF v_ongeldig = 0
         THEN
            v_errormsg := 'Fout bij inlezen te importeren rij';

            INSERT INTO fac_imp_oprognose
                        (objectcode,
                         ele_ondbouw,
                         han_pk,
                         ELEMENT,
                         locatie,
                         handeling,
                         gebrek,
                         hoeveelheid,
                         eenheid,
                         prijs,
                         startjaar
                        )
                 VALUES (v_objectcode,
                         v_ele_ondbouw,
                         v_han_pk,
                         v_element,
                         v_locatie,
                         v_handeling,
                         v_gebrek,
                         v_hoeveelheid,
                         v_eenheid,
                         REPLACE (v_prijs, ',', '.'),
                         v_startjaar
                        );
         END IF;
      END;
   END LOOP;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_mes := SUBSTR (SQLERRM, 1, 1000);
      v_errormsg := oracle_err_mes;
      fac.imp_writelog (p_import_key, 'E', v_errormsg, 'Regel:' || v_newline);
END fac_import_oprognose;
/


CREATE OR REPLACE PROCEDURE fac_update_oprognose (
   p_import_key IN NUMBER
)
AS
   -- Constanten tbv bepalen mld_kenmerk_key
   c_han_pk                    VARCHAR2 (30)                        := 'OPROGNOSE_ID';
   c_hoeveelheid               VARCHAR2 (30)                        := 'HOEVEELHEID';
   c_eenheid                   VARCHAR2 (30)                        := 'EENHEID';
   c_prijs                     VARCHAR2 (30)                        := 'PRIJS';
   -- Constanten overig
   c_discipline_omschrijving   VARCHAR2 (60)                        := 'Planmatig onderhoud';
   c_stdmelding_notfrontend    NUMBER (1)                           := 1;
   c_meldbron_upper            VARCHAR2 (30)                        := 'SYSTEM';
   c_stdmelding_uitvoertijd    NUMBER (3)                           := 260; -- Aantal werkdagen ongeveer
   c_melding_planbaar          NUMBER (1)                           := 1;   -- Planbaar
   c_melding_module            VARCHAR2 (3)                         := 'MLD';
   c_kosten_klant              NUMBER (1)                           := TO_NUMBER (NULL);
   c_melding_status            NUMBER (10)                          := 2;   -- Ingevoerd
   c_mmddstart                 VARCHAR2 (4)                         := '0101';
   c_mmddeind                  VARCHAR2 (4)                         := '1231';
   c_melder_setting            fac_usrdata.fac_usrdata_upper%TYPE   := 'OP_MELDERKEY';
   -- Logging
   currentversion              fac_module.fac_module_version%TYPE;
   oracle_err_num              NUMBER;
   oracle_err_mes              VARCHAR2 (200);
   v_errormsg                  VARCHAR2 (1024);
   v_errormsg2                 VARCHAR2 (1024);
   v_melding_datum             DATE;
   v_melding_uitvoertijd       NUMBER (3);

   -- Cursor
   CURSOR c1
   IS
      SELECT *
        FROM fac_imp_oprognose;

   rec1                        c1%ROWTYPE;
   -- Overig
   stdmelding_key              NUMBER (10);
   discipline_key              NUMBER (10);
   meldbron_key                NUMBER (10);
   locatie_key                 NUMBER (10);
   gebouw_key                  NUMBER (10);
   kenmerk_key                 NUMBER (10);
   kenmerk_key_han_pk          NUMBER (10);
   kenmerk_key_hoeveelheid     NUMBER (10);
   kenmerk_key_eenheid         NUMBER (10);
   kenmerk_key_prijs           NUMBER (10);
   melding_key                 NUMBER (10);
   perslid_key                 NUMBER (10);
   kostenplaats_key            NUMBER (10);
   perslid_naam                VARCHAR2 (30);
   melding_new                 BOOLEAN;
   v_count_success             NUMBER (10)                          := 0;
   v_count_fail                NUMBER (10)                          := 0;
   stdm_default_disc           mld_stdmelding.mld_stdmelding_default_disc%TYPE;

   FUNCTION lgetusrsetting (str VARCHAR2)
      RETURN VARCHAR2
   IS
      lresult   fac_usrdata.fac_usrdata_omschr%TYPE;
   BEGIN
      SELECT fac_usrdata_omschr
        INTO lresult
        FROM fac_usrdata
       WHERE fac_usrtab_key = (SELECT fac_usrtab_key
                                 FROM fac_usrtab
                                WHERE fac_usrtab_object = 'USR_INSTELLINGEN') AND fac_usrdata_upper = UPPER (str);

      RETURN lresult;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         RETURN '';
   END;

   --
   -- Geeft de kenmerkkey van kenmerk met UPPER-naam (label) pkenmerkkid
   FUNCTION lgetkenmerkkey (pkenmerkid IN VARCHAR2)
      RETURN NUMBER
   AS
      v_result   mld_kenmerk.mld_kenmerk_key%TYPE;
   BEGIN
      BEGIN
         SELECT MIN (mld_kenmerk_key)
           INTO v_result
           FROM mld_srtkenmerk sk, mld_kenmerk k
          WHERE sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key AND sk.mld_srtkenmerk_upper = UPPER (pkenmerkid);
      EXCEPTION
         WHEN OTHERS
         THEN
            v_result := -1;
      END;

      RETURN v_result;
   END;

   --
   -- Geeft de meldingkey van dit OPrognose record obv ID, -1 als die niet bestaat
   FUNCTION lgetmeldingkey (poprognoseid IN VARCHAR2, pidkey IN NUMBER)
      RETURN NUMBER
   AS
      v_result   mld_kenmerkmelding.mld_melding_key%TYPE;
   BEGIN
      BEGIN
         SELECT mld_melding_key
           INTO v_result
           FROM mld_kenmerkmelding km
          WHERE km.mld_kenmerkmelding_verwijder IS NULL
            AND UPPER (km.mld_kenmerkmelding_waarde) = UPPER (poprognoseid)
            AND km.mld_kenmerk_key = pidkey;
      EXCEPTION
         WHEN OTHERS
         THEN
            v_result := -1;
      END;

      RETURN v_result;
   END;
BEGIN
   SELECT MAX (fac_module_version)
     INTO currentversion
     FROM fac_module;

   fac.imp_writelog (p_import_key,
                     'I',
                     'Facilitor OPROGNOSE import version ' || currentversion,
                     '$Revision$'
                    );
   v_errormsg := 'Opvragen discipline_key adhv ins_discipline_omschrijving = [' || c_discipline_omschrijving || ']';

--   DBMS_OUTPUT.put_line (v_errormsg);

   -- Wat is de planmatigonderhoud discipline
   SELECT ins_discipline_key
     INTO discipline_key
     FROM ins_tab_discipline
    WHERE ins_discipline_omschrijving = c_discipline_omschrijving
      AND ins_discipline_module = 'MLD';

   v_errormsg := 'Opvragen meldbron_key adhv mld_meldbron_upper = [' || c_meldbron_upper || ']';

--   DBMS_OUTPUT.put_line (v_errormsg);
   SELECT mld_meldbron_key
     INTO meldbron_key
     FROM mld_meldbron
    WHERE mld_meldbron_upper = c_meldbron_upper;

   perslid_key := lgetusrsetting (c_melder_setting);
   kenmerk_key_han_pk := lgetkenmerkkey (c_han_pk);
   kenmerk_key_hoeveelheid := lgetkenmerkkey (c_hoeveelheid);
   kenmerk_key_eenheid := lgetkenmerkkey (c_eenheid);
   kenmerk_key_prijs := lgetkenmerkkey (c_prijs);

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_errormsg := 'Opvragen mld_stdmelding_key adhv mld_stdmelding_upper = [' || rec1.ELEMENT || ']';

--         DBMS_OUTPUT.put_line (v_errormsg);
         SELECT MAX (mld_stdmelding_key)
           INTO stdmelding_key
           FROM mld_stdmelding
          WHERE mld_stdmelding_upper = UPPER (SUBSTR (rec1.ELEMENT, 1, 60));

         IF stdmelding_key IS NULL
         THEN                                                                              -- Bestaat de MLD_STDMELDING?
            SELECT mld_s_mld_stdmelding_key.NEXTVAL
              INTO stdmelding_key
              FROM DUAL;

            v_errormsg :=
               'Aanmaak nieuwe MLD_STD_MELDING met mld_stdmelding_omschrijving = [' || SUBSTR (rec1.ELEMENT, 1, 60)
               || ']';

            --DBMS_OUTPUT.put_line (v_errormsg);

            -- Aanmaak nieuwe MLD_STDMELDING
            BEGIN
               INSERT INTO mld_stdmelding
                           (mld_stdmelding_key,
                            mld_ins_discipline_key,
                            mld_stdmelding_omschrijving,
                            mld_stdmelding_notfrontend,
                             mld_stdmelding_t_uitvoertijd,
                            mld_stdmelding_planbaar
                           )
                    VALUES (stdmelding_key,
                            discipline_key,
                            SUBSTR (rec1.ELEMENT, 1, 60),
                            c_stdmelding_notfrontend,
                            MLD_T_UITVOERTIJD(c_stdmelding_uitvoertijd, 'D'),
                            c_melding_planbaar
                           );
            --DBMS_OUTPUT.put_line ('inserted ' || TO_CHAR (stdmelding_key));
            EXCEPTION
               WHEN OTHERS
               THEN
                  oracle_err_num := SQLCODE;
                  oracle_err_mes := SUBSTR (NVL (SQLERRM, 'SQLERRM=NULL!!!'), 1, 100);
                  v_errormsg2 := '(XORACLE error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                  fac.imp_writelog (p_import_key, 'E', 'Import_oprognose: ' || v_errormsg, v_errormsg2);
                  COMMIT;
            END;
         END IF;

         v_errormsg := 'Gebouw [' || rec1.objectcode || '] kan niet worden gevonden';

         SELECT alg_gebouw_key
           INTO gebouw_key
           FROM alg_gebouw
          WHERE alg_gebouw_verwijder IS NULL AND alg_gebouw_upper = UPPER (rec1.objectcode);

         -- springt naar exception als niet gevonden
         v_errormsg := 'Fout bij bepalen locatie van gebouw met key = [' || TO_CHAR (gebouw_key) || ']';

         SELECT alg_locatie_key
           INTO locatie_key
           FROM alg_gebouw
          WHERE alg_gebouw_key = gebouw_key;

         SELECT MAX (prs_kostenplaats_key)
           INTO kostenplaats_key
           FROM alg_gebouw
          WHERE alg_gebouw_key = gebouw_key;

         melding_key := lgetmeldingkey (rec1.han_pk, kenmerk_key_han_pk);
         melding_new := (melding_key = -1);

         IF melding_new
         THEN
            v_errormsg := 'Bepalen melding datum voor startjaar [' || rec1.startjaar || ']';

            --Testers pas op: vereist goede nls_territory!
            SELECT fac.count_work_days (TO_DATE (rec1.startjaar || c_mmddstart, 'YYYYMMDD'),
                                        TO_DATE (rec1.startjaar || c_mmddeind, 'YYYYMMDD')
                                       )
              INTO v_melding_uitvoertijd
              FROM DUAL;

--            DBMS_OUTPUT.put_line (v_melding_uitvoertijd);
            SELECT TO_DATE (rec1.startjaar || c_mmddstart, 'YYYYMMDD')
              INTO v_melding_datum
              FROM DUAL;

            stdm_default_disc := fac.getDefaultBehandelteam(stdmelding_key);

            v_errormsg := 'Bepalen mld_melding_key voor nieuwe melding';

--            DBMS_OUTPUT.put_line (v_errormsg);
            SELECT mld_s_mld_melding_key.NEXTVAL
              INTO melding_key
              FROM DUAL;

            v_errormsg := 'Toevoegen MELDING [' || rec1.handeling || ']';

--            DBMS_OUTPUT.put_line (v_errormsg);

            -- Invoeren melding
            INSERT INTO mld_melding
                        (mld_melding_key,
                         mld_meldbron_key,
                         mld_stdmelding_key,
                         mld_alg_locatie_key,
                         mld_alg_onroerendgoed_keys,
                         mld_melding_t_uitvoertijd,
                         mld_melding_module,
                         mld_melding_omschrijving,
                         mld_melding_opmerking,
                         mld_kosten_klant,
                         prs_perslid_key,
                         mld_melding_datum,
                         prs_kostenplaats_key,
                         mld_melding_status,
                         mld_melding_einddatum,
                         mld_ins_discipline_key
                        )
                 VALUES (melding_key,
                         meldbron_key,
                         stdmelding_key,
                         locatie_key,
                         gebouw_key,
                         MLD_T_UITVOERTIJD(v_melding_uitvoertijd, 'D'),
                         c_melding_module,
                         rec1.handeling,
                         rec1.gebrek,
                         c_kosten_klant,
                         perslid_key,
                         v_melding_datum,
                         kostenplaats_key,
                         c_melding_status,
                         TO_DATE (rec1.startjaar || c_mmddeind, 'YYYYMMDD'),
                         stdm_default_disc
                        );
         ELSE
            v_errormsg := 'Bijwerken MELDING [' || rec1.handeling || ']';

--            DBMS_OUTPUT.put_line (v_errormsg);
            UPDATE mld_melding
               SET mld_melding_omschrijving = rec1.handeling,
                   mld_melding_opmerking = rec1.gebrek
             WHERE mld_melding_key = melding_key;
         END IF;

         -- c_han_pk
         IF melding_new
         THEN
            v_errormsg := 'OPROGNOSE_ID van melding [' || TO_CHAR (melding_key) || '] = [' || rec1.han_pk || ']';

--            DBMS_OUTPUT.put_line (v_errormsg);

            -- v_errormsg := 'Insert FlexProp OPROGNOSE_ID met waarde = <'||rec1.han_pk||'>';
            INSERT INTO mld_kenmerkmelding
                        (mld_melding_key, mld_kenmerk_key, mld_kenmerkmelding_waarde)
                 VALUES (melding_key, kenmerk_key_han_pk, rec1.han_pk);
         END IF;

         -- c_hoeveelheid
         DELETE FROM mld_kenmerkmelding
               WHERE mld_melding_key = melding_key AND mld_kenmerk_key = kenmerk_key_hoeveelheid;

         IF rec1.hoeveelheid IS NOT NULL
         THEN
            v_errormsg := 'HOEVEELHEID = [' || rec1.hoeveelheid || ']';

--            DBMS_OUTPUT.put_line (v_errormsg);
            INSERT INTO mld_kenmerkmelding
                        (mld_melding_key, mld_kenmerk_key, mld_kenmerkmelding_waarde)
                 VALUES (melding_key,
                         kenmerk_key_hoeveelheid,
                         TO_CHAR (fac.safe_to_number (REPLACE (rec1.hoeveelheid, ',', '.')))
                        );
         END IF;

         -- c_eenheid
         DELETE FROM mld_kenmerkmelding
               WHERE mld_melding_key = melding_key AND mld_kenmerk_key = kenmerk_key_eenheid;

         IF rec1.eenheid IS NOT NULL
         THEN
            v_errormsg := 'EENHEID = [' || rec1.eenheid || ']';

--            DBMS_OUTPUT.put_line (v_errormsg);
            INSERT INTO mld_kenmerkmelding
                        (mld_melding_key, mld_kenmerk_key, mld_kenmerkmelding_waarde)
                 VALUES (melding_key, kenmerk_key_eenheid, rec1.eenheid);
         END IF;

         -- c_prijs
         DELETE FROM mld_kenmerkmelding
               WHERE mld_melding_key = melding_key AND mld_kenmerk_key = kenmerk_key_prijs;

         IF rec1.eenheid IS NOT NULL
         THEN
            v_errormsg := 'PRIJS = [' || rec1.prijs || ']';

--            DBMS_OUTPUT.put_line (v_errormsg);
            INSERT INTO mld_kenmerkmelding
                        (mld_melding_key, mld_kenmerk_key, mld_kenmerkmelding_waarde)
                 VALUES (melding_key, kenmerk_key_prijs, TO_CHAR (fac.safe_to_number (rec1.prijs)));
         END IF;

         -- Alles goed? Dan deze regel committen!
         COMMIT;
         v_count_success := v_count_success + 1;
      EXCEPTION
         WHEN OTHERS
         THEN
            -- Foutje? Deze regel terugdraaien
            v_count_fail := v_count_fail + 1;
            ROLLBACK;
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (NVL (SQLERRM, 'SQLERRM=NULL!!!'), 1, 100);
            fac.imp_writelog (p_import_key, 'E', v_errormsg, oracle_err_mes);
            -- de logging wel committen
            COMMIT;
      END;
   END LOOP;

   fac.imp_writelog (p_import_key,
                     'I',
                     'Import gereed, ' || v_count_success || ' regels ingelezen, ' || v_count_fail
                     || ' regels geweigerd',
                     ''
                    );
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (NVL (SQLERRM, 'SQLERRM=NULL!!!'), 1, 100);
      v_errormsg := '(' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key, 'E', 'Onverwachte fout', v_errormsg);
END;
/




--// PROCEDURES VOOR FIP imports - PROCEDURES VOOR FIP imports - PROCEDURES VOOR FIP imports - PROCEDURES VOOR FIP imports
--// PROCEDURES VOOR FIP imports - PROCEDURES VOOR FIP imports - PROCEDURES VOOR FIP imports - PROCEDURES VOOR FIP imports
--// PROCEDURES VOOR FIP imports - PROCEDURES VOOR FIP imports - PROCEDURES VOOR FIP imports - PROCEDURES VOOR FIP imports



--// 1. ALG
CREATE OR REPLACE PROCEDURE fac_import_onrgoed1 (p_import_key IN NUMBER)
AS
   c_delim                    VARCHAR2 (2) := fac.import_delimiter(p_import_key);
   v_newline                  fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
   v_errormsg                 VARCHAR2 (1000);
   oracle_err_num             NUMBER;
   oracle_err_mes             VARCHAR2 (200);
   header_is_valid            NUMBER;
   v_count_tot                NUMBER (10);
   v_count_imp                NUMBER (10);
   v_ongeldig                 NUMBER (1);
   v_aanduiding               VARCHAR2 (200);
   v_alg_kenmerk_key1         VARCHAR2 (255);
   v_alg_kenmerk_key2         VARCHAR2 (255);
   v_alg_kenmerk_key3         VARCHAR2 (255);
   v_alg_kenmerk_key4         VARCHAR2 (255);
   v_alg_kenmerk_key5         VARCHAR2 (255);
   v_alg_kenmerk_key6         VARCHAR2 (255);
   v_alg_kenmerk_key7         VARCHAR2 (255);
   v_alg_kenmerk_key8         VARCHAR2 (255);
   v_alg_kenmerk_key9         VARCHAR2 (255);
   v_alg_kenmerk_key10        VARCHAR2 (255);
   -- De importvelden:
   v_regio_omschrijving       VARCHAR2 (255);                            -- 30
   v_district_omschrijving    VARCHAR2 (255);                            -- 30
   v_locatie_code             VARCHAR2 (255);                            -- 10
   v_locatie_omschrijving     VARCHAR2 (255);                            -- 60
   v_gebouw_code              VARCHAR2 (255);                            -- 10
   v_gebouw_naam              VARCHAR2 (255);                            -- 30
   v_srtgebouw_omschrijving   VARCHAR2 (255);                            -- 30
   v_locatie_verantw          VARCHAR2 (255);                            -- 30
   v_locatie_verantw_tel      VARCHAR2 (255);                            -- 15
   v_locatie_adres            VARCHAR2 (255);                            -- 50
   v_locatie_postcode         VARCHAR2 (255);                            -- 12
   v_locatie_plaats           VARCHAR2 (255);                            -- 30
   v_locatie_land             VARCHAR2 (255);                            -- 30
   v_locatie_post_adres       VARCHAR2 (255);                            -- 50
   v_locatie_post_postcode    VARCHAR2 (255);                            -- 12
   v_locatie_post_plaats      VARCHAR2 (255);                            -- 30
   v_locatie_post_land        VARCHAR2 (255);                            -- 30
   v_alg_kenmerkwaarde1       VARCHAR2 (255);
   v_alg_kenmerkwaarde2       VARCHAR2 (255);
   v_alg_kenmerkwaarde3       VARCHAR2 (255);
   v_alg_kenmerkwaarde4       VARCHAR2 (255);
   v_alg_kenmerkwaarde5       VARCHAR2 (255);
   v_alg_kenmerkwaarde6       VARCHAR2 (255);
   v_alg_kenmerkwaarde7       VARCHAR2 (255);
   v_alg_kenmerkwaarde8       VARCHAR2 (255);
   v_alg_kenmerkwaarde9       VARCHAR2 (255);
   v_alg_kenmerkwaarde10      VARCHAR2 (255);

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

   -- Controleer tijdens import-fase alleen op (uniek) bestaan van kenmerk (of
   -- deze is gedefinieerd voor gebouw/locatie, volgt tijdens de update-fase)!
   FUNCTION bepaal_kenmerk_key (ok IN VARCHAR)
      RETURN NUMBER
   IS
      v_kenmerk_key   NUMBER;
   BEGIN
      IF fac.safe_to_number (ok) IS NULL
      THEN                -- Kenmerkwaarde is alfanumeriek (dus omschrijving)!
         SELECT   alg_kenmerk_key
           INTO   v_kenmerk_key
           FROM   alg_kenmerk
          WHERE       alg_kenmerk_verwijder IS NULL
                  AND alg_kenmerk_niveau IN ('L', 'G')
                  AND alg_kenmerk_upper = UPPER (ok)
                  AND alg_kenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B', 'V');
      ELSE                             -- Kenmerkwaarde is numeriek (dus key)!
         SELECT   alg_kenmerk_key
           INTO   v_kenmerk_key
           FROM   alg_kenmerk
          WHERE       alg_kenmerk_verwijder IS NULL
                  AND alg_kenmerk_niveau IN ('L', 'G')
                  AND alg_kenmerk_key = fac.safe_to_number (ok)
                  AND alg_kenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B', 'V');
      END IF;

      RETURN v_kenmerk_key;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         IF ok IS NULL OR UPPER (ok) LIKE 'KENMERK%'
         THEN
            RETURN NULL;
         ELSE
            fac.imp_writelog (p_import_key,
                              'W',
                              'Fout bij bepalen kenmerk [' || ok || ']',
                              'Bestaat niet of type ongeldig');
            COMMIT;
            RETURN NULL;
         END IF;
      WHEN OTHERS
      THEN
         fac.imp_writelog (p_import_key,
                           'W',
                           'Fout bij bepalen kenmerk [' || ok || ']',
                           'Kan kenmerk niet 1-duidig bepalen');
         COMMIT;
         RETURN NULL;
   END;
BEGIN
   -- Eerst opruiming
   DELETE FROM   fac_imp_onrgoed1;

   COMMIT;

   v_count_tot := 0;
   v_count_imp := 0;
   header_is_valid := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_errormsg := 'Fout FETCH importregel';

         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout bij opvragen importregel';
         v_aanduiding := '';
         v_ongeldig := 0;
         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_delim, v_regio_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_district_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_locatie_code);
         fac.imp_getfield (v_newline, c_delim, v_locatie_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_gebouw_code);
         fac.imp_getfield (v_newline, c_delim, v_gebouw_naam);
         fac.imp_getfield (v_newline, c_delim, v_srtgebouw_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_locatie_verantw);
         fac.imp_getfield (v_newline, c_delim, v_locatie_verantw_tel);
         fac.imp_getfield (v_newline, c_delim, v_locatie_adres);
         fac.imp_getfield (v_newline, c_delim, v_locatie_postcode);
         fac.imp_getfield (v_newline, c_delim, v_locatie_plaats);
         fac.imp_getfield (v_newline, c_delim, v_locatie_land);
         fac.imp_getfield (v_newline, c_delim, v_locatie_post_adres);
         fac.imp_getfield (v_newline, c_delim, v_locatie_post_postcode);
         fac.imp_getfield (v_newline, c_delim, v_locatie_post_plaats);
         fac.imp_getfield (v_newline, c_delim, v_locatie_post_land);
         fac.imp_getfield (v_newline, c_delim, v_alg_kenmerkwaarde1);
         fac.imp_getfield (v_newline, c_delim, v_alg_kenmerkwaarde2);
         fac.imp_getfield (v_newline, c_delim, v_alg_kenmerkwaarde3);
         fac.imp_getfield (v_newline, c_delim, v_alg_kenmerkwaarde4);
         fac.imp_getfield (v_newline, c_delim, v_alg_kenmerkwaarde5);
         fac.imp_getfield (v_newline, c_delim, v_alg_kenmerkwaarde6);
         fac.imp_getfield (v_newline, c_delim, v_alg_kenmerkwaarde7);
         fac.imp_getfield (v_newline, c_delim, v_alg_kenmerkwaarde8);
         fac.imp_getfield (v_newline, c_delim, v_alg_kenmerkwaarde9);
         fac.imp_getfield (v_newline, c_delim, v_alg_kenmerkwaarde10);

         v_aanduiding := '[' || v_locatie_code || '|' || v_gebouw_code || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij alle NIET-kenmerk kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_regio_omschrijving) LIKE 'REGIO%'
               AND UPPER (v_district_omschrijving) LIKE 'DISTRICT%'
               AND UPPER (v_locatie_code) = 'LOCATIECODE'
               AND UPPER (v_gebouw_code) = 'GEBOUWCODE'
               AND UPPER (v_locatie_adres) = 'BEZOEKADRES'
               AND UPPER (v_locatie_post_adres) = 'POSTADRES'
               AND UPPER (v_locatie_post_land) LIKE 'LAND%'
            THEN
               v_alg_kenmerk_key1 := bepaal_kenmerk_key (v_alg_kenmerkwaarde1);
               v_alg_kenmerk_key2 := bepaal_kenmerk_key (v_alg_kenmerkwaarde2);
               v_alg_kenmerk_key3 := bepaal_kenmerk_key (v_alg_kenmerkwaarde3);
               v_alg_kenmerk_key4 := bepaal_kenmerk_key (v_alg_kenmerkwaarde4);
               v_alg_kenmerk_key5 := bepaal_kenmerk_key (v_alg_kenmerkwaarde5);
               v_alg_kenmerk_key6 := bepaal_kenmerk_key (v_alg_kenmerkwaarde6);
               v_alg_kenmerk_key7 := bepaal_kenmerk_key (v_alg_kenmerkwaarde7);
               v_alg_kenmerk_key8 := bepaal_kenmerk_key (v_alg_kenmerkwaarde8);
               v_alg_kenmerk_key9 := bepaal_kenmerk_key (v_alg_kenmerkwaarde9);
               v_alg_kenmerk_key10 := bepaal_kenmerk_key (v_alg_kenmerkwaarde10);

               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;

            -- Controleer alle veldwaarden
            v_errormsg := 'Regio-omschrijving leeg of te lang';
            v_regio_omschrijving := TRIM (v_regio_omschrijving);

            IF v_regio_omschrijving IS NULL
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Regel overgeslagen');
            ELSIF LENGTH (v_regio_omschrijving) > 30
            THEN
               v_regio_omschrijving := SUBSTR (v_regio_omschrijving, 1, 30);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Regio-omschrijving afgebroken tot ['
                  || v_regio_omschrijving
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'District-omschrijving leeg of te lang';
            v_district_omschrijving := TRIM (v_district_omschrijving);

            IF v_district_omschrijving IS NULL
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Regel overgeslagen');
            ELSIF LENGTH (v_district_omschrijving) > 30
            THEN
               v_district_omschrijving :=
                  SUBSTR (v_district_omschrijving, 1, 30);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'District-omschrijving afgebroken tot ['
                  || v_district_omschrijving
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Locatiecode leeg of te lang';
            v_locatie_code := TRIM (v_locatie_code);

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

            --
            v_errormsg := 'Locatie-omschrijving leeg of te lang';
            v_locatie_omschrijving := TRIM (v_locatie_omschrijving);

            IF v_locatie_omschrijving IS NULL
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Regel overgeslagen');
            ELSIF LENGTH (v_locatie_omschrijving) > 60
            THEN
               v_locatie_omschrijving :=
                  SUBSTR (v_locatie_omschrijving, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Locatie-omschrijving afgebroken tot ['
                  || v_locatie_omschrijving
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Gebouwcode leeg of te lang';
            v_gebouw_code := TRIM (v_gebouw_code);

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

            --
            v_errormsg := 'Gebouwnaam leeg of te lang';
            v_gebouw_naam := TRIM (v_gebouw_naam);

            IF v_gebouw_naam IS NULL
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Regel overgeslagen');
            ELSIF LENGTH (v_gebouw_naam) > 60
            THEN
               v_gebouw_naam := SUBSTR (v_gebouw_naam, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Gebouwnaam afgebroken tot [' || v_gebouw_naam || ']'
               );
            END IF;

            --
            v_errormsg := 'Gebouwfunctie te lang';
            v_srtgebouw_omschrijving := TRIM (v_srtgebouw_omschrijving);

            IF LENGTH (v_srtgebouw_omschrijving) > 30
            THEN
               v_srtgebouw_omschrijving :=
                  SUBSTR (v_srtgebouw_omschrijving, 1, 30);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Gebouwfunctie afgebroken tot ['
                  || v_srtgebouw_omschrijving
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Naam te lang (contactpersoon)';
            v_locatie_verantw := TRIM (v_locatie_verantw);

            IF LENGTH (v_locatie_verantw) > 30
            THEN
               v_locatie_verantw := SUBSTR (v_locatie_verantw, 1, 30);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Naam afgebroken tot [' || v_locatie_verantw || ']'
               );
            END IF;

            --
            v_errormsg := 'Telefoonnummer te lang (contactpersoon)';
            v_locatie_verantw_tel := TRIM (v_locatie_verantw_tel);

            IF LENGTH (v_locatie_verantw_tel) > 20
            THEN
               v_locatie_verantw_tel := SUBSTR (v_locatie_verantw_tel, 1, 20);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Telefoonnummer afgebroken tot ['
                  || v_locatie_verantw_tel
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Adres te lang (bezoekadres)';
            v_locatie_adres := TRIM (v_locatie_adres);

            IF LENGTH (v_locatie_adres) > 50
            THEN
               v_locatie_adres := SUBSTR (v_locatie_adres, 1, 50);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Adres afgebroken tot ]' || v_locatie_adres || ']'
               );
            END IF;

            --
            v_errormsg := 'Postcode te lang (bezoekadres)';
            v_locatie_postcode := TRIM (v_locatie_postcode);

            IF LENGTH (v_locatie_postcode) > 12
            THEN
               v_locatie_postcode := SUBSTR (v_locatie_postcode, 1, 12);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Postcode afgebroken tot [' || v_locatie_postcode || ']'
               );
            END IF;

            --
            v_errormsg := 'Plaatsnaam te lang (bezoekadres)';
            v_locatie_plaats := TRIM (v_locatie_plaats);

            IF LENGTH (v_locatie_plaats) > 30
            THEN
               v_locatie_plaats := SUBSTR (v_locatie_plaats, 1, 30);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Plaatsnaam afgebroken tot [' || v_locatie_plaats || ']'
               );
            END IF;

            --
            v_errormsg := 'Landnaam te lang (bezoekadres)';
            v_locatie_land := TRIM (v_locatie_land);

            IF LENGTH (v_locatie_land) > 30
            THEN
               v_locatie_land := SUBSTR (v_locatie_land, 1, 30);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Landnaam afgebroken tot [' || v_locatie_land || ']'
               );
            END IF;

            --
            v_errormsg := 'Adres te lang (postadres)';
            v_locatie_post_adres := TRIM (v_locatie_post_adres);

            IF LENGTH (v_locatie_post_adres) > 50
            THEN
               v_locatie_post_adres := SUBSTR (v_locatie_post_adres, 1, 50);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Adres afgebroken tot [' || v_locatie_post_adres || ']'
               );
            END IF;

            --
            v_errormsg := 'Postcode te lang (postadres)';
            v_locatie_post_postcode := TRIM (v_locatie_post_postcode);

            IF LENGTH (v_locatie_post_postcode) > 12
            THEN
               v_locatie_post_postcode :=
                  SUBSTR (v_locatie_post_postcode, 1, 12);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Postcode afgebroken tot ['
                  || v_locatie_post_postcode
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Plaatsnaam te lang (postadres)';
            v_locatie_post_plaats := TRIM (v_locatie_post_plaats);

            IF LENGTH (v_locatie_post_plaats) > 30
            THEN
               v_locatie_post_plaats := SUBSTR (v_locatie_post_plaats, 1, 30);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Plaatsnaam afgebroken tot ['
                  || v_locatie_post_plaats
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Landnaam te lang (postadres)';
            v_locatie_post_land := TRIM (v_locatie_post_land);

            IF LENGTH (v_locatie_post_land) > 30
            THEN
               v_locatie_post_land := SUBSTR (v_locatie_post_land, 1, 30);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Landnaam afgebroken tot [' || v_locatie_post_land || ']'
               );
            END IF;

            -- De rest alleen ff trimmen.
            v_alg_kenmerkwaarde1 := TRIM (v_alg_kenmerkwaarde1);
            v_alg_kenmerkwaarde2 := TRIM (v_alg_kenmerkwaarde2);
            v_alg_kenmerkwaarde3 := TRIM (v_alg_kenmerkwaarde3);
            v_alg_kenmerkwaarde4 := TRIM (v_alg_kenmerkwaarde4);
            v_alg_kenmerkwaarde5 := TRIM (v_alg_kenmerkwaarde5);
            v_alg_kenmerkwaarde6 := TRIM (v_alg_kenmerkwaarde6);
            v_alg_kenmerkwaarde7 := TRIM (v_alg_kenmerkwaarde7);
            v_alg_kenmerkwaarde8 := TRIM (v_alg_kenmerkwaarde8);
            v_alg_kenmerkwaarde9 := TRIM (v_alg_kenmerkwaarde9);
            v_alg_kenmerkwaarde10 := TRIM (v_alg_kenmerkwaarde10);

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

                  INSERT INTO fac_imp_onrgoed1 (
                                                   alg_regio_omschrijving,
                                                   alg_district_omschrijving,
                                                   alg_locatie_code,
                                                   alg_locatie_omschrijving,
                                                   alg_gebouw_code,
                                                   alg_gebouw_naam,
                                                   alg_srtgebouw_omschrijving,
                                                   alg_locatie_verantw,
                                                   alg_locatie_verantw_tel,
                                                   alg_locatie_adres,
                                                   alg_locatie_postcode,
                                                   alg_locatie_plaats,
                                                   alg_locatie_land,
                                                   alg_locatie_post_adres,
                                                   alg_locatie_post_postcode,
                                                   alg_locatie_post_plaats,
                                                   alg_locatie_post_land,
                                                   alg_kenmerkwaarde1,
                                                   alg_kenmerkwaarde2,
                                                   alg_kenmerkwaarde3,
                                                   alg_kenmerkwaarde4,
                                                   alg_kenmerkwaarde5,
                                                   alg_kenmerkwaarde6,
                                                   alg_kenmerkwaarde7,
                                                   alg_kenmerkwaarde8,
                                                   alg_kenmerkwaarde9,
                                                   alg_kenmerkwaarde10
                             )
                    VALUES   (
                                 v_regio_omschrijving,
                                 v_district_omschrijving,
                                 v_locatie_code,
                                 v_locatie_omschrijving,
                                 v_gebouw_code,
                                 v_gebouw_naam,
                                 v_srtgebouw_omschrijving,
                                 v_locatie_verantw,
                                 v_locatie_verantw_tel,
                                 v_locatie_adres,
                                 v_locatie_postcode,
                                 v_locatie_plaats,
                                 v_locatie_land,
                                 v_locatie_post_adres,
                                 v_locatie_post_postcode,
                                 v_locatie_post_plaats,
                                 v_locatie_post_land,
                                 DECODE (
                                    v_alg_kenmerk_key1,
                                    NULL,
                                    v_alg_kenmerkwaarde1,
                                       TO_CHAR (v_alg_kenmerk_key1)
                                    || '='
                                    || SUBSTR (v_alg_kenmerkwaarde1, 1, 200)
                                 ),
                                 DECODE (
                                    v_alg_kenmerk_key2,
                                    NULL,
                                    v_alg_kenmerkwaarde2,
                                       TO_CHAR (v_alg_kenmerk_key2)
                                    || '='
                                    || SUBSTR (v_alg_kenmerkwaarde2, 1, 200)
                                 ),
                                 DECODE (
                                    v_alg_kenmerk_key3,
                                    NULL,
                                    v_alg_kenmerkwaarde3,
                                       TO_CHAR (v_alg_kenmerk_key3)
                                    || '='
                                    || SUBSTR (v_alg_kenmerkwaarde3, 1, 200)
                                 ),
                                 DECODE (
                                    v_alg_kenmerk_key4,
                                    NULL,
                                    v_alg_kenmerkwaarde4,
                                       TO_CHAR (v_alg_kenmerk_key4)
                                    || '='
                                    || SUBSTR (v_alg_kenmerkwaarde4, 1, 200)
                                 ),
                                 DECODE (
                                    v_alg_kenmerk_key5,
                                    NULL,
                                    v_alg_kenmerkwaarde5,
                                       TO_CHAR (v_alg_kenmerk_key5)
                                    || '='
                                    || SUBSTR (v_alg_kenmerkwaarde5, 1, 200)
                                 ),
                                 DECODE (
                                    v_alg_kenmerk_key6,
                                    NULL,
                                    v_alg_kenmerkwaarde6,
                                       TO_CHAR (v_alg_kenmerk_key6)
                                    || '='
                                    || SUBSTR (v_alg_kenmerkwaarde6, 1, 200)
                                 ),
                                 DECODE (
                                    v_alg_kenmerk_key7,
                                    NULL,
                                    v_alg_kenmerkwaarde7,
                                       TO_CHAR (v_alg_kenmerk_key7)
                                    || '='
                                    || SUBSTR (v_alg_kenmerkwaarde7, 1, 200)
                                 ),
                                 DECODE (
                                    v_alg_kenmerk_key8,
                                    NULL,
                                    v_alg_kenmerkwaarde8,
                                       TO_CHAR (v_alg_kenmerk_key8)
                                    || '='
                                    || SUBSTR (v_alg_kenmerkwaarde8, 1, 200)
                                 ),
                                 DECODE (
                                    v_alg_kenmerk_key9,
                                    NULL,
                                    v_alg_kenmerkwaarde9,
                                       TO_CHAR (v_alg_kenmerk_key9)
                                    || '='
                                    || SUBSTR (v_alg_kenmerkwaarde9, 1, 200)
                                 ),
                                 DECODE (
                                    v_alg_kenmerk_key10,
                                    NULL,
                                    v_alg_kenmerkwaarde10,
                                       TO_CHAR (v_alg_kenmerk_key10)
                                    || '='
                                    || SUBSTR (v_alg_kenmerkwaarde10, 1, 200)
                                 )
                             );

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

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

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=
            v_errormsg
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Inleesproces locaties/gebouwen afgebroken!');
END fac_import_onrgoed1;
/

CREATE OR REPLACE PROCEDURE fac_update_onrgoed1 (p_import_key IN NUMBER)
IS
   v_errormsg        VARCHAR2 (1000) := '-';
   oracle_err_num    NUMBER;
   oracle_err_mes    VARCHAR2 (200);
   v_aanduiding      VARCHAR2 (200);
   v_count_tot       NUMBER (10);
   v_count_new       NUMBER (10);
   v_count_upd       NUMBER (10);
   v_count           NUMBER (10);
   v_regio_key       NUMBER (10);
   v_district_key    NUMBER (10);
   v_locatie_key     NUMBER (10);
   v_srtgebouw_key   NUMBER (10);
   v_gebouw_key      NUMBER (10);
   v_srtnoti_code    VARCHAR2 (6);

   CURSOR cRegio                                   -- Regioomschrijving uniek!
   IS
        SELECT   MIN (alg_regio_omschrijving) alg_regio_omschrijving
          FROM   fac_imp_onrgoed1
      GROUP BY   UPPER (alg_regio_omschrijving)
      ORDER BY   1;

   CURSOR cDistrict                -- Districtomschrijving uniek binnen regio!
   IS
        SELECT   MIN (alg_regio_omschrijving) alg_regio_omschrijving,
                 MIN (alg_district_omschrijving) alg_district_omschrijving
          FROM   fac_imp_onrgoed1
      GROUP BY   UPPER (alg_regio_omschrijving),
                 UPPER (alg_district_omschrijving)
      ORDER BY   1, 2;

   CURSOR cLocatie                   -- Locatiecode uniek (omschrijving niet)!
   IS
        SELECT   MIN (alg_regio_omschrijving) alg_regio_omschrijving,
                 MIN (alg_district_omschrijving) alg_district_omschrijving,
                 MIN (alg_locatie_code) alg_locatie_code,
                 MIN (alg_locatie_omschrijving) alg_locatie_omschrijving,
                 MIN (alg_locatie_verantw) alg_locatie_verantw,
                 MIN (alg_locatie_verantw_tel) alg_locatie_verantw_tel,
                 MIN (alg_locatie_adres) alg_locatie_adres,
                 MIN (alg_locatie_postcode) alg_locatie_postcode,
                 MIN (alg_locatie_plaats) alg_locatie_plaats,
                 MIN (alg_locatie_land) alg_locatie_land,
                 MIN (alg_locatie_post_adres) alg_locatie_post_adres,
                 MIN (alg_locatie_post_postcode) alg_locatie_post_postcode,
                 MIN (alg_locatie_post_plaats) alg_locatie_post_plaats,
                 MIN (alg_locatie_post_land) alg_locatie_post_land,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde1, 1, INSTR (alg_kenmerkwaarde1, '=') - 1))) kenmerk_key1,
                 MIN(SUBSTR (alg_kenmerkwaarde1, INSTR (alg_kenmerkwaarde1, '=') + 1)) waarde1,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde2, 1, INSTR (alg_kenmerkwaarde2, '=') - 1))) kenmerk_key2,
                 MIN(SUBSTR (alg_kenmerkwaarde2, INSTR (alg_kenmerkwaarde2, '=') + 1)) waarde2,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde3, 1, INSTR (alg_kenmerkwaarde3, '=') - 1))) kenmerk_key3,
                 MIN(SUBSTR (alg_kenmerkwaarde3, INSTR (alg_kenmerkwaarde3, '=') + 1)) waarde3,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde4, 1, INSTR (alg_kenmerkwaarde4, '=') - 1))) kenmerk_key4,
                 MIN(SUBSTR (alg_kenmerkwaarde4, INSTR (alg_kenmerkwaarde4, '=') + 1)) waarde4,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde5, 1, INSTR (alg_kenmerkwaarde5, '=') - 1))) kenmerk_key5,
                 MIN(SUBSTR (alg_kenmerkwaarde5, INSTR (alg_kenmerkwaarde5, '=') + 1)) waarde5,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde6, 1, INSTR (alg_kenmerkwaarde6, '=') - 1))) kenmerk_key6,
                 MIN(SUBSTR (alg_kenmerkwaarde6, INSTR (alg_kenmerkwaarde6, '=') + 1)) waarde6,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde7, 1, INSTR (alg_kenmerkwaarde7, '=') - 1))) kenmerk_key7,
                 MIN(SUBSTR (alg_kenmerkwaarde7, INSTR (alg_kenmerkwaarde7, '=') + 1)) waarde7,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde8, 1, INSTR (alg_kenmerkwaarde8, '=') - 1))) kenmerk_key8,
                 MIN(SUBSTR (alg_kenmerkwaarde8, INSTR (alg_kenmerkwaarde8, '=') + 1)) waarde8,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde9, 1, INSTR (alg_kenmerkwaarde9, '=') - 1))) kenmerk_key9,
                 MIN(SUBSTR (alg_kenmerkwaarde9, INSTR (alg_kenmerkwaarde9, '=') + 1)) waarde9,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde10, 1, INSTR (alg_kenmerkwaarde10, '=') - 1))) kenmerk_key10,
                 MIN(SUBSTR (alg_kenmerkwaarde10, INSTR (alg_kenmerkwaarde10, '=') + 1)) waarde10
          FROM   fac_imp_onrgoed1
      GROUP BY   UPPER (alg_regio_omschrijving),
                 UPPER (alg_district_omschrijving),
                 UPPER (alg_locatie_code)
      ORDER BY   1, 2, 3;

   CURSOR cSrtGebouw                                   -- Gebouwfunctie uniek!
   IS
        SELECT   MIN (alg_srtgebouw_omschrijving) alg_srtgebouw_omschrijving
          FROM   fac_imp_onrgoed1
         WHERE   alg_srtgebouw_omschrijving IS NOT NULL
      GROUP BY   UPPER (alg_srtgebouw_omschrijving)
      ORDER BY   1;

   CURSOR cGebouw              -- Gebouwcode uniek binnen locatie (naam niet)!
   IS
        SELECT   MIN (alg_regio_omschrijving) alg_regio_omschrijving,
                 MIN (alg_district_omschrijving) alg_district_omschrijving,
                 MIN (alg_locatie_code) alg_locatie_code,
                 MIN (alg_gebouw_code) alg_gebouw_code,
                 MIN (alg_gebouw_naam) alg_gebouw_naam,
                 MIN (alg_srtgebouw_omschrijving) alg_srtgebouw_omschrijving,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde1, 1, INSTR (alg_kenmerkwaarde1, '=') - 1))) kenmerk_key1,
                 MIN(SUBSTR (alg_kenmerkwaarde1, INSTR (alg_kenmerkwaarde1, '=') + 1)) waarde1,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde2, 1, INSTR (alg_kenmerkwaarde2, '=') - 1))) kenmerk_key2,
                 MIN(SUBSTR (alg_kenmerkwaarde2, INSTR (alg_kenmerkwaarde2, '=') + 1)) waarde2,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde3, 1, INSTR (alg_kenmerkwaarde3, '=') - 1))) kenmerk_key3,
                 MIN(SUBSTR (alg_kenmerkwaarde3, INSTR (alg_kenmerkwaarde3, '=') + 1)) waarde3,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde4, 1, INSTR (alg_kenmerkwaarde4, '=') - 1))) kenmerk_key4,
                 MIN(SUBSTR (alg_kenmerkwaarde4, INSTR (alg_kenmerkwaarde4, '=') + 1)) waarde4,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde5, 1, INSTR (alg_kenmerkwaarde5, '=') - 1))) kenmerk_key5,
                 MIN(SUBSTR (alg_kenmerkwaarde5, INSTR (alg_kenmerkwaarde5, '=') + 1)) waarde5,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde6, 1, INSTR (alg_kenmerkwaarde6, '=') - 1))) kenmerk_key6,
                 MIN(SUBSTR (alg_kenmerkwaarde6, INSTR (alg_kenmerkwaarde6, '=') + 1)) waarde6,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde7, 1, INSTR (alg_kenmerkwaarde7, '=') - 1))) kenmerk_key7,
                 MIN(SUBSTR (alg_kenmerkwaarde7, INSTR (alg_kenmerkwaarde7, '=') + 1)) waarde7,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde8, 1, INSTR (alg_kenmerkwaarde8, '=') - 1))) kenmerk_key8,
                 MIN(SUBSTR (alg_kenmerkwaarde8, INSTR (alg_kenmerkwaarde8, '=') + 1)) waarde8,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde9, 1, INSTR (alg_kenmerkwaarde9, '=') - 1))) kenmerk_key9,
                 MIN(SUBSTR (alg_kenmerkwaarde9, INSTR (alg_kenmerkwaarde9, '=') + 1)) waarde9,
                 MIN(fac.safe_to_number(SUBSTR (alg_kenmerkwaarde10, 1, INSTR (alg_kenmerkwaarde10, '=') - 1))) kenmerk_key10,
                 MIN(SUBSTR (alg_kenmerkwaarde10, INSTR (alg_kenmerkwaarde10, '=') + 1)) waarde10
          FROM   fac_imp_onrgoed1
      GROUP BY   UPPER (alg_regio_omschrijving),
                 UPPER (alg_district_omschrijving),
                 UPPER (alg_locatie_code),
                 UPPER (alg_gebouw_code)
      ORDER BY   1, 2, 3, 4;

   -- SUBPROC
   PROCEDURE upsert_algkenmerk (p_alg_key       IN NUMBER,
                                p_alg_niv       IN VARCHAR2,
                                p_kenmerk_key   IN NUMBER,
                                p_waarde        IN VARCHAR2)
   AS
      v_kenmerk_niveau       alg_kenmerk.alg_kenmerk_niveau%TYPE;
      v_kenmerk_type         alg_kenmerk.alg_kenmerk_kenmerktype%TYPE;
      ccount                 NUMBER;
      v_waarde               VARCHAR2 (255);
      v_objectnaam           fac_kenmerkdomein.fac_kenmerkdomein_objectnaam%TYPE;
      v_kolomnaam            fac_kenmerkdomein.fac_kenmerkdomein_kolomnaam%TYPE;
      v_kolomtxt             fac_kenmerkdomein.fac_kenmerkdomein_kolomtxt%TYPE;
      sql_stmt               VARCHAR2 (1000);
      v_onrgoedkenmerk_key   alg_onrgoedkenmerk.alg_onrgoedkenmerk_key%TYPE;
      l_cursor_1             INTEGER;
      l_rowsprocessed        NUMBER DEFAULT 0;
   BEGIN
      IF p_kenmerk_key IS NOT NULL AND p_waarde IS NOT NULL
      THEN
         v_errormsg := 'Fout bij bepalen kenmerk [' || p_kenmerk_key || ']';

         SELECT   alg_kenmerk_niveau, alg_kenmerk_kenmerktype
           INTO   v_kenmerk_niveau, v_kenmerk_type
           FROM   alg_kenmerk
          WHERE       alg_kenmerk_verwijder IS NULL
                  AND alg_kenmerk_key = p_kenmerk_key
                  AND alg_kenmerk_niveau IN ('L', 'G');

         IF (v_kenmerk_niveau = p_alg_niv)    -- Alleen op juiste niveau doen!
         THEN
            IF v_kenmerk_type IN ('R', 'S')
            THEN
               v_errormsg := 'Fout bij bepalen eigen tabel';

               SELECT   COUNT ( * )
                 INTO   ccount
                 FROM   alg_kenmerk k, fac_kenmerkdomein d
                WHERE       k.alg_kenmerk_key = p_kenmerk_key
                        AND k.alg_kenmerk_niveau = p_alg_niv
                        AND k.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key
                        AND d.fac_usrtab_key IS NOT NULL;

               v_errormsg :=
                  'Fout bij bepalen nieuwe waarde [' || p_waarde || ']';

               IF ccount = 1
               THEN                                             -- Eigen tabel
                  SELECT   TO_CHAR (ud.fac_usrdata_key)
                    INTO   v_waarde
                    FROM   alg_kenmerk k,
                           fac_kenmerkdomein d,
                           fac_v_aanwezigusrdata ud
                   WHERE   k.alg_kenmerk_key = p_kenmerk_key
                           AND k.alg_kenmerk_niveau = p_alg_niv
                           AND k.fac_kenmerkdomein_key =
                                 d.fac_kenmerkdomein_key
                           AND d.fac_usrtab_key = ud.fac_usrtab_key
                           AND UPPER (TRIM (ud.fac_usrdata_omschr)) =
                                 UPPER (p_waarde);
               ELSE                                    -- FACILITOR view/tabel
                  SELECT   d.fac_kenmerkdomein_objectnaam,
                           d.fac_kenmerkdomein_kolomnaam,
                           d.fac_kenmerkdomein_kolomtxt
                    INTO   v_objectnaam, v_kolomnaam, v_kolomtxt
                    FROM   alg_kenmerk k, fac_kenmerkdomein d
                   WHERE   k.alg_kenmerk_key = p_kenmerk_key
                           AND k.alg_kenmerk_niveau = p_alg_niv
                           AND k.fac_kenmerkdomein_key =
                                 d.fac_kenmerkdomein_key
                           AND d.fac_usrtab_key IS NULL;

                  sql_stmt :=
                        'SELECT MAX ('
                     || v_kolomnaam
                     || ') FROM '
                     || v_objectnaam
                     || ' WHERE UPPER (TRIM ('
                     || v_kolomtxt
                     || ')) = UPPER (:pwaarde)';
                  l_cursor_1 := DBMS_SQL.open_cursor;
                  DBMS_SQL.parse (l_cursor_1, sql_stmt, DBMS_SQL.native);
                  DBMS_SQL.BIND_VARIABLE(l_cursor_1,':pwaarde', p_waarde);
                  DBMS_SQL.define_column(l_cursor_1, 1, v_waarde, 255);
                  l_rowsprocessed := DBMS_SQL.execute_and_fetch (l_cursor_1);
                  DBMS_SQL.column_value (l_cursor_1, 1, v_waarde);
                  DBMS_SQL.close_cursor(l_cursor_1);
               END IF;
            ELSE           -- C(Karakter)/D(Datum)/N(Numeriek)/X(Bestandsnaam)
               v_waarde := p_waarde;
            END IF;

            v_errormsg := 'Fout bij bepalen huidige waarde';

            SELECT   COUNT ( * ), MAX (alg_onrgoedkenmerk_key)
              INTO   ccount, v_onrgoedkenmerk_key
              FROM   alg_v_aanwezigonrgoedkenmerk
             WHERE       alg_onrgoed_key = p_alg_key
                     AND alg_onrgoed_niveau = p_alg_niv
                     AND alg_kenmerk_key = p_kenmerk_key;

            IF ccount = 0
            THEN
               v_errormsg := 'Fout bij toevoegen waarde [' || v_waarde || ']';

               INSERT INTO alg_onrgoedkenmerk (alg_onrgoed_key,
                                               alg_onrgoed_niveau,
                                               alg_kenmerk_key,
                                               alg_onrgoedkenmerk_waarde)
                 VALUES   (p_alg_key,
                           p_alg_niv,
                           p_kenmerk_key,
                           v_waarde);
            ELSE
               v_errormsg := 'Fout bij bijwerken waarde [' || v_waarde || ']';

               UPDATE   alg_onrgoedkenmerk
                  SET   alg_onrgoedkenmerk_waarde = v_waarde
                WHERE   alg_onrgoedkenmerk_key = v_onrgoedkenmerk_key;
            END IF;
         END IF;
      END IF;
   EXCEPTION
      WHEN OTHERS
      THEN
         oracle_err_num := SQLCODE;
         oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
         v_errormsg :=
               v_errormsg
            || ' ORACLE (error '
            || oracle_err_num
            || '/'
            || oracle_err_mes
            || ')';
         fac.imp_writelog (p_import_key,
                           'W',
                           v_aanduiding || v_errormsg,
                           'upsert_algkenmerk');
   END;
BEGIN
   -- ***********
   -- ***REGIO***
   -- ***********
   v_count_tot := 0;
   v_count_new := 0;

   FOR recRegio IN cRegio
   LOOP
      BEGIN
         v_count_tot := v_count_tot + 1;
         v_aanduiding := '[' || recRegio.alg_regio_omschrijving || '] ';
         v_errormsg := 'Fout bij toevoegen regio';

         SELECT   COUNT ( * )
           INTO   v_count
           FROM   alg_v_aanwezigregio
          WHERE   TRIM (alg_regio_upper) =
                     UPPER (recRegio.alg_regio_omschrijving);

         IF (v_count = 0)
         THEN
            INSERT INTO alg_regio (alg_regio_omschrijving)
              VALUES   (recRegio.alg_regio_omschrijving);

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

   fac.imp_writelog (p_import_key,
                     'S',
                     'Regio/#ingelezen: ' || TO_CHAR (v_count_tot),
                     '');
   fac.imp_writelog (p_import_key,
                     'S',
                     'Regio/#toegevoegd: ' || TO_CHAR (v_count_new),
                     '');
   COMMIT;

   -- **************
   -- ***DISTRICT***
   -- **************
   v_count_tot := 0;
   v_count_new := 0;

   FOR recDistrict IN cDistrict
   LOOP
      BEGIN
         v_count_tot := v_count_tot + 1;
         v_aanduiding :=
               '['
            || recDistrict.alg_regio_omschrijving
            || '|'
            || recDistrict.alg_district_omschrijving
            || '] ';
         v_errormsg := 'Fout bij bepalen regio';

         SELECT   alg_regio_key
           INTO   v_regio_key
           FROM   alg_v_aanwezigregio
          WHERE   alg_regio_upper =
                     UPPER (recDistrict.alg_regio_omschrijving);

         v_errormsg := 'Fout bij toevoegen district';

         SELECT   COUNT ( * )
           INTO   v_count
           FROM   alg_v_aanwezigdistrict
          WHERE   alg_regio_key = v_regio_key
                  AND TRIM (alg_district_upper) =
                        UPPER (recDistrict.alg_district_omschrijving);

         IF (v_count = 0)
         THEN
            INSERT INTO alg_district (
                                         alg_regio_key,
                                         alg_district_omschrijving
                       )
              VALUES   (v_regio_key, recDistrict.alg_district_omschrijving);

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

   fac.imp_writelog (p_import_key,
                     'S',
                     'District/#ingelezen: ' || TO_CHAR (v_count_tot),
                     '');
   fac.imp_writelog (p_import_key,
                     'S',
                     'District/#toegevoegd: ' || TO_CHAR (v_count_new),
                     '');
   COMMIT;

   -- **************
   -- ***LOCATIE****
   -- **************
   v_count_tot := 0;
   v_count_new := 0;
   v_count_upd := 0;

   FOR recLocatie IN cLocatie
   LOOP
      BEGIN
         v_count_tot := v_count_tot + 1;
         v_aanduiding :=
               '['
            || recLocatie.alg_regio_omschrijving
            || '|'
            || recLocatie.alg_district_omschrijving
            || '|'
            || recLocatie.alg_locatie_code
            || '] ';
         v_errormsg := 'Fout bij bepalen regio';

         SELECT   alg_regio_key
           INTO   v_regio_key
           FROM   alg_v_aanwezigregio
          WHERE   alg_regio_upper = UPPER (recLocatie.alg_regio_omschrijving);

         v_errormsg := 'Fout bij bepalen district';

         SELECT   alg_district_key
           INTO   v_district_key
           FROM   alg_v_aanwezigdistrict
          WHERE   alg_regio_key = v_regio_key
                  AND TRIM (alg_district_upper) =
                        UPPER (recLocatie.alg_district_omschrijving);

         v_errormsg := 'Fout bij toevoegen locatie';

         SELECT   COUNT ( * )
           INTO   v_count
           FROM   alg_v_aanweziglocatie
          WHERE   alg_district_key = v_district_key
                  AND UPPER (alg_locatie_code) =
                        UPPER (recLocatie.alg_locatie_code);

         IF (v_count = 0)
         THEN
            INSERT INTO alg_locatie (alg_district_key,
                                     alg_locatie_code,
                                     alg_locatie_omschrijving,
                                     alg_locatie_verantw,
                                     alg_locatie_verantw_tel,
                                     alg_locatie_adres,
                                     alg_locatie_postcode,
                                     alg_locatie_plaats,
                                     alg_locatie_land,
                                     alg_locatie_post_adres,
                                     alg_locatie_post_postcode,
                                     alg_locatie_post_plaats,
                                     alg_locatie_post_land)
               VALUES   (v_district_key,
                         recLocatie.alg_locatie_code,
                         recLocatie.alg_locatie_omschrijving,
                         recLocatie.alg_locatie_verantw,
                         recLocatie.alg_locatie_verantw_tel,
                         recLocatie.alg_locatie_adres,
                         recLocatie.alg_locatie_postcode,
                         recLocatie.alg_locatie_plaats,
                         recLocatie.alg_locatie_land,
                         recLocatie.alg_locatie_post_adres,
                         recLocatie.alg_locatie_post_postcode,
                         recLocatie.alg_locatie_post_plaats,
                         recLocatie.alg_locatie_post_land)
            RETURNING   alg_locatie_key      INTO   v_locatie_key;

            v_srtnoti_code := 'ALGLNE';
            v_count_new := v_count_new + 1;
         ELSE                                             -- bijwerken object!
            v_errormsg := 'Fout bij bepalen locatie';

            SELECT   alg_locatie_key
              INTO   v_locatie_key
              FROM   alg_v_aanweziglocatie
             WHERE   UPPER (TRIM (alg_locatie_code)) =
                        UPPER (recLocatie.alg_locatie_code);

            v_srtnoti_code := 'ALGLUP';
            v_count_upd := v_count_upd + 1;
         END IF;

         -- NULL-waarden resulteren NIET in het wissen van kenmerkvelden
         -- (bijwerken kan wel, maar wissen dus niet)!
         upsert_algkenmerk (v_locatie_key, 'L', recLocatie.kenmerk_key1, recLocatie.waarde1);
         upsert_algkenmerk (v_locatie_key, 'L', recLocatie.kenmerk_key2, recLocatie.waarde2);
         upsert_algkenmerk (v_locatie_key, 'L', recLocatie.kenmerk_key3, recLocatie.waarde3);
         upsert_algkenmerk (v_locatie_key, 'L', recLocatie.kenmerk_key4, recLocatie.waarde4);
         upsert_algkenmerk (v_locatie_key, 'L', recLocatie.kenmerk_key5, recLocatie.waarde5);
         upsert_algkenmerk (v_locatie_key, 'L', recLocatie.kenmerk_key6, recLocatie.waarde6);
         upsert_algkenmerk (v_locatie_key, 'L', recLocatie.kenmerk_key7, recLocatie.waarde7);
         upsert_algkenmerk (v_locatie_key, 'L', recLocatie.kenmerk_key8, recLocatie.waarde8);
         upsert_algkenmerk (v_locatie_key, 'L', recLocatie.kenmerk_key9, recLocatie.waarde9);
         upsert_algkenmerk (v_locatie_key, 'L', recLocatie.kenmerk_key10, recLocatie.waarde10);

         fac.trackaction (v_srtnoti_code, v_locatie_key, NULL, NULL, NULL);
         COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=
                  v_errormsg
               || ' ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'W',
                              v_aanduiding || v_errormsg,
                              '');
            COMMIT;
      END;
   END LOOP;

   fac.imp_writelog (p_import_key,
                     'S',
                     'Locatie/#ingelezen: ' || TO_CHAR (v_count_tot),
                     '');
   fac.imp_writelog (p_import_key,
                     'S',
                     'Locatie/#toegevoegd: ' || TO_CHAR (v_count_new),
                     '');
   fac.imp_writelog (p_import_key,
                     'S',
                     'Locatie/#bijgewerkt: ' || TO_CHAR (v_count_upd),
                     '');
   COMMIT;

   -- ********************
   -- ***GEBOUWFUNCTIE****
   -- ********************
   v_count_tot := 0;
   v_count_new := 0;

   FOR recSrtGebouw IN cSrtGebouw
   LOOP
      BEGIN
         v_count_tot := v_count_tot + 1;
         v_aanduiding :=
            '[' || recSrtGebouw.alg_srtgebouw_omschrijving || '] ';
         v_errormsg := 'Fout bij toevoegen gebouwfunctie';

         SELECT   COUNT ( * )
           INTO   v_count
           FROM   alg_v_aanwezigsrtgebouw
          WHERE   TRIM (alg_srtgebouw_upper) =
                     UPPER (recSrtGebouw.alg_srtgebouw_omschrijving);

         IF (v_count = 0)
         THEN
            INSERT INTO alg_srtgebouw (alg_srtgebouw_omschrijving)
              VALUES   (recSrtGebouw.alg_srtgebouw_omschrijving);

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

   fac.imp_writelog (p_import_key,
                     'S',
                     'Gebouwfunctie/#ingelezen: ' || TO_CHAR (v_count_tot),
                     '');
   fac.imp_writelog (p_import_key,
                     'S',
                     'Gebouwfunctie/#toegevoegd: ' || TO_CHAR (v_count_new),
                     '');
   COMMIT;

   -- ************
   -- ***GEBOUW***
   -- ************
   v_count_tot := 0;
   v_count_new := 0;
   v_count_upd := 0;

   FOR recGebouw IN cGebouw
   LOOP
      BEGIN
         v_count_tot := v_count_tot + 1;
         v_aanduiding :=
               '['
            || recGebouw.alg_regio_omschrijving
            || '|'
            || recGebouw.alg_district_omschrijving
            || '|'
            || recGebouw.alg_locatie_code
            || '|'
            || recGebouw.alg_gebouw_code
            || '] ';
         v_errormsg := 'Fout bij bepalen regio';

         SELECT   alg_regio_key
           INTO   v_regio_key
           FROM   alg_v_aanwezigregio
          WHERE   alg_regio_upper = UPPER (recGebouw.alg_regio_omschrijving);

         v_errormsg := 'Fout bij bepalen district';

         SELECT   alg_district_key
           INTO   v_district_key
           FROM   alg_v_aanwezigdistrict
          WHERE   alg_regio_key = v_regio_key
                  AND TRIM (alg_district_upper) =
                        UPPER (recGebouw.alg_district_omschrijving);

         v_errormsg := 'Fout bij bepalen locatie';

         SELECT   alg_locatie_key
           INTO   v_locatie_key
           FROM   alg_v_aanweziglocatie
          WHERE   alg_district_key = v_district_key
                  AND UPPER (TRIM (alg_locatie_code)) =
                        UPPER (recGebouw.alg_locatie_code);

         IF (recGebouw.alg_srtgebouw_omschrijving IS NOT NULL)
         THEN
            v_errormsg := 'Fout bij bepalen gebouwfunctie';

            SELECT   alg_srtgebouw_key
              INTO   v_srtgebouw_key
              FROM   alg_v_aanwezigsrtgebouw
             WHERE   TRIM (alg_srtgebouw_upper) =
                        UPPER (recGebouw.alg_srtgebouw_omschrijving);
         END IF;

         v_errormsg := 'Fout bij toevoegen gebouw';

         SELECT   COUNT ( * )
           INTO   v_count
           FROM   alg_v_aanweziggebouw
          WHERE   alg_locatie_key = v_locatie_key
                  AND UPPER (TRIM (alg_gebouw_code)) =
                        UPPER (recGebouw.alg_gebouw_code);

         IF (v_count = 0)
         THEN
            INSERT INTO alg_gebouw (alg_locatie_key,
                                    alg_gebouw_code,
                                    alg_gebouw_naam,
                                    alg_srtgebouw_key)
               VALUES   (v_locatie_key,
                         recGebouw.alg_gebouw_code,
                         recGebouw.alg_gebouw_naam,
                         v_srtgebouw_key)
            RETURNING   alg_gebouw_key      INTO   v_gebouw_key;

            v_srtnoti_code := 'ALGGNE';
            v_count_new := v_count_new + 1;
         ELSE                                             -- bijwerken object!
            v_errormsg := 'Fout bij bepalen gebouw';

            SELECT   alg_gebouw_key
              INTO   v_gebouw_key
              FROM   alg_v_aanweziggebouw
             WHERE   alg_locatie_key = v_locatie_key
                     AND UPPER (TRIM (alg_gebouw_code)) =
                           UPPER (recGebouw.alg_gebouw_code);

            v_srtnoti_code := 'ALGGUP';
            v_count_upd := v_count_upd + 1;
         END IF;

         -- NULL-waarden resulteren NIET in het wissen van kenmerkvelden
         -- (bijwerken kan wel, maar wissen dus niet)!
         upsert_algkenmerk (v_gebouw_key, 'G', recGebouw.kenmerk_key1, recGebouw.waarde1);
         upsert_algkenmerk (v_gebouw_key, 'G', recGebouw.kenmerk_key2, recGebouw.waarde2);
         upsert_algkenmerk (v_gebouw_key, 'G', recGebouw.kenmerk_key3, recGebouw.waarde3);
         upsert_algkenmerk (v_gebouw_key, 'G', recGebouw.kenmerk_key4, recGebouw.waarde4);
         upsert_algkenmerk (v_gebouw_key, 'G', recGebouw.kenmerk_key5, recGebouw.waarde5);
         upsert_algkenmerk (v_gebouw_key, 'G', recGebouw.kenmerk_key6, recGebouw.waarde6);
         upsert_algkenmerk (v_gebouw_key, 'G', recGebouw.kenmerk_key7, recGebouw.waarde7);
         upsert_algkenmerk (v_gebouw_key, 'G', recGebouw.kenmerk_key8, recGebouw.waarde8);
         upsert_algkenmerk (v_gebouw_key, 'G', recGebouw.kenmerk_key9, recGebouw.waarde9);
         upsert_algkenmerk (v_gebouw_key, 'G', recGebouw.kenmerk_key10, recGebouw.waarde10);

         fac.trackaction (v_srtnoti_code, v_gebouw_key, NULL, NULL, NULL);
         COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=
                  v_errormsg
               || ' ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'W',
                              v_aanduiding || v_errormsg,
                              '');
         COMMIT;
      END;
   END LOOP;

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



CREATE OR REPLACE PROCEDURE fac_import_onrgoed1_del (
  p_import_key IN NUMBER
) IS

BEGIN

  fac_import_onrgoed1(p_import_key);

END fac_import_onrgoed1_del;
/



CREATE OR REPLACE PROCEDURE fac_update_onrgoed1_del (
  p_import_key IN NUMBER
) IS

BEGIN

  fac.imp_alg_delete_onrgoed(p_import_key,1);
  fac_update_onrgoed1(p_import_key);

END fac_update_onrgoed1_del;
/



CREATE OR REPLACE PROCEDURE fac_import_onrgoed2 (p_import_key IN NUMBER
                                                )
AS
   c_fielddelimitor                 VARCHAR2 (2) := fac.import_delimiter(p_import_key);
   v_newline                        fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
   v_errormsg                       VARCHAR2 (1000);
   v_errorhint                      VARCHAR2 (1000);
   oracle_err_num                   NUMBER;
   oracle_err_mes                   VARCHAR2 (200);
   header_is_valid                  NUMBER;
   v_count                          NUMBER;
   v_ongeldig                       NUMBER (1);
   v_mode                           NUMBER (1);
   v_aanduiding                     VARCHAR2 (200);
   v_alg_kenmerk_key1               VARCHAR2 (255);
   v_alg_kenmerk_key2               VARCHAR2 (255);
   v_alg_kenmerk_key3               VARCHAR2 (255);
   v_alg_kenmerk_key4               VARCHAR2 (255);
   v_alg_kenmerk_key5               VARCHAR2 (255);
   -- De importvelden:
   v_locatie_code                   VARCHAR2 (255);                                                               -- 10
   v_gebouw_code                    VARCHAR2 (255);                                                               -- 12
   v_verdieping_volgnr              VARCHAR2 (255);                                                               -- 3,0
   v_verdieping_volgnr_n            NUMBER (3, 0);                                                                -- 3,0
   v_srtruimte_omschrijving         VARCHAR2 (255);                                                               -- 30
   v_ruimte_nr                      VARCHAR2 (255);                                                               -- 10
   v_ruimte_omschrijving            VARCHAR2 (255);                                                               -- 30
   v_ruimte_bruto_vloeropp          VARCHAR2 (255);                                                               -- 8,2
   v_ruimte_bruto_vloeropp_n        NUMBER (8, 2);                                                                -- 8,2
   v_afdeling_naam                  VARCHAR2 (255);                                                               -- 10
   v_ruimte_afdeling_bezetting      VARCHAR2 (255);                                                               -- 8,5
   v_ruimte_afdeling_bezetting_n    VARCHAR2 (255);                                                               -- 8,5
   v_reserveerbaar                  VARCHAR2 (255);                                                               -- 1
   v_res_discipline_omschrijving    VARCHAR2 (255);                                                               -- 60
   v_res_discipline_expire_dagen    VARCHAR2 (255);                                                               -- 3
   v_res_disc_expire_dagen_n        NUMBER (3, 0);                                                                -- 3
   v_res_ruimte_prijs               VARCHAR2 (255);                                                               -- 7,2
   v_res_ruimte_prijs_n             NUMBER (7, 2);                                                                -- 7,2
   v_res_opstelling_omschrijving    VARCHAR2 (255);                                                               -- 30
   v_res_ruimte_opstel_bezoekers    VARCHAR2 (255);                                                               -- 5,0
   v_res_ruimte_opstel_bez_n        NUMBER (5, 0);                                                                -- 5,0
   v_res_ruimte_nr                  VARCHAR2 (255);                                                               -- 40
   v_res_ruimte_omschrijving        VARCHAR2 (4000);                                                              -- 255
   v_alg_kenmerkwaarde1             VARCHAR2 (255);
   v_alg_kenmerkwaarde2             VARCHAR2 (255);
   v_alg_kenmerkwaarde3             VARCHAR2 (255);
   v_alg_kenmerkwaarde4             VARCHAR2 (255);
   v_alg_kenmerkwaarde5             VARCHAR2 (255);

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

   -- Controleer tijdens import-fase op bestaan van kenmerk
   FUNCTION bepaal_kenmerk_key (kw IN VARCHAR)
      RETURN NUMBER
   IS
      v_kenmerk_key   NUMBER;
   BEGIN
      IF fac.safe_to_number (kw) IS NULL
      THEN                -- kenmerkwaarde is alfanumeriek (dus omschrijving)!
         SELECT   alg_kenmerk_key
           INTO   v_kenmerk_key
           FROM   alg_kenmerk
          WHERE   alg_kenmerk_upper = UPPER (kw)
                  AND alg_kenmerk_verwijder IS NULL
                  AND alg_kenmerk_niveau = 'R'
                  AND alg_kenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B', 'V');
      ELSE                             -- kenmerkwaarde is numeriek (dus key)!
         SELECT   alg_kenmerk_key
           INTO   v_kenmerk_key
           FROM   alg_kenmerk
          WHERE   alg_kenmerk_key = fac.safe_to_number (kw)
                  AND alg_kenmerk_verwijder IS NULL
                  AND alg_kenmerk_niveau = 'R'
                  AND alg_kenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B', 'V');
      END IF;

      RETURN v_kenmerk_key;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         IF kw IS NULL OR UPPER (kw) LIKE 'KENMERK%'
         THEN
            RETURN NULL;
         ELSE
            fac.imp_writelog (p_import_key,
                              'W',
                              'Fout bij bepalen kenmerk [' || kw || ']',
                              'Bestaat niet of type ongeldig');
            COMMIT;
            RETURN NULL;
         END IF;
   END;
BEGIN
   DELETE FROM   fac_imp_onrgoed2;

   header_is_valid := 0;
   v_count := 0;

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

         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout opvragen te importeren rij met index ' || TO_CHAR (rec1.fac_imp_file_index);
         v_aanduiding := '';
         v_errorhint := '';
         v_ongeldig := 0;

         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_fielddelimitor, v_locatie_code);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_gebouw_code);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_verdieping_volgnr);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_srtruimte_omschrijving);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_ruimte_nr);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_ruimte_omschrijving);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_ruimte_bruto_vloeropp);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_afdeling_naam);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_ruimte_afdeling_bezetting);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_reserveerbaar);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_res_discipline_omschrijving);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_res_discipline_expire_dagen);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_res_ruimte_prijs);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_res_opstelling_omschrijving);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_res_ruimte_opstel_bezoekers);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_res_ruimte_nr);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_res_ruimte_omschrijving);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_kenmerkwaarde1);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_kenmerkwaarde2);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_kenmerkwaarde3);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_kenmerkwaarde4);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_kenmerkwaarde5);

         v_aanduiding :=
            v_locatie_code || '|' || v_gebouw_code || '|' || v_verdieping_volgnr || '|' || v_ruimte_nr || '| ';

         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_locatie_code) = 'LOCATIECODE'
               AND UPPER (v_ruimte_nr) = 'RUIMTENUMMER'
               AND UPPER (v_res_ruimte_omschrijving) = 'OMSCHRIJVING'
            THEN
               v_alg_kenmerk_key1 := bepaal_kenmerk_key (v_alg_kenmerkwaarde1);
               v_alg_kenmerk_key2 := bepaal_kenmerk_key (v_alg_kenmerkwaarde2);
               v_alg_kenmerk_key3 := bepaal_kenmerk_key (v_alg_kenmerkwaarde3);
               v_alg_kenmerk_key4 := bepaal_kenmerk_key (v_alg_kenmerkwaarde4);
               v_alg_kenmerk_key5 := bepaal_kenmerk_key (v_alg_kenmerkwaarde5);

               header_is_valid := 1;
            END IF;
         ELSE
            v_count := v_count + 1;
            v_errormsg := 'Fout inlezen locatie [' || v_locatie_code || ']';

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

            --
            v_errormsg := 'Fout inlezen gebouw [' || v_gebouw_code || ']';

            v_gebouw_code := TRIM(v_gebouw_code);
            IF LENGTH (v_gebouw_code) > 12
            THEN
               v_gebouw_code := SUBSTR (v_gebouw_code, 1, 12);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Gebouwcode-aanduiding is te lang',
                                 'Aanduiding wordt afgebroken tot <' || v_gebouw_code || '>'
                                );
            END IF;

            --
            v_errormsg := '1 Fout inlezen verdiepingvolgnr [' || v_verdieping_volgnr || ']';
            v_errorhint := 'Geef een geheel getal niet groter dan 3 posities';

            IF (NVL (LENGTH (ROUND (fac.safe_to_number (v_verdieping_volgnr))), 10)) > 3
            THEN
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || 'xyz Ongeldig verdiepingvolgnummer [' || v_verdieping_volgnr || ']',
                                 v_errorhint
                                );
               v_ongeldig := 1;
            ELSE
               v_verdieping_volgnr_n := ROUND (fac.safe_to_number (v_verdieping_volgnr));
            END IF;

            --
            v_errormsg := 'Fout inlezen ruimtefunctie [' || v_srtruimte_omschrijving || ']';

            v_srtruimte_omschrijving := TRIM(v_srtruimte_omschrijving);
            IF LENGTH (v_srtruimte_omschrijving) > 50
            THEN
               v_srtruimte_omschrijving := SUBSTR (v_srtruimte_omschrijving, 1, 50);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Ruimtefunctie-aanduiding is te lang',
                                 'Aanduiding wordt afgebroken tot <' || v_srtruimte_omschrijving || '>'
                                );
            END IF;

            --
            v_errormsg := 'Fout inlezen ruimtenummer [' || v_ruimte_nr || ']';

            v_ruimte_nr := TRIM(v_ruimte_nr);
            IF LENGTH (v_ruimte_nr) > 20
            THEN
               v_ruimte_nr := SUBSTR (v_ruimte_nr, 1, 20);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Ruimtenr-aanduiding is te lang',
                                 'Aanduiding wordt afgebroken tot <' || v_ruimte_nr || '>'
                                );
            END IF;

            --
            v_errormsg := 'Fout inlezen ruimte [' || v_ruimte_omschrijving || ']';

            v_ruimte_omschrijving := TRIM(v_ruimte_omschrijving);
            IF LENGTH (v_ruimte_omschrijving) > 30
            THEN
               v_ruimte_omschrijving := SUBSTR (v_ruimte_omschrijving, 1, 30);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Ruimte-aanduiding is te lang',
                                 'Aanduiding wordt afgebroken tot <' || v_ruimte_omschrijving || '>'
                                );
            END IF;

            --
            v_errormsg := 'Fout inlezen ruimte oppervlakte [' || v_ruimte_bruto_vloeropp || ']';
            v_errorhint := 'Maximaal grootte getal is 99999.99';

            IF TRIM (v_ruimte_bruto_vloeropp) IS NULL
            THEN
               v_ruimte_bruto_vloeropp_n := TO_NUMBER (NULL);
            ELSE
               -- nls_numeric_characters wordt verondersteld
               v_ruimte_bruto_vloeropp_n := TO_NUMBER (TRIM (REPLACE (v_ruimte_bruto_vloeropp, ',', '.')), '999999D99');
            END IF;

            --
            v_errormsg := 'Fout inlezen afdelingscode [' || v_afdeling_naam || ']';

            v_afdeling_naam := TRIM(v_afdeling_naam);
            IF LENGTH (v_afdeling_naam) > 15
            THEN
               v_afdeling_naam := SUBSTR (v_afdeling_naam, 1, 15);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Afdelingscode is te lang',
                                 'Afdelingscode wordt afgebroken tot <' || v_afdeling_naam || '>'
                                );
            END IF;

            --
            v_errormsg := 'Fout inlezen ruimtebezetting [' || v_ruimte_afdeling_bezetting || ']';
            v_errorhint := 'Maximaal grootte getal is 999.99999';

            IF TRIM (v_ruimte_afdeling_bezetting) IS NULL
            THEN
               v_ruimte_afdeling_bezetting_n := TO_NUMBER (NULL);
            ELSE
               -- nls_numeric_characters wordt verondersteld
               v_ruimte_afdeling_bezetting_n := TO_NUMBER (TRIM (REPLACE (v_ruimte_afdeling_bezetting, ',', '.')), '999D99999');
            END IF;

            --
            v_reserveerbaar := SUBSTR (TRIM (v_reserveerbaar), 1, 1);
            --
            v_errormsg := 'Fout inlezen catalogus [' || v_res_discipline_omschrijving || ']';

            v_res_discipline_omschrijving := TRIM(v_res_discipline_omschrijving);
            IF LENGTH (v_res_discipline_omschrijving) > 60
            THEN
               v_res_discipline_omschrijving := SUBSTR (v_res_discipline_omschrijving, 1, 60);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Categorie-aanduiding ruimte is te lang',
                                 'Aanduiding wordt afgebroken tot <' || v_res_discipline_omschrijving || '>'
                                );
            END IF;

            --
            v_errormsg := 'Fout inlezen expire dagen [' || v_res_discipline_expire_dagen || ']';
            v_errorhint := 'Geef geheel getal niet groter dan 3 posities';

            IF TRIM (v_res_discipline_expire_dagen) IS NULL
            THEN
               v_res_disc_expire_dagen_n := 0;
            ELSE
               v_res_disc_expire_dagen_n := TO_NUMBER (v_res_discipline_expire_dagen);
            END IF;

            --
            v_errormsg := 'Fout inlezen prijs reserveerbare ruimte [' || v_res_ruimte_prijs || ']';
            v_errorhint := 'Maximaal grootte getal is 99999.99 ';

            IF (TRIM (v_res_ruimte_prijs) IS NULL)
            THEN
               v_res_ruimte_prijs_n := TO_NUMBER (NULL);
            ELSE
               -- nls_numeric_characters wordt verondersteld
               v_res_ruimte_prijs_n := TO_NUMBER (TRIM (REPLACE (v_res_ruimte_prijs, ',', '.')), '999999D99');
            END IF;

            --
            v_errormsg := 'Fout inlezen opstelling [' || v_res_opstelling_omschrijving || ']';

            v_res_opstelling_omschrijving := TRIM(v_res_opstelling_omschrijving);
            IF LENGTH (v_res_opstelling_omschrijving) > 30
            THEN
               v_res_opstelling_omschrijving := SUBSTR (v_res_opstelling_omschrijving, 1, 30);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Ruimteopstelling-aanduiding is te lang',
                                 'Aanduiding wordt afgebroken tot <' || v_res_opstelling_omschrijving || '>'
                                );
            END IF;

            --
            v_errormsg := 'Fout inlezen aantal bezoekers [' || v_res_ruimte_opstel_bezoekers || ']';
            v_errorhint := 'Geef geheel getal niet groter dan 5 posities';

            IF TRIM (v_res_ruimte_opstel_bezoekers) IS NULL
            THEN
               v_res_ruimte_opstel_bez_n := TO_NUMBER (NULL);
            ELSE
               v_res_ruimte_opstel_bez_n := TO_NUMBER (v_res_ruimte_opstel_bezoekers);
            END IF;

            --
            v_errormsg := 'Fout inlezen ruimte nummer reserveerbare ruimte omschrijving [' || v_res_ruimte_nr || ']';

            v_res_ruimte_nr := TRIM(v_res_ruimte_nr);
            IF LENGTH (v_res_ruimte_nr) > 40
            THEN
               v_errormsg := 'Fout inlezen ruimte nummer reserveerbare ruimte omschrijving [' || v_res_ruimte_nr || ']';
               v_res_ruimte_nr := SUBSTR (v_res_ruimte_nr, 1, 40);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Ruimtenr-aanduiding reserveerbare ruimte is te lang',
                                 'Aanduiding wordt afgebroken tot <' || v_res_ruimte_nr || '>'
                                );
               v_errormsg := 'Fout inlezen ruimte nummer reserveerbare ruimte omschrijving [' || v_res_ruimte_nr || ']';
            END IF;

            v_errormsg := 'Fout inlezen ruimte nummer reserveerbare ruimte omschrijving [' || v_res_ruimte_nr || ']';
            --
            v_errormsg := 'Fout inlezen reserveerbare ruimte [' || v_res_ruimte_omschrijving || ']';

            v_res_ruimte_omschrijving := TRIM(v_res_ruimte_omschrijving);
            IF LENGTH (v_res_ruimte_omschrijving) > 255
            THEN
               v_res_ruimte_omschrijving := SUBSTR (v_res_ruimte_omschrijving, 1, 255);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Ruimte-aanduiding reserveerbare ruimte is te lang',
                                 'Aanduiding wordt afgebroken tot <' || v_res_ruimte_omschrijving || '>'
                                );
            END IF;

            v_alg_kenmerkwaarde1 := TRIM (v_alg_kenmerkwaarde1);
            v_alg_kenmerkwaarde2 := TRIM (v_alg_kenmerkwaarde2);
            v_alg_kenmerkwaarde3 := TRIM (v_alg_kenmerkwaarde3);
            v_alg_kenmerkwaarde4 := TRIM (v_alg_kenmerkwaarde4);
            v_alg_kenmerkwaarde5 := TRIM (v_alg_kenmerkwaarde5);

            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               v_errormsg := 'Fout bij toevoegen te impoteren ruimte [' || v_res_ruimte_omschrijving || ']';

               INSERT INTO fac_imp_onrgoed2 (
                                                alg_locatie_code,
                                                alg_gebouw_code,
                                                alg_verdieping_volgnr,
                                                alg_srtruimte_omschrijving,
                                                alg_ruimte_nr,
                                                alg_ruimte_omschrijving,
                                                alg_ruimte_bruto_vloeropp,
                                                prs_afdeling_naam,
                                                prs_ruimteafdeling_bezetting,
                                                reserveerbaar,
                                                res_discipline_omschrijving,
                                                res_discipline_expire_dagen,
                                                res_ruimte_prijs,
                                                res_opstelling_omschrijving,
                                                res_ruimte_opstel_bezoekers,
                                                res_ruimte_nr,
                                                res_ruimte_omschrijving,
                                                alg_kenmerkwaarde1,
                                                alg_kenmerkwaarde2,
                                                alg_kenmerkwaarde3,
                                                alg_kenmerkwaarde4,
                                                alg_kenmerkwaarde5
                          )
                 VALUES   (
                              v_locatie_code,
                              v_gebouw_code,
                              v_verdieping_volgnr_n,
                              v_srtruimte_omschrijving,
                              v_ruimte_nr,
                              v_ruimte_omschrijving,
                              v_ruimte_bruto_vloeropp_n,
                              v_afdeling_naam,
                              v_ruimte_afdeling_bezetting_n,
                              v_reserveerbaar,
                              v_res_discipline_omschrijving,
                              v_res_disc_expire_dagen_n,
                              v_res_ruimte_prijs_n,
                              v_res_opstelling_omschrijving,
                              v_res_ruimte_opstel_bez_n,
                              v_res_ruimte_nr,
                              v_res_ruimte_omschrijving,
                              DECODE (v_alg_kenmerk_key1,
                                 NULL, v_alg_kenmerkwaarde1,
                                    TO_CHAR (v_alg_kenmerk_key1)
                                 || '='
                                 || SUBSTR (v_alg_kenmerkwaarde1, 1, 200)
                              ),
                              DECODE (v_alg_kenmerk_key2,
                                 NULL, v_alg_kenmerkwaarde2,
                                    TO_CHAR (v_alg_kenmerk_key2)
                                 || '='
                                 || SUBSTR (v_alg_kenmerkwaarde2, 1, 200)
                              ),
                              DECODE (v_alg_kenmerk_key3,
                                 NULL, v_alg_kenmerkwaarde3,
                                    TO_CHAR (v_alg_kenmerk_key3)
                                 || '='
                                 || SUBSTR (v_alg_kenmerkwaarde3, 1, 200)
                              ),
                              DECODE (v_alg_kenmerk_key4,
                                 NULL, v_alg_kenmerkwaarde4,
                                    TO_CHAR (v_alg_kenmerk_key4)
                                 || '='
                                 || SUBSTR (v_alg_kenmerkwaarde4, 1, 200)
                              ),
                              DECODE (v_alg_kenmerk_key5,
                                 NULL, v_alg_kenmerkwaarde5,
                                    TO_CHAR (v_alg_kenmerk_key5)
                                 || '='
                                 || SUBSTR (v_alg_kenmerkwaarde5, 1, 200)
                              )
                          );
            END IF;
         END IF;
      END;
   END LOOP;

   IF (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', 'Ruimte: aantal ingelezen regels: ' || TO_CHAR (v_count), '');
   END IF;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := v_errormsg || ' Error ' || oracle_err_num || '/' || oracle_err_mes;
      fac.imp_writelog (p_import_key,
                        'E',
                        v_errormsg,
                        'Eventeel resterende regels worden niet meer ingelezen!'
                       );
END fac_import_onrgoed2;
/


CREATE OR REPLACE PROCEDURE fac_update_onrgoed2 (
   p_import_key IN NUMBER
) IS

  c_fielddelimitor            VARCHAR2 (2) := fac.import_delimiter(p_import_key);

  v_newline                   fac_imp_file.fac_imp_file_line%TYPE;    -- 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_count_update              NUMBER(10);
  v_count_tot                 NUMBER(10);

  -- De importvelden:
  v_regio_omschrijving        VARCHAR2(255);   -- 30
  v_district_omschrijving     VARCHAR2(255);   -- 30
  v_locatie_code              VARCHAR2(255);   -- 10
  v_locatie_omschrijving      VARCHAR2(255);   -- 60
  v_gebouw_code               VARCHAR2(255);   -- 12
  v_gebouw_naam               VARCHAR2(255);   -- 30
  v_srtgebouw_omschrijving    VARCHAR2(255);   -- 30
  v_locatie_verantw           VARCHAR2(255);   -- 30
  v_locatie_verantw_tel       VARCHAR2(255);   -- 15
  v_locatie_adres             VARCHAR2(255);   -- 50
  v_locatie_postcode          VARCHAR2(255);   -- 12
  v_locatie_plaats            VARCHAR2(255);   -- 30
  v_locatie_land              VARCHAR2(255);   -- 30
  v_locatie_post_adres        VARCHAR2(255);   -- 50
  v_locatie_post_postcode     VARCHAR2(255);   -- 12
  v_locatie_post_plaats       VARCHAR2(255);   -- 30
  v_locatie_post_land         VARCHAR2(255);   -- 30

  v_regio_key                 NUMBER(10);
  v_district_key              NUMBER(10);
  v_locatie_key               NUMBER(10);
  v_srtgebouw_key             NUMBER(10);
  v_gebouw_key                NUMBER(10);
  v_verdieping_key            NUMBER(10);
  v_verdieping_volgnr         NUMBER(3);
  v_srtruimte_key             NUMBER(10);
  v_ruimte_key                NUMBER(10);
  v_res_ruimte_key            NUMBER(10);
  v_ruimte_omschrijving       res_ruimte.res_ruimte_nr%TYPE;  -- 40

  v_discipline_key            NUMBER(10);
  v_opstelling_key            NUMBER(10);
  v_ruimteafdeling_key        NUMBER(10);


  CURSOR cVerdieping
  IS
    SELECT   min(alg_locatie_code)      alg_locatie_code
            ,min(alg_gebouw_code)       alg_gebouw_code
            ,alg_verdieping_volgnr      alg_verdieping_volgnr
    FROM     fac_imp_onrgoed2
    GROUP BY upper(alg_locatie_code), upper(alg_gebouw_code), alg_verdieping_volgnr;


  recVerdieping cVerdieping%ROWTYPE;

  CURSOR cSrtRuimte
  IS
    SELECT   min(alg_srtruimte_omschrijving) alg_srtruimte_omschrijving
    FROM     fac_imp_onrgoed2
    GROUP BY alg_srtruimte_omschrijving;

  recSrtRuimte cSrtRuimte%ROWTYPE;

  CURSOR cRuimte
  IS
    SELECT  alg_locatie_code,
            alg_gebouw_code,
            alg_verdieping_volgnr,
            alg_srtruimte_omschrijving,
            alg_ruimte_nr,
            alg_ruimte_omschrijving,
            alg_ruimte_bruto_vloeropp,
            reserveerbaar,
            res_discipline_omschrijving,
            res_ruimte_prijs,
            res_opstelling_omschrijving,
            res_ruimte_opstel_bezoekers,
            res_ruimte_nr,
            res_ruimte_omschrijving,
            i.prs_afdeling_naam,
            prs_afdeling_key,
            prs_ruimteafdeling_bezetting,
            fac.safe_to_number (SUBSTR (alg_kenmerkwaarde1, 1, INSTR (alg_kenmerkwaarde1, '=') - 1))
               kenmerk_key1,
            SUBSTR (alg_kenmerkwaarde1, INSTR (alg_kenmerkwaarde1, '=') + 1) waarde1,
            fac.safe_to_number (SUBSTR (alg_kenmerkwaarde2, 1, INSTR (alg_kenmerkwaarde2, '=') - 1))
               kenmerk_key2,
            SUBSTR (alg_kenmerkwaarde2, INSTR (alg_kenmerkwaarde2, '=') + 1) waarde2,
            fac.safe_to_number (SUBSTR (alg_kenmerkwaarde3, 1, INSTR (alg_kenmerkwaarde3, '=') - 1))
               kenmerk_key3,
            SUBSTR (alg_kenmerkwaarde3, INSTR (alg_kenmerkwaarde3, '=') + 1) waarde3,
            fac.safe_to_number (SUBSTR (alg_kenmerkwaarde4, 1, INSTR (alg_kenmerkwaarde4, '=') - 1))
               kenmerk_key4,
            SUBSTR (alg_kenmerkwaarde4, INSTR (alg_kenmerkwaarde4, '=') + 1) waarde4,
            fac.safe_to_number (SUBSTR (alg_kenmerkwaarde5, 1, INSTR (alg_kenmerkwaarde5, '=') - 1))
               kenmerk_key5,
            SUBSTR (alg_kenmerkwaarde5, INSTR (alg_kenmerkwaarde5, '=') + 1) waarde5
    FROM    fac_imp_onrgoed2 i,
            prs_afdeling a
    WHERE   a.prs_afdeling_verwijder IS NULL
    AND     UPPER(i.prs_afdeling_naam) = a.prs_afdeling_upper(+);

  recRuimte cRuimte%ROWTYPE;

  CURSOR cOpstelling
  IS
    SELECT   min(res_opstelling_omschrijving) res_opstelling_omschrijving
            ,UPPER(res_opstelling_omschrijving) res_opstelling_upper
    FROM     FAC_IMP_ONRGOED2
    WHERE   res_opstelling_omschrijving IS NOT NULL
    GROUP BY UPPER(res_opstelling_omschrijving);

  recOpstelling cOpstelling%ROWTYPE;

  CURSOR cCategorie
  IS
    SELECT  min(res_discipline_omschrijving) res_discipline_omschrijving
           ,upper(res_discipline_omschrijving) res_discipline_upper
           ,NVL(res_discipline_expire_dagen,0) res_discipline_expire_dagen
    FROM    FAC_IMP_ONRGOED2
    WHERE   reserveerbaar in ('Y','y','J','j')
    GROUP   BY upper(res_discipline_omschrijving)
             , res_discipline_expire_dagen;

  recCategorie cCategorie%ROWTYPE;

  CURSOR cResRuimte
  IS
    SELECT   *
    FROM     FAC_IMP_ONRGOED2
    WHERE    RESERVEERBAAR in ('J','j','Y','y');

  recResRuimte cResRuimte%ROWTYPE;

-- SUBPROC
   PROCEDURE upsert_algkenmerk (p_ruimte_key       IN NUMBER,
                                p_kenmerk_key      IN NUMBER,
                                p_waarde           IN VARCHAR2)
   AS
      v_kenmerk_type      alg_kenmerk.alg_kenmerk_kenmerktype%TYPE;
      ccount              NUMBER;
      v_waarde            VARCHAR2 (255);
      v_objectnaam        fac_kenmerkdomein.fac_kenmerkdomein_objectnaam%TYPE;
      v_kolomnaam         fac_kenmerkdomein.fac_kenmerkdomein_kolomnaam%TYPE;
      v_kolomtxt          fac_kenmerkdomein.fac_kenmerkdomein_kolomtxt%TYPE;
      sql_stmt            VARCHAR2 (1000);
      l_cursor_1          INTEGER;
      l_rowsprocessed     NUMBER DEFAULT 0;
   BEGIN
      IF (p_kenmerk_key IS NOT NULL AND p_waarde IS NOT NULL)
      THEN
         v_errormsg := 'Fout bij bepalen kenmerktype';
         SELECT alg_kenmerk_kenmerktype
           INTO v_kenmerk_type
           FROM alg_kenmerk
          WHERE alg_kenmerk_verwijder IS NULL
            AND alg_kenmerk_key = p_kenmerk_key
            AND alg_kenmerk_niveau = 'R';

         IF v_kenmerk_type IN ('R', 'S')
         THEN
            v_errormsg := 'Fout bij bepalen eigen tabel';

            SELECT COUNT ( * )
              INTO ccount
              FROM alg_kenmerk k, fac_kenmerkdomein d
             WHERE     k.alg_kenmerk_key = p_kenmerk_key
                   AND k.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key
                   AND d.fac_usrtab_key IS NOT NULL;

            v_errormsg := 'Fout bij bepalen nieuwe waarde [' || p_waarde || ']';

            IF ccount = 1
            THEN                                                                  -- Eigen tabel
               SELECT TO_CHAR (ud.fac_usrdata_key)
                 INTO v_waarde
                 FROM alg_kenmerk k, fac_kenmerkdomein d, fac_v_aanwezigusrdata ud
                WHERE     k.alg_kenmerk_key = p_kenmerk_key
                      AND k.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key
                      AND d.fac_usrtab_key = ud.fac_usrtab_key
                      AND UPPER (TRIM (ud.fac_usrdata_omschr)) = UPPER (p_waarde);
            ELSE                                                         -- FACILITOR view/tabel
               SELECT d.fac_kenmerkdomein_objectnaam, d.fac_kenmerkdomein_kolomnaam, d.fac_kenmerkdomein_kolomtxt
                 INTO v_objectnaam, v_kolomnaam, v_kolomtxt
                 FROM alg_kenmerk k, fac_kenmerkdomein d
                WHERE     k.alg_kenmerk_key = p_kenmerk_key
                      AND k.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key
                      AND d.fac_usrtab_key IS NULL;

               sql_stmt :=    'SELECT MAX ('
                           || v_kolomnaam
                           || ') FROM '
                           || v_objectnaam
                           || ' WHERE UPPER (TRIM ('
                           || v_kolomtxt
                           || ')) = UPPER (:pwaarde)';
               l_cursor_1 := DBMS_SQL.open_cursor;
               DBMS_SQL.parse (l_cursor_1, sql_stmt, DBMS_SQL.native);
               DBMS_SQL.BIND_VARIABLE(l_cursor_1,':pwaarde', p_waarde);
               DBMS_SQL.define_column(l_cursor_1, 1, v_waarde, 255);
               l_rowsprocessed := DBMS_SQL.execute_and_fetch (l_cursor_1);
               DBMS_SQL.column_value (l_cursor_1, 1, v_waarde);
               DBMS_SQL.close_cursor(l_cursor_1);
            END IF;
         ELSE                                -- C(Karakter)/D(Datum)/N(Numeriek)/X(Bestandsnaam)
            v_waarde := p_waarde;
         END IF;

         v_errormsg := 'Fout bij toevoegen/bijwerken kenmerk';
         alg.upsertkenmerk (p_kenmerk_key,
                            p_ruimte_key,
                            v_waarde);
      END IF;
   EXCEPTION
      WHEN OTHERS
      THEN
         oracle_err_num := SQLCODE;
         oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
         v_errormsg :=
               v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
         fac.imp_writelog (p_import_key,
                           'W',
                           v_aanduiding || v_errormsg,
                           'upsert_algkenmerk');
   END;

BEGIN
  -- ****************
  -- ***VERDIEPING***
  -- ****************
  OPEN cVerdieping;
  v_count_update := 0;
  v_count_tot := 0;
  IF cVerdieping%ISOPEN THEN

    LOOP
      BEGIN
        v_errormsg    := '';
        v_errorhint   := '';
        v_aanduiding  := '';

        FETCH cVerdieping INTO recVerdieping;
        EXIT WHEN cVerdieping%NOTFOUND;
        v_count_tot := v_count_tot + 1;
        v_aanduiding := recVerdieping.ALG_LOCATIE_CODE||'|'||recVerdieping.ALG_GEBOUW_CODE||'|'||recVerdieping.ALG_VERDIEPING_VOLGNR||'| ';

        v_errorhint := ' Fout bij bepalen locatie ['||recVerdieping.ALG_LOCATIE_CODE||']';

        SELECT ALG_LOCATIE_KEY
        INTO   v_locatie_key
        FROM   ALG_LOCATIE
        WHERE  UPPER(ALG_LOCATIE_CODE) = UPPER(recVerdieping.ALG_LOCATIE_CODE)
        AND    ALG_LOCATIE_VERWIJDER IS NULL;

        v_errorhint := ' Fout bij bepalen gebouw ['||recVerdieping.ALG_GEBOUW_CODE||']';

        SELECT ALG_GEBOUW_KEY
        INTO   v_gebouw_key
        FROM   ALG_GEBOUW
        WHERE  UPPER(ALG_GEBOUW_CODE) = UPPER(recVerdieping.ALG_GEBOUW_CODE)
        AND    ALG_LOCATIE_KEY = v_locatie_key
        AND    ALG_GEBOUW_VERWIJDER IS NULL;

        v_errorhint := 'Fout bij toevoegen verdieping';

        SELECT count(*)
        INTO   v_count
        FROM   alg_v_aanwezigverdieping
        WHERE  alg_gebouw_key =  v_gebouw_key
        AND    ALG_VERDIEPING_VOLGNR = recVerdieping.ALG_VERDIEPING_VOLGNR;

        IF (v_count = 0) THEN

          insert into ALG_VERDIEPING
          (ALG_GEBOUW_KEY
          ,ALG_VERDIEPING_VOLGNR
          ,ALG_VERDIEPING_CODE
          ,ALG_VERDIEPING_OMSCHRIJVING
          )
           values
          (v_gebouw_key
          ,recVerdieping.ALG_VERDIEPING_VOLGNR
          ,to_char(recVerdieping.ALG_VERDIEPING_VOLGNR)
          ,'Verdieping '||to_char(recVerdieping.ALG_VERDIEPING_VOLGNR)
          );

        END IF;

        commit;

        v_count_update := v_count_update + 1;

        EXCEPTION WHEN OTHERS THEN
          oracle_err_num := SQLCODE;
          oracle_err_mes := SUBSTR(SQLERRM, 1, 200);
          v_errormsg := 'Fout tijdens verwerken verdieping ['||recVerdieping.ALG_LOCATIE_CODE||'-'||recVerdieping.ALG_GEBOUW_CODE||'-'||to_number(recVerdieping.ALG_VERDIEPING_VOLGNR)||']';
          v_errorhint := v_errorhint||': ' || oracle_err_mes;

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

    fac.imp_writelog (p_import_key,
                  'S',
                  'Verdieping: verwerkte regels zonder foutmelding: '||to_char(v_count_update),
                  ''
                 );

    fac.imp_writelog (p_import_key,
                  'S',
                  'Verdieping: verwerkte regels met foutmelding: '||to_char(v_count_tot-v_count_update),
                  ''
                 );
  END IF;
  CLOSE cVerdieping;


  -- *******************
  -- ***RUIMTEFUNCTIE***
  -- *******************
  OPEN cSrtRuimte;
  v_count_update := 0;
  v_count_tot := 0;
  IF cSrtRuimte%ISOPEN THEN

    LOOP
      BEGIN
        v_errormsg    := '';
        v_errorhint   := '';
        v_aanduiding  := '';

        FETCH cSrtRuimte INTO recSrtRuimte;
        EXIT WHEN cSrtRuimte%NOTFOUND;
        v_count_tot := v_count_tot + 1;
        v_aanduiding := recSrtRuimte.ALG_SRTRUIMTE_OMSCHRIJVING||'| ';

        v_errorhint := ' Fout bij toevoegen ruimtefunctie';

        SELECT count(*)
        INTO   v_count
        FROM   alg_srtruimte
        WHERE  upper(alg_srtruimte_omschrijving) = upper(recSrtRuimte.ALG_SRTRUIMTE_OMSCHRIJVING)
        AND    alg_srtruimte_verwijder is null;

        IF (v_count = 0) THEN

          insert into ALG_SRTRUIMTE
          (ALG_SRTRUIMTE_OMSCHRIJVING
          )
           values
          (recSrtRuimte.ALG_SRTRUIMTE_OMSCHRIJVING
          );

        END IF;

        commit;

        v_count_update := v_count_update + 1;

        EXCEPTION WHEN OTHERS THEN
          oracle_err_num := SQLCODE;
          oracle_err_mes := SUBSTR(SQLERRM, 1, 200);
          v_errormsg := 'Fout tijdens verwerken ruimtefunctie ['||recSrtRuimte.ALG_SRTRUIMTE_OMSCHRIJVING||']';
          v_errorhint := v_errorhint||': ' || oracle_err_mes;

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

    fac.imp_writelog (p_import_key,
                  'S',
                  'Ruimtefunctie: verwerkte regels zonder foutmelding: '||to_char(v_count_update),
                  ''
                 );

    fac.imp_writelog (p_import_key,
                  'S',
                  'Ruimtefunctie: verwerkte regels met foutmelding: '||to_char(v_count_tot-v_count_update),
                  ''
                 );
  END IF;
  CLOSE cSrtRuimte;

  -- ************
  -- ***RUIMTE***
  -- ************
  OPEN cRuimte;
  v_count_update := 0;
  v_count_tot := 0;
  IF cRuimte%ISOPEN THEN

    LOOP
      BEGIN
        v_errormsg    := '';
        v_errorhint   := '';
        v_aanduiding  := '';
        v_ruimte_key  := NULL;

        FETCH cRuimte INTO recRuimte;
        EXIT WHEN cRuimte%NOTFOUND;
        v_count_tot := v_count_tot + 1;
        v_aanduiding := recRuimte.ALG_LOCATIE_CODE||'|'||recRuimte.ALG_GEBOUW_CODE||'|'||recRuimte.ALG_VERDIEPING_VOLGNR||'|'||recRuimte.ALG_RUIMTE_NR||'| ';

        v_errorhint := ' Fout bij bepalen locatie';

        SELECT ALG_LOCATIE_KEY
        INTO   v_locatie_key
        FROM   ALG_LOCATIE
        WHERE  UPPER(ALG_LOCATIE_CODE) = UPPER(recRuimte.ALG_LOCATIE_CODE)
        AND    ALG_LOCATIE_verwijder is null;

        v_errorhint := ' Fout bij bepalen gebouw';

        SELECT ALG_GEBOUW_KEY
        INTO   v_gebouw_key
        FROM   ALG_GEBOUW
        WHERE  UPPER(ALG_GEBOUW_CODE) = UPPER(recRuimte.ALG_GEBOUW_CODE)
        AND    ALG_LOCATIE_KEY = v_locatie_key
        AND    ALG_GEBOUW_verwijder is null;

        v_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 = recRuimte.ALG_VERDIEPING_VOLGNR
        AND    ALG_VERDIEPING_verwijder is null;

        v_errorhint := ' Fout bij bepalen ruimtefunctie'||' ['||recRuimte.alg_srtruimte_omschrijving||']';

        SELECT ALG_SRTRUIMTE_KEY
        INTO   v_srtruimte_key
        FROM   ALG_SRTRUIMTE
        WHERE  upper(alg_srtruimte_omschrijving) = upper(recRuimte.ALG_SRTRUIMTE_OMSCHRIJVING)
        AND    ALG_SRTRUIMTE_verwijder is null;

        SELECT  count(*)
        INTO    v_count
        FROM    ALG_RUIMTE
        WHERE   ALG_VERDIEPING_KEY             = v_verdieping_key
        AND     UPPER(ALG_RUIMTE_NR)           = UPPER(recRuimte.ALG_RUIMTE_NR)
        -- als ruimteomschrijving in sheet afwijkt geeft dit een onduidelijke error, dan liever
        -- de omschrijving negeren en gewoon niet bijwerken
--        AND     UPPER(ALG_RUIMTE_OMSCHRIJVING) = UPPER(recRuimte.ALG_RUIMTE_OMSCHRIJVING)
        AND     alg_ruimte_verwijder is null;

        v_errorhint := ' Fout bij toevoegen ruimte';

        IF v_count = 0 THEN

          insert into ALG_RUIMTE
          (ALG_VERDIEPING_KEY
          ,ALG_SRTRUIMTE_KEY
          ,ALG_RUIMTE_NR
          ,ALG_RUIMTE_OMSCHRIJVING
          ,ALG_RUIMTE_OPMERKING
          ,ALG_RUIMTE_BRUTO_VLOEROPP
          )
           values
          (v_verdieping_key
          ,v_srtruimte_key
          ,recRuimte.ALG_RUIMTE_NR
          ,recRuimte.ALG_RUIMTE_OMSCHRIJVING
          ,''
          ,TO_NUMBER(recRuimte.ALG_RUIMTE_BRUTO_VLOEROPP)
          )
          RETURNING ALG_RUIMTE_KEY
          INTO      v_ruimte_key;

        END IF;

        commit;

        v_count_update := v_count_update + 1;

        -- Als de ruimte al bestaat, dan nog de key ophalen, zodat we 'm hieronder kunnen gebruiken.
        IF (v_ruimte_key IS NULL)
        THEN
           v_errorhint := ' Fout bij bepalen ruimte';

           SELECT  ALG_RUIMTE_KEY
           INTO    v_ruimte_key
           FROM    ALG_RUIMTE
           WHERE   ALG_VERDIEPING_KEY = v_verdieping_key
           AND     UPPER(ALG_RUIMTE_NR) = UPPER(recRuimte.ALG_RUIMTE_NR)
           AND     alg_ruimte_verwijder is null;
        END IF;

        -- ********************
        -- ***RUIMTEAFDELING***
        -- ********************
        -- AAES#25942: koppel afdeling(en) aan ruimte; één afdeling per regel, ruimte kan meerdere keren voorkomen.
        IF (recRuimte.prs_afdeling_naam IS NOT NULL)
        THEN
           IF (recRuimte.prs_afdeling_key IS NULL)
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding||' afdeling ['||recRuimte.prs_afdeling_naam||']',
                                'Afdeling niet gevonden'
                               );
           ELSE
              IF (recRuimte.prs_ruimteafdeling_bezetting IS NULL)
              THEN
                 fac.imp_writelog (p_import_key,
                                   'W',
                                   v_aanduiding||' afdeling ['||recRuimte.prs_afdeling_naam||']',
                                   'Fout: afdeling gevuld, bezetting leeg!'
                                  );
              ELSIF (recRuimte.prs_ruimteafdeling_bezetting > 100 OR recRuimte.prs_ruimteafdeling_bezetting < 0)
              THEN
                 fac.imp_writelog (p_import_key,
                                   'W',
                                   v_aanduiding||' afdeling ['||recRuimte.prs_afdeling_naam||']',
                                 'Ongeldige ruimtebezetting ['||TO_CHAR(recRuimte.prs_ruimteafdeling_bezetting)||'] verwacht 0 <= bezetting <= 100'
                                  );
              ELSE
                 BEGIN
                   SELECT COUNT(*), MAX(prs_ruimteafdeling_key)
                   INTO   v_count, v_ruimteafdeling_key
                   FROM   prs_ruimteafdeling
                   WHERE  prs_ruimteafdeling_verwijder IS NULL
                   AND    prs_afdeling_key = recRuimte.prs_afdeling_key
                   AND    alg_ruimte_key = v_ruimte_key;

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

                      INSERT INTO prs_ruimteafdeling
                         (prs_afdeling_key
                         ,alg_ruimte_key
                         ,prs_ruimteafdeling_bezetting)
                      VALUES
                         (recRuimte.prs_afdeling_key
                         ,v_ruimte_key
                         ,recRuimte.prs_ruimteafdeling_bezetting
                         );
                   END IF;

                   IF (v_count = 1)
                   THEN
                      v_errorhint := ' Fout bij aanpassen ruimtebezetting';

                      UPDATE prs_ruimteafdeling
                         SET prs_ruimteafdeling_bezetting = recRuimte.prs_ruimteafdeling_bezetting
                       WHERE prs_ruimteafdeling_key = v_ruimteafdeling_key;
                   END IF;

                 EXCEPTION WHEN OTHERS THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR(SQLERRM, 1, 200);
                     v_errormsg := 'Fout tijdens verwerken ruimteafdeling ['||
                                   recRuimte.ALG_LOCATIE_CODE||'-'||recRuimte.ALG_GEBOUW_CODE||'-'||recRuimte.ALG_VERDIEPING_VOLGNR||'-'||recRuimte.ALG_RUIMTE_NR
                                   ||'] / ['||recRuimte.PRS_AFDELING_NAAM||']';
                     v_errorhint := v_errorhint||': ' || oracle_err_mes;

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

        -- *******************
        -- ***FLEXKENMERKEN***
        -- *******************
        v_errorhint := ' Fout bij toevoegen/bijwerken flexkenmerken';

        upsert_algkenmerk (v_ruimte_key, recRuimte.kenmerk_key1, recRuimte.waarde1);
        upsert_algkenmerk (v_ruimte_key, recRuimte.kenmerk_key2, recRuimte.waarde2);
        upsert_algkenmerk (v_ruimte_key, recRuimte.kenmerk_key3, recRuimte.waarde3);
        upsert_algkenmerk (v_ruimte_key, recRuimte.kenmerk_key4, recRuimte.waarde4);
        upsert_algkenmerk (v_ruimte_key, recRuimte.kenmerk_key5, recRuimte.waarde5);

      EXCEPTION WHEN OTHERS THEN
          oracle_err_num := SQLCODE;
          oracle_err_mes := SUBSTR(SQLERRM, 1, 200);
          v_errormsg := 'Fout tijdens verwerken ruimte ['||recRuimte.ALG_LOCATIE_CODE||'-'||recRuimte.ALG_GEBOUW_CODE||'-'||recRuimte.ALG_VERDIEPING_VOLGNR||'-'||recRuimte.ALG_RUIMTE_NR||']';
          v_errorhint := v_errorhint||': ' || oracle_err_mes;

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

    END LOOP;

    fac.imp_writelog (p_import_key,
                  'S',
                  'Ruimte: verwerkte regels zonder foutmelding: '||to_char(v_count_update),
                  ''
                 );

    fac.imp_writelog (p_import_key,
                  'S',
                  'Ruimte: verwerkte regels met foutmelding: '||to_char(v_count_tot-v_count_update),
                  ''
                 );
  END IF;
  CLOSE cRuimte;

  -- ****************
  -- ***OPSTELLING***
  -- ****************
  OPEN cOpstelling;
  v_count_update := 0;
  v_count_tot := 0;
  IF cOpstelling%ISOPEN THEN

    LOOP
      BEGIN
        v_errormsg    := '';
        v_errorhint   := '';
        v_aanduiding  := '';

        FETCH cOpstelling INTO recOpstelling;
        EXIT WHEN cOpstelling%NOTFOUND;
        v_count_tot := v_count_tot + 1;
        v_aanduiding  := recOpstelling.RES_OPSTELLING_OMSCHRIJVING||'| ';

        v_errorhint := ' Fout bij toevoegen opstelling';

        select count(*)
        into   v_count
        from   RES_OPSTELLING
        where  RES_OPSTELLING_verwijder is null
        and    trim(RES_OPSTELLING_upper) = upper(trim(recOpstelling.RES_OPSTELLING_OMSCHRIJVING));

        IF (v_count = 0) THEN

            insert into RES_OPSTELLING
            (RES_OPSTELLING_OMSCHRIJVING
            )
             values
            (trim(recOpstelling.RES_OPSTELLING_OMSCHRIJVING)
            );

        END IF;

        commit;

        v_count_update := v_count_update + 1;

        EXCEPTION WHEN OTHERS THEN
          oracle_err_num := SQLCODE;
          oracle_err_mes := SUBSTR(SQLERRM, 1, 200);
          v_errormsg := 'Fout tijdens verwerken opstelling ['||recOpstelling.RES_OPSTELLING_OMSCHRIJVING||']';
          v_errorhint := v_errorhint||': ' || oracle_err_mes;

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

    fac.imp_writelog (p_import_key,
                  'S',
                  'Opstelling: verwerkte regels zonder foutmelding: '||to_char(v_count_update),
                  ''
                 );

    fac.imp_writelog (p_import_key,
                  'S',
                  'Opstelling: verwerkte regels met foutmelding: '||to_char(v_count_tot-v_count_update),
                  ''
                 );
  END IF;
  CLOSE cOpstelling;

  -- ***************
  -- ***CATEGORIE***
  -- ***************
  OPEN cCategorie;
  v_count_update := 0;
  v_count_tot := 0;
  IF cCategorie%ISOPEN THEN

    LOOP
      BEGIN
        v_errormsg    := '';
        v_errorhint   := '';
        v_aanduiding  := '';

        FETCH cCategorie INTO recCategorie;
        EXIT WHEN cCategorie%NOTFOUND;
        v_count_tot := v_count_tot + 1;
        v_aanduiding  := recCategorie.res_discipline_omschrijving||'| ';

        v_errorhint := ' Fout bij toevoegen categorie';

        select count(*)
        into   v_count
        from   ins_tab_discipline
        where  ins_discipline_verwijder is null
        and    ins_discipline_module='RES'
        and    upper(trim(ins_discipline_omschrijving)) = upper(trim(recCategorie.res_discipline_omschrijving));

        IF (v_count = 0) THEN

            INSERT INTO ins_tab_discipline
                (ins_discipline_module
                ,ins_discipline_omschrijving
                ,ins_discipline_verwijder
                ,ins_discipline_min_level)
            VALUES
                ('RES'
                ,trim(recCategorie.res_discipline_omschrijving)
                ,to_date(null)
                ,3)
            RETURNING ins_discipline_key
            INTO v_discipline_key;

            INSERT INTO res_disc_params
            (res_ins_discipline_key
            ,res_disc_params_expire_dagen)
            VALUES
            (v_discipline_key
            ,recCategorie.res_discipline_expire_dagen
            );

        END IF;

        commit;

        v_count_update := v_count_update + 1;

        EXCEPTION WHEN OTHERS THEN
          oracle_err_num := SQLCODE;
          oracle_err_mes := SUBSTR(SQLERRM, 1, 200);
          v_errormsg := 'Fout tijdens verwerken catalogus ['||recCategorie.res_discipline_omschrijving||']';
          v_errorhint := v_errorhint||': ' || oracle_err_mes;

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

    fac.imp_writelog (p_import_key,
                  'S',
                  'Categorie: verwerkte regels zonder foutmelding: '||to_char(v_count_update),
                  ''
                 );

    fac.imp_writelog (p_import_key,
                  'S',
                  'Categorie: verwerkte regels met foutmelding: '||to_char(v_count_tot-v_count_update),
                  ''
                 );
  END IF;
  CLOSE cCategorie;

  -- ***************
  -- ***RESRUIMTE***
  -- ***************
  OPEN cResRuimte;
  v_count_update := 0;
  v_count_tot := 0;
  IF cResRuimte%ISOPEN THEN

    LOOP
      BEGIN
        v_errormsg    := '';
        v_errorhint   := '';
        v_aanduiding  := '';

        FETCH cResRuimte INTO recResRuimte;
        EXIT WHEN cResRuimte%NOTFOUND;
        v_count_tot := v_count_tot + 1;
        v_aanduiding  := recResRuimte.ALG_LOCATIE_CODE||'|'||recResRuimte.ALG_GEBOUW_CODE||'|'||recResRuimte.ALG_VERDIEPING_VOLGNR||'|'||recResRuimte.ALG_RUIMTE_NR||'| ';

        v_errorhint := ' Fout bij bepalen locatie';

        SELECT ALG_LOCATIE_KEY
        INTO   v_locatie_key
        FROM   ALG_LOCATIE
        WHERE  UPPER(ALG_LOCATIE_CODE) = UPPER(recResRuimte.ALG_LOCATIE_CODE)
        AND    alg_locatie_verwijder is null;

        v_errorhint := ' Fout bij bepalen gebouw';

        SELECT ALG_GEBOUW_KEY
        INTO   v_gebouw_key
        FROM   ALG_GEBOUW
        WHERE  UPPER(ALG_GEBOUW_CODE) = UPPER(recResRuimte.ALG_GEBOUW_CODE)
        AND    ALG_LOCATIE_KEY = v_locatie_key
        AND    alg_gebouw_verwijder is null;

        v_errorhint := ' Fout bij bepalen verdieping';

        SELECT ALG_VERDIEPING_KEY, ALG_VERDIEPING_VOLGNR
        INTO   v_verdieping_key, v_verdieping_volgnr
        FROM   ALG_VERDIEPING
        WHERE  ALG_GEBOUW_KEY = v_gebouw_key
        AND    ALG_VERDIEPING_VOLGNR = recResRuimte.ALG_VERDIEPING_VOLGNR;

        v_errorhint := ' Fout bij bepalen ruimte';

        SELECT ALG_RUIMTE_KEY
        INTO   v_ruimte_key
        FROM   ALG_V_AANWEZIGRUIMTE
        WHERE  ALG_VERDIEPING_KEY   = v_verdieping_key
        AND    ALG_RUIMTE_UPPER_NR  = UPPER(recResRuimte.ALG_RUIMTE_NR);

        v_errorhint := ' Fout bij bepalen catalogus ['||recResRuimte.res_discipline_omschrijving||']';

        SELECT ins_discipline_key
        INTO   v_discipline_key
        FROM   RES_V_RES_CATALOGUS
        WHERE  ins_discipline_verwijder IS NULL
        AND    ins_discipline_min_level = 3
        AND    upper(trim(ins_discipline_omschrijving)) = upper(trim(recResRuimte.res_discipline_omschrijving));

        v_errorhint := ' Fout bij bepalen opstelling ['||recResRuimte.RES_OPSTELLING_OMSCHRIJVING||']';

        SELECT RES_OPSTELLING_KEY
        INTO   v_opstelling_key
        FROM   RES_OPSTELLING
        WHERE  UPPER(trim(RES_OPSTELLING_OMSCHRIJVING)) = UPPER(trim(recResRuimte.RES_OPSTELLING_OMSCHRIJVING))
        AND    RES_OPSTELLING_verwijder is null;

        v_errorhint := ' Fout bij samenstellen ruimte-omschrijving';

        IF (recResRuimte.RES_RUIMTE_NR IS NULL) THEN
          v_ruimte_omschrijving := SUBSTR( recResRuimte.ALG_LOCATIE_CODE || '-' || recResRuimte.ALG_GEBOUW_CODE || '-' || TO_CHAR(recResRuimte.ALG_VERDIEPING_VOLGNR) || '-' || recResRuimte.ALG_RUIMTE_NR,1,40);
        ELSE
          v_ruimte_omschrijving := recResRuimte.RES_RUIMTE_NR;
        END IF;

        v_errorhint := 'Fout bij bepalen reserveerbare ruimte';

        SELECT count(*)
        INTO   v_count
        FROM   RES_RUIMTE
        WHERE  RES_RUIMTE_UPPER = upper(v_ruimte_omschrijving)
        AND    res_ruimte_verwijder is null;

        IF v_count = 0 THEN

          v_errorhint := 'Fout bij toevoegen reserveerbare ruimte';

          INSERT INTO RES_RUIMTE
          (RES_RUIMTE_NR
          ,RES_RUIMTE_UPPER
          ,RES_RUIMTE_PRIJS
          ,RES_RUIMTE_OMSCHRIJVING
          ,RES_DISCIPLINE_KEY
          )
          VALUES
          (v_ruimte_omschrijving
          ,upper(v_ruimte_omschrijving)
          ,recResRuimte.RES_RUIMTE_PRIJS
          ,recResRuimte.RES_RUIMTE_OMSCHRIJVING
          ,v_discipline_key
          )
          RETURNING RES_RUIMTE_KEY
          INTO v_res_ruimte_key;

          v_errorhint := 'Fout bij koppelen ruimte en reserveerbare ruimte';

          insert into RES_ALG_RUIMTE
          (RES_RUIMTE_KEY
          ,ALG_RUIMTE_KEY
          )
          values
          (v_res_ruimte_key
          ,v_ruimte_key
          );

        ELSE

          SELECT RES_RUIMTE_KEY
          INTO   v_res_ruimte_key
          FROM   RES_RUIMTE
          WHERE  RES_RUIMTE_UPPER = upper(v_ruimte_omschrijving)
          AND    res_ruimte_verwijder IS NULL;

        END IF;

        v_errorhint := 'Fout bij koppelen opstelling en reserveerbare ruimte';

        insert into RES_RUIMTE_OPSTELLING
        (RES_RUIMTE_KEY
        ,RES_OPSTELLING_KEY
        ,RES_RUIMTE_OPSTEL_BEZOEKERS
        )
        values
        (v_res_ruimte_key
        ,v_opstelling_key
        ,NVL(recResRuimte.RES_RUIMTE_OPSTEL_BEZOEKERS, 0)
        );

        commit;

        v_count_update := v_count_update + 1;

        EXCEPTION WHEN OTHERS THEN
          oracle_err_num := SQLCODE;
          oracle_err_mes := SUBSTR(SQLERRM, 1, 200);
          v_errormsg := 'Reserveerbare ruimte ['||recResRuimte.RES_RUIMTE_OMSCHRIJVING||']';
          v_errorhint := v_errorhint||': ' || oracle_err_mes;

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

    fac.imp_writelog (p_import_key,
                  'S',
                  'Res. ruimte: verwerkte regels zonder foutmelding: '||to_char(v_count_update),
                  ''
                 );

    fac.imp_writelog (p_import_key,
                  'S',
                  'Res. ruimte: verwerkte regels met foutmelding: '||to_char(v_count_tot-v_count_update),
                  ''
                 );
  END IF;
  CLOSE cResRuimte;

EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
      v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        'Fout tijdens importeren van onroerend goed (verdieping en ruimte) ',
                        ''
                       );
END fac_update_onrgoed2;
/



CREATE OR REPLACE PROCEDURE fac_update_onrgoed2_del (
  p_import_key IN NUMBER
) IS

BEGIN

  fac.imp_alg_delete_onrgoed(p_import_key,2);
  fac_update_onrgoed2(p_import_key);

END fac_update_onrgoed2_del;
/



CREATE OR REPLACE PROCEDURE fac_import_onrgoed2_del (
  p_import_key IN NUMBER
) IS

BEGIN

  fac_import_onrgoed2(p_import_key);

END fac_import_onrgoed2_del;
/


--// PROCEDURES VOOR FIP imports - PROCEDURES VOOR FIP imports - PROCEDURES VOOR FIP imports - PROCEDURES VOOR FIP imports
--// PROCEDURES VOOR FIP imports - PROCEDURES VOOR FIP imports - PROCEDURES VOOR FIP imports - PROCEDURES VOOR FIP imports
--// PROCEDURES VOOR FIP imports - PROCEDURES VOOR FIP imports - PROCEDURES VOOR FIP imports - PROCEDURES VOOR FIP imports
--// 2. PRS

--//////////////////////////////////////////////////PRS IMPORT STUFF///////////////////////////////////////////

CREATE OR REPLACE PROCEDURE fac_import_organisatie (p_import_key IN NUMBER
                                                   )
AS
   c_fielddelimitor VARCHAR2 (2) := fac.import_delimiter(p_import_key);
   v_newline VARCHAR2 (1000);                                                                              -- Input line
   v_errormsg VARCHAR2 (1000);
   oracle_err_num NUMBER;
   oracle_err_mes VARCHAR2 (200);
   header_is_valid NUMBER;
   v_count NUMBER;
   v_ongeldig NUMBER (1);
   v_mode NUMBER (1);
   v_aanduiding VARCHAR2 (200);
   v_all_null BOOLEAN;
   v_count_error NUMBER (10);
   v_count_tot NUMBER (10);
   v_count_import NUMBER (10);
   -- De importvelden:
   v_bedrijf_naam VARCHAR2 (256);
   v_afdeling_naam VARCHAR2 (256);
   v_afdeling_naam_parent VARCHAR2 (256);
   v_afdeling_omschrijving VARCHAR2 (256);
   v_kostenplaats_nr VARCHAR2 (256);

   -- PRS_BEDRIJF
   CURSOR c1
   IS
        SELECT   *
          FROM   fac_imp_file
         WHERE   fac_import_key = p_import_key
      ORDER BY   fac_imp_file_index;
BEGIN
   -- Eerst opruiming
   DELETE FROM   fac_imp_organisatie;

   COMMIT;
   v_count_error := 0;
   header_is_valid := 0;
   v_count_tot := 0;
   v_count_import := 0;

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

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

         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_fielddelimitor, v_bedrijf_naam);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_afdeling_naam_parent);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_afdeling_naam);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_afdeling_omschrijving);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_nr);
         v_aanduiding := v_bedrijf_naam || '|' || v_afdeling_naam || '|' || v_afdeling_omschrijving || '| ';

         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_bedrijf_naam) = 'BEDRIJFSNAAM'
               AND UPPER (v_afdeling_naam_parent) = 'AFDELINGSCODEPARENT'
               AND UPPER (v_kostenplaats_nr) = 'KOSTENPLAATS'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            --fac.imp_writelog (p_import_key, 'I', v_aanduiding, '');
            -- Controleer alle veldwaarde
            v_bedrijf_naam := TRIM (v_bedrijf_naam);

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

            --
            v_afdeling_naam := TRIM (v_afdeling_naam);

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

            --
            v_afdeling_naam_parent := TRIM (v_afdeling_naam_parent);

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

            --
            v_afdeling_omschrijving := TRIM (v_afdeling_omschrijving);

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

            --
            v_kostenplaats_nr := TRIM (v_kostenplaats_nr);

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

            v_all_null :=
                   (v_bedrijf_naam IS NULL)
               AND (v_afdeling_naam IS NULL)
               AND (v_afdeling_naam_parent IS NULL)
               AND (v_afdeling_omschrijving IS NULL)
               AND (v_kostenplaats_nr IS NULL);

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

               INSERT INTO fac_imp_organisatie (
                                                   prs_bedrijf_naam,
                                                   prs_afdeling_naam,
                                                   prs_afdeling_naam_parent,
                                                   prs_afdeling_omschrijving,
                                                   prs_kostenplaats_nr
                          )
                 VALUES   (
                              v_bedrijf_naam,
                              v_afdeling_naam,
                              v_afdeling_naam_parent,
                              v_afdeling_omschrijving,
                              v_kostenplaats_nr
                          );

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

   IF (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', 'Bedrijf: aantal ingelezen regels: ' || TO_CHAR (v_count_tot), '');
      fac.imp_writelog (p_import_key,
                        'S',
                        'Bedrijf: 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_errormsg, '');
END fac_import_organisatie;
/




CREATE OR REPLACE PROCEDURE fac_import_organisatie_del (
  p_import_key IN NUMBER
) IS

BEGIN

  fac_import_organisatie(p_import_key);

END;
/



CREATE OR REPLACE PROCEDURE fac_update_organisatie (
   p_import_key IN NUMBER
) IS

  c_fielddelimitor            VARCHAR2 (2) := fac.import_delimiter(p_import_key);

  v_newline                   fac_imp_file.fac_imp_file_line%TYPE;    -- 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_bedrijf_key               NUMBER(10);
  v_kostenplaats_key          NUMBER(10);
  v_prs_afdeling_parentkey    NUMBER(10);

  CURSOR cBedrijf
  IS
    SELECT  min(prs_bedrijf_naam) prs_bedrijf_naam
      FROM  fac_imp_organisatie
      WHERE prs_bedrijf_naam is not null
     GROUP BY upper(prs_bedrijf_naam);

  recBedrijf cBedrijf%ROWTYPE;

  -- Bij 1-op-1 relatie tussen kostenplaats en afdeling de kostenplaatsomschrijving zetten op
  -- de afdelingsomschrijving, ander de kostenplaatsomschrijving leeg laten.
  CURSOR cKPN
  IS
    SELECT  MIN(prs_kostenplaats_nr)                              prs_kostenplaats_nr,
            DECODE(COUNT(*),1,MAX(prs_afdeling_omschrijving),'')  prs_kostenplaats_omschrijving,
            'PRS'                                                 prs_kostenplaats_module
      FROM  FAC_IMP_ORGANISATIE
      WHERE prs_kostenplaats_nr IS NOT NULL
     GROUP BY UPPER(prs_kostenplaats_nr);

  recKPN cKpn%ROWTYPE;

  CURSOR cAfdeling1
  IS
    SELECT    MIN(prs_bedrijf_naam)                 prs_bedrijf_naam
             ,UPPER(prs_bedrijf_naam)               prs_bedrijf_naam_upper
             ,MIN(prs_afdeling_naam)                prs_afdeling_naam
             ,UPPER(prs_afdeling_naam)              prs_afdeling_upper
             ,MAX(prs_afdeling_omschrijving)        prs_afdeling_omschrijving
             ,MIN(prs_afdeling_naam_parent)         prs_afdeling_naam_parent
             ,MIN(UPPER(prs_afdeling_naam_parent))  prs_afdeling_naam_parent_upper
             ,MAX(prs_kostenplaats_nr)              prs_kostenplaats_nr
             ,MAX(UPPER(prs_kostenplaats_nr))       prs_kostenplaats_upper
             ,NIVEAU
        FROM  (SELECT 1  NIVEAU,
                      a1.prs_bedrijf_naam,
                      a1.prs_afdeling_naam,
                      a1.prs_afdeling_omschrijving,
                      a1.prs_kostenplaats_nr,
                      '' PRS_AFDELING_NAAM_PARENT
                 FROM FAC_IMP_ORGANISATIE a1
                WHERE a1.prs_afdeling_naam_parent IS NULL
              UNION ALL
               SELECT 2,
                      a2.prs_bedrijf_naam,
                      a2.prs_afdeling_naam,
                      a2.prs_afdeling_omschrijving,
                      a2.prs_kostenplaats_nr,
                      a1.prs_afdeling_naam
                 FROM FAC_IMP_ORGANISATIE a1, FAC_IMP_ORGANISATIE a2
                WHERE a2.prs_afdeling_naam_parent = a1.prs_afdeling_naam
                  AND a1.prs_afdeling_naam_parent IS NULL
              UNION ALL
               SELECT 3,
                      a3.prs_bedrijf_naam,
                      a3.prs_afdeling_naam,
                      a3.prs_afdeling_omschrijving,
                      a3.prs_kostenplaats_nr,
                      a2.prs_afdeling_naam
                 FROM FAC_IMP_ORGANISATIE a1, FAC_IMP_ORGANISATIE a2, FAC_IMP_ORGANISATIE a3
                WHERE a3.prs_afdeling_naam_parent = a2.prs_afdeling_naam
                  AND a2.prs_afdeling_naam_parent = a1.prs_afdeling_naam
                  AND a1.prs_afdeling_naam_parent IS NULL
              UNION ALL
               SELECT 4,
                      a4.prs_bedrijf_naam,
                      a4.prs_afdeling_naam,
                      a4.prs_afdeling_omschrijving,
                      a4.prs_kostenplaats_nr,
                      a3.prs_afdeling_naam
                 FROM FAC_IMP_ORGANISATIE a1, FAC_IMP_ORGANISATIE a2, FAC_IMP_ORGANISATIE a3, FAC_IMP_ORGANISATIE a4
                WHERE a4.prs_afdeling_naam_parent = a3.prs_afdeling_naam
                  AND a3.prs_afdeling_naam_parent = a2.prs_afdeling_naam
                  AND a2.prs_afdeling_naam_parent = a1.prs_afdeling_naam
                  AND a1.prs_afdeling_naam_parent IS NULL
              UNION ALL
               SELECT 5,
                      a5.prs_bedrijf_naam,
                      a5.prs_afdeling_naam,
                      a5.prs_afdeling_omschrijving,
                      a5.prs_kostenplaats_nr,
                      a4.prs_afdeling_naam
                 FROM FAC_IMP_ORGANISATIE a1, FAC_IMP_ORGANISATIE a2, FAC_IMP_ORGANISATIE a3, FAC_IMP_ORGANISATIE a4, FAC_IMP_ORGANISATIE a5
                WHERE a5.prs_afdeling_naam_parent = a4.prs_afdeling_naam
                  AND a4.prs_afdeling_naam_parent = a3.prs_afdeling_naam
                  AND a3.prs_afdeling_naam_parent = a2.prs_afdeling_naam
                  AND a2.prs_afdeling_naam_parent = a1.prs_afdeling_naam
                  AND a1.prs_afdeling_naam_parent IS NULL)
       WHERE ((prs_bedrijf_naam IS NOT NULL) AND (prs_afdeling_naam IS NOT NULL)) -- geen lege regels
    GROUP BY UPPER(prs_bedrijf_naam), UPPER(prs_afdeling_naam), NIVEAU
    ORDER BY NIVEAU;

  recAfdeling1 cAfdeling1%ROWTYPE;

BEGIN

  OPEN cBedrijf;
  v_count_update := 0;
  v_count_tot := 0;
  v_count_error := 0;
  IF cBedrijf%ISOPEN THEN

    LOOP
      BEGIN

        FETCH cBedrijf INTO recBedrijf;
        EXIT WHEN cBedrijf%NOTFOUND;
        v_count_tot := v_count_tot + 1;

        v_aanduiding := recBedrijf.PRS_BEDRIJF_NAAM||'| ';
        v_errormsg := '';
        v_errorhint := '';

        v_errorhint := 'Kijken of bedrijf al bestaat';
        SELECT count(*)
        INTO   v_count
        FROM   prs_bedrijf
        WHERE  upper(prs_bedrijf_naam_upper) = upper(recBedrijf.prs_bedrijf_naam)
        AND    prs_bedrijf_verwijder is null;

        IF (v_count = 0) THEN

          v_errorhint := 'Fout bij toevoegen bedrijf';
          INSERT INTO PRS_BEDRIJF (
           prs_bedrijf_naam
          ,prs_bedrijf_intern
          ) VALUES (
          recBedrijf.prs_bedrijf_naam
          ,1
          );

          commit;
          v_count_update := v_count_update + 1;

        END IF;

        EXCEPTION WHEN OTHERS THEN
          v_count_error := v_count_error + 1;
          oracle_err_num := SQLCODE;
          oracle_err_mes := SUBSTR(SQLERRM, 1, 200);
          IF (v_errormsg IS NULL) THEN
            v_errormsg := 'Fout tijdens verwerken van bedrijf ['||recBedrijf.PRS_BEDRIJF_NAAM||']';
          END IF;
          v_errorhint := v_errorhint||': ' || 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',
                  'Bedrijf: verwerkte regels zonder foutmelding: '||to_char(v_count_tot-v_count_error),
                  ''
                 );

    fac.imp_writelog (p_import_key,
                  'S',
                  'Bedrijf: verwerkte regels met foutmelding: <b>'||to_char(v_count_error),
                  ''
                 );

  END IF;

  OPEN cKPN;
  v_count_update := 0;
  v_count_tot := 0;
  v_count_error := 0;
  IF cKPN%ISOPEN THEN

    LOOP
      BEGIN
        v_aanduiding := recKPN.PRS_KOSTENPLAATS_NR||'| ';
        v_errormsg := '';
        v_errorhint := '';

        FETCH cKPN INTO recKPN;
        EXIT WHEN cKPN%NOTFOUND;
        v_count_tot := v_count_tot + 1;

        v_aanduiding := recBedrijf.PRS_BEDRIJF_NAAM||'| ';
        v_errormsg := '';
        v_errorhint := '';

        v_errorhint := 'Kijken of de kostenplaats al bestaat';
        SELECT count(*)
        INTO   v_count
        FROM   prs_kostenplaats
        WHERE  prs_kostenplaats_verwijder is null
        AND    upper(prs_kostenplaats_upper) = upper(recKPN.prs_kostenplaats_nr);

        IF (v_count = 0) THEN

          v_errorhint := 'Fout bij toevoegen kostenplaats';
          INSERT INTO PRS_KOSTENPLAATS
          (PRS_KOSTENPLAATS_NR
          ,PRS_KOSTENPLAATS_OMSCHRIJVING
          ,PRS_KOSTENPLAATS_MODULE)
          VALUES
          (recKPN.prs_kostenplaats_nr
          ,recKPN.prs_kostenplaats_omschrijving
          ,recKPN.prs_kostenplaats_module);

          commit;
          v_count_update := v_count_update + 1;

        END IF;

        EXCEPTION WHEN OTHERS THEN
          v_count_error := v_count_error + 1;
          oracle_err_num := SQLCODE;
          oracle_err_mes := SUBSTR(SQLERRM, 1, 200);
          IF (v_errormsg IS NULL) THEN
            v_errormsg := 'Fout tijdens verwerken van kostenplaats ['||recKPN.PRS_KOSTENPLAATS_NR||']';
          END IF;
          v_errorhint := v_errorhint||': ' || 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',
                  'Kostenplaats: verwerkte regels zonder foutmelding: '||to_char(v_count_tot-v_count_error),
                  ''
                 );

    fac.imp_writelog (p_import_key,
                  'S',
                  'Kostenplaats: verwerkte regels met foutmelding: <b>'||to_char(v_count_error),
                  ''
                 );

  END IF;


  OPEN cAfdeling1;
  v_count_update := 0;
  v_count_tot := 0;
  v_count_error := 0;
  IF cAfdeling1%ISOPEN THEN

    LOOP
      BEGIN

        FETCH cAfdeling1 INTO recAfdeling1;
        EXIT WHEN cAfdeling1%NOTFOUND;
        v_count_tot := v_count_tot + 1;

        v_aanduiding := recAfdeling1.prs_bedrijf_naam||'|'||recAfdeling1.prs_afdeling_naam||'|'||recAfdeling1.prs_afdeling_naam_parent ||'| ';
        v_errormsg := '';
        v_errorhint := '';

        IF (recAfdeling1.niveau = 1) THEN
          v_errorhint := 'Bedrijf niet gevonden bij afdeling';
          v_prs_afdeling_parentkey := to_number(NULL);
          SELECT prs_bedrijf_key
          INTO   v_bedrijf_key
          FROM   prs_bedrijf
          WHERE  prs_bedrijf_verwijder IS NULL
          AND    prs_bedrijf_naam_upper = recAfdeling1.prs_bedrijf_naam_upper;
        ELSE
          v_errorhint := 'Parent van de afdeling niet gevonden';
          v_bedrijf_key := to_number(NULL);
          SELECT prs_afdeling_key
          INTO   v_prs_afdeling_parentkey
          FROM   prs_afdeling
          WHERE  prs_afdeling_verwijder IS NULL
          AND    prs_afdeling_upper = recAfdeling1.prs_afdeling_naam_parent_upper;
        END IF;

        v_errorhint := 'Bepalen of afdeling bestaat';
        SELECT count(*)
        INTO   v_count
        FROM   prs_afdeling
        WHERE  upper(rtrim(prs_afdeling_omschrijving)) = upper(rtrim(recAfdeling1.prs_afdeling_omschrijving))
        AND    prs_afdeling_verwijder is null;

        v_errorhint := 'Kostenplaats bij afdeling bepalen';
        SELECT  COUNT(*), NVL(MAX(prs_kostenplaats_key),to_number(NULL))
        INTO    v_count, v_kostenplaats_key
        FROM    PRS_KOSTENPLAATS
        WHERE   prs_kostenplaats_verwijder IS NULL
        AND     prs_kostenplaats_upper = UPPER(trim(recAfdeling1.prs_kostenplaats_upper))
        AND     UPPER(prs_kostenplaats_module) = 'PRS';

        v_errorhint := 'Kostenplaats bij afdeling bepalen';
        SELECT  COUNT(*)
        INTO    v_count
        FROM    PRS_AFDELING
        WHERE   prs_afdeling_verwijder IS NULL
        AND     prs_afdeling_upper = UPPER(trim(recAfdeling1.prs_afdeling_upper));

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

          insert into PRS_AFDELING
          (prs_afdeling_naam
          ,prs_afdeling_omschrijving
          ,prs_bedrijf_key
          ,prs_afdeling_parentkey
          ,prs_kostenplaats_key
          )
           values
          (recAfdeling1.prs_afdeling_naam
          ,recAfdeling1.prs_afdeling_omschrijving
          ,v_bedrijf_key
          ,v_prs_afdeling_parentkey
          ,v_kostenplaats_key
          );

          commit;
          v_count_update := v_count_update + 1;

        END IF;

        EXCEPTION WHEN OTHERS THEN

          v_count_error := v_count_error + 1;
          oracle_err_num := SQLCODE;
          oracle_err_mes := SUBSTR(SQLERRM, 1, 200);
          IF (v_errormsg IS NULL) THEN
            v_errormsg := 'Fout tijdens verwerken van afdeling ['||recAfdeling1.PRS_AFDELING_NAAM||']';
          END IF;
          v_errorhint := v_errorhint||': ' || 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',
                  'Afdeling: verwerkte regels zonder foutmelding: '||to_char(v_count_tot-v_count_error),
                  ''
                 );

    fac.imp_writelog (p_import_key,
                  'S',
                  'Afdeling: verwerkte regels met foutmelding: <b>'||to_char(v_count_error),
                  ''
                 );

  END IF;
  CLOSE cAfdeling1;



END fac_update_organisatie;
/




CREATE OR REPLACE PROCEDURE fac_update_organisatie_del (
   p_import_key IN NUMBER
) IS

BEGIN

  fac.imp_prs_delete_organisatie(p_import_key,1);
  fac_update_organisatie(p_import_key);

END;
/

-- FIP routine voor kostenplaatsen. Indien een niet verwijderde kostenplaats met hetzelfde
-- nummer gevonden kan worden dan zal deze aangepast worden. Anders wordt een nieuwe kostenplaats
-- aangemaakt.
CREATE OR REPLACE PROCEDURE fac_import_kpn (p_import_key IN NUMBER)
AS
   c_fielddelimitor               VARCHAR2 (2) := fac.import_delimiter(p_import_key);
   v_newline                      VARCHAR2 (1000);                                     -- Input line
   v_errormsg                     VARCHAR2 (1000);
   oracle_err_num                 NUMBER;
   oracle_err_mes                 VARCHAR2 (200);
   header_is_valid                NUMBER;
   v_count                        NUMBER;
   v_ongeldig                     NUMBER (1);
   v_mode                         NUMBER (1);
   v_aanduiding                   VARCHAR2 (200);
   v_all_null                     BOOLEAN;
   v_count_error                  NUMBER (10);
   v_count_tot                    NUMBER (10);
   v_count_import                 NUMBER (10);
   -- De importvelden:
   v_kostenplaats_nr              VARCHAR2 (255);
   v_kostenplaats_omschrijving    VARCHAR2 (255);
   v_kostenplaats_module          VARCHAR2 (255);
   v_kostenplaats_begin           VARCHAR2 (255);
   v_kostenplaats_begin_d         DATE;
   v_kostenplaats_eind            VARCHAR2 (255);
   v_kostenplaats_eind_d          DATE;
   v_kostenplaatsgrp_oms          VARCHAR2 (255);
   v_kostenplaatsgrp_key          NUMBER;
   v_perslid                      VARCHAR2 (255);
   v_perslid_key                  NUMBER (10);
   v_kostenplaats_limiet          VARCHAR2 (255);
   v_kostenplaats_limietperiode   VARCHAR2 (255);
   v_kostenplaats_extern          VARCHAR2 (255);
   v_kostenplaats_fiat            VARCHAR2 (255);

   CURSOR c
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   -- Eerst opruiming
   DELETE FROM fac_imp_kpn;

   COMMIT;
   v_count_error := 0;
   header_is_valid := 0;
   v_count_tot := 0;
   v_count_import := 0;

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

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

         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_nr);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_omschrijving);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_module);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_begin);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_eind);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaatsgrp_oms);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_perslid);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_limiet);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_limietperiode);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_extern);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_fiat);

         v_aanduiding := v_kostenplaats_nr || '|' || v_kostenplaats_omschrijving;

         IF v_kostenplaats_nr IS NOT NULL
         THEN
            IF (header_is_valid = 0)
            THEN
               IF UPPER (v_kostenplaats_nr) = 'KOSTENPLAATS'
              AND UPPER (v_perslid) = 'BUDGETHOUDER'
              AND UPPER (v_kostenplaats_fiat) = 'OPDRACHTENFIATTEREN'
               THEN
                  header_is_valid := 1;
               END IF;
            ELSE
               v_count_tot := v_count_tot + 1;
               --fac.imp_writelog (p_import_key, 'I', v_aanduiding, '');
               -- Controleer alle veldwaarde
               v_kostenplaats_nr := TRIM (v_kostenplaats_nr);

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

               --
               v_kostenplaats_omschrijving := TRIM (v_kostenplaats_omschrijving);

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

               --
               v_kostenplaats_module := UPPER (TRIM (v_kostenplaats_module));

               IF v_kostenplaats_module NOT IN ('ALG', 'PRS', 'PRJ')
               THEN
                  v_kostenplaats_module := 'PRS';
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     v_aanduiding || 'Ongelding kostenplaatstype',
                     'Kostenplaatstype wordt aangepast naar [' || v_kostenplaats_module || ']');
               END IF;

               --
               v_kostenplaats_begin := TRIM (v_kostenplaats_begin);
               v_kostenplaats_begin_d := fac.safe_to_date (v_kostenplaats_begin, 'dd-mm-yyyy');

               IF v_kostenplaats_begin IS NOT NULL AND v_kostenplaats_begin_d IS NULL
               THEN
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_aanduiding || 'Kostenplaatsbegin is ongeldig',
                                    'Kostenplaatsbegin wordt leeg gemaakt');
               END IF;

               --
               v_kostenplaats_eind := TRIM (v_kostenplaats_eind);
               v_kostenplaats_eind_d := fac.safe_to_date (v_kostenplaats_eind, 'dd-mm-yyyy');

               IF v_kostenplaats_eind IS NOT NULL AND v_kostenplaats_eind_d IS NULL
               THEN
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_aanduiding || 'Kostenplaatseind is ongeldig',
                                    'Kostenplaatseind wordt leeg gemaakt');
               END IF;

               --
               v_kostenplaatsgrp_oms := TRIM (v_kostenplaatsgrp_oms);

               IF v_kostenplaatsgrp_oms IS NOT NULL
               THEN
                  BEGIN
                     SELECT prs_kostenplaatsgrp_key
                       INTO v_kostenplaatsgrp_key
                       FROM prs_kostenplaatsgrp
                      WHERE UPPER (prs_kostenplaatsgrp_oms) = UPPER (v_kostenplaatsgrp_oms);
                  EXCEPTION
                     WHEN NO_DATA_FOUND
                     THEN
                        v_kostenplaatsgrp_key := NULL;

                        fac.imp_writelog (
                           p_import_key,
                           'E',
                           v_aanduiding || 'Kostenplaatsgroep-aanduiding kan niet gevonden worden',
                           'Kostenplaatsgroep wordt leeg gemaakt [' || v_kostenplaatsgrp_oms || ']');
                  END;
               ELSE
                  v_kostenplaatsgrp_key := NULL;
               END IF;

               --
               v_perslid := TRIM (v_perslid);

               IF v_perslid IS NOT NULL
               THEN
                  BEGIN
                     SELECT prs_perslid_key
                       INTO v_perslid_key
                       FROM prs_perslid
                      WHERE prs_perslid_oslogin = UPPER (v_perslid)
                         OR prs_perslid_oslogin = UPPER (v_perslid);
                  EXCEPTION
                     WHEN NO_DATA_FOUND
                     THEN
                        v_perslid_key := NULL;

                        fac.imp_writelog (
                           p_import_key,
                           'E',
                           v_aanduiding || 'Budgethouder-aanduiding kan niet gevonden worden',
                           'Budgethouder wordt leeg gemaakt [' || v_perslid || ']');
                  END;
               ELSE
                  v_perslid_key := NULL;
               END IF;

               v_kostenplaats_limiet := TRIM (v_kostenplaats_limiet);

               v_kostenplaats_limietperiode := UPPER (TRIM (v_kostenplaats_limietperiode));

               IF v_kostenplaats_limietperiode IS NOT NULL
              AND v_kostenplaats_limietperiode NOT IN ('J', 'M')
               THEN
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     v_aanduiding || 'Budgetperiode-aanduiding kan niet gevonden worden',
                     'Budgetperiode wordt leeg gemaakt [' || v_kostenplaats_limietperiode || ']');
               END IF;

               v_kostenplaats_extern := TRIM (v_kostenplaats_extern);

               IF v_kostenplaats_extern IS NOT NULL AND v_kostenplaats_extern NOT IN ('0', '1')
               THEN
                  v_kostenplaats_extern := NULL;
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     v_aanduiding || 'Kostenplaats extern-aanduiding kan niet gevonden worden',
                     'Kostenplaats_extern-aanduiding wordt leeg gemaakt');
               END IF;

               v_kostenplaats_fiat := TRIM (v_kostenplaats_fiat);

               IF v_kostenplaats_fiat IS NOT NULL AND v_kostenplaats_fiat NOT IN ('0', '1')
               THEN
                  v_kostenplaats_fiat := NULL;
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     v_aanduiding || 'Opdrachtfiatteren-aanduiding kan niet gevonden worden',
                     'Opdrachtfiatteren-aanduiding wordt leeg gemaakt');
               END IF;

               -- Insert geformatteerde import record
               IF v_ongeldig = 0
               THEN
                  v_errormsg :=
                     'Fout bij toevoegen te impoteren kostenplaats [' || v_aanduiding || ']';

                  INSERT INTO fac_imp_kpn (prs_kostenplaats_nr,
                                           prs_kostenplaats_omschrijving,
                                           prs_kostenplaats_module,
                                           prs_kostenplaats_begin,
                                           prs_kostenplaats_eind,
                                           prs_kostenplaatsgrp_key,
                                           prs_perslid_key,
                                           prs_kostenplaats_limiet,
                                           prs_kostenplaats_limietperiode,
                                           prs_kostenplaats_extern,
                                           prs_kostenplaats_fiat)
                      VALUES (v_kostenplaats_nr,
                              v_kostenplaats_omschrijving,
                              v_kostenplaats_module,
                              v_kostenplaats_begin_d,
                              v_kostenplaats_eind_d,
                              v_kostenplaatsgrp_key,
                              v_perslid_key,
                              fac.safe_to_number (v_kostenplaats_limiet),
                              DECODE (v_kostenplaats_limietperiode, 'M', 1, 'J', 2, 0),
                              fac.safe_to_number (v_kostenplaats_extern),
                              fac.safe_to_number (v_kostenplaats_fiat));

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

   IF (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',
                        'Kostenplaats: aantal ingelezen regels: ' || TO_CHAR (v_count_tot),
                        '');
      fac.imp_writelog (
         p_import_key,
         'S',
         'Kostenplaats: 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_errormsg,
                        '');
END fac_import_kpn;
/

CREATE OR REPLACE PROCEDURE fac_update_kpn (p_import_key IN NUMBER)
AS
   CURSOR c
   IS
      SELECT * FROM fac_imp_kpn;

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

   v_kostenplaats_key   prs_kostenplaats.prs_kostenplaats_key%TYPE;
BEGIN
   FOR rec IN c
   LOOP
      BEGIN
         BEGIN
            v_aanduiding := rec.prs_kostenplaats_nr || '|' || rec.prs_kostenplaats_omschrijving;

            v_errorhint := 'Opzoeken kostenplaats';

            SELECT prs_kostenplaats_key
              INTO v_kostenplaats_key
              FROM prs_kostenplaats
             WHERE prs_kostenplaats_verwijder IS NULL
               AND prs_kostenplaats_upper = UPPER (rec.prs_kostenplaats_nr);
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_errorhint := 'Toevoegen kostenplaats';

               INSERT INTO prs_kostenplaats (prs_kostenplaats_nr,
                                             prs_kostenplaats_module,
                                             prs_kostenplaats_omschrijving)
                   VALUES (rec.prs_kostenplaats_nr,
                           rec.prs_kostenplaats_module,
                           rec.prs_kostenplaats_omschrijving)
                RETURNING prs_kostenplaats_key
                     INTO v_kostenplaats_key;
         END;

         -- We hebben nu een kostenplaats record aangemaakt of gevonden.
         -- Dan gaan we deze nu updaten.
         v_errorhint := 'Aanpassen kostenplaats';

         UPDATE prs_kostenplaats k
            SET prs_kostenplaats_omschrijving = rec.prs_kostenplaats_omschrijving,
                prs_kostenplaats_module = rec.prs_kostenplaats_module,
                prs_kostenplaats_begin = rec.prs_kostenplaats_begin,
                prs_kostenplaats_eind = rec.prs_kostenplaats_eind,
                prs_kostenplaatsgrp_key = rec.prs_kostenplaatsgrp_key,
                prs_perslid_key = rec.prs_perslid_key,
                prs_kostenplaats_limiet = rec.prs_kostenplaats_limiet,
                prs_kostenplaats_limietperiode = rec.prs_kostenplaats_limietperiode,
                prs_kostenplaats_extern =
                   COALESCE (rec.prs_kostenplaats_extern, prs_kostenplaats_extern),
                prs_kostenplaats_fiat = COALESCE (rec.prs_kostenplaats_fiat, prs_kostenplaats_fiat)
          WHERE k.prs_kostenplaats_key = v_kostenplaats_key;
      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_errormsg,
                              v_errorhint || ' | ' || v_aanduiding);
      END;
   END LOOP;
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_errormsg,
                        v_errorhint || ' | ' || v_aanduiding);
END fac_update_kpn;
/

CREATE OR REPLACE PROCEDURE fac_import_perslid (p_import_key IN NUMBER
                                               )
AS
    v_seq_of_columns VARCHAR(255);
BEGIN
    v_seq_of_columns := '1;2;3;4;5;6;7;8;9;11;10;0;0;0;0;13;14;15;0;17;16;18;19;12;0;0;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46';
    prs.import_perslid(p_import_key, v_seq_of_columns, 'Locatiecode;Gebouwcode;Bouwlaagvolgnummer;Ruimtenummer;Werkplekvolgnummer;Omschrijving;Afdelingscode;PersoonAchternaam;Tussenvoegsel;Voorletters;Voornaam;Titel/Aanhef;Telefoonnummer;Mobiel;Email;Functie;Personeelsnummer;Loginnaam;Password%');
END;
/


CREATE OR REPLACE PROCEDURE fac_update_perslid (
   p_import_key IN NUMBER
) IS
BEGIN
   prs.update_perslid (p_import_key, 'NR', 'A', 1);
END fac_update_perslid;
/

CREATE OR REPLACE PROCEDURE fac_update_perslid_del (
   p_import_key IN NUMBER
) IS
BEGIN
  fac.imp_prs_delete_organisatie(p_import_key,2);
  fac_update_perslid(p_import_key);
END;
/

CREATE OR REPLACE PROCEDURE fac_import_contactpersoon (p_import_key IN NUMBER)
IS
   c_delim                          VARCHAR2 (2) := fac.import_delimiter(p_import_key);
   v_newline                        fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
   v_errormsg                       VARCHAR2 (1000);
   v_errorhint                      VARCHAR2 (1000);
   oracle_err_num                   NUMBER;
   oracle_err_mes                   VARCHAR2 (200);
   header_is_valid                  NUMBER;
   v_count_tot                      NUMBER (10);
   v_count_import                   NUMBER (10);
   v_ongeldig                       NUMBER (1);
   v_aanduiding                     VARCHAR (400);

   -- De importvelden
   v_prs_bedrijf_naam               VARCHAR2 (255);                      -- C60
   v_prs_leverancier_nr             VARCHAR2 (255);                      -- C50
   v_prs_perslid_matchcode          VARCHAR2 (4000);                      -- N1
   v_prs_perslid_matchwaarde        VARCHAR2 (4000);
   v_prs_contactpersoon_naam        VARCHAR2 (255);                      -- C30
   v_prs_contactpersoon_tussenv     VARCHAR2 (255);                      -- C15
   v_prs_contactpersoon_voorletters VARCHAR2 (255);                      -- C10
   v_prs_contactpersoon_voornaam    VARCHAR2 (255);                      -- C30
   v_prs_contactpersoon_aanhef      VARCHAR2 (255);                      -- C30
   v_prs_contactpersoon_titel       VARCHAR2 (255);                      -- C10
   v_prs_contactpersoon_telefoon_1  VARCHAR2 (255);                      -- C30
   v_prs_contactpersoon_telefoon_2  VARCHAR2 (255);                      -- C30
   v_prs_contactpersoon_email       VARCHAR2 (255);                     -- C200
   v_prs_contactpersoon_functie     VARCHAR2 (255);                      -- C60
   v_prs_contactpersoon_opmerking   VARCHAR2 (255);                     -- C255
   v_alg_locatie_code               VARCHAR2 (255);                      -- C10

   v_matchkolom                     VARCHAR2 (255);
   sql_stmt                         VARCHAR2 (1000);
   l_cursor_1                       INTEGER;
   l_rowsprocessed                  NUMBER DEFAULT 0;
   pcount                          NUMBER;

   v_prs_bedrijf_key                NUMBER;
   v_prs_perslid_key                NUMBER;
   v_alg_locatie_key                NUMBER;
   v_file_index                     NUMBER;

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

BEGIN
   -- Eerst opruiming
   DELETE FROM fac_imp_contactpersoon;

   COMMIT;

   v_count_tot := 0;
   v_count_import := 0;
   header_is_valid := 0;
   v_prs_perslid_matchcode := '';

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_file_index := rec1.fac_imp_file_index;
         v_errorhint := 'Fout bij opvragen importregel';
         v_aanduiding := '';
         v_ongeldig := 0;
         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_naam);
         fac.imp_getfield (v_newline, c_delim, v_prs_leverancier_nr);
         fac.imp_getfield (v_newline, c_delim, v_prs_perslid_matchcode);
         fac.imp_getfield (v_newline, c_delim, v_prs_perslid_matchwaarde);
         fac.imp_getfield (v_newline, c_delim, v_prs_contactpersoon_naam);
         fac.imp_getfield (v_newline, c_delim, v_prs_contactpersoon_tussenv);
         fac.imp_getfield (v_newline, c_delim, v_prs_contactpersoon_voorletters);
         fac.imp_getfield (v_newline, c_delim, v_prs_contactpersoon_voornaam);
         fac.imp_getfield (v_newline, c_delim, v_prs_contactpersoon_aanhef);
         fac.imp_getfield (v_newline, c_delim, v_prs_contactpersoon_titel);
         fac.imp_getfield (v_newline, c_delim, v_prs_contactpersoon_telefoon_1);
         fac.imp_getfield (v_newline, c_delim, v_prs_contactpersoon_telefoon_2);
         fac.imp_getfield (v_newline, c_delim, v_prs_contactpersoon_email);
         fac.imp_getfield (v_newline, c_delim, v_prs_contactpersoon_functie);
         fac.imp_getfield (v_newline, c_delim, v_prs_contactpersoon_opmerking);
         fac.imp_getfield (v_newline, c_delim, v_alg_locatie_code);

         v_aanduiding :=
               '['
            || v_prs_bedrijf_naam
            || '|'
            || v_prs_leverancier_nr
            || '|'
            || v_prs_contactpersoon_naam
            || '|'
            || v_prs_contactpersoon_voornaam
            || '|'
            || v_prs_perslid_matchwaarde
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop.
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF UPPER (v_prs_bedrijf_naam) = 'BEDRIJFSNAAM'
               AND UPPER (v_prs_leverancier_nr) = 'LEVERANCIERNUMMER'
               AND UPPER (v_prs_perslid_matchcode) = 'PERSOONMATCHCODE'
               AND UPPER (v_prs_perslid_matchwaarde) = 'PERSOONMATCHWAARDE'
               AND UPPER (v_prs_contactpersoon_naam) = 'CONTACTPERSOONACHTERNAAM'
               AND UPPER (v_prs_contactpersoon_tussenv) = 'TUSSENVOEGSEL'
               AND UPPER (v_prs_contactpersoon_voorletters) = 'VOORLETTERS'
               AND UPPER (v_prs_contactpersoon_voornaam) = 'VOORNAAM'
               AND UPPER (v_prs_contactpersoon_aanhef) = 'TITEL'
               AND UPPER (v_prs_contactpersoon_titel) = 'AANHEF'
               AND UPPER (v_prs_contactpersoon_telefoon_1) = 'TELEFOONNUMMER'
               AND UPPER (v_prs_contactpersoon_telefoon_2) = 'MOBIEL'
               AND UPPER (v_prs_contactpersoon_email) = 'EMAIL'
               AND UPPER (v_prs_contactpersoon_functie) = 'FUNCTIE'
               AND UPPER (v_prs_contactpersoon_opmerking) = 'OPMERKING'
               AND UPPER (v_alg_locatie_code) = 'LOCATIECODE'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errorhint := 'Bedrijfsnaam ongeldig';
            v_prs_bedrijf_naam := TRIM (v_prs_bedrijf_naam);

            v_errorhint := 'Leveranciersnr ongeldig';
            v_prs_leverancier_nr := TRIM (v_prs_leverancier_nr);

            v_errorhint := 'Fout bij bepalen persoon';
            SELECT MIN (prs_bedrijf_key)
              INTO v_prs_bedrijf_key
              FROM prs_v_aanwezigbedrijf
             WHERE    TRIM(prs_bedrijf_naam_upper) = UPPER (v_prs_bedrijf_naam)
                   OR UPPER(TRIM(prs_leverancier_nr)) = UPPER (v_prs_leverancier_nr);

            IF v_prs_bedrijf_key IS NULL
            THEN
               fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errorhint, 'Kan bedrijf niet 1-duidig bepalen');
               v_ongeldig := 1;
            END IF;

            v_errorhint := 'Fout bij bepalen persoon [' || v_prs_perslid_matchwaarde || ']';
            v_prs_perslid_matchcode := TRIM(v_prs_perslid_matchcode);
            v_prs_perslid_matchwaarde := TRIM(v_prs_perslid_matchwaarde);
            v_prs_perslid_key := NULL;
            IF v_prs_perslid_matchcode IS NOT NULL AND v_prs_perslid_matchwaarde IS NOT NULL
            THEN

               v_matchkolom := '';
               CASE v_prs_perslid_matchcode
                  WHEN '1'
                  THEN
                     v_matchkolom := 'PRS_PERSLID_EMAIL';
                  WHEN '2'
                  THEN
                     v_matchkolom := 'PRS_PERSLID_OSLOGIN';
                  WHEN '3'
                  THEN
                     v_matchkolom := 'PRS_PERSLID_KEY';
                  WHEN '4'
                  THEN
                     v_matchkolom := 'PRS_PERSLID_NR';
                  WHEN '5'
                  THEN
                     v_matchkolom := 'PRS_PERSLID_VOORNAAM || '' '' || PRS_PERSLID_NAAM';
                  ELSE
                     -- voor developers only: indien geen code wordt gebruikt,
                     -- kan als persoonmatchcode een kolom uit de perslid-tabel
                     -- worden ingevoerd, bijvoorbeeld: prs_perslid_oslogin2
                     v_matchkolom := v_prs_perslid_matchcode;
               END CASE;

               sql_stmt :=
                      'SELECT MIN (prs_perslid_key), COUNT (prs_perslid_key) '
                   || '  FROM prs_v_aanwezigperslid '
                   || ' WHERE UPPER ('
                   || v_matchkolom
                   || ') = UPPER (:pwaarde) ';
               --dbms_output.put_line(v_prs_perslid_matchwaarde);
               l_cursor_1 := DBMS_SQL.open_cursor;
               DBMS_SQL.parse (l_cursor_1, sql_stmt, DBMS_SQL.native);
               DBMS_SQL.BIND_VARIABLE(l_cursor_1,':pwaarde', v_prs_perslid_matchwaarde);
               DBMS_SQL.define_column(l_cursor_1, 1, v_prs_perslid_key);
               DBMS_SQL.define_column(l_cursor_1, 2, pcount);
               l_rowsprocessed := DBMS_SQL.execute_and_fetch (l_cursor_1);
               -- Bij no rows gaat-ie naar de exception. Moet daar dan nog een cursor dicht??
               DBMS_SQL.column_value (l_cursor_1, 1, v_prs_perslid_key);
               DBMS_SQL.column_value (l_cursor_1, 2, pcount);
               DBMS_SQL.close_cursor(l_cursor_1);
               --dbms_output.put_line(pcount);

               IF pcount != 1
               THEN
                  fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errorhint, 'Kan persoon niet 1-duidig bepalen');
                  v_ongeldig := 1;
               ELSE
                  SELECT prs_perslid_naam,
                         prs_perslid_tussenvoegsel,
                         prs_perslid_voorletters,
                         prs_perslid_voornaam,
                         prs_perslid_telefoonnr,
                         prs_perslid_mobiel,
                         prs_perslid_email
                    INTO v_prs_contactpersoon_naam,
                         v_prs_contactpersoon_tussenv,
                         v_prs_contactpersoon_voorletters,
                         v_prs_contactpersoon_voornaam,
                         v_prs_contactpersoon_telefoon_1,
                         v_prs_contactpersoon_telefoon_2,
                         v_prs_contactpersoon_email
                    FROM prs_perslid
                   WHERE prs_perslid_key = v_prs_perslid_key;
               END IF;
            END IF;

            v_errorhint := 'Contactpersoon naam ongeldig';
            v_prs_contactpersoon_naam := TRIM (v_prs_contactpersoon_naam);
            IF v_prs_perslid_key IS NULL
            THEN
               IF v_prs_contactpersoon_naam IS NULL
               THEN
                  fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errorhint, 'Regel wordt overgeslagen');
                  v_ongeldig := 1;
               ELSE
                  IF LENGTH (v_prs_contactpersoon_naam) > 30
                  THEN
                     v_prs_contactpersoon_naam := SUBSTR(v_prs_contactpersoon_naam, 1,30);
                     fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errorhint, 'Contactpersoon naam wordt afgebroken tot: ' || v_prs_contactpersoon_naam);
                  END IF;
               END IF;
            END IF;

            v_errorhint := 'Contactpersoon tussenvoegsels ongeldig';
            v_prs_contactpersoon_tussenv := TRIM (v_prs_contactpersoon_tussenv);
            IF LENGTH (v_prs_contactpersoon_tussenv) > 30
            THEN
               v_prs_contactpersoon_tussenv := SUBSTR(v_prs_contactpersoon_tussenv, 1,30);
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errorhint, 'Contactpersoon tussenvoegsels wordt afgebroken tot: ' || v_prs_contactpersoon_tussenv);
            END IF;

            v_errorhint := 'Contactpersoon voorletters ongeldig';
            v_prs_contactpersoon_voorletters := TRIM (v_prs_contactpersoon_voorletters);
            IF LENGTH (v_prs_contactpersoon_voorletters) > 10
            THEN
               v_prs_contactpersoon_voorletters := SUBSTR(v_prs_contactpersoon_voorletters, 1,10);
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errorhint, 'Contactpersoon voorletters wordt afgebroken tot: ' || v_prs_contactpersoon_voorletters);
            END IF;

            v_errorhint := 'Contactpersoon voornaam ongeldig';
            v_prs_contactpersoon_voornaam := TRIM (v_prs_contactpersoon_voornaam);
            IF LENGTH (v_prs_contactpersoon_voornaam) > 30
            THEN
               v_prs_contactpersoon_voornaam := SUBSTR(v_prs_contactpersoon_voornaam, 1,30);
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errorhint, 'Contactpersoon voornaam wordt afgebroken tot: ' || v_prs_contactpersoon_voornaam);
            END IF;

            v_errorhint := 'Contactpersoon aanhef ongeldig';
            v_prs_contactpersoon_aanhef := TRIM (v_prs_contactpersoon_aanhef);
            IF LENGTH (v_prs_contactpersoon_aanhef) > 30
            THEN
               v_prs_contactpersoon_aanhef := SUBSTR(v_prs_contactpersoon_aanhef, 1,30);
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errorhint, 'Contactpersoon aanhef wordt afgebroken tot: ' || v_prs_contactpersoon_aanhef);
            END IF;

            v_errorhint := 'Contactpersoon titel ongeldig';
            v_prs_contactpersoon_titel := TRIM (v_prs_contactpersoon_titel);
            IF LENGTH (v_prs_contactpersoon_titel) > 10
            THEN
               v_prs_contactpersoon_titel := SUBSTR(v_prs_contactpersoon_titel, 1,10);
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errorhint, 'Contactpersoon titel wordt afgebroken tot: ' || v_prs_contactpersoon_titel);
            END IF;

            v_errorhint := 'Contactpersoon telefoonnr ongeldig';
            v_prs_contactpersoon_telefoon_1 := TRIM (v_prs_contactpersoon_telefoon_1);
            IF LENGTH (v_prs_contactpersoon_telefoon_1) > 30
            THEN
               v_prs_contactpersoon_telefoon_1 := SUBSTR(v_prs_contactpersoon_telefoon_1, 1,30);
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errorhint, 'Contactpersoon telefoonnr wordt afgebroken tot: ' || v_prs_contactpersoon_telefoon_1);
            END IF;

            v_errorhint := 'Contactpersoon mobiel ongeldig';
            v_prs_contactpersoon_telefoon_2 := TRIM (v_prs_contactpersoon_telefoon_2);
            IF LENGTH (v_prs_contactpersoon_telefoon_2) > 30
            THEN
               v_prs_contactpersoon_telefoon_2 := SUBSTR(v_prs_contactpersoon_telefoon_2, 1,30);
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errorhint, 'Contactpersoon mobiel wordt afgebroken tot: ' || v_prs_contactpersoon_telefoon_2);
            END IF;

            v_errorhint := 'Contactpersoon email ongeldig';
            v_prs_contactpersoon_email := TRIM (v_prs_contactpersoon_email);
            IF LENGTH (v_prs_contactpersoon_email) > 200
            THEN
               v_prs_contactpersoon_email := SUBSTR(v_prs_contactpersoon_email, 1,200);
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errorhint, 'Contactpersoon email wordt afgebroken tot: ' || v_prs_contactpersoon_email);
            END IF;

            v_errorhint := 'Contactpersoon functie ongeldig';
            v_prs_contactpersoon_functie := TRIM (v_prs_contactpersoon_functie);
            IF LENGTH (v_prs_contactpersoon_functie) > 30
            THEN
               v_prs_contactpersoon_functie := SUBSTR(v_prs_contactpersoon_functie, 1,30);
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errorhint, 'Contactpersoon functie wordt afgebroken tot: ' || v_prs_contactpersoon_functie);
            END IF;

            v_errorhint := 'Contactpersoon opmerking ongeldig';
            v_prs_contactpersoon_opmerking := TRIM (v_prs_contactpersoon_opmerking);
            IF LENGTH (v_prs_contactpersoon_opmerking) > 30
            THEN
               v_prs_contactpersoon_opmerking := SUBSTR(v_prs_contactpersoon_opmerking, 1,30);
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errorhint, 'Contactpersoon opmerking wordt afgebroken tot: ' || v_prs_contactpersoon_opmerking);
            END IF;

            v_errorhint := 'Locatiecode ongeldig';
            v_alg_locatie_code := TRIM (v_alg_locatie_code);

            v_alg_locatie_key := NULL;

            v_errorhint := 'Fout bij bepalen locatie';
            IF v_alg_locatie_code IS NOT NULL
            THEN
               SELECT MIN(alg_locatie_key)
                 INTO v_alg_locatie_key
                 FROM alg_v_aanweziglocatie l
                WHERE UPPER(alg_locatie_code) = UPPER(v_alg_locatie_code);

               IF v_alg_locatie_key IS NULL
               THEN
                  fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errorhint, 'Regel wordt overgeslagen');
                  v_ongeldig := 1;
               END IF;
            END IF;

            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               BEGIN
                  v_errorhint := 'Fout bij wegschrijven importregel';
                  INSERT INTO fac_imp_contactpersoon (prs_contactpersoon_naam,
                                                      prs_contactpersoon_tussenv,
                                                      prs_contactpersoon_voorletters,
                                                      prs_contactpersoon_voornaam,
                                                      prs_contactpersoon_aanhef,
                                                      prs_contactpersoon_titel,
                                                      prs_contactpersoon_telefoon_1,
                                                      prs_contactpersoon_telefoon_2,
                                                      prs_contactpersoon_email,
                                                      prs_contactpersoon_functie,
                                                      prs_contactpersoon_opmerking,
                                                      prs_bedrijf_key,
                                                      prs_perslid_key,
                                                      alg_locatie_key,
                                                      fac_import_key
                                                     )
                    VALUES  ( v_prs_contactpersoon_naam,
                              v_prs_contactpersoon_tussenv,
                              v_prs_contactpersoon_voorletters,
                              v_prs_contactpersoon_voornaam,
                              v_prs_contactpersoon_aanhef,
                              v_prs_contactpersoon_titel,
                              v_prs_contactpersoon_telefoon_1,
                              v_prs_contactpersoon_telefoon_2,
                              v_prs_contactpersoon_email,
                              v_prs_contactpersoon_functie,
                              v_prs_contactpersoon_opmerking,
                              v_prs_bedrijf_key,
                              v_prs_perslid_key,
                              v_alg_locatie_key,
                              p_import_key
                             );

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

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

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=
            v_errormsg
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Inleesproces contactpersonen afgebroken! regel:' || v_file_index);
END fac_import_contactpersoon;
/

CREATE OR REPLACE PROCEDURE fac_update_contactpersoon (
   p_import_key IN NUMBER
)
IS

   CURSOR c
   IS
   SELECT DISTINCT prs_contactpersoon_naam,
                   prs_contactpersoon_tussenv,
                   prs_contactpersoon_voorletters,
                   prs_contactpersoon_voornaam,
                   prs_contactpersoon_aanhef,
                   prs_contactpersoon_titel,
                   prs_contactpersoon_telefoon_1,
                   prs_contactpersoon_telefoon_2,
                   prs_contactpersoon_email,
                   prs_contactpersoon_functie,
                   prs_contactpersoon_opmerking,
                   prs_bedrijf_key,
                   prs_perslid_key,
                   fac_import_key
     FROM fac_imp_contactpersoon
    WHERE fac_import_key = p_import_key;

   CURSOR c_loc
   IS
   SELECT prs_contactpersoon_naam,
          prs_contactpersoon_tussenv,
          prs_contactpersoon_voorletters,
          prs_contactpersoon_voornaam,
          prs_perslid_key,
          prs_bedrijf_key,
          alg_locatie_key
     FROM fac_imp_contactpersoon
    WHERE fac_import_key = p_import_key
          AND alg_locatie_key IS NOT NULL;

   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_tot        NUMBER (10);

   v_prs_contactpersoon_key  NUMBER;

BEGIN
   FOR rec in c
   LOOP
      BEGIN
         v_aanduiding := rec.prs_contactpersoon_naam || ' - ' || rec.prs_contactpersoon_tussenv || ' - ' || rec.prs_contactpersoon_voornaam || ' - ' || rec.prs_perslid_key;
         v_errorhint := 'Fout bij wegschrijven contactpersoon';
         INSERT INTO prs_contactpersoon (prs_contactpersoon_naam,
                                         prs_contactpersoon_tussenv,
                                         prs_contactpersoon_voorletters,
                                         prs_contactpersoon_voornaam,
                                         prs_contactpersoon_aanhef,
                                         prs_contactpersoon_titel,
                                         prs_contactpersoon_telefoon_1,
                                         prs_contactpersoon_telefoon_2,
                                         prs_contactpersoon_email,
                                         prs_contactpersoon_functie,
                                         prs_contactpersoon_opmerking,
                                         prs_perslid_key,
                                         prs_bedrijf_key)
              VALUES (rec.prs_contactpersoon_naam,
                      rec.prs_contactpersoon_tussenv,
                      rec.prs_contactpersoon_voorletters,
                      rec.prs_contactpersoon_voornaam,
                      rec.prs_contactpersoon_aanhef,
                      rec.prs_contactpersoon_titel,
                      rec.prs_contactpersoon_telefoon_1,
                      rec.prs_contactpersoon_telefoon_2,
                      rec.prs_contactpersoon_email,
                      rec.prs_contactpersoon_functie,
                      rec.prs_contactpersoon_opmerking,
                      rec.prs_perslid_key,
                      rec.prs_bedrijf_key);

      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
            v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              v_errorhint
                             );
      END;
   END LOOP;

   FOR rec1 IN c_loc
   LOOP
      BEGIN
         v_aanduiding := rec1.prs_contactpersoon_naam || ' - ' || rec1.prs_contactpersoon_tussenv || ' - ' || rec1.prs_contactpersoon_voornaam || ' - ' || rec1.prs_perslid_key  || ' - ' || rec1.alg_locatie_key;
         v_errorhint := 'Fout bij opzoeken contactpersoon';
         v_prs_contactpersoon_key := NULL;
         -- zoek de contactpersoon
         SELECT prs_contactpersoon_key
           INTO v_prs_contactpersoon_key
           FROM prs_contactpersoon c
          WHERE     c.prs_bedrijf_key = rec1.prs_bedrijf_key
                AND (     c.prs_perslid_key = rec1.prs_perslid_key
                       OR (    c.prs_contactpersoon_naam = rec1.prs_contactpersoon_naam
                           AND c.prs_contactpersoon_tussenv = rec1.prs_contactpersoon_tussenv
                           AND c.prs_contactpersoon_voorletters = rec1.prs_contactpersoon_voorletters
                           AND c.prs_contactpersoon_voornaam = rec1.prs_contactpersoon_voornaam
                          )
                    );

         v_errorhint := 'Fout bij toevoegen locatie';
         INSERT INTO prs_contactpersoon_locatie (prs_contactpersoon_key, alg_locatie_key)
               VALUES (v_prs_contactpersoon_key, rec1.alg_locatie_key);

      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
            v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              v_errorhint
                             );
      END;
   END LOOP;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
      v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Importproces meldingen afgebroken!'
                       );
END fac_update_contactpersoon;
/

--//////////////////////////////////////////////////MLD IMPORT STUFF///////////////////////////////////////////
CREATE OR REPLACE PROCEDURE fac_import_mld (
   p_import_key IN NUMBER
)
AS
   c_fielddelimitor             VARCHAR2 (2) := fac.import_delimiter(p_import_key);
   v_newline                    VARCHAR2(2000);                                                            -- Input line
   v_errormsg                   VARCHAR2(1000);
   oracle_err_num               NUMBER;
   oracle_err_mes               VARCHAR2(200);
   header_is_valid              NUMBER;
   v_count_tot                  NUMBER(10);
   v_count_import               NUMBER(10);
   v_ongeldig                   NUMBER(1);
   v_aanduiding                 VARCHAR2(1000);
   -- De importvelden:
   v_srtdiscipline_omschrijving VARCHAR2(255);                                                                    -- C30
   v_srtdiscipline_prefix       VARCHAR2(255);                                                                     -- C3
   v_srtdiscipline_alg          VARCHAR2(255);                                                                     -- N1
   v_srtdiscipline_ins          VARCHAR2(255);                                                                     -- N1
   v_srtdiscipline_bes          VARCHAR2(255);                                                                     -- N1
   v_discipline_omschrijving    VARCHAR2(255);                                                                    -- C60
   v_stdmelding_omschrijving    VARCHAR2(255);                                                                    -- C30
   v_stdmelding_groep           VARCHAR2(255);                                                                    -- C30
   v_stdmelding_kostensoort     VARCHAR2(255);                                                                    -- C60
   v_stdmelding_urgentie        VARCHAR2(255);                                                                   -- N4,2
   v_stdmelding_uitvoertijd     VARCHAR2(255);                                                                     -- N3
   v_stdmelding_uitvoertijd1    VARCHAR2(255);                                                                     -- N3
   v_stdmelding_uitvoertijd2    VARCHAR2(255);                                                                     -- N3
   v_stdmelding_uitvoertijd4    VARCHAR2(255);                                                                     -- N3
   v_discipline_directklaar     VARCHAR2(255);                                                                     -- N1
   v_dienst                     VARCHAR2(255);
   v_stdmelding_notfrontend     VARCHAR2(255);                                                                     -- N1
   v_onrgoed_niveau             VARCHAR2(255);                                                                     -- C1
   v_typeopdr_omschrijving      VARCHAR2(255);                                                                    -- C30
   v_stdmelding_hint            VARCHAR2(1000);                                                                 -- C1000
   v_stdmelding_kopieerbaar     VARCHAR2(255);                                                                     -- N1
   v_stdmelding_afmeldtext      VARCHAR2(255);                                                                     -- N1
   v_stdmelding_doublecheck     VARCHAR2(255);                                                                     -- N4
   v_stdmelding_slabewaken      VARCHAR2(255);                                                                     -- N1
   v_discipline_image           VARCHAR2(255);                                                                   -- C255
   v_stdmelding_image           VARCHAR2(255);                                                                   -- C255
   -- Overige velden (alleen gebruikt voor numeriek-validatie)
   v_stdmelding_urgentie_n      mld_stdmelding.mld_stdmelding_t_accepttijd.tijdsduur%TYPE;
   v_stdmelding_uitvoertijd_n   mld_stdmelding.mld_stdmelding_t_uitvoertijd.tijdsduur%TYPE;
   v_stdmelding_uitvoertijd1_n  mld_stdmelding.mld_stdmelding_t_uitvtijd_pr1.tijdsduur%TYPE;
   v_stdmelding_uitvoertijd2_n  mld_stdmelding.mld_stdmelding_t_uitvtijd_pr2.tijdsduur%TYPE;
   v_stdmelding_uitvoertijd4_n  mld_stdmelding.mld_stdmelding_t_uitvtijd_pr4.tijdsduur%TYPE;
   v_typeopdr_key               mld_stdmelding.mld_typeopdr_key%TYPE;
   --
   CURSOR c1
   IS
        SELECT   *
          FROM   fac_imp_file
         WHERE   fac_import_key = p_import_key
      ORDER BY   fac_imp_file_index;
BEGIN
   -- Eerst opruiming
   DELETE FROM   fac_imp_mld;
   v_count_tot := 0;
   v_count_import := 0;
   header_is_valid := 0;
   COMMIT;
   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout opvragen te importeren rij';
         v_aanduiding := '';
         v_ongeldig := 0;
         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_fielddelimitor, v_srtdiscipline_omschrijving);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_srtdiscipline_prefix);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_srtdiscipline_alg);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_srtdiscipline_ins);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_srtdiscipline_bes);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_discipline_omschrijving);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_stdmelding_omschrijving);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_stdmelding_groep);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_stdmelding_kostensoort);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_stdmelding_urgentie);                        -- acceptatietijd
         fac.imp_getfield (v_newline, c_fielddelimitor, v_stdmelding_uitvoertijd);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_stdmelding_uitvoertijd1);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_stdmelding_uitvoertijd2);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_stdmelding_uitvoertijd4);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_discipline_directklaar);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_dienst);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_stdmelding_notfrontend);                                 -- N1
         fac.imp_getfield (v_newline, c_fielddelimitor, v_onrgoed_niveau);                                         -- C1
         fac.imp_getfield (v_newline, c_fielddelimitor, v_typeopdr_omschrijving);                                  -- C30
         fac.imp_getfield (v_newline, c_fielddelimitor, v_stdmelding_hint);                                        -- C1000
         fac.imp_getfield (v_newline, c_fielddelimitor, v_stdmelding_kopieerbaar);                                 -- N1
         fac.imp_getfield (v_newline, c_fielddelimitor, v_stdmelding_afmeldtext);                                  -- N1
         fac.imp_getfield (v_newline, c_fielddelimitor, v_stdmelding_doublecheck);                                 -- N4
         fac.imp_getfield (v_newline, c_fielddelimitor, v_stdmelding_slabewaken);                                  -- N1
         fac.imp_getfield (v_newline, c_fielddelimitor, v_discipline_image);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_stdmelding_image);
         --
         -- Spaties ervoor en erachter verwijderen.
         v_srtdiscipline_omschrijving := TRIM(v_srtdiscipline_omschrijving);
         v_srtdiscipline_prefix       := TRIM(v_srtdiscipline_prefix);
         v_srtdiscipline_alg          := TRIM(v_srtdiscipline_alg);
         v_srtdiscipline_ins          := TRIM(v_srtdiscipline_ins);
         v_srtdiscipline_bes          := TRIM(v_srtdiscipline_bes);
         v_discipline_omschrijving    := TRIM(v_discipline_omschrijving);
         v_stdmelding_omschrijving    := TRIM(v_stdmelding_omschrijving);
         v_stdmelding_groep           := TRIM(v_stdmelding_groep);
         v_stdmelding_kostensoort     := TRIM(v_stdmelding_kostensoort);
         v_stdmelding_urgentie        := TRIM(v_stdmelding_urgentie);
         v_stdmelding_uitvoertijd     := TRIM(v_stdmelding_uitvoertijd);
         v_stdmelding_uitvoertijd1    := TRIM(v_stdmelding_uitvoertijd1);
         v_stdmelding_uitvoertijd2    := TRIM(v_stdmelding_uitvoertijd2);
         v_stdmelding_uitvoertijd4    := TRIM(v_stdmelding_uitvoertijd4);
         v_discipline_directklaar     := TRIM(v_discipline_directklaar);
         v_dienst                     := TRIM(v_dienst);
         v_stdmelding_notfrontend     := TRIM(v_stdmelding_notfrontend);
         v_onrgoed_niveau             := TRIM(v_onrgoed_niveau);
         v_typeopdr_omschrijving      := TRIM(v_typeopdr_omschrijving);
         v_stdmelding_hint            := TRIM(v_stdmelding_hint);
         v_stdmelding_kopieerbaar     := TRIM(v_stdmelding_kopieerbaar);
         v_stdmelding_afmeldtext      := TRIM(v_stdmelding_afmeldtext);
         v_stdmelding_doublecheck     := TRIM(v_stdmelding_doublecheck);
         v_stdmelding_slabewaken      := TRIM(v_stdmelding_slabewaken);
         v_discipline_image           := TRIM(v_discipline_image);
         v_stdmelding_image           := TRIM(v_stdmelding_image);
         --
         v_aanduiding :=
               '|'
            || v_srtdiscipline_omschrijving
            || '|'
            || v_srtdiscipline_prefix
            || '|'
            || v_srtdiscipline_alg
            || '|'
            || v_srtdiscipline_ins
            || '|'
            || v_srtdiscipline_bes
            || '|'
            || v_discipline_omschrijving
            || '|'
            || v_stdmelding_omschrijving
            || '|'
            || v_stdmelding_groep
            || '|'
            || v_stdmelding_kostensoort
            || '|'
            || v_stdmelding_urgentie
            || '|'
            || v_stdmelding_uitvoertijd
            || '|'
            || v_stdmelding_uitvoertijd1
            || '|'
            || v_stdmelding_uitvoertijd2
            || '|'
            || v_stdmelding_uitvoertijd4
            || '|'
            || v_discipline_directklaar
            || '|'
            || v_dienst
            || '|'
            || v_stdmelding_notfrontend
            || '|'
            || v_onrgoed_niveau
            || '|'
            || v_typeopdr_omschrijving
            || '|'
            || v_stdmelding_hint
            || '|'
            || v_stdmelding_kopieerbaar
            || '|'
            || v_stdmelding_afmeldtext
            || '|'
            || v_stdmelding_doublecheck
            || '|'
            || v_stdmelding_slabewaken
            || '|'
            || v_discipline_image
            || '|'
            || v_stdmelding_image;
         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer alleen de verplichte kolommen, ik zou ze ook
         -- allemaal kunnen doen..
         -- Ik negeer alles totdat ik een geldige header gepasseerd ben
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_srtdiscipline_omschrijving) = 'VAKGROEPTYPE'
               AND UPPER (v_discipline_omschrijving)    = 'VAKGROEP'
               AND UPPER (v_stdmelding_omschrijving)    = 'STANDAARDMELDING'
               AND UPPER (v_stdmelding_uitvoertijd4)    = 'UITVOERTIJD LAAG'
               AND UPPER (v_stdmelding_slabewaken)      = 'SLA BEWAKEN'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarde
            IF LENGTH (v_srtdiscipline_omschrijving) > 30
            THEN
               v_srtdiscipline_omschrijving := SUBSTR (TRIM (v_srtdiscipline_omschrijving), 1, 30);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                 'Vakgroeptype wordt afgebroken tot [' || v_srtdiscipline_omschrijving || ']'
                                );
            END IF;
            --
            IF LENGTH (v_srtdiscipline_prefix) > 3
            THEN
               v_srtdiscipline_prefix := SUBSTR (v_srtdiscipline_prefix, 1, 3);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                 'Prefix wordt afgebroken tot [' || v_srtdiscipline_prefix || ']'
                                );
            END IF;
            --
            SELECT   DECODE (fac.safe_to_number (v_srtdiscipline_alg), 1, '1', '0') INTO v_srtdiscipline_alg FROM DUAL;
            --
            SELECT   DECODE (fac.safe_to_number (v_srtdiscipline_ins), 1, '1', '0') INTO v_srtdiscipline_ins FROM DUAL;
            --
            SELECT   DECODE (fac.safe_to_number (v_srtdiscipline_bes), 1, '1', '0') INTO v_srtdiscipline_bes FROM DUAL;
            --
            v_discipline_omschrijving := TRIM (v_discipline_omschrijving);
            IF LENGTH (v_discipline_omschrijving) > 60
            THEN
               v_discipline_omschrijving := SUBSTR (v_discipline_omschrijving, 1, 60);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                 'Vakgroep wordt afgebroken tot [' || v_discipline_omschrijving || ']'
                                );
            END IF;
            --
            IF LENGTH (v_stdmelding_omschrijving) > 60
            THEN
               v_stdmelding_omschrijving := SUBSTR (v_stdmelding_omschrijving, 1, 60);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                 'Standaardmelding wordt afgebroken tot [' || v_stdmelding_omschrijving || ']'
                                );
            END IF;
            --
            IF LENGTH (v_stdmelding_kostensoort) > 60
            THEN
               v_stdmelding_kostensoort := SUBSTR (v_stdmelding_kostensoort, 1, 60);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                 'Melding herkenningstekst wordt afgebroken tot [' || v_stdmelding_kostensoort || ']'
                                );
            END IF;
            --
            BEGIN
               v_stdmelding_urgentie_n := fac.safe_to_number (v_stdmelding_urgentie);
            EXCEPTION
               WHEN OTHERS
               THEN
                  oracle_err_num := SQLCODE;
                  oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                  v_errormsg := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                  fac.imp_writelog (
                     p_import_key,
                     'W',
                     v_aanduiding,
                        'Importregel kan niet worden ingelezen. Ongeldige acceptatietijd ['
                     || v_stdmelding_urgentie
                     || ']'
                  );
            END;
            --
            BEGIN
               v_stdmelding_uitvoertijd_n  := fac.safe_to_number (v_stdmelding_uitvoertijd);
               v_stdmelding_uitvoertijd1_n := fac.safe_to_number (v_stdmelding_uitvoertijd1);
               v_stdmelding_uitvoertijd2_n := fac.safe_to_number (v_stdmelding_uitvoertijd2);
               v_stdmelding_uitvoertijd4_n := fac.safe_to_number (v_stdmelding_uitvoertijd4);
            EXCEPTION
               WHEN OTHERS
               THEN
                  oracle_err_num := SQLCODE;
                  oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                  v_errormsg := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                  fac.imp_writelog (
                     p_import_key,
                     'W',
                     v_aanduiding,
                        'Importregel kan niet worden ingelezen. Ongeldige uitvoertijd(en) ['
                     || v_stdmelding_uitvoertijd
                     || '/'
                     || v_stdmelding_uitvoertijd1
                     || '/'
                     || v_stdmelding_uitvoertijd2
                     || '/'
                     || v_stdmelding_uitvoertijd4
                     || ']'
                  );
            END;
            --
            SELECT   DECODE (fac.safe_to_number (v_discipline_directklaar), 1, '1', '0')
              INTO   v_discipline_directklaar
              FROM   DUAL;
            --
            v_dienst := SUBSTR (v_dienst, 1, 60);
            --
            SELECT   DECODE (fac.safe_to_number (v_stdmelding_notfrontend), 1, '1', '0') INTO v_stdmelding_notfrontend FROM DUAL;
            --
            IF v_onrgoed_niveau IS NULL THEN
               v_onrgoed_niveau := 'L';
            END IF;
            IF v_onrgoed_niveau NOT IN ('L', 'G', 'V', 'R') THEN
               v_onrgoed_niveau := 'L';
               fac.imp_writelog (
                   p_import_key,
                   'W',
                    v_aanduiding,
                    'Importregel kan niet worden ingelezen. Ongeldig onrgoedniveau  [' || v_onrgoed_niveau || ']'
                  );
            END IF;
            IF v_typeopdr_omschrijving IS NOT NULL
            THEN
               BEGIN
                  SELECT mld_typeopdr_key
                    INTO v_typeopdr_key
                    FROM mld_typeopdr
                   WHERE mld_typeopdr_upper = UPPER(v_typeopdr_omschrijving);
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                     fac.imp_writelog (
                        p_import_key,
                        'W',
                        v_aanduiding,
                           'Importregel kan niet worden ingelezen. Ongeldige opdrachttype ['
                        || v_typeopdr_omschrijving
                        || ']'
                     );
               END;
            END IF;
            --
            IF LENGTH (v_stdmelding_hint) > 1000
            THEN
               v_stdmelding_hint := SUBSTR (v_stdmelding_hint, 1, 1000);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                 'Standaardmelding hint wordt afgebroken op 1000 tekens'
                                );
            END IF;
            --
            SELECT   DECODE (fac.safe_to_number (v_stdmelding_kopieerbaar), 1, '1', '0') INTO v_stdmelding_kopieerbaar FROM DUAL;
            --
            SELECT   DECODE (fac.safe_to_number (v_stdmelding_afmeldtext),  1, '2', '1') INTO v_stdmelding_afmeldtext FROM DUAL; -- waarden: [1,2]
            --
            SELECT   DECODE (fac.safe_to_number (v_stdmelding_slabewaken),  1, '1', '0') INTO v_stdmelding_slabewaken FROM DUAL;
            --
            IF UPPER(v_stdmelding_doublecheck) NOT IN ('N', 'I', 'A', 'B') THEN
               fac.imp_writelog (
                   p_import_key,
                   'W',
                    v_aanduiding,
                    'Importregel kan niet worden ingelezen. Ongeldig doublecheck waarde  [' || v_stdmelding_doublecheck || ']'
                  );
            ELSE
               SELECT DECODE (UPPER(v_stdmelding_doublecheck), 'I', '1', 'A', '2', 'B', '3', '0') INTO v_stdmelding_doublecheck FROM DUAL; -- waarden: [0,1,2,3]
            END IF;
            --
            IF LENGTH (v_discipline_image) > 255
            THEN
               v_discipline_image := SUBSTR (v_discipline_image, 1, 255);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                 'Discipline image wordt afgebroken tot [' || v_discipline_image || ']'
                                );
            END IF;
            --
            IF LENGTH (v_stdmelding_image) > 255
            THEN
               v_stdmelding_image := SUBSTR (v_stdmelding_image, 1, 255);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                 'Standaardmelding image wordt afgebroken tot [' || v_stdmelding_image || ']'
                                );
            END IF;
            --
            -- Insert geformatteerde import record
            -- We hebben hier vooralsnog de oude uitvoertijden, zonder type
            IF v_ongeldig = 0
            THEN
               BEGIN
                  INSERT INTO fac_imp_mld (
                                              ins_srtdiscipline_omschrijving,
                                              ins_srtdiscipline_prefix,
                                              ins_srtdiscipline_alg,
                                              ins_srtdiscipline_ins,
                                              ins_srtdiscipline_bes,
                                              ins_discipline_omschrijving,
                                              mld_stdmelding_omschrijving,
                                              mld_stdmelding_groep,
                                              mld_stdmelding_kostensoort,
                                              mld_stdmelding_urgentie,          /* BEWUST */
                                              mld_stdmelding_uitvoertijd,       /* BEWUST */
                                              mld_stdmelding_uitvoertijd1,      /* BEWUST */
                                              mld_stdmelding_uitvoertijd2,      /* BEWUST */
                                              mld_stdmelding_uitvoertijd4,      /* BEWUST */
                                              mld_discipline_directklaar,
                                              prs_dienst,
                                              mld_stdmelding_notfrontend,
                                              alg_onrgoed_niveau,
                                              mld_typeopdr_omschrijving,
                                              mld_stdmelding_hint,
                                              mld_stdmelding_afmeldtext,
                                              mld_stdmelding_kopieerbaar,
                                              mld_stdmelding_slabewaken,
                                              mld_stdmelding_doublecheck,
                                              ins_discipline_image,
                                              mld_stdmelding_image
                             )
                    VALUES   (
                                 v_srtdiscipline_omschrijving,
                                 v_srtdiscipline_prefix,
                                 v_srtdiscipline_alg,
                                 v_srtdiscipline_ins,
                                 v_srtdiscipline_bes,
                                 v_discipline_omschrijving,
                                 v_stdmelding_omschrijving,
                                 v_stdmelding_groep,
                                 v_stdmelding_kostensoort,
                                 v_stdmelding_urgentie,          /* BEWUST */
                                 v_stdmelding_uitvoertijd,       /* BEWUST */
                                 v_stdmelding_uitvoertijd1,      /* BEWUST */
                                 v_stdmelding_uitvoertijd2,      /* BEWUST */
                                 v_stdmelding_uitvoertijd4,      /* BEWUST */
                                 v_discipline_directklaar,
                                 v_dienst,
                                 v_stdmelding_notfrontend,
                                 v_onrgoed_niveau,
                                 v_typeopdr_omschrijving,
                                 v_stdmelding_hint,
                                 v_stdmelding_afmeldtext,
                                 v_stdmelding_kopieerbaar,
                                 v_stdmelding_slabewaken,
                                 v_stdmelding_doublecheck,
                                 v_discipline_image,
                                 v_stdmelding_image
                             );
                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg := ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                     fac.imp_writelog (p_import_key,
                                       'E',
                                       v_aanduiding,
                                       'Fout bij toevoegen regel aan importtabel FAC_IMP_MLD. ' || v_errormsg
                                      );
               END;
            END IF;
         END IF;
      END;
   END LOOP;
   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key, 'E', v_aanduiding || 'Ongeldig importbestand', 'Toelichting: ... ');
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                        'Servicedesk: aantal ingelezen regels: ' || TO_CHAR (v_count_tot),
                        ''
                       );
      fac.imp_writelog (
         p_import_key,
         'S',
         'Servicedesk: aantal ongeldige niet ingelezen importregels: ' || TO_CHAR (v_count_tot - v_count_import),
         ''
      );
   END IF;
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key, 'E', v_errormsg, 'Inleesproces meldingen afgebroken!');
END fac_import_mld;
/


CREATE OR REPLACE PROCEDURE fac_update_mld (
   p_import_key IN NUMBER
)
IS
   c_fielddelimitor   VARCHAR2 (2)    := fac.import_delimiter(p_import_key);
   v_newline          fac_imp_file.fac_imp_file_line%TYPE;    -- 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_tot        NUMBER (10);

   -- SUBPROC
   PROCEDURE add_srtdiscipline (p_import_key IN NUMBER)
   IS
      CURSOR c1
      IS
           SELECT MAX (ins_srtdiscipline_omschrijving) ins_srtdiscipline_omschrijving,
                  UPPER (ins_srtdiscipline_omschrijving) ins_srtdiscipline_upper,
                  MAX (ins_srtdiscipline_prefix) ins_srtdiscipline_prefix,
                  MAX (ins_srtdiscipline_alg) ins_srtdiscipline_alg,
                  MAX (ins_srtdiscipline_ins) ins_srtdiscipline_ins,
                  MAX (ins_srtdiscipline_bes) ins_srtdiscipline_bes
             FROM fac_imp_mld
            WHERE UPPER (ins_srtdiscipline_omschrijving) IS NOT NULL
         GROUP BY UPPER (ins_srtdiscipline_omschrijving)
         ORDER BY 1;

      teller              INTEGER;
      const_max_inserts   INTEGER        := 100;
      ccount              NUMBER (10);
      oracle_err_num      NUMBER;
      oracle_err_var      VARCHAR2 (100);
      v_count_tot         NUMBER (10);
      v_count_update      NUMBER (10);
   BEGIN
      v_count_tot := 0;
      v_count_update := 0;
      teller := 0;

      FOR rec IN c1
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;

            SELECT COUNT (*)
              INTO ccount
              FROM ins_srtdiscipline
             WHERE ins_srtdiscipline_verwijder IS NULL
               AND UPPER (TRIM (ins_srtdiscipline_omschrijving)) =
                                            TRIM (rec.ins_srtdiscipline_upper);

            IF (ccount = 0)
            THEN
               INSERT INTO ins_srtdiscipline
                           (ins_srtdiscipline_module,
                            ins_srtdiscipline_omschrijving,
                            ins_srtdiscipline_prefix,
                            ins_srtdiscipline_alg,
                            ins_srtdiscipline_ins,
                            ins_srtdiscipline_bes
                           )
                    VALUES ('MLD',
                            rec.ins_srtdiscipline_omschrijving,
                            rec.ins_srtdiscipline_prefix,
                            fac.safe_to_number (rec.ins_srtdiscipline_alg),
                            fac.safe_to_number (rec.ins_srtdiscipline_ins),
                            fac.safe_to_number (rec.ins_srtdiscipline_bes)
                           );

               v_count_update := v_count_update + 1;
            END IF;

            COMMIT;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_var := SUBSTR (SQLERRM, 1, 100);
               fac.imp_writelog
                      (p_import_key,
                       'W',
                          'Vakgroeptype ['
                       || rec.ins_srtdiscipline_omschrijving
                       || ']',
                          'Kan vakgroeptype niet wegschrijven (module = MLD)'
                       || ' '
                       || 'Oracle fout: '
                       || oracle_err_var
                      );
         END;
      END LOOP;

      fac.imp_writelog (p_import_key,
                        'S',
                           'Servicedesk: aantal vakgroeptyperegels: '
                        || TO_CHAR (v_count_tot),
                        ''
                       );
      fac.imp_writelog
                    (p_import_key,
                     'S',
                        'Servicedesk: aantal vakgroeptyperegels toegevoegd: '
                     || TO_CHAR (v_count_update),
                     ''
                    );
      COMMIT;
   END;

   -- SUBPROC
   PROCEDURE add_discipline (p_import_key IN NUMBER)
   IS
      CURSOR c1
      IS
           SELECT MAX (ins_srtdiscipline_omschrijving) ins_srtdiscipline_omschrijving,
                  MAX (ins_discipline_omschrijving) ins_discipline_omschrijving,
                  MAX (mld_discipline_directklaar) mld_discipline_directklaar,
                  MAX (ins_discipline_image) ins_discipline_image,
                  UPPER (ins_srtdiscipline_omschrijving) ins_srtdiscipline_upper,
                  UPPER (ins_discipline_omschrijving) ins_discipline_upper
             FROM fac_imp_mld
         GROUP BY UPPER (ins_srtdiscipline_omschrijving),
                  UPPER (ins_discipline_omschrijving)
         ORDER BY 1, 2;

      teller              INTEGER;
      const_max_inserts   INTEGER         := 100;
      v_errmes            VARCHAR2 (1024);
      srtdiscipline_key   NUMBER (10);
      v_discipline_key    NUMBER (10);
      ccount              NUMBER (10);
      oracle_err_num      NUMBER;
      oracle_err_var      VARCHAR2 (100);
      v_count_tot         NUMBER (10);
      v_count_update      NUMBER (10);
   BEGIN
      v_count_tot := 0;
      v_count_update := 0;
      teller := 0;

      FOR rec IN c1
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_errmes := 'Bepalen of de srtdiscipline';

            IF (rec.ins_srtdiscipline_omschrijving IS NOT NULL)
            THEN
               SELECT ins_srtdiscipline_key
                 INTO srtdiscipline_key
                 FROM ins_srtdiscipline sd
                WHERE sd.ins_srtdiscipline_verwijder IS NULL
                  AND UPPER (TRIM (sd.ins_srtdiscipline_omschrijving)) =
                             UPPER (TRIM (rec.ins_srtdiscipline_omschrijving));
            ELSE
               SELECT TO_NUMBER (NULL)
                 INTO srtdiscipline_key
                 FROM DUAL;
            END IF;

            v_errmes := 'Bepalen of de discipline bestaat';

            SELECT COUNT (*)
              INTO ccount
              FROM ins_tab_discipline d
             WHERE d.ins_discipline_verwijder IS NULL
               AND d.ins_discipline_module = 'MLD'
               AND UPPER (TRIM (d.ins_discipline_omschrijving)) =
                                UPPER (TRIM (rec.ins_discipline_omschrijving))
               AND d.ins_srtdiscipline_key = srtdiscipline_key;

            IF ccount = 0
            THEN
               SELECT ins_srtdiscipline_key
                 INTO srtdiscipline_key
                 FROM ins_srtdiscipline sd
                WHERE sd.ins_srtdiscipline_verwijder IS NULL
                  AND sd.ins_srtdiscipline_module = 'MLD'
                  AND UPPER (TRIM (sd.ins_srtdiscipline_omschrijving)) =
                             UPPER (TRIM (rec.ins_srtdiscipline_omschrijving));

               SELECT ins_s_ins_discipline_key.NEXTVAL
                 INTO v_discipline_key
                 FROM DUAL;

               INSERT INTO ins_tab_discipline
                           (ins_discipline_module,
                            ins_discipline_omschrijving,
                            ins_discipline_min_level, ins_srtdiscipline_key,
                            ins_discipline_image
                           )
                    VALUES ('MLD',
                            SUBSTR (rec.ins_discipline_omschrijving, 1, 60),
                            1, srtdiscipline_key,
                            rec.ins_discipline_image
                           ) RETURNING ins_discipline_key INTO v_discipline_key;

               INSERT INTO mld_disc_params
                           (mld_ins_discipline_key,
                            mld_disc_params_factuurappr,
                            mld_disc_params_noti_dagen,
                            mld_disc_params_notify,
                            mld_disc_params_opdr_kosten,
                            mld_disc_params_directklaar
                           )
                    VALUES (v_discipline_key,
                            0,
                            NULL,
                            0,
                            0,
                            rec.mld_discipline_directklaar
                           );

               v_count_update := v_count_update + 1;
            END IF;

            COMMIT;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_var := SUBSTR (SQLERRM, 1, 100);
               fac.imp_writelog (p_import_key,
                                 'W',
                                    'Vakgroep ['
                                 || rec.ins_srtdiscipline_omschrijving
                                 || ']',
                                    'Kan vakgroep niet wegschrijven'
                                 || ' '
                                 || 'Oracle error: '
                                 || oracle_err_var
                                );
               COMMIT;                                          -- tbv logging
         END;
      END LOOP;

      fac.imp_writelog (p_import_key,
                        'S',
                           'Servicedesk: aantal vakgroepregels: '
                        || TO_CHAR (v_count_tot),
                        ''
                       );
      fac.imp_writelog (p_import_key,
                        'S',
                           'Servicedesk: aantal vakgroepregels toegevoegd: '
                        || TO_CHAR (v_count_update),
                        ''
                       );
      COMMIT;
   END;

   -- SUBPROC
   PROCEDURE add_stdmeldinggroep (p_import_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT DISTINCT mld_stdmelding_groep
             FROM fac_imp_mld
            WHERE mld_stdmelding_groep IS NOT NULL
         ORDER BY 1;

      v_aanduiding     VARCHAR2 (200);
      v_errorhint      VARCHAR2 (1000);
      v_errormsg       VARCHAR2 (1000);
      oracle_err_num   NUMBER;
      oracle_err_mes   VARCHAR2 (200);
      v_count          NUMBER (10);
      v_count_tot      NUMBER (10);
      v_count_update   NUMBER (10);
   BEGIN
      v_count_tot := 0;
      v_count_update := 0;

      FOR rec IN c1
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding := '[' || rec.mld_stdmelding_groep || '] ';

            v_errorhint := 'Fout bij bepalen meldinggroep';

            SELECT   COUNT ( * )
              INTO   v_count
              FROM   mld_stdmeldinggroep
             WHERE   UPPER (mld_stdmeldinggroep_naam) =
                        UPPER (rec.mld_stdmelding_groep);

            IF v_count = 0
            THEN
               v_errorhint := 'Fout bij toevoegen meldinggroep';

               INSERT INTO mld_stdmeldinggroep (mld_stdmeldinggroep_naam)
                 VALUES   (rec.mld_stdmelding_groep);

               v_count_update := v_count_update + 1;
               COMMIT;
            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_aanduiding || v_errormsg,
                                 v_errorhint);
               COMMIT;
         END;
      END LOOP;

      fac.imp_writelog (p_import_key,
                        'S',
                           'Servicedesk: aantal meldinggroepen: '
                        || TO_CHAR (v_count_tot),
                        ''
                       );
      fac.imp_writelog (p_import_key,
                        'S',
                           'Servicedesk: aantal meldinggroepen toegevoegd: '
                        || TO_CHAR (v_count_update),
                        ''
                       );
      COMMIT;

   END;

   -- SUBPROC
   PROCEDURE add_kostensoort (p_import_key IN NUMBER)
   IS
      CURSOR c1
      IS
           SELECT MAX (mld_stdmelding_kostensoort) prs_kostensoort_oms,
                  UPPER (mld_stdmelding_kostensoort) prs_kostensoort_upper
             FROM fac_imp_mld
            WHERE mld_stdmelding_kostensoort IS NOT NULL
         GROUP BY UPPER (mld_stdmelding_kostensoort)
         ORDER BY 1;

      teller              INTEGER;
      const_max_inserts   INTEGER         := 100;
      v_errmes            VARCHAR2 (1024);
      srtdiscipline_key   NUMBER (10);
      ccount              NUMBER (10);
      oracle_err_num      NUMBER;
      oracle_err_var      VARCHAR2 (100);
      v_count_tot         NUMBER (10);
      v_count_update      NUMBER (10);
   BEGIN
      v_count_tot := 0;
      v_count_update := 0;
      teller := 0;

      FOR rec IN c1
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_errmes := 'Bepalen of de kostensoort bestaat';

            SELECT COUNT (*)
              INTO ccount
              FROM prs_kostensoort
             WHERE prs_kostensoort_upper = rec.prs_kostensoort_upper;

            IF ccount = 0
            THEN
               v_errmes := 'Toevoegen kostensoort';

               INSERT INTO prs_kostensoort
                           (prs_kostensoort_oms, prs_kostensoort_opmerking
                           )
                    VALUES (rec.prs_kostensoort_oms, ''
                           );

               v_count_update := v_count_update + 1;
            END IF;

            COMMIT;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_var := SUBSTR (SQLERRM, 1, 100);
               fac.imp_writelog
                   (p_import_key,
                    'W',
                    'Vakgroep [' || rec.prs_kostensoort_oms || ']',
                       'Kan PRS_KOSTENSOORT niet wegschrijven (module = MLD)'
                    || ' '
                    || 'Oracle fout: '
                    || oracle_err_var
                   );
         END;
      END LOOP;

      fac.imp_writelog (p_import_key,
                        'S',
                           'Servicedesk: aantal kostensoortregels: '
                        || TO_CHAR (v_count_tot),
                        ''
                       );
      fac.imp_writelog
                      (p_import_key,
                       'S',
                          'Servicedesk: aantal kostensoortregels toegevoegd:'
                       || TO_CHAR (v_count_update),
                       ''
                      );
      COMMIT;
   END;

   -- SUBPROC
   PROCEDURE add_dienst (p_import_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT DISTINCT prs_dienst
             FROM fac_imp_mld
            WHERE prs_dienst IS NOT NULL
         ORDER BY 1;

      v_aanduiding     VARCHAR2 (200);
      v_errorhint      VARCHAR2 (1000);
      v_errormsg       VARCHAR2 (1000);
      oracle_err_num   NUMBER;
      oracle_err_mes   VARCHAR2 (200);
      v_count          NUMBER (10);
      v_count_tot      NUMBER (10);
      v_count_update   NUMBER (10);
   BEGIN
      v_count_tot := 0;
      v_count_update := 0;

      FOR rec IN c1
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding := '[' || rec.prs_dienst || '] ';

            v_errorhint := 'Fout bij bepalen dienst';

            SELECT   COUNT ( * )
              INTO   v_count
              FROM   prs_dienst
             WHERE   UPPER (prs_dienst_omschrijving) =
                        UPPER (rec.prs_dienst);

            IF v_count = 0
            THEN
               v_errorhint := 'Fout bij toevoegen dienst';

               INSERT INTO prs_dienst (prs_dienst_omschrijving)
                 VALUES   (rec.prs_dienst);

               v_count_update := v_count_update + 1;
               COMMIT;
            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_aanduiding || v_errormsg,
                                 v_errorhint);
               COMMIT;
         END;
      END LOOP;
   END;

   -- SUBPROC
   PROCEDURE add_typeopdr (p_import_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT DISTINCT mld_typeopdr_omschrijving
             FROM fac_imp_mld
            WHERE mld_typeopdr_omschrijving IS NOT NULL
         ORDER BY 1;

      v_aanduiding     VARCHAR2 (200);
      v_errorhint      VARCHAR2 (1000);
      v_errormsg       VARCHAR2 (1000);
      oracle_err_num   NUMBER;
      oracle_err_mes   VARCHAR2 (200);
      v_count          NUMBER (10);
      v_count_tot      NUMBER (10);
      v_count_update   NUMBER (10);
   BEGIN
      v_count_tot := 0;
      v_count_update := 0;

      FOR rec IN c1
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding := '[' || rec.mld_typeopdr_omschrijving || '] ';

            v_errorhint := 'Fout bij bepalen opdrachttype';

            SELECT   COUNT ( * )
              INTO   v_count
              FROM   mld_typeopdr
             WHERE   mld_typeopdr_upper = UPPER (rec.mld_typeopdr_omschrijving);

            IF v_count = 0
            THEN
               v_errorhint := 'Fout bij toevoegen opdrachttype';

               INSERT INTO mld_typeopdr (mld_typeopdr_omschrijving)
                 VALUES   (rec.mld_typeopdr_omschrijving);

               v_count_update := v_count_update + 1;
               COMMIT;
            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_aanduiding || v_errormsg,
                                 v_errorhint);
               COMMIT;
         END;
      END LOOP;
   END;

   -- SUBPROC
   PROCEDURE add_stdmelding (p_import_key IN NUMBER)
   IS
      CURSOR c1
      IS
           SELECT *
             FROM fac_imp_mld sm
         ORDER BY 1, 6 ,7;

      teller              INTEGER;
      discipline_key      NUMBER (10);
      srtdiscipline_key   NUMBER (10);
      kostensoort_key     NUMBER (10);
      dienst_key          NUMBER (10);
      stdmeldinggroep_key NUMBER (10);
      typeopdr_key        NUMBER (10);
      ccount              NUMBER (10);
      v_errmes            VARCHAR2 (1024);
      oracle_err_num      NUMBER;
      oracle_err_var      VARCHAR2 (100);
      v_count_tot         NUMBER (10);
      v_count_update      NUMBER (10);
   BEGIN
      v_count_tot := 0;
      v_count_update := 0;
      teller := 0;

      FOR rec IN c1
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;

            IF (rec.ins_srtdiscipline_omschrijving IS NOT NULL)
            THEN
               v_errmes := 'Bepalen srtdiscipline_key';

               SELECT ins_srtdiscipline_key
                 INTO srtdiscipline_key
                 FROM ins_srtdiscipline sd
                WHERE sd.ins_srtdiscipline_module = 'MLD'
                  AND UPPER (sd.ins_srtdiscipline_omschrijving) =
                             UPPER (TRIM (rec.ins_srtdiscipline_omschrijving))
                  AND sd.ins_srtdiscipline_verwijder IS NULL;
            ELSE
               srtdiscipline_key := TO_NUMBER (NULL);
            END IF;

            v_errmes := 'Bepalen discipline_key';

            SELECT ins_discipline_key
              INTO discipline_key
              FROM ins_tab_discipline d
             WHERE TRIM (UPPER (d.ins_discipline_omschrijving)) =
                                TRIM (UPPER (rec.ins_discipline_omschrijving))
               AND d.ins_discipline_module = 'MLD'
               AND d.ins_srtdiscipline_key = srtdiscipline_key
               AND d.ins_discipline_verwijder IS NULL;

            v_errmes := 'Kijken mld_stdmelding bestaat';

            SELECT COUNT (*)
              INTO ccount
              FROM mld_stdmelding
             WHERE mld_ins_discipline_key = discipline_key
               AND TRIM (UPPER (mld_stdmelding_omschrijving)) =
                                TRIM (UPPER (rec.mld_stdmelding_omschrijving));

            IF ccount = 0
            THEN
               v_errmes := 'Bepalen of de kostensoort bestaat';

               SELECT COUNT (*),
                      NVL (MAX (prs_kostensoort_key), TO_NUMBER (NULL))
                 INTO ccount,
                      kostensoort_key
                 FROM prs_kostensoort
                WHERE prs_kostensoort_upper = rec.mld_stdmelding_kostensoort;

               v_errmes := 'Bepalen of de dienst bestaat';
               dienst_key := NULL;
               IF rec.prs_dienst IS NOT NULL
               THEN
                   SELECT prs_dienst_key
                     INTO dienst_key
                     FROM prs_dienst
                    WHERE UPPER(prs_dienst_omschrijving) = UPPER(rec.prs_dienst);
               END IF;

               v_errmes := 'Bepalen stdmeldinggroep_key';
               stdmeldinggroep_key := NULL;
               IF rec.mld_stdmelding_groep IS NOT NULL
               THEN
                   SELECT mld_stdmeldinggroep_key
                     INTO stdmeldinggroep_key
                     FROM mld_stdmeldinggroep
                    WHERE TRIM (UPPER (mld_stdmeldinggroep_naam)) =
                                       TRIM (UPPER (rec.mld_stdmelding_groep));
               END IF;

               v_errmes := 'Bepalen typeopdr_key';
               typeopdr_key := NULL;
               IF rec.mld_typeopdr_omschrijving IS NOT NULL
               THEN
                   SELECT mld_typeopdr_key
                     INTO typeopdr_key
                     FROM mld_typeopdr
                    WHERE TRIM (mld_typeopdr_upper) = TRIM (UPPER (rec.mld_typeopdr_omschrijving));
               END IF;

               v_errmes := 'Toevoegen mld_stdmelding';
               v_errmes :=
                     ' (discipline_key = '
                  || TO_CHAR (discipline_key)
                  || '| rec.mld_stdmelding_omschrijving = '
                  || rec.mld_stdmelding_omschrijving
                  || '| KOSTENSOORT_KEY'
                  || TO_CHAR (kostensoort_key)
                  || 'NVL (TO_NUMBER (rec.mld_stdmelding_urgentie), NULL) = '
                  || TO_CHAR (NVL (TO_NUMBER (rec.mld_stdmelding_urgentie), 0))
                  || 'NVL (rec.mld_stdmelding_uitvoertijd, 0) = '
                  || TO_CHAR (NVL (rec.mld_stdmelding_uitvoertijd, 0))
                  || ')';

               INSERT INTO mld_stdmelding
                           (mld_ins_discipline_key,
                            mld_stdmelding_omschrijving,
                            mld_stdmeldinggroep_key,
                            prs_kostensoort_key,
                            mld_stdmelding_t_accepttijd,   --mld_stdmelding_urgentie,
                            mld_stdmelding_t_uitvoertijd,  --mld_stdmelding_uitvoertijd,
                            mld_stdmelding_t_uitvtijd_pr1, --mld_stdmelding_uitvoertijd_pr1,
                            mld_stdmelding_t_uitvtijd_pr2, --mld_stdmelding_uitvoertijd_pr2,
                            mld_stdmelding_t_uitvtijd_pr4, --mld_stdmelding_uitvoertijd_pr4,
                            prs_dienst_key,
                            mld_stdmelding_notfrontend,
                            alg_onrgoed_niveau,
                            mld_typeopdr_key,
                            mld_stdmelding_hint,
                            mld_stdmelding_kopieerbaar,
                            mld_stdmelding_afmeldtext,
                            mld_stdmelding_doublecheck,
                            mld_stdmelding_slabewaken,
                            mld_stdmelding_image
                           )
                    VALUES (discipline_key,
                            rec.mld_stdmelding_omschrijving,
                            stdmeldinggroep_key,
                            kostensoort_key,
                            MLD_T_UITVOERTIJD(rec.mld_stdmelding_urgentie, 'U'),
                            MLD_T_UITVOERTIJD(CASE
                                               WHEN COALESCE(rec.mld_stdmelding_uitvoertijd, 2) > 0 AND COALESCE(rec.mld_stdmelding_uitvoertijd, 2) < 1
                                               THEN COALESCE(rec.mld_stdmelding_uitvoertijd, 2) * 24 -- Uren
                                               ELSE COALESCE(rec.mld_stdmelding_uitvoertijd, 2)      -- Dagen
                                              END,
                                              CASE
                                               WHEN COALESCE(rec.mld_stdmelding_uitvoertijd, 2) > 0 AND COALESCE(rec.mld_stdmelding_uitvoertijd, 2) < 1
                                               THEN 'U' -- Uren
                                               ELSE 'D' -- Dagen
                                              END),
                            MLD_T_UITVOERTIJD(CASE
                                               WHEN rec.mld_stdmelding_uitvoertijd1 > 0 AND rec.mld_stdmelding_uitvoertijd1 < 1
                                               THEN rec.mld_stdmelding_uitvoertijd1 * 24 -- Uren
                                               ELSE rec.mld_stdmelding_uitvoertijd1      -- Dagen
                                              END,
                                              CASE
                                               WHEN rec.mld_stdmelding_uitvoertijd1 > 0 AND rec.mld_stdmelding_uitvoertijd1 < 1
                                               THEN 'U' -- Uren
                                               ELSE 'D' -- Dagen
                                              END),
                            MLD_T_UITVOERTIJD(CASE
                                               WHEN rec.mld_stdmelding_uitvoertijd2 > 0 AND rec.mld_stdmelding_uitvoertijd2 < 1
                                               THEN rec.mld_stdmelding_uitvoertijd2 * 24 -- Uren
                                               ELSE rec.mld_stdmelding_uitvoertijd2      -- Dagen
                                              END,
                                              CASE
                                               WHEN rec.mld_stdmelding_uitvoertijd2 > 0 AND rec.mld_stdmelding_uitvoertijd2 < 1
                                               THEN 'U' -- Uren
                                               ELSE 'D' -- Dagen
                                              END),
                            MLD_T_UITVOERTIJD(CASE
                                               WHEN rec.mld_stdmelding_uitvoertijd4 > 0 AND rec.mld_stdmelding_uitvoertijd4 < 1
                                               THEN rec.mld_stdmelding_uitvoertijd4 * 24 -- Uren
                                               ELSE rec.mld_stdmelding_uitvoertijd4      -- Dagen
                                              END,
                                              CASE
                                               WHEN rec.mld_stdmelding_uitvoertijd4 > 0 AND rec.mld_stdmelding_uitvoertijd4 < 1
                                               THEN 'U' -- Uren
                                               ELSE 'D' -- Dagen
                                              END),
                            dienst_key,
                            rec.mld_stdmelding_notfrontend,
                            rec.alg_onrgoed_niveau,
                            typeopdr_key,
                            rec.mld_stdmelding_hint,
                            rec.mld_stdmelding_kopieerbaar,
                            rec.mld_stdmelding_afmeldtext,
                            rec.mld_stdmelding_doublecheck,
                            rec.mld_stdmelding_slabewaken,
                            rec.mld_stdmelding_image
                           );

               v_count_update := v_count_update + 1;
            END IF;

            COMMIT;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_var := SUBSTR (SQLERRM, 1, 100);
               fac.imp_writelog
                      (p_import_key,
                       'W',
                          'standaardmelding kan niet worden weggeschreven ['
                       || rec.mld_stdmelding_omschrijving
                       || ']',
                       v_errmes || ' Oracle fout: ' || oracle_err_var
                      );
               COMMIT;                                          -- tbv logging
         END;
      END LOOP;

      fac.imp_writelog (p_import_key,
                        'S',
                           'Servicedesk: aantal standaardmeldingen: '
                        || TO_CHAR (v_count_tot),
                        ''
                       );
      fac.imp_writelog
                    (p_import_key,
                     'S',
                        'Servicedesk: aantal standaardmeldingen toegevoegd: '
                     || TO_CHAR (v_count_update),
                     ''
                    );
      COMMIT;
   END;
-- MAIN
BEGIN
   add_srtdiscipline (p_import_key);
   add_discipline (p_import_key);
   add_stdmeldinggroep (p_import_key);
   add_kostensoort (p_import_key);
   add_dienst (p_import_key);
   add_typeopdr (p_import_key);
   add_stdmelding (p_import_key);
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
      v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        'Importproces meldingen afgebroken!',
                        ''
                       );
END fac_update_mld;
/


CREATE OR REPLACE PROCEDURE fac_import_mld_del (
  p_import_key IN NUMBER
) IS
BEGIN
  fac_import_mld(p_import_key);
END fac_import_mld_del;
/


CREATE OR REPLACE PROCEDURE fac_update_mld_del (
  p_import_key IN NUMBER
) IS
BEGIN
  fac.imp_mld_delete_mld(p_import_key, NULL);
  fac_update_mld(p_import_key);
END fac_update_mld_del;
/

CREATE OR REPLACE PROCEDURE fac_import_mldafmtxt (p_import_key IN NUMBER)
IS
   c_delim                     VARCHAR2 (2) := fac.import_delimiter(p_import_key);
   v_newline                   fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
   v_errormsg                  VARCHAR2 (1000);
   oracle_err_num              NUMBER;
   oracle_err_mes              VARCHAR2 (200);
   v_aanduiding                VARCHAR2 (200) := '';
   header_is_valid             NUMBER := 0;
   v_count_tot                 NUMBER (10) := 0;
   v_count_import              NUMBER (10) := 0;
   v_ongeldig                  NUMBER (1);
   -- De importvelden:
   v_afmeldtekst_naam          VARCHAR2 (256);                          -- C60
   v_afmeldtekst_oms           VARCHAR2 (4000);                         -- C1000
   v_discipline_key            VARCHAR2 (256);                          -- N10
   v_stdmelding_key            VARCHAR2 (256);                          -- N10
   v_afmeldtekst_usefor        VARCHAR2 (256);                          -- N1
   CURSOR c1
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   DELETE FROM fac_imp_mldafmtxt;
   COMMIT;

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

         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_delim, v_afmeldtekst_naam);
         fac.imp_getfield (v_newline, c_delim, v_afmeldtekst_oms);
         fac.imp_getfield (v_newline, c_delim, v_discipline_key);
         fac.imp_getfield (v_newline, c_delim, v_stdmelding_key);
         fac.imp_getfield (v_newline, c_delim, v_afmeldtekst_usefor);
         v_aanduiding := '[' || v_afmeldtekst_naam || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_afmeldtekst_naam) = 'AFMELDTEKSTNAAM'
               AND UPPER (v_afmeldtekst_oms) = 'AFMELDTEKSTOMSCHRIJVING'
               AND UPPER (v_discipline_key) = 'DISCIPLINE_KEY'
               AND UPPER (v_stdmelding_key) = 'STDMELDING_KEY'
               AND UPPER (v_afmeldtekst_usefor) = 'AFMELDTEKSTUSEFOR'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;

            -- Controleer alle veldwaarden
            v_errormsg := 'Afmeldtekstnaam ongeldig/ongedefinieerd of te lang';
            v_afmeldtekst_naam := TRIM (v_afmeldtekst_naam);

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

            --
            v_errormsg := 'Afmeldtekstomschrijving ongeldig/ongedefinieerd of te lang';
            v_afmeldtekst_oms := TRIM (v_afmeldtekst_oms);

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

            --
            v_errormsg := 'Discipline-key ongeldig';
            v_discipline_key := TRIM (v_discipline_key);

            IF (v_discipline_key IS NOT NULL
                AND fac.safe_to_number (v_discipline_key) IS NULL)
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Discipline-key wordt genegeerd!');
            END IF;

            --
            v_errormsg := 'Soortmelding-key ongeldig';
            v_stdmelding_key := TRIM (v_stdmelding_key);

            IF (v_stdmelding_key IS NOT NULL
                AND fac.safe_to_number (v_stdmelding_key) IS NULL)
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Soortmelding-key wordt genegeerd!');
            END IF;

            --
            v_errormsg := 'afmeldtekstusefor ongeldig/ongedefinieerd';
            v_afmeldtekst_usefor := TRIM (v_afmeldtekst_usefor);
            IF v_afmeldtekst_usefor IS NULL OR v_afmeldtekst_usefor < 1 OR v_afmeldtekst_usefor > 4
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Regel wordt overgeslagen!');
            END IF;

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

                  INSERT INTO fac_imp_mldafmtxt (mld_afmeldtekst_naam,
                                                 mld_afmeldtekst_omschrijving,
                                                 ins_discipline_key,
                                                 mld_stdmelding_key,
                                                 mld_afmeldtekst_usefor)
                      VALUES (v_afmeldtekst_naam,
                              v_afmeldtekst_oms,
                              fac.safe_to_number (v_discipline_key),
                              fac.safe_to_number (v_stdmelding_key),
                              v_afmeldtekst_usefor);
                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                     v_errormsg :=
                           v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                     fac.imp_writelog (p_import_key,
                                       'E',
                                       v_aanduiding || v_errormsg,
                                       '');
               END;

               COMMIT;
            END IF;
         END IF;
      END;
   END LOOP;

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

CREATE OR REPLACE PROCEDURE fac_update_mldafmtxt (p_import_key IN NUMBER)
AS
   -- Cursor loopt over de voorkomende (unieke) tabelnamen.
   CURSOR c1
   IS
      SELECT * FROM fac_imp_mldafmtxt;

   v_errormsg       VARCHAR2 (1000) := '';
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_count          NUMBER (10);
   v_count_tot      NUMBER (10);
   v_count_upd      NUMBER (10);
BEGIN
   v_count_tot := 0;
   v_count_upd := 0;

   FOR rec IN c1
   LOOP
      BEGIN
         v_count_tot := v_count_tot + 1;
         v_errormsg :=
               'Fout bij bepalen bestaan afmeldtekst [' || rec.mld_afmeldtekst_naam || '] ';

         SELECT COUNT ( * )
           INTO v_count
           FROM mld_afmeldtekst
          WHERE UPPER (mld_afmeldtekst_naam) = UPPER (rec.mld_afmeldtekst_naam);

         IF (v_count = 0)
         THEN
            v_errormsg :=
                  'Fout bij toevoegen afmeldtekst [' || rec.mld_afmeldtekst_naam || '] ';

            INSERT INTO mld_afmeldtekst (mld_afmeldtekst_naam,
                                         mld_afmeldtekst_omschrijving,
                                         mld_ins_discipline_key,
                                         mld_stdmelding_key,
                                         mld_afmeldtekst_usefor)
                VALUES (rec.mld_afmeldtekst_naam,
                        rec.mld_afmeldtekst_omschrijving,
                        rec.ins_discipline_key,
                        rec.mld_stdmelding_key,
                        rec.mld_afmeldtekst_usefor);
         ELSE
            v_errormsg :=
                  'Fout bij bijwerken afmeldtekst [' || rec.mld_afmeldtekst_naam || '] ';

            UPDATE mld_afmeldtekst
               SET mld_afmeldtekst_omschrijving = rec.mld_afmeldtekst_omschrijving,
                   mld_ins_discipline_key = rec.ins_discipline_key,
                   mld_stdmelding_key = rec.mld_stdmelding_key,
                   mld_afmeldtekst_usefor = rec.mld_afmeldtekst_usefor
             WHERE UPPER (mld_afmeldtekst_naam) = UPPER (rec.mld_afmeldtekst_naam);
         END IF;

         COMMIT;

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

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

--//////////////////////////////////////////////////INS IMPORT STUFF///////////////////////////////////////////
CREATE OR REPLACE PROCEDURE fac_import_ins (p_import_key IN NUMBER)
IS
   c_delim                         VARCHAR2 (2) := fac.import_delimiter(p_import_key);
   v_newline                       fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
   v_errormsg                      VARCHAR2 (1000);
   v_errorhint                     VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER;
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_ongeldig                      NUMBER (1);
   v_aanduiding                    VARCHAR (400);
   v_ins_kenmerk_key1              VARCHAR2 (255);
   v_ins_kenmerk_key2              VARCHAR2 (255);
   v_ins_kenmerk_key3              VARCHAR2 (255);
   v_ins_kenmerk_key4              VARCHAR2 (255);
   v_ins_kenmerk_key5              VARCHAR2 (255);
   v_ins_kenmerk_key6              VARCHAR2 (255);
   v_ins_kenmerk_key7              VARCHAR2 (255);
   v_ins_kenmerk_key8              VARCHAR2 (255);
   v_ins_kenmerk_key9              VARCHAR2 (255);
   v_ins_kenmerk_key10             VARCHAR2 (255);
   v_ins_kenmerk_key11             VARCHAR2 (255);
   v_ins_kenmerk_key12             VARCHAR2 (255);
   v_ins_kenmerk_key13             VARCHAR2 (255);
   v_ins_kenmerk_key14             VARCHAR2 (255);
   v_ins_kenmerk_key15             VARCHAR2 (255);
   v_ins_kenmerk_key16             VARCHAR2 (255);
   v_ins_kenmerk_key17             VARCHAR2 (255);
   v_ins_kenmerk_key18             VARCHAR2 (255);
   v_ins_kenmerk_key19             VARCHAR2 (255);
   v_ins_kenmerk_key20             VARCHAR2 (255);
   -- De importvelden
   v_ins_discipline_omschrijving   VARCHAR2 (255);                      -- C60
   v_ins_discipline_kostensoort    VARCHAR2 (255);                       --C60
   v_ins_srtgroep_omschrijving     VARCHAR2 (255);                      -- C60
   v_ins_srtdeel_code              VARCHAR2 (255);                      -- C10
   v_ins_srtdeel_omschrijving      VARCHAR2 (255);                     -- C100
   v_ins_deel_omschrijving         VARCHAR2 (255);                      -- C60
   v_ins_deel_opmerking            VARCHAR2 (1000);                    -- C320
   v_reserveerbaar                 VARCHAR2 (255);                       -- C1
   v_reserveerbaar_n               NUMBER (1);                           -- N1
   v_res_deel_eenheid              VARCHAR2 (255);                      -- C10
   v_res_deel_prijs                VARCHAR2 (255);                     -- N7,2
   v_res_deel_prijs_n              NUMBER (7, 2);                      -- N7,2
   v_alg_locatie_code              VARCHAR2 (255);                      -- C10
   v_alg_gebouw_code               VARCHAR2 (255);                      -- C12
   v_alg_verdieping_volgnr         VARCHAR2 (255);                       -- N3
   v_alg_verdieping_volgnr_n       NUMBER (3);                           -- N3
   v_alg_ruimte_nr                 VARCHAR2 (255);                      -- C20
   v_res_deel_alg_level            VARCHAR2 (255);       -- C1 (naar -1 t/m 5)
   v_res_deel_alg_level_n          NUMBER (1);                           -- N1
   v_res_discipline_type           VARCHAR2 (255);                      -- C60
   v_res_discipline_omschrijving   VARCHAR2 (255);                      -- C60
   v_res_discipline_kostensoort    VARCHAR2 (255);                      -- C60
   v_prs_perslid_matchcode         VARCHAR2 (4000);
   v_prs_perslid_matchwaarde       VARCHAR2 (4000);
   v_ins_kenmerkwaarde1            VARCHAR2 (4053);
   v_ins_kenmerkwaarde2            VARCHAR2 (4053);
   v_ins_kenmerkwaarde3            VARCHAR2 (4053);
   v_ins_kenmerkwaarde4            VARCHAR2 (4053);
   v_ins_kenmerkwaarde5            VARCHAR2 (4053);
   v_ins_kenmerkwaarde6            VARCHAR2 (4053);
   v_ins_kenmerkwaarde7            VARCHAR2 (4053);
   v_ins_kenmerkwaarde8            VARCHAR2 (4053);
   v_ins_kenmerkwaarde9            VARCHAR2 (4053);
   v_ins_kenmerkwaarde10           VARCHAR2 (4053);
   v_ins_kenmerkwaarde11           VARCHAR2 (4053);
   v_ins_kenmerkwaarde12           VARCHAR2 (4053);
   v_ins_kenmerkwaarde13           VARCHAR2 (4053);
   v_ins_kenmerkwaarde14           VARCHAR2 (4053);
   v_ins_kenmerkwaarde15           VARCHAR2 (4053);
   v_ins_kenmerkwaarde16           VARCHAR2 (4053);
   v_ins_kenmerkwaarde17           VARCHAR2 (4053);
   v_ins_kenmerkwaarde18           VARCHAR2 (4053);
   v_ins_kenmerkwaarde19           VARCHAR2 (4053);
   v_ins_kenmerkwaarde20           VARCHAR2 (4053);
   v_ins_deel_aanmaak              VARCHAR2 (255);                      -- DATE
   v_ins_deel_aanmaak_d            DATE;
   v_ins_deel_vervaldatum          VARCHAR2 (255);                      -- DATE
   v_ins_deel_vervaldatum_d        DATE;
   v_ins_deel_aantal               VARCHAR2 (255);                      -- N8,2
   v_ins_deel_aantal_n             NUMBER(8, 2);
   v_ins_deel_externnr             VARCHAR2 (400);
   v_file_index                    NUMBER;

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

   -- Controleer tijdens import-fase alleen op het bestaan van een kenmerk met de meegegeven omschrijving of kenmerk key.
   -- De omschrijving (header van kolom) kan de omschrijving zijn van het kenmerksoort of het kenmerk.
   -- De omschrijving van het kenmerksoort kan namelijk overruled worden door de omschrijving van het kenmerk.
   -- Daarnaast kan hetzelfde kenmerk vaker voorkomen voor verschillende groepen.
   -- Of het kenmerksoort/kenmerk wel is gedefinieerd voor de betreffende
   -- object-discipline/groep/soort, volgt pas tijdens de update-fase)!
   --
   -- p_kw is bijvoorbeeld 'Parkeercode', 'Parkeercode|3', 234 of 234|3 waarbij de tweede en laatste in groep 3 zitten
   -- het resultaat is NULL (als niet gevonden) of Parkeercode|3 of 234|3 voor kenmer_key 234 in groep 3
   -- Als geen groep is meegegeven dan wordt 'Parkeercode|0' opgeleverd (de default groep)
   FUNCTION bepaal_kenmerk (p_kw IN VARCHAR)
      RETURN VARCHAR
   IS
      v_kenmerk_key        NUMBER;
      v_kenmerk_groep      NUMBER;
      v_kw                 VARCHAR(250);
   BEGIN
      v_kenmerk_groep := 0;
      v_kw := p_kw;
      IF INSTR (v_kw, '|') > 1
      THEN
        v_kenmerk_groep := SUBSTR (v_kw, INSTR (v_kw, '|') + 1);
        v_kw := SUBSTR (v_kw, 1, INSTR (v_kw, '|') - 1);
      END IF;

      IF fac.safe_to_number (v_kw) IS NULL
      THEN                -- kenmerkwaarde is alfanumeriek (dus omschrijving)!
         SELECT MIN(k.ins_kenmerk_key)
           INTO v_kenmerk_key
           FROM ins_v_aanwezigkenmerk k,
                ins_v_aanwezigsrtkenmerk sk
          WHERE k.ins_srtkenmerk_key = sk.ins_srtkenmerk_key
            AND k.ins_kenmerk_groep = v_kenmerk_groep
            AND COALESCE(UPPER(k.ins_kenmerk_omschrijving), sk.ins_srtkenmerk_upper) = UPPER(v_kw)
            AND sk.ins_srtkenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B', 'V');
      ELSE                -- kenmerkwaarde is numeriek (dus key)!
         SELECT k.ins_kenmerk_key
           INTO v_kenmerk_key
           FROM ins_v_aanwezigkenmerk k,
                ins_v_aanwezigsrtkenmerk sk
          WHERE k.ins_srtkenmerk_key = sk.ins_srtkenmerk_key
            AND k.ins_kenmerk_groep = v_kenmerk_groep
            AND k.ins_kenmerk_key = fac.safe_to_number (v_kw)
            AND sk.ins_srtkenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B', 'V');
      END IF;

      IF v_kenmerk_key IS NULL
      THEN
         RETURN NULL;
      ELSE
         -- Er is een kenmerksoort of kenmerk aanwezig met de omschrijving/kenmerk_key (v_kw)
         RETURN v_kw || '|' || TO_CHAR(v_kenmerk_groep);
      END IF;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         IF p_kw IS NULL OR UPPER (p_kw) LIKE 'KENMERK%'
         THEN
            RETURN NULL;
         ELSE
            fac.imp_writelog (p_import_key,
                              'W',
                              'Fout bij bepalen kenmerk [' || p_kw || ']',
                              'Bestaat niet of type ongeldig');
            COMMIT;
            RETURN NULL;
         END IF;
   END;
BEGIN
   -- Eerst opruiming
   DELETE FROM   fac_imp_ins;

   COMMIT;

   v_count_tot := 0;
   v_count_import := 0;
   header_is_valid := 0;
   v_prs_perslid_matchcode := '';

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_file_index := rec1.fac_imp_file_index;
         v_errormsg := 'Fout bij opvragen importregel';
         v_aanduiding := '';
         v_ongeldig := 0;
         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_delim, v_ins_discipline_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_ins_discipline_kostensoort);
         fac.imp_getfield (v_newline, c_delim, v_ins_srtgroep_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_ins_srtdeel_code);
         fac.imp_getfield (v_newline, c_delim, v_ins_srtdeel_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_ins_deel_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_ins_deel_opmerking);
         fac.imp_getfield (v_newline, c_delim, v_reserveerbaar);
         fac.imp_getfield (v_newline, c_delim, v_res_deel_eenheid);
         fac.imp_getfield (v_newline, c_delim, v_res_deel_prijs);
         fac.imp_getfield (v_newline, c_delim, v_alg_locatie_code);
         fac.imp_getfield (v_newline, c_delim, v_alg_gebouw_code);
         fac.imp_getfield (v_newline, c_delim, v_alg_verdieping_volgnr);
         fac.imp_getfield (v_newline, c_delim, v_alg_ruimte_nr);
         fac.imp_getfield (v_newline, c_delim, v_res_deel_alg_level);
         fac.imp_getfield (v_newline, c_delim, v_res_discipline_type);
         fac.imp_getfield (v_newline, c_delim, v_res_discipline_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_res_discipline_kostensoort);
         fac.imp_getfield (v_newline, c_delim, v_prs_perslid_matchcode);
         fac.imp_getfield (v_newline, c_delim, v_prs_perslid_matchwaarde);
         fac.imp_getfield (v_newline, c_delim, v_ins_deel_aanmaak);
         fac.imp_getfield (v_newline, c_delim, v_ins_deel_vervaldatum);
         fac.imp_getfield (v_newline, c_delim, v_ins_deel_aantal);
         fac.imp_getfield (v_newline, c_delim, v_ins_deel_externnr);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde1);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde2);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde3);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde4);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde5);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde6);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde7);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde8);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde9);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde10);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde11);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde12);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde13);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde14);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde15);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde16);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde17);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde18);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde19);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde20);

         v_aanduiding :=
               '['
            || v_ins_discipline_omschrijving
            || '|'
            || v_ins_srtgroep_omschrijving
            || '|'
            || v_ins_srtdeel_code
            || '|'
            || v_ins_srtdeel_omschrijving
            || '|'
            || v_ins_deel_omschrijving
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij alle NIET-kenmerk kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF UPPER (v_ins_discipline_omschrijving) = 'DISCIPLINEOMSCHRIJVING'
               AND UPPER (v_ins_discipline_kostensoort) = 'DISCIPLINEKOSTENSOORT'
               AND UPPER (v_ins_srtgroep_omschrijving) = 'GROEPSOORTOMSCHRIJVING'
               AND UPPER (v_ins_srtdeel_code) = 'OBJECTSOORTCODE'
               AND UPPER (v_ins_srtdeel_omschrijving) = 'OBJECTSOORTOMSCHRIJVING'
               AND UPPER (v_ins_deel_omschrijving) = 'OBJECTIDENTIFICATIE'
               AND UPPER (v_ins_deel_opmerking) = 'OBJECTOPMERKING'
               AND UPPER (v_reserveerbaar) = 'RESERVEERBAAR'
               AND UPPER (v_res_deel_eenheid) = 'EENHEID'
               AND UPPER (v_res_deel_prijs) = 'PRIJS'
               AND UPPER (v_alg_locatie_code) = 'LOCATIECODE'
               AND UPPER (v_alg_gebouw_code) = 'GEBOUWCODE'
               AND UPPER (v_alg_verdieping_volgnr) = 'BOUWLAAGVOLGNUMMER'
               AND UPPER (v_alg_ruimte_nr) = 'RUIMTENUMMER'
               AND UPPER (v_res_deel_alg_level) = 'RESERVERINGSCOPE'
               AND UPPER (v_res_discipline_type) = 'CATALOGUSTYPE'
               AND UPPER (v_res_discipline_omschrijving) = 'CATALOGUSNAAM'
               AND UPPER (v_res_discipline_kostensoort) = 'CATALOGUSKOSTENSOORT'
               AND UPPER (v_prs_perslid_matchcode) = 'PERSOONMATCHCODE'
               AND UPPER (v_prs_perslid_matchwaarde) = 'PERSOONMATCHWAARDE'
               AND UPPER (v_ins_deel_aanmaak) = 'INGANGSDATUM'
               AND UPPER (v_ins_deel_vervaldatum) = 'VERVALDATUM'
               AND UPPER (v_ins_deel_aantal) = 'AANTAL'
               AND UPPER (v_ins_deel_externnr) = 'EXTERNNR'
            THEN
               v_ins_kenmerk_key1  := bepaal_kenmerk (v_ins_kenmerkwaarde1);
               v_ins_kenmerk_key2  := bepaal_kenmerk (v_ins_kenmerkwaarde2);
               v_ins_kenmerk_key3  := bepaal_kenmerk (v_ins_kenmerkwaarde3);
               v_ins_kenmerk_key4  := bepaal_kenmerk (v_ins_kenmerkwaarde4);
               v_ins_kenmerk_key5  := bepaal_kenmerk (v_ins_kenmerkwaarde5);
               v_ins_kenmerk_key6  := bepaal_kenmerk (v_ins_kenmerkwaarde6);
               v_ins_kenmerk_key7  := bepaal_kenmerk (v_ins_kenmerkwaarde7);
               v_ins_kenmerk_key8  := bepaal_kenmerk (v_ins_kenmerkwaarde8);
               v_ins_kenmerk_key9  := bepaal_kenmerk (v_ins_kenmerkwaarde9);
               v_ins_kenmerk_key10 := bepaal_kenmerk (v_ins_kenmerkwaarde10);
               v_ins_kenmerk_key11 := bepaal_kenmerk (v_ins_kenmerkwaarde11);
               v_ins_kenmerk_key12 := bepaal_kenmerk (v_ins_kenmerkwaarde12);
               v_ins_kenmerk_key13 := bepaal_kenmerk (v_ins_kenmerkwaarde13);
               v_ins_kenmerk_key14 := bepaal_kenmerk (v_ins_kenmerkwaarde14);
               v_ins_kenmerk_key15 := bepaal_kenmerk (v_ins_kenmerkwaarde15);
               v_ins_kenmerk_key16 := bepaal_kenmerk (v_ins_kenmerkwaarde16);
               v_ins_kenmerk_key17 := bepaal_kenmerk (v_ins_kenmerkwaarde17);
               v_ins_kenmerk_key18 := bepaal_kenmerk (v_ins_kenmerkwaarde18);
               v_ins_kenmerk_key19 := bepaal_kenmerk (v_ins_kenmerkwaarde19);
               v_ins_kenmerk_key20 := bepaal_kenmerk (v_ins_kenmerkwaarde20);

               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errormsg := 'Disciplineomschrijving ongeldig';
            v_ins_discipline_omschrijving :=
               TRIM (v_ins_discipline_omschrijving);

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

            --
            v_errormsg := 'Kostensoort ongeldig';
            v_ins_discipline_kostensoort :=
               TRIM (v_ins_discipline_kostensoort);

            IF LENGTH (v_ins_discipline_kostensoort) > 60
            THEN
               v_ins_discipline_kostensoort :=
                  SUBSTR (v_ins_discipline_kostensoort, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Disciplinekostensoort wordt afgebroken tot ['
                  || v_ins_discipline_kostensoort
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Groepsoortomschrijving ongeldig';
            v_ins_srtgroep_omschrijving := TRIM (v_ins_srtgroep_omschrijving);

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

            --
            v_errormsg := 'Objectsoortcode ongeldig';
            v_ins_srtdeel_code := TRIM (v_ins_srtdeel_code);

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

            --
            v_errormsg := 'Objectsoortomschrijving ongeldig';
            v_ins_srtdeel_omschrijving := TRIM (v_ins_srtdeel_omschrijving);

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

            --
            v_errormsg := 'Objectomschrijving ongeldig';
            v_ins_deel_omschrijving := TRIM (v_ins_deel_omschrijving);

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

            v_errormsg := 'Objectopmerking ongeldig';
            v_ins_deel_opmerking := TRIM (v_ins_deel_opmerking);

            IF LENGTH (v_ins_deel_opmerking) > 320
            THEN
               v_ins_deel_opmerking := SUBSTR (v_ins_deel_opmerking, 1, 320);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Objectopmerking wordt afgebroken tot ['
                  || v_ins_deel_opmerking
                  || ']'
               );
            END IF;

            -- Verder geen foutdetectie; kan dus stricter?
            SELECT   DECODE (SUBSTR (TRIM (UPPER (v_reserveerbaar)), 1, 1),
                             'J', 1,
                             0)
              INTO   v_reserveerbaar_n
              FROM   DUAL;

            --
            v_errormsg := 'Eenheid ongeldig';
            v_res_deel_eenheid := TRIM (v_res_deel_eenheid);

            IF LENGTH (v_res_deel_eenheid) > 10
            THEN
               v_res_deel_eenheid := SUBSTR (v_res_deel_eenheid, 1, 10);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Eenheid wordt afgebroken tot ['
                  || v_res_deel_eenheid
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Prijs ongeldig; maximale grootte 99999.99';
            v_res_deel_prijs := TRIM (v_res_deel_prijs);
            v_res_deel_prijs_n := NULL;

            IF (v_res_deel_prijs IS NOT NULL)
            THEN
               IF (fac.safe_to_number (v_res_deel_prijs) IS NULL)
               THEN
                  v_ongeldig := 1;
                  fac.imp_writelog (p_import_key,
                                    'W',
                                    v_aanduiding || v_errormsg,
                                    'Regel wordt overgeslagen!');
               ELSE
                  v_res_deel_prijs_n := fac.safe_to_number (v_res_deel_prijs);
               END IF;
            END IF;

            --
            v_errormsg := 'Locatiecode ongeldig';
            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 || v_errormsg,
                     'Locatiecode wordt afgebroken tot ['
                  || v_alg_locatie_code
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Gebouwcode ongeldig';
            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 || v_errormsg,
                     'Gebouwcode wordt afgebroken tot ['
                  || v_alg_gebouw_code
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Bouwlaagvolgnummer ongeldig';
            v_alg_verdieping_volgnr := TRIM (v_alg_verdieping_volgnr);
            v_alg_verdieping_volgnr_n := NULL;

            IF (v_alg_verdieping_volgnr IS NOT NULL)
            THEN
               v_alg_verdieping_volgnr_n :=
                  ROUND (fac.safe_to_number (v_alg_verdieping_volgnr));

               IF v_alg_verdieping_volgnr_n NOT BETWEEN -999 AND 999
               THEN
                  v_ongeldig := 1;
                  fac.imp_writelog (p_import_key,
                                    'W',
                                    v_aanduiding || v_errormsg,
                                    'Regel wordt overgeslagen!');
               ELSE
                  v_alg_verdieping_volgnr_n :=
                     fac.safe_to_number (v_alg_verdieping_volgnr);
               END IF;
            END IF;

            --
            v_errormsg := 'Ruimtenummer ongeldig';
            v_alg_ruimte_nr := TRIM (v_alg_ruimte_nr);

            IF LENGTH (v_alg_ruimte_nr) > 20
            THEN
               v_alg_ruimte_nr := SUBSTR (v_alg_ruimte_nr, 1, 20);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Ruimtenummer wordt afgebroken tot ['
                  || v_alg_ruimte_nr
                  || ']'
               );
            END IF;

            -- Verder geen foutdetectie; kan dus stricter?
            SELECT   DECODE (SUBSTR (TRIM (v_res_deel_alg_level), 1, 1),
                             'E', 0,
                             'D', 1,
                             'L', 2,
                             'G', 3,
                             'V', 4,
                             'R', 5,
                             -1)
              INTO   v_res_deel_alg_level_n
              FROM   DUAL;

            --
            v_errormsg := 'Catalogustype ongeldig';
            SELECT DECODE (SUBSTR(TRIM(v_res_discipline_type), 1, 1),
                           'R', '3',
                           'O', '1',
                           'V', '2',
                           'W', '5',
                           'P', '4',
                           '')
              INTO v_res_discipline_type
              FROM DUAL;
            --
            v_errormsg := 'Catalogusnaam ongeldig';
            v_res_discipline_omschrijving :=
               TRIM (v_res_discipline_omschrijving);

            IF LENGTH (v_res_discipline_omschrijving) > 60
            THEN
               v_res_discipline_omschrijving :=
                  SUBSTR (TRIM (v_res_discipline_omschrijving), 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Catalogusnaam wordt afgebroken tot ['
                  || v_res_discipline_omschrijving
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Cataloguskostensoort ongeldig';
            v_res_discipline_kostensoort :=
               TRIM (v_res_discipline_kostensoort);

            IF LENGTH (v_res_discipline_kostensoort) > 60
            THEN
               v_res_discipline_kostensoort :=
                  SUBSTR (TRIM (v_res_discipline_kostensoort), 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Cataloguskostensoort wordt afgebroken tot ['
                  || v_res_discipline_kostensoort
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Aantal ongeldig; maximale grootte 999999.99';
            v_ins_deel_aantal := TRIM (v_ins_deel_aantal);
            v_ins_deel_aantal := REPLACE (v_ins_deel_aantal, ',', '.');
            v_ins_deel_aantal_n := NULL;

            IF (v_ins_deel_aantal IS NOT NULL AND fac.getSetting('ins_explode_objects') = 0)
            THEN
               IF (fac.safe_to_number (v_ins_deel_aantal) IS NULL)
               THEN
                  v_ongeldig := 1;
                  fac.imp_writelog (p_import_key,
                                    'W',
                                    v_aanduiding || v_errormsg,
                                    'Regel wordt overgeslagen!');
               ELSE
                v_ins_deel_aantal_n := fac.safe_to_number (v_ins_deel_aantal);
               END IF;
            ELSE
              v_ins_deel_aantal_n := 1;
            END IF;

            --
            v_errorhint := 'Ongeldige aanmaakdatum';
            IF v_ins_deel_aanmaak IS NOT NULL
            THEN
               BEGIN
                  v_ins_deel_aanmaak_d :=
                             TO_DATE (v_ins_deel_aanmaak, 'dd-mm-yyyy');
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     v_ongeldig := 1;
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=
                           v_errorhint
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog (p_import_key,
                                       'E',
                                       v_aanduiding || v_errormsg,
                                       'Regel wordt overgeslagen!'
                                      );
                     COMMIT;
               END;
            ELSE
               v_ins_deel_aanmaak_d := NULL;
            END IF;

            --
            v_errorhint := 'Ongeldige vervaldatum';
            IF v_ins_deel_vervaldatum IS NOT NULL
            THEN
               BEGIN
                  v_ins_deel_vervaldatum_d :=
                             TO_DATE (v_ins_deel_vervaldatum, 'dd-mm-yyyy');
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     v_ongeldig := 1;
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=
                           v_errorhint
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog (p_import_key,
                                       'E',
                                       v_aanduiding || v_errormsg,
                                       'Regel wordt overgeslagen!'
                                      );
                     COMMIT;
               END;
            ELSE
               v_ins_deel_vervaldatum_d := NULL;
            END IF;

            --
            v_errormsg := 'Externnr ongeldig';
            v_ins_deel_externnr := TRIM (v_ins_deel_externnr);

            IF LENGTH (v_ins_deel_externnr) > 255
            THEN
               v_ins_deel_externnr := SUBSTR (TRIM (v_ins_deel_externnr), 1, 255);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Externnr wordt afgebroken tot ['
                  || v_ins_deel_externnr
                  || ']'
               );
            END IF;

            -- De rest alleen ff trimmen.
            v_prs_perslid_matchcode := TRIM (v_prs_perslid_matchcode);
            v_prs_perslid_matchwaarde := TRIM (v_prs_perslid_matchwaarde);
            v_ins_kenmerkwaarde1 := TRIM (v_ins_kenmerkwaarde1);
            v_ins_kenmerkwaarde2 := TRIM (v_ins_kenmerkwaarde2);
            v_ins_kenmerkwaarde3 := TRIM (v_ins_kenmerkwaarde3);
            v_ins_kenmerkwaarde4 := TRIM (v_ins_kenmerkwaarde4);
            v_ins_kenmerkwaarde5 := TRIM (v_ins_kenmerkwaarde5);
            v_ins_kenmerkwaarde6 := TRIM (v_ins_kenmerkwaarde6);
            v_ins_kenmerkwaarde7 := TRIM (v_ins_kenmerkwaarde7);
            v_ins_kenmerkwaarde8 := TRIM (v_ins_kenmerkwaarde8);
            v_ins_kenmerkwaarde9 := TRIM (v_ins_kenmerkwaarde9);
            v_ins_kenmerkwaarde10 := TRIM (v_ins_kenmerkwaarde10);
            v_ins_kenmerkwaarde11 := TRIM (v_ins_kenmerkwaarde11);
            v_ins_kenmerkwaarde12 := TRIM (v_ins_kenmerkwaarde12);
            v_ins_kenmerkwaarde13 := TRIM (v_ins_kenmerkwaarde13);
            v_ins_kenmerkwaarde14 := TRIM (v_ins_kenmerkwaarde14);
            v_ins_kenmerkwaarde15 := TRIM (v_ins_kenmerkwaarde15);
            v_ins_kenmerkwaarde16 := TRIM (v_ins_kenmerkwaarde16);
            v_ins_kenmerkwaarde17 := TRIM (v_ins_kenmerkwaarde17);
            v_ins_kenmerkwaarde18 := TRIM (v_ins_kenmerkwaarde18);
            v_ins_kenmerkwaarde19 := TRIM (v_ins_kenmerkwaarde19);
            v_ins_kenmerkwaarde20 := TRIM (v_ins_kenmerkwaarde20);

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

                  -- Als uit kenmerkheader een geldige kenmerksoort-key volgt,
                  -- dan is kenmerkwaarde<n> gevuld met <key>=<waarde>; zoniet,
                  -- dan is kenmerkwaarde<n> gevuld met <waarde>!
                  -- NB. Een NULL-waarde resulteert NIET in het wissen van een
                  --     kenmerkveld (bijwerken kan wel, maar wissen dus niet)!
                  INSERT INTO fac_imp_ins (
                                               ins_discipline_omschrijving,
                                               ins_discipline_kostensoort,
                                               ins_srtgroep_omschrijving,
                                               ins_srtdeel_code,
                                               ins_srtdeel_omschrijving,
                                               ins_deel_omschrijving,
                                               ins_deel_opmerking,
                                               reserveerbaar,
                                               res_deel_eenheid,
                                               res_deel_prijs,
                                               alg_locatie_code,
                                               alg_gebouw_code,
                                               alg_verdieping_volgnr,
                                               alg_ruimte_nr,
                                               res_deel_alg_level,
                                               res_discipline_type,
                                               res_discipline_omschrijving,
                                               res_discipline_kostensoort,
                                               prs_perslid_matchcode,
                                               prs_perslid_matchwaarde,
                                               ins_kenmerkwaarde1,
                                               ins_kenmerkwaarde2,
                                               ins_kenmerkwaarde3,
                                               ins_kenmerkwaarde4,
                                               ins_kenmerkwaarde5,
                                               ins_kenmerkwaarde6,
                                               ins_kenmerkwaarde7,
                                               ins_kenmerkwaarde8,
                                               ins_kenmerkwaarde9,
                                               ins_kenmerkwaarde10,
                                               ins_kenmerkwaarde11,
                                               ins_kenmerkwaarde12,
                                               ins_kenmerkwaarde13,
                                               ins_kenmerkwaarde14,
                                               ins_kenmerkwaarde15,
                                               ins_kenmerkwaarde16,
                                               ins_kenmerkwaarde17,
                                               ins_kenmerkwaarde18,
                                               ins_kenmerkwaarde19,
                                               ins_kenmerkwaarde20,
                                               ins_deel_aanmaak,
                                               ins_deel_vervaldatum,
                                               ins_deel_aantal,
                                               ins_deel_externnr
                             )
                    VALUES   (
                                 v_ins_discipline_omschrijving,
                                 v_ins_discipline_kostensoort,
                                 v_ins_srtgroep_omschrijving,
                                 v_ins_srtdeel_code,
                                 v_ins_srtdeel_omschrijving,
                                 v_ins_deel_omschrijving,
                                 v_ins_deel_opmerking,
                                 v_reserveerbaar_n,
                                 v_res_deel_eenheid,
                                 v_res_deel_prijs_n,
                                 v_alg_locatie_code,
                                 v_alg_gebouw_code,
                                 v_alg_verdieping_volgnr_n,
                                 v_alg_ruimte_nr,
                                 v_res_deel_alg_level_n,
                                 v_res_discipline_type,
                                 v_res_discipline_omschrijving,
                                 v_res_discipline_kostensoort,
                                 v_prs_perslid_matchcode,
                                 v_prs_perslid_matchwaarde,
                                 DECODE (v_ins_kenmerk_key1, NULL, v_ins_kenmerkwaarde1, TO_CHAR (v_ins_kenmerk_key1) || '=' || SUBSTR (v_ins_kenmerkwaarde1, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key2, NULL, v_ins_kenmerkwaarde2, TO_CHAR (v_ins_kenmerk_key2) || '=' || SUBSTR (v_ins_kenmerkwaarde2, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key3, NULL, v_ins_kenmerkwaarde3, TO_CHAR (v_ins_kenmerk_key3) || '=' || SUBSTR (v_ins_kenmerkwaarde3, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key4, NULL, v_ins_kenmerkwaarde4, TO_CHAR (v_ins_kenmerk_key4) || '=' || SUBSTR (v_ins_kenmerkwaarde4, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key5, NULL, v_ins_kenmerkwaarde5, TO_CHAR (v_ins_kenmerk_key5) || '=' || SUBSTR (v_ins_kenmerkwaarde5, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key6, NULL, v_ins_kenmerkwaarde6, TO_CHAR (v_ins_kenmerk_key6) || '=' || SUBSTR (v_ins_kenmerkwaarde6, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key7, NULL, v_ins_kenmerkwaarde7, TO_CHAR (v_ins_kenmerk_key7) || '=' || SUBSTR (v_ins_kenmerkwaarde7, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key8, NULL, v_ins_kenmerkwaarde8, TO_CHAR (v_ins_kenmerk_key8) || '=' || SUBSTR (v_ins_kenmerkwaarde8, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key9, NULL, v_ins_kenmerkwaarde9, TO_CHAR (v_ins_kenmerk_key9) || '=' || SUBSTR (v_ins_kenmerkwaarde9, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key10, NULL, v_ins_kenmerkwaarde10, TO_CHAR (v_ins_kenmerk_key10) || '=' || SUBSTR (v_ins_kenmerkwaarde10, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key11, NULL, v_ins_kenmerkwaarde11, TO_CHAR (v_ins_kenmerk_key11) || '=' || SUBSTR (v_ins_kenmerkwaarde11, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key12, NULL, v_ins_kenmerkwaarde12, TO_CHAR (v_ins_kenmerk_key12) || '=' || SUBSTR (v_ins_kenmerkwaarde12, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key13, NULL, v_ins_kenmerkwaarde13, TO_CHAR (v_ins_kenmerk_key13) || '=' || SUBSTR (v_ins_kenmerkwaarde13, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key14, NULL, v_ins_kenmerkwaarde14, TO_CHAR (v_ins_kenmerk_key14) || '=' || SUBSTR (v_ins_kenmerkwaarde14, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key15, NULL, v_ins_kenmerkwaarde15, TO_CHAR (v_ins_kenmerk_key15) || '=' || SUBSTR (v_ins_kenmerkwaarde15, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key16, NULL, v_ins_kenmerkwaarde16, TO_CHAR (v_ins_kenmerk_key16) || '=' || SUBSTR (v_ins_kenmerkwaarde16, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key17, NULL, v_ins_kenmerkwaarde17, TO_CHAR (v_ins_kenmerk_key17) || '=' || SUBSTR (v_ins_kenmerkwaarde17, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key18, NULL, v_ins_kenmerkwaarde18, TO_CHAR (v_ins_kenmerk_key18) || '=' || SUBSTR (v_ins_kenmerkwaarde18, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key19, NULL, v_ins_kenmerkwaarde19, TO_CHAR (v_ins_kenmerk_key19) || '=' || SUBSTR (v_ins_kenmerkwaarde19, 1, 3900)),
                                 DECODE (v_ins_kenmerk_key20, NULL, v_ins_kenmerkwaarde20, TO_CHAR (v_ins_kenmerk_key20) || '=' || SUBSTR (v_ins_kenmerkwaarde20, 1, 3900)),
                                 v_ins_deel_aanmaak_d,
                                 v_ins_deel_vervaldatum_d,
                                 v_ins_deel_aantal_n,
                                 v_ins_deel_externnr
                             );

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

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

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=
            v_errormsg
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Inleesproces objecten afgebroken! regel:' || v_file_index);
END fac_import_ins;
/


CREATE OR REPLACE PROCEDURE fac_update_ins (p_import_key IN NUMBER)
AS
    v_errormsg       VARCHAR2 (1000) := '-';
    oracle_err_num   NUMBER;
    oracle_err_mes   VARCHAR2 (200);
    v_aanduiding     VARCHAR2 (200);

    -- SUBPROC
    PROCEDURE add_kostensoort (p_import_key IN NUMBER)
    AS
        CURSOR c1
        IS
              SELECT prs_kostensoort_upper,
                     MAX (prs_kostensoort_omschrijving) prs_kostensoort_omschrijving
                FROM (  SELECT UPPER (ins_discipline_kostensoort) prs_kostensoort_upper,
                               MAX (ins_discipline_kostensoort) prs_kostensoort_omschrijving
                          FROM fac_imp_ins
                         WHERE ins_discipline_kostensoort IS NOT NULL
                      GROUP BY UPPER (ins_discipline_kostensoort)
                      UNION ALL
                        SELECT UPPER (res_discipline_kostensoort) prs_kostensoort_upper,
                               MAX (res_discipline_kostensoort) prs_kostensoort_omschrijving
                          FROM fac_imp_ins
                         WHERE reserveerbaar = 1 AND res_discipline_kostensoort IS NOT NULL
                      GROUP BY UPPER (res_discipline_kostensoort))
            GROUP BY prs_kostensoort_upper;

        v_kostensoort_key   NUMBER (10);
        ccount              NUMBER (10);
        v_count_tot         NUMBER (10);
        v_count_update      NUMBER (10);
    BEGIN
        v_count_tot := 0;
        v_count_update := 0;

        FOR rec IN c1
        LOOP
            BEGIN
                v_count_tot := v_count_tot + 1;
                v_errormsg :=
                    'Fout bij toevoegen kostensoort [' || rec.prs_kostensoort_omschrijving || ']';

                SELECT COUNT ( * )
                  INTO ccount
                  FROM prs_kostensoort
                 WHERE TRIM (prs_kostensoort_upper) = rec.prs_kostensoort_upper;

                IF ccount = 0
                THEN
                    INSERT INTO prs_kostensoort (prs_kostensoort_oms)
                        VALUES (rec.prs_kostensoort_omschrijving);

                    v_count_update := v_count_update + 1;
                END IF;

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

        fac.imp_writelog (p_import_key,
                          'S',
                          'Kostensoorten/aantal ingelezen: ' || TO_CHAR (v_count_tot),
                          '');
        fac.imp_writelog (p_import_key,
                          'S',
                          'Kostensoorten/aantal toegevoegd: ' || TO_CHAR (v_count_update),
                          '');
        COMMIT;
    END;

    -- SUBPROC
    PROCEDURE add_insdiscipline (p_import_key IN NUMBER)
    AS
        CURSOR c1
        IS
              SELECT UPPER (ins_discipline_omschrijving) ins_discipline_upper,
                     UPPER (ins_discipline_kostensoort) ins_kostensoort_upper,
                     MAX (ins_discipline_omschrijving) ins_discipline_omschrijving
                FROM fac_imp_ins
            GROUP BY UPPER (ins_discipline_omschrijving), UPPER (ins_discipline_kostensoort);

        v_discipline_key    NUMBER (10);
        v_kostensoort_key   NUMBER (10);
        ccount              NUMBER (10);
        v_count_tot         NUMBER (10);
        v_count_update      NUMBER (10);
    BEGIN
        v_count_tot := 0;
        v_count_update := 0;

        FOR rec IN c1
        LOOP
            BEGIN
                v_count_tot := v_count_tot + 1;
                v_errormsg :=
                    'Fout bij toevoegen INS-discipline [' || rec.ins_discipline_omschrijving || ']';

                SELECT COUNT ( * )
                  INTO ccount
                  FROM ins_tab_discipline
                 WHERE     ins_discipline_verwijder IS NULL
                       AND ins_discipline_module = 'INS'
                       AND UPPER (TRIM (ins_discipline_omschrijving)) = rec.ins_discipline_upper;

                IF ccount = 0
                THEN
                    IF rec.ins_kostensoort_upper IS NULL
                    THEN
                        v_kostensoort_key := NULL;
                    ELSE
                        SELECT prs_kostensoort_key
                          INTO v_kostensoort_key
                          FROM prs_kostensoort
                         WHERE TRIM (prs_kostensoort_upper) = rec.ins_kostensoort_upper;
                    END IF;

                    INSERT INTO ins_tab_discipline (ins_discipline_module,
                                                    ins_discipline_omschrijving,
                                                    ins_discipline_min_level,
                                                    ins_discipline_kpnverplicht,
                                                    prs_kostensoort_key)
                        VALUES ('INS',
                                SUBSTR (rec.ins_discipline_omschrijving, 1, 60),
                                1,
                                0,
                                v_kostensoort_key)
                      RETURNING ins_discipline_key
                           INTO v_discipline_key;

                    INSERT INTO ins_disc_params (ins_discipline_key, ins_disc_params_type)
                        VALUES (v_discipline_key, 0);

                    v_count_update := v_count_update + 1;
                END IF;

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

        fac.imp_writelog (p_import_key,
                          'S',
                          'INS-Disciplines/aantal ingelezen: ' || TO_CHAR (v_count_tot),
                          '');
        fac.imp_writelog (p_import_key,
                          'S',
                          'INS-Disciplines/aantal toegevoegd: ' || TO_CHAR (v_count_update),
                          '');
        COMMIT;
    END;

    -- SUBPROC
    PROCEDURE add_resdiscipline (p_import_key IN NUMBER)
    AS
        CURSOR c1
        IS
              SELECT TO_NUMBER(res_discipline_type) res_discipline_type,
                     UPPER (res_discipline_omschrijving) res_discipline_upper,
                     UPPER (res_discipline_kostensoort) res_kostensoort_upper,
                     MAX (res_discipline_omschrijving) res_discipline_omschrijving
                FROM fac_imp_ins
               WHERE reserveerbaar = 1
            GROUP BY UPPER (res_discipline_omschrijving), UPPER (res_discipline_kostensoort), TO_NUMBER(res_discipline_type);

        v_discipline_key    NUMBER (10);
        v_kostensoort_key   NUMBER (10);
        ccount              NUMBER (10);
        v_count_tot         NUMBER (10);
        v_count_update      NUMBER (10);
    BEGIN
        v_count_tot := 0;
        v_count_update := 0;

        FOR rec IN c1
        LOOP
            BEGIN
                v_count_tot := v_count_tot + 1;
                v_errormsg :=
                    'Fout bij toevoegen RES-discipline [' || rec.res_discipline_omschrijving || ']';

                SELECT COUNT ( * )
                  INTO ccount
                  FROM ins_tab_discipline
                 WHERE     ins_discipline_verwijder IS NULL
                       AND ins_discipline_module = 'RES'
                       AND UPPER (TRIM (ins_discipline_omschrijving)) = rec.res_discipline_upper;

                IF ccount = 0
                THEN
                    IF rec.res_kostensoort_upper IS NULL
                    THEN
                        v_kostensoort_key := NULL;
                    ELSE
                        SELECT prs_kostensoort_key
                          INTO v_kostensoort_key
                          FROM prs_kostensoort
                         WHERE TRIM (prs_kostensoort_upper) = rec.res_kostensoort_upper;
                    END IF;

                    INSERT INTO ins_tab_discipline (ins_discipline_module,
                                                    ins_discipline_omschrijving,
                                                    ins_discipline_min_level,
                                                    ins_discipline_kpnverplicht,
                                                    prs_kostensoort_key)
                        VALUES ('RES',
                                SUBSTR (rec.res_discipline_omschrijving, 1, 60),
                                COALESCE(rec.res_discipline_type, 1),
                                0,
                                v_kostensoort_key)
                    RETURNING ins_discipline_key
                         INTO v_discipline_key;

                    INSERT INTO res_disc_params (res_ins_discipline_key)
                        VALUES (v_discipline_key);

                    v_count_update := v_count_update + 1;
                END IF;

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

        fac.imp_writelog (p_import_key,
                          'S',
                          'RES-Disciplines/aantal ingelezen: ' || TO_CHAR (v_count_tot),
                          '');
        fac.imp_writelog (p_import_key,
                          'S',
                          'RES-Disciplines/aantal toegevoegd: ' || TO_CHAR (v_count_update),
                          '');
        COMMIT;
    END;

    -- SUBPROC
    PROCEDURE add_srtgroep (p_import_key IN NUMBER)
    AS
        CURSOR c1
        IS
              SELECT UPPER (ins_discipline_omschrijving) ins_discipline_upper,
                     UPPER (ins_srtgroep_omschrijving) ins_srtgroep_upper,
                     MAX (ins_discipline_omschrijving) ins_discipline_omschrijving,
                     MAX (ins_srtgroep_omschrijving) ins_srtgroep_omschrijving
                FROM fac_imp_ins
            GROUP BY UPPER (ins_discipline_omschrijving), UPPER (ins_srtgroep_omschrijving);

        v_discipline_key   NUMBER (10);
        ccount             NUMBER (10);
        v_count_tot        NUMBER (10);
        v_count_update     NUMBER (10);
    BEGIN
        v_count_tot := 0;
        v_count_update := 0;

        FOR rec IN c1
        LOOP
            BEGIN
                v_count_tot := v_count_tot + 1;
                v_errormsg := 'Fout bij bepalen discipline';

                SELECT ins_discipline_key
                  INTO v_discipline_key
                  FROM ins_tab_discipline
                 WHERE     ins_discipline_verwijder IS NULL
                       AND ins_discipline_module = 'INS'
                       AND UPPER (TRIM (ins_discipline_omschrijving)) = rec.ins_discipline_upper;

                v_errormsg :=
                    'Fout bij toevoegen groepsoort [' || rec.ins_srtgroep_omschrijving || '] ';

                SELECT COUNT ( * )
                  INTO ccount
                  FROM ins_srtgroep
                 WHERE     ins_srtgroep_verwijder IS NULL
                       AND ins_srtgroep_module = 'INS'
                       AND ins_discipline_key = v_discipline_key
                       AND TRIM (ins_srtgroep_upper) = rec.ins_srtgroep_upper;

                IF ccount = 0
                THEN
                    INSERT INTO ins_srtgroep (ins_discipline_key,
                                              ins_srtgroep_module,
                                              ins_srtgroep_omschrijving)
                        VALUES (v_discipline_key,
                                'INS',
                                SUBSTR (TRIM (rec.ins_srtgroep_omschrijving), 1, 60));

                    v_count_update := v_count_update + 1;
                END IF;

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

        fac.imp_writelog (p_import_key,
                          'S',
                          'Groepsoorten/aantal ingelezen: ' || TO_CHAR (v_count_tot),
                          '');
        fac.imp_writelog (p_import_key,
                          'S',
                          'Groepsoorten/aantal toegevoegd: ' || TO_CHAR (v_count_update),
                          '');
        COMMIT;
    END;

    -- SUBPROC
    PROCEDURE add_srtdeel (p_import_key IN NUMBER)
    AS
        CURSOR c1
        IS
              SELECT UPPER (ins_discipline_omschrijving) ins_discipline_upper,
                     UPPER (ins_srtgroep_omschrijving) ins_srtgroep_upper,
                     UPPER (ins_srtdeel_code) ins_srtdeel_code_upper,
                     UPPER (ins_srtdeel_omschrijving) ins_srtdeel_upper,
                     MAX (ins_discipline_omschrijving) ins_discipline_omschrijving,
                     MAX (ins_srtgroep_omschrijving) ins_srtgroep_omschrijving,
                     MAX (ins_srtdeel_code) ins_srtdeel_code,
                     MAX (ins_srtdeel_omschrijving) ins_srtdeel_omschrijving
                FROM fac_imp_ins
            GROUP BY UPPER (ins_discipline_omschrijving),
                     UPPER (ins_srtgroep_omschrijving),
                     UPPER (ins_srtdeel_code),
                     UPPER (ins_srtdeel_omschrijving);

        v_discipline_key   NUMBER (10);
        v_srtgroep_key     NUMBER (10);
        ccount             NUMBER (10);
        v_count_tot        NUMBER (10);
        v_count_update     NUMBER (10);
    BEGIN
        v_count_tot := 0;
        v_count_update := 0;

        FOR rec IN c1
        LOOP
            BEGIN
                v_count_tot := v_count_tot + 1;
                v_errormsg := 'Fout bij bepalen discipline';

                SELECT ins_discipline_key
                  INTO v_discipline_key
                  FROM ins_tab_discipline
                 WHERE     ins_discipline_verwijder IS NULL
                       AND ins_discipline_module = 'INS'
                       AND UPPER (TRIM (ins_discipline_omschrijving)) = rec.ins_discipline_upper;

                v_errormsg := 'Fout bij bepalen groepsoort';

                SELECT ins_srtgroep_key
                  INTO v_srtgroep_key
                  FROM ins_srtgroep
                 WHERE     ins_srtgroep_verwijder IS NULL
                       AND ins_srtgroep_module = 'INS'
                       AND ins_discipline_key = v_discipline_key
                       AND TRIM (ins_srtgroep_upper) = rec.ins_srtgroep_upper;

                v_errormsg :=
                    'Fout bij toevoegen objectsoort [' || rec.ins_srtdeel_omschrijving || ']';

                SELECT COUNT ( * )
                  INTO ccount
                  FROM ins_srtdeel
                 WHERE     ins_srtdeel_verwijder IS NULL
                       AND ins_srtdeel_module = 'INS'
                       AND ins_srtgroep_key = v_srtgroep_key
                       AND TRIM (ins_srtdeel_upper) = rec.ins_srtdeel_upper;

                IF ccount = 0
                THEN
                    -- binding 17 betekent ruimtegebonden of persoonsgebonden
                    INSERT INTO ins_srtdeel (ins_srtgroep_key,
                                             ins_srtdeel_module,
                                             ins_srtdeel_code,
                                             ins_srtdeel_omschrijving,
                                             ins_srtdeel_binding)
                        VALUES (v_srtgroep_key,
                                'INS',
                                rec.ins_srtdeel_code,
                                rec.ins_srtdeel_omschrijving,
                                17);

                    v_count_update := v_count_update + 1;
                END IF;

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

        fac.imp_writelog (p_import_key,
                          'S',
                          'Objectsoorten/aantal ingelezen: ' || TO_CHAR (v_count_tot),
                          '');
        fac.imp_writelog (p_import_key,
                          'S',
                          'Objectsoorten/aantal toegevoegd: ' || TO_CHAR (v_count_update),
                          '');
        COMMIT;
    END;

    -- SUBPROC
    -- p_kenmerkwaarde = 'Parkeercode|1=37-ZB-DR'. Ofwel: kenmerk_omschrijving|groep=waarde.
    -- p_kenmerkwaarde = '234|1=37-ZB-DR'.         Ofwel: kenmerk_key|groep=waarde.
    PROCEDURE upsert_inskenmerk (p_deel_key      IN NUMBER,
                                 p_kenmerkwaarde IN VARCHAR2)
    AS
        v_kenmerk_key      NUMBER;
        v_srtkenmerk_key   NUMBER;
        v_groep            NUMBER;
        v_kenmerk          VARCHAR2 (50);
        v_waarde           VARCHAR2 (4053);
        v_srtkenmerk_type  ins_srtkenmerk.ins_srtkenmerk_kenmerktype%TYPE;
        ccount             NUMBER;
        v_objectnaam       fac_kenmerkdomein.fac_kenmerkdomein_objectnaam%TYPE;
        v_kolomnaam        fac_kenmerkdomein.fac_kenmerkdomein_kolomnaam%TYPE;
        v_kolomtxt         fac_kenmerkdomein.fac_kenmerkdomein_kolomtxt%TYPE;
        sql_stmt           VARCHAR2 (1000);
        v_kenmerkdeel_key  NUMBER;
        l_cursor_1         INTEGER;
        l_rowsprocessed    NUMBER DEFAULT 0;
    BEGIN
        IF p_kenmerkwaarde IS NOT NULL
        THEN
            v_errormsg := 'Fout bij bepalen kenmerk [' || p_kenmerkwaarde || ']';

            v_kenmerk := SUBSTR (p_kenmerkwaarde, 1, INSTR (p_kenmerkwaarde, '|') - 1);
            v_groep := fac.safe_to_number (
                       SUBSTR (p_kenmerkwaarde,
                                INSTR (p_kenmerkwaarde, '|') + 1,
                                INSTR (p_kenmerkwaarde, '=') - 1 - INSTR (p_kenmerkwaarde, '|')));
            v_waarde := SUBSTR (p_kenmerkwaarde, INSTR (p_kenmerkwaarde, '=') + 1);

            IF fac.safe_to_number (v_kenmerk) IS NULL
            THEN
               -- Er kunnen drie kenmerken met dezelfde omschrijving gedefinieerd worden voor een object,
               -- namenlijk op drie niveaus discipline (D), 0bjectgroep (G) en objectsoort (S).
               -- Bij meerdere dezelfde kenmerken nemen we het kenmerk met de laagste volgnummer.
               SELECT ins_kenmerk_key,
                      ins_srtkenmerk_key,
                      ins_srtkenmerk_kenmerktype
                 INTO v_kenmerk_key,
                      v_srtkenmerk_key,
                      v_srtkenmerk_type
                 FROM (  SELECT k.ins_kenmerk_key,
                                sk.ins_srtkenmerk_key,
                                sk.ins_srtkenmerk_kenmerktype,
                                k.ins_kenmerk_volgnummer
                           FROM ins_deel d,
                                ins_srtdeel sd,
                                ins_srtgroep sg,
                                ins_v_aanwezigkenmerk k,
                                ins_v_aanwezigsrtkenmerk sk
                          WHERE d.ins_deel_key = p_deel_key
                            AND d.ins_srtdeel_key = sd.ins_srtdeel_key
                            AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
                            AND k.ins_srtkenmerk_key = sk.ins_srtkenmerk_key
                            AND k.ins_kenmerk_groep = v_groep
                            AND ((k.ins_srtinstallatie_key = sd.ins_srtdeel_key
                              AND k.ins_kenmerk_niveau = 'S')
                              OR (k.ins_srtinstallatie_key = sg.ins_srtgroep_key
                              AND k.ins_kenmerk_niveau = 'G')
                              OR (k.ins_srtinstallatie_key = sg.ins_discipline_key
                              AND k.ins_kenmerk_niveau = 'D'))
                            AND COALESCE(UPPER(k.ins_kenmerk_omschrijving), sk.ins_srtkenmerk_upper) = UPPER(v_kenmerk)
                            AND sk.ins_srtkenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B', 'V')
                       ORDER BY k.ins_kenmerk_volgnummer)
                WHERE ROWNUM = 1;
            ELSE
                 SELECT k.ins_kenmerk_key,
                        sk.ins_srtkenmerk_key,
                        sk.ins_srtkenmerk_kenmerktype
                   INTO v_kenmerk_key,
                        v_srtkenmerk_key,
                        v_srtkenmerk_type
                   FROM ins_v_aanwezigkenmerk k,
                        ins_v_aanwezigsrtkenmerk sk
                  WHERE k.ins_srtkenmerk_key = sk.ins_srtkenmerk_key
                    AND k.ins_kenmerk_groep = v_groep
                    AND k.ins_kenmerk_key = v_kenmerk
                    AND sk.ins_srtkenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B', 'V')
               ORDER BY k.ins_kenmerk_volgnummer;
            END IF;

            IF v_waarde IS NOT NULL
            THEN
                IF v_srtkenmerk_type IN ('R', 'S')
                THEN
                    v_errormsg := 'Fout bij bepalen eigen tabel';

                    SELECT COUNT (*)
                      INTO ccount
                      FROM ins_srtkenmerk sk,
                           fac_kenmerkdomein d
                     WHERE sk.ins_srtkenmerk_key = v_srtkenmerk_key
                       AND sk.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key
                       AND d.fac_usrtab_key IS NOT NULL;

                    v_errormsg := 'Fout bij bepalen nieuwe waarde [' || v_waarde || ']';

                    IF ccount = 1
                    THEN                                                                  -- Eigen tabel
                        SELECT TO_CHAR (ud.fac_usrdata_key)
                          INTO v_waarde
                          FROM ins_srtkenmerk sk,
                               fac_kenmerkdomein d,
                               fac_v_aanwezigusrdata ud
                         WHERE sk.ins_srtkenmerk_key = v_srtkenmerk_key
                           AND sk.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key
                           AND d.fac_usrtab_key = ud.fac_usrtab_key
                           AND UPPER (TRIM (ud.fac_usrdata_omschr)) = UPPER (v_waarde);
                    ELSE                                                         -- FACILITOR view/tabel
                        SELECT d.fac_kenmerkdomein_objectnaam,
                               d.fac_kenmerkdomein_kolomnaam,
                               d.fac_kenmerkdomein_kolomtxt
                          INTO v_objectnaam,
                               v_kolomnaam,
                               v_kolomtxt
                          FROM ins_srtkenmerk sk,
                               fac_kenmerkdomein d
                         WHERE sk.ins_srtkenmerk_key = v_srtkenmerk_key
                           AND sk.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key
                           AND d.fac_usrtab_key IS NULL;

                        sql_stmt :=
                               'SELECT MAX ('
                            || v_kolomnaam
                            || ') FROM '
                            || v_objectnaam
                            || ' WHERE UPPER (TRIM ('
                            || v_kolomtxt
                            || ')) = UPPER (:pwaarde)';
                       l_cursor_1 := DBMS_SQL.open_cursor;
                       DBMS_SQL.parse (l_cursor_1, sql_stmt, DBMS_SQL.native);
                       DBMS_SQL.BIND_VARIABLE(l_cursor_1,':pwaarde', v_waarde);
                       DBMS_SQL.define_column(l_cursor_1, 1, v_waarde, 255);
                       l_rowsprocessed := DBMS_SQL.execute_and_fetch (l_cursor_1);
                       DBMS_SQL.column_value (l_cursor_1, 1, v_waarde);
                       DBMS_SQL.close_cursor(l_cursor_1);
                    END IF;
                ELSE                                 -- C(Karakter)/D(Datum)/N(Numeriek)/X(Bestandsnaam)
                    NULL; -- v_waarde := p_waarde;
                END IF;

                v_errormsg := 'Fout bij bepalen huidige waarde';

                SELECT COUNT (*),
                       MAX (ins_kenmerkdeel_key)
                  INTO ccount,
                       v_kenmerkdeel_key
                  FROM ins_v_aanwezigkenmerkdeel
                 WHERE ins_deel_key = p_deel_key
                   AND ins_kenmerk_key = v_kenmerk_key;

                IF v_srtkenmerk_type = 'N'  -- Alleen voor numerieke waarden de decimale komma vervangen door punt.
                THEN
                    v_waarde := REPLACE (v_waarde, ',', '.');
                END IF;

                IF ccount = 0
                THEN
                    v_errormsg := 'Fout bij toevoegen waarde [' || v_waarde || ']';

                    INSERT INTO ins_kenmerkdeel (ins_deel_key,
                                                 ins_kenmerk_key,
                                                 ins_kenmerkdeel_waarde)
                         VALUES (p_deel_key,
                                 v_kenmerk_key,
                                 v_waarde);
                ELSE
                    v_errormsg := 'Fout bij bijwerken waarde [' || v_waarde || ']';

                    UPDATE ins_kenmerkdeel
                       SET ins_kenmerkdeel_waarde = v_waarde
                     WHERE ins_kenmerkdeel_key = v_kenmerkdeel_key;
                END IF;
            ELSE
                -- Verwijder kenmerken die al bestaan maar met de nieuwe import leeg zijn.
                DELETE ins_kenmerkdeel
                 WHERE ins_kenmerk_key = v_kenmerk_key
                   AND ins_deel_key = p_deel_key;
            END IF;
        END IF;
    EXCEPTION
        WHEN OTHERS
        THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=
                v_errormsg || ' (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
            fac.imp_writelog (p_import_key,
                              'W',
                              v_aanduiding || v_errormsg,
                              'upsert_inskenmerk');
    END;

    -- SUBPROC
    PROCEDURE add_deel (p_import_key IN NUMBER)
    AS
        CURSOR c1
        IS
            SELECT ins_discipline_omschrijving,
                   ins_srtgroep_omschrijving,
                   ins_srtdeel_code,
                   ins_srtdeel_omschrijving,
                   ins_deel_omschrijving,
                   ins_deel_opmerking,
                   alg_locatie_code,
                   alg_gebouw_code,
                   alg_verdieping_volgnr,
                   alg_ruimte_nr,
                   reserveerbaar,
                   res_discipline_omschrijving,
                   res_deel_eenheid,
                   res_deel_prijs,
                   res_deel_alg_level,
                   prs_perslid_matchcode,
                   prs_perslid_matchwaarde,
                   ins_kenmerkwaarde1,
                   ins_kenmerkwaarde2,
                   ins_kenmerkwaarde3,
                   ins_kenmerkwaarde4,
                   ins_kenmerkwaarde5,
                   ins_kenmerkwaarde6,
                   ins_kenmerkwaarde7,
                   ins_kenmerkwaarde8,
                   ins_kenmerkwaarde9,
                   ins_kenmerkwaarde10,
                   ins_kenmerkwaarde11,
                   ins_kenmerkwaarde12,
                   ins_kenmerkwaarde13,
                   ins_kenmerkwaarde14,
                   ins_kenmerkwaarde15,
                   ins_kenmerkwaarde16,
                   ins_kenmerkwaarde17,
                   ins_kenmerkwaarde18,
                   ins_kenmerkwaarde19,
                   ins_kenmerkwaarde20,
                   ins_deel_aanmaak,
                   ins_deel_vervaldatum,
                   ins_deel_aantal,
                   ins_deel_externnr
              FROM fac_imp_ins;

        v_discipline_key    NUMBER (10);
        v_rdiscipline_key   NUMBER (10);
        v_srtgroep_key      NUMBER (10);
        v_srtdeel_key       NUMBER (10);
        v_locatie_key       NUMBER (10);
        v_gebouw_key        NUMBER (10);
        v_verdieping_key    NUMBER (10);
        v_ruimte_key        NUMBER (10);
        v_matchkolom        VARCHAR2 (255);
        sql_stmt            VARCHAR2 (1000);
        v_ruimte_type       VARCHAR2 (10);
        v_deel_key          NUMBER (10);
        ccount              NUMBER (10);
        pcount              NUMBER (10);
        v_count_tot         NUMBER (10);
        v_count_insnew      NUMBER (10);
        v_count_insupd      NUMBER (10);
        v_count_resnew      NUMBER (10);
        v_srtnoti_code      VARCHAR2 (6);
        l_cursor_1          INTEGER;
        l_rowsprocessed     NUMBER DEFAULT 0;
        v_ins_deel_aanmaak_d     DATE;
        v_ins_deel_vervaldatum_d DATE;
        v_ins_deel_aantal_n      NUMBER(8,2);
        v_ins_deel_externnr      VARCHAR2(255);
    BEGIN
        v_count_tot := 0;
        v_count_insnew := 0;
        v_count_insupd := 0;
        v_count_resnew := 0;
        v_aanduiding := '';

        FOR rec IN c1
        LOOP
            BEGIN
                v_count_tot := v_count_tot + 1;
                v_ins_deel_aanmaak_d := rec.ins_deel_aanmaak;
                v_ins_deel_vervaldatum_d := rec.ins_deel_vervaldatum;
                v_ins_deel_aantal_n := rec.ins_deel_aantal;
                v_ins_deel_externnr := rec.ins_deel_externnr;
                v_aanduiding :=
                       '['
                    || rec.ins_discipline_omschrijving
                    || '|'
                    || rec.ins_srtgroep_omschrijving
                    || '|'
                    || rec.ins_srtdeel_code
                    || '|'
                    || rec.ins_srtdeel_omschrijving
                    || '|'
                    || rec.ins_deel_omschrijving
                    || '] ';
                v_errormsg := 'Fout bij bepalen discipline';

                SELECT ins_discipline_key
                  INTO v_discipline_key
                  FROM ins_tab_discipline
                 WHERE ins_discipline_verwijder IS NULL AND ins_discipline_module = 'INS'
                       AND UPPER (TRIM (ins_discipline_omschrijving)) =
                              UPPER (rec.ins_discipline_omschrijving);

                v_errormsg := 'Fout bij bepalen groepsoort';

                SELECT ins_srtgroep_key
                  INTO v_srtgroep_key
                  FROM ins_srtgroep
                 WHERE     ins_srtgroep_verwijder IS NULL
                       AND ins_srtgroep_module = 'INS'
                       AND ins_discipline_key = v_discipline_key
                       AND TRIM (ins_srtgroep_upper) = UPPER (rec.ins_srtgroep_omschrijving);

                v_errormsg := 'Fout bij bepalen objectsoort';

                SELECT ins_srtdeel_key
                  INTO v_srtdeel_key
                  FROM ins_srtdeel
                 WHERE     ins_srtdeel_verwijder IS NULL
                       AND ins_srtdeel_module = 'INS'
                       AND ins_srtgroep_key = v_srtgroep_key
                       AND TRIM (UPPER(ins_srtdeel_code)) = UPPER (rec.ins_srtdeel_code)
                       AND TRIM (ins_srtdeel_upper) = UPPER (rec.ins_srtdeel_omschrijving);

                v_locatie_key := NULL;

                IF rec.alg_locatie_code IS NOT NULL
                THEN                                                        -- ruimtegebonden object
                    v_errormsg := 'Fout bij bepalen locatie [' || rec.alg_locatie_code || ']';

                    SELECT alg_locatie_key
                      INTO v_locatie_key
                      FROM alg_v_aanweziglocatie
                     WHERE UPPER (TRIM (alg_locatie_code)) = UPPER (rec.alg_locatie_code);

                    v_errormsg := 'Fout bij bepalen gebouw [' || rec.alg_gebouw_code || ']';

                    SELECT alg_gebouw_key
                      INTO v_gebouw_key
                      FROM alg_v_aanweziggebouw
                     WHERE alg_locatie_key = v_locatie_key
                           AND UPPER (TRIM (alg_gebouw_code)) = UPPER (rec.alg_gebouw_code);

                    v_errormsg :=
                        'Fout bij bepalen verdieping [' || rec.alg_verdieping_volgnr || ']';

                    SELECT alg_verdieping_key
                      INTO v_verdieping_key
                      FROM alg_v_aanwezigverdieping
                     WHERE alg_gebouw_key = v_gebouw_key
                           AND alg_verdieping_volgnr = rec.alg_verdieping_volgnr;

                    v_errormsg := 'Fout bij bepalen ruimte [' || rec.alg_ruimte_nr || ']';

                    SELECT alg_ruimte_key
                      INTO v_ruimte_key
                      FROM alg_v_aanwezigruimte
                     WHERE alg_verdieping_key = v_verdieping_key
                           AND TRIM (alg_ruimte_upper_nr) = UPPER (rec.alg_ruimte_nr);

                    v_ruimte_type := 'R';

                    -- ruimtegebonden objecten hebben een unieke ID binnen locatie
                    SELECT COUNT ( * )
                      INTO ccount
                      FROM ins_v_aanwezigdeel
                     WHERE ins_deel_module = 'INS'
                       AND ins_srtdeel_key = v_srtdeel_key
                       AND ins_alg_ruimte_type = v_ruimte_type                              -- R
                       AND ins_alg_locatie_key = v_locatie_key
                       AND TRIM (ins_deel_upper) = UPPER (rec.ins_deel_omschrijving);
                ELSE                                                      -- persoonsgebonden object
                    v_matchkolom := '';

                    CASE rec.prs_perslid_matchcode
                        WHEN '1'
                        THEN
                            v_matchkolom := 'PRS_PERSLID_EMAIL';
                        WHEN '10'
                        THEN
                            v_matchkolom := 'PRS_PERSLID_EMAIL';
                        WHEN '2'
                        THEN
                            v_matchkolom := 'PRS_PERSLID_OSLOGIN';
                        WHEN '20'
                        THEN
                            v_matchkolom := 'PRS_PERSLID_OSLOGIN';
                        WHEN '3'
                        THEN
                            v_matchkolom := 'PRS_PERSLID_KEY';
                        WHEN '30'
                        THEN
                            v_matchkolom := 'PRS_PERSLID_KEY';
                        WHEN '4'
                        THEN
                            v_matchkolom := 'PRS_PERSLID_NR';
                        WHEN '40'
                        THEN
                            v_matchkolom := 'PRS_PERSLID_NR';
                        WHEN '5'
                        THEN
                            v_matchkolom := 'PRS_PERSLID_VOORNAAM || '' '' || PRS_PERSLID_NAAM';
                        WHEN '50'
                        THEN
                            v_matchkolom := 'PRS_PERSLID_VOORNAAM || '' '' || PRS_PERSLID_NAAM';
                        ELSE
                            -- voor developers only: indien geen code wordt gebruikt,
                            -- kan als persoonmatchcode een kolom uit de perslid-tabel
                            -- worden ingevoerd, bijvoorbeeld: prs_perslid_oslogin2
                            v_matchkolom := rec.prs_perslid_matchcode;
                    END CASE;

                    v_errormsg := 'Fout bij bepalen persoon [' || rec.prs_perslid_matchwaarde || ']';
                    sql_stmt :=
                           'SELECT MIN (prs_perslid_key), COUNT (prs_perslid_key) '
                        || '  FROM prs_v_aanwezigperslid '
                        || ' WHERE UPPER ('
                        || v_matchkolom
                        || ') = UPPER (:pwaarde) ';
                    --dbms_output.put_line(rec.prs_perslid_matchwaarde);
                    l_cursor_1 := DBMS_SQL.open_cursor;
                    DBMS_SQL.parse (l_cursor_1, sql_stmt, DBMS_SQL.native);
                    DBMS_SQL.BIND_VARIABLE(l_cursor_1,':pwaarde', rec.prs_perslid_matchwaarde);
                    DBMS_SQL.define_column(l_cursor_1, 1, v_ruimte_key);
                    DBMS_SQL.define_column(l_cursor_1, 2, pcount);
                    l_rowsprocessed := DBMS_SQL.execute_and_fetch (l_cursor_1);
                    -- Bij no rows gaat-ie naar de exception. Moet daar dan nog een cursor dicht??
                    DBMS_SQL.column_value (l_cursor_1, 1, v_ruimte_key);
                    DBMS_SQL.column_value (l_cursor_1, 2, pcount);
                    DBMS_SQL.close_cursor(l_cursor_1);
                    --dbms_output.put_line(pcount);

                    IF pcount != 1
                    THEN
                        fac.imp_writelog (p_import_key,
                                          'W',
                                          v_aanduiding || v_errormsg,
                                          'Kan persoon niet 1-duidig bepalen');
                    END IF;

                    v_errormsg := 'Fout bij bepalen type koppeling';

                    IF rec.prs_perslid_matchcode in ('10','20','30','40','50') THEN
                    v_ruimte_type := 'A' ;

                    -- Koppeling aan Afdeling van desbetreffende
                    SELECT prs_afdeling_key
                      INTO v_ruimte_key
                      FROM prs_v_aanwezigperslid
                      WHERE prs_perslid_key = v_ruimte_key;

                    ELSE
                    v_ruimte_type := 'P' ;
                    END IF;

                    -- persoonsgebonden objecten hebben een unieke ID
                    SELECT COUNT ( * )
                      INTO ccount
                      FROM ins_v_aanwezigdeel
                     WHERE     ins_deel_module = 'INS'
                           AND ins_srtdeel_key = v_srtdeel_key
                           AND ins_alg_ruimte_type = v_ruimte_type                              -- P
                           AND ins_alg_locatie_key IS NULL
                           AND TRIM (ins_deel_upper) = UPPER (rec.ins_deel_omschrijving);
                END IF;

                IF ccount = 0
                THEN                                                            -- toevoegen object!
                    v_errormsg := 'Fout bij toevoegen INS-object';

                    INSERT INTO ins_deel (ins_discipline_key,
                                          ins_srtdeel_key,
                                          ins_deel_module,
                                          ins_deel_omschrijving,
                                          ins_deel_opmerking,
                                          ins_alg_ruimte_key,
                                          ins_alg_ruimte_type,
                                          ins_alg_locatie_key,
                                          ins_deel_aanmaak,
                                          ins_deel_vervaldatum,
                                          ins_deel_aantal,
                                          ins_deel_externnr)
                        VALUES (v_discipline_key,
                                v_srtdeel_key,
                                'INS',
                                rec.ins_deel_omschrijving,
                                rec.ins_deel_opmerking,
                                v_ruimte_key,
                                v_ruimte_type,
                                v_locatie_key,
                                v_ins_deel_aanmaak_d,
                                v_ins_deel_vervaldatum_d,
                                v_ins_deel_aantal_n,
                                v_ins_deel_externnr)
                     RETURNING ins_deel_key
                          INTO v_deel_key;

                    -- Overslaan als reserveerbaar en geen RES-discipline of andersom,
                    -- dus verder geen controle op eventuele inconsistentie!
                    IF (rec.reserveerbaar = 1 AND rec.res_discipline_omschrijving IS NOT NULL)
                    THEN
                        v_errormsg :=
                               'Fout bij bepalen RES-discipline ['
                            || rec.res_discipline_omschrijving
                            || ']';

                        SELECT ins_discipline_key
                          INTO v_rdiscipline_key
                          FROM res_discipline
                         WHERE ins_discipline_verwijder IS NULL AND ins_discipline_module = 'RES'
                               AND UPPER (TRIM (ins_discipline_omschrijving)) =
                                      UPPER (rec.res_discipline_omschrijving);

                        v_errormsg := 'Fout bij toevoegen RES-object';

                        INSERT INTO res_deel (res_ins_deel_key,
                                              res_deel_omschrijving,
                                              res_deel_opmerking,
                                              res_deel_eenheid,
                                              res_deel_prijs,
                                              res_discipline_key,
                                              res_deel_alg_level)
                            VALUES (v_deel_key,
                                    rec.ins_deel_omschrijving,
                                    rec.ins_deel_opmerking,
                                    rec.res_deel_eenheid,
                                    rec.res_deel_prijs,
                                    v_rdiscipline_key,
                                    rec.res_deel_alg_level);

                        v_count_resnew := v_count_resnew + 1;
                    END IF;

                    v_srtnoti_code := 'INSNEW';
                    v_count_insnew := v_count_insnew + 1;
                ELSE                                                            -- bijwerken object!
                    v_errormsg := 'Fout bij bepalen INS-object';

                    SELECT ins_deel_key
                      INTO v_deel_key
                      FROM ins_v_aanwezigdeel
                     WHERE     ins_deel_module = 'INS'
                           AND ins_srtdeel_key = v_srtdeel_key
                           AND ins_alg_ruimte_type = v_ruimte_type                            -- R/P
                           AND COALESCE (ins_alg_locatie_key, -1) = COALESCE (v_locatie_key, -1) -- gevuld/NULL
                           AND TRIM (ins_deel_upper) = UPPER (rec.ins_deel_omschrijving);

                    v_srtnoti_code := 'INSUPD';
                    v_count_insupd := v_count_insupd + 1;
                END IF;

                -- NULL-waarden resulteren NIET in het wissen van kenmerkvelden
                -- (bijwerken kan wel, maar wissen dus niet)! ins_kenmerkwaarde1
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde1);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde2);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde3);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde4);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde5);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde6);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde7);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde8);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde9);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde10);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde11);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde12);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde13);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde14);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde15);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde16);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde17);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde18);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde19);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde20);

                fac.trackaction (v_srtnoti_code,
                                 v_deel_key,
                                 sys_context('USERENV', 'CLIENT_IDENTIFIER'),
                                 NULL,
                                 NULL);
                COMMIT;
            EXCEPTION
                WHEN OTHERS
                THEN
                    oracle_err_num := SQLCODE;
                    oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                    v_errormsg :=
                           v_errormsg
                        || ' (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                    fac.imp_writelog (p_import_key,
                                      'W',
                                      v_aanduiding || v_errormsg,
                                      '');
                    COMMIT;
            END;
        END LOOP;

        fac.imp_writelog (p_import_key,
                          'S',
                          'INS-objecten/aantal ingelezen: ' || TO_CHAR (v_count_tot),
                          '');
        fac.imp_writelog (p_import_key,
                          'S',
                          'INS-objecten/aantal toegevoegd: ' || TO_CHAR (v_count_insnew),
                          '');
        fac.imp_writelog (p_import_key,
                          'S',
                          'INS-objecten/aantal bijgewerkt: ' || TO_CHAR (v_count_insupd),
                          '');
        fac.imp_writelog (p_import_key,
                          'S',
                          'RES-objecten/aantal toegevoegd: ' || TO_CHAR (v_count_resnew),
                          '');
        COMMIT;
    END;
-- MAIN
BEGIN
    add_kostensoort (p_import_key);
    add_insdiscipline (p_import_key);
    add_resdiscipline (p_import_key);
    add_srtgroep (p_import_key);
    add_srtdeel (p_import_key);
    add_deel (p_import_key);
EXCEPTION
    WHEN OTHERS
    THEN
        oracle_err_num := SQLCODE;
        oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
        v_errormsg :=
            v_errormsg || ' (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
        fac.imp_writelog (p_import_key,
                          'E',
                          v_errormsg,
                          'Importproces objecten afgebroken!');
END fac_update_ins;
/

-- UWVA#22765 - SLE: Verfijning sleutelbeheer
CREATE OR REPLACE PROCEDURE fac_import_sle (p_import_key IN NUMBER)
IS
   c_delim                      VARCHAR2 (2) := fac.import_delimiter(p_import_key);
   v_newline                    fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
   v_errormsg                   VARCHAR2 (1000);
   oracle_err_num               NUMBER;
   oracle_err_mes               VARCHAR2 (200);
   header_is_valid              NUMBER;
   v_count_tot                  NUMBER (10);
   v_count_import               NUMBER (10);
   v_ongeldig                   NUMBER (1);
   v_aanduiding                 VARCHAR (200);
   -- De importvelden
   v_ins_srtdeel_code           VARCHAR2 (255);                         -- C10
   v_ins_srtdeel_omschrijving   VARCHAR2 (255);                        -- C100
   v_alg_locatie_code           VARCHAR2 (255);                         -- C10
   v_alg_gebouw_code            VARCHAR2 (255);                         -- C12
   v_alg_verdieping_code        VARCHAR2 (255);                         -- C10
   v_alg_ruimte_nr              VARCHAR2 (255);                         -- C20
   v_cil_gebouw_code            VARCHAR2 (255);                         -- C12
   v_cil_verdieping_code        VARCHAR2 (255);                         -- C10
   v_cil_ruimte_nr              VARCHAR2 (255);                         -- C10
   v_aant_sleutels_in_set       VARCHAR2 (255);                          -- N3
   v_aant_sleutels_in_set_n     NUMBER (3);                              -- N3
   v_ins_kenmerkwaarde1         VARCHAR2 (255);
   v_ins_kenmerkwaarde2         VARCHAR2 (255);
   v_ins_kenmerkwaarde3         VARCHAR2 (255);
   v_ins_kenmerkwaarde4         VARCHAR2 (255);
   v_ins_kenmerkwaarde5         VARCHAR2 (255);

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

   COMMIT;

   v_count_tot := 0;
   v_count_import := 0;
   header_is_valid := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout opvragen te importeren rij';
         v_aanduiding := '';
         v_ongeldig := 0;
         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_delim, v_ins_srtdeel_code);
         fac.imp_getfield (v_newline, c_delim, v_ins_srtdeel_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_alg_locatie_code);
         fac.imp_getfield (v_newline, c_delim, v_alg_gebouw_code);
         fac.imp_getfield (v_newline, c_delim, v_alg_verdieping_code);
         fac.imp_getfield (v_newline, c_delim, v_alg_ruimte_nr);
         fac.imp_getfield (v_newline, c_delim, v_cil_gebouw_code);
         fac.imp_getfield (v_newline, c_delim, v_cil_verdieping_code);
         fac.imp_getfield (v_newline, c_delim, v_cil_ruimte_nr);
         fac.imp_getfield (v_newline, c_delim, v_aant_sleutels_in_set);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde1);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde2);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde3);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde4);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde5);

         v_aanduiding :=
               '['
            || v_ins_srtdeel_code
            || '|'
            || v_ins_srtdeel_omschrijving
            || '|'
            || v_alg_locatie_code
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop.
         -- Ik controleer daarbij alleen alle CORE-kolommen, dus niet kenmerk1 t/m 5!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF UPPER (v_ins_srtdeel_code) = 'SLEUTELSETCODE'
               AND UPPER (v_ins_srtdeel_omschrijving) =
                     'SLEUTELSETOMSCHRIJVING'
               AND UPPER (v_alg_locatie_code) = 'LOCATIECODE'
               AND UPPER (v_alg_gebouw_code) = 'STAMGEBOUWCODE'
               AND UPPER (v_alg_verdieping_code) = 'STAMVERDIEPINGCODE'
               AND UPPER (v_alg_ruimte_nr) = 'STAMRUIMTENUMMER'
               AND UPPER (v_cil_gebouw_code) = 'GEBOUWCODE'
               AND UPPER (v_cil_verdieping_code) = 'VERDIEPINGCODE'
               AND UPPER (v_cil_ruimte_nr) = 'RUIMTENUMMER'
               AND UPPER (v_aant_sleutels_in_set) = 'AANTALEXEMPLAREN'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errormsg := 'Soortcode ongeldig';
            v_ins_srtdeel_code := TRIM (v_ins_srtdeel_code);

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

            --
            v_errormsg := 'Soortomschrijving ongeldig';
            v_ins_srtdeel_omschrijving := TRIM (v_ins_srtdeel_omschrijving);

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

            --
            v_errormsg := 'Locatiecode ongeldig';
            v_alg_locatie_code := TRIM (v_alg_locatie_code);

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

            --
            v_errormsg := 'Stamgebouwcode ongeldig';
            v_alg_gebouw_code := TRIM (v_alg_gebouw_code);

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

            --
            v_errormsg := 'Stamverdiepingcode ongeldig';
            v_alg_verdieping_code := TRIM (v_alg_verdieping_code);

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

            --
            v_errormsg := 'Stamruimtenummer ongeldig';
            v_alg_ruimte_nr := TRIM (v_alg_ruimte_nr);

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

            --
            v_errormsg := 'Gebouwcode/cilinder ongeldig';
            v_cil_gebouw_code := TRIM (v_cil_gebouw_code);

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

            --
            v_errormsg := 'Verdiepingcode/cilinder ongeldig';
            v_cil_verdieping_code := TRIM (v_cil_verdieping_code);

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

            --
            v_errormsg := 'Ruimtenummer/cilinder ongeldig';
            v_cil_ruimte_nr := TRIM (v_cil_ruimte_nr);

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

            --
            v_errormsg := 'Aantal exemplaren ongeldig';
            v_aant_sleutels_in_set := TRIM (v_aant_sleutels_in_set);

            IF (COALESCE (
                   LENGTH (
                      ROUND (fac.safe_to_number (v_aant_sleutels_in_set))
                   ),
                   10
                )) > 3
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Regel wordt overgeslagen!');
            ELSE
               v_aant_sleutels_in_set_n :=
                  ROUND (fac.safe_to_number (v_aant_sleutels_in_set));
            END IF;

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

                  INSERT INTO fac_imp_sle (ins_srtdeel_code,
                                           ins_srtdeel_omschrijving,
                                           alg_locatie_code,
                                           alg_gebouw_code,
                                           alg_verdieping_code,
                                           alg_ruimte_nr,
                                           cil_gebouw_code,
                                           cil_verdieping_code,
                                           cil_ruimte_nr,
                                           aant_sleutels_in_set,
                                           ins_kenmerkwaarde1,
                                           ins_kenmerkwaarde2,
                                           ins_kenmerkwaarde3,
                                           ins_kenmerkwaarde4,
                                           ins_kenmerkwaarde5)
                    VALUES   (v_ins_srtdeel_code,
                              v_ins_srtdeel_omschrijving,
                              v_alg_locatie_code,
                              v_alg_gebouw_code,
                              v_alg_verdieping_code,
                              v_alg_ruimte_nr,
                              v_cil_gebouw_code,
                              v_cil_verdieping_code,
                              v_cil_ruimte_nr,
                              v_aant_sleutels_in_set_n,
                              TRIM (v_ins_kenmerkwaarde1),
                              TRIM (v_ins_kenmerkwaarde2),
                              TRIM (v_ins_kenmerkwaarde3),
                              TRIM (v_ins_kenmerkwaarde4),
                              TRIM (v_ins_kenmerkwaarde5));

                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                     v_errormsg :=
                           v_errormsg
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog (
                        p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Fout bij toevoegen regel aan importtabel FAC_IMP_SLE.'
                     );

                     COMMIT;
               END;
            END IF;
         END IF;
      END;
   END LOOP;

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

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=
            v_errormsg
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Inleesproces sleutelsets afgebroken!');
END fac_import_sle;
/

CREATE OR REPLACE PROCEDURE fac_update_sle (p_import_key IN NUMBER)
AS
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);

   -- SUBPROC
   PROCEDURE add_srtdeel (p_import_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT   cs.ins_srtgroep_key cilindergroep_key,
                    ss.ins_srtgroep_key sleutelgroep_key,
                    UPPER (x.ins_srtdeel_code) ins_srtdeel_code_upper,
                    UPPER (x.ins_srtdeel_omschrijving) ins_srtdeel_upper,
                    MIN (x.ins_srtdeel_code) ins_srtdeel_code,
                    MIN (x.ins_srtdeel_omschrijving) ins_srtdeel_omschrijving
             FROM   (SELECT   ins_srtgroep_key
                       FROM   fac_setting s, ins_srtgroep sg
                      WHERE   UPPER (s.fac_setting_name) =
                                 'CIL_INS_SRT_GROEP_KEY'
                              AND fac.safe_to_number (s.fac_setting_pvalue) =
                                    sg.ins_srtgroep_key) cs,
                    (SELECT   ins_srtgroep_key
                       FROM   fac_setting s, ins_srtgroep sg
                      WHERE   UPPER (s.fac_setting_name) =
                                 'SLE_INS_SRT_GROEP_KEY'
                              AND fac.safe_to_number (s.fac_setting_pvalue) =
                                    sg.ins_srtgroep_key) ss,
                    fac_imp_sle x
         GROUP BY   cs.ins_srtgroep_key,
                    ss.ins_srtgroep_key,
                    UPPER (x.ins_srtdeel_code),
                    UPPER (x.ins_srtdeel_omschrijving)
         ORDER BY   1,
                    2,
                    3,
                    4;

      v_count_tot           NUMBER (10);
      v_count_cs            NUMBER (10);
      v_count_ss            NUMBER (10);
      v_aanduiding          VARCHAR (200);
      v_cilindergroep_key   NUMBER (10);
      v_cilinderset_key     NUMBER (10);
      v_sleutelgroep_key    NUMBER (10);
      v_sleutelset_key      NUMBER (10);
      ccount                NUMBER (10);
   BEGIN
      v_count_tot := 0;
      v_count_cs := 0;
      v_count_ss := 0;

      FOR rec IN c1
      LOOP
         BEGIN
            v_aanduiding :=
                  '['
               || rec.ins_srtdeel_code
               || '|'
               || rec.ins_srtdeel_omschrijving
               || '] ';
            v_count_tot := v_count_tot + 1;

            v_errormsg := 'Fout bij bepalen INS-Cilinderset (tbv. koppeling)';

            SELECT   COUNT ( * )
              INTO   ccount
              FROM   ins_srtdeel
             WHERE       ins_srtdeel_verwijder IS NULL
                     AND ins_srtdeel_module = 'INS'
                     AND ins_srtgroep_key = rec.cilindergroep_key
                     AND UPPER (TRIM (ins_srtdeel_omschrijving)) =
                           UPPER (TRIM (rec.ins_srtdeel_omschrijving));

            IF ccount = 0
            THEN
               v_errormsg :=
                  'Fout bij toevoegen INS-Cilinderset (tbv. koppeling)';

               -- Binding 5 betekent ruimte=1 of terreingebonden=4
               -- (Ruimte- en Terrein-vinkje gezet)!
               INSERT INTO ins_srtdeel (ins_srtgroep_key,
                                        ins_srtdeel_module,
                                        ins_srtdeel_code,
                                        ins_srtdeel_omschrijving,
                                        ins_srtdeel_binding,
                                        ins_srtdeel_uitleenbaar)
                  VALUES   (rec.cilindergroep_key,
                            'INS',
                            rec.ins_srtdeel_code_upper,
                            rec.ins_srtdeel_omschrijving,
                            5,
                            1)
               RETURNING   ins_srtdeel_key      INTO   v_cilinderset_key;

               v_count_cs := v_count_cs + 1;
            ELSE
               SELECT   ins_srtdeel_key
                 INTO   v_cilinderset_key
                 FROM   ins_srtdeel
                WHERE       ins_srtdeel_verwijder IS NULL
                        AND ins_srtdeel_module = 'INS'
                        AND ins_srtgroep_key = rec.cilindergroep_key
                        AND UPPER (TRIM (ins_srtdeel_omschrijving)) =
                              UPPER (TRIM (rec.ins_srtdeel_omschrijving));
            END IF;

            v_errormsg := 'Fout bij bepalen INS-Sleutelset (tbv. koppeling)';

            SELECT   COUNT ( * )
              INTO   ccount
              FROM   ins_srtdeel
             WHERE       ins_srtdeel_verwijder IS NULL
                     AND ins_srtdeel_module = 'INS'
                     AND ins_srtgroep_key = rec.sleutelgroep_key
                     AND UPPER (TRIM (ins_srtdeel_omschrijving)) =
                           UPPER (TRIM (rec.ins_srtdeel_omschrijving));

            IF ccount = 0
            THEN
               v_errormsg :=
                  'Fout bij toevoegen INS-Sleutelset (tbv. koppeling)';

               -- Binding 5 betekent ruimte=1 of terreingebonden=4
               -- (Ruimte- en Terrein-vinkje gezet)!
               INSERT INTO ins_srtdeel (ins_srtgroep_key,
                                        ins_srtdeel_module,
                                        ins_srtdeel_code,
                                        ins_srtdeel_omschrijving,
                                        ins_srtdeel_binding,
                                        ins_srtdeel_uitleenbaar)
                  VALUES   (rec.sleutelgroep_key,
                            'INS',
                            rec.ins_srtdeel_code_upper,
                            rec.ins_srtdeel_omschrijving,
                            5,
                            1)
               RETURNING   ins_srtdeel_key      INTO   v_sleutelset_key;

               v_count_ss := v_count_ss + 1;
            ELSE
               SELECT   ins_srtdeel_key
                 INTO   v_sleutelset_key
                 FROM   ins_srtdeel
                WHERE       ins_srtdeel_verwijder IS NULL
                        AND ins_srtdeel_module = 'INS'
                        AND ins_srtgroep_key = rec.sleutelgroep_key
                        AND UPPER (TRIM (ins_srtdeel_omschrijving)) =
                              UPPER (TRIM (rec.ins_srtdeel_omschrijving));
            END IF;

            v_errormsg := 'Fout bij toevoegen INS-Cilinderset-Sleutelset';

            INSERT INTO ins_srtdeel_srtdeel (ins_srtdeel_key_1, ins_srtdeel_key_2, ins_module)
               SELECT   v_cilinderset_key, v_sleutelset_key, 'SLE'
                 FROM   DUAL
                WHERE   NOT EXISTS
                           (SELECT   1
                              FROM   ins_srtdeel_srtdeel
                             WHERE   ins_srtdeel_key_1 = v_cilinderset_key
                                     AND ins_srtdeel_key_2 = v_sleutelset_key
                                     AND ins_module = 'SLE');
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     v_errormsg
                  || ' ORACLE (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_errormsg,
                                 '');
         END;

         COMMIT;
      END LOOP;

      fac.imp_writelog (
         p_import_key,
         'S',
            'INS-Cilindersets/#toegevoegd: '
         || TO_CHAR (v_count_cs)
         || ' (van '
         || TO_CHAR (v_count_tot)
         || ')',
         ''
      );
      fac.imp_writelog (
         p_import_key,
         'S',
            'INS-Sleutelsets/#toegevoegd: '
         || TO_CHAR (v_count_ss)
         || ' (van '
         || TO_CHAR (v_count_tot)
         || ')',
         ''
      );
      COMMIT;
   END;

   -- SUBPROC
   PROCEDURE add_cilinders (p_import_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT   sg.ins_discipline_key,
                    sg.ins_srtgroep_key,
                    x.ins_srtdeel_code,
                    x.ins_srtdeel_omschrijving,
                    x.alg_locatie_code,
                    x.alg_gebouw_code,
                    x.alg_verdieping_code,
                    x.alg_ruimte_nr,
                    x.cil_gebouw_code,
                    x.cil_verdieping_code,
                    x.cil_ruimte_nr
             FROM   fac_setting s, ins_srtgroep sg, fac_imp_sle x
            WHERE   UPPER (s.fac_setting_name) = 'CIL_INS_SRT_GROEP_KEY'
                    AND fac.safe_to_number (s.fac_setting_pvalue) =
                          sg.ins_srtgroep_key
         ORDER BY   1,
                    2,
                    3,
                    4,
                    5,
                    9,
                    10,
                    11;

      v_count_tot            NUMBER (10);
      v_count_create         NUMBER (10);
      v_aanduiding           VARCHAR (200);
      v_srtdeel_key          NUMBER (10);
      v_locatie_key          NUMBER (10);
      v_alg_gebouw_key       NUMBER (10);
      v_alg_verdieping_key   NUMBER (10);
      v_alg_ruimte_key       NUMBER (10);
      v_cil_gebouw_key       NUMBER (10);
      v_cil_verdieping_key   NUMBER (10);
      v_cil_ruimte_key       NUMBER (10);
      v_deel_oms             VARCHAR2 (60);
      ccount                 NUMBER (10);
   BEGIN
      v_count_tot := 0;
      v_count_create := 0;

      FOR rec IN c1
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding :=
                  '['
               || rec.ins_srtdeel_code
               || '|'
               || rec.ins_srtdeel_omschrijving
               || '|'
               || rec.alg_locatie_code
               || '|'
               || rec.cil_gebouw_code
               || '|'
               || rec.cil_verdieping_code
               || '|'
               || rec.cil_ruimte_nr
               || '] ';
            v_errormsg := 'Fout bij bepalen INS-Cilinderset';

            SELECT   ins_srtdeel_key
              INTO   v_srtdeel_key
              FROM   ins_srtdeel
             WHERE       ins_srtdeel_verwijder IS NULL
                     AND ins_srtdeel_module = 'INS'
                     AND ins_srtgroep_key = rec.ins_srtgroep_key
                     AND UPPER (TRIM (ins_srtdeel_omschrijving)) =
                           UPPER (TRIM (rec.ins_srtdeel_omschrijving));

            v_errormsg := 'Fout bij bepalen locatie (tbv. cilinders)';

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

            v_errormsg := 'Fout bij bepalen stamgebouw (tbv. cilinders)';

            SELECT   alg_gebouw_key
              INTO   v_alg_gebouw_key
              FROM   alg_gebouw
             WHERE   alg_gebouw_verwijder IS NULL
                     AND alg_locatie_key = v_locatie_key
                     AND UPPER (TRIM (alg_gebouw_code)) =
                           UPPER (TRIM (rec.alg_gebouw_code));

            v_errormsg := 'Fout bij bepalen stamverdieping (tbv. cilinders)';

            SELECT   alg_verdieping_key
              INTO   v_alg_verdieping_key
              FROM   alg_verdieping
             WHERE   alg_verdieping_verwijder IS NULL
                     AND alg_gebouw_key = v_alg_gebouw_key
                     AND UPPER (TRIM (alg_verdieping_code)) =
                           UPPER (TRIM (rec.alg_verdieping_code));

            v_errormsg := 'Fout bij bepalen stamruimte (tbv. cilinders)';

            SELECT   alg_ruimte_key
              INTO   v_alg_ruimte_key
              FROM   alg_ruimte
             WHERE   alg_ruimte_verwijder IS NULL
                     AND alg_verdieping_key = v_alg_verdieping_key
                     AND UPPER (TRIM (alg_ruimte_nr)) =
                           UPPER (TRIM (rec.alg_ruimte_nr));

            v_errormsg := 'Fout bij bepalen cilindergebouw';

            SELECT   alg_gebouw_key
              INTO   v_cil_gebouw_key
              FROM   alg_gebouw
             WHERE   alg_gebouw_verwijder IS NULL
                     AND alg_locatie_key = v_locatie_key
                     AND UPPER (TRIM (alg_gebouw_code)) =
                           UPPER (TRIM (rec.cil_gebouw_code));

            v_errormsg := 'Fout bij bepalen cilinderverdieping';

            SELECT   alg_verdieping_key
              INTO   v_cil_verdieping_key
              FROM   alg_verdieping
             WHERE   alg_verdieping_verwijder IS NULL
                     AND alg_gebouw_key = v_cil_gebouw_key
                     AND UPPER (TRIM (alg_verdieping_code)) =
                           UPPER (TRIM (rec.cil_verdieping_code));

            v_errormsg := 'Fout bij bepalen cilinderruimte';

            SELECT   alg_ruimte_key
              INTO   v_cil_ruimte_key
              FROM   alg_ruimte
             WHERE   alg_ruimte_verwijder IS NULL
                     AND alg_verdieping_key = v_cil_verdieping_key
                     AND UPPER (TRIM (alg_ruimte_nr)) =
                           UPPER (TRIM (rec.cil_ruimte_nr));

            -- Binnen een dezelfde cilinderset kunnen 1 of meer cilinders zijn
            -- "uitgeleend" aan dezelfde ruimte (ruimte kan >1 deuren hebben).
            v_errormsg := 'Fout bij bepalen default ID (cilinder)';

            SELECT   INS.GET_DESCRIPTION ('LPN_INS_DEEL',
                                          NULL,
                                          UPPER (rec.ins_srtdeel_code))
              INTO   v_deel_oms
              FROM   ins_srtdeel
             WHERE   ins_srtdeel_key = v_srtdeel_key;

            v_errormsg := 'Fout bij toevoegen cilinder';

            INSERT INTO ins_deel (ins_discipline_key,
                                  ins_srtdeel_key,
                                  ins_deel_module,
                                  ins_deel_omschrijving,
                                  ins_alg_ruimte_key,
                                  ins_alg_ruimte_type,
                                  ins_alg_locatie_key,
                                  ins_alg_ruimte_key_org,
                                  ins_alg_ruimte_type_org)
              VALUES   (rec.ins_discipline_key,
                        v_srtdeel_key,
                        'INS',
                        v_deel_oms,
                        v_cil_ruimte_key,
                        'R',
                        v_locatie_key,
                        v_alg_ruimte_key,
                        'R');

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

         COMMIT;
      END LOOP;

      fac.imp_writelog (
         p_import_key,
         'S',
            'INS-Cilinders/#toegevoegd: '
         || TO_CHAR (v_count_create)
         || ' (van '
         || TO_CHAR (v_count_tot)
         || ')',
         ''
      );
      COMMIT;
   END;

   -- SUBPROC
   PROCEDURE add_sleutels (p_import_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT   sg.ins_discipline_key,
                    sg.ins_srtgroep_key,
                    x.ins_srtdeel_code,
                    x.ins_srtdeel_omschrijving,
                    x.alg_locatie_code,
                    x.alg_gebouw_code,
                    x.alg_verdieping_code,
                    x.alg_ruimte_nr,
                    MAX (x.aant_sleutels_in_set) aant_sleutels_in_set
             FROM   fac_setting s, ins_srtgroep sg, fac_imp_sle x
            WHERE   UPPER (s.fac_setting_name) = 'SLE_INS_SRT_GROEP_KEY'
                    AND fac.safe_to_number (s.fac_setting_pvalue) =
                          sg.ins_srtgroep_key
         GROUP BY   sg.ins_discipline_key,
                    sg.ins_srtgroep_key,
                    x.ins_srtdeel_code,
                    x.ins_srtdeel_omschrijving,
                    x.alg_locatie_code,
                    x.alg_gebouw_code,
                    x.alg_verdieping_code,
                    x.alg_ruimte_nr
         ORDER BY   1,
                    2,
                    3,
                    4,
                    5,
                    6,
                    7,
                    8;

      v_count_tot            NUMBER (10);
      v_count_create         NUMBER (10);
      v_aanduiding           VARCHAR (200);
      v_srtdeel_key          NUMBER (10);
      v_locatie_key          NUMBER (10);
      v_alg_gebouw_key       NUMBER (10);
      v_alg_verdieping_key   NUMBER (10);
      v_alg_ruimte_key       NUMBER (10);
      v_deel_oms             VARCHAR2 (60);
      ccount                 NUMBER (10);
   BEGIN
      v_count_tot := 0;
      v_count_create := 0;

      FOR rec IN c1
      LOOP
         BEGIN
            v_aanduiding :=
                  '['
               || rec.ins_srtdeel_code
               || '|'
               || rec.ins_srtdeel_omschrijving
               || '|'
               || rec.alg_locatie_code
               || '|'
               || rec.alg_gebouw_code
               || '|'
               || rec.alg_verdieping_code
               || '|'
               || rec.alg_ruimte_nr
               || '|'
               || TO_CHAR (rec.aant_sleutels_in_set)
               || '] ';
            v_errormsg := 'Fout bij bepalen INS-Sleutelset';

            SELECT   ins_srtdeel_key
              INTO   v_srtdeel_key
              FROM   ins_srtdeel
             WHERE       ins_srtdeel_verwijder IS NULL
                     AND ins_srtdeel_module = 'INS'
                     AND ins_srtgroep_key = rec.ins_srtgroep_key
                     AND UPPER (TRIM (ins_srtdeel_omschrijving)) =
                           UPPER (TRIM (rec.ins_srtdeel_omschrijving));

            v_errormsg := 'Fout bij bepalen locatie (tbv. sleutels)';

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

            v_errormsg := 'Fout bij bepalen stamgebouw (tbv. sleutels)';

            SELECT   alg_gebouw_key
              INTO   v_alg_gebouw_key
              FROM   alg_gebouw
             WHERE   alg_gebouw_verwijder IS NULL
                     AND alg_locatie_key = v_locatie_key
                     AND UPPER (TRIM (alg_gebouw_code)) =
                           UPPER (TRIM (rec.alg_gebouw_code));

            v_errormsg := 'Fout bij bepalen stamverdieping (tbv. sleutels)';

            SELECT   alg_verdieping_key
              INTO   v_alg_verdieping_key
              FROM   alg_verdieping
             WHERE   alg_verdieping_verwijder IS NULL
                     AND alg_gebouw_key = v_alg_gebouw_key
                     AND UPPER (TRIM (alg_verdieping_code)) =
                           UPPER (TRIM (rec.alg_verdieping_code));

            v_errormsg := 'Fout bij bepalen stamruimte (tbv. sleutels)';

            SELECT   alg_ruimte_key
              INTO   v_alg_ruimte_key
              FROM   alg_ruimte
             WHERE   alg_ruimte_verwijder IS NULL
                     AND alg_verdieping_key = v_alg_verdieping_key
                     AND UPPER (TRIM (alg_ruimte_nr)) =
                           UPPER (TRIM (rec.alg_ruimte_nr));

            v_errormsg := 'Fout bij bepalen huidig aantal sleutels in set';

            SELECT   COUNT ( * )
              INTO   ccount
              FROM   ins_deel d
             WHERE       ins_deel_verwijder IS NULL
                     AND ins_deel_module = 'INS'
                     AND ins_srtdeel_key = v_srtdeel_key;

            IF ccount > 0                     -- Sleutelset bevat al sleutels!
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Sleutelset bevat al sleutels',
                  ''
               );
            ELSE
               v_count_tot := v_count_tot + 1;

               WHILE ccount < rec.aant_sleutels_in_set
               LOOP
                  BEGIN
                     v_errormsg := 'Fout bij bepalen default ID (sleutel)';

                     SELECT   INS.GET_DESCRIPTION (
                                 'LPN_INS_DEEL',
                                 NULL,
                                 UPPER (rec.ins_srtdeel_code))
                       INTO   v_deel_oms
                       FROM   ins_srtdeel
                      WHERE   ins_srtdeel_key = v_srtdeel_key;

                     v_errormsg := 'Fout bij toevoegen sleutel';

                     INSERT INTO ins_deel (ins_discipline_key,
                                           ins_srtdeel_key,
                                           ins_deel_module,
                                           ins_deel_omschrijving,
                                           ins_alg_ruimte_key,
                                           ins_alg_ruimte_type,
                                           ins_alg_locatie_key)
                       VALUES   (rec.ins_discipline_key,
                                 v_srtdeel_key,
                                 'INS',
                                 v_deel_oms,
                                 v_alg_ruimte_key,
                                 'R',
                                 v_locatie_key);

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

         COMMIT;
      END LOOP;

      fac.imp_writelog (
         p_import_key,
         'S',
            'INS-Sleutels/#toegevoegd: '
         || TO_CHAR (v_count_create)
         || ' (bij '
         || TO_CHAR (v_count_tot)
         || ')',
         ''
      );
      COMMIT;
   END;
-- MAIN
BEGIN
   add_srtdeel (p_import_key);        -- Evenveel cilindersets als sleutelsets
   add_cilinders (p_import_key);
   add_sleutels (p_import_key);
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=
            v_errormsg
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_errormsg,
                        'Importproces sleutelsets afgebroken!');
END fac_update_sle;
/

/* FSN#13971: adres-import bleek onverhoopt nodig. Klantspecifieke routines gemaakt
   op basis van de standaard fac_imp_adres tabel. Voor consistentie hierom deze
   bijbehorende procedure gedefinieerd, die geduldig op implementatie wachten.
   Afgewogen niet voor fac_import_mld_adres gekozen.
 */
CREATE OR REPLACE PROCEDURE fac_import_adres (
   p_import_key IN NUMBER,
   p_discipline_key   IN   NUMBER
)
IS
BEGIN
   NULL;
END;
/

CREATE OR REPLACE PROCEDURE fac_update_adres (
   p_import_key IN NUMBER
) IS
BEGIN
   NULL;
END;
/


CREATE OR REPLACE PROCEDURE fac_import_res_artikel_sync (
   p_import_key IN NUMBER
)
AS
   c_fielddelimitor                VARCHAR2 (2)    := fac.import_delimiter(p_import_key);
   v_newline                       fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
   v_errormsg                      VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER;
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_ongeldig                      NUMBER (1);
   v_aanduiding                    VARCHAR2 (200);
   -- De importvelden:
   v_res_artikel_key               VARCHAR2 (255);
   v_res_discipline_key            NUMBER (10);
   v_res_discipline_oms            VARCHAR2 (255);
   v_res_kostensoort_key           NUMBER (10);
   v_res_kostensoort_oms           VARCHAR2 (255);
   v_res_artikel_nr                VARCHAR2 (255);
   v_res_artikel_omschrijving      VARCHAR2 (255);
   v_res_artikel_eenheid           VARCHAR2 (255);
   v_res_artikel_prijs             VARCHAR2 (255);
   v_res_artikel_prijs_vast        VARCHAR2 (255);
   v_res_artikel_inkoopprijs       VARCHAR2 (255);
   v_res_artikel_kostenpersoneel   VARCHAR2 (255);
   v_res_artikel_kostenalgemeen    VARCHAR2 (255);
   v_res_artikel_btw               VARCHAR2 (255);
   v_res_artikel_opmerking         VARCHAR2 (2000);
   v_res_artikel_groep             VARCHAR2 (255);
   v_res_artikel_volgnummer        VARCHAR2 (255);
   v_res_artikel_ingangsdatum      VARCHAR2 (255);
   v_res_artikel_vervaldatum       VARCHAR2 (255);
   v_res_artikel_minimum           VARCHAR2 (255);
   -- Overige velden:
   v_res_artikel_key2              NUMBER;

   CURSOR c1
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   -- Eerst opruiming
   DELETE FROM fac_imp_res_artikel_sync;

   v_count_tot := 0;
   v_count_import := 0;
   header_is_valid := 0;
   COMMIT;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout opvragen te importeren rij';
         v_aanduiding := '';
         v_ongeldig := 0;
         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_fielddelimitor, v_res_artikel_key);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_res_discipline_oms);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_res_kostensoort_oms);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_res_artikel_nr);
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_res_artikel_omschrijving
                          );
         fac.imp_getfield (v_newline, c_fielddelimitor, v_res_artikel_eenheid);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_res_artikel_prijs);
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_res_artikel_prijs_vast
                          );
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_res_artikel_inkoopprijs
                          );
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_res_artikel_kostenpersoneel
                          );
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_res_artikel_kostenalgemeen
                          );
         fac.imp_getfield (v_newline, c_fielddelimitor, v_res_artikel_btw);
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_res_artikel_opmerking
                          );
         fac.imp_getfield (v_newline, c_fielddelimitor, v_res_artikel_groep);
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_res_artikel_volgnummer
                          );
         fac.imp_getfield (v_newline, c_fielddelimitor, v_res_artikel_ingangsdatum);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_res_artikel_vervaldatum);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_res_artikel_minimum);
         v_aanduiding :=
               'importregel: ('
            || v_res_artikel_key
            || '|'
            || v_res_discipline_oms
            || '|'
            || v_res_artikel_nr
            || '|'
            || v_res_artikel_omschrijving
            || ')';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer alle kolommen..
         -- Ik negeer alles totdat ik een geldige header gepasseerd ben
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_res_artikel_key) = 'ARTIKELKEY'
               AND UPPER (v_res_discipline_oms) = 'CATALOGUSNAAM'
               AND UPPER (v_res_kostensoort_oms) = 'CATALOGUSKOSTENSOORT'
               AND UPPER (v_res_artikel_nr) = 'ARTIKELNUMMER'
               AND UPPER (v_res_artikel_omschrijving) = 'ARTIKELOMSCHRIJVING'
               AND UPPER (v_res_artikel_eenheid) = 'ARTIKELEENHEID'
               AND UPPER (v_res_artikel_prijs) = 'ARTIKELPRIJS'
               AND UPPER (v_res_artikel_prijs_vast) = 'ARTIKELPRIJSVAST'
               AND UPPER (v_res_artikel_inkoopprijs) = 'ARTIKELINKOOPPRIJS'
               AND UPPER (v_res_artikel_kostenpersoneel) =
                                                     'ARTIKELPERSONEELKOSTEN'
               AND UPPER (v_res_artikel_kostenalgemeen) =
                                                      'ARTIKELALGEMENEKOSTEN'
               AND UPPER (v_res_artikel_btw) = 'ARTIKELBTW'
               AND UPPER (v_res_artikel_opmerking) = 'ARTIKELOPMERKING'
               AND UPPER (v_res_artikel_groep) = 'ARTIKELGROEP'
               AND UPPER (v_res_artikel_volgnummer) = 'ARTIKELVOLGNUMMER'
               AND UPPER (v_res_artikel_ingangsdatum) = 'ARTIKELINGANGSDATUM'
               AND UPPER (v_res_artikel_vervaldatum) = 'ARTIKELVERVALDATUM'
               AND UPPER (v_res_artikel_minimum) = 'ARTIKELMINIMUM'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;

            -- Controleer alle veldwaarde
            IF LTRIM (RTRIM (v_res_artikel_key)) IS NOT NULL
            THEN
               IF fac.safe_to_number (v_res_artikel_key) IS NOT NULL
               THEN
                  BEGIN
                     SELECT res_artikel_key
                       INTO v_res_artikel_key2
                       FROM res_v_aanwezigartikel
                      WHERE res_artikel_key = v_res_artikel_key;
                  EXCEPTION
                     WHEN NO_DATA_FOUND
                     THEN
                        fac.imp_writelog (p_import_key,
                                          'I',
                                          v_aanduiding,
                                          'Catalogus is nieuw'
                                         );
                  END;
               ELSE
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_aanduiding,
                                    'Artikel key niet gevonden'
                                   );
                  v_ongeldig := 1;
               END IF;
            END IF;

            BEGIN
               SELECT ins_discipline_key
                 INTO v_res_discipline_key
                 FROM res_discipline
                WHERE ins_discipline_omschrijving = v_res_discipline_oms
                      AND ins_discipline_verwijder IS NULL;
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  fac.imp_writelog (p_import_key,
                                    'I',
                                    v_aanduiding,
                                    'Catalogus is nieuw'
                                   );
            END;

            IF v_res_kostensoort_oms IS NOT NULL
            THEN
              BEGIN
                  SELECT prs_kostensoort_key
                    INTO v_res_kostensoort_key
                    FROM prs_kostensoort k
                   WHERE k.prs_kostensoort_oms = v_res_kostensoort_oms;
               EXCEPTION
                  WHEN NO_DATA_FOUND
                  THEN
                     fac.imp_writelog (p_import_key,
                                      'I',
                                       v_aanduiding,
                                       'Kostensoort is nieuw'
                                      );
               END;
            END IF;

            IF LENGTH (v_res_artikel_nr) > 10
            THEN
               v_res_artikel_nr := SUBSTR (TRIM (v_res_artikel_nr), 1, 10);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                    'Artikelnummer wordt afgebroken tot ['
                                 || v_res_artikel_nr
                                 || ']'
                                );
            END IF;

            IF LENGTH (v_res_artikel_omschrijving) > 40
            THEN
               v_res_artikel_omschrijving :=
                            SUBSTR (TRIM (v_res_artikel_omschrijving), 1, 40);
               fac.imp_writelog
                             (p_import_key,
                              'W',
                              v_aanduiding,
                                 'Artikelomschrijving wordt afgebroken tot ['
                              || v_res_artikel_omschrijving
                              || ']'
                             );
            END IF;

            IF LENGTH (v_res_artikel_eenheid) > 10
            THEN
               v_res_artikel_eenheid :=
                                 SUBSTR (TRIM (v_res_artikel_eenheid), 1, 10);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                    'Artikeleenheid wordt afgebroken tot ['
                                 || v_res_artikel_eenheid
                                 || ']'
                                );
            END IF;

            v_res_artikel_prijs := REPLACE (v_res_artikel_prijs, ',', '.');

            IF     v_res_artikel_prijs IS NOT NULL
               AND fac.safe_to_number (v_res_artikel_prijs) IS NULL
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                    'Ongeldige artikelprijs ['
                                 || v_res_artikel_prijs
                                 || ']'
                                );
            END IF;

            IF (   v_res_artikel_prijs_vast <> '0'
               AND v_res_artikel_prijs_vast <> '1')
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                    'Ongeldige artikel_prijs_vast ['
                                 || v_res_artikel_prijs_vast
                                 || '] --> [0|1]'
                                );
            END IF;
            -- Doe een poging er de juiste waarde van te maken.
            IF    v_res_artikel_prijs_vast IS NULL
               OR v_res_artikel_prijs_vast <> '1'
            THEN
               v_res_artikel_prijs_vast := '0';
            END IF;

            v_res_artikel_inkoopprijs :=
                                 REPLACE (v_res_artikel_inkoopprijs, ',', '.');

            IF     v_res_artikel_inkoopprijs IS NOT NULL
               AND fac.safe_to_number (v_res_artikel_inkoopprijs) IS NULL
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                    'Ongeldige inkoopprijs ['
                                 || v_res_artikel_inkoopprijs
                                 || ']'
                                );
            END IF;

            v_res_artikel_kostenpersoneel :=
                             REPLACE (v_res_artikel_kostenpersoneel, ',', '.');

            IF     v_res_artikel_kostenpersoneel IS NOT NULL
               AND fac.safe_to_number (v_res_artikel_kostenpersoneel) IS NULL
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                    'Ongeldige personeelskosten ['
                                 || v_res_artikel_kostenpersoneel
                                 || ']'
                                );
            END IF;

            v_res_artikel_kostenalgemeen :=
                              REPLACE (v_res_artikel_kostenalgemeen, ',', '.');

            IF     v_res_artikel_kostenalgemeen IS NOT NULL
               AND fac.safe_to_number (v_res_artikel_kostenalgemeen) IS NULL
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                    'Ongeldige algemene kosten ['
                                 || v_res_artikel_kostenalgemeen
                                 || ']'
                                );
            END IF;

            v_res_artikel_btw := REPLACE (v_res_artikel_btw, ',', '.');

            IF     v_res_artikel_btw IS NOT NULL
               AND fac.safe_to_number (v_res_artikel_btw) IS NULL
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                    'Ongeldige BTW tarief ['
                                 || v_res_artikel_btw
                                 || ']'
                                );
            END IF;

            IF LENGTH (v_res_artikel_opmerking) > 2000
            THEN
               v_res_artikel_opmerking :=
                             SUBSTR (TRIM (v_res_artikel_opmerking), 1, 2000);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                    'Artikelopmerking wordt afgebroken tot ['
                                 || v_res_artikel_opmerking
                                 || ']'
                                );
            END IF;

            IF LENGTH (v_res_artikel_groep) > 10
            THEN
               v_res_artikel_groep :=
                                   SUBSTR (TRIM (v_res_artikel_groep), 1, 10);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                    'Artikelgroep wordt afgebroken tot ['
                                 || v_res_artikel_groep
                                 || ']'
                                );
            END IF;

            IF v_res_artikel_volgnummer IS NOT NULL
            THEN
               IF    LENGTH (v_res_artikel_volgnummer) > 3
                  OR fac.safe_to_number (v_res_artikel_volgnummer) IS NULL
               THEN
                  fac.imp_writelog (p_import_key,
                                    'W',
                                    v_aanduiding,
                                       'Ongeldig artikelvolgnummer ['
                                    || v_res_artikel_volgnummer
                                    || ']'
                                   );
                  v_res_artikel_volgnummer := NULL;
               END IF;
            ELSE
               v_res_artikel_volgnummer := NULL;
            END IF;

            IF     v_res_artikel_ingangsdatum IS NOT NULL
               AND fac.safe_to_date (v_res_artikel_ingangsdatum, 'yyyymmdd') IS NULL
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                    'Ongeldige ingangsdatum ['
                                 || v_res_artikel_ingangsdatum
                                 || ']'
                                );
            END IF;

            IF     v_res_artikel_vervaldatum IS NOT NULL
               AND fac.safe_to_date (v_res_artikel_vervaldatum, 'yyyymmdd') IS NULL
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding,
                                    'Ongeldige vervaldatum ['
                                 || v_res_artikel_vervaldatum
                                 || ']'
                                );
            END IF;

            IF v_res_artikel_minimum IS NOT NULL
            THEN
               IF    LENGTH (v_res_artikel_minimum) > 3
                  OR fac.safe_to_number (v_res_artikel_minimum) IS NULL
               THEN
                  fac.imp_writelog (p_import_key,
                                    'W',
                                    v_aanduiding,
                                       'Ongeldig artikelminimum ['
                                    || v_res_artikel_minimum
                                    || ']'
                                   );
                  v_res_artikel_minimum := NULL;
               END IF;
            ELSE
               v_res_artikel_minimum := NULL;
            END IF;

            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               BEGIN
                  INSERT INTO fac_imp_res_artikel_sync
                              (res_artikel_key,
                               res_discipline_oms,
                               res_kostensoort_oms,
                               res_artikel_nr,
                               res_artikel_omschrijving,
                               res_artikel_eenheid,
                               res_artikel_prijs,
                               res_artikel_prijs_vast,
                               res_artikel_inkoopprijs,
                               res_artikel_kostenpersoneel,
                               res_artikel_kostenalgemeen,
                               res_artikel_btw,
                               res_artikel_opmerking, res_artikel_groep,
                               res_artikel_volgnummer,
                               res_artikel_ingangsdatum,
                               res_artikel_vervaldatum,
                               res_artikel_minimum
                              )
                       VALUES (fac.safe_to_number (v_res_artikel_key),
                               v_res_discipline_oms,
                               v_res_kostensoort_oms,
                               v_res_artikel_nr,
                               v_res_artikel_omschrijving,
                               v_res_artikel_eenheid,
                               fac.safe_to_number (v_res_artikel_prijs),
                               fac.safe_to_number (v_res_artikel_prijs_vast),
                               fac.safe_to_number (v_res_artikel_inkoopprijs),
                               fac.safe_to_number
                                                (v_res_artikel_kostenpersoneel),
                               fac.safe_to_number
                                                 (v_res_artikel_kostenalgemeen),
                               fac.safe_to_number (v_res_artikel_btw),
                               v_res_artikel_opmerking, v_res_artikel_groep,
                               fac.safe_to_number (v_res_artikel_volgnummer),
                               fac.safe_to_date (v_res_artikel_ingangsdatum, 'yyyymmdd'),
                               fac.safe_to_date (v_res_artikel_vervaldatum, 'yyyymmdd'),
                               fac.safe_to_number (v_res_artikel_minimum)
                              );

                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg := ' ORACLE (' || oracle_err_mes || ')';
                     fac.imp_writelog
                        (p_import_key,
                         'E',
                         v_aanduiding,
                            'Ingelezen regel kan niet weggeschreven worden: fout bij toevoegen regel aan importtabel FAC_IMP_RES_ARTIKEL_SYNC. '
                         || v_errormsg
                        );
               END;
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || 'Ongeldig importbestand',
                        'Toelichting: ... '
                       );
   ELSE
      fac.imp_writelog
                     (p_import_key,
                      'S',
                         'Reserveringen: aantal ingelezen catering regels: '
                      || TO_CHAR (v_count_tot),
                      ''
                     );
      fac.imp_writelog
         (p_import_key,
          'S',
             'Reserveringen: aantal ongeldige niet ingelezen importregels: <b>'
          || TO_CHAR (v_count_tot - v_count_import),
          ''
         );
   END IF;

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


CREATE OR REPLACE PROCEDURE fac_update_res_artikel_sync (
   p_import_key IN NUMBER
)
AS
   CURSOR c1
   IS
      SELECT *
        FROM fac_imp_res_artikel_sync;

   v_errormsg             VARCHAR2 (1000);
   v_count_tot            NUMBER (10);
   v_count_update         NUMBER (10);
   v_count_ins            NUMBER (10);
   v_res_discipline_key   NUMBER (10);
   v_artikel_key_count    NUMBER (10);
   v_res_kostensoort_key  NUMBER (10);
BEGIN
   v_count_tot := 0;
   v_count_update := 0;
   v_count_ins := 0;

   SELECT COUNT (*)
     INTO v_artikel_key_count
     FROM fac_imp_res_artikel_sync
    WHERE res_artikel_key IS NOT NULL;

   -- markeer bestaande artikelen om verwijderd te worden
   IF v_artikel_key_count > 0
   THEN
      UPDATE res_artikel ra
         SET res_artikel_omschrijving =
                               SUBSTR ('*' || res_artikel_omschrijving, 1, 40)
       WHERE SUBSTR (res_artikel_omschrijving, 1, 1) <> '*'
         AND NOT EXISTS (SELECT res_artikel_key
                           FROM fac_imp_res_artikel_sync fip
                          WHERE fip.res_artikel_key = ra.res_artikel_key)
         AND res_artikel_verwijder IS NULL;
   END IF;

   FOR rec IN c1
   LOOP
      BEGIN
         v_count_tot := v_count_tot + 1;
         v_res_kostensoort_key := NULL;

         IF rec.res_kostensoort_oms IS NOT NULL
         THEN
            BEGIN
               SELECT prs_kostensoort_key
                 INTO v_res_kostensoort_key
                 FROM prs_kostensoort
                WHERE prs_kostensoort_oms = rec.res_kostensoort_oms;
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  SELECT prs_s_prs_kostensoort_key.NEXTVAL
                    INTO v_res_kostensoort_key
                    FROM DUAL;

                  INSERT INTO prs_kostensoort
                              (prs_kostensoort_key,
                               prs_kostensoort_oms
                              )
                       VALUES (v_res_kostensoort_key,
                               rec.res_kostensoort_oms
                              );
            END;
         END IF;

         BEGIN
            SELECT ins_discipline_key
              INTO v_res_discipline_key
              FROM res_discipline
             WHERE ins_discipline_omschrijving = rec.res_discipline_oms
               AND ins_discipline_min_level = 2
               AND ins_discipline_verwijder IS NULL;

            UPDATE ins_tab_discipline
               SET prs_kostensoort_key = v_res_kostensoort_key
             WHERE ins_discipline_key = v_res_discipline_key;

         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               INSERT INTO ins_tab_discipline
                           (ins_discipline_module,
                            ins_discipline_omschrijving,
                            ins_discipline_min_level,
                            prs_kostensoort_key
                           )
                    VALUES ('RES',
                            rec.res_discipline_oms,
                            2,
                            v_res_kostensoort_key
                           )
                RETURNING ins_discipline_key
                     INTO v_res_discipline_key;

               INSERT INTO res_disc_params
                           (res_ins_discipline_key
                           )
                    VALUES (v_res_discipline_key
                           );
         END;

         IF rec.res_artikel_key IS NULL
         THEN
            INSERT INTO res_artikel
                        (res_discipline_key, res_artikel_nr,
                         res_artikel_omschrijving,
                         res_artikel_eenheid, res_artikel_prijs,
                         res_artikel_prijs_vast,
                         res_artikel_inkoopprijs, res_artikel_btw,
                         res_artikel_opmerking, res_artikel_groep,
                         res_artikel_kostenpersoneel,
                         res_artikel_kostenalgemeen,
                         res_artikel_volgnummer,
                         res_artikel_ingangsdatum,
                         res_artikel_vervaldatum,
                         res_artikel_minimum
                        )
                 VALUES (v_res_discipline_key, rec.res_artikel_nr,
                         rec.res_artikel_omschrijving,
                         rec.res_artikel_eenheid, rec.res_artikel_prijs,
                         rec.res_artikel_prijs_vast,
                         rec.res_artikel_inkoopprijs, rec.res_artikel_btw,
                         rec.res_artikel_opmerking, rec.res_artikel_groep,
                         rec.res_artikel_kostenpersoneel,
                         rec.res_artikel_kostenalgemeen,
                         rec.res_artikel_volgnummer,
                         rec.res_artikel_ingangsdatum,
                         rec.res_artikel_vervaldatum,
                         rec.res_artikel_minimum
                        );

            v_count_ins := v_count_ins + 1;
         ELSE
            UPDATE res_artikel
               SET res_discipline_key = v_res_discipline_key,
                   res_artikel_nr = rec.res_artikel_nr,
                   res_artikel_omschrijving = rec.res_artikel_omschrijving,
                   res_artikel_eenheid = rec.res_artikel_eenheid,
                   res_artikel_prijs = rec.res_artikel_prijs,
                   res_artikel_prijs_vast = rec.res_artikel_prijs_vast,
                   res_artikel_inkoopprijs = rec.res_artikel_inkoopprijs,
                   res_artikel_kostenpersoneel =
                                               rec.res_artikel_kostenpersoneel,
                   res_artikel_kostenalgemeen = rec.res_artikel_kostenalgemeen,
                   res_artikel_btw = rec.res_artikel_btw,
                   res_artikel_opmerking = rec.res_artikel_opmerking,
                   res_artikel_groep = rec.res_artikel_groep,
                   res_artikel_volgnummer = rec.res_artikel_volgnummer,
                   res_artikel_ingangsdatum = rec.res_artikel_ingangsdatum,
                   res_artikel_vervaldatum = rec.res_artikel_vervaldatum,
                   res_artikel_minimum = rec.res_artikel_minimum
             WHERE res_artikel_key = rec.res_artikel_key;

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

   fac.imp_writelog (p_import_key,
                     'S',
                        'Reserveringen: aantal artikelregels: '
                     || TO_CHAR (v_count_tot),
                     ''
                    );

   IF v_count_ins <> 0
   THEN
      fac.imp_writelog
                      (p_import_key,
                       'S',
                          'Reserveringen: aantal artikelregels toegevoegd: '
                       || TO_CHAR (v_count_ins),
                       ''
                      );
   END IF;

   IF v_count_update <> 0
   THEN
      fac.imp_writelog (p_import_key,
                        'S',
                           'Reserveringen: aantal artikelregels aangepast: '
                        || TO_CHAR (v_count_update),
                        ''
                       );
   END IF;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      v_errormsg := ' (ORACLE error ' || SUBSTR (SQLERRM, 1, 150) || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        'Importproces verbruiksartikelen afgebroken!' || v_errormsg,
                        ''
                       );
END fac_update_res_artikel_sync;
/


CREATE OR REPLACE PROCEDURE fac_import_fac_groep (
   p_import_key IN NUMBER
)
IS
   c_fielddelimitor   VARCHAR2 (2)    := fac.import_delimiter(p_import_key);
   v_newline          fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
   v_errormsg         VARCHAR (1000);
   oracle_err_mes     VARCHAR2 (200);
   header_is_valid    NUMBER;
   v_count_tot        NUMBER (10);
   v_count_import     NUMBER (10);
   v_aanduiding       VARCHAR (200);
   -- De importvelden:
   v_naam             VARCHAR (100);
   v_functiecode      VARCHAR2 (100);
   v_srtdiscipline    VARCHAR2 (100);
   v_discipline       VARCHAR2 (100);
   v_orgread          VARCHAR2 (100);
   v_orgwrite         VARCHAR2 (100);
   v_algread          VARCHAR2 (100);
   v_algwrite         VARCHAR2 (100);

   CURSOR c1
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   -- Eerst opruiming
   DELETE FROM fac_imp_fac_groep;

   v_count_tot := 0;
   v_count_import := 0;
   header_is_valid := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout opvragen te importeren rij';
         v_aanduiding := '';
         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_fielddelimitor, v_naam);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_functiecode);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_srtdiscipline);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_discipline);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_orgread);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_orgwrite);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_algread);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_algwrite);
         v_aanduiding :=
               '|'
            || v_naam
            || '|'
            || v_functiecode
            || '|'
            || v_srtdiscipline
            || '|'
            || v_discipline
            || '|'
            || v_orgread
            || '|'
            || v_orgwrite
            || '|'
            || v_algread
            || '|'
            || v_algwrite
            || '| ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer maar een aantal kolommen, ik zou ze ook
         -- allemaal kunnen doen..
         -- Ik negeer alles totdat ik een geldige header gepasseerd ben
         IF (header_is_valid = 0)
         THEN
            IF UPPER (v_naam) = 'GROEP' AND UPPER (v_discipline) = 'VAKGROEP' AND UPPER (v_algwrite) = 'PLAATS_SCHRIJVEN'
            THEN
               header_is_valid := 1;
            END IF;
         ELSIF header_is_valid = 1
         THEN
            v_count_tot := v_count_tot + 1;

            BEGIN
               INSERT INTO fac_imp_fac_groep
                           (naam, functiecode, srtdiscipline, discipline, orgread, orgwrite, algread, algwrite)
                    VALUES (SUBSTR (v_naam, 1, 30),
                            SUBSTR (v_functiecode, 1, 10),
                            SUBSTR (v_srtdiscipline, 1, 30),
                            SUBSTR (v_discipline, 1, 60),
                            fac.safe_to_number (v_orgread),
                            fac.safe_to_number (v_orgwrite),
                            fac.safe_to_number (v_algread),
                            fac.safe_to_number (v_algwrite)
                           );

               v_count_import := v_count_import + 1;
            EXCEPTION
               WHEN OTHERS
               THEN
                  oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                  v_errormsg := ' ORACLE (error ' || oracle_err_mes || ')';
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_aanduiding,
                                    'Fout bij toevoegen regel aan importtabel FAC_IMP_MLD. ' || v_errormsg
                                   );
            END;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key, 'E', v_aanduiding || 'Ongeldig importbestand', 'Toelichting: ... ');
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                        'Autorisatiegroepen: aantal ingelezen regels: ' || TO_CHAR (v_count_tot),
                        ''
                       );
      fac.imp_writelog (p_import_key,
                        'S',
                           'Autorisatiegroepen: aantal ongeldige niet ingelezen importregels: <b>'
                        || TO_CHAR (v_count_tot - v_count_import),
                        ''
                       );
   END IF;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'OTHERS (error ' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key, 'E', v_errormsg, 'Inleesproces autorisatiegroepen afgebroken!');
END fac_import_fac_groep;
/


CREATE OR REPLACE PROCEDURE fac_update_fac_groep (p_import_key IN NUMBER)
AS
   CURSOR c1
   IS
      SELECT DISTINCT i.naam
                 FROM fac_imp_fac_groep i
                WHERE i.orgread IS NOT NULL
                  AND i.orgwrite IS NOT NULL
                  AND i.algread IS NOT NULL
                  AND i.algwrite IS NOT NULL;

   CURSOR c2
   IS
      SELECT i.naam, f.fac_functie_key, NULL discipline, i.orgread, i.orgwrite, i.algread, i.algwrite, NULL srtdiscipline
        FROM fac_imp_fac_groep i, fac_functie f
       WHERE functiecode = f.fac_functie_code
         AND f.fac_functie_discipline = 0
         AND i.orgread IS NOT NULL
         AND i.orgwrite IS NOT NULL
         AND i.algread IS NOT NULL
         AND i.algwrite IS NOT NULL
      UNION ALL
       SELECT i.naam, f.fac_functie_key, d.ins_discipline_key, i.orgread, i.orgwrite, i.algread, i.algwrite, sd.ins_srtdiscipline_key
        FROM fac_imp_fac_groep i, fac_functie f, ins_tab_discipline d, ins_srtdiscipline sd
       WHERE functiecode = f.fac_functie_code
         AND f.fac_functie_discipline = 1
         AND i.orgread IS NOT NULL
         AND i.orgwrite IS NOT NULL
         AND i.algread IS NOT NULL
         AND i.algwrite IS NOT NULL
         AND f.fac_functie_module = d.ins_discipline_module
         AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key(+)
         AND UPPER (TRIM(coalesce(sd.ins_srtdiscipline_omschrijving,'###'))) = UPPER (TRIM(coalesce(i.srtdiscipline,'###')))
         AND UPPER (TRIM(d.ins_discipline_omschrijving)) = UPPER (TRIM(i.discipline))
         AND sd.ins_srtdiscipline_verwijder IS NULL
         AND d.ins_discipline_verwijder IS NULL;

   -- Eventueel niet bestaande vakgroeptypen+vakgroepen of catalogie (BES/RES), die gaan we loggen.
   CURSOR c3
   IS
       SELECT i.naam, i.functiecode, i.srtdiscipline, i.discipline, i.orgread, i.orgwrite, i.algread, i.algwrite
       FROM fac_imp_fac_groep i, fac_functie f
       WHERE functiecode = f.fac_functie_code
       AND f.fac_functie_discipline = 1
       AND NOT EXISTS (SELECT 'x' FROM ins_tab_discipline d, ins_srtdiscipline sd
                         WHERE f.fac_functie_module = d.ins_discipline_module
                         AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key(+)
                         AND UPPER (TRIM(coalesce(sd.ins_srtdiscipline_omschrijving,'###'))) = UPPER (TRIM(coalesce(i.srtdiscipline,'###')))
                         AND UPPER (TRIM(d.ins_discipline_omschrijving)) = UPPER (TRIM(i.discipline))
                         AND sd.ins_srtdiscipline_verwijder IS NULL
                         AND d.ins_discipline_verwijder IS NULL);

   -- Eventueel foute autorisatiecijfers loggen
   CURSOR c4
   IS
      SELECT i.naam, i.functiecode, i.srtdiscipline, i.discipline, i.orgread, i.orgwrite, i.algread, i.algwrite
      FROM fac_imp_fac_groep i
      WHERE (i.orgread IS NULL
             OR i.orgwrite IS NULL
             OR i.algread IS NULL
             OR i.algwrite IS NULL);


   v_errormsg           VARCHAR2 (1000);
   v_count_tot          NUMBER (10);
   v_count_update       NUMBER (10);
   v_count_ins          NUMBER (10);
   v_discipline_key     NUMBER (10);
   v_groep_key          NUMBER (10);
   v_count              NUMBER (10);
   v_groeprechten_key   NUMBER (10);
BEGIN
   v_count_tot := 0;
   v_count_update := 0;
   v_count_ins := 0;

   SELECT COUNT (*)
     INTO v_count
     FROM fac_imp_fac_groep;

   -- markeer bestaande artikelen om verwijderd te worden
   IF v_count = 0
   THEN
      RETURN;
   END IF;

   -- Logging van de onbekende vakgroeptypen, vakgroepen en/of catalogi...
   FOR rec3 IN c3
   LOOP
       fac.imp_writelog (p_import_key,
         'E',
         'Onbekend vakgroep(type) / catalogus: bij autorisatiegroep:' || rec3.naam,
         'Functiecode: ' || rec3.functiecode
         || ', Vakgroeptype: ' || rec3.srtdiscipline
         || ', Vakgroep: ' || rec3.discipline
         || ', Autorisaties (O-R/W A-R/W): ' || rec3.orgread || '/' || rec3.orgwrite || '/' || rec3.algread || '/' || rec3.algwrite
        );
   END LOOP;

   -- Logging van eventuele lege autorisatiegetallen...
   FOR rec4 IN c4
   LOOP
       fac.imp_writelog (p_import_key,
         'E',
         'Lege autorisatie: bij autorisatiegroep:' || rec4.naam,
         'Functiecode: ' || rec4.functiecode
         || ', Vakgroeptype: ' || rec4.srtdiscipline
         || ', Vakgroep: ' || rec4.discipline
         || ', Autorisaties (O-R/W A-R/W): ' || rec4.orgread || '/' || rec4.orgwrite || '/' || rec4.algread || '/' || rec4.algwrite
        );
   END LOOP;

   -- Maak de groepen aan
   FOR rec1 IN c1
   LOOP
      BEGIN
         SELECT fac_groep_key
           INTO v_groep_key
           FROM fac_groep
          WHERE UPPER (fac_groep_omschrijving) = UPPER (rec1.naam);
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            INSERT INTO fac_groep
                        (fac_groep_omschrijving)
                 VALUES (rec1.naam);

            fac.imp_writelog (p_import_key,
                              'I',
                              'Nieuwe autorisatiegroep toegevoegd: ' || rec1.naam,
                              ''
                             );
      END;
   END LOOP;

   -- Ken de rechten toe
   FOR rec2 IN c2
   LOOP
      BEGIN
         SELECT fac_groep_key
           INTO v_groep_key
           FROM fac_groep
          WHERE UPPER (fac_groep_omschrijving) = UPPER (rec2.naam);

         BEGIN
            -- Moet een update of een insert gedaan worden
            IF rec2.discipline IS NULL
            THEN
               SELECT fac_groeprechten_key
                 INTO v_groeprechten_key
                 FROM fac_groeprechten
                WHERE fac_groep_key = v_groep_key
                  AND fac_functie_key = rec2.fac_functie_key
                  AND ins_discipline_key IS NULL;

               UPDATE fac_groeprechten
                  SET fac_gebruiker_prs_level_read = rec2.orgread,
                      fac_gebruiker_prs_level_write = rec2.orgwrite,
                      fac_gebruiker_alg_level_read = rec2.algread,
                      fac_gebruiker_alg_level_write = rec2.algwrite
                WHERE fac_groep_key = v_groep_key
                  AND fac_functie_key = rec2.fac_functie_key
                  AND ins_discipline_key IS NULL;
            ELSE
               SELECT fac_groeprechten_key
                 INTO v_groeprechten_key
                 FROM fac_groeprechten
                WHERE fac_groep_key = v_groep_key
                  AND fac_functie_key = rec2.fac_functie_key
                  AND ins_discipline_key = rec2.discipline;

               UPDATE fac_groeprechten
                  SET fac_gebruiker_prs_level_read = rec2.orgread,
                      fac_gebruiker_prs_level_write = rec2.orgwrite,
                      fac_gebruiker_alg_level_read = rec2.algread,
                      fac_gebruiker_alg_level_write = rec2.algwrite
                WHERE fac_groep_key = v_groep_key
                  AND fac_functie_key = rec2.fac_functie_key
                  AND ins_discipline_key = rec2.discipline;
            END IF;

            v_count_tot := v_count_tot + 1;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               BEGIN
                  INSERT INTO fac_groeprechten
                              (fac_groep_key,
                               fac_functie_key,
                               ins_discipline_key,
                               fac_gebruiker_prs_level_read,
                               fac_gebruiker_prs_level_write,
                               fac_gebruiker_alg_level_read,
                               fac_gebruiker_alg_level_write
                              )
                       VALUES (v_groep_key,
                               rec2.fac_functie_key,
                               rec2.discipline,
                               rec2.orgread,
                               rec2.orgwrite,
                               rec2.algread,
                               rec2.algwrite
                              );

                  v_count_tot := v_count_tot + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     v_errormsg := ' (ORACLE error ' || SUBSTR (SQLERRM, 1, 900) || ')';
                     fac.imp_writelog (p_import_key,
                                       'W',
                                       'Probleem bij het toevoegen van nieuwe fac_groeprecht ' || v_errormsg,
                                          rec2.naam
                                       || ', '
                                       || TO_CHAR (v_groep_key)
                                       || ', '
                                       || TO_CHAR (rec2.fac_functie_key)
                                       || ', '
                                       || TO_CHAR (rec2.srtdiscipline)
                                       || '/'
                                       || TO_CHAR (rec2.discipline)
                                      );
               END;
            WHEN OTHERS
            THEN
               v_errormsg := ' (ORACLE error ' || SUBSTR (SQLERRM, 1, 900) || ')';
               fac.imp_writelog (p_import_key,
                                 'W',
                                 'Probleem bij vinden fac_groeprechten/updaten van fac_groeprecht ' || v_errormsg,
                                    rec2.naam
                                 || ', '
                                 || TO_CHAR (v_groep_key)
                                 || ', '
                                 || TO_CHAR (rec2.fac_functie_key)
                                 || ', '
                                 || TO_CHAR (rec2.srtdiscipline)
                                 || '/'
                                 || TO_CHAR (rec2.discipline)
                                );
         END;
      EXCEPTION
         WHEN OTHERS
         THEN
            v_errormsg := ' (ORACLE error ' || SUBSTR (SQLERRM, 1, 900) || ')';
            fac.imp_writelog (p_import_key,
                              'W',
                              'Probleem bij definieren ' || v_errormsg,
                                 rec2.naam
                              || ', '
                              || TO_CHAR (v_groep_key)
                              || ', '
                              || TO_CHAR (rec2.fac_functie_key)
                              || ', '
                              || TO_CHAR (rec2.srtdiscipline)
                              || '/'
                              || TO_CHAR (rec2.discipline)
                             );
      END;
   END LOOP;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      v_errormsg := ' (ORACLE error ' || SUBSTR (SQLERRM, 1, 900) || ')';
      fac.imp_writelog (p_import_key, 'E', 'Importproces autorisatiegroepen afgebroken! ' || v_errormsg, '');
END fac_update_fac_groep;
/

-- Verwijder eerst de autorisaties van de autorisatiegroepen die voorkomen in bestand (importtabel)
CREATE OR REPLACE PROCEDURE fac_delete_fac_groep (p_import_key IN NUMBER)
AS
   CURSOR c1
   IS
      SELECT DISTINCT i.naam
                 FROM fac_imp_fac_groep i
                WHERE i.orgread IS NOT NULL
                  AND i.orgwrite IS NOT NULL
                  AND i.algread IS NOT NULL
                  AND i.algwrite IS NOT NULL;
   v_errormsg           VARCHAR2 (1000);
   v_discipline_key     NUMBER (10);
   v_groep_key          NUMBER (10);
   v_count              NUMBER (10);
BEGIN
   SELECT COUNT (*)
     INTO v_count
     FROM fac_imp_fac_groep;

   IF v_count = 0
   THEN
      RETURN;
   END IF;

   -- Verwijder de rechten van de groep(en( die in het bestand staat(n).
   FOR rec1 IN c1
   LOOP
      BEGIN
         SELECT fac_groep_key
           INTO v_groep_key
           FROM fac_groep
          WHERE UPPER (fac_groep_omschrijving) = UPPER (rec1.naam);

          DELETE fac_groeprechten
          WHERE fac_groep_key = v_groep_key;

      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            NULL;
      END;
   END LOOP;
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      v_errormsg := ' (ORACLE error ' || SUBSTR (SQLERRM, 1, 900) || ')';
      fac.imp_writelog (p_import_key, 'E', 'Importproces autorisatiegroepen afgebroken! ' || v_errormsg, '');
END fac_delete_fac_groep;
/

CREATE OR REPLACE PROCEDURE fac_import_fac_groep_del (
  p_import_key IN NUMBER
) IS
BEGIN
  fac_import_fac_groep(p_import_key);
END fac_import_fac_groep_del;
/

-- Verwijder eerst de autorisaties van de autorisatiegroepen die voorkomen in bestand (importtabel):fac_delete_fac_groep
-- En vul daarna de autorisatiegroep opnieuw in: fac_update_fac_groep
CREATE OR REPLACE PROCEDURE fac_update_fac_groep_del (
  p_import_key IN NUMBER
) IS

BEGIN
  fac_delete_fac_groep(p_import_key);
  fac_update_fac_groep(p_import_key);
END fac_update_fac_groep_del;
/


-- Verwijder eerst de autorisaties van alle vakgroepen die voorkomen in bestand (importtabel)
CREATE OR REPLACE PROCEDURE fac_delete_fac_vakgroep (p_import_key IN NUMBER)
AS
   CURSOR c1
   IS
      SELECT DISTINCT d.ins_discipline_key
        FROM fac_imp_fac_groep i, fac_functie f, ins_tab_discipline d, ins_srtdiscipline sd
       WHERE i.functiecode = f.fac_functie_code
         AND f.fac_functie_discipline = 1
         AND i.orgread IS NOT NULL
         AND i.orgwrite IS NOT NULL
         AND i.algread IS NOT NULL
         AND i.algwrite IS NOT NULL
         AND f.fac_functie_module = d.ins_discipline_module
         AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key(+)
         AND UPPER (TRIM(coalesce(sd.ins_srtdiscipline_omschrijving,'###'))) = UPPER (TRIM(coalesce(i.srtdiscipline,'###')))
         AND UPPER (TRIM(d.ins_discipline_omschrijving)) = UPPER (TRIM(i.discipline))
         AND sd.ins_srtdiscipline_verwijder IS NULL
         AND d.ins_discipline_verwijder IS NULL;
   v_errormsg           VARCHAR2 (1000);
   v_discipline_key     NUMBER (10);
   v_groep_key          NUMBER (10);
   v_count              NUMBER (10);
BEGIN
   SELECT COUNT (*)
     INTO v_count
     FROM fac_imp_fac_groep;

   IF v_count = 0
   THEN
      RETURN;
   END IF;

   -- Verwijder de rechten van de groep(en( die in het bestand staat(n).
   FOR rec1 IN c1
   LOOP
      BEGIN
          DELETE fac_groeprechten
          WHERE ins_discipline_key = rec1.ins_discipline_key;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
             NULL;  -- bedoelen we dit?
      END;
   END LOOP;
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      v_errormsg := ' (ORACLE error ' || SUBSTR (SQLERRM, 1, 900) || ')';
      fac.imp_writelog (p_import_key, 'E', 'Importproces autorisatiegroepen afgebroken! ' || v_errormsg, '');
END fac_delete_fac_vakgroep;
/

CREATE OR REPLACE PROCEDURE fac_import_fac_vakgroep_del (
  p_import_key IN NUMBER
) IS
BEGIN
  fac_import_fac_groep(p_import_key);
END fac_import_fac_vakgroep_del;
/

--Verwijder eerst de autorisaties van de vakgroepen die voorkomen in bestand (importtabel), over alle autorisatiegroepen heen
--En vul daarna de autorisatiegroep opnieuw in: fac_update_fac_groep
CREATE OR REPLACE PROCEDURE fac_update_fac_vakgroep_del (
  p_import_key IN NUMBER
) IS

BEGIN
  fac_delete_fac_vakgroep(p_import_key);
  fac_update_fac_groep(p_import_key);
END fac_update_fac_vakgroep_del;
/

--------------------------------


CREATE OR REPLACE PROCEDURE fac_import_fac_gebruikersgroep (
   p_import_key IN NUMBER
)
IS
   c_fielddelimitor   VARCHAR2 (2)    := fac.import_delimiter(p_import_key);
   v_newline          fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
   v_errormsg         VARCHAR (1000);
   oracle_err_mes     VARCHAR2 (200);
   header_is_valid    NUMBER;
   v_count_tot        NUMBER (10);
   v_count_import     NUMBER (10);
   v_aanduiding       VARCHAR (200);
   -- De importvelden:
   v_groep            VARCHAR2 (100);
   v_personeelsnummer VARCHAR2 (100);
   v_login            VARCHAR2 (100);
   v_email            VARCHAR2 (255);

   CURSOR c1
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   -- Eerst opruiming
   DELETE FROM fac_imp_fac_gebruikersgroep;

   v_count_tot := 0;
   v_count_import := 0;
   header_is_valid := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout opvragen te importeren rij';
         v_aanduiding := '';
         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_fielddelimitor, v_groep);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_personeelsnummer);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_login);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_email);
         v_aanduiding :=
               '|'
            || v_groep
            || '|'
            || v_personeelsnummer
            || '|'
            || v_login
            || '|'
            || v_email
            || '| ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer alleen de verplichte kolommen, ik zou ze ook
         -- allemaal kunnen doen..
         -- Ik negeer alles totdat ik een geldige header gepasseerd ben
         IF (header_is_valid = 0)
         THEN
            IF    UPPER (v_groep) = 'GROEP'
              AND UPPER (v_personeelsnummer) = 'PERSONEELSNUMMER'
              AND UPPER (v_login) = 'LOGIN'
              AND UPPER (v_email) = 'EMAIL'
            THEN
               header_is_valid := 1;
            END IF;
         ELSIF header_is_valid = 1
         THEN
            v_count_tot := v_count_tot + 1;

            BEGIN
               INSERT INTO fac_imp_fac_gebruikersgroep
                           (groep, personeelsnummer, login, email)
                    VALUES (v_groep,
                            v_personeelsnummer,
                            v_login,
                            v_email
                           );

               v_count_import := v_count_import + 1;
            EXCEPTION
               WHEN OTHERS
               THEN
                  oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                  v_errormsg := ' ORACLE (error ' || oracle_err_mes || ')';
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_aanduiding,
                                    'Fout bij toevoegen regel aan importtabel FAC_IMP_GEBRUIKERSGROEP. ' || v_errormsg
                                   );
            END;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key, 'E', v_aanduiding || 'Ongeldig importbestand', 'Toelichting: ... ');
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                        'Gebruikersgroepen: aantal ingelezen regels: ' || TO_CHAR (v_count_tot),
                        ''
                       );
      fac.imp_writelog (p_import_key,
                        'S',
                           'Gebruikersgroepen: aantal ongeldige niet ingelezen importregels: <b>'
                        || TO_CHAR (v_count_tot - v_count_import),
                        ''
                       );
   END IF;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'OTHERS (error ' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key, 'E', v_errormsg, 'Inleesproces gebruikersgroepen afgebroken!');
END fac_import_fac_gebruikersgroep;
/

CREATE OR REPLACE PROCEDURE fac_update_fac_gebruikersgroep (p_import_key IN NUMBER)
AS
   CURSOR c1
   IS
      SELECT DISTINCT i.groep, i.personeelsnummer, i.login, i.email
                 FROM fac_imp_fac_gebruikersgroep i;

   v_errormsg           VARCHAR2 (1000);
   v_count_tot          NUMBER (10);
   v_count_update       NUMBER (10);
   v_count_ins          NUMBER (10);
   v_perslid_key        NUMBER (10);
   v_perslid_count      NUMBER (10);
   v_groep_key          NUMBER (10);
   v_count              NUMBER (10);
   v_count2             NUMBER (10);
   v_count_gg           NUMBER (10);
   v_hint               VARCHAR2 (1000);
BEGIN
   v_count_tot := 0;
   v_count_update := 0;
   v_count_ins := 0;

   SELECT COUNT (*)
     INTO v_count
     FROM fac_gebruikersgroep;

   IF v_count = 0
   THEN
      RETURN;
   END IF;

   -- Maak de records aan
   FOR rec1 IN c1
   LOOP
      BEGIN
         v_groep_key := NULL;
         -- bekijk of de groep bestaat
         v_hint := 'Zoek groep: ' || rec1.groep;

         SELECT fac_groep_key
           INTO v_groep_key
           FROM fac_groep
          WHERE UPPER (fac_groep_omschrijving) = UPPER (rec1.groep);
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            fac.imp_writelog (p_import_key,
                              'E',
                              'Gebruikersgroepen: kan groep niet vinden: ' || rec1.groep,
                              'Controleer waarom groep niet bestaat of maak nieuwe groep aan.'
                             );
      END;

      BEGIN
         -- bekijk of de persoon bestaat
         v_hint := '';
         v_perslid_key := NULL;

         IF rec1.personeelsnummer IS NOT NULL
         THEN
            v_hint := 'Zoek personeelsnummer: ' || rec1.personeelsnummer;
            -- controleer personeelsnummer
            SELECT COUNT(prs_perslid_key)
              INTO v_perslid_count
              FROM prs_v_aanwezigperslid
             WHERE UPPER (prs_perslid_nr) = UPPER (rec1.personeelsnummer);

            IF v_perslid_count = 1 THEN
               SELECT prs_perslid_key
                 INTO v_perslid_key
                 FROM prs_v_aanwezigperslid
                WHERE UPPER (prs_perslid_nr) = UPPER (rec1.personeelsnummer);
            ELSE
            -- probeer de match op de nummerieke waarde van het nummer ivm voorloopnullen
               SELECT COUNT(prs_perslid_key)
                 INTO v_perslid_count
                 FROM prs_v_aanwezigperslid
                WHERE FAC.SAFE_TO_NUMBER(prs_perslid_nr) = FAC.SAFE_TO_NUMBER (rec1.personeelsnummer);

               IF v_perslid_count = 1 THEN
                  SELECT prs_perslid_key
                    INTO v_perslid_key
                    FROM prs_v_aanwezigperslid
                   WHERE FAC.SAFE_TO_NUMBER(prs_perslid_nr) = FAC.SAFE_TO_NUMBER (rec1.personeelsnummer);
               ELSE
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    'Gebruikersgroepen: kan persoon niet vinden (op basis van nummer): ' || rec1.personeelsnummer,
                                    'Controleer of persoon voorkomt in Facilitor.'
                                   );
               END IF;

            END IF;
         ELSIF rec1.login IS NOT NULL
         THEN
            v_hint := 'Zoek login: ' || rec1.login;
            -- controleer login
            SELECT COUNT(prs_perslid_key)
              INTO v_perslid_count
              FROM prs_v_aanwezigperslid
             WHERE UPPER (prs_perslid_oslogin) = UPPER (rec1.login);

            IF v_perslid_count = 1 THEN
               SELECT prs_perslid_key
                 INTO v_perslid_key
                 FROM prs_v_aanwezigperslid
                WHERE UPPER (prs_perslid_oslogin) = UPPER (rec1.login);
            ELSE
               fac.imp_writelog (p_import_key,
                                 'E',
                                 'Gebruikersgroepen: kan persoon niet vinden (op basis van login): ' || rec1.login,
                                 'Controleer of persoon voorkomt in Facilitor.'
                                );
            END IF;
         ELSIF rec1.email IS NOT NULL
         THEN
            v_hint := 'Zoek email: ' || rec1.email;
            -- controleer email
            SELECT COUNT(prs_perslid_key)
              INTO v_perslid_count
              FROM prs_v_aanwezigperslid
             WHERE INSTR(UPPER (prs_perslid_email), UPPER (rec1.email)) >0;

            IF v_perslid_count = 1 THEN
               SELECT prs_perslid_key
                 INTO v_perslid_key
                 FROM prs_v_aanwezigperslid
                WHERE INSTR(UPPER (prs_perslid_email), UPPER (rec1.email)) >0;
            ELSE
               fac.imp_writelog (p_import_key,
                                 'E',
                                 'Gebruikersgroepen: kan persoon niet vinden (op basis van email): ' || rec1.email,
                                 'Controleer of persoon voorkomt in Facilitor.'
                                );
            END IF;
         END IF;

         IF v_groep_key IS NOT NULL AND v_perslid_key IS NOT NULL
         THEN
            SELECT count(fac_gebruikersgroep_key)
              INTO v_count_gg
              FROM fac_gebruikersgroep
             WHERE fac_groep_key = v_groep_key
               AND prs_perslid_key = v_perslid_key;

            IF v_count_gg = 0 THEN
               INSERT INTO fac_gebruikersgroep (fac_groep_key, prs_perslid_key)
               VALUES (v_groep_key, v_perslid_key);

               fac.imp_writelog (p_import_key,
                                 'I',
                                 'Gebruikersgroepen: persoon-groep toegevoegd: ' || rec1.groep || '-n:' || rec1.personeelsnummer || ' l:' || rec1.login || ' e:' || rec1.email,
                                 ''
                                );
            ELSE
               fac.imp_writelog (p_import_key,
                                 'I',
                                 'Gebruikersgroepen: persoon-groep relatie bestaat al: ' || rec1.groep || '-n:' || rec1.personeelsnummer || ' l:' || rec1.login || ' e:' || rec1.email,
                                 ''
                                );
            END IF;
         END IF;

      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            fac.imp_writelog (p_import_key,
                              'E',
                              'Gebruikersgroepen: kan groep niet vinden: ' || rec1.groep,
                              'Controleer waarom groep niet bestaat of maak nieuwe groep aan.'
                             );
      END;
   END LOOP;

   SELECT COUNT (*)
     INTO v_count2
     FROM fac_gebruikersgroep;

   fac.imp_writelog (p_import_key,
                     'S',
                     'Gebruikersgroepen: aantal records toegevoegd: ' || to_char(v_count2 - v_count),
                     ''
                    );

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      v_errormsg := ' (ORACLE error ' || SUBSTR (SQLERRM, 1, 900) || ')';
      fac.imp_writelog (p_import_key, 'E', 'Importproces gebruikersgroep afgebroken! ' || v_errormsg, v_hint);
END fac_update_fac_gebruikersgroep;
/


-- MB 150219, Hieronder de COMMON EXT-bedrijven FIP import / SYNC functie (obv leveranciernummer)

-- p_seq_of_columns geeft aan op welke plek in de CVS het bedrijfsnaam staat, leveranciersnummer etc etc.
-- p_checkheader is 0 of 1, bij 0 bestaat er geen header, bij 1 wordt de header niet gecheckt, bij 2 wordt de header wel gecheckt.
CREATE OR REPLACE PROCEDURE fac_import_bedrijf_body (
   p_import_key IN NUMBER,
   p_seq_of_columns IN VARCHAR2,
   p_checkheader IN NUMBER
)
IS


----- STANDAARD Variabelelijst met hun volgnummer
-- 1 BEDRIJFSNAAM';
-- 2 LEVERANCIERNUMMER';
-- 3 BEZOEK_ADRES';
-- 4 BEZOEK_POSTCODE';
-- 5 BEZOEK_PLAATS';
-- 6 BEZOEK_LAND';
-- 7 POST_ADRES';
-- 8 POST_POSTCODE';
-- 9 POST_PLAATS';
-- 10 POST_LAND';
-- 11 BEDRIJF_TELEFOON';
-- 12 BEDRIJF_FAX';
-- 13 BEDRIJF_EMAIL';
-- 14 CONTACTPERSOON';
-- 15 CONTACT_TELEFOON';
-- 16 CONTACT_FAX';
-- 17 BEDRIJF_XSL';
-- 18 BEDRIJF_MLD_ORDER_ADRES';
-- 19 LEVERANCIER';
-- 20 UITVOERENDE';
-- 21 CONTRACTANT';
-- 22 HUURDER';
-- 23 TOONINGIDS';
-- 24 UURLOON';
-- 25 OVEREENKOMSTNUMMER';
-- 26 OVEREENKOMSTDATUM';
-- 27 OPMERKING';
-- 28 DIENST';
-- 29 LOCATIECODE';
-- 30 GEBOUWCODE';
-- 31 RELATIETYPE';
-- 32 OVERIG1';
-- 33 OVERIG2';
-- 34 OVERIG3';


   c_delim                          VARCHAR2 (2)    := fac.import_delimiter(p_import_key);
   v_newline                        fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
   v_errormsg                       VARCHAR2 (1000);
   v_errorhint                      VARCHAR2 (1000);
   oracle_err_num                   NUMBER;
   oracle_err_mes                   VARCHAR2 (200);
   header_is_valid                  NUMBER;
   v_count_tot                      NUMBER (10);
   v_count_import                   NUMBER (10);
   v_ongeldig                       NUMBER (1);
   v_aanduiding                     VARCHAR (200);
   -- De importvelden:
   v_prs_bedrijf_naam               VARCHAR2 (256);                    -- C60
   v_prs_leverancier_nr             VARCHAR2 (256);                    -- C50
   v_prs_bedrijf_bezoek_adres       VARCHAR2 (256);                    -- C50
   v_prs_bedrijf_bezoek_postcode    VARCHAR2 (256);                    -- C12
   v_prs_bedrijf_bezoek_plaats      VARCHAR2 (256);                    -- C30
   v_prs_bedrijf_bezoek_land        VARCHAR2 (256);                    -- C30
   v_prs_bedrijf_telefoon           VARCHAR2 (256);                    -- C20
   v_prs_bedrijf_fax                VARCHAR2 (256);                    -- C20
   v_prs_bedrijf_post_adres         VARCHAR2 (256);                    -- C50
   v_prs_bedrijf_post_postcode      VARCHAR2 (256);                    -- C12
   v_prs_bedrijf_post_plaats        VARCHAR2 (256);                    -- C30
   v_prs_bedrijf_post_land          VARCHAR2 (256);                    -- C30
   v_prs_bedrijf_contact_persoon    VARCHAR2 (256);                    -- C30
   v_prs_bedrijf_contact_telefoon   VARCHAR2 (256);                    -- C20
   v_prs_bedrijf_contact_fax        VARCHAR2 (256);                    -- C20
   v_prs_bedrijf_leverancier        VARCHAR2 (256);                     -- N1
   v_prs_bedrijf_uitvoerende        VARCHAR2 (256);                     -- N1
   v_prs_bedrijf_contract           VARCHAR2 (256);                     -- N1
   v_prs_bedrijf_huurder            VARCHAR2 (256);                     -- N1
   v_prs_bedrijf_ingids             VARCHAR2 (256);                     -- N1
   v_prs_bedrijf_uurloon            VARCHAR2 (256);                   -- N6,2
   v_prs_bedrijf_xsl                VARCHAR2 (256);                    --C256
   v_prs_bedrijf_mldorder_adres     VARCHAR2 (256);                    --C256
   v_prs_overeenkomst_nr            VARCHAR2 (256);                    -- C20
   v_prs_overeenkomst_datum         VARCHAR2 (256);                   -- DATE
   v_prs_bedrijf_email              VARCHAR2 (256);                   -- C100
   v_prs_bedrijf_opmerking          VARCHAR2 (512);                   -- C320
   v_prs_dienst_omschrijving        VARCHAR2 (256);                    -- C60
   v_alg_locatie_code               VARCHAR2 (256);                    -- C10
   v_alg_gebouw_code                VARCHAR2 (256);                    -- C12
   v_prs_relatietype                VARCHAR2 (256);                   -- C100
   v_prs_bedrijf_overig1            VARCHAR2 (256);                   -- C256
   v_prs_bedrijf_overig2            VARCHAR2 (256);                   -- C256
   v_prs_bedrijf_overig3            VARCHAR2 (256);                   -- C256

   -- Overig:
   v_prs_bedrijf_leverancier_n      NUMBER (1);                         -- N1
   v_prs_bedrijf_uitvoerende_n      NUMBER (1);                         -- N1
   v_prs_bedrijf_contract_n         NUMBER (1);                         -- N1
   v_prs_bedrijf_huurder_n          NUMBER (1);                         -- N1
   v_prs_bedrijf_ingids_n           NUMBER (1);                         -- N1
   v_prs_bedrijf_uurloon_n          NUMBER (6, 2);                    -- N6,2
   v_prs_overeenkomst_date          DATE;                             -- DATE


     -- De kolommen
      v_seq_of_columns VARCHAR2(255);
    v_colnr1 NUMBER;
    v_colnr2 NUMBER;
    v_colnr3 NUMBER;
    v_colnr4 NUMBER;
    v_colnr5 NUMBER;
    v_colnr6 NUMBER;
    v_colnr7 NUMBER;
    v_colnr8 NUMBER;
    v_colnr9 NUMBER;
    v_colnr10 NUMBER;
    v_colnr11 NUMBER;
    v_colnr12 NUMBER;
    v_colnr13 NUMBER;
    v_colnr14 NUMBER;
    v_colnr15 NUMBER;
    v_colnr16 NUMBER;
    v_colnr17 NUMBER;
    v_colnr18 NUMBER;
    v_colnr19 NUMBER;
    v_colnr20 NUMBER;
    v_colnr21 NUMBER;
    v_colnr22 NUMBER;
    v_colnr23 NUMBER;
    v_colnr24 NUMBER;
    v_colnr25 NUMBER;
    v_colnr26 NUMBER;
    v_colnr27 NUMBER;
    v_colnr28 NUMBER;
    v_colnr29 NUMBER;
    v_colnr30 NUMBER;
    v_colnr31 NUMBER;
    v_colnr32 NUMBER;
    v_colnr33 NUMBER;
    v_colnr34 NUMBER;

   CURSOR c1
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
    -- Eerst opruiming
    DELETE FROM fac_imp_ext_bedrijf;

        v_count_tot := 0;
        v_count_import := 0;
        header_is_valid := 0;

        IF p_checkheader = 0
        THEN -- Er is geen header, dus header is valid (en direct de waarden lezen)
            header_is_valid := 1;
        END IF;


        COMMIT;

        v_seq_of_columns := p_seq_of_columns;
        v_errorhint := 'Bepalen volgorde kolommen';

        -- De volgorde de te importeren kolommen in de CSV uitlezen uit v_seq_of_columns
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr1);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr2);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr3);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr4);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr5);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr6);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr7);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr8);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr9);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr10);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr11);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr12);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr13);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr14);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr15);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr16);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr17);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr18);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr19);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr20);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr21);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr22);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr23);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr24);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr25);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr26);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr27);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr28);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr29);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr30);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr31);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr32);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr33);
        fac.imp_getfield (v_seq_of_columns, c_delim, v_colnr34);

    FOR rec1 IN c1
    LOOP
      BEGIN
        v_newline := rec1.fac_imp_file_line;
        v_errormsg := 'Fout opvragen te importeren rij';
        v_aanduiding := '';
                v_ongeldig := 0;




         -- Lees alle veldwaarden
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: BEDRIJFSNAAM';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr1), v_prs_bedrijf_naam);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: LEVERANCIERNUMMER';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr2), v_prs_leverancier_nr);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: BEZOEK_ADRES';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr3), v_prs_bedrijf_bezoek_adres);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: BEZOEK_POSTCODE';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr4), v_prs_bedrijf_bezoek_postcode);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: BEZOEK_PLAATS';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr5), v_prs_bedrijf_bezoek_plaats);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: BEZOEK_LAND';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr6), v_prs_bedrijf_bezoek_land);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: POST_ADRES';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr7), v_prs_bedrijf_post_adres);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: POST_POSTCODE';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr8), v_prs_bedrijf_post_postcode);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: POST_PLAATS';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr9), v_prs_bedrijf_post_plaats);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: POST_LAND';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr10), v_prs_bedrijf_post_land);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: BEDRIJF_TELEFOON';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr11), v_prs_bedrijf_telefoon);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: BEDRIJF_FAX';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr12), v_prs_bedrijf_fax);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: BEDRIJF_EMAIL';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr13), v_prs_bedrijf_email);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: CONTACTPERSOON';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr14), v_prs_bedrijf_contact_persoon);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: CONTACT_TELEFOON';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr15), v_prs_bedrijf_contact_telefoon);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: CONTACT_FAX';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr16), v_prs_bedrijf_contact_fax);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: BEDRIJF_XSL';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr17), v_prs_bedrijf_xsl);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: BEDRIJF_MLD_ORDER_ADRES';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr18), v_prs_bedrijf_mldorder_adres);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: LEVERANCIER';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr19), v_prs_bedrijf_leverancier);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: UITVOERENDE';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr20), v_prs_bedrijf_uitvoerende);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: CONTRACTANT';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr21), v_prs_bedrijf_contract);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: HUURDER';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr22), v_prs_bedrijf_huurder);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: TOONINGIDS';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr23), v_prs_bedrijf_ingids);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: UURLOON';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr24), v_prs_bedrijf_uurloon);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: OVEREENKOMSTNUMMER';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr25), v_prs_overeenkomst_nr);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: OVEREENKOMSTDATUM';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr26), v_prs_overeenkomst_datum);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: OPMERKING';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr27), v_prs_bedrijf_opmerking);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: DIENST';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr28), v_prs_dienst_omschrijving);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: LOCATIECODE';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr29), v_alg_locatie_code);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: GEBOUWCODE';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr30), v_alg_gebouw_code);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: RELATIETYPE';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr31), v_prs_relatietype);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: OVERIG1';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr32), v_prs_bedrijf_overig1);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: OVERIG2';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr33), v_prs_bedrijf_overig2);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] veld: OVERIG3';
         fac.imp_getfield_nr (v_newline, c_delim, fac.safe_to_number(v_colnr34), v_prs_bedrijf_overig3);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] ';


         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF (p_checkheader = 1)
            THEN
               -- De controle op header is niet nodig.
               header_is_valid := 1;
            END IF;
            IF (p_checkheader = 2)
            THEN
                IF     UPPER (v_prs_bedrijf_naam) = 'BEDRIJFSNAAM'
                   AND UPPER (v_prs_leverancier_nr) = 'LEVERANCIERNUMMER'
                   AND UPPER (v_prs_bedrijf_bezoek_adres) = 'BEZOEK_ADRES'
                   AND UPPER (v_prs_bedrijf_bezoek_postcode) = 'BEZOEK_POSTCODE'
                   AND UPPER (v_prs_bedrijf_bezoek_plaats) = 'BEZOEK_PLAATS'
                   AND UPPER (v_prs_bedrijf_bezoek_land) = 'BEZOEK_LAND'
                   AND UPPER (v_prs_bedrijf_post_adres) = 'POST_ADRES'
                   AND UPPER (v_prs_bedrijf_post_postcode) = 'POST_POSTCODE'
                   AND UPPER (v_prs_bedrijf_post_plaats) = 'POST_PLAATS'
                   AND UPPER (v_prs_bedrijf_post_land) = 'POST_LAND'
                   AND UPPER (v_prs_bedrijf_telefoon) = 'BEDRIJF_TELEFOON'
                   AND UPPER (v_prs_bedrijf_fax) = 'BEDRIJF_FAX'
                   AND UPPER (v_prs_bedrijf_email) = 'BEDRIJF_EMAIL'
                   AND UPPER (v_prs_bedrijf_contact_persoon) = 'CONTACTPERSOON'
                   AND UPPER (v_prs_bedrijf_contact_telefoon) = 'CONTACT_TELEFOON'
                   AND UPPER (v_prs_bedrijf_contact_fax) = 'CONTACT_FAX'
                   AND UPPER (v_prs_bedrijf_xsl) = 'BEDRIJF_XSL'
                   AND UPPER (v_prs_bedrijf_mldorder_adres) = 'BEDRIJF_ORDER_ADRES'
                   AND UPPER (v_prs_bedrijf_leverancier) = 'LEVERANCIER'
                   AND UPPER (v_prs_bedrijf_uitvoerende) = 'UITVOERENDE'
                   AND UPPER (v_prs_bedrijf_contract) = 'CONTRACTANT'
                   AND UPPER (v_prs_bedrijf_huurder) = 'HUURDER'
                   AND UPPER (v_prs_bedrijf_ingids) = 'TOONINGIDS'
                   AND UPPER (v_prs_bedrijf_uurloon) = 'UURLOON'
                   AND UPPER (v_prs_overeenkomst_nr) = 'OVEREENKOMSTNUMMER'
                   AND UPPER (v_prs_overeenkomst_datum) = 'OVEREENKOMSTDATUM'
                   AND UPPER (v_prs_bedrijf_opmerking) = 'OPMERKING'
                   AND UPPER (v_prs_dienst_omschrijving) = 'DIENST'
                   AND UPPER (v_alg_locatie_code) = 'LOCATIECODE'
                   AND UPPER (v_alg_gebouw_code) = 'GEBOUWCODE'
                   AND UPPER (v_prs_relatietype) = 'RELATIETYPE'
                          THEN
                   header_is_valid := 1;
                END IF;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden

            v_errorhint := 'Bedrijfsnaam te lang';
            v_prs_bedrijf_naam := TRIM (v_prs_bedrijf_naam);
            IF LENGTH (v_prs_bedrijf_naam) > 60
            THEN
               v_prs_bedrijf_naam :=
                                    SUBSTR (TRIM (v_prs_bedrijf_naam), 1, 60);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                    'Bedrijfsnaam wordt afgebroken tot ['
                                 || v_prs_bedrijf_naam
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Leveranciernummer te lang';
            v_prs_leverancier_nr := TRIM (v_prs_leverancier_nr);
            IF LENGTH (v_prs_leverancier_nr) > 50
            THEN
               v_prs_leverancier_nr :=
                                  SUBSTR (TRIM (v_prs_leverancier_nr), 1, 50);
               fac.imp_writelog
                               (p_import_key,
                                'W',
                                v_aanduiding || v_errorhint,
                                   'Leveranciernummer wordt afgebroken tot ['
                                || v_prs_leverancier_nr
                                || ']'
                               );
            END IF;

            v_errorhint := 'Bezoek/adres te lang';
            v_prs_bedrijf_bezoek_adres := TRIM (v_prs_bedrijf_bezoek_adres);
            IF LENGTH (v_prs_bedrijf_bezoek_adres) > 50
            THEN
               v_prs_bedrijf_bezoek_adres :=
                            SUBSTR (TRIM (v_prs_bedrijf_bezoek_adres), 1, 50);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                    'Bezoek/adres wordt afgebroken tot ['
                                 || v_prs_bedrijf_bezoek_adres
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Bezoek/postcode te lang';
            v_prs_bedrijf_bezoek_postcode :=
                                          TRIM (v_prs_bedrijf_bezoek_postcode);
            IF LENGTH (v_prs_bedrijf_bezoek_postcode) > 12
            THEN
               v_prs_bedrijf_bezoek_postcode :=
                         SUBSTR (TRIM (v_prs_bedrijf_bezoek_postcode), 1, 12);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                    'Bezoek/postcode wordt afgebroken tot ['
                                 || v_prs_bedrijf_bezoek_postcode
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Bezoek/plaats te lang';
            v_prs_bedrijf_bezoek_plaats := TRIM (v_prs_bedrijf_bezoek_plaats);
            IF LENGTH (v_prs_bedrijf_bezoek_plaats) > 30
            THEN
               v_prs_bedrijf_bezoek_plaats :=
                           SUBSTR (TRIM (v_prs_bedrijf_bezoek_plaats), 1, 30);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                    'Bezoek/plaats wordt afgebroken tot ['
                                 || v_prs_bedrijf_bezoek_plaats
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Bezoek/land te lang';
            v_prs_bedrijf_bezoek_land := TRIM (v_prs_bedrijf_bezoek_land);
            IF LENGTH (v_prs_bedrijf_bezoek_land) > 30
            THEN
               v_prs_bedrijf_bezoek_land :=
                             SUBSTR (TRIM (v_prs_bedrijf_bezoek_land), 1, 30);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                    'Bezoek/land wordt afgebroken tot ['
                                 || v_prs_bedrijf_bezoek_land
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Post/adres te lang';
            v_prs_bedrijf_post_adres := TRIM (v_prs_bedrijf_post_adres);
            IF LENGTH (v_prs_bedrijf_post_adres) > 50
            THEN
               v_prs_bedrijf_post_adres :=
                              SUBSTR (TRIM (v_prs_bedrijf_post_adres), 1, 50);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                    'Post/adres wordt afgebroken tot ['
                                 || v_prs_bedrijf_post_adres
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Post/postcode te lang';
            v_prs_bedrijf_post_postcode := TRIM (v_prs_bedrijf_post_postcode);
            IF LENGTH (v_prs_bedrijf_post_postcode) > 12
            THEN
               v_prs_bedrijf_post_postcode :=
                           SUBSTR (TRIM (v_prs_bedrijf_post_postcode), 1, 12);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                    'Post/postcode wordt afgebroken tot ['
                                 || v_prs_bedrijf_post_postcode
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Post/plaats te lang';
            v_prs_bedrijf_post_plaats := TRIM (v_prs_bedrijf_post_plaats);
            IF LENGTH (v_prs_bedrijf_post_plaats) > 30
            THEN
               v_prs_bedrijf_post_plaats :=
                             SUBSTR (TRIM (v_prs_bedrijf_post_plaats), 1, 30);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                    'Post/plaats wordt afgebroken tot ['
                                 || v_prs_bedrijf_post_plaats
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Post/land te lang';
            v_prs_bedrijf_post_land := TRIM (v_prs_bedrijf_post_land);
            IF LENGTH (v_prs_bedrijf_post_land) > 30
            THEN
               v_prs_bedrijf_post_land :=
                               SUBSTR (TRIM (v_prs_bedrijf_post_land), 1, 30);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                    'Post/land wordt afgebroken tot ['
                                 || v_prs_bedrijf_post_land
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Bedrijf/telefoon te lang';
            v_prs_bedrijf_telefoon := TRIM (v_prs_bedrijf_telefoon);
            IF LENGTH (v_prs_bedrijf_telefoon) > 20
            THEN
               v_prs_bedrijf_telefoon :=
                                SUBSTR (TRIM (v_prs_bedrijf_telefoon), 1, 20);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                    'Bedrijf/telefoon wordt afgebroken tot ['
                                 || v_prs_bedrijf_telefoon
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Bedrijf/fax te lang';
            v_prs_bedrijf_fax := TRIM (v_prs_bedrijf_fax);
            IF LENGTH (v_prs_bedrijf_fax) > 20
            THEN
               v_prs_bedrijf_fax := SUBSTR (TRIM (v_prs_bedrijf_fax), 1, 20);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                    'Bedrijf/fax wordt afgebroken tot ['
                                 || v_prs_bedrijf_fax
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Bedrijf/e-mail te lang';
            v_prs_bedrijf_email := TRIM (v_prs_bedrijf_email);
            IF LENGTH (v_prs_bedrijf_email) > 100
            THEN
               v_prs_bedrijf_email :=
                                  SUBSTR (TRIM (v_prs_bedrijf_email), 1, 100);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                    'Bedrijf/e-mail wordt afgebroken tot ['
                                 || v_prs_bedrijf_email
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Contactpersoon te lang';
            v_prs_bedrijf_contact_persoon :=
                                          TRIM (v_prs_bedrijf_contact_persoon);
            IF LENGTH (v_prs_bedrijf_contact_persoon) > 30
            THEN
               v_prs_bedrijf_contact_persoon :=
                         SUBSTR (TRIM (v_prs_bedrijf_contact_persoon), 1, 30);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                    'Contactpersoon wordt afgebroken tot ['
                                 || v_prs_bedrijf_contact_persoon
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Contact/telefoon te lang';
            v_prs_bedrijf_contact_telefoon :=
                                         TRIM (v_prs_bedrijf_contact_telefoon);

            IF LENGTH (v_prs_bedrijf_contact_telefoon) > 20
            THEN
               v_prs_bedrijf_contact_telefoon :=
                        SUBSTR (TRIM (v_prs_bedrijf_contact_telefoon), 1, 20);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                    'Contact/telefoon wordt afgebroken tot ['
                                 || v_prs_bedrijf_contact_telefoon
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Contact/fax te lang';
            v_prs_bedrijf_contact_fax := TRIM (v_prs_bedrijf_contact_fax);
            IF LENGTH (v_prs_bedrijf_contact_fax) > 20
            THEN
               v_prs_bedrijf_contact_fax :=
                             SUBSTR (TRIM (v_prs_bedrijf_contact_fax), 1, 20);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                    'Contact/fax wordt afgebroken tot ['
                                 || v_prs_bedrijf_contact_fax
                                 || ']'
                                );
            END IF;

            -- Verder geen foutdetectie; kan dus stricter?
            SELECT DECODE (SUBSTR (TRIM (UPPER (v_prs_bedrijf_leverancier)),
                                   1,
                                   1
                                  ),
                           'J', 1,
                           0
                          )
              INTO v_prs_bedrijf_leverancier_n
              FROM DUAL;

            -- Verder geen foutdetectie; kan dus stricter?
            SELECT DECODE (SUBSTR (TRIM (UPPER (v_prs_bedrijf_uitvoerende)),
                                   1,
                                   1
                                  ),
                           'J', 1,
                           0
                          )
              INTO v_prs_bedrijf_uitvoerende_n
              FROM DUAL;

            -- Verder geen foutdetectie; kan dus stricter?
            SELECT DECODE (SUBSTR (TRIM (UPPER (v_prs_bedrijf_contract)), 1,
                                   1),
                           'J', 1,
                           0
                          )
              INTO v_prs_bedrijf_contract_n
              FROM DUAL;

            -- Verder geen foutdetectie; kan dus stricter?
            SELECT DECODE (SUBSTR (TRIM (UPPER (v_prs_bedrijf_huurder)), 1, 1),
                           'J', 1,
                           0
                          )
              INTO v_prs_bedrijf_huurder_n
              FROM DUAL;

            -- Verder geen foutdetectie; kan dus stricter?
            SELECT DECODE (SUBSTR (TRIM (UPPER (v_prs_bedrijf_ingids)), 1, 1),
                           'J', 1,
                           0
                          )
              INTO v_prs_bedrijf_ingids_n
              FROM DUAL;

            v_errorhint := 'Ongeldig uurloon; maximale grootte 9999.99';
            BEGIN
               v_prs_bedrijf_uurloon_n :=
                                   fac.safe_to_number (v_prs_bedrijf_uurloon);
            EXCEPTION
               WHEN OTHERS
               THEN
                  v_ongeldig := 1;
                  oracle_err_num := SQLCODE;
                  oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                  v_errormsg :=
                        v_errorhint
                     || ' ORACLE (error '
                     || oracle_err_num
                     || '/'
                     || oracle_err_mes
                     || ')';
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_aanduiding || v_errormsg,
                                    'Regel wordt overgeslagen!'
                                   );
            END;

            v_errorhint := 'Overeenkomstnummer te lang';
            v_prs_overeenkomst_nr := TRIM (v_prs_overeenkomst_nr);
            IF LENGTH (v_prs_overeenkomst_nr) > 20
            THEN
               v_prs_overeenkomst_nr :=
                                 SUBSTR (TRIM (v_prs_overeenkomst_nr), 1, 20);
               fac.imp_writelog
                              (p_import_key,
                               'W',
                               v_aanduiding || v_errorhint,
                                  'Overeenkomstnummer wordt afgebroken tot ['
                               || v_prs_overeenkomst_nr
                               || ']'
                              );
            END IF;

            v_errorhint := 'Ongeldige overeenkomstdatum';
            v_prs_overeenkomst_datum := TRIM (v_prs_overeenkomst_datum);
            IF v_prs_overeenkomst_datum IS NOT NULL
            THEN
               BEGIN
                  v_prs_overeenkomst_date :=
                             TO_DATE (v_prs_overeenkomst_datum, 'dd-mm-yyyy');
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     v_ongeldig := 1;
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=
                           v_errorhint
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog (p_import_key,
                                       'E',
                                       v_aanduiding || v_errormsg,
                                       'Regel wordt overgeslagen!'
                                      );
                     COMMIT;
               END;
            ELSE
               v_prs_overeenkomst_date := NULL;
            END IF;

            v_errorhint := 'Opmerking te lang';
            v_prs_bedrijf_opmerking := TRIM (v_prs_bedrijf_opmerking);
            IF LENGTH (v_prs_bedrijf_opmerking) > 320
            THEN
               v_prs_bedrijf_opmerking :=
                              SUBSTR (TRIM (v_prs_bedrijf_opmerking), 1, 320);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                    'Opmerking wordt afgebroken tot ['
                                 || v_prs_bedrijf_opmerking
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Dienst te lang';
            v_prs_dienst_omschrijving := TRIM (v_prs_dienst_omschrijving);
            IF LENGTH (v_prs_dienst_omschrijving) > 60
            THEN
               v_prs_dienst_omschrijving :=
                              SUBSTR (TRIM (v_prs_dienst_omschrijving), 1, 60);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                    'Dienst wordt afgebroken tot ['
                                 || v_prs_dienst_omschrijving
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Locatiecode te lang';
            v_alg_locatie_code := TRIM (v_alg_locatie_code);
            IF LENGTH (v_alg_locatie_code) > 10
            THEN
               v_alg_locatie_code := NULL;
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || v_errorhint,
                                    'Locatiecode is te lang ['
                                 || v_alg_locatie_code
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Gebouwcode te lang';
            v_alg_gebouw_code := TRIM (v_alg_gebouw_code);
            IF LENGTH (v_alg_gebouw_code) > 12
            THEN
               v_alg_gebouw_code := NULL;
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || v_errorhint,
                                    'Gebouwcode is te lang ['
                                 || v_alg_gebouw_code
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Relatietype omschrijving te lang';
            v_prs_relatietype := TRIM (v_prs_relatietype);
            IF LENGTH (v_prs_relatietype) > 100
            THEN
               v_prs_relatietype := SUBSTR (TRIM (v_prs_relatietype), 1, 100);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                    'Relatietype omschrijving wordt afgebroken tot ['
                                 || v_prs_relatietype
                                 || ']'
                                );
            END IF;

            v_errorhint := 'Overig_1 te lang';
            v_prs_bedrijf_overig1 := TRIM (v_prs_bedrijf_overig1);
            IF LENGTH (v_prs_bedrijf_overig1) > 256
            THEN
               v_prs_bedrijf_overig1 := SUBSTR (TRIM (v_prs_bedrijf_overig1), 1, 256);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                 'Overig_1 wordt afgebroken tot [' || v_prs_bedrijf_overig1 || ']'
                                );
            END IF;

            v_errorhint := 'Overig_2 te lang';
            v_prs_bedrijf_overig2 := TRIM (v_prs_bedrijf_overig2);
            IF LENGTH (v_prs_bedrijf_overig2) > 256
            THEN
               v_prs_bedrijf_overig2 := SUBSTR (TRIM (v_prs_bedrijf_overig2), 1, 256);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                 'Overig_2 wordt afgebroken tot [' || v_prs_bedrijf_overig2 || ']'
                                );
            END IF;

            v_errorhint := 'Overig_3 te lang';
            v_prs_bedrijf_overig3 := TRIM (v_prs_bedrijf_overig3);
            IF LENGTH (v_prs_bedrijf_overig3) > 256
            THEN
               v_prs_bedrijf_overig3 := SUBSTR (TRIM (v_prs_bedrijf_overig3), 1, 256);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errorhint,
                                 'Overig_3 wordt afgebroken tot [' || v_prs_bedrijf_overig3 || ']'
                                );
            END IF;


            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               BEGIN
                  INSERT INTO fac_imp_ext_bedrijf
                              (prs_bedrijf_naam, prs_leverancier_nr,
                               prs_bedrijf_bezoek_adres,
                               prs_bedrijf_bezoek_postcode,
                               prs_bedrijf_bezoek_plaats,
                               prs_bedrijf_bezoek_land,
                               prs_bedrijf_post_adres,
                               prs_bedrijf_post_postcode,
                               prs_bedrijf_post_plaats,
                               prs_bedrijf_post_land,
                               prs_bedrijf_telefoon, prs_bedrijf_fax,
                               prs_bedrijf_email,
                               prs_bedrijf_contact_persoon,
                               prs_bedrijf_contact_telefoon,
                               prs_bedrijf_contact_fax,
                               prs_bedrijf_xsl,
                               prs_bedrijf_order_adres,
                               prs_bedrijf_leverancier,
                               prs_bedrijf_uitvoerende,
                               prs_bedrijf_contract,
                               prs_bedrijf_huurder,
                               prs_bedrijf_ingids,
                               prs_bedrijf_uurloon,
                               prs_overeenkomst_nr,
                               prs_overeenkomst_datum,
                               prs_bedrijf_opmerking,
                               prs_dienst_omschrijving,
                               alg_locatie_code,
                               alg_gebouw_code,
                               prs_relatietype,
                               prs_bedrijf_overig1,
                               prs_bedrijf_overig2,
                               prs_bedrijf_overig3
                              )
                       VALUES (v_prs_bedrijf_naam, v_prs_leverancier_nr,
                               v_prs_bedrijf_bezoek_adres,
                               v_prs_bedrijf_bezoek_postcode,
                               v_prs_bedrijf_bezoek_plaats,
                               v_prs_bedrijf_bezoek_land,
                               v_prs_bedrijf_post_adres,
                               v_prs_bedrijf_post_postcode,
                               v_prs_bedrijf_post_plaats,
                               v_prs_bedrijf_post_land,
                               v_prs_bedrijf_telefoon, v_prs_bedrijf_fax,
                               v_prs_bedrijf_email,
                               v_prs_bedrijf_contact_persoon,
                               v_prs_bedrijf_contact_telefoon,
                               v_prs_bedrijf_contact_fax,
                               v_prs_bedrijf_xsl,
                               v_prs_bedrijf_mldorder_adres,
                               v_prs_bedrijf_leverancier_n,
                               v_prs_bedrijf_uitvoerende_n,
                               v_prs_bedrijf_contract_n,
                               v_prs_bedrijf_huurder_n,
                               v_prs_bedrijf_ingids_n,
                               v_prs_bedrijf_uurloon_n,
                               v_prs_overeenkomst_nr,
                               v_prs_overeenkomst_date,
                               v_prs_bedrijf_opmerking,
                               v_prs_dienst_omschrijving,
                               v_alg_locatie_code,
                               v_alg_gebouw_code,
                               v_prs_relatietype,
                               v_prs_bedrijf_overig1,
                               v_prs_bedrijf_overig2,
                               v_prs_bedrijf_overig3
                              );

                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=
                           'ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog
                        (p_import_key,
                         'E',
                         v_aanduiding || v_errormsg,
                         'Fout bij toevoegen regel aan importtabel FAC_IMP_EXT_BEDRIJF.'
                        );
               END;
            END IF;
         END IF;
      END;
   END LOOP;

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

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

CREATE OR REPLACE PROCEDURE fac_import_ext_bedrijf (p_import_key IN NUMBER)
AS
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_seq_of_columns VARCHAR(255);
BEGIN
        -- hulpje            1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34
        v_seq_of_columns := '1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34';
        fac_import_bedrijf_body (p_import_key, v_seq_of_columns, 2);


EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=
         'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_errormsg,
                        'Inleesproces relaties afgebroken!');
END;
/

-- Parameter p_sync = 0 of 1:
-- 0 = er wordt niet gesynchroniseerd (op leveranciersnummer), maar gewoon (ala FIP) aangevuld. Elke leverancier wordt toegevoegd.
-- 1 = er wel wel gesynchroniseerd (op leveranciernummer), dus add + update + delete

CREATE OR REPLACE PROCEDURE fac_update_bedrijf_body (
   p_import_key IN NUMBER,
   p_sync IN NUMBER)
AS
   v_errormsg       VARCHAR2 (1000) := '-';
   v_errorhint      VARCHAR2 (1000) := '-';
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_count          NUMBER (10);
   v_count_tot      NUMBER (10);
   v_count_new      NUMBER (10);
   v_count_upd      NUMBER (10);
   v_count_del      NUMBER (10);
   v_aanduiding     VARCHAR2 (200) := '-';

   -- SUBPROC
   PROCEDURE add_relatietype (p_import_key IN NUMBER)
   AS
      CURSOR c1
      IS
         SELECT   DISTINCT prs_relatietype
           FROM   fac_imp_ext_bedrijf
          WHERE   prs_relatietype IS NOT NULL;

      v_aanduiding     VARCHAR2 (200);
      v_errorhint      VARCHAR2 (1000);
      v_errormsg       VARCHAR2 (1000);
      oracle_err_num   NUMBER;
      oracle_err_mes   VARCHAR2 (200);
      v_count          NUMBER (10);
      v_count_tot      NUMBER (10);
      v_count_update   NUMBER (10);
   BEGIN
      v_count_tot := 0;
      v_count_update := 0;

      FOR rec IN c1
      LOOP
         BEGIN
            v_count_tot  := v_count_tot + 1;
            v_aanduiding := '[' || rec.prs_relatietype || '] ';
            v_errorhint  := 'Fout bij bepalen relatietype';

            SELECT COUNT (*)
              INTO v_count
              FROM prs_relatietype
             WHERE UPPER (prs_relatietype_omschrijving) = UPPER (rec.prs_relatietype)
               AND prs_relatietype_verwijder IS NULL;

            IF v_count = 0
            THEN
               v_errorhint := 'Fout bij toevoegen relatietype';

               INSERT INTO prs_relatietype
                      (prs_relatietype_omschrijving)
               VALUES (rec.prs_relatietype);

               v_count_update := v_count_update + 1;
               COMMIT;
            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_aanduiding || v_errormsg,
                                 v_errorhint);
               COMMIT;
         END;
      END LOOP;
   END;

   -- SUBPROC
   PROCEDURE add_bedrijf (p_import_key IN NUMBER)
   AS
      CURSOR c1
      IS
         SELECT *
           FROM fac_imp_ext_bedrijf ib;
      --
      v_bedrijf_key      NUMBER(10);
      v_relatietype_key  NUMBER(10);
   BEGIN
      v_count_tot := 0;
      v_count_new := 0;
      v_count_upd := 0;

      FOR rec IN c1
      LOOP
         BEGIN
            v_count_tot  := v_count_tot + 1;
            v_aanduiding := '[' || rec.prs_bedrijf_naam || '|' || rec.prs_leverancier_nr || '] ';
            v_errorhint  := 'Fout bepalen bedrijf';

            v_relatietype_key := NULL;
            IF rec.prs_relatietype IS NOT NULL
            THEN
               SELECT prs_relatietype_key
                 INTO v_relatietype_key
                 FROM prs_relatietype
                WHERE UPPER(TRIM(prs_relatietype_omschrijving)) = UPPER(rec.prs_relatietype)
                  AND prs_relatietype_verwijder IS NULL;
            END IF;

            IF rec.prs_leverancier_nr IS NULL AND p_sync = 1
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Leveranciernummer ongedefinieerd!',
                  v_errorhint);
               COMMIT;
            ELSE
               SELECT COUNT (*)
                 INTO v_count
                 FROM prs_v_aanwezigbedrijf
                WHERE UPPER (prs_leverancier_nr) = UPPER (rec.prs_leverancier_nr);
               --
               IF v_count = 0 OR p_sync = 0
               THEN
                  v_errorhint := 'Fout toevoegen bedrijf';

                  INSERT INTO prs_bedrijf (prs_bedrijf_naam,
                                           prs_leverancier_nr,
                                           prs_bedrijf_bezoek_adres,
                                           prs_bedrijf_bezoek_postcode,
                                           prs_bedrijf_bezoek_plaats,
                                           prs_bedrijf_bezoek_land,
                                           prs_bedrijf_post_adres,
                                           prs_bedrijf_post_postcode,
                                           prs_bedrijf_post_plaats,
                                           prs_bedrijf_post_land,
                                           prs_bedrijf_telefoon,
                                           prs_bedrijf_fax,
                                           prs_bedrijf_email,
                                           prs_bedrijf_contact_persoon,
                                           prs_bedrijf_contact_telefoon,
                                           prs_bedrijf_contact_fax,
                                           prs_bedrijf_leverancier,
                                           prs_bedrijf_uitvoerende,
                                           prs_bedrijf_contract,
                                           prs_bedrijf_huurder,
                                           prs_bedrijf_ingids,
                                           prs_bedrijf_uurloon,
                                           prs_overeenkomst_nr,
                                           prs_overeenkomst_datum,
                                           prs_bedrijf_opmerking,
                                           prs_relatietype_key)
                       VALUES (rec.prs_bedrijf_naam,
                               rec.prs_leverancier_nr,
                               rec.prs_bedrijf_bezoek_adres,
                               rec.prs_bedrijf_bezoek_postcode,
                               rec.prs_bedrijf_bezoek_plaats,
                               rec.prs_bedrijf_bezoek_land,
                               rec.prs_bedrijf_post_adres,
                               rec.prs_bedrijf_post_postcode,
                               rec.prs_bedrijf_post_plaats,
                               rec.prs_bedrijf_post_land,
                               rec.prs_bedrijf_telefoon,
                               rec.prs_bedrijf_fax,
                               rec.prs_bedrijf_email,
                               rec.prs_bedrijf_contact_persoon,
                               rec.prs_bedrijf_contact_telefoon,
                               rec.prs_bedrijf_contact_fax,
                               DECODE (rec.prs_bedrijf_leverancier, 1, 1, NULL),
                               DECODE (rec.prs_bedrijf_uitvoerende, 1, 1, NULL),
                               DECODE (rec.prs_bedrijf_contract,    1, 1, NULL),
                               DECODE (rec.prs_bedrijf_huurder,     1, 1, NULL),
                               DECODE (rec.prs_bedrijf_ingids,      1, 1, NULL),
                               rec.prs_bedrijf_uurloon,
                               rec.prs_overeenkomst_nr,
                               rec.prs_overeenkomst_datum,
                               rec.prs_bedrijf_opmerking,
                               v_relatietype_key)
                     RETURNING prs_bedrijf_key
                          INTO v_bedrijf_key;

                  v_count_new := v_count_new + 1;
               ELSE                                             -- v_count > 0
                  SELECT prs_bedrijf_key
                    INTO v_bedrijf_key
                    FROM prs_v_aanwezigbedrijf
                   WHERE UPPER (prs_leverancier_nr) = UPPER (rec.prs_leverancier_nr);

                  v_errorhint := 'Fout bijwerken bedrijf';

                  UPDATE prs_bedrijf
                     SET prs_bedrijf_naam             = COALESCE (rec.prs_bedrijf_naam,             prs_bedrijf_naam),
                         prs_bedrijf_bezoek_adres     = COALESCE (rec.prs_bedrijf_bezoek_adres,     prs_bedrijf_bezoek_adres),
                         prs_bedrijf_bezoek_postcode  = COALESCE (rec.prs_bedrijf_bezoek_postcode,  prs_bedrijf_bezoek_postcode),
                         prs_bedrijf_bezoek_plaats    = COALESCE (rec.prs_bedrijf_bezoek_plaats,    prs_bedrijf_bezoek_plaats),
                         prs_bedrijf_bezoek_land      = COALESCE (rec.prs_bedrijf_bezoek_land,      prs_bedrijf_bezoek_land),
                         prs_bedrijf_post_adres       = COALESCE (rec.prs_bedrijf_post_adres,       prs_bedrijf_post_adres),
                         prs_bedrijf_post_postcode    = COALESCE (rec.prs_bedrijf_post_postcode,    prs_bedrijf_post_postcode),
                         prs_bedrijf_post_plaats      = COALESCE (rec.prs_bedrijf_post_plaats,      prs_bedrijf_post_plaats),
                         prs_bedrijf_post_land        = COALESCE (rec.prs_bedrijf_post_land,        prs_bedrijf_post_land),
                         prs_bedrijf_telefoon         = COALESCE (rec.prs_bedrijf_telefoon,         prs_bedrijf_telefoon),
                         prs_bedrijf_fax              = COALESCE (rec.prs_bedrijf_fax,              prs_bedrijf_fax),
                         prs_bedrijf_email            = COALESCE (rec.prs_bedrijf_email,            prs_bedrijf_email),
                         prs_bedrijf_contact_persoon  = COALESCE (rec.prs_bedrijf_contact_persoon,  prs_bedrijf_contact_persoon),
                         prs_bedrijf_contact_telefoon = COALESCE (rec.prs_bedrijf_contact_telefoon, prs_bedrijf_contact_telefoon),
                         prs_bedrijf_contact_fax      = COALESCE (rec.prs_bedrijf_contact_fax,      prs_bedrijf_contact_fax),
                         prs_bedrijf_leverancier  = DECODE (rec.prs_bedrijf_leverancier, 1, 1, NULL),
                         prs_bedrijf_uitvoerende  = DECODE (rec.prs_bedrijf_uitvoerende, 1, 1, NULL),
                         prs_bedrijf_contract     = DECODE (rec.prs_bedrijf_contract,    1, 1, NULL),
                         prs_bedrijf_huurder      = DECODE (rec.prs_bedrijf_huurder,     1, 1, NULL),
                         prs_bedrijf_ingids       = DECODE (rec.prs_bedrijf_ingids,      1, 1, NULL),
                         prs_bedrijf_uurloon    = COALESCE (rec.prs_bedrijf_uurloon,    prs_bedrijf_uurloon),
                         prs_overeenkomst_nr    = COALESCE (rec.prs_overeenkomst_nr,    prs_overeenkomst_nr),
                         prs_overeenkomst_datum = COALESCE (rec.prs_overeenkomst_datum, prs_overeenkomst_datum),
                         prs_bedrijf_opmerking  = COALESCE (rec.prs_bedrijf_opmerking,  prs_bedrijf_opmerking),
                         prs_relatietype_key    = DECODE (rec.prs_relatietype, NULL, prs_relatietype_key, v_relatietype_key)  -- kan wel wijzigen, maar niet leeg maken.
                   WHERE prs_bedrijf_key = v_bedrijf_key;

                  v_count_upd := v_count_upd + 1;
               END IF; -- v_count = 0
            END IF; -- rec.prs_leverancier_nr IS NULL
         EXCEPTION
            WHEN OTHERS
            THEN
                 oracle_err_num := SQLCODE;
                 oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                 v_errormsg :=
                       'ORACLE (error '
                    || oracle_err_num
                    || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || v_errormsg,
                                 v_errorhint);
               COMMIT;
         END;
      END LOOP;

      fac.imp_writelog (p_import_key,
                        'S',
                        'Bedrijf: #ingelezen: ' || TO_CHAR (v_count_tot),
                        '');
      fac.imp_writelog (p_import_key,
                        'S',
                        'Bedrijf: #toegevoegd: ' || TO_CHAR (v_count_new),
                        '');
      fac.imp_writelog (p_import_key,
                        'S',
                        'Bedrijf: #bijgewerkt: ' || TO_CHAR (v_count_upd),
                        '');
      COMMIT;
   END;

   -- SUBPROC
   PROCEDURE del_bedrijf (p_import_key IN NUMBER)
   AS
      CURSOR c1
      IS
         SELECT *
           FROM prs_v_aanwezigbedrijf b
          WHERE b.prs_bedrijf_intern IS NULL
            AND b.prs_leverancier_nr IS NOT NULL
            AND NOT EXISTS
                (SELECT 1
                   FROM fac_imp_ext_bedrijf
                  WHERE prs_leverancier_nr = b.prs_leverancier_nr);
      --
      v_bedrijf_key   NUMBER (10);
   BEGIN
      v_count_del := 0;
      --
      FOR rec IN c1
      LOOP
         BEGIN
            v_aanduiding := '[' || rec.prs_bedrijf_naam || '] ';
            v_errorhint := 'Fout verwijderen bedrijf';

            UPDATE prs_bedrijf
               SET prs_bedrijf_verwijder = SYSDATE
             WHERE prs_bedrijf_key = rec.prs_bedrijf_key;

            v_count_del := v_count_del + 1;
            COMMIT;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     'ORACLE (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || v_errormsg,
                                 v_errorhint);
               COMMIT;
         END;
      END LOOP;
      --
      fac.imp_writelog (p_import_key,
                        'S',
                        'Bedrijf: #verwijderd: ' || TO_CHAR (v_count_del),
                        '');
      COMMIT;
   END;

   -- SUBPROC
   PROCEDURE diensten_bedrijf (p_import_key IN NUMBER)
   AS
      CURSOR c_dienst
      IS
         SELECT DISTINCT prs_dienst_omschrijving
           FROM fac_imp_ext_bedrijf
          WHERE prs_dienst_omschrijving IS NOT NULL;

      CURSOR c_dienstlocgebouw
      IS
         SELECT prs_dienst_omschrijving,
                alg_locatie_code,
                alg_gebouw_code,
                prs_bedrijf_naam
           FROM fac_imp_ext_bedrijf
          WHERE prs_dienst_omschrijving IS NOT NULL;

         v_alg_locatie_key   NUMBER (10);
         v_alg_gebouw_key    NUMBER (10);
         v_prs_dienst_key    NUMBER (10);
         v_prs_bedrijf_key   NUMBER (10);
   BEGIN
      v_count_tot := 0;
      v_count_upd := 0;

      FOR rec2 IN c_dienst
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_errormsg  := 'Kan dienst niet bepalen [' || rec2.prs_dienst_omschrijving || '] ';
            --
            BEGIN
               SELECT prs_dienst_key
                 INTO v_prs_dienst_key
                 FROM prs_dienst
                WHERE UPPER(prs_dienst_omschrijving) = UPPER(rec2.prs_dienst_omschrijving);
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  v_errormsg := 'Kan dienst niet wegschrijven [' || rec2.prs_dienst_omschrijving || '] ';
                  --
                  INSERT INTO prs_dienst
                         (prs_dienst_omschrijving)
                  VALUES (rec2.prs_dienst_omschrijving);
            END;
            --
            v_count_upd   := v_count_upd + 1;
            COMMIT;
         EXCEPTION
            WHEN OTHERS
            THEN
               v_errorhint    := v_errormsg;
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
               v_errormsg     :=
                     v_errormsg
                  || 'ORACLE (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_errormsg,
                                 v_errorhint
               );
               COMMIT;                                             -- tbv logging
         END;
      END LOOP;
      --
      fac.imp_writelog (p_import_key,
                        'S',
                        'Diensten: aantal ingelezen: ' || TO_CHAR (v_count_tot),
                        ''
      );
      fac.imp_writelog (p_import_key,
                        'S',
                        'Diensten: aantal toegevoegd: '
                        || TO_CHAR (v_count_upd),
                        ''
      );
      --
      v_count_tot := 0;
      v_count_upd := 0;
      --
      FOR rec3 IN c_dienstlocgebouw
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_errormsg  := 'Kan dienst niet bepalen [' || rec3.prs_dienst_omschrijving || '] ';
            SELECT prs_dienst_key
              INTO v_prs_dienst_key
              FROM prs_dienst
             WHERE prs_dienst_omschrijving = rec3.prs_dienst_omschrijving;

            v_errormsg := 'Kan locatie niet bepalen [' || rec3.alg_locatie_code || '] ';
            IF rec3.alg_locatie_code IS NOT NULL
            THEN
               SELECT alg_locatie_key
                 INTO v_alg_locatie_key
                 FROM alg_v_aanweziglocatie
                 WHERE alg_locatie_code = rec3.alg_locatie_code;
            ELSE
               v_alg_locatie_key := NULL;
            END IF;

            v_errormsg := 'Kan gebouw niet bepalen [' || rec3.alg_gebouw_code || '] ';
            IF rec3.alg_gebouw_code IS NOT NULL
            THEN
               SELECT alg_gebouw_key
                 INTO v_alg_gebouw_key
                 FROM alg_v_aanweziggebouw
                WHERE alg_gebouw_code = rec3.alg_gebouw_code
                  AND alg_locatie_key = v_alg_locatie_key;
            ELSE
               v_alg_gebouw_key := NULL;
            END IF;

            v_errormsg := 'Kan bedrijf niet bepalen [' || rec3.prs_bedrijf_naam || '] ';
            SELECT prs_bedrijf_key
              INTO v_prs_bedrijf_key
              FROM prs_v_aanwezigbedrijf
             WHERE prs_bedrijf_naam = rec3.prs_bedrijf_naam;

            v_errormsg := 'Kan bedrijf/dienst/loc/gebouw niet wegschrijven ['
                       || rec3.prs_bedrijf_naam        || '/'
                       || rec3.prs_dienst_omschrijving || '/'
                       || rec3.alg_locatie_code        || '/'
                       || rec3.alg_gebouw_code         || '] ';

            INSERT INTO prs_bedrijfdienstlocatie
            ( prs_dienst_key
            , prs_bedrijf_key
            , alg_locatie_key
            , alg_gebouw_key
            )
            VALUES
            ( v_prs_dienst_key
            , v_prs_bedrijf_key
            , decode (v_alg_gebouw_key, null, v_alg_locatie_key, null)
            , v_alg_gebouw_key
            );

            v_count_upd   := v_count_upd + 1;
            COMMIT;
         EXCEPTION
            WHEN OTHERS
            THEN
               v_errorhint    := v_errormsg;
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
               v_errormsg     :=
                     v_errormsg
                  || 'ORACLE (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_errormsg,
                                 v_errorhint
               );
               COMMIT;                                             -- tbv logging
         END;
      END LOOP;
      --
      fac.imp_writelog (p_import_key,
                        'S',
                        'Bedrijf/dienst/locatie: aantal ingelezen: '
                        || TO_CHAR (v_count_tot),
                        ''
      );
      fac.imp_writelog (p_import_key,
                        'S',
                        'Bedrijf/dienst/locatie: aantal toegevoegd: '
                        || TO_CHAR (v_count_upd),
                        ''
      );
   END;

--
-- MAIN
BEGIN
   IF p_sync = 1
   THEN
      -- Bij aanvullen nooit verwijderen, alleen bij sync-en
      del_bedrijf (p_import_key);
   END IF;
   --
   add_relatietype (p_import_key);
   add_bedrijf (p_import_key);
   --
   IF p_sync = 0
   THEN
      -- Bij aanvullen bedrijven de diensten-locatie-gebouw uitvoeren, bij sync-en (nog) niet
      diensten_bedrijf(p_import_key);
   END IF;
   --
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=
         'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Importproces relaties afgebroken!');
END;
/


CREATE OR REPLACE PROCEDURE fac_update_ext_bedrijf (p_import_key IN NUMBER
)
AS
BEGIN
    fac_update_bedrijf_body(p_import_key, 0);
END;
/



CREATE OR REPLACE PROCEDURE fac_import_bedrijfadres (p_import_key IN NUMBER)
IS
   c_delim                         VARCHAR2 (2) := fac.import_delimiter(p_import_key);
   v_newline                       fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
   v_errormsg                      VARCHAR2 (1000);
   v_errorhint                     VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER;
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_ongeldig                      NUMBER (1);
   v_aanduiding                    VARCHAR (200);

   -- De importvelden
   v_prs_bedrijf_naam              VARCHAR2 (255);  -- VARCHAR2(60),
   v_prs_leverancier_nr            VARCHAR2 (255);  -- VARCHAR2(50),
   v_prs_bedrijf_key               NUMBER(10);
   v_prs_bedrijfadres_type         VARCHAR2 (255);  -- VARCHAR2(1),
   v_mld_typeopdr_omschrijving     VARCHAR2 (255);  -- NUMBER(10),
   v_mld_typeopdr_key              NUMBER(10);
   v_prs_bedrijfadres_url          VARCHAR2 (1000); -- VARCHAR2(512),
   v_prs_bedrijfadres_ordermode    VARCHAR2 (255);  -- NUMBER(3),
   v_prs_bedrijfadres_certificate  VARCHAR2 (1000); -- VARCHAR2(255),
   v_prs_bedrijfadres_xsl          VARCHAR2 (1000); -- VARCHAR2(256),
   v_prs_bedrijfadres_ext          VARCHAR2 (255);  -- VARCHAR2(10),
   v_prs_bedrijfadres_attachfile   VARCHAR2 (1000); -- VARCHAR2(256),
   v_prs_bedrijfadres_username     VARCHAR2 (255);  -- VARCHAR2(32),
   v_prs_bedrijfadres_password     VARCHAR2 (1000); -- VARCHAR2(320)),
   v_prs_bedrijfadres_sender       VARCHAR2 (1000); -- VARCHAR2(512),
   v_prs_bedrijfadres_lockuser     VARCHAR2 (255);  -- NUMBER(10),
   v_lockuser_key                  NUMBER (10);
   v_prs_bedrijfadres_lockexpire   VARCHAR2 (255);

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


BEGIN
   -- Eerst opruiming
   DELETE FROM   fac_imp_bedrijfadres;

   COMMIT;

   v_count_tot := 0;
   v_count_import := 0;
   header_is_valid := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout bij opvragen importregel';
         v_aanduiding := '';
         v_ongeldig := 0;
         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_naam);
         fac.imp_getfield (v_newline, c_delim, v_prs_leverancier_nr);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijfadres_type);
         fac.imp_getfield (v_newline, c_delim, v_mld_typeopdr_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijfadres_url);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijfadres_ordermode);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijfadres_certificate);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijfadres_xsl);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijfadres_ext);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijfadres_attachfile);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijfadres_username);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijfadres_password);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijfadres_sender);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijfadres_lockuser);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijfadres_lockexpire);

         v_aanduiding :=
               '['
            || v_prs_bedrijf_naam
            || '|'
            || v_prs_leverancier_nr
            || '|'
            || v_prs_bedrijfadres_type
            || '|'
            || v_mld_typeopdr_omschrijving
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF UPPER (v_prs_bedrijf_naam) = 'BEDRIJFSNAAM'
               AND UPPER (v_prs_leverancier_nr) = 'LEVERANCIERNUMMER'
               AND UPPER (v_prs_bedrijfadres_type) = 'KANAAL'
               AND UPPER (v_mld_typeopdr_omschrijving) = 'OPDRACHTTYPE'
               AND UPPER (v_prs_bedrijfadres_url) = 'ADRES'
               AND UPPER (v_prs_bedrijfadres_ordermode) = 'ORDERMODE'
               AND UPPER (v_prs_bedrijfadres_certificate) = 'CERTIFICAAT'
               AND UPPER (v_prs_bedrijfadres_xsl) = 'XSL_TEMPLATE'
               AND UPPER (v_prs_bedrijfadres_ext) = 'EXTENSIE'
               AND UPPER (v_prs_bedrijfadres_attachfile) = 'VASTE_BIJLAGE'
               AND UPPER (v_prs_bedrijfadres_username) = 'LOGIN'
               AND UPPER (v_prs_bedrijfadres_password) = 'WACHTWOORD'
               AND UPPER (v_prs_bedrijfadres_sender) = 'AFZENDER'
               AND UPPER (v_prs_bedrijfadres_lockuser) = 'VASTE_GEBRUIKER'
               AND UPPER (v_prs_bedrijfadres_lockexpire) = 'EXPIRE_DAYS'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errormsg := 'Bedrijf niet gevonden';
            BEGIN
               SELECT prs_bedrijf_key
                 INTO v_prs_bedrijf_key
                 FROM prs_bedrijf
                WHERE COALESCE(prs_bedrijf_intern, 0) <> 1
                  AND prs_bedrijf_verwijder IS NULL
                  AND UPPER(prs_leverancier_nr) = UPPER(v_prs_leverancier_nr);
            EXCEPTION WHEN NO_DATA_FOUND
            THEN
               BEGIN
                  SELECT prs_bedrijf_key
                    INTO v_prs_bedrijf_key
                    FROM prs_bedrijf
                   WHERE COALESCE(prs_bedrijf_intern, 0) <> 1
                     AND prs_bedrijf_verwijder IS NULL
                     AND UPPER(prs_bedrijf_naam) = UPPER(v_prs_bedrijf_naam);
               EXCEPTION WHEN NO_DATA_FOUND
               THEN
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_aanduiding || v_errormsg,
                                    'Regel wordt overgeslagen');
                  v_ongeldig := 1;
               END;
            END;

            IF v_ongeldig = 0
            THEN
               v_errormsg := 'Opdrachttype niet gevonden';
               v_mld_typeopdr_key := NULL;
               IF UPPER(v_prs_bedrijfadres_type) = 'O' AND v_mld_typeopdr_omschrijving IS NOT NULL
               THEN
                  BEGIN
                     SELECT mld_typeopdr_key
                       INTO v_mld_typeopdr_key
                       FROM mld_typeopdr
                      WHERE mld_typeopdr_upper = UPPER(v_mld_typeopdr_omschrijving);
                  EXCEPTION WHEN NO_DATA_FOUND
                  THEN
                     fac.imp_writelog (p_import_key,
                                       'E',
                                       v_aanduiding || v_errormsg,
                                       'Regel wordt overgeslagen');
                     v_ongeldig := 1;
                  END;
               END IF;
            END IF;

            -- Expire days  mag niet negatief of meer zijn dan 10 posities lang.
            -- Indien leeg, dan blijft/wordt expire_days=ongedefinieerd=NULL!
            v_prs_bedrijfadres_lockexpire := TRIM (v_prs_bedrijfadres_lockexpire);

            IF v_prs_bedrijfadres_lockexpire IS NOT NULL
               AND (   fac.safe_to_number (v_prs_bedrijfadres_lockexpire) IS NULL
                    OR fac.safe_to_number (v_prs_bedrijfadres_lockexpire) < 0
                    OR fac.safe_to_number (v_prs_bedrijfadres_lockexpire) > 9999999999)
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Ongeldig aantal expire days',
                  'Regel wordt niet ingelezen (Expire days:' || v_prs_bedrijfadres_lockexpire || ')'
               );
               v_ongeldig := 1;
            END IF;

            IF v_ongeldig = 0
            THEN
               v_errormsg := 'Controleer kanaal';
               IF LENGTH(v_prs_bedrijfadres_type) > 1
               THEN
                  v_prs_bedrijfadres_type := SUBSTR(v_prs_bedrijfadres_type, 1, 1);
                  fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg,
                     'Kanaal aangepast naar: ' || v_prs_bedrijfadres_type);
               END IF;

               v_errormsg := 'Controleer lengte van URL';
               IF LENGTH(v_prs_bedrijfadres_url) > 512
               THEN
                  v_prs_bedrijfadres_url := SUBSTR(v_prs_bedrijfadres_url, 1, 512);
                  fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg,
                     'URL aangepast naar: ' || v_prs_bedrijfadres_url);
               END IF;

               v_errormsg := 'Controleer ordermode';
               IF    LENGTH(v_prs_bedrijfadres_ordermode) > 3
                  OR (    fac.safe_to_number(v_prs_bedrijfadres_ordermode) IS NULL
                      AND v_prs_bedrijfadres_ordermode IS NOT NULL)
               THEN
                  v_prs_bedrijfadres_ordermode := SUBSTR(v_prs_bedrijfadres_ordermode, 1, 3);
                  fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg,
                     'Ordermode aangepast naar: ' || fac.safe_to_number(v_prs_bedrijfadres_ordermode));
               END IF;

               v_errormsg := 'Controleer lengte van certificaat';
               IF LENGTH(v_prs_bedrijfadres_certificate) > 255
               THEN
                  v_prs_bedrijfadres_certificate := SUBSTR(v_prs_bedrijfadres_certificate, 1, 255);
                  fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg,
                     'Certificaat aangepast naar: ' || v_prs_bedrijfadres_certificate);
               END IF;

               v_errormsg := 'Controleer lengte van stylesheet';
               IF LENGTH(v_prs_bedrijfadres_xsl) > 256
               THEN
                  v_prs_bedrijfadres_xsl := SUBSTR(v_prs_bedrijfadres_xsl, 1, 256);
                  fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg,
                     'Stylesheet aangepast naar: ' || v_prs_bedrijfadres_xsl);
               END IF;

               v_errormsg := 'Controleer lengte van extensie';
               IF LENGTH(v_prs_bedrijfadres_ext) > 10
               THEN
                  v_prs_bedrijfadres_ext := SUBSTR(v_prs_bedrijfadres_ext, 1, 10);
                  fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg,
                     'Extensie aangepast naar: ' || v_prs_bedrijfadres_ext);
               END IF;

               v_errormsg := 'Controleer lengte van vaste bijlage';
               IF LENGTH(v_prs_bedrijfadres_attachfile) > 256
               THEN
                  v_prs_bedrijfadres_attachfile := SUBSTR(v_prs_bedrijfadres_attachfile, 1, 256);
                  fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg,
                     'Vaste bijlage aangepast naar: ' || v_prs_bedrijfadres_attachfile);
               ELSE
                  IF ((LENGTH(v_prs_bedrijfadres_attachfile) > 0) AND (INSTR(v_prs_bedrijfadres_attachfile,'.') < 0))
                  THEN
                     v_prs_bedrijfadres_attachfile := '';
                     fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg,
                        'Ongeldige vaste bijlage verwijderd: ' || v_prs_bedrijfadres_attachfile);
                  END IF;
               END IF;

               v_errormsg := 'Controleer lengte van login';
               IF LENGTH(v_prs_bedrijfadres_username) > 32
               THEN
                  v_prs_bedrijfadres_username := SUBSTR(v_prs_bedrijfadres_username, 1, 32);
                  fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg,
                     'Login aangepast naar: ' || v_prs_bedrijfadres_username);
               END IF;

               v_errormsg := 'Controleer lengte van wachtwoord';
               IF LENGTH(v_prs_bedrijfadres_password) > 320
               THEN
                  v_prs_bedrijfadres_password := SUBSTR(v_prs_bedrijfadres_password, 1, 320);
                  fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg,
                     'Wachtwoord aangepast naar: ' || v_prs_bedrijfadres_password);
               END IF;

               v_errormsg := 'Controleer lengte van afzender';
               IF LENGTH(v_prs_bedrijfadres_sender) > 512
               THEN
                  v_prs_bedrijfadres_sender := SUBSTR(v_prs_bedrijfadres_sender, 1, 512);
                  fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg,
                     'Afzender aangepast naar: ' || v_prs_bedrijfadres_sender);
               END IF;

               -- Vindt de key van de vaste gebruiker.
               v_prs_bedrijfadres_lockuser := TRIM (v_prs_bedrijfadres_lockuser);

               IF v_prs_bedrijfadres_lockuser IS NOT NULL
               THEN
                  BEGIN
                     SELECT prs_perslid_key
                       INTO v_lockuser_key
                       FROM prs_perslid
                      WHERE prs_perslid_oslogin = UPPER (v_prs_bedrijfadres_lockuser)
                        AND prs_perslid_verwijder IS NULL;
                  EXCEPTION
                     WHEN NO_DATA_FOUND
                     THEN
                        v_lockuser_key := NULL;

                        fac.imp_writelog (
                           p_import_key,
                           'E',
                           v_aanduiding || 'Budgethouder-aanduiding kan niet gevonden worden',
                           'Vaste gebruiker wordt leeg gemaakt [' || v_prs_bedrijfadres_lockuser || ']');
                  END;
               ELSE
                  v_lockuser_key := NULL;
               END IF;

               BEGIN
                  v_errormsg := 'Toevoegen bedrijfadres';
                  INSERT INTO fac_imp_bedrijfadres (prs_bedrijf_key,
                                                    prs_bedrijfadres_type,
                                                    mld_typeopdr_key,
                                                    prs_bedrijfadres_url,
                                                    prs_bedrijfadres_ordermode,
                                                    prs_bedrijfadres_certificate,
                                                    prs_bedrijfadres_xsl,
                                                    prs_bedrijfadres_ext,
                                                    prs_bedrijfadres_attachfile,
                                                    prs_bedrijfadres_username,
                                                    prs_bedrijfadres_password,
                                                    prs_bedrijfadres_sender,
                                                    prs_bedrijfadres_lockuser_key,
                                                    prs_bedrijfadres_lockexpire)
                  VALUES (v_prs_bedrijf_key,
                          v_prs_bedrijfadres_type,
                          v_mld_typeopdr_key,
                          v_prs_bedrijfadres_url,
                          v_prs_bedrijfadres_ordermode,
                          v_prs_bedrijfadres_certificate,
                          v_prs_bedrijfadres_xsl,
                          v_prs_bedrijfadres_ext,
                          v_prs_bedrijfadres_attachfile,
                          v_prs_bedrijfadres_username,
                          v_prs_bedrijfadres_password,
                          v_prs_bedrijfadres_sender,
                          v_lockuser_key,
                          fac.safe_to_number (v_prs_bedrijfadres_lockexpire));

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

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

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=
            v_errormsg
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Inleesproces adressen afgebroken!');
END fac_import_bedrijfadres;
/

CREATE OR REPLACE PROCEDURE fac_update_bedrijfadres (p_import_key IN NUMBER)
AS
   CURSOR c
   IS
      SELECT *
        FROM fac_imp_bedrijfadres i;

   v_errormsg           VARCHAR2 (1000) := '-';
   v_errorhint          VARCHAR2 (1000) := '-';
   oracle_err_num       NUMBER;
   oracle_err_mes       VARCHAR2 (200);
   v_count              NUMBER (10);
   v_count_tot          NUMBER (10);
   v_aanduiding         VARCHAR2 (200) := '-';

   v_prs_bedrijf_naam   VARCHAR (60);
-- MAIN
BEGIN
   v_count_tot := 0;
   v_count := 0;

   FOR rec IN c
   LOOP
      BEGIN
         SELECT prs_bedrijf_naam
           INTO v_prs_bedrijf_naam
           FROM prs_bedrijf
          WHERE prs_bedrijf_key = rec.prs_bedrijf_key;

         v_count_tot := v_count_tot + 1;
         v_aanduiding :=
               '['
            || v_prs_bedrijf_naam
            || '|'
            || rec.prs_bedrijfadres_type
            || '] ';

         v_errorhint := 'Fout toevoegen bedrijfadres';

         INSERT INTO prs_bedrijfadres (prs_bedrijf_key,
                                       prs_bedrijfadres_type,
                                       mld_typeopdr_key,
                                       prs_bedrijfadres_url,
                                       prs_bedrijfadres_ordermode,
                                       prs_bedrijfadres_certificate,
                                       prs_bedrijfadres_xsl,
                                       prs_bedrijfadres_ext,
                                       prs_bedrijfadres_attachfile,
                                       prs_bedrijfadres_username,
                                       prs_bedrijfadres_password,
                                       prs_bedrijfadres_sender,
                                       prs_bedrijfadres_lockuser_key,
                                       prs_bedrijfadres_locksecret,
                                       prs_bedrijfadres_lockexpire)
             VALUES (rec.prs_bedrijf_key,
                     rec.prs_bedrijfadres_type,
                     rec.mld_typeopdr_key,
                     rec.prs_bedrijfadres_url,
                     rec.prs_bedrijfadres_ordermode,
                     rec.prs_bedrijfadres_certificate,
                     rec.prs_bedrijfadres_xsl,
                     rec.prs_bedrijfadres_ext,
                     rec.prs_bedrijfadres_attachfile,
                     rec.prs_bedrijfadres_username,
                     rec.prs_bedrijfadres_password,
                     rec.prs_bedrijfadres_sender,
                     rec.prs_bedrijfadres_lockuser_key,
                     CASE
                     WHEN rec.prs_bedrijfadres_lockuser_key IS NOT NULL
                     THEN DBMS_RANDOM.string('a', 32)
                     ELSE NULL
                     END,
                     CASE
                     WHEN rec.prs_bedrijfadres_lockuser_key IS NOT NULL
                     THEN COALESCE(rec.prs_bedrijfadres_lockexpire, 30)
                     ELSE NULL
                     END);

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

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


-- FSN#19006: dit is hier ingeplakt, maar moet nog gereviseerd worden naar de laatste stand van zaken


CREATE OR REPLACE PROCEDURE fac_import_factuur (p_import_key IN NUMBER
                                               )
AS

    -- Standaard volgorde van de kolommen in het CSV-formaat, waarbij 3 velden VERPLICHT (minimaal door Facilitor vereist)
    -- Variabelelijst
    -- v_leveranciernr: 1
    -- v_factuurnr: 2            (VERPLICHT, anders zet Facilitor '-' in factuurnr, en is status van factuur "Incompleet")
    -- v_factuurdatum: 3
    -- v_empty);
    -- v_ordernr: 4              (VERPLICHT, anders is status van factuur "Incompleet")
    -- v_locatie: 5
    -- v_afleverdatum: 6
    -- v_omschrijving: 7
    -- v_aantal: 8
    -- v_kostprijs: 9            (VERPLICHT, anders is status van factuur "Incompleet")
    -- v_btw_bedrag: 10          (VERPLICHT, of anders veld 11, anders is status van factuur "Incompleet")
    -- v_btw: 11                 (VERPLICHT, of anders veld 10, anders is status van factuur "Incompleet")
    -- v_docid: 12
    -- v_debiteur_nr: 13
    -- v_opmerking: 14
    -- v_btw_verlegd: 15         (VERPLICHT, Ja/Nee/<leeg> waarbij leeg gelijk is aan Nee. Andere waarden leidt tot "Incompleet")
    -- v_kenmerk1: 16
    -- v_kenmerk2: 17
    -- v_kenmerk3: 18
    -- v_kenmerk4: 19
    -- v_kenmerk5: 20
    -- v_boekmaand: 21
    -- v_kenmerk6: 22
    -- v_kenmerk7: 23
    -- v_kenmerk8: 24
    -- v_kenmerk9: 25
    -- v_kenmerk10: 26
    -- v_kenmerk11: 27
    -- v_kenmerk12: 28
    -- v_kenmerk13: 29
    -- v_kenmerk14: 30
    -- v_kenmerk15: 31
    -- v_kenmerk16: 32
    -- v_kenmerk17: 33
    -- v_kenmerk18: 34
    -- v_kenmerk19: 35
    -- v_kenmerk20: 36
    -- v_artikelcode: 37
    -- v_factuurregelaantal: 38
    -- v_eenheid: 39
    -- v_opdrachtregelid: 40
    -- Eerst geprobeerd via nette array, geeft problemen met type buiten package, en in package lukt niet omdat
    -- de import in Facilitor package-loos is (en niet 1-2-3 zo kan worden gemaakt vanwege alle bestaande klanten)
    -- 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,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40);

    -- Dus dan maar via een string, en ook op slimme wijze, nl alsof het een ingelezen factuur-record is met p_fielddelimitor
    v_seq_of_columns VARCHAR(255);


    -- Afwijkingen op deze volgorde zijn in eigen cust_import_factuur te regelen.

    -- Als leveranciersnr en factuurnr b.v. zijn omgedraaid in het CSV-formaat,
    -- dan factuurimport 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 leveranciersnr NIET in CSV staat, dan factuurimport 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.

BEGIN
    v_seq_of_columns := '1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40';
    fac_import_factuur_body(p_import_key, v_seq_of_columns);
END;
/





CREATE OR REPLACE PROCEDURE fac_import_factuur_body (p_import_key IN NUMBER,
                                                     p_seq_of_columns IN VARCHAR2
                                                    )
AS
   v_newline fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
   v_field VARCHAR2 (100);
   v_fielddelimitor VARCHAR2 (2);
   v_errormsg VARCHAR (200);
   v_errorhint VARCHAR2 (200);
   v_count NUMBER(10);
   oracle_err_num NUMBER;
   oracle_err_mes VARCHAR2 (200);

   -- De velden op de eerste regel
   v_totbedrfact VARCHAR2 (100);
   v_totbedrfactvalue VARCHAR2 (100);
   -- De importvelden
   v_empty VARCHAR2 (100);
   v_debiteurnr VARCHAR2 (100);
   v_ordernr VARCHAR2 (100);
   v_leveranciernr VARCHAR2 (100);
   v_factuurnr VARCHAR2 (100);
   v_factuurdatum VARCHAR2 (100);
   v_aantal VARCHAR2 (100);
   v_kostprijs VARCHAR2 (100);
   v_btw VARCHAR2 (100);
   v_btw_bedrag VARCHAR2 (100);
   v_docid VARCHAR2 (255);
   v_locatie VARCHAR2 (100);
   v_afleverdatum VARCHAR2 (100);
   v_omschrijving VARCHAR2 (4000);
   v_opmerking VARCHAR2 (250);
   v_btw_verlegd VARCHAR2 (255);
   v_kenmerk1 VARCHAR2 (255);
   v_kenmerk2 VARCHAR2 (255);
   v_kenmerk3 VARCHAR2 (255);
   v_kenmerk4 VARCHAR2 (255);
   v_kenmerk5 VARCHAR2 (255);
   v_kenmerk6 VARCHAR2 (255);
   v_kenmerk7 VARCHAR2 (255);
   v_kenmerk8 VARCHAR2 (255);
   v_kenmerk9 VARCHAR2 (255);
   v_kenmerk10 VARCHAR2 (255);
   v_kenmerk11 VARCHAR2 (255);
   v_kenmerk12 VARCHAR2 (255);
   v_kenmerk13 VARCHAR2 (255);
   v_kenmerk14 VARCHAR2 (255);
   v_kenmerk15 VARCHAR2 (255);
   v_kenmerk16 VARCHAR2 (255);
   v_kenmerk17 VARCHAR2 (255);
   v_kenmerk18 VARCHAR2 (255);
   v_kenmerk19 VARCHAR2 (255);
   v_kenmerk20 VARCHAR2 (255);
   v_boekmaand VARCHAR2 (255);
   v_artikelcode VARCHAR2(255);
   v_factuurregelaantal NUMBER(8,2);
   v_eenheid VARCHAR2(30);
   v_opdrachtregelid NUMBER(10);

   v_check_dec_sign NUMBER (5, 2);

   v_seq_of_columns VARCHAR2(255);
   v_colnr VARCHAR2 (2);
   v_colnr1 NUMBER;
   v_colnr2 NUMBER;
   v_colnr3 NUMBER;
   v_colnr4 NUMBER;
   v_colnr5 NUMBER;
   v_colnr6 NUMBER;
   v_colnr7 NUMBER;
   v_colnr8 NUMBER;
   v_colnr9 NUMBER;
   v_colnr10 NUMBER;
   v_colnr11 NUMBER;
   v_colnr12 NUMBER;
   v_colnr13 NUMBER;
   v_colnr14 NUMBER;
   v_colnr15 NUMBER;
   v_colnr16 NUMBER;
   v_colnr17 NUMBER;
   v_colnr18 NUMBER;
   v_colnr19 NUMBER;
   v_colnr20 NUMBER;
   v_colnr21 NUMBER;
   v_colnr22 NUMBER;
   v_colnr23 NUMBER;
   v_colnr24 NUMBER;
   v_colnr25 NUMBER;
   v_colnr26 NUMBER;
   v_colnr27 NUMBER;
   v_colnr28 NUMBER;
   v_colnr29 NUMBER;
   v_colnr30 NUMBER;
   v_colnr31 NUMBER;
   v_colnr32 NUMBER;
   v_colnr33 NUMBER;
   v_colnr34 NUMBER;
   v_colnr35 NUMBER;
   v_colnr36 NUMBER;
   v_colnr37 NUMBER;
   v_colnr38 NUMBER;
   v_colnr39 NUMBER;
   v_colnr40 NUMBER;

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

BEGIN
   -- Er kunnen al records in fac_imp_factuur zitten als meerdere XML-bestanden
   -- zijn ingelezen door UTILS\gen_import\gen_import.wsf die tegelijk worden
   -- verwerkt
   SELECT COALESCE(MAX(fac_imp_file_index), 0)+1
     INTO v_count
     FROM fac_imp_factuur
    WHERE fac_import_key = p_import_key;

   -- Init
   v_fielddelimitor := fac.import_delimiter(p_import_key);
   v_seq_of_columns := p_seq_of_columns;
   v_errorhint := 'Bepalen volgorde kolommen';

   -- 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_colnr1);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr2);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr3);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr4);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr5);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr6);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr7);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr8);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr9);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr10);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr11);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr12);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr13);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr14);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr15);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr16);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr17);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr18);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr19);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr20);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr21);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr22);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr23);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr24);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr25);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr26);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr27);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr28);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr29);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr30);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr31);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr32);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr33);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr34);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr35);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr36);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr37);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr38);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr39);
   fac.imp_getfield (v_seq_of_columns, v_fielddelimitor, v_colnr40);

   v_errorhint := 'Decimaal check';

   -- check the client decimal settings
   -- we do not convert the , to a . if the client decimal separator is a ,
   SELECT   fac.safe_to_number ('2,5') INTO v_check_dec_sign FROM DUAL;

   FOR v_rec IN cfactuur
   LOOP
       BEGIN
          v_errorhint := 'Inlezen regel';
          v_newline := v_rec.fac_imp_file_line;
          -- we gaan geen regels inlezen die geen informatie bevatten.
          IF LENGTH (v_newline) > 10
          THEN
             v_errorhint := 'Inlezen leveranciernr kolom:' || v_colnr1;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr1), v_leveranciernr);
             v_errorhint := 'Inlezen factuurnr kolom:' || v_colnr2;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr2), v_factuurnr);
             v_errorhint := 'Inlezen factuurdatum kolom:' || v_colnr3;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr3), v_factuurdatum);
             v_errorhint := 'Inlezen ordernr kolom:' || v_colnr4;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr4), v_ordernr);
             v_errorhint := 'Inlezen locatie kolom:' || v_colnr5;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr5), v_locatie);
             v_errorhint := 'Inlezen afleverdatum kolom:' || v_colnr6;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr6), v_afleverdatum);
             v_errorhint := 'Inlezen omschrijving kolom:' || v_colnr7;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr7), v_omschrijving);
             v_errorhint := 'Inlezen aantal kolom:' || v_colnr8;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr8), v_aantal);
             v_errorhint := 'Inlezen kostprijs kolom:' || v_colnr9;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr9), v_kostprijs);
             v_errorhint := 'Inlezen btw_bedrag kolom:' || v_colnr10;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr10), v_btw_bedrag);
             v_errorhint := 'Inlezen btw kolom:' || v_colnr11;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr11), v_btw);
             v_errorhint := 'Inlezen docid kolom:' || v_colnr12;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr12), v_docid);
             v_errorhint := 'Inlezen debiteurnr kolom:' || v_colnr13;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr13), v_debiteurnr);
             v_errorhint := 'Inlezen opmerking kolom:' || v_colnr14;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr14), v_opmerking);
             v_errorhint := 'Inlezen btw_verlegd kolom:' || v_colnr15;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr15), v_btw_verlegd);
             v_errorhint := 'Inlezen kenmerk1 kolom:' || v_colnr16;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr16), v_kenmerk1);
             v_errorhint := 'Inlezen kenmerk2 kolom:' || v_colnr17;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr17), v_kenmerk2);
             v_errorhint := 'Inlezen kenmerk3 kolom:' || v_colnr18;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr18), v_kenmerk3);
             v_errorhint := 'Inlezen kenmerk4 kolom:' || v_colnr19;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr19), v_kenmerk4);
             v_errorhint := 'Inlezen kenmerk5 kolom:' || v_colnr20;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr20), v_kenmerk5);
             v_errorhint := 'Inlezen boekmaand kolom:' || v_colnr21;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr21), v_boekmaand);
             v_errorhint := 'Inlezen kenmerk6 kolom:' || v_colnr22;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr22), v_kenmerk6);
             v_errorhint := 'Inlezen kenmerk7 kolom:' || v_colnr23;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr23), v_kenmerk7);
             v_errorhint := 'Inlezen kenmerk8 kolom:' || v_colnr24;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr24), v_kenmerk8);
             v_errorhint := 'Inlezen kenmerk9 kolom:' || v_colnr25;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr25), v_kenmerk9);
             v_errorhint := 'Inlezen kenmerk10 kolom:' || v_colnr26;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr26), v_kenmerk10);
             v_errorhint := 'Inlezen kenmerk11 kolom:' || v_colnr27;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr27), v_kenmerk11);
             v_errorhint := 'Inlezen kenmerk12 kolom:' || v_colnr28;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr28), v_kenmerk12);
             v_errorhint := 'Inlezen kenmerk13 kolom:' || v_colnr29;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr29), v_kenmerk13);
             v_errorhint := 'Inlezen kenmerk14 kolom:' || v_colnr30;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr30), v_kenmerk14);
             v_errorhint := 'Inlezen kenmerk15 kolom:' || v_colnr31;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr31), v_kenmerk15);
             v_errorhint := 'Inlezen kenmerk16 kolom:' || v_colnr32;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr32), v_kenmerk16);
             v_errorhint := 'Inlezen kenmerk17 kolom:' || v_colnr33;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr33), v_kenmerk17);
             v_errorhint := 'Inlezen kenmerk18 kolom:' || v_colnr34;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr34), v_kenmerk18);
             v_errorhint := 'Inlezen kenmerk19 kolom:' || v_colnr35;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr35), v_kenmerk19);
             v_errorhint := 'Inlezen kenmerk20 kolom:' || v_colnr36;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr36), v_kenmerk20);
             v_errorhint := 'Inlezen factuurregel artikelcode kolom:' || v_colnr37;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr37), v_artikelcode);
             v_errorhint := 'Inlezen factuurregel aantal kolom:' || v_colnr38;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr38), v_factuurregelaantal);
             v_errorhint := 'Inlezen factuurregel eenheid kolom:' || v_colnr39;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr39), v_eenheid);
             v_errorhint := 'Inlezen factuurregel opdrachtregelid kolom:' || v_colnr40;
             fac.imp_getfield_nr (v_newline, v_fielddelimitor, fac.safe_to_number(v_colnr40), v_opdrachtregelid);


             IF v_check_dec_sign IS NULL
             THEN
                v_kostprijs := REPLACE (SUBSTR (v_kostprijs, 1, 15), ',', '.');
                v_btw_bedrag := REPLACE (SUBSTR (v_btw_bedrag, 1, 15), ',', '.');
                v_aantal := REPLACE (SUBSTR (v_aantal, 1, 10), ',', '.');
             ELSE
                v_kostprijs := SUBSTR (v_kostprijs, 1, 15);
                v_btw_bedrag := SUBSTR (v_btw_bedrag, 1, 15);
                v_aantal := SUBSTR (v_aantal, 1, 10);
             END IF;

             -- Een (eventuele) header-regel willen we niet importeren
             -- ORDERNR lijkt een goede maatstaf, want die bevat de verwijzing
             -- naar onze BROC en moet aan conventies voldoen
             IF UPPER (v_ordernr) = 'ORDERNR'
             THEN
               -- de header, dus negeren
               NULL;
             ELSE
                INSERT INTO fac_imp_factuur (  fac_import_key,
                                               fac_imp_file_index,
                                               leveranciernr,
                                               ordernr,
                                               factuurnr,
                                               factuurdatum,
                                               aantal,
                                               kostprijs,
                                               btw,
                                               debiteurnr,
                                               locatie,
                                               afleverdatum,
                                               btw_bedrag,
                                               docid,
                                               omschrijving,
                                               opmerking,
                                               btw_verlegd,
                                               kenmerk1,
                                               kenmerk2,
                                               kenmerk3,
                                               kenmerk4,
                                               kenmerk5,
                                               kenmerk6,
                                               kenmerk7,
                                               kenmerk8,
                                               kenmerk9,
                                               kenmerk10,
                                               kenmerk11,
                                               kenmerk12,
                                               kenmerk13,
                                               kenmerk14,
                                               kenmerk15,
                                               kenmerk16,
                                               kenmerk17,
                                               kenmerk18,
                                               kenmerk19,
                                               kenmerk20,
                                               boekmaand,
                                               artikelcode,
                                               factuurregelaantal,
                                               eenheid,
                                               opdrachtregelid)
                  VALUES   (   v_rec.fac_import_key,
                               v_count,
                               UPPER (SUBSTR (v_leveranciernr, 1, 20)),
                               SUBSTR (REPLACE(v_ordernr,' ',''), 1, 31),
                               SUBSTR (v_factuurnr, 1, 30),
                               SUBSTR (v_factuurdatum, 1, 10),
                               SUBSTR (v_aantal, 1, 10),
                               v_kostprijs,
                               SUBSTR (v_btw, 1, 2),
                               SUBSTR (v_debiteurnr, 1, 30),
                               SUBSTR (v_locatie, 1, 30),
                               SUBSTR (v_afleverdatum, 1, 10),
                               v_btw_bedrag,
                               SUBSTR (v_docid, 1, 255),
                               SUBSTR (v_omschrijving, 1, 250),
                               SUBSTR (v_opmerking, 1, 250),
                               SUBSTR (v_btw_verlegd, 1, 3),
                               SUBSTR (v_kenmerk1, 1, 255),
                               SUBSTR (v_kenmerk2, 1, 255),
                               SUBSTR (v_kenmerk3, 1, 255),
                               SUBSTR (v_kenmerk4, 1, 255),
                               SUBSTR (v_kenmerk5, 1, 255),
                               SUBSTR (v_kenmerk6, 1, 255),
                               SUBSTR (v_kenmerk7, 1, 255),
                               SUBSTR (v_kenmerk8, 1, 255),
                               SUBSTR (v_kenmerk9, 1, 255),
                               SUBSTR (v_kenmerk10, 1, 255),
                               SUBSTR (v_kenmerk11, 1, 255),
                               SUBSTR (v_kenmerk12, 1, 255),
                               SUBSTR (v_kenmerk13, 1, 255),
                               SUBSTR (v_kenmerk14, 1, 255),
                               SUBSTR (v_kenmerk15, 1, 255),
                               SUBSTR (v_kenmerk16, 1, 255),
                               SUBSTR (v_kenmerk17, 1, 255),
                               SUBSTR (v_kenmerk18, 1, 255),
                               SUBSTR (v_kenmerk19, 1, 255),
                               SUBSTR (v_kenmerk20, 1, 255),
                               SUBSTR (v_boekmaand, 1, 7),
                               SUBSTR (v_artikelcode, 1, 30),
                               v_factuurregelaantal,
                               SUBSTR (v_eenheid, 1, 30),
                               v_opdrachtregelid
                           );
                v_count := v_count + 1;
             END IF;
             COMMIT;
          END IF;
       END;
   END LOOP;
   DELETE fac_imp_file WHERE fac_import_key = p_import_key;
EXCEPTION
  WHEN OTHERS
  THEN
     oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
     v_errormsg := ' ORACLE (error ' || oracle_err_mes || ')';
     fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
END;
/


CREATE OR REPLACE PROCEDURE fac_update_factuur (p_import_key IN NUMBER)
AS
   -- In cursor cfactuur is alles mooi getrimmed. NB: de sortering is cruciaal!
   CURSOR cfactuurregel
   IS
       SELECT   leveranciernr,
                ordernr,
                factuurnr,
                factuurdatum,
                fac.safe_to_number (aantal) aantal,
                fac.safe_to_number (kostprijs) kostprijs,
                fac.safe_to_number (btw) btw,
                fac.safe_to_number (btw_bedrag) btw_bedrag,
                debiteurnr,
                locatie,
                afleverdatum,
                docid,
                omschrijving,
                opmerking,
                btw_verlegd,
                boekmaand,
                artikelcode,
                factuurregelaantal,
                eenheid,
                opdrachtregelid,
                fac_import_key,
                fac_imp_file_index
       FROM fac_imp_factuur
      WHERE fac_import_key = p_import_key
       ORDER BY factuurnr, ordernr DESC, fac_imp_file_index;

  c_i NUMBER;
  c_factuur_record_is_added BOOLEAN;
  c_succeeded BOOLEAN;
  c_factuur_key NUMBER;
  c_factuurregel NUMBER;
  c_fac_type VARCHAR2 (1);
  c_prefix VARCHAR2 (3);
  c_ordernr_index NUMBER;
  c_ordernr_s1 VARCHAR2 (20);
  c_ordernr_s2 VARCHAR2 (20);
  c_ordernr_t VARCHAR2 (40);
  c_old_ordernr fac_imp_factuur.ordernr%TYPE;
  c_factuur_nr fac_imp_factuur.factuurnr%TYPE;
  c_old_factuurnr fac_imp_factuur.factuurnr%TYPE;
  c_fin_factuur_datum fin_factuur.fin_factuur_datum%TYPE;
  c_write_ordernr VARCHAR2 (20);
  c_bestelopdr_id VARCHAR2 (20);
  c_totaal NUMBER;
  c_fact_totaal NUMBER;
  c_factuur_totaal NUMBER;
  c_factuur_btw NUMBER;
  c_factuur_statuses_key   fin_factuur.fin_factuur_statuses_key%TYPE;
  c_kostprijs fin_factuurregel.fin_factuurregel_totaal%TYPE;
  c_btwtabel_key fin_btwtabel.fin_btwtabel_key%TYPE;
  c_boekmaand fin_factuur.fin_factuur_boekmaand%TYPE;
  c_artikelcode fin_factuurregel.fin_factuurregel_code%TYPE;
  c_factuurregelaantal fin_factuurregel.fin_factuurregel_aantal%TYPE;
  c_eenheid fin_factuurregel.fin_factuurregel_eenheid%TYPE;
  c_opdrachtregelid fin_factuurregel.fin_factuurregel_id%TYPE;
  c_find BOOLEAN;
  c_find_ordernr BOOLEAN;
  c_mld_opdr_key NUMBER (10);
  c_cnt_contract_key NUMBER (10);
  c_bes_bestelopdr_key NUMBER (10);
  c_prs_perslid_key_user NUMBER(10);
  c_prs_kostensoort_key NUMBER(10);
  c_btw_verlegd NUMBER(1);
  c_fin_factuurregel_key NUMBER(10);

  c_prs_bedrijf_naam VARCHAR2 (100);
  c_opmerking VARCHAR2 (1000);   --  maar wordt uiteindelijk getruct naar fin_factuur_opmerking%type (250)

  v_errormsg VARCHAR (200);
  oracle_err_mes VARCHAR2 (150);



  -- Het datumformaat mag een van de volgende zijn:
  -- 1) dd-mm-yyyy of dd/mm/yyyy
  -- 2) yyyy-mm-dd of yyyy/mm/dd
  -- 3) ddmmyyyy of (dd-mm-yy of dd/mm/yy)
  -- 4) ddmmyy
  -- Indien geen van bovenstaand datumformaat of ongeldig datumformaat,
  -- dan indien p_wheninvalid_sysdate = TRUE, dan wordt de huidige systeemdatum opgeleverd,
  -- en anders de lege waarde (NULL-value).
  FUNCTION try_getdatum (p_c_datum IN VARCHAR2, p_wheninvalid_sysdate IN BOOLEAN)
  RETURN DATE
  AS
       c_dd    VARCHAR2 (2);
       c_mm    VARCHAR2 (2);
       c_yyyy  VARCHAR2 (4);
       c_yy    VARCHAR2 (2);
       v_c_datum VARCHAR2 (10);
       p_d_datum DATE;
  BEGIN
       -- plaats een voorloopnul als deze door Excel verwijderd is.
       IF length(p_c_datum) = 7 THEN
          v_c_datum := '0' || p_c_datum;
       ELSE
          v_c_datum := p_c_datum;
       END IF;
       p_d_datum := NULL;
       IF LENGTH(v_c_datum) = 10
       THEN
           IF  ((SUBSTR(v_c_datum,3,1) = '-' AND SUBSTR(v_c_datum,6,1) = '-') OR
               (SUBSTR(v_c_datum,3,1) = '/' AND SUBSTR(v_c_datum,6,1) = '/'))
           THEN
               -- Formaat 1) dd-mm-yyyy of dd/mm/yyyy
               c_dd := SUBSTR(v_c_datum, 1,2);
               c_mm := SUBSTR(v_c_datum, 4,2);
               c_yyyy := SUBSTR(v_c_datum, 7,4);
           ELSIF ((SUBSTR(v_c_datum,5,1) = '-' AND SUBSTR(v_c_datum,8,1) = '-') OR
                (SUBSTR(v_c_datum,5,1) = '/' AND SUBSTR(v_c_datum,8,1) = '/'))
           THEN
               -- Formaat 2) yyyy-mm-dd of yyyy/mm/dd
               c_dd := SUBSTR(v_c_datum, 9,2);
               c_mm := SUBSTR(v_c_datum, 6,2);
               c_yyyy := SUBSTR(v_c_datum, 1,4);
           END IF;
       ELSIF LENGTH(v_c_datum) = 8
       THEN
           -- Formaat 3) ddmmyyyy of dd-mm-yy of dd/mm/yy
           IF  ((SUBSTR(v_c_datum,3,1) = '-' AND SUBSTR(v_c_datum,6,1) = '-') OR
               (SUBSTR(v_c_datum,3,1) = '/' AND SUBSTR(v_c_datum,6,1) = '/'))
           THEN
               -- dd-mm-yy of dd/mm/yy
               c_dd := SUBSTR(v_c_datum, 1,2);
               c_mm := SUBSTR(v_c_datum, 4,2);
               c_yyyy := SUBSTR(v_c_datum, 7,2);
           ELSE
               -- Formaat 3) ddmmyyyy
               c_dd := SUBSTR(v_c_datum, 1,2);
               c_mm := SUBSTR(v_c_datum, 3,2);
               c_yyyy := SUBSTR(v_c_datum, 5,4);
           END IF;
       ELSIF LENGTH(v_c_datum) = 6
       THEN
           -- Formaat 4) ddmmyy
           c_dd := SUBSTR(v_c_datum, 1,2);
           c_mm := SUBSTR(v_c_datum, 3,2);
           c_yyyy := SUBSTR(v_c_datum, 5,2);
       END IF;

       BEGIN
           IF LENGTH(c_yyyy)=2
           THEN
               SELECT SUBSTR(TO_CHAR(SYSDATE,'YYYY'),1,2)
               INTO c_yy
               FROM DUAL;
               c_yyyy := c_yy || c_yyyy;
           END IF;

           SELECT TO_DATE (c_yyyy || '-' || c_mm || '-' || c_dd || ' 00:00', 'YYYY-MM-DD HH24:MI')
           INTO p_d_datum
           FROM DUAL;

           -- controleer of we toch een geldige datum hebben. Oracle vind 12-12-0006 ook geldig.
           IF p_d_datum NOT BETWEEN TO_DATE('20000101', 'yyyymmdd') AND TO_DATE('20991231', 'yyyymmdd')
           THEN
               IF p_wheninvalid_sysdate
               THEN
                   BEGIN
                       SELECT TRUNC(SYSDATE)
                              INTO p_d_datum
                              FROM DUAL;
                   EXCEPTION
                   WHEN OTHERS
                       THEN
                           p_d_datum := NULL;
                   END;
               ELSE
                   p_d_datum := NULL;
               END IF;
           END IF;
       EXCEPTION
               WHEN OTHERS
               THEN
                   IF p_wheninvalid_sysdate
                   THEN
                       BEGIN
                           SELECT TRUNC(SYSDATE)
                           INTO p_d_datum
                           FROM DUAL;
                       EXCEPTION
                       WHEN OTHERS
                           THEN
                               p_d_datum := NULL;
                       END;
                   ELSE
                       p_d_datum := NULL;
                   END IF;
       END;
       RETURN(p_d_datum);
  END;

  FUNCTION try_getcontract_id (p_broc_nr IN VARCHAR2, p_leverancier_nr IN VARCHAR2)
  RETURN NUMBER
  AS
       c_prefix1       VARCHAR2 (1);
       c_contract_nr   VARCHAR2 (20);
       p_broc_key      NUMBER(10);
  BEGIN
       p_broc_key := NULL;
       c_prefix1 := SUBSTR (p_broc_nr, 1, 1);
       IF (ASCII (c_prefix1) = 67 OR ASCII (c_prefix1) = 99)
       THEN
           BEGIN
               -- haal prefix 'C' of 'c' eraf
               c_contract_nr := SUBSTR (p_broc_nr, 2);
               IF INSTR(p_broc_nr, '.') = 0
               THEN
                   -- Het laatste contract met de hoogste versie nummer opvragen.
                   -- Er kunnen meerdere contracten zijn met dezelfde contract_key, maar met verschillende versies.
                   -- Het contract met de hoogste versie is de laatste.
                   SELECT cnt_contract_key
                     INTO p_broc_key
                     FROM (  SELECT cnt_contract_key,
                                    cnt_contract_versie
                               FROM cnt_contract
                              WHERE cnt_contract_verwijder IS NULL
                                AND cnt_contract_status = 0
                                AND cnt_contract_nummer_intern = c_contract_nr
                           ORDER BY cnt_contract_key DESC)
                    WHERE ROWNUM = 1;
               ELSE
                   SELECT   cnt_contract_key
                     INTO   p_broc_key
                     FROM   cnt_contract
                    WHERE   cnt_contract_verwijder IS NULL
                      AND   cnt_contract_status = 0
                      AND   cnt_contract_nummer_intern || '.' || COALESCE(cnt_contract_versie, '0') = c_contract_nr;
               END IF;
           EXCEPTION
              WHEN OTHERS
              THEN
                   p_broc_key := NULL;
           END;
       END IF;
       RETURN p_broc_key;
  END;

  FUNCTION try_getopdracht_id (p_broc_nr IN VARCHAR2, p_leverancier_nr IN VARCHAR2)
  RETURN NUMBER
  AS
       c_prefix1       VARCHAR2 (1);
       -- Ter bepaling van de positie van de slash in bron-nr
       c_index          NUMBER;
       c_slash_index    NUMBER;
       -- Opdrachtnr voor de slash
       c_broc_s1       VARCHAR2 (20);
       -- Opdrachtnr na de slash
       c_broc_s2       VARCHAR2 (20);
       p_broc_key      NUMBER(10);
  BEGIN
       p_broc_key := NULL;
       c_index := 1;
       c_prefix1 := SUBSTR (p_broc_nr, c_index, 1);

       IF ( ( (ASCII (c_prefix1) >= 65 AND ASCII (c_prefix1) <= 90)
              OR (ASCII (c_prefix1) >= 97 AND ASCII(c_prefix1) <= 122))
            AND ASCII (c_prefix1) != 67
            AND ASCII (c_prefix1) != 99)
       THEN
           -- Eerste karakter is een letter
           -- Heeft opdrachtnr nog meer aan prefix?
           c_index := 2;
           c_prefix1 := SUBSTR (p_broc_nr, c_index, 1);

           IF  ( (ASCII (c_prefix1) >= 65 AND ASCII (c_prefix1) <= 90)
              OR (ASCII (c_prefix1) >= 97 AND ASCII(c_prefix1) <= 122))
           THEN
               -- Eerste 2 karakter zijn letters
               -- Heeft opdrachtnr nog meer aan prefix?
               c_index := 3;
               c_prefix1 := SUBSTR (p_broc_nr, c_index, 1);
               IF  ( (ASCII (c_prefix1) >= 65 AND ASCII (c_prefix1) <= 90)
                  OR (ASCII (c_prefix1) >= 97 AND ASCII(c_prefix1) <= 122))
               THEN
                   -- Opdracht heeft prefix van 3 letters.
                   c_index := 4;
               END IF;
           END IF;

           c_slash_index := INSTR (p_broc_nr, '/');
           IF c_slash_index = 0
           THEN
               c_broc_s1 := SUBSTR (p_broc_nr, c_index);
               c_broc_s2 := '';
           ELSE
               c_broc_s1 := SUBSTR (p_broc_nr, c_index, c_slash_index - c_index);
               c_broc_s2 := SUBSTR (p_broc_nr, c_slash_index + 1);
           END IF;
           BEGIN
               SELECT  o.mld_opdr_key
               INTO    p_broc_key
               FROM    mld_opdr o, mld_typeopdr mto
               WHERE   o.mld_typeopdr_key = mto.mld_typeopdr_key
               AND     mto.mld_typeopdr_kosten = 1
               AND     o.mld_statusopdr_key NOT IN (1, 2, 3, 10)
               AND     o.mld_melding_key = fac.safe_to_number (c_broc_s1)
               AND     o.mld_opdr_bedrijfopdr_volgnr = fac.safe_to_number (c_broc_s2);
           EXCEPTION
              WHEN OTHERS
              THEN
                   p_broc_key := NULL;
           END;
       END IF;
       RETURN p_broc_key;
  END;

  FUNCTION try_getbestelling_id (p_broc_nr IN VARCHAR2, p_leverancier_nr IN VARCHAR2)
  RETURN NUMBER
  AS
       c_prefix1       VARCHAR2 (1);
       -- Ter bepaling van de positie van de slash in bron-nr
       c_slash_index    NUMBER;
       -- Opdrachtnr voor de slash
       c_broc_s1       VARCHAR2 (20);
       -- Opdrachtnr na de slash
       c_broc_s2       VARCHAR2 (20);
       p_broc_key      NUMBER(10);
  BEGIN
     p_broc_key := NULL;
     BEGIN
        SELECT  bes_bestelopdr_key
        INTO    p_broc_key
        FROM    bes_bestelopdr
        WHERE   bes_bestelopdr_id = p_broc_nr;
      EXCEPTION
      WHEN OTHERS
        THEN
           p_broc_key := NULL;
      END;
      RETURN p_broc_key;
   END;


  -- Getfactype's levert van een gegevens opdrachtnummer p_broc_nr de key op van:
  -- de bestelopdracht (p_bkey), meldingopdracht (p_okey) of contract (p_ckey).
  -- Deze werking is gebaseerd op volgende randvoorwaarden cq. eisen cq. instellingen:
  -- 1) Contractnummer wordt geprefixed door 'c' (of 'C').
  -- 2) Meldingen worden geprefixed door minimaal 1 letter (let op: dus GEEN!!! cijfer(s)).
  -- 3) De prefix van melding (vakgroeptype) mag geen c (of C) zijn
  -- 4) Bestellingen worden niet geprefixed (we kunnen hier de setting bes_bestelopdr_prefix in default.inc niet uitlezen,
  --    of we moeten die instelling ombuigen tot een DB-setting (fac_setting?)
  -- 5) De prefix-instelling mag tussentijds (nadat een opdracht uitgegeven) niet worden gewijzigd.
  PROCEDURE get_fin_factuur_referentie (p_broc_nr IN VARCHAR2, p_leverancier_nr IN VARCHAR2, p_ckey IN OUT NUMBER, p_okey IN OUT NUMBER, p_bkey IN OUT NUMBER)
  IS
  BEGIN
       p_ckey:=NULL;
       p_okey:=NULL;
       p_bkey:=NULL;
       IF LENGTH (p_broc_nr) > 0
       THEN
           p_ckey := try_getcontract_id (p_broc_nr, p_leverancier_nr);
           IF p_ckey IS NULL
           THEN
               p_okey := try_getopdracht_id (p_broc_nr, p_leverancier_nr);
               IF p_okey IS NULL
               THEN
                   p_bkey := try_getbestelling_id (p_broc_nr, p_leverancier_nr);
               END IF;
           END IF;
       END IF;
  END;

  FUNCTION try_getkostensoort (p_ckey IN NUMBER, p_okey IN NUMBER, p_bkey IN NUMBER)
  RETURN NUMBER
  IS
  -- Kostensoort bij de bestelling
  -- bestelopdracht->bestelopdritems->bestelitem->srtdeel->srtgroep[->discipline]
    CURSOR c_bes_kostensoort IS
       SELECT DISTINCT COALESCE(isg.prs_kostensoort_key, itd.prs_kostensoort_key) prs_kostensoort_key, count(*) aant_art
       FROM bes_bestelling_item bi,
       bes_srtdeel isd, bes_srtgroep isg, ins_tab_discipline itd, bes_bestelopdr_item boi, bes_bestelopdr bo
       WHERE bi.bes_srtdeel_key = isd.bes_srtdeel_key
       AND isd.bes_srtgroep_key = isg.bes_srtgroep_key
       AND isg.ins_discipline_key = itd.ins_discipline_key
       AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
       AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key
       AND bo.bes_bestelopdr_key = p_bkey
       GROUP BY COALESCE(isg.prs_kostensoort_key, itd.prs_kostensoort_key)
       ORDER BY aant_art DESC;
    CURSOR c_mld_kostensoort IS
       SELECT COALESCE(std.prs_kostensoort_key, id.prs_kostensoort_key) prs_kostensoort_key
       FROM   mld_opdr o, ins_tab_discipline id, mld_stdmelding std, mld_melding m
       WHERE  id.ins_discipline_key = std.mld_ins_discipline_key
       AND std.mld_stdmelding_key = m.mld_stdmelding_key
       AND m.mld_melding_key = o.mld_melding_key
       AND o.mld_opdr_key = p_okey;
    CURSOR c_cnt_kostensoort IS
       SELECT COALESCE (c.prs_kostensoort_key,id.prs_kostensoort_key) prs_kostensoort_key
       FROM cnt_contract c, ins_tab_discipline id
       WHERE id.ins_discipline_key = c.ins_discipline_key
       AND   c.cnt_contract_key = p_ckey;
     p_prs_kostensoort_key NUMBER(10);
   BEGIN
       p_prs_kostensoort_key:=NULL;
       BEGIN
          -- De strategie is om bij de categorie de meeste waarschijnlijke default ks te vinden
          -- kennelijk
          IF p_bkey IS NOT NULL
          THEN
              -- Kostensoort is te zoeken bij de bestelopdracht
              FOR rc IN c_bes_kostensoort
              LOOP
                  p_prs_kostensoort_key := rc.prs_kostensoort_key;
                  EXIT WHEN p_prs_kostensoort_key IS NOT NULL;
              END LOOP;
          ELSIF p_okey IS NOT NULL
          THEN
              -- Kostensoort is te zoeken bij de meldingopdracht
              FOR rc IN c_mld_kostensoort
              LOOP
                  p_prs_kostensoort_key := rc.prs_kostensoort_key;
                  EXIT WHEN p_prs_kostensoort_key IS NOT NULL;
              END LOOP;
          ELSIF p_ckey IS NOT NULL
          THEN
              -- Kostensoort is te zoeken bij contract
              FOR rc IN c_cnt_kostensoort
              LOOP
                  p_prs_kostensoort_key := rc.prs_kostensoort_key;
                  EXIT WHEN p_prs_kostensoort_key IS NOT NULL;
              END LOOP;
          END IF;
       EXCEPTION
       WHEN NO_DATA_FOUND
       THEN
           p_prs_kostensoort_key := NULL;
       END;
       RETURN(p_prs_kostensoort_key);
   END;

  FUNCTION try_getrefdatum (p_fin_defaultboekmaand_opdr IN NUMBER, p_fin_defaultboekmaand_cnt IN NUMBER, p_ckey IN NUMBER, p_okey IN NUMBER, p_bkey IN NUMBER, p_fin_factuur_datum IN DATE)
  RETURN DATE
  IS
     refdatum DATE;
   BEGIN
       refdatum := NULL;
       BEGIN
          IF p_bkey IS NOT NULL AND p_fin_defaultboekmaand_opdr IN (2, 3)
          THEN
              SELECT CASE
                     WHEN p_fin_defaultboekmaand_opdr = 2
                     THEN
                         bes_bestelopdr_datum
                     ELSE
                         bes_bestelopdr_leverdatum
                     END
                INTO refdatum
                FROM bes_bestelopdr bo
               WHERE bo.bes_bestelopdr_key = p_bkey;
          ELSIF p_okey IS NOT NULL AND p_fin_defaultboekmaand_opdr IN (2, 3)
          THEN
              SELECT CASE
                     WHEN p_fin_defaultboekmaand_opdr = 2
                     THEN
                         mld_opdr_datumbegin
                     ELSE
                         mld_opdr_einddatum
                     END
                INTO refdatum
                FROM mld_opdr o
               WHERE o.mld_opdr_key = p_okey;
          ELSIF p_ckey IS NOT NULL AND p_fin_defaultboekmaand_cnt = 2
          THEN
             refdatum := p_fin_factuur_datum;
          END IF;
       EXCEPTION
       WHEN NO_DATA_FOUND
       THEN
           refdatum := NULL;
       END;
       RETURN(refdatum);
   END;

  -- Bepaalt of het BTW-tarief standaard (0), verlegd(1) of vrijgesteld(2) is, of ongeldig
  FUNCTION try_getbtw_verlegd (p_btw_verlegd IN VARCHAR2)
  RETURN NUMBER
  IS
  BEGIN
     IF UPPER(p_btw_verlegd) = 'JA' OR p_btw_verlegd = '1'
     THEN
        RETURN (1);
     ELSIF p_btw_verlegd IS NULL OR UPPER(p_btw_verlegd) = 'NEE' OR p_btw_verlegd = '0'
     THEN
        RETURN (0);
     ELSIF UPPER(p_btw_verlegd) = 'VRI'  OR p_btw_verlegd = '2'  -- VRIJ, maar de kolom is maar 3 breed
     THEN
        RETURN (2);
     ELSE
        c_opmerking := c_opmerking || CHR(13) || 'BTW-type is onbekend ('|| p_btw_verlegd ||')';
        c_factuur_statuses_key := 3; -- Incompleet
        RETURN (0);
     END IF;
  END;

  -- Bepaalt het BTW-tarief (=btwtabelwaarde_key), gegeven (XOR) of het btw-tarief 'p_btw',
  --                                                             of aan de hand de kosten 'pkosten' + het btwbedrag 'p_btwbedrag'
  -- Daarbij wordt de volgende hanteerwijze toegepast:
  -- 1) Als btw-tarief bekend is, is deze leidend. Ook al is btw-bedrag bekend, dan nog is tarief leidend.
  --    Mocht het BTW-tarief niet in de btwtabelwaarde voorkomen, maar wel het BTW-tarief dat wordt afgeleid uit het BTW-bedrag,
  --    dan en alleen in dat geval wordt het btw-bedrag leidend.
  --    Mocht in het uiterste geval ook dan het btw-tarief niet in de tabel voorkomen, dan wordt de lege waarde (NULL) opgeleverd.
  -- 2) Als btw-tarief NIET bekend is, maar btw-bedrag en kosten wel, dan wordt het btw-tarief omgekeerd berekend.
  --    Mocht het btw-tarief niet in de btw-tabel voorkomen, dan wordt de lege waarde (NULL) opgeleverd.

  FUNCTION try_getbtwtabelwaarde_key (p_btw IN NUMBER, p_kosten IN NUMBER, p_btwbedrag IN NUMBER, p_btwtabel_key IN NUMBER, p_btw_verlegd IN NUMBER)
  RETURN NUMBER
  IS
     p_btwtabelwaarde_key NUMBER(10);
  BEGIN
     p_btwtabelwaarde_key := NULL;
     IF p_btw IS NOT NULL
     THEN
        -- Regel 1): btw-tarief is bekend, dus deze zou leidend moeten zijn (tenzij een niet bestaande)...
        p_btwtabelwaarde_key := fin.getbtwtabelwaardekey_perc(p_btw, p_btwtabel_key, p_btw_verlegd);
     END IF;

     IF p_btwtabelwaarde_key IS NULL
     THEN
        -- Hier geldt dat: of p_btw is niet meegegeven, of dat
        -- p_btw wel is meegegeven maar dat het BTW-tarief kan niet in de BTW-tabel worden gevonden !!!
        -- Dit laatste zou eigenlijk niet mogen voorkomen, maar tja, dan proberen we het via de kosten en BTW-bedrag.
        IF (p_kosten IS NOT NULL AND p_btwbedrag IS NOT NULL)
        THEN
           -- Regel 2): btw-tarief is NIET bekend of ONGELDIG, dan a.d.h.v. btw-bedrag en kosten...
           p_btwtabelwaarde_key := fin.getbtwtabelwaardekey(p_kosten, p_btwbedrag, p_btwtabel_key, p_btw_verlegd);
        END IF;
     END IF;
     RETURN(p_btwtabelwaarde_key);
  END;

  -- Retourneert het fin_kenmerk_key van kenmerktype "X" (bestand) als volgt:
  -- 1) Eerst kijken of in fac_setting het kenmerk is geconfigureerd (obv tag 'fin_import_fin_kenmerk_bestand')
  -- 2) Dan via poging 2: via fin_kenmerk met type = "X" (en indien meerdere, het laagste volgnummer)
  FUNCTION try_getbestand_fin_kenmerk_key
  RETURN NUMBER
  IS
     CURSOR curs_fin_kenmerk IS
     SELECT fin_kenmerk_key
       FROM fin_kenmerk k
      WHERE k.fin_kenmerk_kenmerktype = 'X'
        AND fin_kenmerk_verwijder IS NULL
      ORDER BY fin_kenmerk_volgnr;

     lkey NUMBER(10);
  BEGIN
     BEGIN
        -- Eerst poging 1, via fac_setting
        --SELECT fac.getSetting('fin_import_fin_kenmerk_bestand')
        --INTO lkey
        --FROM DUAL;
        --IF lkey IS NULL
        --THEN
           -- Dan via poging 2: via fin_kenmerk met type = "X" (en indien meerdere, het laagste volgnummer)
           FOR rc IN curs_fin_kenmerk
           LOOP
               lkey := rc.fin_kenmerk_key;
               EXIT WHEN lkey IS NOT NULL;
           END LOOP;
        --END IF;
     EXCEPTION
        WHEN OTHERS
        THEN
           lkey := NULL;
     END;
     RETURN lkey;
  END;

  PROCEDURE try_insert_factuur_docid(p_factuur_key IN NUMBER, p_docid IN VARCHAR2)
  IS
     lkey NUMBER(10);
  BEGIN
     IF p_docid IS NOT NULL
     THEN
        -- Document/bestand is gevuld met een waarde, dus we zetten deze in de flexprop 'Factuurbestand'
        -- Dit flexprop wordt gevonden door de functie try_getbestand_fin_kenmerk_key.
        lkey := try_getbestand_fin_kenmerk_key();
        IF lkey IS NOT NULL
        THEN
           BEGIN
              -- Ook is het flexprop gevonden, nu volgt de insert in fin_kenmerkfactuur
              INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde)
              VALUES (p_factuur_key, lkey, p_docid);
           EXCEPTION
              WHEN OTHERS
              THEN
                 lkey := NULL;
           END;
        END IF;
     END IF;
  END;


  PROCEDURE try_insert_factuurregel(c_factuur_key IN NUMBER, c_factuurregel IN NUMBER, c_kostprijs IN NUMBER,
                                    c_btw IN NUMBER, c_btw_bedrag IN NUMBER, c_btwtabel_key IN NUMBER,
                                    c_fac_import_key IN NUMBER, c_fac_imp_file_index IN NUMBER,
                                    c_omschrijving IN VARCHAR2, c_locatie IN VARCHAR2, c_btw_verlegd IN NUMBER,
                                    c_artikelcode IN VARCHAR2, c_factuurregelaantal IN NUMBER, c_eenheid IN VARCHAR2, c_opdrachtregelid IN NUMBER,
                                    c_factuur_statuses_key IN OUT NUMBER, c_opmerking IN OUT VARCHAR2, c_succeeded IN OUT BOOLEAN)
  IS
     c_btwtabelwaarde_key NUMBER(10);
     l_btwbedrag fin_factuurregel.fin_factuurregel_btw%TYPE;
     l_kostprijs fin_factuurregel.fin_factuurregel_totaal%TYPE;
  BEGIN
     l_kostprijs := c_kostprijs;
     c_succeeded := FALSE;
     IF l_kostprijs IS NULL
     THEN
        -- Kostprijs is niet gevonden, of er zat een ongeldig karakters in (b.v. letter, of euro-teken).
        c_opmerking := c_opmerking || CHR(13) || 'Leeg of fout bedrag (exBTW) bij regel ' || c_factuurregel || ': is op 0 gezet';
        l_kostprijs := 0;
        c_factuur_statuses_key := 3; -- Incompleet
     END IF;

     c_btwtabelwaarde_key := try_getbtwtabelwaarde_key(c_btw, l_kostprijs, c_btw_bedrag, c_btwtabel_key, c_btw_verlegd);
     IF c_btwtabelwaarde_key IS NULL
     THEN
        -- BTW-tarief is onbekend of niet gevonden volgens de BTW-tabel, we hanteren het 0-tarief
        c_btwtabelwaarde_key := fin.getbtwtabelwaardekey_perc(0, c_btwtabel_key, c_btw_verlegd);
        IF c_btwtabelwaarde_key IS NULL
        THEN
           c_opmerking := c_opmerking || CHR(13) || 'BTW-percentage ' || c_btw || ' % bij regel ' || c_factuurregel || ': ongeldig en kan niet worden toegevoegd';
        ELSE
           c_opmerking := c_opmerking || CHR(13) || 'BTW-percentage ' || c_btw || ' % bij regel ' || c_factuurregel || ': ongeldig en is op 0 gezet';
        END IF;
        c_factuur_statuses_key := 3; -- Incompleet
     END IF;

     IF (l_kostprijs IS NOT NULL AND c_btwtabelwaarde_key IS NOT NULL)
     THEN
        l_btwbedrag := fin.getbtw_bedrag(l_kostprijs, c_btwtabelwaarde_key);
        IF ABS(ROUND(l_btwbedrag,2) - ROUND(c_btw_bedrag,2)) > fac.safe_to_number(fac.getsetting('fin_import_btwmarge'))
        THEN
           c_opmerking := c_opmerking || CHR(13) || 'BTW-bedrag bij regel ' || c_factuurregel || ': is op ' || l_btwbedrag || ' gezet';
           c_factuur_statuses_key := 3; -- Incompleet
        ELSIF c_btw_bedrag IS NOT NULL
        THEN
           l_btwbedrag := c_btw_bedrag; -- wel alle decimalen behouden
        END IF;

        INSERT INTO fin_factuurregel (  fin_factuur_key,
                                        fin_factuurregel_nr,
                                        fin_factuurregel_totaal,
                                        fin_factuurregel_btw,
                                        fin_factuurregel_omschrijving,
                                        fin_factuurregel_referentie,
                                        fin_btwtabelwaarde_key,
                                        fin_factuurregel_code,
                                        fin_factuurregel_aantal,
                                        fin_factuurregel_eenheid,
                                        fin_factuurregel_id)
        VALUES   (c_factuur_key, c_factuurregel, l_kostprijs, l_btwbedrag, c_omschrijving, c_locatie, c_btwtabelwaarde_key,
                  c_artikelcode, c_factuurregelaantal, c_eenheid, c_opdrachtregelid)
        RETURNING fin_factuurregel_key
        INTO c_fin_factuurregel_key;

        -- Voor CUST-postprocessing (van de kenmerken) is het handig te onthouden:
        UPDATE fac_imp_factuur
           SET fin_factuurregel_key = c_fin_factuurregel_key
         WHERE fac_import_key = c_fac_import_key
           AND fac_imp_file_index = c_fac_imp_file_index;

        c_succeeded := TRUE;
        COMMIT;
     END IF;
  EXCEPTION
     WHEN OTHERS
     THEN
        c_factuur_statuses_key := 3;
        c_succeeded := FALSE;
  END;


  PROCEDURE fin_factuur_finalupdate(c_factuur_key IN NUMBER, c_opmerking IN VARCHAR2, c_factuur_statuses_key IN NUMBER)
  IS
     l_opmerking VARCHAR2(1000);
     l_factuur_totaal_btw fin_factuur.fin_factuur_totaal_btw%TYPE;
  BEGIN
     l_opmerking := c_opmerking;
     -- De nabewerking op het vorige record kan hier plaatsvinden
     IF c_factuur_statuses_key = 3
     THEN
        fac.trackaction ('FINNEW', c_factuur_key, NULL, NULL, lcl.l('lcl_fin_imp_bad'));
        l_opmerking := lcl.l('lcl_fin_imp_errors') || TO_CHAR(SYSDATE,'dd-mm-yyyy') || CHR(13) || '----' || l_opmerking;
     ELSE
        fac.trackaction ('FINNEW', c_factuur_key, NULL, NULL, lcl.l('lcl_fin_imp_good'));
--         l_opmerking := lcl.l('lcl_fin_imp_success') || TO_CHAR(SYSDATE,'dd-mm-yyyy');
     END IF;

     SELECT   SUM (fin_factuurregel_btw)
       INTO   l_factuur_totaal_btw
       FROM   fin_factuurregel
      WHERE   fin_factuur_key = c_factuur_key;

     -- Factuur toevoegen met als bron=1 (Excel/bulk)
     UPDATE fin_factuur
     SET fin_factuur_statuses_key = c_factuur_statuses_key,
         fin_factuur_bron = 1,
         fin_factuur_opmerking = SUBSTR(l_opmerking , 1, 250),
         fin_factuur_totaal_btw = COALESCE(l_factuur_totaal_btw,0)
     WHERE fin_factuur_key = c_factuur_key;
  EXCEPTION
     WHEN OTHERS
     THEN NULL;
  END;


--- *** START VAN DE HOOFDPROCEDURE *** ---   --- *** START VAN DE HOOFDPROCEDURE *** ---    --- *** START VAN DE HOOFDPROCEDURE *** ---
BEGIN

  c_old_ordernr := '';
  c_old_factuurnr := '';


  -- Factuur(regels) stuk voor stuk op volgorde van opdracht en factuurnummer afwerken...
  FOR rc IN cfactuurregel
  LOOP
     -- Check: Nieuwe factuur, dwz eerste regel of overgang naar nieuw factuurnummer+opdrachtnr, of nog dezelfde
     IF (rc.ordernr = c_old_ordernr AND (rc.factuurnr = c_old_factuurnr OR (rc.factuurnr IS NULL AND c_old_factuurnr IS NULL)))
     THEN
        -- Hier dus nog dezelfde factuurnr+opdrachtnr
        -- Voeg alleen nieuwe factuurregel toe, indien de factuur kon worden toegevoegd (c_factuur_record_is_added = TRUE)
        IF c_factuur_record_is_added
        THEN
           -- Er is dus een bijbehorende correcte factuur(record) aangemaakt, dus volgende factuurregel kan erbij...
           -- Waarde van c_factuur_key EN c_btwtabel_key zijn nog steeds actueel...
           c_factuurregel := c_factuurregel + 1;
           c_btw_verlegd := try_getbtw_verlegd (rc.btw_verlegd);
           try_insert_factuurregel(c_factuur_key, c_factuurregel, rc.kostprijs,
                                   rc.btw, rc.btw_bedrag, c_btwtabel_key, rc.fac_import_key, rc.fac_imp_file_index,
                                   rc.omschrijving, rc.locatie, c_btw_verlegd,
                                   rc.artikelcode, rc.factuurregelaantal, rc.eenheid, rc.opdrachtregelid,
                                   c_factuur_statuses_key, c_opmerking, c_succeeded);
           IF c_succeeded
           THEN
              fac.imp_writelog (p_import_key,
                                'I',
                                'Factuur ' || c_factuur_key || ' toegevoegd met factuurregel ' || c_factuurregel,
                                rc.ordernr || ' / ' || rc.factuurnr
                                );
           ELSE
              oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
              v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
              fac.imp_writelog (p_import_key,
                              'E',
                              'Factuur(regel) kan niet toegevoegd worden ' || v_errormsg,
                              rc.ordernr || '/' || rc.factuurnr
                             );
           END IF;
        END IF;
     ELSE
        -- Nieuwe factuur, dwz eerste regel of overgang naar nieuw factuurnummer/opdrachtnr.

        -- Let op: van de vorige factuur nog de laatste nabewerking uitvoeren, nl. de status en de opmerking vullen...
        -- Als c_factuur_record_is_added is TRUE, dan is er al minimaal 1 fin_factuur record toegevoegd,
        -- anders (=FALSE) zijn we hier voor de eerste keer
        IF c_factuur_record_is_added
        THEN
           fin_factuur_finalupdate(c_factuur_key, c_opmerking,c_factuur_statuses_key);
           fin.autoapprovefactuur(c_factuur_key);
        END IF;

        c_factuur_statuses_key := 2;
        c_opmerking := rc.opmerking;
        c_old_ordernr := rc.ordernr;
        c_old_factuurnr := rc.factuurnr;
        c_factuurregel := 1;

        c_mld_opdr_key := NULL;
        c_cnt_contract_key := NULL;
        c_bes_bestelopdr_key := NULL;
        c_prs_perslid_key_user := NULL;
        c_fin_factuur_datum :=NULL;
        c_prs_kostensoort_key :=NULL;

        c_btw_verlegd := try_getbtw_verlegd (rc.btw_verlegd);
        get_fin_factuur_referentie (rc.ordernr, rc.leveranciernr, c_cnt_contract_key, c_mld_opdr_key, c_bes_bestelopdr_key);
        c_fin_factuur_datum:=try_getdatum (rc.factuurdatum, FALSE);
        c_prs_kostensoort_key:=try_getkostensoort(c_cnt_contract_key, c_mld_opdr_key, c_bes_bestelopdr_key);
        IF (c_prs_kostensoort_key IS NULL AND fac.getSetting('fin_kostensoort_verplicht') = 1)
        THEN
           c_opmerking := c_opmerking || CHR(13) || 'Kostensoort is verplicht maar leeg';
           c_factuur_statuses_key := 3; -- Incompleet
        END IF;

        IF (rc.factuurnr IS NULL)
        THEN
           c_opmerking := c_opmerking || CHR(13) || 'Onbekend factuurnr: is op ### gezet';
           c_factuur_nr := '###';
           c_factuur_statuses_key := 3; -- Incompleet
        ELSE
           c_factuur_nr := rc.factuurnr;
        END IF;

        IF (rc.boekmaand IS NOT NULL)
        THEN -- meegegeven, gebruik die
           IF fac.safe_to_date(rc.boekmaand, 'yyyy-mm') IS NULL
           THEN
              c_opmerking := c_opmerking || CHR(13) || 'Ongeldige boekmaand: ' || rc.boekmaand;
              c_boekmaand := '';
              c_factuur_statuses_key := 3; -- Incompleet
           ELSE
              c_boekmaand := rc.boekmaand;
           END IF;
        ELSE
           c_boekmaand := TO_CHAR(SYSDATE, 'YYYY-MM');
           IF ((fac.getSetting('fin_defaultboekmaand') IN (2, 3) AND c_mld_opdr_key IS NOT NULL) OR
               (fac.getSetting('fin_defaultboekmaand_cnt') = 2 AND c_cnt_contract_key IS NOT NULL))
           THEN
             BEGIN
                 c_boekmaand := TO_CHAR(try_getrefdatum(fac.getSetting('fin_defaultboekmaand'), fac.getSetting('fin_defaultboekmaand_cnt'), c_cnt_contract_key, c_mld_opdr_key, c_bes_bestelopdr_key, c_fin_factuur_datum), 'YYYY-MM');
             END;
           END IF;
        END IF;

        IF (c_cnt_contract_key IS NULL AND c_mld_opdr_key IS NULL AND c_bes_bestelopdr_key IS NULL)
        THEN
           c_opmerking := c_opmerking || CHR(13) || 'Referentienr: is niet gevonden ('|| rc.ordernr ||')';
           c_factuur_statuses_key := 3; -- Incompleet
        END IF;
        IF (c_fin_factuur_datum IS NULL)
        THEN
           BEGIN
              SELECT TRUNC(SYSDATE)
              INTO c_fin_factuur_datum
              FROM DUAL;
              c_opmerking := c_opmerking || CHR(13) || 'Factuurdatum: is op vandaag gezet.';
              c_factuur_statuses_key := 3; -- Incompleet
           EXCEPTION
           WHEN OTHERS
               THEN
                   c_fin_factuur_datum := NULL;
           END;
        END IF;

        c_factuur_record_is_added := FALSE;
        IF (LENGTH(c_factuur_nr) > 0 AND (c_fin_factuur_datum IS NOT NULL))
        THEN
           BEGIN
              SELECT   fin_s_fin_factuur_key.NEXTVAL INTO c_factuur_key FROM DUAL;

              SELECT   COALESCE(SUM (kostprijs),0) totaal, COALESCE(SUM (btw_bedrag),0) totaal_btw
              INTO   c_factuur_totaal, c_factuur_btw
              FROM   fac_imp_factuur
              WHERE   ordernr = rc.ordernr
              AND     factuurnr = rc.factuurnr
              AND     fac_import_key = p_import_key;

              INSERT INTO fin_factuur ( fin_factuur_key,
                                        fin_factuur_totaal,
                                        fin_factuur_totaal_btw,
                                        mld_opdr_key,
                                        cnt_contract_key,
                                        bes_bestelopdr_key,
                                        prs_perslid_key_user,
                                        fin_factuur_datum,
                                        fin_factuur_statuses_key,
                                        fin_factuur_nr,
                                        fin_factuur_debiteur_nr,
                                        prs_kostensoort_key,
                                        fin_factuur_boekmaand,
                                        fin_factuur_bron
                       )
              VALUES   (   c_factuur_key,
                           c_factuur_totaal,
                           c_factuur_btw,
                           c_mld_opdr_key,
                           c_cnt_contract_key,
                           c_bes_bestelopdr_key,
                           c_prs_perslid_key_user,
                           c_fin_factuur_datum,
                           c_factuur_statuses_key,
                           c_factuur_nr,
                           rc.debiteurnr,
                           c_prs_kostensoort_key,
                           c_boekmaand,
                           1       -- Excel
                      );
              c_factuur_record_is_added := TRUE;

              -- Voor CUST-postprocessing (van de kenmerken) is het handig te onthouden:
              UPDATE fac_imp_factuur
                 SET fin_factuur_key = c_factuur_key
               WHERE fac_import_key = rc.fac_import_key
                 AND fac_imp_file_index = rc.fac_imp_file_index
                 AND fac_import_key = p_import_key;

              try_insert_factuur_docid(c_factuur_key,rc.docid);

              c_btwtabel_key := fin.getbtwtabelkey(c_bes_bestelopdr_key,c_cnt_contract_key, c_mld_opdr_key, TRUE);
              try_insert_factuurregel(c_factuur_key, c_factuurregel, rc.kostprijs,
                                      rc.btw, rc.btw_bedrag, c_btwtabel_key, rc.fac_import_key, rc.fac_imp_file_index,
                                      rc.omschrijving, rc.locatie, c_btw_verlegd,
                                      rc.artikelcode, rc.factuurregelaantal, rc.eenheid, rc.opdrachtregelid,
                                      c_factuur_statuses_key, c_opmerking, c_succeeded);
              IF c_succeeded
              THEN
                 fac.imp_writelog (p_import_key,
                                   'I',
                                   'Factuur ' || c_factuur_key || ' toegevoegd met factuurregel ' || c_factuurregel,
                                   rc.ordernr || ' / ' || rc.factuurnr
                                   );
              ELSE
                 oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
                 v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
                 fac.imp_writelog (p_import_key,
                                 'E',
                                 'Factuur(regel) kan niet toegevoegd worden ' || v_errormsg,
                                 rc.ordernr || '/' || rc.factuurnr
                                );
              END IF;
           EXCEPTION
              WHEN OTHERS
              THEN
                 c_factuur_record_is_added := FALSE;

                 oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
                 v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
                 fac.imp_writelog (p_import_key,
                                 'E',
                                 'Factuur kan niet toegevoegd worden ' || v_errormsg,
                                 rc.ordernr || '/' || rc.factuurnr
                                );
           END;
        ELSE
           fac.imp_writelog (p_import_key,
                                 'E',
                                 'Factuur kan niet toegevoegd worden (factuurnummer onbekend) ',
                                 rc.ordernr || '/' || rc.factuurnr || ':' ||
                                 rc.leveranciernr || ',' ||
                                 rc.factuurdatum ||  ',' ||
                                 rc.kostprijs || ',' ||
                                 rc.btw || ',' ||
                                 rc.btw_bedrag || ',' ||
                                 rc.debiteurnr || ',' ||
                                 rc.locatie || ',' ||
                                 rc.afleverdatum || ',' ||
                                 rc.docid || ',' ||
                                 rc.omschrijving || ',' ||
                                 rc.opmerking || ',' ||
                                 rc.artikelcode || ',' ||
                                 rc.factuurregelaantal || ',' ||
                                 rc.eenheid || ',' ||
                                 rc.opdrachtregelid
                                );
        END IF;
     END IF;
  END LOOP;
  -- Let op: van de vorige (=LAATSTE) factuur nog de laatste nabewerking uitvoeren, nl. de status en de opmerking vullen...
  -- Als c_factuur_record_is_added is TRUE, dan is er al minimaal 1 fin_factuur record toegevoegd,
  -- anders (=FALSE) zijn we hier voor de eerste keer
  IF c_factuur_record_is_added
  THEN
     fin_factuur_finalupdate(c_factuur_key, c_opmerking, c_factuur_statuses_key);
     fin.autoapprovefactuur(c_factuur_key);
  END IF;

  -- Opruimen fac_imp_factuur gebeurt vanzelf na 7 dagen doordat achteraan
  -- imp_shared.js/impProcessStream de tabel fac_import wordt opgeruimd en
  -- fac_imp_factuur meecascadeert
END;
/

/* menu-import (transport), volgens UWVA#20707 */
CREATE OR REPLACE PROCEDURE fac_import_menu (p_import_key IN NUMBER
                                           )
AS
  CURSOR c1
  IS
       SELECT   *
         FROM   fac_imp_file
        WHERE   fac_import_key = p_import_key
     ORDER BY   fac_imp_file_index;

  v_newline VARCHAR2 (1000);                                                                             -- Import line
  v_field VARCHAR2 (100);                                                                               -- Import field
  v_fielddelimitor VARCHAR2 (2) := fac.import_delimiter(p_import_key);                                  -- Field seperator
  v_count_import NUMBER (10);
  v_count NUMBER;
  v_errormsg VARCHAR2 (200);
  v_errorhint VARCHAR2 (200);
  oracle_err_num NUMBER;
  oracle_err_mes VARCHAR2 (200);
  v_buffercount NUMBER := 0;
  c_commitbuffer NUMBER := 2000;                                                              -- om de zoveel committen
  -- De importvelden
  v_menu_volgnr VARCHAR2 (255);
  v_menuitems_label VARCHAR2 (255);
  v_menuitems_groep VARCHAR2 (255);
  v_menuitems_url VARCHAR2 (255);
  v_menu_info VARCHAR2 (255);
  v_menu_altlabel VARCHAR2 (255);
  v_menu_alturl VARCHAR2 (1000);
  v_menu_altgroep VARCHAR2 (255);
  v_functie_code VARCHAR2 (255);
  v_discipline_omschr VARCHAR2 (255);
  v_srtdiscipline_omschr VARCHAR2 (255);
  v_menu_image VARCHAR2 (255);
  v_menu_level VARCHAR2 (255);
  v_menu_portal VARCHAR2 (255);
  header_found BOOLEAN := FALSE;
BEGIN

  -- Clear my previous imported rows
  DELETE FROM   fac_imp_menu;

  v_count_import := 0;

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

        fac.imp_getfield (v_newline, v_fielddelimitor, v_menu_volgnr);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_menuitems_label);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_menuitems_groep);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_menuitems_url);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_menu_info);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_menu_altlabel);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_menu_alturl);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_menu_altgroep);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_functie_code);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_discipline_omschr);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_srtdiscipline_omschr);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_menu_image);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_menu_level);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_menu_portal);

        -- Skip until the header is found
        IF (header_found = FALSE)
        THEN
           IF     UPPER (v_menu_volgnr) = 'MENU_VOLGNR'
              AND UPPER (v_menuitems_label) = 'MENUITEMS_LABEL'
              AND UPPER (v_menuitems_groep) = 'MENUITEMS_GROEP'
              AND UPPER (v_menuitems_url) = 'MENUITEMS_URL'
              AND UPPER (v_menu_info) = 'MENU_INFO'
              AND UPPER (v_menu_altlabel) = 'MENU_ALTLABEL'
              AND UPPER (v_menu_alturl) = 'MENU_ALTURL'
              AND UPPER (v_menu_altgroep) = 'MENU_ALTGROEP'
              AND UPPER (v_functie_code) = 'FUNCTIE_CODE'
              AND UPPER (v_discipline_omschr) = 'DISCIPLINE_OMSCHR'
              AND UPPER (v_srtdiscipline_omschr) = 'SRTDISCIPLINE_OMSCHR'
              AND UPPER (v_menu_image) = 'MENU_IMAGE'
              AND UPPER (v_menu_level) = 'MENU_LEVEL'
              AND UPPER (v_menu_portal) = 'MENU_PORTAL'
           THEN
              header_found := TRUE;
           END IF;
        ELSE
           INSERT INTO fac_imp_menu (
                                        menu_volgnr,
                                        menuitems_label,
                                        menuitems_groep,
                                        menuitems_url,
                                        menu_info,
                                        menu_altlabel,
                                        menu_alturl,
                                        menu_altgroep,
                                        functie_code,
                                        discipline_omschr,
                                        srtdiscipline_omschr,
                                        menu_image,
                                        menu_level,
                                        menu_portal
                      )
             VALUES   (
                          SUBSTR (v_menu_volgnr, 1, 255),
                          SUBSTR (v_menuitems_label, 1, 255),
                          SUBSTR (v_menuitems_groep, 1, 255),
                          SUBSTR (v_menuitems_url, 1, 255),
                          SUBSTR (v_menu_info, 1, 255),
                          SUBSTR (v_menu_altlabel, 1, 255),
                          SUBSTR (v_menu_alturl, 1, 1000),
                          SUBSTR (v_menu_altgroep, 1, 255),
                          SUBSTR (v_functie_code, 1, 255),
                          SUBSTR (v_discipline_omschr, 1, 255),
                          SUBSTR (v_srtdiscipline_omschr, 1, 255),
                          SUBSTR (v_menu_image, 1, 255),
                          SUBSTR (v_menu_level, 1, 255),
                          SUBSTR (v_menu_portal, 1, 255)
                      );

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

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

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

CREATE OR REPLACE PROCEDURE fac_update_menu (p_import_key IN NUMBER)
AS
  CURSOR c_menu
  IS
     SELECT   * FROM fac_imp_menu;

  oracle_err_num NUMBER;
  oracle_err_mes VARCHAR2 (250);
  v_errormsg VARCHAR2 (1024);
  v_errorhint VARCHAR2 (1024);
  v_count NUMBER;
  v_menuitems_key NUMBER;
  v_functie_key NUMBER;
  v_discipline_key NUMBER;
  v_srtdiscipline_key NUMBER;
  currentversion fac_module.fac_module_version%TYPE;
  e_transport EXCEPTION;
BEGIN
  -- Init
  SELECT   MAX (fac_module_version) INTO currentversion FROM fac_module;

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

  -- Alle standaard-menuopties bestaan --> gaan met die banaan!
  v_errormsg := 'Verwijderen oude menu';

  --TODO: remove TEST
  DELETE FROM   fac_menu;

  -- Menu-items uit import één voor één toevoegen. Als we ergens onderweg een
  -- fout tegenkomen, doen we een rollback.
  FOR rec IN c_menu
  LOOP
     BEGIN
        v_errormsg := 'Volgend item';

        v_errorhint :=
              COALESCE (rec.menu_altgroep, rec.menuitems_groep)
           || '/'
           || rec.menu_volgnr
           || '/'
           || rec.menuitems_label
           || '/'
           || rec.menu_altlabel;

        v_menuitems_key := NULL;
        v_functie_key := NULL;
        v_discipline_key := NULL;
        v_srtdiscipline_key := NULL;

        -- Volgnummer is verplicht
        --TODO: Is dat wel zo?
        IF (rec.menu_volgnr IS NULL)
        THEN
           v_errormsg := 'volgnummer is verplicht!';
           --TODO: throw error
           RAISE e_transport;
        END IF;

        -- Als gerefereerd wordt naar een standaard-menuoptie, dan moet deze bestaan
        IF (rec.menuitems_label IS NOT NULL)
        THEN
           v_errormsg := 'Onbekende of dubbele standaard-menuoptie';

           --TODO: check of label bestaat
           SELECT   fac_menuitems_key
             INTO   v_menuitems_key
             FROM   fac_menuitems
            WHERE       fac_menuitems_label = rec.menuitems_label
                    AND fac_menuitems_groep = fac.safe_to_number (rec.menuitems_groep)
                    AND fac_menuitems_url = rec.menuitems_url;
        ELSE
           -- Als geen standaard-menuoptie gebruikt wordt, dan zijn onderstaande gegevens verplicht
           IF (rec.menu_altlabel IS NULL OR rec.menu_altgroep IS NULL)
           THEN
              v_errormsg := 'altlabel + groep zijn verplicht!';
              --TODO: throw error
              RAISE e_transport;
           END IF;
        END IF;

        -- Gebruikte functiecodes moeten bestaan
        IF (rec.functie_code IS NOT NULL)
        THEN
           v_errormsg := 'Onbekende of dubbele functiecode';

           --TODO: check of fac_functie_code bestaat
           SELECT   fac_functie_key
             INTO   v_functie_key
             FROM   fac_functie
            WHERE   fac_functie_code = rec.functie_code;
        END IF;

        -- Als alles ok is, voegen we het menu-item toe.
        INSERT INTO fac_menu (
                                 fac_menu_volgnr,
                                 fac_menuitems_key,
                                 fac_menu_info,
                                 fac_menu_altlabel,
                                 fac_menu_alturl,
                                 fac_menu_altgroep,
                                 fac_functie_key,
                                 ins_discipline_key,
                                 ins_srtdiscipline_key,
                                 fac_menu_image,
                                 fac_menu_level,
                                 fac_menu_portal
                   )
          VALUES   (
                       rec.menu_volgnr,
                       v_menuitems_key,
                       rec.menu_info,
                       rec.menu_altlabel,
                       rec.menu_alturl,
                       rec.menu_altgroep,
                       v_functie_key,
                       v_discipline_key,
                       v_srtdiscipline_key,
                       rec.menu_image,
                       rec.menu_level,
                       rec.menu_portal
                   );
     END;
  END LOOP;

  -- Als we hier uitkomen, is alles goed gegaan en kunnen we committen
  COMMIT;
-- Als er ergens een fout optreedt, dan worden alle voorgaande mutaties teruggedraaid en wordt er alleen de logging gecommit
EXCEPTION
  WHEN OTHERS
  THEN
     -- TODO: Zoiets?
     ROLLBACK;
     oracle_err_num := SQLCODE;
     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
     v_errorhint := v_errorhint || ' {' || v_errormsg || '}';
     v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
     fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
     COMMIT;
END;
/

CREATE OR REPLACE PROCEDURE fac_import_usrdata (p_import_key IN NUMBER)
IS
  c_delim                       VARCHAR2 (2) := fac.import_delimiter(p_import_key);
  v_newline                     fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
  v_errormsg                    VARCHAR2 (1000);
  oracle_err_num                NUMBER;
  oracle_err_mes                VARCHAR2 (200);
  header_is_valid               NUMBER;
  v_count_tot                   NUMBER (10);
  v_count_import                NUMBER (10);
  v_ongeldig                    NUMBER (1);
  v_aanduiding                  VARCHAR (200);
  -- De importvelden:
  v_fac_usrtab_naam             VARCHAR2 (256);                        -- C16
  v_fac_usrdata_code            VARCHAR2 (256);                        -- C40
  v_fac_usrdata_omschr          VARCHAR2 (256);                        -- C60
  v_fac_usrdata_volgnr          VARCHAR2 (256);                        -- N3
  v_fac_usrdata_prijs           VARCHAR2 (256);                        -- N8,2
  v_fac_usrdata_vervaldatum     VARCHAR2 (256);                        -- DATE
  v_fac_usrdata_reftabel        VARCHAR2 (256);                        -- C16
  v_fac_usrdata_refcode         VARCHAR2 (256);                        -- C40
  -- Overig:
  v_fac_usrdata_volgnr_n        fac_imp_usrdata.fac_usrdata_volgnr%TYPE;      -- N3
  v_fac_usrdata_prijs_n         fac_imp_usrdata.fac_usrdata_prijs%TYPE;       -- N15,7
  v_fac_usrdata_vervaldatum_d   fac_imp_usrdata.fac_usrdata_vervaldatum%TYPE; -- DATE

  CURSOR c1
  IS
       SELECT   *
         FROM   fac_imp_file
        WHERE   fac_import_key = p_import_key
     ORDER BY   fac_imp_file_index;
BEGIN
  DELETE FROM   fac_imp_usrdata;

  v_count_tot := 0;
  v_count_import := 0;
  header_is_valid := 0;
  COMMIT;

  FOR rec1 IN c1
  LOOP
     BEGIN
        v_newline := rec1.fac_imp_file_line;
        v_errormsg := 'Fout bij opvragen importregel';
        v_aanduiding := '';
        v_ongeldig := 0;
        -- Lees alle veldwaarden
        fac.imp_getfield (v_newline, c_delim, v_fac_usrtab_naam);
        fac.imp_getfield (v_newline, c_delim, v_fac_usrdata_code);
        fac.imp_getfield (v_newline, c_delim, v_fac_usrdata_omschr);
        fac.imp_getfield (v_newline, c_delim, v_fac_usrdata_volgnr);
        fac.imp_getfield (v_newline, c_delim, v_fac_usrdata_prijs);
        fac.imp_getfield (v_newline, c_delim, v_fac_usrdata_vervaldatum);
        fac.imp_getfield (v_newline, c_delim, v_fac_usrdata_reftabel);
        fac.imp_getfield (v_newline, c_delim, v_fac_usrdata_refcode);
        v_aanduiding :=
           '[' || v_fac_usrtab_naam || '|' || v_fac_usrdata_code || '] ';

        -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
        -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
        -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
        IF (header_is_valid = 0)
        THEN
           IF     UPPER (v_fac_usrtab_naam) = 'TABELNAAM'
              AND UPPER (v_fac_usrdata_code) = 'WAARDE_CODE'
              AND UPPER (v_fac_usrdata_omschr) = 'WAARDE_OMS'
              AND UPPER (v_fac_usrdata_volgnr) = 'VOLGNR'
              AND UPPER (v_fac_usrdata_prijs) = 'PRIJS'
              AND UPPER (v_fac_usrdata_vervaldatum) = 'VERVALDATUM'
              AND UPPER (v_fac_usrdata_reftabel) = 'WAARDETABEL'
              AND UPPER (v_fac_usrdata_refcode) = 'WAARDETABEL_CODE'
           THEN
              header_is_valid := 1;
           END IF;
        ELSE
           v_count_tot := v_count_tot + 1;
           -- Controleer alle veldwaarden
           v_errormsg := 'Tabelnaam ongeldig; ongedefinieerd of te lang';
           v_fac_usrtab_naam := TRIM (v_fac_usrtab_naam);

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

           --
           v_errormsg := 'Waarde-code ongeldig; ongedefinieerd of te lang';
           v_fac_usrdata_code := TRIM (v_fac_usrdata_code);

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

           --
           v_errormsg := 'Waarde-omschrijving te lang';
           v_fac_usrdata_omschr := TRIM (v_fac_usrdata_omschr);

           IF LENGTH (v_fac_usrdata_omschr) > 60
           THEN
              v_fac_usrdata_omschr :=
                 SUBSTR (TRIM (v_fac_usrdata_omschr), 1, 60);
              fac.imp_writelog (
                 p_import_key,
                 'W',
                 v_aanduiding || v_errormsg,
                    'Waarde-omschrijving wordt afgebroken tot ['
                 || v_fac_usrdata_omschr
                 || ']'
              );
           END IF;

           --
           v_errormsg := 'Volgnummer ongeldig; maximale grootte 999';
           v_fac_usrdata_volgnr := TRIM (v_fac_usrdata_volgnr);
           v_fac_usrdata_volgnr_n := NULL;

           IF (v_fac_usrdata_volgnr IS NOT NULL)
           THEN
              IF (fac.safe_to_number (v_fac_usrdata_volgnr) IS NULL)
              THEN
                 v_ongeldig := 1;
                 fac.imp_writelog (p_import_key,
                                   'W',
                                   v_aanduiding || v_errormsg,
                                   'Regel wordt overgeslagen!');
              ELSE
                 v_fac_usrdata_volgnr_n :=
                    fac.safe_to_number (v_fac_usrdata_volgnr);
              END IF;
           END IF;

           --
           v_errormsg := 'Prijs ongeldig; maximale grootte 999999.99';
           v_fac_usrdata_prijs := TRIM (v_fac_usrdata_prijs);
           v_fac_usrdata_prijs_n := NULL;

           IF (v_fac_usrdata_prijs IS NOT NULL)
           THEN
              IF (fac.safe_to_number (v_fac_usrdata_prijs) IS NULL)
              THEN
                 v_ongeldig := 1;
                 fac.imp_writelog (p_import_key,
                                   'W',
                                   v_aanduiding || v_errormsg,
                                   'Regel wordt overgeslagen!');
              ELSE
                 v_fac_usrdata_prijs_n :=
                    fac.safe_to_number (v_fac_usrdata_prijs);
              END IF;
           END IF;

           --
           v_errormsg := 'Vervaldatum ongeldig';
           v_fac_usrdata_vervaldatum := TRIM (v_fac_usrdata_vervaldatum);
           v_fac_usrdata_vervaldatum_d := NULL;

           IF (v_fac_usrdata_vervaldatum IS NOT NULL)
           THEN
              IF (fac.safe_to_date (v_fac_usrdata_vervaldatum, 'dd-mm-yyyy') IS NULL)
              THEN
                 v_ongeldig := 1;
                 fac.imp_writelog (p_import_key,
                                   'W',
                                   v_aanduiding || v_errormsg,
                                   'Regel wordt overgeslagen!');
              ELSE
                 v_fac_usrdata_vervaldatum_d :=
                    fac.safe_to_date (v_fac_usrdata_vervaldatum,
                                      'dd-mm-yyyy');
              END IF;
           END IF;

           --
           v_errormsg := 'Waardetabelnaam ongeldig; ongedefinieerd of te lang';
           v_fac_usrdata_reftabel := TRIM (v_fac_usrdata_reftabel);

           IF LENGTH (v_fac_usrdata_reftabel) > 16
           THEN
              v_ongeldig := 1;
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Regel wordt overgeslagen!');
           END IF;

           --
           v_errormsg := 'Waardetabelcode ongeldig; ongedefinieerd of te lang';
           v_fac_usrdata_refcode := TRIM(v_fac_usrdata_refcode);

           IF (  (v_fac_usrdata_reftabel IS NULL AND v_fac_usrdata_refcode IS NOT NULL)
              OR (v_fac_usrdata_reftabel IS NOT NULL AND v_fac_usrdata_refcode IS NULL)
              OR COALESCE(LENGTH (v_fac_usrdata_refcode),0) > 40
              )
           THEN
              v_ongeldig := 1;
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Regel wordt overgeslagen!');
           END IF;

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

                 INSERT INTO fac_imp_usrdata (fac_usrtab_naam,
                                              fac_usrdata_code,
                                              fac_usrdata_omschr,
                                              fac_usrdata_volgnr,
                                              fac_usrdata_prijs,
                                              fac_usrdata_vervaldatum,
                                              fac_usrdata_reftabel,
                                              fac_usrdata_refcode)
                   VALUES   (v_fac_usrtab_naam,
                             v_fac_usrdata_code,
                             v_fac_usrdata_omschr,
                             v_fac_usrdata_volgnr_n,
                             v_fac_usrdata_prijs_n,
                             v_fac_usrdata_vervaldatum_d,
                             v_fac_usrdata_reftabel,
                             v_fac_usrdata_refcode);

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

              COMMIT;
           END IF;
        END IF;
     END;
  END LOOP;

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

  COMMIT;
EXCEPTION
  WHEN OTHERS
  THEN
     oracle_err_num := SQLCODE;
     oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
     v_errormsg :=
           v_errormsg
        || ' ORACLE (error '
        || oracle_err_num
        || '/'
        || oracle_err_mes
        || ')';
     fac.imp_writelog (p_import_key,
                       'E',
                       v_aanduiding || v_errormsg,
                       'Inleesproces eigen tabellen afgebroken!');
END fac_import_usrdata;
/

CREATE OR REPLACE PROCEDURE fac_update_usrdata (p_import_key IN NUMBER)
AS
  -- Cursor loopt over de voorkomende (unieke) tabelnamen.
  CURSOR c1
  IS
     SELECT   DISTINCT fac_usrtab_naam FROM fac_imp_usrdata;

  v_errormsg       VARCHAR2 (1000) := '';
  oracle_err_num   NUMBER;
  oracle_err_mes   VARCHAR2 (200);

  -- SUBPROC
  PROCEDURE add_tabel (p_import_key IN NUMBER,
                       p_tabname    IN VARCHAR2)
  AS
     CURSOR c1
     IS
        SELECT   fac_usrtab_naam,
                 fac_usrdata_code,
                 fac_usrdata_omschr,
                 fac_usrdata_volgnr,
                 fac_usrdata_prijs,
                 fac_usrdata_vervaldatum,
                 fac_usrdata_reftabel,
                 fac_usrdata_refcode
          FROM   fac_imp_usrdata
         WHERE   fac_usrtab_naam = p_tabname;

     v_errormsg       VARCHAR2 (1000);
     oracle_err_num   NUMBER;
     oracle_err_mes   VARCHAR2 (200);
     v_count          NUMBER (10);
     v_count_tot      NUMBER (10);
     v_count_upd      NUMBER (10);
     v_tab_key        NUMBER;
     v_parentkey      NUMBER;
     v_parentwaarde_key  NUMBER(10);
     v_waardetabel_naam  VARCHAR2(16);
     v_waardetabel_key   NUMBER(10) := -2;
     v_count_waardetabel NUMBER(10);
  BEGIN
     v_count_tot := 0;
     v_count_upd := 0;

     -- Bepaal de key bij waardetabel.
     SELECT COUNT(*)
          , MIN(fac_usrdata_reftabel)
       INTO v_count_waardetabel
          , v_waardetabel_naam
       FROM (SELECT DISTINCT fac_usrdata_reftabel
               FROM fac_imp_usrdata
              WHERE fac_usrtab_naam = p_tabname
            );
     IF (v_count_waardetabel = 1)
     THEN
        IF (v_waardetabel_naam IS NULL)
        THEN
            v_waardetabel_key := NULL;
        ElSE
            SELECT COALESCE(MIN(fac_usrtab_key), -1)
              INTO v_waardetabel_key
              FROM fac_usrtab
             WHERE fac_usrtab_naam = v_waardetabel_naam;
        END IF;
     END IF;
     -- v_waardetabel_key: NULL -> usrtab_parentkey NULL
     --                    >0   -> usrtab_parentkey
     --                    -1   -> tabel bestaat niet
     --                    -2   -> voor p_tabname zijn meer dan 1 verschillende parent keys gevonden

     v_errormsg := 'Fout bij bepalen eigen tabel [' || p_tabname || '] ';

     SELECT   COUNT(*)
          ,   MIN(fac_usrtab_key)
          ,   MIN(fac_usrtab_parentkey)
       INTO   v_count
          ,   v_tab_key
          ,   v_parentkey
       FROM   fac_usrtab
      WHERE   fac_usrtab_verwijder IS NULL
        AND   fac_usrtab_naam = p_tabname;

     IF (v_count = 0)
     THEN
        v_errormsg := 'Fout bij toevoegen eigen tabel [' || p_tabname || '] '
                   || CASE WHEN v_waardetabel_key IS NULL THEN ''
                           ELSE 'met waardetabelkey=' || v_waardetabel_key
                      END;

        INSERT INTO fac_usrtab (fac_usrtab_naam, fac_usrtab_omschrijving, fac_usrtab_parentkey)
        VALUES      (p_tabname, p_tabname, v_waardetabel_key)
        RETURNING   fac_usrtab_key INTO v_tab_key;

        v_parentkey := v_waardetabel_key;
        COMMIT;
     END IF;

     -- Voor een bestaande fac_usrtab moet de parentkey gelijk zijn aan v_waardetabel_key.
     IF ((v_parentkey = v_waardetabel_key) OR (v_parentkey IS NULL AND v_waardetabel_key IS NULL))
     THEN
        BEGIN
            FOR rec IN c1
            LOOP
               BEGIN
                  v_count_tot := v_count_tot + 1;

                  -- Als er een referentietabel is moet de waarde in die tabel bestaan.
                  IF (v_parentkey > 0)
                  THEN
                     v_errormsg := 'Fout bij bepalen bestaan waardetabel_code ['
                                || v_waardetabel_naam || '.' || rec.fac_usrdata_refcode
                                || '] ' || TO_CHAR(v_parentkey) || ',' || rec.fac_usrdata_refcode;
                     SELECT fac_usrdata_key
                       INTO v_parentwaarde_key
                       FROM fac_usrdata
                      WHERE fac_usrtab_key = v_parentkey
                        AND fac_usrdata_code = rec.fac_usrdata_refcode;
                  END IF;

                  -- Toevoegen/wijzigen van tabelwaarde.
                  v_errormsg :=
                        'Fout bij bepalen bestaan waarde-code ['
                     || rec.fac_usrdata_code
                     || '] ';

                  SELECT   COUNT ( * )
                    INTO   v_count
                    FROM   fac_usrdata
                   WHERE   fac_usrdata_verwijder IS NULL
                           AND fac_usrtab_key = v_tab_key
                           AND fac_usrdata_code = rec.fac_usrdata_code;

                  IF (v_count = 0)
                  THEN
                     v_errormsg :=
                           'Fout bij toevoegen waarde-code ['
                        || rec.fac_usrdata_code
                        || '] ';

                     INSERT INTO fac_usrdata (fac_usrtab_key,
                                              fac_usrdata_code,
                                              fac_usrdata_omschr,
                                              fac_usrdata_volgnr,
                                              fac_usrdata_vervaldatum,
                                              fac_usrdata_prijs,
                                              fac_usrdata_parentkey
                                              )
                       VALUES   (v_tab_key,
                                 rec.fac_usrdata_code,
                                 rec.fac_usrdata_omschr,
                                 rec.fac_usrdata_volgnr,
                                 rec.fac_usrdata_vervaldatum,
                                 rec.fac_usrdata_prijs,
                                 v_parentwaarde_key);
                  ELSE
                     v_errormsg :=
                           'Fout bij bijwerken waarde-code ['
                        || rec.fac_usrdata_code
                        || '] ';

                     UPDATE   fac_usrdata
                        SET   fac_usrdata_omschr = rec.fac_usrdata_omschr,
                              fac_usrdata_volgnr = rec.fac_usrdata_volgnr,
                              fac_usrdata_vervaldatum = rec.fac_usrdata_vervaldatum,
                              fac_usrdata_prijs = rec.fac_usrdata_prijs,
                              fac_usrdata_parentkey = v_parentwaarde_key
                      WHERE   fac_usrdata_verwijder IS NULL
                              AND fac_usrtab_key = v_tab_key
                              AND fac_usrdata_code = rec.fac_usrdata_code;
                  END IF;

                  COMMIT;

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

            fac.imp_writelog (
               p_import_key,
               'S',
               p_tabname || ': #ingelezen = ' || TO_CHAR (v_count_tot),
               ''
            );
            fac.imp_writelog (
               p_import_key,
               'S',
               p_tabname || ': #toegevoegd/bijgewerkt = ' || TO_CHAR (v_count_upd),
               ''
            );
            COMMIT;
        END;
     ELSE
        fac.imp_writelog (
          p_import_key,
          'E',
          p_tabname || ': waardetabel [' || v_waardetabel_naam || '] komt niet overeen met parentkey',
          ''
        );
        COMMIT;
     END IF;
  END;
-- MAIN
BEGIN
  -- Loop door de voorkomende (unieke) tabelnamen en voeg deze toe en/of werk
  -- deze bij.
  FOR rec IN c1
  LOOP
     BEGIN
        add_tabel (p_import_key, rec.fac_usrtab_naam);
     END;
  END LOOP;
EXCEPTION
  WHEN OTHERS
  THEN
     oracle_err_num := SQLCODE;
     oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
     v_errormsg :=
           v_errormsg
        || 'ORACLE (error '
        || oracle_err_num
        || '/'
        || oracle_err_mes
        || ')';
     fac.imp_writelog (p_import_key,
                       'E',
                       v_errormsg,
                       'Importproces eigen tabellen afgebroken!');
END fac_update_usrdata;
/

--// FLEX
-- kenmerken-import (transport), volgens UWVA#20708
-- UWVA#32742:  flexkenmerken transport voor objecten
CREATE OR REPLACE PROCEDURE fac_import_flex (p_import_key IN NUMBER
                                           )
IS
  CURSOR c1
  IS
       SELECT   *
         FROM   fac_imp_file
        WHERE   fac_import_key = p_import_key
     ORDER BY   fac_imp_file_index;

  v_newline        VARCHAR2 (10000);              -- Import line
  v_field          VARCHAR2 (100);                -- Import field
  v_fielddelimitor VARCHAR2 (2) := fac.import_delimiter(p_import_key);  -- Field seperator
  v_count_import   NUMBER (10);
  v_count          NUMBER;
  v_errormsg       VARCHAR2 (200);
  v_errorhint      VARCHAR2 (200);
  oracle_err_num   NUMBER;
  oracle_err_mes   VARCHAR2 (200);
  -- De importvelden
  v_fac_kenmerkdomein_omschr     VARCHAR2 (300);
  v_fac_kenmerkdomein_objectnaam VARCHAR2 (300);
  v_fac_kenmerkdomein_kolomnaam  VARCHAR2 (300);
  v_fac_kenmerkdomein_kolomtxt   VARCHAR2 (300);
  v_fac_usrtab_naam              VARCHAR2 (300);
  v_srtkenmerk_omschrijving      VARCHAR2 (300);
  v_srtkenmerk_kenmerktype       VARCHAR2 (300);
  v_srtkenmerk_systeem           VARCHAR2 (300);
  v_srtkenmerk_lengte            VARCHAR2 (300);
  v_srtkenmerk_dec               VARCHAR2 (300);
  v_srtkenmerk_nmin              VARCHAR2 (300);
  v_srtkenmerk_nmax              VARCHAR2 (300);
  v_srtkenmerk_dimensie          VARCHAR2 (300);
  v_srtkenmerk_code              VARCHAR2 (300);
  v_kenmerk_type                 VARCHAR2 (300);
  v_kenmerk_niveau               VARCHAR2 (300);
  v_kenmerk_verplicht            VARCHAR2 (300);
  v_kenmerk_groep                VARCHAR2 (300);
  v_kenmerk_volgnummer           VARCHAR2 (300);
  v_kenmerk_default              VARCHAR2 (4000);
  v_kenmerk_toonbaar             VARCHAR2 (300);
  v_kenmerk_uniek                VARCHAR2 (300);
  v_kenmerk_hint                 VARCHAR2 (300);
  v_kenmerk_regexp               VARCHAR2 (300);
  v_kenmerk_show_expr            VARCHAR2 (4000);
  v_kenmerk_omschr               VARCHAR2 (300);
  v_kenmerk_verwijder            VARCHAR2 (300);
  v_kenmerk_code                 VARCHAR2 (300);
  v_deflevel1                    VARCHAR2 (300);  /* res_srtactiviteit, mld_srtdiscipline, bes_discipline of cnt_discipline */
  v_deflevel2                    VARCHAR2 (300);  /* res_activiteit, mld_discipline, bes_srtgroep of niks */
  v_deflevel3                    VARCHAR2 (300);  /* niks, mld_stdmelding, bes_srtdeel of niks */
  v_deflevel4                    VARCHAR2 (300);  /* niks, mld_typeopdr, niks of niks */
  v_kenmerk_extra_1              VARCHAR2 (300);  /* extra kolommen voor kenmerk die niet in elke module voorkomen */
  v_kenmerk_extra_2              VARCHAR2 (300);  /* check wel of dit veld groot genoeg is voor het betreffende kenmerk */
  v_kenmerk_extra_3              VARCHAR2 (300);  /* als er een extra kenmerk wordt gebruikt moeten deflevel1 t/m 4 bestaan, desnoods als null-value  */
  v_kenmerk_extra_4              VARCHAR2 (300);
  flexmodule                     VARCHAR2 (3);
  v_res_srtactiviteit            VARCHAR2 (300);
  v_res_activiteit               VARCHAR2 (300);
  v_mld_srtdiscipline            VARCHAR2 (300);
  v_mld_discipline               VARCHAR2 (300);
  v_mld_stdmelding               VARCHAR2 (300);
  v_mld_typeopdr                 VARCHAR2 (300);
  v_bes_discipline               VARCHAR2 (300);
  v_bes_srtgroep                 VARCHAR2 (300);
  v_bes_srtdeel                  VARCHAR2 (300);
  v_cnt_discipline               VARCHAR2 (300);
  v_ins_discipline               VARCHAR2 (300);
  v_ins_srtgroep                 VARCHAR2 (300);
  v_ins_srtdeel                  VARCHAR2 (300);

  header_found BOOLEAN := FALSE;
BEGIN

  -- Clear my previous imported rows
  DELETE FROM   fac_imp_flex;

  v_count_import := 0;

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

        fac.imp_getfield (v_newline, v_fielddelimitor, v_fac_kenmerkdomein_omschr);      --1
        fac.imp_getfield (v_newline, v_fielddelimitor, v_fac_kenmerkdomein_objectnaam);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_fac_kenmerkdomein_kolomnaam);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_fac_kenmerkdomein_kolomtxt);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_fac_usrtab_naam);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_srtkenmerk_code);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_srtkenmerk_omschrijving);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_srtkenmerk_kenmerktype);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_srtkenmerk_systeem);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_srtkenmerk_lengte);    -- 10
        fac.imp_getfield (v_newline, v_fielddelimitor, v_srtkenmerk_dec);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_srtkenmerk_nmin);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_srtkenmerk_nmax);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_srtkenmerk_dimensie);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk_type);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk_niveau);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk_verplicht);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk_groep);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk_volgnummer);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk_default);      -- 20
        fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk_toonbaar);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk_uniek);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk_hint);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk_regexp);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk_show_expr);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk_code);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk_omschr);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk_verwijder);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_deflevel1);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_deflevel2);            -- 30
        fac.imp_getfield (v_newline, v_fielddelimitor, v_deflevel3);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_deflevel4);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk_extra_1);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk_extra_2);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk_extra_3);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk_extra_4);      -- 36

        -- Skip until the header is found
        IF (header_found = FALSE)
        THEN
           IF     UPPER (v_fac_kenmerkdomein_omschr) = 'FAC_KENMERKDOMEIN_OMSCHRIJVING'
              AND UPPER (v_fac_kenmerkdomein_objectnaam) = 'FAC_KENMERKDOMEIN_OBJECTNAAM'
              AND UPPER (v_fac_kenmerkdomein_kolomnaam) = 'FAC_KENMERKDOMEIN_KOLOMNAAM'
              AND UPPER (v_fac_kenmerkdomein_kolomtxt) = 'FAC_KENMERKDOMEIN_KOLOMTXT'
              AND UPPER (v_fac_usrtab_naam) = 'FAC_USRTAB_NAAM'
              AND UPPER (v_srtkenmerk_code) = 'SRTKENMERK_CODE'
              AND UPPER (v_srtkenmerk_omschrijving) = 'SRTKENMERK_OMSCHRIJVING'
              AND UPPER (v_srtkenmerk_kenmerktype) = 'SRTKENMERK_KENMERKTYPE'
              AND UPPER (v_srtkenmerk_systeem) = 'SRTKENMERK_SYSTEEM'
              AND UPPER (v_srtkenmerk_lengte) = 'SRTKENMERK_LENGTE'
              AND UPPER (v_srtkenmerk_dec) = 'SRTKENMERK_DEC'
              AND UPPER (v_srtkenmerk_nmin) = 'SRTKENMERK_NMIN'
              AND UPPER (v_srtkenmerk_nmax) = 'SRTKENMERK_NMAX'
              AND UPPER (v_srtkenmerk_dimensie) = 'SRTKENMERK_DIMENSIE'
              AND UPPER (v_kenmerk_type) = 'KENMERK_TYPE'
              AND UPPER (v_kenmerk_niveau) = 'KENMERK_NIVEAU'
              AND UPPER (v_kenmerk_verplicht) = 'KENMERK_VERPLICHT'
              AND UPPER (v_kenmerk_groep) = 'KENMERK_GROEP'
              AND UPPER (v_kenmerk_volgnummer) = 'KENMERK_VOLGNUMMER'
              AND UPPER (v_kenmerk_default) = 'KENMERK_DEFAULT'
              AND UPPER (v_kenmerk_toonbaar) = 'KENMERK_TOONBAAR'
              AND UPPER (v_kenmerk_uniek) = 'KENMERK_UNIEK'
              AND UPPER (v_kenmerk_hint) = 'KENMERK_HINT'
              AND UPPER (v_kenmerk_regexp) = 'KENMERK_REGEXP'
              AND UPPER (v_kenmerk_show_expr) = 'KENMERK_SHOW_EXPR'
              AND UPPER (v_kenmerk_code) = 'KENMERK_CODE'
              AND UPPER (v_kenmerk_omschr) = 'KENMERK_OMSCHR'
              AND UPPER (v_kenmerk_verwijder) = 'KENMERK_VERWIJDER'
           THEN
              header_found := TRUE;
              -- Wat voor een header is het?
              IF    UPPER (v_deflevel1) = 'ACTIVITEITSOORT'
                AND UPPER (v_deflevel2) = 'ACTIVITEIT'
              THEN
                   flexmodule := 'RES';
              ELSIF UPPER (v_deflevel1) = 'CATALOGUS'
                AND UPPER (v_deflevel2) = 'GROEP'
                AND UPPER (v_deflevel3) = 'ARTIKEL'
              THEN
                   flexmodule := 'BES';
              ELSIF UPPER (v_deflevel1) = 'VAKGROEPTYPE'
                AND UPPER (v_deflevel2) = 'VAKGROEP'
                AND UPPER (v_deflevel3) = 'MELDING'
                AND UPPER (v_deflevel4) = 'OPDRACHTTYPE'
              THEN
                   flexmodule := 'MLD';
              ELSIF UPPER (v_deflevel1) = 'CONTRACTSOORT'
              THEN
                   flexmodule := 'CNT';
              ELSIF UPPER (v_deflevel1) = 'DISCIPLINE'
                AND UPPER (v_deflevel2) = 'GROEP'
                AND UPPER (v_deflevel3) = 'OBJECTSOORT'
              THEN
                   flexmodule := 'INS';
              ELSIF UPPER (v_deflevel1) = 'FACTUUR'
              THEN
                   flexmodule := 'FIN';
              END IF;
           END IF;
        ELSE
           IF flexmodule = 'RES'
           THEN
                  v_res_srtactiviteit := v_deflevel1;
                  v_res_activiteit := v_deflevel2;
           ELSIF flexmodule = 'BES'
           THEN
                  v_bes_discipline := v_deflevel1;
                  v_bes_srtgroep := v_deflevel2;
                  v_bes_srtdeel := v_deflevel3;
           ELSIF flexmodule = 'MLD'
           THEN
                  v_mld_srtdiscipline := v_deflevel1;
                  v_mld_discipline := v_deflevel2;
                  v_mld_stdmelding := v_deflevel3;
                  v_mld_typeopdr := v_deflevel4;
           ELSIF flexmodule = 'CNT'
           THEN
                  v_cnt_discipline := v_deflevel1;
           ELSIF flexmodule = 'INS'
           THEN
                  -- Hieronder staat telkens de splisting van kenmerk: of op discipline/groep/objectsoort of op inspectiekenmerk.
                  -- In de update-procedure wordt deze splitsing bepaald door kenmerk_niveau (D = deel, C = controle)

                  -- Discipline of (voor inspectiekenmerken) een dummy Tekst voor ctr_controle_type (1,2,3), iets als inspectie controle, - vervanging, - certificering
                  v_ins_discipline := v_deflevel1;
                  -- Groep binnen de discipline, of (voor inspectiekenmerken) de omschrijving van de soortcontrole (ins_srtcontrole_omschrijving)
                  v_ins_srtgroep   := v_deflevel2;
                  -- Objectsoort, of (voor inspectiekenmerken) de (tekst)waarde '1', '2' of '3' (ctr_controle_type).
                  v_ins_srtdeel    := v_deflevel3;
           END IF;

           INSERT INTO fac_imp_flex (
                                            fac_kenmerkdomein_omschrijving,  -- 1
                                            fac_kenmerkdomein_objectnaam,
                                            fac_kenmerkdomein_kolomnaam,
                                            fac_kenmerkdomein_kolomtxt,
                                            fac_usrtab_naam,
                                            srtkenmerk_code,
                                            srtkenmerk_omschrijving,
                                            srtkenmerk_kenmerktype,
                                            srtkenmerk_systeem,
                                            srtkenmerk_lengte,               -- 10
                                            srtkenmerk_dec,
                                            srtkenmerk_nmin,
                                            srtkenmerk_nmax,
                                            srtkenmerk_dimensie,
                                            kenmerk_niveau,
                                            kenmerk_verplicht,
                                            kenmerk_groep,
                                            kenmerk_volgnummer,
                                            kenmerk_default,
                                            kenmerk_type,                    -- 20
                                            kenmerk_toonbaar,
                                            kenmerk_uniek,
                                            kenmerk_hint,
                                            kenmerk_regexp,
                                            kenmerk_show_expr,
                                            kenmerk_code,
                                            kenmerk_omschr,
                                            kenmerk_verwijder,
                                            kenmerk_extra_1,
                                            kenmerk_extra_2,                 -- 30
                                            kenmerk_extra_3,
                                            kenmerk_extra_4,
                                            res_srtactiviteit,
                                            res_activiteit,
                                            mld_srtdiscipline,
                                            mld_discipline,
                                            mld_stdmelding,
                                            mld_typeopdr,
                                            bes_discipline,
                                            bes_srtgroep,                    -- 40
                                            bes_srtdeel,
                                            cnt_discipline,
                                            ins_discipline,
                                            ins_srtgroep,
                                            ins_srtdeel,                     -- 45
                                            kenmerk_module
                      )
             VALUES   (
                          SUBSTR (v_fac_kenmerkdomein_omschr, 1, 255),       -- 1
                          SUBSTR (v_fac_kenmerkdomein_objectnaam, 1, 255),
                          SUBSTR (v_fac_kenmerkdomein_kolomnaam, 1, 255),
                          SUBSTR (v_fac_kenmerkdomein_kolomtxt, 1, 255),
                          SUBSTR (v_fac_usrtab_naam, 1, 255),
                          SUBSTR (v_srtkenmerk_code, 1, 255),
                          SUBSTR (v_srtkenmerk_omschrijving, 1, 255),
                          SUBSTR (v_srtkenmerk_kenmerktype, 1, 255),
                          SUBSTR (v_srtkenmerk_systeem, 1, 255),
                          SUBSTR (v_srtkenmerk_lengte, 1, 255),              -- 10
                          SUBSTR (v_srtkenmerk_dec, 1, 255),
                          SUBSTR (v_srtkenmerk_nmin, 1, 255),
                          SUBSTR (v_srtkenmerk_nmax, 1, 255),
                          SUBSTR (v_srtkenmerk_dimensie, 1, 255),
                          SUBSTR (v_kenmerk_niveau, 1, 255),
                          SUBSTR (v_kenmerk_verplicht, 1, 255),
                          SUBSTR (v_kenmerk_groep, 1, 255),
                          SUBSTR (v_kenmerk_volgnummer, 1, 255),
                          SUBSTR (v_kenmerk_default, 1, 4000),
                          SUBSTR (v_kenmerk_type, 1, 255),                   -- 20
                          SUBSTR (v_kenmerk_toonbaar, 1, 255),
                          SUBSTR (v_kenmerk_uniek, 1, 255),
                          SUBSTR (v_kenmerk_hint, 1, 255),
                          SUBSTR (v_kenmerk_regexp, 1, 255),
                          SUBSTR (v_kenmerk_show_expr, 1, 4000),
                          SUBSTR (v_kenmerk_code, 1, 255),
                          SUBSTR (v_kenmerk_omschr, 1, 255),
                          SUBSTR (v_kenmerk_verwijder, 1, 255),
                          SUBSTR (v_kenmerk_extra_1, 1, 255),
                          SUBSTR (v_kenmerk_extra_2, 1, 255),                -- 30
                          SUBSTR (v_kenmerk_extra_3, 1, 255),
                          SUBSTR (v_kenmerk_extra_4, 1, 255),
                          v_res_srtactiviteit,
                          v_res_activiteit,
                          v_mld_srtdiscipline,
                          v_mld_discipline,
                          v_mld_stdmelding,
                          v_mld_typeopdr,
                          v_bes_discipline,
                          v_bes_srtgroep,                                    -- 40
                          v_bes_srtdeel,
                          v_cnt_discipline,
                          v_ins_discipline,
                          v_ins_srtgroep,
                          v_ins_srtdeel,                                     -- 45
                          flexmodule
                      );

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

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

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

-- UNDER CONSTRUCTION
--
-- Mijn voorstel is om het als volgt te doen:
-- 1. inlezen van het bestand in fac_imp_flex
-- 2. Op basis van de header constateren of het res/bes/mld is
-- res: ACTIVITEITSOORT;ACTIVITEIT
-- mld: VAKGROEPTYPE;VAKGROEP;MELDING;OPDRACHTTYPE
-- bes: CATALOGUS;GROEP;ARTIKEL
-- cnt: CONTRACTSOORT
-- 3. Dan de verdere handling in fac_update_flex

-- flexkenmerken-import (transport) voor RES/MLD/BES, volgens UWVA#20706
--                               en voor CNT, volgens AALB#27395
-- UWVA#32742:  flexkenmerken transport voor objecten
CREATE OR REPLACE PROCEDURE fac_update_flex (p_import_key IN NUMBER)
IS
  CURSOR c_flex
  IS
     SELECT   * FROM fac_imp_flex
     ORDER BY srtkenmerk_omschrijving, kenmerk_volgnummer;

  oracle_err_num        NUMBER;
  oracle_err_mes        VARCHAR2 (250);
  v_errormsg            VARCHAR2 (1024);
  v_errorhint           VARCHAR2 (1024);
  v_count               NUMBER;
  flexmodule            VARCHAR2 (3);
  v_desc                VARCHAR2 (255);
  v_usrtab_key          NUMBER;
  v_kenmerkdomein_key   NUMBER;
  v_srtkenmerk_key      NUMBER;
  v_kenmerk_key         NUMBER;
  v_srtinstallatie_key  NUMBER;
  v_srtgroep_key        NUMBER;
  v_srtdeel_key         NUMBER;
  v_srtdiscipline_key   NUMBER;
  v_discipline_key      NUMBER;
  v_stdmelding_key      NUMBER;
  v_typeopdr_key        NUMBER;
  v_activiteit_key      NUMBER;
  currentversion fac_module.fac_module_version%TYPE;
  e_transport EXCEPTION;
BEGIN
  -- Init
  SELECT   MAX (fac_module_version) INTO currentversion FROM fac_module;

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

  -- Bestaan de gebruikte Eigen tabellen?
  SELECT   COUNT ( * )
    INTO   v_count
    FROM   fac_imp_flex
   WHERE   fac_usrtab_naam IS NOT NULL AND fac_usrtab_naam NOT IN (SELECT fac_usrtab_naam FROM fac_usrtab);

  IF (v_count != 0)
  THEN
     v_errormsg := 'Ontbrekende Eigen tabel(len)';
     RAISE e_transport;
  END IF;

  -- Proces de importregel. Als we ergens onderweg
  -- een fout tegenkomen, doen we een rollback.
  FOR rec IN c_flex
  LOOP
     -- Kenmerkdomeinen: maak nog-niet-bestaande domeinen aan.
     BEGIN
        -- bepaal de module
        IF rec.res_activiteit IS NOT NULL THEN
           flexmodule := 'RES';
        ELSIF rec.bes_discipline IS NOT NULL THEN
           flexmodule := 'BES';
        ELSIF rec.cnt_discipline IS NOT NULL THEN
           flexmodule := 'CNT';
        ELSIF rec.ins_discipline IS NOT NULL THEN
           flexmodule := 'INS';
        ELSE
           flexmodule := rec.kenmerk_module; -- MLD, FIN, ...
        END IF;

        v_kenmerkdomein_key := NULL;
        IF rec.fac_kenmerkdomein_omschrijving IS NOT NULL THEN
           v_usrtab_key := NULL;
           v_kenmerkdomein_key := NULL;
           v_desc := rec.fac_kenmerkdomein_omschrijving;

           v_errormsg := 'Fout bij bepalen kenmerkdomein ' || v_desc;

           -- Bestaat dit domein al?
           SELECT   COUNT ( * ), MIN(fac_kenmerkdomein_key)
             INTO   v_count, v_kenmerkdomein_key
             FROM   fac_kenmerkdomein kd
            WHERE       kd.fac_kenmerkdomein_module = flexmodule
                    AND kd.fac_kenmerkdomein_omschrijving = rec.fac_kenmerkdomein_omschrijving
                    AND fac_kenmerkdomein_verwijder IS NULL;

           IF (v_count = 0)
           THEN
              -- Bestaat nog niet --> aanmaken
              v_errormsg := 'Fout bij bepalen Eigen tabel ' || rec.fac_usrtab_naam;

              -- Gebruikt domein een usrtab?
              IF (rec.fac_usrtab_naam || 'x' != 'x')
              THEN
                 SELECT   fac_usrtab_key
                   INTO   v_usrtab_key
                   FROM   fac_usrtab
                  WHERE   fac_usrtab_naam = rec.fac_usrtab_naam;
              END IF;

              -- Domein toevoegen
              -- (NB: mogelijk bestaat er nog een domein met de goede omschrijving,
              --      maar met een verwijderdatum. Die negeren we en maken een nieuwe)
              v_errormsg := 'Fout bij toevoegen kenmerkdomein ' || v_desc;

              INSERT INTO fac_kenmerkdomein (
                                                fac_kenmerkdomein_module,
                                                fac_kenmerkdomein_omschrijving,
                                                fac_kenmerkdomein_objectnaam,
                                                fac_kenmerkdomein_kolomnaam,
                                                fac_kenmerkdomein_kolomtxt,
                                                fac_usrtab_key
                          )
                 VALUES   (
                              flexmodule,
                              rec.fac_kenmerkdomein_omschrijving,
                              rec.fac_kenmerkdomein_objectnaam,
                              rec.fac_kenmerkdomein_kolomnaam,
                              rec.fac_kenmerkdomein_kolomtxt,
                              v_usrtab_key
                          )
              RETURNING   fac_kenmerkdomein_key
                   INTO   v_kenmerkdomein_key;

              fac.imp_writelog (p_import_key, 'I', flexmodule||'-kenmerkdomein toegevoegd', v_desc);
           ELSE
              -- Bestaat al wel
              fac.imp_writelog (p_import_key,
                                'I',
                                'Kenmerkdomein opgehaald',
                                v_desc || ' (' || v_kenmerkdomein_key || ')'
                               );
           END IF;
        END IF;

        -- Kenmerksoorten: maak nog-niet-bestaande soorten aan.
        v_srtkenmerk_key := NULL;
        IF rec.srtkenmerk_omschrijving IS NOT NULL
        THEN
           v_desc := rec.srtkenmerk_omschrijving;
           v_errormsg := 'Fout bij bepalen kenmerksoort ' || v_desc;

           -- Bestaat dit soort al?
           CASE flexmodule
           WHEN 'BES' THEN
              SELECT   COUNT ( * ), MIN(bes_srtkenmerk_key)
                INTO   v_count, v_srtkenmerk_key
                FROM   bes_srtkenmerk
               WHERE       bes_srtkenmerk_omschrijving = rec.srtkenmerk_omschrijving
                       AND bes_srtkenmerk_verwijder IS NULL;
           WHEN 'MLD' THEN
              SELECT   COUNT ( * ), MIN(mld_srtkenmerk_key)
                INTO   v_count, v_srtkenmerk_key
                FROM   mld_srtkenmerk
               WHERE       mld_srtkenmerk_omschrijving = rec.srtkenmerk_omschrijving
                       AND mld_srtkenmerk_verwijder IS NULL;
           WHEN 'RES' THEN
              SELECT   COUNT ( * ), MIN(res_srtkenmerk_key)
                INTO   v_count, v_srtkenmerk_key
                FROM   res_srtkenmerk
               WHERE       res_srtkenmerk_omschrijving = rec.srtkenmerk_omschrijving
                       AND res_srtkenmerk_verwijder IS NULL;
           WHEN 'CNT' THEN
              SELECT   COUNT ( * ), MIN(cnt_srtkenmerk_key)
                INTO   v_count, v_srtkenmerk_key
                FROM   cnt_srtkenmerk
               WHERE       cnt_srtkenmerk_omschrijving = rec.srtkenmerk_omschrijving
                       AND cnt_srtkenmerk_verwijder IS NULL;
           WHEN 'INS' THEN
              SELECT   COUNT ( * ), MIN(ins_srtkenmerk_key)
                INTO   v_count, v_srtkenmerk_key
                FROM   ins_srtkenmerk
               WHERE       ins_srtkenmerk_omschrijving = rec.srtkenmerk_omschrijving
                       AND ins_srtkenmerk_verwijder IS NULL;
           END CASE;

           IF (v_count = 0)
           THEN
              -- Bestaat nog niet --> aanmaken
              -- (NB: mogelijk bestaat er nog een soort met de goede omschrijving,
              --      maar met een verwijderdatum. Die negeren we en maken een nieuwe)
              v_errormsg := 'Fout bij toevoegen kenmerksoort ' || v_desc;

              CASE flexmodule
              WHEN 'BES' THEN
                 INSERT INTO bes_srtkenmerk (
                                                bes_srtkenmerk_omschrijving,
                                                bes_srtkenmerk_code,
                                                bes_srtkenmerk_kenmerktype,
                                                bes_srtkenmerk_systeem,
                                                bes_srtkenmerk_lengte,
                                                bes_srtkenmerk_dec,
                                                bes_srtkenmerk_nmin,
                                                bes_srtkenmerk_nmax,
                                                bes_srtkenmerk_dimensie,
                                                fac_kenmerkdomein_key
                             )
                    VALUES   (
                                 rec.srtkenmerk_omschrijving,
                                 rec.srtkenmerk_code,
                                 rec.srtkenmerk_kenmerktype,
                                 rec.srtkenmerk_systeem,
                                 rec.srtkenmerk_lengte,
                                 rec.srtkenmerk_dec,
                                 rec.srtkenmerk_nmin,
                                 rec.srtkenmerk_nmax,
                                 rec.srtkenmerk_dimensie,
                                 v_kenmerkdomein_key
                             )
                 RETURNING   bes_srtkenmerk_key
                      INTO   v_srtkenmerk_key;

              WHEN 'MLD' THEN
                 INSERT INTO mld_srtkenmerk (
                                                mld_srtkenmerk_omschrijving,
                                                mld_srtkenmerk_code,
                                                mld_srtkenmerk_kenmerktype,
                                                mld_srtkenmerk_systeem,
                                                mld_srtkenmerk_lengte,
                                                mld_srtkenmerk_dec,
                                                mld_srtkenmerk_nmin,
                                                mld_srtkenmerk_nmax,
                                                mld_srtkenmerk_dimensie,
                                                fac_kenmerkdomein_key
                             )
                    VALUES   (
                                 rec.srtkenmerk_omschrijving,
                                 rec.srtkenmerk_code,
                                 rec.srtkenmerk_kenmerktype,
                                 rec.srtkenmerk_systeem,
                                 rec.srtkenmerk_lengte,
                                 rec.srtkenmerk_dec,
                                 rec.srtkenmerk_nmin,
                                 rec.srtkenmerk_nmax,
                                 rec.srtkenmerk_dimensie,
                                 v_kenmerkdomein_key
                             )
                 RETURNING   mld_srtkenmerk_key
                      INTO   v_srtkenmerk_key;

              WHEN 'RES' THEN
                 INSERT INTO res_srtkenmerk (
                                                res_srtkenmerk_omschrijving,
                                                res_srtkenmerk_code,
                                                res_srtkenmerk_kenmerktype,
                                                res_srtkenmerk_systeem,
                                                res_srtkenmerk_lengte,
                                                res_srtkenmerk_dec,
                                                res_srtkenmerk_nmin,
                                                res_srtkenmerk_nmax,
                                                res_srtkenmerk_dimensie,
                                                fac_kenmerkdomein_key
                             )
                    VALUES   (
                                 rec.srtkenmerk_omschrijving,
                                 rec.srtkenmerk_code,
                                 rec.srtkenmerk_kenmerktype,
                                 rec.srtkenmerk_systeem,
                                 rec.srtkenmerk_lengte,
                                 rec.srtkenmerk_dec,
                                 rec.srtkenmerk_nmin,
                                 rec.srtkenmerk_nmax,
                                 rec.srtkenmerk_dimensie,
                                 v_kenmerkdomein_key
                             )
                 RETURNING   res_srtkenmerk_key
                      INTO   v_srtkenmerk_key;

              WHEN 'CNT' THEN
                 INSERT INTO cnt_srtkenmerk (
                                                cnt_srtkenmerk_omschrijving,
                                                cnt_srtkenmerk_code,
                                                cnt_srtkenmerk_kenmerktype,
                                                cnt_srtkenmerk_systeem,
                                                cnt_srtkenmerk_lengte,
                                                cnt_srtkenmerk_dec,
                                                cnt_srtkenmerk_nmin,
                                                cnt_srtkenmerk_nmax,
                                                cnt_srtkenmerk_dimensie,
                                                fac_kenmerkdomein_key
                             )
                    VALUES   (
                                 rec.srtkenmerk_omschrijving,
                                 rec.srtkenmerk_code,
                                 rec.srtkenmerk_kenmerktype,
                                 rec.srtkenmerk_systeem,
                                 rec.srtkenmerk_lengte,
                                 rec.srtkenmerk_dec,
                                 rec.srtkenmerk_nmin,
                                 rec.srtkenmerk_nmax,
                                 rec.srtkenmerk_dimensie,
                                 v_kenmerkdomein_key
                             )
                 RETURNING   cnt_srtkenmerk_key
                      INTO   v_srtkenmerk_key;
              WHEN 'INS' THEN
                 INSERT INTO ins_srtkenmerk (
                                                ins_srtkenmerk_omschrijving,
                                                ins_srtkenmerk_code,
                                                ins_srtkenmerk_kenmerktype,
                                                ins_srtkenmerk_systeem,
                                                ins_srtkenmerk_lengte,
                                                ins_srtkenmerk_dec,
                                                ins_srtkenmerk_nmin,
                                                ins_srtkenmerk_nmax,
                                                ins_srtkenmerk_dimensie,
                                                fac_kenmerkdomein_key
                             )
                    VALUES   (
                                 rec.srtkenmerk_omschrijving,
                                 rec.srtkenmerk_code,
                                 rec.srtkenmerk_kenmerktype,
                                 rec.srtkenmerk_systeem,
                                 rec.srtkenmerk_lengte,
                                 rec.srtkenmerk_dec,
                                 rec.srtkenmerk_nmin,
                                 rec.srtkenmerk_nmax,
                                 rec.srtkenmerk_dimensie,
                                 v_kenmerkdomein_key
                             )
                 RETURNING   ins_srtkenmerk_key
                      INTO   v_srtkenmerk_key;

              END CASE;

              fac.imp_writelog (p_import_key, 'I', 'Kenmersoort toegevoegd', v_desc);
           ELSE
              -- Bestaat al wel

              CASE flexmodule
              WHEN 'BES' THEN
                 UPDATE bes_srtkenmerk SET
                    bes_srtkenmerk_omschrijving = rec.srtkenmerk_omschrijving,
                    bes_srtkenmerk_code         = rec.srtkenmerk_code,
                    bes_srtkenmerk_kenmerktype  = rec.srtkenmerk_kenmerktype,
                    bes_srtkenmerk_systeem      = rec.srtkenmerk_systeem,
                    bes_srtkenmerk_lengte       = rec.srtkenmerk_lengte,
                    bes_srtkenmerk_dec          = rec.srtkenmerk_dec,
                    bes_srtkenmerk_nmin         = rec.srtkenmerk_nmin,
                    bes_srtkenmerk_nmax         = rec.srtkenmerk_nmax,
                    bes_srtkenmerk_dimensie     = rec.srtkenmerk_dimensie,
                    fac_kenmerkdomein_key       = v_kenmerkdomein_key
                 WHERE bes_srtkenmerk_key = v_srtkenmerk_key;

              WHEN 'MLD' THEN
                 UPDATE mld_srtkenmerk SET
                    mld_srtkenmerk_omschrijving = rec.srtkenmerk_omschrijving,
                    mld_srtkenmerk_code         = rec.srtkenmerk_code,
                    mld_srtkenmerk_kenmerktype  = rec.srtkenmerk_kenmerktype,
                    mld_srtkenmerk_systeem      = rec.srtkenmerk_systeem,
                    mld_srtkenmerk_lengte       = rec.srtkenmerk_lengte,
                    mld_srtkenmerk_dec          = rec.srtkenmerk_dec,
                    mld_srtkenmerk_nmin         = rec.srtkenmerk_nmin,
                    mld_srtkenmerk_nmax         = rec.srtkenmerk_nmax,
                    mld_srtkenmerk_dimensie     = rec.srtkenmerk_dimensie,
                    fac_kenmerkdomein_key       = v_kenmerkdomein_key
                 WHERE mld_srtkenmerk_key = v_srtkenmerk_key;

              WHEN 'RES' THEN
                 UPDATE res_srtkenmerk SET
                    res_srtkenmerk_omschrijving = rec.srtkenmerk_omschrijving,
                    res_srtkenmerk_code         = rec.srtkenmerk_code,
                    res_srtkenmerk_kenmerktype  = rec.srtkenmerk_kenmerktype,
                    res_srtkenmerk_systeem      = rec.srtkenmerk_systeem,
                    res_srtkenmerk_lengte       = rec.srtkenmerk_lengte,
                    res_srtkenmerk_dec          = rec.srtkenmerk_dec,
                    res_srtkenmerk_nmin         = rec.srtkenmerk_nmin,
                    res_srtkenmerk_nmax         = rec.srtkenmerk_nmax,
                    res_srtkenmerk_dimensie     = rec.srtkenmerk_dimensie,
                    fac_kenmerkdomein_key       = v_kenmerkdomein_key
                 WHERE res_srtkenmerk_key = v_srtkenmerk_key;

              WHEN 'CNT' THEN
                 UPDATE cnt_srtkenmerk SET
                    cnt_srtkenmerk_omschrijving = rec.srtkenmerk_omschrijving,
                    cnt_srtkenmerk_code         = rec.srtkenmerk_code,
                    cnt_srtkenmerk_kenmerktype  = rec.srtkenmerk_kenmerktype,
                    cnt_srtkenmerk_systeem      = rec.srtkenmerk_systeem,
                    cnt_srtkenmerk_lengte       = rec.srtkenmerk_lengte,
                    cnt_srtkenmerk_dec          = rec.srtkenmerk_dec,
                    cnt_srtkenmerk_nmin         = rec.srtkenmerk_nmin,
                    cnt_srtkenmerk_nmax         = rec.srtkenmerk_nmax,
                    cnt_srtkenmerk_dimensie     = rec.srtkenmerk_dimensie,
                    fac_kenmerkdomein_key       = v_kenmerkdomein_key
                 WHERE cnt_srtkenmerk_key = v_srtkenmerk_key;

              WHEN 'INS' THEN
                 UPDATE ins_srtkenmerk SET
                    ins_srtkenmerk_omschrijving = rec.srtkenmerk_omschrijving,
                    ins_srtkenmerk_code         = rec.srtkenmerk_code,
                    ins_srtkenmerk_kenmerktype  = rec.srtkenmerk_kenmerktype,
                    ins_srtkenmerk_systeem      = rec.srtkenmerk_systeem,
                    ins_srtkenmerk_lengte       = rec.srtkenmerk_lengte,
                    ins_srtkenmerk_dec          = rec.srtkenmerk_dec,
                    ins_srtkenmerk_nmin         = rec.srtkenmerk_nmin,
                    ins_srtkenmerk_nmax         = rec.srtkenmerk_nmax,
                    ins_srtkenmerk_dimensie     = rec.srtkenmerk_dimensie,
                    fac_kenmerkdomein_key       = v_kenmerkdomein_key
                 WHERE ins_srtkenmerk_key = v_srtkenmerk_key;


              END CASE;

              fac.imp_writelog (p_import_key,
                                'I',
                                'Kenmerksoort aangepast',
                                v_desc || ' (' || v_srtkenmerk_key || ')'
                               );
           END IF;
        END IF;

        -- Kenmerken
        -- 1) bepaal keys
        -- 2a) voeg toe
        -- 2b) update

        v_kenmerk_key := NULL;

        CASE flexmodule
        WHEN 'BES' THEN
           -- Bepaal catalogus / groep / artikel
           v_errormsg := 'Fout bij bepalen catalogus ' || rec.bes_discipline;
           SELECT   ins_discipline_key
             INTO   v_discipline_key
             FROM   bes_discipline
            WHERE       ins_discipline_verwijder IS NULL
                    AND ins_discipline_omschrijving = rec.bes_discipline;
           v_srtinstallatie_key := v_discipline_key;

           IF rec.bes_srtgroep IS NOT NULL THEN
              v_errormsg := 'Fout bij bepalen groep ' || rec.bes_discipline || '/' || rec.bes_srtgroep;
              SELECT   bes_srtgroep_key
                INTO   v_srtgroep_key
                FROM   bes_srtgroep
               WHERE       bes_srtgroep_verwijder IS NULL
                       AND ins_discipline_key = v_discipline_key
                       AND bes_srtgroep_omschrijving = rec.bes_srtgroep;
              v_srtinstallatie_key := v_srtgroep_key;
           END IF;

           IF rec.bes_srtdeel IS NOT NULL THEN
              v_errormsg := 'Fout bij bepalen artikel ' || rec.bes_discipline || '/' || rec.bes_srtgroep || '/' || rec.bes_srtdeel;
              SELECT   bes_srtdeel_key
                INTO   v_srtdeel_key
                FROM   bes_srtdeel
               WHERE       bes_srtdeel_verwijder IS NULL
                       AND bes_srtgroep_key = v_srtgroep_key
                       AND bes_srtdeel_omschrijving = rec.bes_srtdeel;
              v_srtinstallatie_key := v_srtdeel_key;
           END IF;

           v_desc := rec.srtkenmerk_omschrijving || ' (' || rec.bes_discipline || '/' || rec.bes_srtgroep || '/' || rec.bes_srtdeel || ')';
           -- Bestaat dit kenmerk al?
           v_errormsg := 'Fout bij bepalen kenmerk ' || v_desc;
           SELECT   COUNT ( * ), MIN(bes_kenmerk_key)
             INTO   v_count, v_kenmerk_key
             FROM   bes_kenmerk
            WHERE       bes_srtkenmerk_key = v_srtkenmerk_key
                    AND bes_kenmerk_niveau = rec.kenmerk_niveau
                    AND bes_kenmerk_type = rec.kenmerk_type
                    AND bes_srtinstallatie_key = v_srtinstallatie_key
                    AND (bes_kenmerk_omschrijving = rec.kenmerk_omschr
                      OR (rec.kenmerk_omschr IS NULL AND bes_kenmerk_omschrijving IS NULL));

           IF (v_count = 0)
           THEN
              -- Bestaat nog niet --> aanmaken

              v_errormsg := 'Fout bij toevoegen kenmerk ' || v_desc;
              INSERT INTO bes_kenmerk (
                                          bes_srtkenmerk_key,
                                          bes_srtinstallatie_key,
                                          bes_kenmerk_niveau,
                                          bes_kenmerk_type,
                                          bes_kenmerk_verplicht,
                                          bes_kenmerk_groep,
                                          bes_kenmerk_volgnummer,
                                          bes_kenmerk_default,
                                          bes_kenmerk_verwijder,
                                          bes_kenmerk_toonbaar,
                                          bes_kenmerk_uniek,
                                          bes_kenmerk_hint,
                                          bes_kenmerk_regexp,
                                          bes_kenmerk_show_expr,
                                          bes_kenmerk_code,
                                          bes_kenmerk_omschrijving
                          )
                 VALUES   (
                              v_srtkenmerk_key,
                              v_srtinstallatie_key,
                              rec.kenmerk_niveau,
                              rec.kenmerk_type,
                              fac.safe_to_number (rec.kenmerk_verplicht),
                              fac.safe_to_number (rec.kenmerk_groep),
                              fac.safe_to_number (rec.kenmerk_volgnummer),
                              rec.kenmerk_default,
                              TO_DATE (rec.kenmerk_verwijder, 'YYYY-MM-DD HH24:MI:SS'),
                              fac.safe_to_number (rec.kenmerk_toonbaar),
                              fac.safe_to_number (rec.kenmerk_uniek),
                              rec.kenmerk_hint,
                              rec.kenmerk_regexp,
                              rec.kenmerk_show_expr,
                              rec.kenmerk_code,
                              rec.kenmerk_omschr
                          )
              RETURNING   bes_kenmerk_key
                   INTO   v_kenmerk_key;

              fac.imp_writelog (p_import_key, 'I', 'Kenmerk toegevoegd', v_desc || ' (' || v_kenmerk_key || ')');
           ELSE
              -- Bestaat al wel --> updaten (dat kan ook verwijderen zijn!)

              v_errormsg := 'Fout bij bijwerken kenmerk ' || v_desc;
              UPDATE   bes_kenmerk
                 SET   bes_srtkenmerk_key = v_srtkenmerk_key,
                       bes_srtinstallatie_key = v_srtinstallatie_key,
                       bes_kenmerk_niveau = rec.kenmerk_niveau,
                       bes_kenmerk_type = rec.kenmerk_type,
                       bes_kenmerk_verplicht = fac.safe_to_number (rec.kenmerk_verplicht),
                       bes_kenmerk_groep = fac.safe_to_number (rec.kenmerk_groep),
                       bes_kenmerk_volgnummer = fac.safe_to_number (rec.kenmerk_volgnummer),
                       bes_kenmerk_default = rec.kenmerk_default,
                       bes_kenmerk_verwijder = TO_DATE (rec.kenmerk_verwijder, 'YYYY-MM-DD HH24:MI:SS'),
                       bes_kenmerk_toonbaar = fac.safe_to_number (rec.kenmerk_toonbaar),
                       bes_kenmerk_uniek = fac.safe_to_number (rec.kenmerk_uniek),
                       bes_kenmerk_hint = rec.kenmerk_hint,
                       bes_kenmerk_regexp = rec.kenmerk_regexp,
                       bes_kenmerk_show_expr = rec.kenmerk_show_expr,
                       bes_kenmerk_code = rec.kenmerk_code,
                       bes_kenmerk_omschrijving = rec.kenmerk_omschr
               WHERE       bes_kenmerk_key = v_kenmerk_key
                       AND bes_kenmerk_verwijder IS NULL;

              fac.imp_writelog (p_import_key, 'I', 'Kenmerk bijgewerkt', v_desc || ' (' || v_kenmerk_key || ')');
           END IF;
        WHEN 'MLD' THEN
           -- Bepaal vakgroeptype / vakgroep / stdmelding / opdrachttype
           v_srtdiscipline_key := NULL;
           v_discipline_key := NULL;
           v_stdmelding_key := NULL;
           v_typeopdr_key := NULL;

           IF rec.mld_srtdiscipline IS NOT NULL THEN
              v_errormsg := 'Fout bij bepalen srtdiscipline ' || rec.mld_srtdiscipline;
              SELECT   ins_srtdiscipline_key
                INTO   v_srtdiscipline_key
                FROM   ins_srtdiscipline
               WHERE       ins_srtdiscipline_verwijder IS NULL
                       AND ins_srtdiscipline_omschrijving = rec.mld_srtdiscipline;
              v_stdmelding_key := v_srtdiscipline_key;
           END IF;

           IF rec.mld_discipline IS NOT NULL THEN
              v_errormsg := 'Fout bij bepalen discipline ' || rec.mld_srtdiscipline || '/' || rec.mld_discipline;
              SELECT   ins_discipline_key
                INTO   v_discipline_key
                FROM   mld_discipline
               WHERE       ins_discipline_verwijder IS NULL
                       AND ins_srtdiscipline_key = v_srtdiscipline_key
                       AND ins_discipline_omschrijving = rec.mld_discipline;
              v_stdmelding_key := v_discipline_key;
           END IF;

           IF rec.mld_stdmelding IS NOT NULL THEN
              v_errormsg := 'Fout bij bepalen stdmelding ' || rec.mld_srtdiscipline || '/' || rec.mld_discipline || '/' || rec.mld_stdmelding;
              SELECT   mld_stdmelding_key
                INTO   v_stdmelding_key
                FROM   mld_stdmelding
               WHERE       mld_stdmelding_verwijder IS NULL
                       AND mld_ins_discipline_key = v_discipline_key
                       AND mld_stdmelding_omschrijving = rec.mld_stdmelding;
           END IF;

           IF rec.mld_typeopdr IS NOT NULL THEN
              v_errormsg := 'Fout bij bepalen typeopdr ' || rec.mld_typeopdr;
              SELECT   mld_typeopdr_key
                INTO   v_typeopdr_key
                FROM   mld_typeopdr
               WHERE   mld_typeopdr_omschrijving = rec.mld_typeopdr;
           END IF;

           v_desc := rec.srtkenmerk_omschrijving || ' [' || v_srtkenmerk_key || '] (' || rec.mld_srtdiscipline || '/' || rec.mld_discipline  || '/' || rec.mld_stdmelding || ' - ' || rec.mld_typeopdr  || ')';
           -- Bestaat dit kenmerk al?
           v_errormsg := 'Fout bij bepalen kenmerk ' || v_desc;
           SELECT   COUNT ( * ), MIN(mld_kenmerk_key)
             INTO   v_count, v_kenmerk_key
             FROM   mld_kenmerk
            WHERE   mld_srtkenmerk_key = v_srtkenmerk_key
                    AND mld_kenmerk_niveau = rec.kenmerk_niveau
                    AND mld_kenmerk_groep = rec.kenmerk_groep
                    AND (mld_stdmelding_key = v_stdmelding_key
                      OR mld_typeopdr_key = v_typeopdr_key
                      OR (mld_stdmelding_key IS NULL AND mld_typeopdr_key IS NULL)
                        )
                    AND (mld_kenmerk_omschrijving = rec.kenmerk_omschr
                      OR (rec.kenmerk_omschr IS NULL AND mld_kenmerk_omschrijving IS NULL));

           IF (v_count = 0)
           THEN
              -- Bestaat nog niet --> aanmaken

              v_errormsg := 'Fout bij toevoegen kenmerk ' || v_desc;
              INSERT INTO mld_kenmerk (
                                          mld_srtkenmerk_key,
                                          mld_stdmelding_key,
                                          mld_typeopdr_key,
                                          mld_kenmerk_niveau,
                                          mld_kenmerk_verplicht,
                                          mld_kenmerk_groep,
                                          mld_kenmerk_volgnummer,
                                          mld_kenmerk_default,
                                          mld_kenmerk_verwijder,
                                          mld_kenmerk_toonbaar,
                                          mld_kenmerk_uniek,
                                          mld_kenmerk_hint,
                                          mld_kenmerk_regexp,
                                          mld_kenmerk_show_expr,
                                          mld_kenmerk_code,
                                          mld_kenmerk_omschrijving,
                                          mld_kenmerk_verplicht_status,
                                          mld_kenmerk_onderbreken,
                                          mld_kenmerk_obligation_fill
                          )
                 VALUES   (
                              v_srtkenmerk_key,
                              v_stdmelding_key,
                              v_typeopdr_key,
                              rec.kenmerk_niveau,
                              fac.safe_to_number (rec.kenmerk_verplicht),
                              fac.safe_to_number (rec.kenmerk_groep),
                              fac.safe_to_number (rec.kenmerk_volgnummer),
                              rec.kenmerk_default,
                              TO_DATE (rec.kenmerk_verwijder, 'YYYY-MM-DD HH24:MI:SS'),
                              fac.safe_to_number (rec.kenmerk_toonbaar),
                              fac.safe_to_number (rec.kenmerk_uniek),
                              rec.kenmerk_hint,
                              rec.kenmerk_regexp,
                              rec.kenmerk_show_expr,
                              rec.kenmerk_code,
                              rec.kenmerk_omschr,
                              fac.safe_to_number (rec.kenmerk_extra_1),
                              fac.safe_to_number (rec.kenmerk_extra_2),
                              fac.safe_to_number (rec.kenmerk_extra_3)
                          )
              RETURNING   mld_kenmerk_key
                   INTO   v_kenmerk_key;

              fac.imp_writelog (p_import_key, 'I', 'Kenmerk toegevoegd', v_desc || ' (' || v_kenmerk_key || ')');
           ELSE
              -- Bestaat al wel --> updaten (dat kan ook verwijderen zijn!)

              v_errormsg := 'Fout bij bijwerken kenmerk ' || '[' || v_kenmerk_key || ']' || ' Gegevens:' || v_stdmelding_key || ',' || v_srtkenmerk_key || ',' || rec.kenmerk_niveau || ',' || v_desc;
              UPDATE   mld_kenmerk
                 SET   mld_srtkenmerk_key = v_srtkenmerk_key,
                       mld_stdmelding_key = v_stdmelding_key,
                       mld_typeopdr_key = v_typeopdr_key,
                       mld_kenmerk_niveau = rec.kenmerk_niveau,
                       mld_kenmerk_verplicht = fac.safe_to_number (rec.kenmerk_verplicht),
                       mld_kenmerk_groep = fac.safe_to_number (rec.kenmerk_groep),
                       mld_kenmerk_volgnummer = fac.safe_to_number (rec.kenmerk_volgnummer),
                       mld_kenmerk_default = rec.kenmerk_default,
                       mld_kenmerk_verwijder = TO_DATE (rec.kenmerk_verwijder, 'YYYY-MM-DD HH24:MI:SS'),
                       mld_kenmerk_toonbaar = fac.safe_to_number (rec.kenmerk_toonbaar),
                       mld_kenmerk_uniek = fac.safe_to_number (rec.kenmerk_uniek),
                       mld_kenmerk_hint = rec.kenmerk_hint,
                       mld_kenmerk_regexp = rec.kenmerk_regexp,
                       mld_kenmerk_show_expr = rec.kenmerk_show_expr,
                       mld_kenmerk_code = rec.kenmerk_code,
                       mld_kenmerk_omschrijving = rec.kenmerk_omschr,
                       mld_kenmerk_verplicht_status = fac.safe_to_number (rec.kenmerk_extra_1),
                       mld_kenmerk_onderbreken = fac.safe_to_number (rec.kenmerk_extra_2),
                       mld_kenmerk_obligation_fill = fac.safe_to_number (rec.kenmerk_extra_3)
               WHERE       mld_kenmerk_key = v_kenmerk_key
                       AND mld_kenmerk_verwijder IS NULL;

              fac.imp_writelog (p_import_key, 'I', 'Kenmerk bijgewerkt', v_desc || ' (' || v_kenmerk_key || ')');
           END IF;
        WHEN 'RES' THEN
           -- Bepaal activiteit
           v_activiteit_key := NULL;

           v_errormsg := 'Fout bij bepalen activiteit ' || rec.res_srtactiviteit || '/' || rec.res_activiteit;
           SELECT   res_activiteit_key
             INTO   v_activiteit_key
             FROM   res_srtactiviteit rsa, res_activiteit ra
            WHERE       res_srtactiviteit_verwijder IS NULL
                    AND res_activiteit_verwijder IS NULL
                    AND rsa.res_srtactiviteit_key = ra.res_srtactiviteit_key
                    AND rsa.res_srtactiviteit_omschrijving = rec.res_srtactiviteit
                    AND ra.res_activiteit_omschrijving = rec.res_activiteit;

           v_desc := rec.srtkenmerk_omschrijving || ' (' || rec.res_srtactiviteit || '/' || rec.res_activiteit || ')';
           -- Bestaat dit kenmerk al?
           v_errormsg := 'Fout bij bepalen kenmerk ' || v_desc;
           SELECT   COUNT ( * ), MIN(res_kenmerk_key)
             INTO   v_count, v_kenmerk_key
             FROM   res_kenmerk
            WHERE   res_srtkenmerk_key = v_srtkenmerk_key
              AND   res_activiteit_key = v_activiteit_key
              AND   (res_kenmerk_omschrijving = rec.kenmerk_omschr
                  OR (rec.kenmerk_omschr IS NULL AND res_kenmerk_omschrijving IS NULL));

           IF (v_count = 0)
           THEN
              -- Bestaat nog niet --> aanmaken

              v_errormsg := 'Fout bij toevoegen kenmerk ' || v_desc;
              INSERT INTO res_kenmerk (
                                          res_srtkenmerk_key,
                                          res_activiteit_key,
                                          res_kenmerk_niveau,
                                          res_kenmerk_verplicht,
                                          res_kenmerk_groep,
                                          res_kenmerk_volgnummer,
                                          res_kenmerk_default,
                                          res_kenmerk_verwijder,
                                          res_kenmerk_toonbaar,
                                          res_kenmerk_uniek,
                                          res_kenmerk_hint,
                                          res_kenmerk_regexp,
                                          res_kenmerk_show_expr,
                                          res_kenmerk_code,
                                          res_kenmerk_omschrijving
                          )
                 VALUES   (
                              v_srtkenmerk_key,
                              v_activiteit_key,
                              rec.kenmerk_niveau,
                              fac.safe_to_number (rec.kenmerk_verplicht),
                              fac.safe_to_number (rec.kenmerk_groep),
                              fac.safe_to_number (rec.kenmerk_volgnummer),
                              rec.kenmerk_default,
                              TO_DATE (rec.kenmerk_verwijder, 'YYYY-MM-DD HH24:MI:SS'),
                              fac.safe_to_number (rec.kenmerk_toonbaar),
                              fac.safe_to_number (rec.kenmerk_uniek),
                              rec.kenmerk_hint,
                              rec.kenmerk_regexp,
                              rec.kenmerk_show_expr,
                              rec.kenmerk_code,
                              rec.kenmerk_omschr
                          )
              RETURNING   res_kenmerk_key
                   INTO   v_kenmerk_key;

              fac.imp_writelog (p_import_key, 'I', 'Kenmerk toegevoegd', v_desc || ' (' || v_kenmerk_key || ')');
           ELSE
              -- Bestaat al wel --> updaten (dat kan ook verwijderen zijn!)

              v_errormsg := 'Fout bij bijwerken kenmerk ' || v_desc;
              UPDATE   res_kenmerk
                 SET   res_srtkenmerk_key = v_srtkenmerk_key,
                       res_activiteit_key = v_activiteit_key,
                       res_kenmerk_niveau = rec.kenmerk_niveau,
                       res_kenmerk_verplicht = fac.safe_to_number (rec.kenmerk_verplicht),
                       res_kenmerk_groep = fac.safe_to_number (rec.kenmerk_groep),
                       res_kenmerk_volgnummer = fac.safe_to_number (rec.kenmerk_volgnummer),
                       res_kenmerk_default = rec.kenmerk_default,
                       res_kenmerk_verwijder = TO_DATE (rec.kenmerk_verwijder, 'YYYY-MM-DD HH24:MI:SS'),
                       res_kenmerk_toonbaar = fac.safe_to_number (rec.kenmerk_toonbaar),
                       res_kenmerk_uniek = fac.safe_to_number (rec.kenmerk_uniek),
                       res_kenmerk_hint = rec.kenmerk_hint,
                       res_kenmerk_regexp = rec.kenmerk_regexp,
                       res_kenmerk_show_expr = rec.kenmerk_show_expr,
                       res_kenmerk_code = rec.kenmerk_code,
                       res_kenmerk_omschrijving = rec.kenmerk_omschr
               WHERE       res_kenmerk_key = v_kenmerk_key
                       AND res_kenmerk_verwijder IS NULL;

              fac.imp_writelog (p_import_key, 'I', 'Kenmerk bijgewerkt', v_desc || ' (' || v_kenmerk_key || ')');
           END IF;
        WHEN 'CNT' THEN
           -- Bepaal contractsoort
           v_discipline_key := NULL;

           v_errormsg := 'Fout bij bepalen contractsoort ' || rec.cnt_discipline;
           SELECT   ins_discipline_key
             INTO   v_discipline_key
             FROM   cnt_discipline
            WHERE   ins_discipline_verwijder IS NULL
              AND   ins_discipline_omschrijving = rec.cnt_discipline;

           v_desc := rec.srtkenmerk_omschrijving || ' (' || rec.cnt_discipline || ')';
           -- Bestaat dit kenmerk al?
           v_errormsg := 'Fout bij bepalen kenmerk ' || v_desc;
           SELECT   COUNT ( * ), MIN(cnt_kenmerk_key)
             INTO   v_count, v_kenmerk_key
             FROM   cnt_kenmerk
            WHERE   cnt_srtkenmerk_key = v_srtkenmerk_key
              AND   cnt_srtcontract_key = v_discipline_key
              AND   (cnt_kenmerk_omschrijving = rec.kenmerk_omschr
                  OR (rec.kenmerk_omschr IS NULL AND cnt_kenmerk_omschrijving IS NULL));

           IF (v_count = 0)
           THEN
              -- Bestaat nog niet --> aanmaken

              v_errormsg := 'Fout bij toevoegen kenmerk ' || v_desc;
              INSERT INTO cnt_kenmerk (
                                          cnt_srtkenmerk_key,
                                          cnt_srtcontract_key,
                                          cnt_kenmerk_niveau,
                                          cnt_kenmerk_verplicht,
                                          cnt_kenmerk_groep,
                                          cnt_kenmerk_toonbaar,
                                          cnt_kenmerk_volgnummer,
                                          cnt_kenmerk_uniek,
                                          cnt_kenmerk_verwijder,
                                          cnt_kenmerk_default,
                                          cnt_kenmerk_hint,
                                          cnt_kenmerk_regexp,
                                          cnt_kenmerk_show_expr,
                                          cnt_kenmerk_code,
                                          cnt_kenmerk_omschrijving
                          )
                 VALUES   (
                              v_srtkenmerk_key,
                              v_discipline_key,
                              rec.kenmerk_niveau,
                              fac.safe_to_number (rec.kenmerk_verplicht),
                              fac.safe_to_number (rec.kenmerk_groep),
                              fac.safe_to_number (rec.kenmerk_toonbaar),
                              fac.safe_to_number (rec.kenmerk_volgnummer),
                              fac.safe_to_number (rec.kenmerk_uniek),
                              TO_DATE (rec.kenmerk_verwijder, 'YYYY-MM-DD HH24:MI:SS'),
                              rec.kenmerk_default,
                              rec.kenmerk_hint,
                              rec.kenmerk_regexp,
                              rec.kenmerk_show_expr,
                              rec.kenmerk_code,
                              rec.kenmerk_omschr
                          )
              RETURNING   cnt_kenmerk_key
                   INTO   v_kenmerk_key;

              fac.imp_writelog (p_import_key, 'I', 'Kenmerk toegevoegd', v_desc || ' (' || v_kenmerk_key || ')');
           ELSE
              -- Bestaat al wel --> updaten (dat kan ook verwijderen zijn!)

              v_errormsg := 'Fout bij bijwerken kenmerk ' || v_desc;
              UPDATE   cnt_kenmerk
                 SET   cnt_srtkenmerk_key = v_srtkenmerk_key,
                       cnt_srtcontract_key = v_discipline_key,
                       cnt_kenmerk_niveau = rec.kenmerk_niveau,
                       cnt_kenmerk_verplicht = fac.safe_to_number (rec.kenmerk_verplicht),
                       cnt_kenmerk_groep = fac.safe_to_number (rec.kenmerk_groep),
                       cnt_kenmerk_toonbaar = fac.safe_to_number (rec.kenmerk_toonbaar),
                       cnt_kenmerk_volgnummer = fac.safe_to_number (rec.kenmerk_volgnummer),
                       cnt_kenmerk_uniek = fac.safe_to_number (rec.kenmerk_uniek),
                       cnt_kenmerk_verwijder = TO_DATE (rec.kenmerk_verwijder, 'YYYY-MM-DD HH24:MI:SS'),
                       cnt_kenmerk_default = rec.kenmerk_default,
                       cnt_kenmerk_hint = rec.kenmerk_hint,
                       cnt_kenmerk_regexp = rec.kenmerk_regexp,
                       cnt_kenmerk_show_expr = rec.kenmerk_show_expr,
                       cnt_kenmerk_code = rec.kenmerk_code,
                       cnt_kenmerk_omschrijving = rec.kenmerk_omschr
               WHERE       cnt_kenmerk_key = v_kenmerk_key
                       AND cnt_kenmerk_verwijder IS NULL;

              fac.imp_writelog (p_import_key, 'I', 'Kenmerk bijgewerkt', v_desc || ' (' || v_kenmerk_key || ')');
           END IF;


           WHEN 'INS' THEN


           IF rec.kenmerk_niveau = 'C'
           THEN
                   -- Kenmerk is inspectie-gerelateerd (dus via ins_srtcontrole)
                   -- Bepalen van soort controle, dat is op basis van de omschrijving van soort controle in kolom ins_srtgroep, icm taakcategorie kolom rec.ins_discipline
                   v_errormsg := 'Fout bij bepalen soort controle ' || rec.ins_discipline || ' - ' || rec.ins_srtgroep;
                  SELECT ins_srtcontrole_key
                    INTO v_srtinstallatie_key
                    FROM ins_srtcontrole isc, ctr_discipline cd
                   WHERE     isc.ins_srtcontrole_omschrijving = rec.ins_srtgroep
                         AND isc.ctr_discipline_key = cd.ins_discipline_key
                         AND cd.ins_discipline_omschrijving = rec.ins_discipline;

                 v_desc := rec.srtkenmerk_omschrijving || ' (' || rec.ins_discipline || '/' || rec.ins_srtgroep || ')';
           ELSE
               -- Kenmerk is object-gerelateerd (dus via ins_discipline, ins_srtgroep of ins_srtdeel)

                   -- Bepaal discipline /  (soort)groep / objectsoort
                   v_errormsg := 'Fout bij bepalen discipline ' || rec.ins_discipline;
                   SELECT   ins_discipline_key
                     INTO   v_discipline_key
                     FROM   ins_discipline
                    WHERE       ins_discipline_verwijder IS NULL
                            AND ins_discipline_omschrijving = rec.ins_discipline;
                   v_srtinstallatie_key := v_discipline_key;

                   IF rec.ins_srtgroep IS NOT NULL THEN
                      v_errormsg := 'Fout bij bepalen groep ' || rec.ins_discipline || '/' || rec.ins_srtgroep;
                      SELECT   ins_srtgroep_key
                        INTO   v_srtgroep_key
                        FROM   ins_srtgroep
                       WHERE       ins_srtgroep_verwijder IS NULL
                               AND ins_discipline_key = v_discipline_key
                               AND ins_srtgroep_omschrijving = rec.ins_srtgroep;
                      v_srtinstallatie_key := v_srtgroep_key;
                   END IF;

                   IF rec.ins_srtdeel IS NOT NULL THEN
                      v_errormsg := 'Fout bij objectsoort ' || rec.ins_discipline || '/' || rec.ins_srtgroep || '/' || rec.ins_srtdeel;
                      SELECT   ins_srtdeel_key
                        INTO   v_srtdeel_key
                        FROM   ins_srtdeel
                       WHERE       ins_srtdeel_verwijder IS NULL
                               AND ins_srtgroep_key = v_srtgroep_key
                               AND ins_srtdeel_omschrijving = rec.ins_srtdeel;
                      v_srtinstallatie_key := v_srtdeel_key;
                   END IF;

                   v_desc := rec.srtkenmerk_omschrijving || ' (' || rec.ins_discipline || '/' || rec.ins_srtgroep || '/' || rec.ins_srtdeel || ')';

               END IF;

           -- Bestaat dit kenmerk al?
           v_errormsg := 'Fout bij bepalen kenmerk ' || v_desc;
           SELECT   COUNT ( * ), MIN(ins_kenmerk_key)
             INTO   v_count, v_kenmerk_key
             FROM   ins_kenmerk
            WHERE   ins_srtkenmerk_key = v_srtkenmerk_key
              AND   ins_kenmerk_niveau = rec.kenmerk_niveau
              AND   ins_kenmerk_bewerkniveau = rec.kenmerk_type
              AND   ins_srtinstallatie_key = v_srtinstallatie_key
              AND   (ins_kenmerk_omschrijving = rec.kenmerk_omschr
                  OR (rec.kenmerk_omschr IS NULL AND ins_kenmerk_omschrijving IS NULL))
              AND ins_kenmerk_verwijder IS NULL;     -- MB: Let op, deze verbetering in de vorm van extra conditie bij INS erbij gezet,
                                                     -- Is niet bij de andere (RES,MLD,BES,CNT) takken aangepast. Kan tzt eventueel indien hier meldingen over komen.
                                                     -- Dit zorgt ervoor dat een verwijderd kenmerk in doel met dezelfde kenmerksoort NIET wordt beschouwd als kenmerk bestaat al, want dan wordt een update geprobeerd die faalt.
                                                     -- Nu wordt een nieuw kenmerk van die soort aangemaakt. Zie details in call UWVA#32742

           IF (v_count = 0)
           THEN
              -- Bestaat nog niet --> aanmaken

              v_errormsg := 'Fout bij toevoegen kenmerk ' || v_desc;
              INSERT INTO ins_kenmerk (
                                          ins_srtkenmerk_key,
                                          ins_srtinstallatie_key,
                                          ins_kenmerk_niveau,
                                          ins_kenmerk_bewerkniveau,
                                          ins_kenmerk_verplicht,
                                          ins_kenmerk_groep,
                                          ins_kenmerk_volgnummer,
                                          ins_kenmerk_default,
                                          ins_kenmerk_verwijder,
                                          ins_kenmerk_toonbaar,
                                          ins_kenmerk_uniek,
                                          ins_kenmerk_hint,
                                          ins_kenmerk_regexp,
                                          ins_kenmerk_show_expr,
                                          ins_kenmerk_code,
                                          ins_kenmerk_omschrijving,
                                          ins_kenmerk_meetwaarde,
                                          ins_kenmerk_wissen
                          )
                 VALUES   (
                              v_srtkenmerk_key,
                              v_srtinstallatie_key,
                              rec.kenmerk_niveau,
                              rec.kenmerk_type,
                              fac.safe_to_number (rec.kenmerk_verplicht),
                              fac.safe_to_number (rec.kenmerk_groep),
                              fac.safe_to_number (rec.kenmerk_volgnummer),
                              rec.kenmerk_default,
                              TO_DATE (rec.kenmerk_verwijder, 'YYYY-MM-DD HH24:MI:SS'),
                              fac.safe_to_number (rec.kenmerk_toonbaar),
                              fac.safe_to_number (rec.kenmerk_uniek),
                              rec.kenmerk_hint,
                              rec.kenmerk_regexp,
                              rec.kenmerk_show_expr,
                              rec.kenmerk_code,
                              rec.kenmerk_omschr,
                              fac.safe_to_number (rec.kenmerk_extra_1),
                              fac.safe_to_number (rec.kenmerk_extra_2)
                          )
              RETURNING   ins_kenmerk_key
                   INTO   v_kenmerk_key;

              fac.imp_writelog (p_import_key, 'I', 'Kenmerk toegevoegd', v_desc || ' (' || v_kenmerk_key || ')');
           ELSE
              -- Bestaat al wel --> updaten (dat kan ook verwijderen zijn!)

              v_errormsg := 'Fout bij bijwerken kenmerk ' || v_desc;
              UPDATE   ins_kenmerk
                 SET   ins_srtkenmerk_key = v_srtkenmerk_key,
                       ins_srtinstallatie_key = v_srtinstallatie_key,
                       ins_kenmerk_niveau = rec.kenmerk_niveau,
                       ins_kenmerk_bewerkniveau = rec.kenmerk_type,
                       ins_kenmerk_verplicht = fac.safe_to_number (rec.kenmerk_verplicht),
                       ins_kenmerk_groep = fac.safe_to_number (rec.kenmerk_groep),
                       ins_kenmerk_volgnummer = fac.safe_to_number (rec.kenmerk_volgnummer),
                       ins_kenmerk_default = rec.kenmerk_default,
                       ins_kenmerk_verwijder = TO_DATE (rec.kenmerk_verwijder, 'YYYY-MM-DD HH24:MI:SS'),
                       ins_kenmerk_toonbaar = fac.safe_to_number (rec.kenmerk_toonbaar),
                       ins_kenmerk_uniek = fac.safe_to_number (rec.kenmerk_uniek),
                       ins_kenmerk_hint = rec.kenmerk_hint,
                       ins_kenmerk_regexp = rec.kenmerk_regexp,
                       ins_kenmerk_show_expr = rec.kenmerk_show_expr,
                       ins_kenmerk_code = rec.kenmerk_code,
                       ins_kenmerk_omschrijving = rec.kenmerk_omschr,
                       ins_kenmerk_meetwaarde = fac.safe_to_number (rec.kenmerk_extra_1),
                       ins_kenmerk_wissen = fac.safe_to_number (rec.kenmerk_extra_2)
               WHERE       ins_kenmerk_key = v_kenmerk_key
                       AND ins_kenmerk_verwijder IS NULL;

              fac.imp_writelog (p_import_key, 'I', 'Kenmerk bijgewerkt', v_desc || ' (' || v_kenmerk_key || ')');
           END IF;

        WHEN 'FIN' THEN
           -- Bestaat dit kenmerk al?
           v_desc := rec.kenmerk_omschr;
           v_errormsg := 'Fout bij bepalen kenmerk ' || v_desc;
           SELECT   COUNT (*), MIN(fin_kenmerk_key)
             INTO   v_count, v_kenmerk_key
             FROM   fin_kenmerk
            WHERE   (fin_kenmerk_omschrijving = rec.kenmerk_omschr
                  OR (rec.kenmerk_omschr IS NULL AND fin_kenmerk_omschrijving IS NULL));

           IF (v_count = 0)
           THEN
              -- Bestaat nog niet --> aanmaken
              v_errormsg := 'Fout bij toevoegen kenmerk ' || v_desc;
              INSERT INTO fin_kenmerk (
                                          fin_kenmerk_kenmerktype,
                                          fin_kenmerk_systeem,
                                          fin_kenmerk_lengte,
                                          fin_kenmerk_dec,
                                          fin_kenmerk_nmin,
                                          fin_kenmerk_nmax,
                                          fin_kenmerk_dimensie,
                                          fin_kenmerk_type,
                                          fin_kenmerk_verplicht,
                                          fin_kenmerk_volgnr,
                                          fin_kenmerk_groep,
                                          fin_kenmerk_default,
                                          fin_kenmerk_verwijder,
                                          fin_kenmerk_toonbaar,
                                          fin_kenmerk_uniek,
                                          fin_kenmerk_hint,
                                          fin_kenmerk_regexp,
                                          fin_kenmerk_show_expr,
                                          fin_kenmerk_code,
                                          fin_kenmerk_omschrijving
                          )
                 VALUES   (
                              rec.srtkenmerk_kenmerktype,
                              rec.srtkenmerk_systeem,
                              rec.srtkenmerk_lengte,
                              rec.srtkenmerk_dec,
                              rec.srtkenmerk_nmin,
                              rec.srtkenmerk_nmax,
                              rec.srtkenmerk_dimensie,
                              rec.kenmerk_type,
                              fac.safe_to_number (rec.kenmerk_verplicht),
                              fac.safe_to_number (rec.kenmerk_volgnummer),
                              fac.safe_to_number (rec.kenmerk_groep),
                              rec.kenmerk_default,
                              TO_DATE (rec.kenmerk_verwijder, 'YYYY-MM-DD HH24:MI:SS'),
                              fac.safe_to_number (rec.kenmerk_toonbaar),
                              fac.safe_to_number (rec.kenmerk_uniek),
                              rec.kenmerk_hint,
                              rec.kenmerk_regexp,
                              rec.kenmerk_show_expr,
                              rec.kenmerk_code,
                              rec.kenmerk_omschr
                          )
              RETURNING   fin_kenmerk_key
                   INTO   v_kenmerk_key;

              fac.imp_writelog (p_import_key, 'I', 'Kenmerk toegevoegd', v_desc || ' (' || v_kenmerk_key || ')');
           ELSE
              -- Bestaat al wel --> updaten (dat kan ook verwijderen zijn!)
              v_errormsg := 'Fout bij bijwerken kenmerk ' || v_desc;
              UPDATE   fin_kenmerk
                 SET   fin_kenmerk_kenmerktype = rec.srtkenmerk_kenmerktype,
                       fin_kenmerk_systeem = rec.srtkenmerk_systeem,
                       fin_kenmerk_lengte = rec.srtkenmerk_lengte,
                       fin_kenmerk_dec = rec.srtkenmerk_dec,
                       fin_kenmerk_nmin = rec.srtkenmerk_nmin,
                       fin_kenmerk_nmax = rec.srtkenmerk_nmax,
                       fin_kenmerk_dimensie = rec.srtkenmerk_dimensie,
                       fin_kenmerk_type = rec.kenmerk_type,
                       fin_kenmerk_verplicht = fac.safe_to_number (rec.kenmerk_verplicht),
                       fin_kenmerk_groep = fac.safe_to_number (rec.kenmerk_groep),
                       fin_kenmerk_volgnr = fac.safe_to_number (rec.kenmerk_volgnummer),
                       fin_kenmerk_default = rec.kenmerk_default,
                       fin_kenmerk_verwijder = TO_DATE (rec.kenmerk_verwijder, 'YYYY-MM-DD HH24:MI:SS'),
                       fin_kenmerk_toonbaar = fac.safe_to_number (rec.kenmerk_toonbaar),
                       fin_kenmerk_uniek = fac.safe_to_number (rec.kenmerk_uniek),
                       fin_kenmerk_hint = rec.kenmerk_hint,
                       fin_kenmerk_regexp = rec.kenmerk_regexp,
                       fin_kenmerk_show_expr = rec.kenmerk_show_expr,
                       fin_kenmerk_code = rec.kenmerk_code,
                       fin_kenmerk_omschrijving = rec.kenmerk_omschr
               WHERE       fin_kenmerk_key = v_kenmerk_key
                       AND fin_kenmerk_verwijder IS NULL;

              fac.imp_writelog (p_import_key, 'I', 'Kenmerk bijgewerkt', v_desc || ' (' || v_kenmerk_key || ')');
           END IF;



        END CASE;
     END;
  END LOOP;

  --------------------------------------------------------------------------------

  -- Als we hier uitkomen, is alles goed gegaan en kunnen we committen
  COMMIT;
-- Als er ergens een fout optreedt, dan worden alle voorgaande mutaties teruggedraaid en wordt er alleen de logging gecommit
EXCEPTION
  WHEN OTHERS
  THEN
     -- TODO: Zoiets?
     ROLLBACK;
     oracle_err_num := SQLCODE;
     oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
     v_errorhint := v_errorhint || ' {' || v_errormsg || '}';
     v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
     fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
     COMMIT;
END;
/


------------- INSPECTIEDEFINITIES -------------------
CREATE OR REPLACE PROCEDURE fac_import_inspectie (p_import_key IN NUMBER)
IS
   c_delim                          VARCHAR2 (2) := fac.import_delimiter(p_import_key);
   v_newline                        fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
   v_errormsg                       VARCHAR2 (1000);
   v_errorhint                      VARCHAR2 (1000);
   oracle_err_num                   NUMBER;
   oracle_err_mes                   VARCHAR2 (200);
   header_is_valid                  NUMBER;
   v_count_tot                      NUMBER (10);
   v_count_import                   NUMBER (10);
   v_ongeldig                       NUMBER (1);
   v_aanduiding                     VARCHAR2 (200);
   -- De importvelden
   v_ins_discipline_omschrijving    VARCHAR2 (255);                                          -- C60
   v_ins_srtgroep_omschrijving      VARCHAR2 (255);                                          -- C60
   v_ins_srtdeel_code               VARCHAR2 (255);                                          -- C10
   v_ins_srtcontrole_omschrijving   VARCHAR2 (255);                                          -- C60
   v_ins_srtcontrole_info           VARCHAR2 (1000);                                           -- C320
   v_ins_srtcontrole_periode        VARCHAR2 (255);                                          -- N6,2
   v_ins_srtcontrole_mode                   VARCHAR2 (255);                                                                                    -- N1: 0=moment-modus of 1=interval-modus
   v_ins_srtcontrole_eenheid                VARCHAR2 (255);                                                                                    -- N1: 0=uurlijks, 1=dagelijks, 2=wekelijk, 3=maandelijk, 4=jaarlijks, null=niet
   v_ins_srtcontrole_bits                   VARCHAR2 (255);                                                                                    -- N4: details, afhankelijk van de mode (mag best null zijn)

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

   v_count_tot := 0;
   v_count_import := 0;
   header_is_valid := 0;
   COMMIT;

   FOR rec1 IN c1
   LOOP
       BEGIN
           v_newline := rec1.fac_imp_file_line;
           v_errormsg := 'Fout opvragen te importeren rij';
           v_aanduiding := '';
           v_ongeldig := 0;
           -- Lees alle veldwaarden
           fac.imp_getfield (v_newline, c_delim, v_ins_discipline_omschrijving);
           fac.imp_getfield (v_newline, c_delim, v_ins_srtgroep_omschrijving);
           fac.imp_getfield (v_newline, c_delim, v_ins_srtdeel_code);
           fac.imp_getfield (v_newline, c_delim, v_ins_srtcontrole_omschrijving);
           fac.imp_getfield (v_newline, c_delim, v_ins_srtcontrole_info);
           fac.imp_getfield (v_newline, c_delim, v_ins_srtcontrole_periode);
           fac.imp_getfield (v_newline, c_delim, v_ins_srtcontrole_eenheid);
           fac.imp_getfield (v_newline, c_delim, v_ins_srtcontrole_mode);
           fac.imp_getfield (v_newline, c_delim, v_ins_srtcontrole_bits);

           v_aanduiding :=
                  '|'
               || v_ins_discipline_omschrijving
               || '|'
               || v_ins_srtgroep_omschrijving
               || '|'
               || v_ins_srtdeel_code
               || '|'
               || v_ins_srtcontrole_omschrijving
               || '| ';

           -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
           -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
           -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
           IF (header_is_valid = 0)
           THEN
               IF     UPPER (v_ins_discipline_omschrijving) = 'DISCIPLINEOMSCHRIJVING'
                  AND UPPER (v_ins_srtgroep_omschrijving) = 'GROEPSOORTOMSCHRIJVING'
                  AND UPPER (v_ins_srtdeel_code) = 'OBJECTSOORTCODE'
                  AND UPPER (v_ins_srtcontrole_omschrijving) = 'CONTROLE OMSCHRIJVING'
                  AND UPPER (v_ins_srtcontrole_info) = 'CONTROLE INFORMATIE'
                  AND UPPER (v_ins_srtcontrole_periode) = 'CONTROLE PERIODE'
                  AND UPPER (v_ins_srtcontrole_eenheid) = 'EENHEID'
                  AND UPPER (v_ins_srtcontrole_mode) = 'MODE'
               THEN
                   header_is_valid := 1;
               END IF;
           ELSE
               v_count_tot := v_count_tot + 1;
               -- Controleer alle veldwaarden
               v_ins_discipline_omschrijving := TRIM (v_ins_discipline_omschrijving);

               IF LENGTH (v_ins_discipline_omschrijving) > 60
               THEN
                   v_ins_discipline_omschrijving :=
                       SUBSTR (TRIM (v_ins_discipline_omschrijving), 1, 60);
                   fac.imp_writelog (
                       p_import_key,
                       'W',
                       v_aanduiding,
                          'Disciplineomschrijving wordt afgebroken tot ['
                       || v_ins_discipline_omschrijving
                       || ']');
               END IF;

               --
               v_ins_srtgroep_omschrijving := TRIM (v_ins_srtgroep_omschrijving);

               IF LENGTH (v_ins_srtgroep_omschrijving) > 60
               THEN
                   v_ins_srtgroep_omschrijving :=
                       SUBSTR (TRIM (v_ins_srtgroep_omschrijving), 1, 60);
                   fac.imp_writelog (
                       p_import_key,
                       'W',
                       v_aanduiding,
                          'Groepsoortomschrijving wordt afgebroken tot ['
                       || v_ins_srtgroep_omschrijving
                       || ']');
               END IF;

               --
               v_ins_srtdeel_code := TRIM (v_ins_srtdeel_code);

               IF LENGTH (v_ins_srtdeel_code) > 10
               THEN
                   v_ins_srtdeel_code := SUBSTR (TRIM (v_ins_srtdeel_code), 1, 10);
                   fac.imp_writelog (
                       p_import_key,
                       'W',
                       v_aanduiding,
                       'Objectsoortcode wordt afgebroken tot [' || v_ins_srtdeel_code || ']');
               END IF;

               --
               v_ins_srtcontrole_omschrijving := TRIM (v_ins_srtcontrole_omschrijving);

               IF LENGTH (v_ins_srtcontrole_omschrijving) > 60
               THEN
                   v_ins_srtcontrole_omschrijving :=
                       SUBSTR (TRIM (v_ins_srtcontrole_omschrijving), 1, 60);
                   fac.imp_writelog (
                       p_import_key,
                       'W',
                       v_aanduiding,
                          'Controle omschrijving wordt afgebroken tot ['
                       || v_ins_srtcontrole_omschrijving
                       || ']');
               END IF;

               --
               v_ins_srtcontrole_info := TRIM (v_ins_srtcontrole_info);

               IF LENGTH (v_ins_srtcontrole_info) > 320
               THEN
                   v_ins_srtcontrole_info := SUBSTR (TRIM (v_ins_srtcontrole_info), 1, 320);
                   fac.imp_writelog (
                       p_import_key,
                       'W',
                       v_aanduiding,
                          'Controle informatie wordt afgebroken tot ['
                       || v_ins_srtcontrole_info
                       || ']');
               END IF;

               --
               v_ins_srtcontrole_periode := TRIM (v_ins_srtcontrole_periode);

               IF LENGTH (v_ins_srtcontrole_periode) > 7
               THEN
                   v_ins_srtcontrole_periode := SUBSTR (TRIM (v_ins_srtcontrole_periode), 1, 7);
                   fac.imp_writelog (
                       p_import_key,
                       'W',
                       v_aanduiding,
                          'Controle periode wordt afgebroken tot ['
                       || v_ins_srtcontrole_periode
                       || ']');
               END IF;


               --
               v_ins_srtcontrole_eenheid := TRIM (v_ins_srtcontrole_eenheid);

               IF LENGTH (v_ins_srtcontrole_eenheid) > 1
               THEN
                   v_ins_srtcontrole_eenheid := SUBSTR (TRIM (v_ins_srtcontrole_eenheid), 1, 1);
                   fac.imp_writelog (
                       p_import_key,
                       'W',
                       v_aanduiding,
                          'Controle eenheid wordt afgebroken tot ['
                       || v_ins_srtcontrole_eenheid
                       || ']');
               END IF;


               --
               v_ins_srtcontrole_mode := TRIM (v_ins_srtcontrole_mode);

               IF LENGTH (v_ins_srtcontrole_mode) > 1
               THEN
                   v_ins_srtcontrole_mode := SUBSTR (TRIM (v_ins_srtcontrole_mode), 1, 1);
                   fac.imp_writelog (
                       p_import_key,
                       'W',
                       v_aanduiding,
                          'Controle Mode wordt afgebroken tot ['
                       || v_ins_srtcontrole_mode
                       || ']');
               END IF;

               --
               v_ins_srtcontrole_bits := TRIM (v_ins_srtcontrole_bits);

               IF LENGTH (v_ins_srtcontrole_bits) > 4
               THEN
                   v_ins_srtcontrole_bits := SUBSTR (TRIM (v_ins_srtcontrole_bits), 1, 4);
                   fac.imp_writelog (
                       p_import_key,
                       'W',
                       v_aanduiding,
                          'Controle Bits wordt afgebroken tot ['
                       || v_ins_srtcontrole_bits
                       || ']');
               END IF;


               -- Insert geformatteerde import record
               IF v_ongeldig = 0
               THEN
                   BEGIN
                       INSERT INTO fac_imp_inspectie (ins_discipline_omschrijving,
                                                      ins_srtgroep_omschrijving,
                                                      ins_srtdeel_code,
                                                      ins_srtcontrole_omschrijving,
                                                      ins_srtcontrole_info,
                                                      ins_srtcontrole_periode,
                                                      ins_srtcontrole_eenheid,
                                                                        ins_srtcontrole_mode,
                                                                        ins_srtcontrole_bits)
                           VALUES (v_ins_discipline_omschrijving,
                                   v_ins_srtgroep_omschrijving,
                                   v_ins_srtdeel_code,
                                   v_ins_srtcontrole_omschrijving,
                                   v_ins_srtcontrole_info,
                                   v_ins_srtcontrole_periode,
                                   v_ins_srtcontrole_eenheid,
                                   v_ins_srtcontrole_mode,
                                   v_ins_srtcontrole_bits
                                   );

                       v_count_import := v_count_import + 1;
                   EXCEPTION
                       WHEN OTHERS
                       THEN
                           oracle_err_num := SQLCODE;
                           oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                           v_errormsg :=
                               'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                           fac.imp_writelog (
                               p_import_key,
                               'E',
                               v_aanduiding || v_errormsg,
                               'Fout bij toevoegen regel aan importtabel FAC_IMP_INSPECTIE.');
                   END;
               END IF;
           END IF;
       END;
   END LOOP;

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

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

CREATE OR REPLACE PROCEDURE fac_update_inspectie (p_import_key IN NUMBER)
AS
   v_errormsg                 VARCHAR2 (1000);
   oracle_err_num             NUMBER;
   oracle_err_mes             VARCHAR2 (200);
   header_is_valid            NUMBER;
   v_count_error              NUMBER (10);
   v_count                    NUMBER (10);
   v_count_tot                NUMBER (10);
   v_count_import             NUMBER (10);
   v_ongeldig                 NUMBER (1);
   v_aanduiding               VARCHAR2 (200);
   v_errorhint                VARCHAR2 (1000);

   v_ins_srtinstallatie_key   NUMBER (10);
   v_ins_srtcontrole_niveau   VARCHAR (1);

   v_week_bits                NUMBER (10);
   v_maand_bits               NUMBER (10);

   CURSOR c_inspecties
   IS
       SELECT * FROM fac_imp_inspectie;
-- MAIN
BEGIN
   FOR rec_ins IN c_inspecties
   LOOP
       BEGIN
           v_count_tot := v_count_tot + 1;
           v_aanduiding :=
                  rec_ins.ins_discipline_omschrijving
               || ' - '
               || rec_ins.ins_srtgroep_omschrijving
               || '-'
               || rec_ins.ins_srtdeel_code;
           v_errorhint := 'Fout bij bepalen discipline';

           IF rec_ins.ins_discipline_omschrijving IS NULL
           THEN
               fac.imp_writelog (
                   p_import_key,
                   'E',
                   v_aanduiding,
                   'Discipline mag niet leeg zijn: inspectie wordt niet toegevoegd.');
           ELSE
               SELECT ins_discipline_key, 'D'
                 INTO v_ins_srtinstallatie_key, v_ins_srtcontrole_niveau
                 FROM ins_tab_discipline
                WHERE UPPER (ins_discipline_omschrijving) =
                          UPPER (rec_ins.ins_discipline_omschrijving)
                      AND ins_discipline_module = 'INS'
                      AND ins_discipline_verwijder IS NULL;

               IF rec_ins.ins_srtgroep_omschrijving IS NOT NULL
               THEN
                   SELECT ins_srtgroep_key, 'G'
                     INTO v_ins_srtinstallatie_key, v_ins_srtcontrole_niveau
                     FROM ins_srtgroep
                    WHERE UPPER (ins_srtgroep_omschrijving) =
                              UPPER (rec_ins.ins_srtgroep_omschrijving)
                          AND ins_srtgroep_module = 'INS'
                          AND ins_srtgroep_verwijder IS NULL
                          AND ins_discipline_key = v_ins_srtinstallatie_key;

                   IF rec_ins.ins_srtdeel_code IS NOT NULL
                   THEN
                       SELECT ins_srtdeel_key, 'S'
                         INTO v_ins_srtinstallatie_key, v_ins_srtcontrole_niveau
                         FROM ins_srtdeel
                        WHERE     UPPER (ins_srtdeel_code) = UPPER (rec_ins.ins_srtdeel_code)
                              AND ins_srtdeel_module = 'INS'
                              AND ins_srtdeel_verwijder IS NULL
                              AND ins_srtgroep_key = v_ins_srtinstallatie_key;
                   END IF;
               END IF;

               -- Alleen de gezette bits van de dagen van de week.
               SELECT COALESCE(BITAND(rec_ins.ins_srtcontrole_bits, 127), 0)
                 INTO v_week_bits
                 FROM DUAL;
               -- Alleen de gezette bits van de y-ste xxxdag van de maand.
               SELECT COALESCE(BITAND(rec_ins.ins_srtcontrole_bits, 256 + 512 + 1024) / 256, 0)
                 INTO v_maand_bits
                FROM DUAL;

               IF rec_ins.ins_srtcontrole_omschrijving IS NOT NULL AND
                  rec_ins.ins_srtcontrole_periode IS NOT NULL AND
                  ((rec_ins.ins_srtcontrole_eenheid = 0)
                 OR (rec_ins.ins_srtcontrole_eenheid > 0 AND MOD(rec_ins.ins_srtcontrole_periode, 1) = 0)) AND
                  rec_ins.ins_srtcontrole_eenheid IS NOT NULL AND
                  rec_ins.ins_srtcontrole_mode IS NOT NULL AND
                  (rec_ins.ins_srtcontrole_mode = 1 OR (rec_ins.ins_srtcontrole_mode = 0 AND v_week_bits > 0 AND v_maand_bits > 0))
               THEN
                   INSERT INTO ins_srtcontrole (ins_srtinstallatie_key,
                                                ins_srtcontrole_niveau,
                                                ins_srtcontrole_omschrijving,
                                                ins_srtcontrole_info,
                                                ins_srtcontrole_periode,
                                                ins_srtcontrole_eenheid,
                                                ins_srtcontrole_mode,
                                                ins_srtcontrole_bits,
                                                ctr_discipline_key
                                                )
                       VALUES (v_ins_srtinstallatie_key,
                               v_ins_srtcontrole_niveau,
                               rec_ins.ins_srtcontrole_omschrijving,
                               rec_ins.ins_srtcontrole_info,
                               rec_ins.ins_srtcontrole_periode,
                               rec_ins.ins_srtcontrole_eenheid,
                               rec_ins.ins_srtcontrole_mode,
                               rec_ins.ins_srtcontrole_bits,
                               (SELECT MIN(ctr_ins_discipline_key) -- Compatible 2016.1, altijd controle
                                  FROM ctr_disc_params
                                 WHERE ctr_disc_params_controle_type = 1)
                               );
               ELSE
                   IF rec_ins.ins_srtcontrole_mode = 0 AND (v_week_bits = 0 OR v_maand_bits = 0)
                   THEN v_errorhint := 'Het verplichte veld "Moment" is niet (goed) ingevuld: inspectie wordt niet toegevoegd.';
                   ELSIF rec_ins.ins_srtcontrole_eenheid > 0 AND MOD(rec_ins.ins_srtcontrole_periode, 1) > 0
                   THEN v_errorhint := 'Periode moet een geheel getal zijn voor dagelijkse, wekelijkse, maandelijkse en jaarlijkse taken: inspectie wordt niet toegevoegd.';
                   ELSE v_errorhint := 'Één of meerdere van de verplichte velden "Omschrijving", "Period", "Eenheid" of "Mode" zijn niet ingevuld: inspectie wordt niet toegevoegd.';
                   END IF;
                   fac.imp_writelog (
                       p_import_key,
                       'E',
                       v_aanduiding,
                       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 := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || v_errormsg,
                                 v_errorhint);
               COMMIT;
       END;
   END LOOP;
EXCEPTION
   WHEN OTHERS
   THEN
       oracle_err_num := SQLCODE;
       oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
       v_errormsg :=
           v_errormsg || 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
       fac.imp_writelog (p_import_key,
                         'E',
                         'Importproces inspecties afgebroken!',
                         v_errormsg);
END fac_update_inspectie;
/

-- AAIT#25547 - FAQ: Verbeteren kennisbank
CREATE OR REPLACE PROCEDURE fac_import_faq (p_import_key IN NUMBER)
IS
  c_delim                            VARCHAR2 (2) := fac.import_delimiter(p_import_key);
  v_newline                          fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
  v_errormsg                         VARCHAR2 (100);
  oracle_err_num                     NUMBER;
  oracle_err_mes                     VARCHAR2 (200);
  header_is_valid                    NUMBER;
  v_count_tot                        NUMBER (10);
  v_count_import                     NUMBER (10);
  v_ongeldig                         NUMBER (1);
  v_aanduiding                       VARCHAR (900);
  -- De importvelden
  v_fac_faq_question                 VARCHAR2 (4000);                        -- C4000 (Voor import tot  500 beperkt)
  v_fac_faq_answer                   VARCHAR2 (4000);                        -- C4000
  v_fac_faq_answer2                  VARCHAR2 (4000);                        -- C4000
  v_fac_faq_level                    VARCHAR2 (255);                         -- C1
  v_ins_discipline_key               VARCHAR2 (255);                         -- N10
  v_mld_stdmelding_key               VARCHAR2 (255);                         -- N10
  v_fac_faq_source                   VARCHAR2 (255);                         -- C60
  v_fac_faq_url                      VARCHAR2 (255);                         -- C250
  v_fac_faq_datum                    VARCHAR2 (255);                         -- DATE
  v_fac_faq_lang                     VARCHAR2 (255);                         -- C3
  v_fac_faq_hint                     VARCHAR2 (1000);                        -- C1000 (Voor import tot 1000 beperkt)
  v_fac_faq_vervaldatum              VARCHAR2 (255);                         -- DATE
  v_faq_discipline_omschrijving      VARCHAR2 (255);                         -- N10
  v_fac_faq_displaymode              VARCHAR2 (255);                         -- N3
  -- Overig:
  v_ins_discipline_key2              VARCHAR2 (255);                         -- N10
  v_mld_stdmelding_key2              VARCHAR2 (255);                         -- N10
  v_ins_discipline_key_n             NUMBER (10);                            -- N10
  v_mld_stdmelding_key_n             NUMBER (10);                            -- N10
  v_fac_faq_displaymode_n            NUMBER (3);                             -- N3
  v_fac_faq_datum_d                  DATE;                                   -- DATE
  v_fac_faq_datum_v                  DATE;                                   -- DATE

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

  COMMIT;

  v_count_tot := 0;
  v_count_import := 0;
  header_is_valid := 0;

  FOR rec1 IN c1
  LOOP
     BEGIN
        v_newline := rec1.fac_imp_file_line;
        v_errormsg := 'Fout opvragen te importeren rij';
        v_aanduiding := '';
        v_ongeldig := 0;
        -- Lees alle veldwaarden
        fac.imp_getfield (v_newline, c_delim, v_fac_faq_question);
        fac.imp_getfield (v_newline, c_delim, v_fac_faq_answer);
        fac.imp_getfield (v_newline, c_delim, v_fac_faq_answer2);
        fac.imp_getfield (v_newline, c_delim, v_fac_faq_level);
        fac.imp_getfield (v_newline, c_delim, v_ins_discipline_key);
        fac.imp_getfield (v_newline, c_delim, v_mld_stdmelding_key);
        fac.imp_getfield (v_newline, c_delim, v_fac_faq_source);
        fac.imp_getfield (v_newline, c_delim, v_fac_faq_url);
        fac.imp_getfield (v_newline, c_delim, v_fac_faq_datum);
        fac.imp_getfield (v_newline, c_delim, v_fac_faq_lang);
        fac.imp_getfield (v_newline, c_delim, v_fac_faq_hint);
        fac.imp_getfield (v_newline, c_delim, v_fac_faq_vervaldatum);
        fac.imp_getfield (v_newline, c_delim, v_faq_discipline_omschrijving);
        fac.imp_getfield (v_newline, c_delim, v_fac_faq_displaymode);

        v_aanduiding := '['
                     || SUBSTR (v_fac_faq_question, 1, 500)
                     || '|'
                     || v_ins_discipline_key
                     || '|'
                     || v_mld_stdmelding_key
                     || '] ';

        -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
        -- de juiste kolomkop.
        -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
        IF (header_is_valid = 0)
        THEN
           IF UPPER (v_fac_faq_question) LIKE 'VRAAG%'
              AND UPPER (v_fac_faq_answer) LIKE 'ANTWOORD%'
              AND UPPER (v_fac_faq_answer2) LIKE 'MEER ANTWOORD%'
              AND UPPER (v_fac_faq_level) = 'ZICHTBAAR VOOR'
              AND UPPER (v_ins_discipline_key) = 'VAKGROEP'
              AND UPPER (v_mld_stdmelding_key) = 'MELDING'
              AND UPPER (v_fac_faq_source) = 'OORSPRONG'
              AND UPPER (v_fac_faq_url) LIKE 'MEER INFO%'
              AND UPPER (v_fac_faq_datum) = 'PUBLICATIEDATUM'
              AND UPPER (v_fac_faq_lang) = 'TAAL'
              AND UPPER (v_fac_faq_hint) = 'HINT'
              AND UPPER (v_fac_faq_vervaldatum) = 'VERVALDATUM'
              AND UPPER (v_faq_discipline_omschrijving) = 'CATALOGUSNAAM'
              AND UPPER (v_fac_faq_displaymode) = 'DISPLAYMODE'
           THEN
              header_is_valid := 1;
           END IF;
        ELSE
           v_count_tot := v_count_tot + 1;
           -- Controleer alle veldwaarden
           v_errormsg := 'Vraag ongeldig. Vraag heeft geen waarde of is langer dan 500 tekens';
           v_fac_faq_question := TRIM (v_fac_faq_question);

           IF v_fac_faq_question IS NULL OR LENGTH (v_fac_faq_question) > 500 -- Import beperking. In fac_faq tabel is dit 4000
           THEN
              v_ongeldig := 1;
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Regel wordt overgeslagen!');
           END IF;

           --
           v_errormsg := 'Antwoord ongeldig. Antwoord heeft geen waarde of is langer dan 4000 tekens';
           v_fac_faq_answer := TRIM (v_fac_faq_answer);

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

           --
           v_errormsg := 'Meer antwoord ongeldig. Waarde is langer dan 4000 tekens';
           v_fac_faq_answer2 := TRIM(v_fac_faq_answer2);

           IF LENGTH (v_fac_faq_answer2) > 4000
           THEN
              v_ongeldig := 1;
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Regel wordt overgeslagen!');
           END IF;

           --
           v_errormsg := 'Zichtbaar voor ongeldig';
           v_fac_faq_level := TRIM (v_fac_faq_level);

           IF v_fac_faq_level IS NULL OR
              UPPER(v_fac_faq_level) NOT IN ('ZELFSERVICE', 'PROFESSIONALS', 'BEIDE')
           THEN
              v_ongeldig := 1;
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || '|' || v_fac_faq_level || '|' || v_errormsg,
                                'Regel wordt overgeslagen!');
           END IF;

           --
           v_errormsg := 'Vakgroep (MLD Discipline) ongeldig';
           v_ins_discipline_key := LTRIM (RTRIM (v_ins_discipline_key));
           v_ins_discipline_key_n := NULL;

           IF LENGTH(v_ins_discipline_key) != 0
           THEN
              IF fac.safe_to_number (v_ins_discipline_key) IS NOT NULL
              THEN
                 v_ins_discipline_key_n := fac.safe_to_number (v_ins_discipline_key);
                 BEGIN
                    SELECT ins_discipline_key
                      INTO v_ins_discipline_key2
                      FROM ins_tab_discipline
                     WHERE ins_discipline_key = v_ins_discipline_key_n
                           AND ins_discipline_verwijder IS NULL;
                 EXCEPTION
                    WHEN NO_DATA_FOUND
                    THEN
                       fac.imp_writelog (p_import_key,
                                         'I',
                                         v_aanduiding,
                                         'Vakgroep (MLD Discipline) is nieuw'
                                        );
                 END;
              ELSE
                 fac.imp_writelog (p_import_key,
                                   'W',
                                   v_aanduiding || v_errormsg,
                                   'Regel wordt overgeslagen!'
                                  );
                 v_ongeldig := 1;
              END IF;
           END IF;

           --
           v_errormsg := 'Melding ongeldig';
           v_mld_stdmelding_key := LTRIM (RTRIM (v_mld_stdmelding_key));
           v_mld_stdmelding_key_n := NULL;

           IF LENGTH(v_mld_stdmelding_key) != 0
           THEN
              IF fac.safe_to_number (v_mld_stdmelding_key) IS NOT NULL
              THEN
                 v_mld_stdmelding_key_n := fac.safe_to_number (v_mld_stdmelding_key);
                 BEGIN
                    SELECT mld_stdmelding_key
                      INTO v_mld_stdmelding_key2
                      FROM mld_stdmelding
                     WHERE mld_stdmelding_key = v_mld_stdmelding_key_n
                           AND mld_stdmelding_verwijder IS NULL;
                 EXCEPTION
                    WHEN NO_DATA_FOUND
                    THEN
                       fac.imp_writelog (p_import_key,
                                         'I',
                                         v_aanduiding,
                                         'Melding is nieuw'
                                        );
                 END;
              ELSE
                 fac.imp_writelog (p_import_key,
                                   'W',
                                   v_aanduiding || v_errormsg,
                                   'Regel wordt overgeslagen!'
                                  );
                 v_ongeldig := 1;
              END IF;
           END IF;

           --
           v_errormsg := 'Oorsprong ongeldig. Oorsprong is langer als 60 tekens';
           v_fac_faq_source := TRIM (v_fac_faq_source);

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

           --
           v_errormsg := 'Meer info ongeldig. Meer info is langer als 250 tekens';
           v_fac_faq_url := TRIM (v_fac_faq_url);

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

           --
           v_errormsg := 'Publicatiedatum ongeldig. Formaat datum is ddmmyyyy';
           v_fac_faq_datum := TRIM (v_fac_faq_datum);
           v_fac_faq_datum_d := NULL;

           IF v_fac_faq_datum IS NOT NULL AND fac.safe_to_date (v_fac_faq_datum, 'dd-mm-yyyy') IS NULL
           THEN
              v_ongeldig := 1;
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Regel wordt overgeslagen!');
           ELSE
              v_fac_faq_datum_d := fac.safe_to_date (v_fac_faq_datum, 'dd-mm-yyyy');
           END IF;

           --
           v_errormsg := 'Taal ongeldig. Taal is langer als 3 tekens';
           v_fac_faq_lang := TRIM (v_fac_faq_lang);

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

           --
           v_errormsg := 'Hint ongeldig. Hint heeft geen waarde of is langer als 500 tekens';
           v_fac_faq_hint := TRIM (v_fac_faq_hint);

           IF v_fac_faq_hint IS NOT NULL AND LENGTH (v_fac_faq_hint) > 500 -- Import beperking. In fac_faq tabel is dit 1000
           THEN
              v_ongeldig := 1;
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Regel wordt overgeslagen!');
           END IF;

           --
           v_errormsg := 'Vervaldatum ongeldig. Formaat datum is ddmmyyyy';
           v_fac_faq_vervaldatum := TRIM (v_fac_faq_vervaldatum);
           v_fac_faq_datum_v := NULL;
           IF v_fac_faq_vervaldatum IS NOT NULL AND fac.safe_to_date (v_fac_faq_vervaldatum, 'dd-mm-yyyy') IS NULL
           THEN
              v_ongeldig := 1;
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Regel wordt overgeslagen!');
           ELSE
              v_fac_faq_datum_v := fac.safe_to_date (v_fac_faq_vervaldatum, 'dd-mm-yyyy');
           END IF;

           --
           v_errormsg := 'Catalogusnaam (FAQ Discipline) ongeldig';
           v_faq_discipline_omschrijving := TRIM (v_faq_discipline_omschrijving);

           IF LENGTH (v_faq_discipline_omschrijving) > 60
           THEN
              v_faq_discipline_omschrijving := SUBSTR (TRIM (v_faq_discipline_omschrijving), 1, 60);
              fac.imp_writelog (
                 p_import_key,
                 'W',
                 v_aanduiding || v_errormsg,
                    'Catalogusnaam wordt afgebroken tot ['
                 || v_faq_discipline_omschrijving
                 || ']'
              );
           END IF;

           --
           v_errormsg := 'Displaymode ongeldig';
           v_fac_faq_displaymode := LTRIM (RTRIM (v_fac_faq_displaymode));
           v_fac_faq_displaymode_n := 3;   -- +1=Altijd tonen melding, +2=Pop-up melding, +4=Altijd tonen opdracht, +8=Pop-up opdracht.

           IF LENGTH(v_fac_faq_displaymode) != 0
           THEN
              v_fac_faq_displaymode_n := fac.safe_to_number (v_fac_faq_displaymode);
              IF v_fac_faq_displaymode_n IS NOT NULL
              THEN
                 IF v_fac_faq_displaymode_n < 0 OR v_fac_faq_displaymode_n >= 16
                 THEN
                    fac.imp_writelog (p_import_key,
                                      'W',
                                      v_aanduiding || v_errormsg,
                                      'Regel wordt overgeslagen!'
                                     );
                    v_ongeldig := 1;
                 END IF;
              ELSE
                 v_fac_faq_displaymode_n := 3;
              END IF;
           END IF;

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

                 INSERT INTO fac_imp_faq (fac_faq_question,
                                          fac_faq_answer,
                                          fac_faq_answer2,
                                          fac_faq_level,
                                          ins_discipline_key,
                                          mld_stdmelding_key,
                                          fac_faq_source,
                                          fac_faq_url,
                                          fac_faq_datum,
                                          fac_faq_lang,
                                          fac_faq_hint,
                                          fac_faq_vervaldatum,
                                          faq_discipline_omschrijving,
                                          fac_faq_displaymode)
                   VALUES   (v_fac_faq_question,
                             v_fac_faq_answer,
                             v_fac_faq_answer2,
                             v_fac_faq_level,
                             v_ins_discipline_key_n,
                             v_mld_stdmelding_key_n,
                             v_fac_faq_source,
                             v_fac_faq_url,
                             v_fac_faq_datum_d,
                             v_fac_faq_lang,
                             v_fac_faq_hint,
                             v_fac_faq_datum_v,
                             v_faq_discipline_omschrijving,
                             v_fac_faq_displaymode_n);
                 v_count_import := v_count_import + 1;
              EXCEPTION
                 WHEN OTHERS
                 THEN
                    oracle_err_num := SQLCODE;
                    oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                    v_errormsg :=
                          v_errormsg
                       || ' ORACLE (error '
                       || oracle_err_num
                       || '/'
                       || oracle_err_mes
                       || ')';
                    fac.imp_writelog (
                       p_import_key,
                       'E',
                       v_aanduiding || v_errormsg,
                       'Fout bij toevoegen regel aan importtabel FAC_IMP_FAQ.'
                    );

                    COMMIT;
              END;
           END IF;
        END IF;
     END;
  END LOOP;

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

  COMMIT;
EXCEPTION
  WHEN OTHERS
  THEN
     oracle_err_num := SQLCODE;
     oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
     v_errormsg :=
           v_errormsg
        || ' ORACLE (error '
        || oracle_err_num
        || '/'
        || oracle_err_mes
        || ')';
     fac.imp_writelog (p_import_key,
                       'E',
                       v_aanduiding || v_errormsg,
                       'Inleesproces kennisbank afgebroken!');
END fac_import_faq;
/

-- AAIT#25547 - FAQ: Verbeteren kennisbank
CREATE OR REPLACE PROCEDURE fac_update_faq (p_import_key IN NUMBER)
AS
   v_errmes                   VARCHAR2 (900);
   oracle_err_num             NUMBER;
   oracle_err_var             VARCHAR2 (100);
   v_count                    NUMBER (10);
   v_count_tot                NUMBER (10);
   v_count_update             NUMBER (10);
   v_aanduiding               VARCHAR2 (1000);
   ccount                     NUMBER (10);
   teller                     INTEGER;
   v_fac_faq_level            NUMBER (3);
   v_ins_discipline_key       NUMBER (10);
   v_ins_stdmelding_key       NUMBER (10);
   v_fac_faq_discipline_key   NUMBER (10);
   newkey                     NUMBER (10);


   CURSOR c_kennisbankitems
   IS
       SELECT * FROM fac_imp_faq;
-- MAIN
BEGIN
   v_count_tot := 0;
   v_count_update := 0;
   teller := 0;

   FOR rec_faq IN c_kennisbankitems
   LOOP
       BEGIN
           v_count_tot := v_count_tot + 1;
           v_aanduiding :=
                  rec_faq.fac_faq_question
               || ' - '
               || rec_faq.ins_discipline_key
               || '-'
               || rec_faq.mld_stdmelding_key;

           v_errmes := 'Fout bij het toevoegen van de catalogus (FAQ ins_discipline)';
           SELECT COUNT(*)
           INTO   v_count
           FROM   ins_tab_discipline
           WHERE  ins_discipline_verwijder IS NULL
           AND    ins_discipline_module = 'FAQ'
           AND    UPPER(TRIM(ins_discipline_omschrijving)) = UPPER(TRIM(rec_faq.faq_discipline_omschrijving));

           IF (v_count = 0)
           THEN
               INSERT INTO ins_tab_discipline
                           (ins_discipline_module,
                            ins_discipline_omschrijving
                           )
                    VALUES ('FAQ',
                            TRIM(rec_faq.faq_discipline_omschrijving)
                           )
               RETURNING ins_discipline_key
               INTO v_fac_faq_discipline_key;
           ELSE
               SELECT ins_discipline_key
               INTO   v_fac_faq_discipline_key
               FROM   ins_tab_discipline
               WHERE  ins_discipline_verwijder IS NULL
               AND    ins_discipline_module = 'FAQ'
               AND    UPPER(TRIM(ins_discipline_omschrijving)) = UPPER(TRIM(rec_faq.faq_discipline_omschrijving));
           END IF;

           COMMIT;

           IF rec_faq.fac_faq_question IS NULL
           THEN
               fac.imp_writelog (
                   p_import_key,
                   'E',
                   v_aanduiding,
                   'Vraag mag niet leeg zijn: kennisbankitem wordt niet toegevoegd.');
           ELSIF rec_faq.fac_faq_answer IS NULL
           THEN
               fac.imp_writelog (
                   p_import_key,
                   'E',
                   v_aanduiding,
                   'Antwoord mag niet leeg zijn: kennisbankitem wordt niet toegevoegd.');
           ELSIF rec_faq.fac_faq_level IS NULL
           THEN
               fac.imp_writelog (
                   p_import_key,
                   'E',
                   v_aanduiding,
                   'Zichtbaar voor mag niet leeg zijn: kennisbankitem wordt niet toegevoegd.');
           ELSIF UPPER(rec_faq.fac_faq_level) NOT IN ('ZELFSERVICE', 'PROFESSIONALS', 'BEIDE')
           THEN
               fac.imp_writelog (
                   p_import_key,
                   'E',
                   v_aanduiding,
                   'Zichtbaar voor heeft geen geldige waard: kennisbankitem wordt niet toegevoegd.');
           ELSE
               v_errmes := 'Bepalen zichtbaar voor (level)';
               SELECT flevel
                 INTO v_fac_faq_level
                 FROM (SELECT 1 flevel, 'ZELFSERVICE' ftext   FROM DUAL UNION ALL
                       SELECT 2 flevel, 'PROFESSIONALS' ftext FROM DUAL UNION ALL
                       SELECT 3 flevel, 'BEIDE' ftext         FROM DUAL)
                WHERE ftext = UPPER(rec_faq.fac_faq_level);

               v_errmes := 'Bepalen of de vakgroep (MLD ins_discipline) bestaat';
               IF rec_faq.ins_discipline_key IS NOT NULL
               THEN
                   SELECT ins_discipline_key
                     INTO v_ins_discipline_key
                     FROM ins_tab_discipline
                    WHERE ins_discipline_key = rec_faq.ins_discipline_key
                      AND ins_discipline_verwijder IS NULL;
               END IF;

               v_errmes := 'Bepalen of de melding (mld_stdmelding) bestaat';
               IF rec_faq.mld_stdmelding_key IS NOT NULL
               THEN
                   SELECT mld_stdmelding_key
                     INTO v_ins_stdmelding_key
                     FROM mld_stdmelding
                    WHERE mld_stdmelding_key = rec_faq.mld_stdmelding_key
                      AND mld_ins_discipline_key = rec_faq.ins_discipline_key
                      AND mld_stdmelding_verwijder IS NULL;
               END IF;

               v_errmes := 'Kijken of kennisbankitem bestaat';
               SELECT COUNT (*)
                 INTO ccount
                 FROM fac_faq f
                    , mld_stdmeldingfaq m
                WHERE f.fac_faq_key = m.fac_faq_key(+)
                  AND TRIM (UPPER (f.fac_faq_question)) = TRIM (UPPER (rec_faq.fac_faq_question))
                  AND ((m.ins_discipline_key = rec_faq.ins_discipline_key) OR ((m.ins_discipline_key IS NULL) AND (rec_faq.ins_discipline_key IS NULL)))
                  AND ((m.mld_stdmelding_key = rec_faq.mld_stdmelding_key) OR ((m.mld_stdmelding_key IS NULL) AND (rec_faq.mld_stdmelding_key IS NULL)));

               IF ccount = 0
               THEN
                  v_errmes := 'Toevoegen kennisbankitem fac_faq'
                           || ' (vraag = '
                           || SUBSTR(rec_faq.fac_faq_question, 1, 100)
                           || '| antwoord = '
                           || SUBSTR(rec_faq.fac_faq_answer, 1, 100)
                           || '| regel'
                           || v_count_tot
                           || ')';

                  INSERT INTO fac_faq
                              (fac_faq_question,
                               fac_faq_answer,
                               fac_faq_answer2,
                               fac_faq_level,
                               fac_faq_source,
                               fac_faq_url,
                               fac_faq_datum,
                               fac_faq_lang,
                               fac_faq_hint,
                               fac_faq_vervaldatum,
                               faq_ins_discipline_key,
                               fac_faq_displaymode
                              )
                       VALUES (rec_faq.fac_faq_question,
                               rec_faq.fac_faq_answer,
                               rec_faq.fac_faq_answer2,
                               v_fac_faq_level,
                               rec_faq.fac_faq_source,
                               rec_faq.fac_faq_url,
                               rec_faq.fac_faq_datum,
                               rec_faq.fac_faq_lang,
                               rec_faq.fac_faq_hint,
                               rec_faq.fac_faq_vervaldatum,
                               v_fac_faq_discipline_key,
                               rec_faq.fac_faq_displaymode
                              )
                    RETURNING fac_faq_key
                    INTO newkey;

                  IF rec_faq.ins_discipline_key IS NOT NULL
                  THEN
                     INSERT INTO mld_stdmeldingfaq
                                (ins_discipline_key,
                                 mld_stdmelding_key,
                                 fac_faq_key
                                )
                         VALUES (rec_faq.ins_discipline_key,
                                 rec_faq.mld_stdmelding_key,
                                 newkey
                                );
                  END IF;

                  v_count_update := v_count_update + 1;
               END IF;

               COMMIT;
           END IF;
       EXCEPTION
           WHEN OTHERS
           THEN
              oracle_err_num := SQLCODE;
              oracle_err_var := SUBSTR (SQLERRM, 1, 100);
              fac.imp_writelog
                     (p_import_key,
                      'W',
                         'Kennisbankitem kan niet worden weggeschreven ['
                      || rec_faq.fac_faq_question
                      || ']',
                      v_errmes || ' Oracle fout: ' || oracle_err_var
                     );
              COMMIT;                                          -- tbv logging
       END;
   END LOOP;

   fac.imp_writelog (
      p_import_key,
      'S',
      'Kennisbank/aantal toegevoegde importregels: '
      || TO_CHAR (v_count_update),
      ''
   );
   fac.imp_writelog (
      p_import_key,
      'S',
      'Kennisbank/aantal ongeldige niet toegevoegde importregels: '
      || TO_CHAR (v_count_tot - v_count_update),
      ''
   );

EXCEPTION
   WHEN OTHERS
   THEN
       oracle_err_num := SQLCODE;
       oracle_err_var := SUBSTR (SQLERRM, 1, 150);
       v_errmes :=
           v_errmes || 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_var || ')';
       fac.imp_writelog (p_import_key,
                         'E',
                         'Importproces kennisbank afgebroken!',
                         v_errmes);
END fac_update_faq;
/

-- FSN#25952 Contractenimport
CREATE OR REPLACE PROCEDURE fac_import_cnt (p_import_key IN NUMBER)
AS
  c_delim                  VARCHAR2 (2) := fac.import_delimiter(p_import_key);
  v_newline                fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
  v_errormsg               VARCHAR2 (1000);
  v_errorhint              VARCHAR2 (1000);
  oracle_err_num           NUMBER;
  oracle_err_mes           VARCHAR2 (200);
  header_is_valid          NUMBER;
  v_count_tot              NUMBER (10);
  v_count_imp              NUMBER (10);
  v_ongeldig               NUMBER (1);
  v_aanduiding             VARCHAR2 (200);
  v_cnt_kenmerk_key1       VARCHAR2 (255);
  v_cnt_kenmerk_key2       VARCHAR2 (255);
  v_cnt_kenmerk_key3       VARCHAR2 (255);
  v_cnt_kenmerk_key4       VARCHAR2 (255);
  v_cnt_kenmerk_key5       VARCHAR2 (255);
  v_cnt_kenmerk_key6       VARCHAR2 (255);
  v_cnt_kenmerk_key7       VARCHAR2 (255);
  v_cnt_kenmerk_key8       VARCHAR2 (255);
  v_cnt_kenmerk_key9       VARCHAR2 (255);
  v_cnt_kenmerk_key10      VARCHAR2 (255);
  v_cnt_kenmerk_key11      VARCHAR2 (255);
  v_cnt_kenmerk_key12      VARCHAR2 (255);
  v_cnt_kenmerk_key13      VARCHAR2 (255);
  v_cnt_kenmerk_key14      VARCHAR2 (255);
  v_cnt_kenmerk_key15      VARCHAR2 (255);
  v_cnt_kenmerk_key16      VARCHAR2 (255);
  v_cnt_kenmerk_key17      VARCHAR2 (255);
  v_cnt_kenmerk_key18      VARCHAR2 (255);
  v_cnt_kenmerk_key19      VARCHAR2 (255);
  v_cnt_kenmerk_key20      VARCHAR2 (255);
  v_cnt_kenmerk_key21      VARCHAR2 (255);
  v_cnt_kenmerk_key22      VARCHAR2 (255);
  v_cnt_kenmerk_key23      VARCHAR2 (255);
  v_cnt_kenmerk_key24      VARCHAR2 (255);
  v_cnt_kenmerk_key25      VARCHAR2 (255);
  -- De importvelden
  v_nummer_intern          VARCHAR2 (100);      -- cnt_contract_nummer_intern
  v_nummer_extern          VARCHAR2 (100);             -- cnt_contract_nummer
  v_cnt_soort              VARCHAR2 (100);     -- ins_discipline_omschrijving
  v_beschrijving           VARCHAR2 (1000);      -- cnt_contract_omschrijving
  v_mantel_nr              VARCHAR2 (100);      -- cnt_contract_nummer_intern
  v_omschrijving           VARCHAR2 (1000);          -- cnt_contract_document
  v_versie                 VARCHAR2 (100);             -- cnt_contract_versie
  v_dienst                 VARCHAR2 (100);         -- prs_dienst_omschrijving
  v_afdeling               VARCHAR2 (100);               -- prs_afdeling_naam
  v_perslid_eig            VARCHAR2 (100);             -- prs_perslid_oslogin
  v_perslid_beh            VARCHAR2 (100);             -- prs_perslid_oslogin
  v_opmerking              VARCHAR2 (1000);         -- cnt_contract_opmerking
  v_datum_ingang           VARCHAR2 (100);
  v_d_datum_ingang         DATE;                 -- cnt_contract_looptijd_van
  v_datum_eind             VARCHAR2 (100);
  v_d_datum_eind           DATE;                 -- cnt_contract_looptijd_tot
  v_datum_opzeg            VARCHAR2 (100);
  v_d_datum_opzeg          DATE;                                -- opzegdatum
  v_datum_rappel           VARCHAR2 (100);
  v_d_datum_rappel         DATE;                               -- rappeldatum
  v_bedrijf_naam           VARCHAR2 (100); -- prs_bedrijf_naam/leverancier_nr
  v_contact_naam           VARCHAR2 (100);         -- prs_contactpersoon_naam
  v_kpn_code               VARCHAR2 (100);             -- prs_kostenplaats_nr
  v_bedrag                 VARCHAR2 (100);
  v_n_bedrag               NUMBER (11, 2);             -- cnt_contract_kosten
  v_bedrag_termijn         VARCHAR2 (100);
  v_n_bedrag_termijn       NUMBER (11, 2);      -- cnt_contract_termijnkosten
  v_uurtarief              VARCHAR2 (100);
  v_n_uurtarief            NUMBER (6, 2);             -- cnt_contract_uurloon
  v_korting                VARCHAR2 (100);
  v_n_korting              NUMBER (4, 2);             -- cnt_contract_korting
  v_gebouwcode             VARCHAR2 (100);    -- alg_locatie_code/gebouw_code
  v_verlengen              VARCHAR2 (100);         -- cnt_contract_verlenging
  v_flex1                  VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex2                  VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex3                  VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex4                  VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex5                  VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex6                  VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex7                  VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex8                  VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex9                  VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex10                 VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex11                 VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex12                 VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex13                 VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex14                 VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex15                 VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex16                 VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex17                 VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex18                 VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex19                 VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex20                 VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex21                 VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex22                 VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex23                 VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex24                 VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde
  v_flex25                 VARCHAR2 (1053);     -- cnt_kenmerkcontract_waarde

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

  -- Controleer tijdens import-fase alleen op het bestaan van een kenmerk met de meegegeven omschrijving of kenmerk key.
  -- De omschrijving (header van kolom) kan de omschrijving zijn van het kenmerksoort of het kenmerk.
  -- De omschrijving van het kenmerksoort kan namelijk overruled worden door de omschrijving van het kenmerk.
  -- Daarnaast kan hetzelfde kenmerk vaker voorkomen voor verschillende groepen.
  -- Of het kenmerksoort/kenmerk wel is gedefinieerd voor de betreffende
  -- object-discipline/groep/soort, volgt pas tijdens de update-fase)!
  --
  -- p_kw is bijvoorbeeld 'Looptijd Maximaal', 'Looptijd Maximaal|3', 1049 of 1049|3 waarbij de tweede en laatste in groep 3 zitten
  -- het resultaat is NULL (als niet gevonden) of Looptijd Maximaal|3 of 1049|3 voor kenmer_key 1049 in groep 3
  -- Als geen groep is meegegeven dan wordt 'Looptijd Maximaal|0' opgeleverd (de default groep)
  FUNCTION bepaal_kenmerk (p_kw IN VARCHAR2)
     RETURN VARCHAR
  IS
     v_kenmerk_key        NUMBER;
     v_kenmerk_groep      NUMBER;
     v_kw                 VARCHAR(250);
  BEGIN
     v_kenmerk_groep := 0;
     v_kw := p_kw;
     IF INSTR (v_kw, '|') > 1
     THEN
       v_kenmerk_groep := SUBSTR (v_kw, INSTR (v_kw, '|') + 1);
       v_kw := SUBSTR (v_kw, 1, INSTR (v_kw, '|') - 1);
     END IF;

     IF fac.safe_to_number (v_kw) IS NULL
     THEN                -- kenmerkwaarde is alfanumeriek (dus omschrijving)!
        SELECT MIN(k.cnt_kenmerk_key)
          INTO v_kenmerk_key
          FROM cnt_kenmerk k,
               cnt_srtkenmerk sk
         WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
           AND k.cnt_kenmerk_groep = v_kenmerk_groep
           AND COALESCE(UPPER(k.cnt_kenmerk_omschrijving), sk.cnt_srtkenmerk_upper) = UPPER(v_kw)
           AND sk.cnt_srtkenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B', 'V')
           AND k.cnt_kenmerk_verwijder IS NULL
           AND sk.cnt_srtkenmerk_verwijder IS NULL;
     ELSE                -- kenmerkwaarde is numeriek (dus key)!
        SELECT k.cnt_kenmerk_key
          INTO v_kenmerk_key
          FROM cnt_kenmerk k,
               cnt_srtkenmerk sk
         WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
           AND k.cnt_kenmerk_groep = v_kenmerk_groep
           AND k.cnt_kenmerk_key = fac.safe_to_number (v_kw)
           AND sk.cnt_srtkenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B', 'V')
           AND k.cnt_kenmerk_verwijder IS NULL
           AND sk.cnt_srtkenmerk_verwijder IS NULL;
     END IF;

     IF v_kenmerk_key IS NULL
     THEN
        RETURN NULL;
     ELSE
        -- Er is een kenmerksoort of kenmerk aanwezig met de omschrijving/kenmerk_key (v_kw)
        RETURN v_kw || '|' || TO_CHAR(v_kenmerk_groep);
     END IF;
  EXCEPTION
     WHEN NO_DATA_FOUND
     THEN
        IF p_kw IS NULL OR UPPER (p_kw) LIKE 'KENMERK%'
        THEN
           RETURN NULL;
        ELSE
           fac.imp_writelog (p_import_key,
                             'W',
                             'Fout bij bepalen kenmerk [' || p_kw || ']',
                             'Bestaat niet of type ongeldig');
           COMMIT;
           RETURN NULL;
        END IF;
  END;
BEGIN
  -- Eerst opruiming
  DELETE FROM   fac_imp_cnt;

  COMMIT;

  v_count_tot := 0;
  v_count_imp := 0;
  header_is_valid := 0;

  FOR rec1 IN c1
  LOOP
     BEGIN
        v_errormsg := 'Fout FETCH importregel';

        v_newline := rec1.fac_imp_file_line;
        v_errormsg := 'Fout bij opvragen importregel';
        v_aanduiding := '';
        v_ongeldig := 0;
        -- Lees alle veldwaarden
        fac.imp_getfield (v_newline, c_delim, v_nummer_intern);
        fac.imp_getfield (v_newline, c_delim, v_nummer_extern);
        fac.imp_getfield (v_newline, c_delim, v_cnt_soort);
        fac.imp_getfield (v_newline, c_delim, v_beschrijving);
        fac.imp_getfield (v_newline, c_delim, v_mantel_nr);
        fac.imp_getfield (v_newline, c_delim, v_omschrijving);
        fac.imp_getfield (v_newline, c_delim, v_versie);
        fac.imp_getfield (v_newline, c_delim, v_dienst);
        fac.imp_getfield (v_newline, c_delim, v_afdeling);
        fac.imp_getfield (v_newline, c_delim, v_perslid_eig);
        fac.imp_getfield (v_newline, c_delim, v_perslid_beh);
        fac.imp_getfield (v_newline, c_delim, v_opmerking);
        fac.imp_getfield (v_newline, c_delim, v_datum_ingang);
        fac.imp_getfield (v_newline, c_delim, v_datum_rappel);
        fac.imp_getfield (v_newline, c_delim, v_datum_opzeg);
        fac.imp_getfield (v_newline, c_delim, v_datum_eind);
        fac.imp_getfield (v_newline, c_delim, v_bedrijf_naam);
        fac.imp_getfield (v_newline, c_delim, v_contact_naam);
        fac.imp_getfield (v_newline, c_delim, v_kpn_code);
        fac.imp_getfield (v_newline, c_delim, v_bedrag);
        fac.imp_getfield (v_newline, c_delim, v_bedrag_termijn);
        fac.imp_getfield (v_newline, c_delim, v_uurtarief);
        fac.imp_getfield (v_newline, c_delim, v_korting);
        fac.imp_getfield (v_newline, c_delim, v_gebouwcode);
        fac.imp_getfield (v_newline, c_delim, v_verlengen);
        fac.imp_getfield (v_newline, c_delim, v_flex1);
        fac.imp_getfield (v_newline, c_delim, v_flex2);
        fac.imp_getfield (v_newline, c_delim, v_flex3);
        fac.imp_getfield (v_newline, c_delim, v_flex4);
        fac.imp_getfield (v_newline, c_delim, v_flex5);
        fac.imp_getfield (v_newline, c_delim, v_flex6);
        fac.imp_getfield (v_newline, c_delim, v_flex7);
        fac.imp_getfield (v_newline, c_delim, v_flex8);
        fac.imp_getfield (v_newline, c_delim, v_flex9);
        fac.imp_getfield (v_newline, c_delim, v_flex10);
        fac.imp_getfield (v_newline, c_delim, v_flex11);
        fac.imp_getfield (v_newline, c_delim, v_flex12);
        fac.imp_getfield (v_newline, c_delim, v_flex13);
        fac.imp_getfield (v_newline, c_delim, v_flex14);
        fac.imp_getfield (v_newline, c_delim, v_flex15);
        fac.imp_getfield (v_newline, c_delim, v_flex16);
        fac.imp_getfield (v_newline, c_delim, v_flex17);
        fac.imp_getfield (v_newline, c_delim, v_flex18);
        fac.imp_getfield (v_newline, c_delim, v_flex19);
        fac.imp_getfield (v_newline, c_delim, v_flex20);
        fac.imp_getfield (v_newline, c_delim, v_flex21);
        fac.imp_getfield (v_newline, c_delim, v_flex22);
        fac.imp_getfield (v_newline, c_delim, v_flex23);
        fac.imp_getfield (v_newline, c_delim, v_flex24);
        fac.imp_getfield (v_newline, c_delim, v_flex25);

        v_aanduiding := '[' || v_cnt_soort || '|' || v_nummer_intern || '] ';

        -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
        -- de juiste kolomkop. Ik controleer daarbij alle NIET-kenmerk kolommen!
        -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
        IF (header_is_valid = 0)
        THEN
           IF (    UPPER (v_nummer_intern) = 'CONTRACTNR'
               AND UPPER (v_versie) = 'VERSIE'
               AND UPPER (v_dienst) = 'DIENST'
               AND UPPER (v_verlengen) = 'VERLENGEN')
           THEN
              v_cnt_kenmerk_key1 := bepaal_kenmerk (v_flex1);
              v_cnt_kenmerk_key2 := bepaal_kenmerk (v_flex2);
              v_cnt_kenmerk_key3 := bepaal_kenmerk (v_flex3);
              v_cnt_kenmerk_key4 := bepaal_kenmerk (v_flex4);
              v_cnt_kenmerk_key5 := bepaal_kenmerk (v_flex5);
              v_cnt_kenmerk_key6 := bepaal_kenmerk (v_flex6);
              v_cnt_kenmerk_key7 := bepaal_kenmerk (v_flex7);
              v_cnt_kenmerk_key8 := bepaal_kenmerk (v_flex8);
              v_cnt_kenmerk_key9 := bepaal_kenmerk (v_flex9);
              v_cnt_kenmerk_key10 := bepaal_kenmerk (v_flex10);
              v_cnt_kenmerk_key11 := bepaal_kenmerk (v_flex11);
              v_cnt_kenmerk_key12 := bepaal_kenmerk (v_flex12);
              v_cnt_kenmerk_key13 := bepaal_kenmerk (v_flex13);
              v_cnt_kenmerk_key14 := bepaal_kenmerk (v_flex14);
              v_cnt_kenmerk_key15 := bepaal_kenmerk (v_flex15);
              v_cnt_kenmerk_key16 := bepaal_kenmerk (v_flex16);
              v_cnt_kenmerk_key17 := bepaal_kenmerk (v_flex17);
              v_cnt_kenmerk_key18 := bepaal_kenmerk (v_flex18);
              v_cnt_kenmerk_key19 := bepaal_kenmerk (v_flex19);
              v_cnt_kenmerk_key20 := bepaal_kenmerk (v_flex20);
              v_cnt_kenmerk_key21 := bepaal_kenmerk (v_flex21);
              v_cnt_kenmerk_key22 := bepaal_kenmerk (v_flex22);
              v_cnt_kenmerk_key23 := bepaal_kenmerk (v_flex23);
              v_cnt_kenmerk_key24 := bepaal_kenmerk (v_flex24);
              v_cnt_kenmerk_key25 := bepaal_kenmerk (v_flex25);

              header_is_valid := 1;
           END IF;
        ELSE
           v_count_tot := v_count_tot + 1;

           -- Controleer alle veldwaarden
           v_errormsg := 'Contractnr ongeldig';
           v_nummer_intern := SUBSTR (TRIM (v_nummer_intern), 1, 30);

           v_errormsg := 'Externnr ongeldig';
           v_nummer_extern := SUBSTR (TRIM (v_nummer_extern), 1, 30);

           --
           v_errormsg := 'Contractsoort ongedefinieerd';
           v_cnt_soort := SUBSTR (TRIM (v_cnt_soort), 1, 60);
           IF (v_cnt_soort IS NULL)
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Regel wordt overgeslagen');
              v_ongeldig := 1;
           END IF;

           --
           v_errormsg := 'Beschrijving ongedefinieerd';
           v_beschrijving := SUBSTR (TRIM (v_beschrijving), 1, 50);
           IF (v_beschrijving IS NULL)
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Regel wordt overgeslagen');
              v_ongeldig := 1;
           END IF;

           v_errormsg := 'Mantelnr ongeldig';
           v_mantel_nr := SUBSTR (TRIM (v_mantel_nr), 1, 30);

           v_errormsg := 'Omschrijving ongeldig';
           v_omschrijving := SUBSTR (TRIM (v_omschrijving), 1, 1000);

           v_errormsg := 'Versie ongeldig';
           v_versie := SUBSTR (TRIM (v_versie), 1, 10);

           v_errormsg := 'Dienst ongeldig';
           v_dienst := SUBSTR (TRIM (v_dienst), 1, 60);

           --
           v_errormsg := 'Eigenaarafdeling (code) ongedefinieerd';
           v_afdeling := SUBSTR (TRIM (v_afdeling), 1, 15);
           IF (v_afdeling IS NULL)
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Regel wordt overgeslagen');
              v_ongeldig := 1;
           END IF;

           v_errormsg := 'Eigenaar (login) ongeldig';
           v_perslid_eig := SUBSTR (TRIM (v_perslid_eig), 1, 30);

           --
           v_errormsg := 'Beheerder (login) ongedefinieerd';
           v_perslid_beh := SUBSTR (TRIM (v_perslid_beh), 1, 30);
           IF (v_perslid_beh IS NULL)
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Regel wordt overgeslagen');
              v_ongeldig := 1;
           END IF;

           v_errormsg := 'Opmerking ongeldig';
           v_opmerking := SUBSTR (TRIM (v_opmerking), 1, 1000);

           --
           v_errormsg :=
              'Ingansdatum ongedefinieerd/ongeldig [' || TRIM (v_datum_ingang) || ']';
           v_d_datum_ingang :=
              fac.safe_to_date (TRIM (v_datum_ingang), 'dd-mm-yyyy');
           IF (v_d_datum_ingang IS NULL)
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Regel wordt overgeslagen');
              v_ongeldig := 1;
           END IF;

           --
           v_errormsg :=
              'Rappeldatum ongeldig [' || TRIM (v_datum_rappel) || ']';
           v_d_datum_rappel :=
              fac.safe_to_date (TRIM (v_datum_rappel), 'dd-mm-yyyy');
           IF (v_datum_rappel IS NOT NULL AND v_d_datum_rappel IS NULL)
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Regel wordt overgeslagen');
              v_ongeldig := 1;
           END IF;

           --
           v_errormsg :=
              'Opzegdatum ongeldig [' || TRIM (v_datum_opzeg) || ']';
           v_d_datum_opzeg :=
              fac.safe_to_date (TRIM (v_datum_opzeg), 'dd-mm-yyyy');
           IF (v_datum_opzeg IS NOT NULL AND v_d_datum_opzeg IS NULL)
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Regel wordt overgeslagen');
              v_ongeldig := 1;
           END IF;

           --
           v_errormsg := 'Einddatum ongedefinieerd/ongeldig [' || TRIM (v_datum_eind) || ']';
           v_d_datum_eind :=
              fac.safe_to_date (TRIM (v_datum_eind), 'dd-mm-yyyy');
           IF (v_d_datum_eind IS NULL)
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Regel wordt overgeslagen');
              v_ongeldig := 1;
           END IF;

           --
           v_errormsg := 'Bedrijfnaam ongedefinieerd';
           v_bedrijf_naam := SUBSTR (TRIM (v_bedrijf_naam), 1, 60);
           IF (v_bedrijf_naam IS NULL)
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Regel wordt overgeslagen');
              v_ongeldig := 1;
           END IF;

           v_errormsg := 'Contactnaam ongeldig';
           v_contact_naam := SUBSTR (TRIM (v_contact_naam), 1, 30);

           --
           v_errormsg := 'Kostenplaatscode ongeldig';
           v_kpn_code := SUBSTR (TRIM (v_kpn_code), 1, 30);
           IF (v_kpn_code IS NULL)
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Regel wordt overgeslagen');
              v_ongeldig := 1;
           END IF;

           --
           v_errormsg :=
              'Contractbedrag ongeldig ]' || TRIM (v_bedrag) || ']';
           v_n_bedrag := fac.safe_to_number (v_bedrag);

           IF (v_bedrag IS NOT NULL AND v_n_bedrag IS NULL)
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Contractbedrag wordt genegeerd');
           END IF;

           --
           v_errormsg :=
              'Termijnbedrag ongeldig ]' || TRIM (v_bedrag_termijn) || ']';
           v_n_bedrag_termijn := fac.safe_to_number (v_bedrag_termijn);

           IF (v_bedrag_termijn IS NOT NULL AND v_n_bedrag_termijn IS NULL)
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Termijnbedrag wordt genegeerd');
           END IF;

           --
           v_errormsg := 'Uurtarief ongeldig ]' || TRIM (v_uurtarief) || ']';
           v_n_uurtarief := fac.safe_to_number (v_uurtarief);

           IF (v_uurtarief IS NOT NULL AND v_n_uurtarief IS NULL)
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Uurtarief wordt genegeerd');
           END IF;

           --
           v_errormsg := 'Korting ongeldig ]' || TRIM (v_korting) || ']';
           v_n_korting := fac.safe_to_number (v_korting);

           IF (v_korting IS NOT NULL AND v_n_korting IS NULL)
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Korting wordt genegeerd');
           END IF;

           v_errormsg := 'Gebouwcode ongeldig';
           v_gebouwcode := SUBSTR (TRIM (v_gebouwcode), 1, 12);

           v_errormsg := 'Verlenging ongeldig';
           v_verlengen := SUBSTR (TRIM (v_verlengen), 1, 1);

           -- De rest alleen ff trimmen.
           v_flex1 := TRIM (v_flex1);
           v_flex2 := TRIM (v_flex2);
           v_flex3 := TRIM (v_flex3);
           v_flex4 := TRIM (v_flex4);
           v_flex5 := TRIM (v_flex5);
           v_flex6 := TRIM (v_flex6);
           v_flex7 := TRIM (v_flex7);
           v_flex8 := TRIM (v_flex8);
           v_flex9 := TRIM (v_flex9);
           v_flex10 := TRIM (v_flex10);
           v_flex11 := TRIM (v_flex11);
           v_flex12 := TRIM (v_flex12);
           v_flex13 := TRIM (v_flex13);
           v_flex14 := TRIM (v_flex14);
           v_flex15 := TRIM (v_flex15);
           v_flex16 := TRIM (v_flex16);
           v_flex17 := TRIM (v_flex17);
           v_flex18 := TRIM (v_flex18);
           v_flex19 := TRIM (v_flex19);
           v_flex20 := TRIM (v_flex20);
           v_flex21 := TRIM (v_flex21);
           v_flex22 := TRIM (v_flex22);
           v_flex23 := TRIM (v_flex23);
           v_flex24 := TRIM (v_flex24);
           v_flex25 := TRIM (v_flex25);

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

                 -- Als uit kenmerkheader een geldige kenmerksoort-key volgt,
                 -- dan is flex<n> gevuld met <key>=<waarde>; zoniet, dan is
                 -- flex<n> gevuld met <waarde>!
                 -- NB. Een NULL-waarde resulteert NIET in het wissen van een
                 --     kenmerkveld (bijwerken kan wel, maar wissen dus niet)!
                 INSERT INTO fac_imp_cnt (
                                             nummer_intern,
                                             nummer_extern,
                                             cnt_soort,
                                             beschrijving,
                                             mantel_nr,
                                             omschrijving,
                                             afdeling,
                                             perslid_eig,
                                             perslid_beh,
                                             opmerking,
                                             datum_ingang,
                                             datum_eind,
                                             datum_opzeg,
                                             datum_rappel,
                                             bedrijf_naam,
                                             contact_naam,
                                             kpn_code,
                                             bedrag,
                                             bedrag_termijn,
                                             uurtarief,
                                             korting,
                                             gebouwcode,
                                             verlengen,
                                             versie,
                                             dienst,
                                             flex1,
                                             flex2,
                                             flex3,
                                             flex4,
                                             flex5,
                                             flex6,
                                             flex7,
                                             flex8,
                                             flex9,
                                             flex10,
                                             flex11,
                                             flex12,
                                             flex13,
                                             flex14,
                                             flex15,
                                             flex16,
                                             flex17,
                                             flex18,
                                             flex19,
                                             flex20,
                                             flex21,
                                             flex22,
                                             flex23,
                                             flex24,
                                             flex25
                            )
                   VALUES   (
                                v_nummer_intern,
                                v_nummer_extern,
                                v_cnt_soort,
                                v_beschrijving,
                                v_mantel_nr,
                                v_omschrijving,
                                v_afdeling,
                                v_perslid_eig,
                                v_perslid_beh,
                                v_opmerking,
                                v_d_datum_ingang,
                                v_d_datum_eind,
                                v_d_datum_opzeg,
                                v_d_datum_rappel,
                                v_bedrijf_naam,
                                v_contact_naam,
                                v_kpn_code,
                                v_n_bedrag,
                                v_n_bedrag_termijn,
                                v_n_uurtarief,
                                v_n_korting,
                                v_gebouwcode,
                                v_verlengen,
                                v_versie,
                                v_dienst,
                                DECODE (v_cnt_kenmerk_key1, NULL, v_flex1, TO_CHAR (v_cnt_kenmerk_key1) || '=' || SUBSTR (v_flex1, 1, 200)),
                                DECODE (v_cnt_kenmerk_key2, NULL, v_flex2, TO_CHAR (v_cnt_kenmerk_key2) || '=' || SUBSTR (v_flex2, 1, 200)),
                                DECODE (v_cnt_kenmerk_key3, NULL, v_flex3, TO_CHAR (v_cnt_kenmerk_key3) || '=' || SUBSTR (v_flex3, 1, 200)),
                                DECODE (v_cnt_kenmerk_key4, NULL, v_flex4, TO_CHAR (v_cnt_kenmerk_key4) || '=' || SUBSTR (v_flex4, 1, 200)),
                                DECODE (v_cnt_kenmerk_key5, NULL, v_flex5, TO_CHAR (v_cnt_kenmerk_key5) || '=' || SUBSTR (v_flex5, 1, 200)),
                                DECODE (v_cnt_kenmerk_key6, NULL, v_flex6, TO_CHAR (v_cnt_kenmerk_key6) || '=' || SUBSTR (v_flex6, 1, 200)),
                                DECODE (v_cnt_kenmerk_key7, NULL, v_flex7, TO_CHAR (v_cnt_kenmerk_key7) || '=' || SUBSTR (v_flex7, 1, 200)),
                                DECODE (v_cnt_kenmerk_key8, NULL, v_flex8, TO_CHAR (v_cnt_kenmerk_key8) || '=' || SUBSTR (v_flex8, 1, 200)),
                                DECODE (v_cnt_kenmerk_key9, NULL, v_flex9, TO_CHAR (v_cnt_kenmerk_key9) || '=' || SUBSTR (v_flex9, 1, 200)),
                                DECODE (v_cnt_kenmerk_key10, NULL, v_flex10, TO_CHAR (v_cnt_kenmerk_key10) || '=' || SUBSTR (v_flex10, 1, 200)),
                                DECODE (v_cnt_kenmerk_key11, NULL, v_flex11, TO_CHAR (v_cnt_kenmerk_key11) || '=' || SUBSTR (v_flex11, 1, 200)),
                                DECODE (v_cnt_kenmerk_key12, NULL, v_flex12, TO_CHAR (v_cnt_kenmerk_key12) || '=' || SUBSTR (v_flex12, 1, 200)),
                                DECODE (v_cnt_kenmerk_key13, NULL, v_flex13, TO_CHAR (v_cnt_kenmerk_key13) || '=' || SUBSTR (v_flex13, 1, 200)),
                                DECODE (v_cnt_kenmerk_key14, NULL, v_flex14, TO_CHAR (v_cnt_kenmerk_key14) || '=' || SUBSTR (v_flex14, 1, 200)),
                                DECODE (v_cnt_kenmerk_key15, NULL, v_flex15, TO_CHAR (v_cnt_kenmerk_key15) || '=' || SUBSTR (v_flex15, 1, 200)),
                                DECODE (v_cnt_kenmerk_key16, NULL, v_flex16, TO_CHAR (v_cnt_kenmerk_key16) || '=' || SUBSTR (v_flex16, 1, 200)),
                                DECODE (v_cnt_kenmerk_key17, NULL, v_flex17, TO_CHAR (v_cnt_kenmerk_key17) || '=' || SUBSTR (v_flex17, 1, 200)),
                                DECODE (v_cnt_kenmerk_key18, NULL, v_flex18, TO_CHAR (v_cnt_kenmerk_key18) || '=' || SUBSTR (v_flex18, 1, 200)),
                                DECODE (v_cnt_kenmerk_key19, NULL, v_flex19, TO_CHAR (v_cnt_kenmerk_key19) || '=' || SUBSTR (v_flex19, 1, 200)),
                                DECODE (v_cnt_kenmerk_key20, NULL, v_flex20, TO_CHAR (v_cnt_kenmerk_key20) || '=' || SUBSTR (v_flex20, 1, 200)),
                                DECODE (v_cnt_kenmerk_key21, NULL, v_flex21, TO_CHAR (v_cnt_kenmerk_key21) || '=' || SUBSTR (v_flex21, 1, 200)),
                                DECODE (v_cnt_kenmerk_key22, NULL, v_flex22, TO_CHAR (v_cnt_kenmerk_key22) || '=' || SUBSTR (v_flex22, 1, 200)),
                                DECODE (v_cnt_kenmerk_key23, NULL, v_flex23, TO_CHAR (v_cnt_kenmerk_key23) || '=' || SUBSTR (v_flex23, 1, 200)),
                                DECODE (v_cnt_kenmerk_key24, NULL, v_flex24, TO_CHAR (v_cnt_kenmerk_key24) || '=' || SUBSTR (v_flex24, 1, 200)),
                                DECODE (v_cnt_kenmerk_key25, NULL, v_flex25, TO_CHAR (v_cnt_kenmerk_key25) || '=' || SUBSTR (v_flex25, 1, 200))
                            );

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

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

  COMMIT;
EXCEPTION
  WHEN OTHERS
  THEN
     oracle_err_num := SQLCODE;
     oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
     v_errormsg :=
           v_errormsg
        || ' ORACLE (error '
        || oracle_err_num
        || '/'
        || oracle_err_mes
        || ')';
     fac.imp_writelog (p_import_key,
                       'E',
                       v_aanduiding || v_errormsg,
                       'Inleesproces contracten afgebroken!');
END fac_import_cnt;
/

CREATE OR REPLACE PROCEDURE fac_update_cnt (p_import_key IN NUMBER)
AS
  -- Cursor zoekt direct alle afgeleide gegevens.
  -- Een leeg veld betekent dus: óf deze regel overslaan, óf nieuwe data toevoegen.
  CURSOR c1
  IS
     SELECT   a.nummer_intern,
              a.nummer_extern,
              a.cnt_soort,
              dp.cnt_srtcontract_type,
              a.ins_discipline_key,
              a.beschrijving,
              a.mantel_nr,
              a.mantel_key,
              a.omschrijving,
              a.versie,
              a.dienst,
              a.prs_dienst_key,
              a.afdeling,
              a.prs_afdeling_key,
              a.perslid_eig,
              a.prs_perslid_key_eig,
              a.prs_afdeling_key_eig,
              a.perslid_beh,
              a.prs_perslid_key_beh,
              a.opmerking,
              a.datum_ingang,
              a.datum_eind,
              a.datum_opzeg,
              a.datum_rappel,
              a.bedrijf_naam,
              a.prs_bedrijf_key,
              a.contact_naam,
              cp.prs_contactpersoon_key,
              a.kpn_code,
              a.prs_kostenplaats_key,
              a.bedrag,
              a.bedrag_termijn,
              a.uurtarief,
              a.korting,
              a.gebouwcode locgeb_code,
              COALESCE (l.alg_locatie_key, g.alg_gebouw_key) plaats_key,
              DECODE (l.alg_locatie_key,
                      NULL, DECODE (g.alg_gebouw_key, NULL, NULL, 'G'),
                      'L')
                 plaats_code,
              a.verlengen,
              a.flex1 cnt_kenmerkwaarde1,
              a.flex2 cnt_kenmerkwaarde2,
              a.flex3 cnt_kenmerkwaarde3,
              a.flex4 cnt_kenmerkwaarde4,
              a.flex5 cnt_kenmerkwaarde5,
              a.flex6 cnt_kenmerkwaarde6,
              a.flex7 cnt_kenmerkwaarde7,
              a.flex8 cnt_kenmerkwaarde8,
              a.flex9 cnt_kenmerkwaarde9,
              a.flex10 cnt_kenmerkwaarde10,
              a.flex11 cnt_kenmerkwaarde11,
              a.flex12 cnt_kenmerkwaarde12,
              a.flex13 cnt_kenmerkwaarde13,
              a.flex14 cnt_kenmerkwaarde14,
              a.flex15 cnt_kenmerkwaarde15,
              a.flex16 cnt_kenmerkwaarde16,
              a.flex17 cnt_kenmerkwaarde17,
              a.flex18 cnt_kenmerkwaarde18,
              a.flex19 cnt_kenmerkwaarde19,
              a.flex20 cnt_kenmerkwaarde20,
              a.flex21 cnt_kenmerkwaarde21,
              a.flex22 cnt_kenmerkwaarde22,
              a.flex23 cnt_kenmerkwaarde23,
              a.flex24 cnt_kenmerkwaarde24,
              a.flex25 cnt_kenmerkwaarde25
       FROM               (SELECT   i.nummer_intern,
                                    i.nummer_extern,
                                    i.cnt_soort,
                                    disc.ins_discipline_key,
                                    i.beschrijving,
                                    i.mantel_nr,
                                    mntl.cnt_contract_key mantel_key,
                                    i.omschrijving,
                                    i.versie,
                                    i.dienst,
                                    d.prs_dienst_key,
                                    i.afdeling,
                                    afd.prs_afdeling_key,
                                    i.perslid_eig,
                                    eig.prs_perslid_key prs_perslid_key_eig,
                                    eig.prs_afdeling_key
                                       prs_afdeling_key_eig,
                                    i.perslid_beh,
                                    beh.prs_perslid_key prs_perslid_key_beh,
                                    i.opmerking,
                                    i.datum_ingang,
                                    i.datum_eind,
                                    i.datum_opzeg,
                                    i.datum_rappel,
                                    i.bedrijf_naam,
                                    (SELECT   MIN (prs_bedrijf_key)
                                       FROM   prs_v_aanwezigbedrijf
                                      WHERE   prs_bedrijf_contract IS NOT NULL
                                              AND (TRIM (
                                                      prs_bedrijf_naam_upper
                                                   ) =
                                                      UPPER (i.bedrijf_naam)
                                                   OR UPPER(TRIM(prs_leverancier_nr)) =
                                                        UPPER (
                                                           i.bedrijf_naam
                                                        )))
                                       prs_bedrijf_key,
                                    i.contact_naam,
                                    i.kpn_code,
                                    kpn.prs_kostenplaats_key,
                                    i.bedrag,
                                    i.bedrag_termijn,
                                    i.uurtarief,
                                    i.korting,
                                    i.gebouwcode,
                                    -- NULL --> Onbekend
                                    -- J    --> Ja (verlengen), nog wel te wijzigen
                                    -- N    --> Nee (niet verlengen), nog wel te wijzigen
                                    DECODE (i.verlengen,
                                            NULL, NULL,
                                            'J', 1,
                                            'N', 0,
                                            NULL)
                                       verlengen,
                                    i.flex1,
                                    i.flex2,
                                    i.flex3,
                                    i.flex4,
                                    i.flex5,
                                    i.flex6,
                                    i.flex7,
                                    i.flex8,
                                    i.flex9,
                                    i.flex10,
                                    i.flex11,
                                    i.flex12,
                                    i.flex13,
                                    i.flex14,
                                    i.flex15,
                                    i.flex16,
                                    i.flex17,
                                    i.flex18,
                                    i.flex19,
                                    i.flex20,
                                    i.flex21,
                                    i.flex22,
                                    i.flex23,
                                    i.flex24,
                                    i.flex25
                             FROM   fac_imp_cnt i,
                                    (SELECT   *
                                       FROM   cnt_discipline
                                      WHERE   ins_discipline_verwijder IS NULL)
                                    disc,
                                    (SELECT   c.*
                                       FROM   cnt_v_aanwezigcontract c,
                                              cnt_disc_params dp
                                      WHERE   c.ins_discipline_key =
                                                 dp.cnt_ins_discipline_key
                                              AND dp.cnt_srtcontract_type =
                                                    6) mntl,
                                    prs_dienst d,
                                    (SELECT   *
                                       FROM   prs_afdeling
                                      WHERE   prs_afdeling_verwijder IS NULL)
                                    afd,
                                    prs_v_aanwezigperslid eig,
                                    prs_v_aanwezigperslid beh,
                                    prs_v_aanwezigkostenplaats kpn
                            WHERE   UPPER (i.cnt_soort) =
                                       UPPER(TRIM(disc.ins_discipline_omschrijving(+)))
                                    AND UPPER (i.mantel_nr) =
                                          UPPER(TRIM(mntl.cnt_contract_nummer_intern(+)))
                                    AND UPPER (i.dienst) =
                                          UPPER(TRIM(d.prs_dienst_omschrijving(+)))
                                    AND UPPER (i.afdeling) =
                                          TRIM (afd.prs_afdeling_upper(+))
                                    AND UPPER (i.perslid_eig) =
                                          COALESCE (
                                             TRIM (
                                                eig.prs_perslid_oslogin(+)
                                             ),
                                             TRIM (
                                                eig.prs_perslid_oslogin2(+)
                                             )
                                          )
                                    AND UPPER (i.perslid_beh) =
                                          COALESCE (
                                             TRIM (
                                                beh.prs_perslid_oslogin(+)
                                             ),
                                             TRIM (
                                                beh.prs_perslid_oslogin2(+)
                                             )
                                          )
                                    AND UPPER (i.kpn_code) =
                                          TRIM (
                                             kpn.prs_kostenplaats_upper(+)
                                          )) a
                       LEFT JOIN
                          cnt_disc_params dp
                       ON a.ins_discipline_key = dp.cnt_ins_discipline_key
                    LEFT JOIN
                       prs_contactpersoon cp
                    ON cp.prs_contactpersoon_verwijder IS NULL
                       AND UPPER (a.contact_naam) =
                             UPPER (TRIM (cp.prs_contactpersoon_naam))
                       AND a.prs_bedrijf_key = cp.prs_bedrijf_key
                 LEFT JOIN
                    (  SELECT   TRIM (alg_locatie_code) alg_locatie_code,
                                MIN (alg_locatie_key) alg_locatie_key
                         FROM   alg_v_aanweziglocatie
                     GROUP BY   TRIM (alg_locatie_code)) l
                 ON UPPER (a.gebouwcode) = UPPER (l.alg_locatie_code)
              LEFT JOIN
                 (  SELECT   TRIM (alg_gebouw_code) alg_gebouw_code,
                             MIN (alg_gebouw_key) alg_gebouw_key
                      FROM   alg_v_aanweziggebouw
                  GROUP BY   TRIM (alg_gebouw_code)) g
              ON UPPER (a.gebouwcode) = UPPER (g.alg_gebouw_code);

  -- Constanten
  c_contract_type        NUMBER := 5;              -- Leverancier (met scope)

  v_errormsg             VARCHAR2 (1000) := '-';
  oracle_err_num         NUMBER;
  oracle_err_mes         VARCHAR2 (200);
  v_aanduiding           VARCHAR2 (200);
  v_geldig               NUMBER (1);
  v_facilitor_key        NUMBER;
  v_perslid_key_eig      NUMBER;
  v_perslid_key_beh      NUMBER;
  v_typecontract_key     NUMBER;
  v_cnt_discipline_key   NUMBER;
  v_contactpersoon_key   NUMBER;
  v_cnt_status           NUMBER;
  v_termijn_type         VARCHAR2 (1);
  v_termijn_aantal       NUMBER;
  v_termijn_key_opzeg    NUMBER;
  v_termijn_key_rappel   NUMBER;
  v_contract_key         NUMBER;
  v_count                NUMBER;
  v_count_tot            NUMBER;
  v_count_cntnew         NUMBER;
  v_count_cntupd         NUMBER;
  v_srtnoti_code         VARCHAR2 (6);

  -- SUBPROC
  PROCEDURE bepaal_termijn (p_start IN DATE, p_eind IN DATE)
  AS
     v_num_months   NUMBER;
  BEGIN
     v_termijn_type := 'D';
     v_termijn_aantal := 0;

     IF p_start IS NOT NULL AND p_eind > p_start
     THEN
        -- Kijk of het verschil een of meer jaren is.
        IF (TO_CHAR (p_eind, 'ddmm') = TO_CHAR (p_start, 'ddmm'))
        THEN
           -- Verschil is aantal jaren.
           v_termijn_type := 'Y';
           v_termijn_aantal :=
              TO_NUMBER (TO_CHAR (p_eind, 'yyyy'))
              - TO_NUMBER (TO_CHAR (p_start, 'yyyy'));
        ELSE
           v_num_months := ROUND ( (p_eind - p_start) / 30);

           IF (ADD_MONTHS (p_eind, -v_num_months) = p_start)
           --IF (TO_CHAR (p_eind, 'dd') = TO_CHAR (p_start, 'dd') )
           THEN
              -- Verschil is aantal maanden.
              v_termijn_type := 'M';
              v_termijn_aantal :=
                 (TO_NUMBER (TO_CHAR (p_eind, 'yyyy')) * 12
                  + TO_NUMBER (TO_CHAR (p_eind, 'mm')))
                 - (TO_NUMBER (TO_CHAR (p_start, 'yyyy')) * 12
                    + TO_NUMBER (TO_CHAR (p_start, 'mm')));
           ELSE
              -- Verschil is aantal dagen.
              v_termijn_type := 'D';
              v_termijn_aantal := p_eind - p_start;
           END IF;
        END IF;
     END IF;

     IF v_termijn_aantal < 0
     THEN
        -- 0 weken = termijn 'Geen'.
        v_termijn_aantal := 0;
        v_termijn_type := 'W';
     END IF;

     IF v_termijn_aantal > 999
     THEN
        v_termijn_aantal := 999;
     END IF;
  END;

  -- SUBPROC
  -- p_kenmerkwaarde = 'Looptijd Maximaal|1=24'. Ofwel: kenmerk_omschrijving|groep=waarde.
  -- p_kenmerkwaarde = '1049|1=24'.              Ofwel: kenmerk_key|groep=waarde.
  PROCEDURE upsert_cntkenmerk (p_cnt_key       IN NUMBER,
                               p_kenmerkwaarde IN VARCHAR2)
  AS
     v_kenmerk_key       NUMBER;
     v_srtkenmerk_type   cnt_srtkenmerk.cnt_srtkenmerk_kenmerktype%TYPE;
     ccount              NUMBER;
     v_srtkenmerk_key    NUMBER;
     v_groep             NUMBER;
     v_kenmerk           VARCHAR2 (50);
     v_waarde            VARCHAR2 (255);
     v_objectnaam        fac_kenmerkdomein.fac_kenmerkdomein_objectnaam%TYPE;
     v_kolomnaam         fac_kenmerkdomein.fac_kenmerkdomein_kolomnaam%TYPE;
     v_kolomtxt          fac_kenmerkdomein.fac_kenmerkdomein_kolomtxt%TYPE;
     sql_stmt            VARCHAR2 (1000);
     v_kenmerkdeel_key   NUMBER;
     l_cursor_1          INTEGER;
     l_rowsprocessed     NUMBER DEFAULT 0;
  BEGIN
     IF p_kenmerkwaarde IS NOT NULL
     THEN
        v_errormsg := 'Fout bij bepalen kenmerk [' || p_kenmerkwaarde || ']';

        v_kenmerk := SUBSTR (p_kenmerkwaarde, 1, INSTR (p_kenmerkwaarde, '|') - 1);
        v_groep := fac.safe_to_number (
                   SUBSTR (p_kenmerkwaarde,
                            INSTR (p_kenmerkwaarde, '|') + 1,
                            INSTR (p_kenmerkwaarde, '=') - 1 - INSTR (p_kenmerkwaarde, '|')));
        v_waarde := SUBSTR (p_kenmerkwaarde, INSTR (p_kenmerkwaarde, '=') + 1);

        IF fac.safe_to_number (v_kenmerk) IS NULL
        THEN
           -- Er kunnen drie kenmerken met dezelfde omschrijving gedefinieerd worden voor een object,
           -- namenlijk op drie niveaus discipline (D), 0bjectgroep (G) en objectsoort (S).
           -- Bij meerdere dezelfde kenmerken nemen we het kenmerk met de laagste volgnummer.
           SELECT cnt_kenmerk_key,
                  cnt_srtkenmerk_key,
                  cnt_srtkenmerk_kenmerktype
             INTO v_kenmerk_key,
                  v_srtkenmerk_key,
                  v_srtkenmerk_type
             FROM (  SELECT k.cnt_kenmerk_key,
                            sk.cnt_srtkenmerk_key,
                            sk.cnt_srtkenmerk_kenmerktype,
                            k.cnt_kenmerk_volgnummer
                       FROM cnt_v_aanwezigcontract c,
                            cnt_kenmerk k,
                            cnt_srtkenmerk sk
                      WHERE c.ins_discipline_key = k.cnt_srtcontract_key
                        AND k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                        AND c.cnt_contract_key = p_cnt_key
                        AND k.cnt_kenmerk_groep = v_groep
                        AND COALESCE(UPPER(k.cnt_kenmerk_omschrijving), sk.cnt_srtkenmerk_upper) = UPPER(v_kenmerk)
                        AND k.cnt_kenmerk_verwijder IS NULL
                        AND sk.cnt_srtkenmerk_verwijder IS NULL
                   ORDER BY k.cnt_kenmerk_volgnummer)
            WHERE ROWNUM = 1;
        ELSE
             SELECT k.cnt_kenmerk_key,
                    sk.cnt_srtkenmerk_key,
                    sk.cnt_srtkenmerk_kenmerktype
               INTO v_kenmerk_key,
                    v_srtkenmerk_key,
                    v_srtkenmerk_type
               FROM cnt_kenmerk k,
                    cnt_srtkenmerk sk
              WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                AND k.cnt_kenmerk_groep = v_groep
                AND k.cnt_kenmerk_key = v_kenmerk
           ORDER BY k.cnt_kenmerk_volgnummer;
        END IF;


        IF v_waarde IS NOT NULL
        THEN
           IF v_srtkenmerk_type IN ('R', 'S')
           THEN
              v_errormsg := 'Fout bij bepalen eigen tabel';

              SELECT COUNT (*)
                INTO ccount
                FROM cnt_srtkenmerk sk,
                     fac_kenmerkdomein d
               WHERE sk.cnt_srtkenmerk_key = v_srtkenmerk_key
                 AND sk.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key
                 AND d.fac_usrtab_key IS NOT NULL;

              v_errormsg :=
                 'Fout bij bepalen nieuwe waarde [' || v_waarde || ']';

              IF ccount = 1
              THEN
                 -- Eigen tabel
                 SELECT TO_CHAR (ud.fac_usrdata_key)
                   INTO v_waarde
                   FROM cnt_srtkenmerk sk,
                        fac_kenmerkdomein d,
                        fac_v_aanwezigusrdata ud
                  WHERE sk.cnt_srtkenmerk_key = v_srtkenmerk_key
                    AND sk.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key
                    AND d.fac_usrtab_key = ud.fac_usrtab_key
                    AND UPPER (TRIM (ud.fac_usrdata_omschr)) = UPPER (v_waarde);
              ELSE
                 -- FACILITOR view/tabel
                 SELECT d.fac_kenmerkdomein_objectnaam,
                        d.fac_kenmerkdomein_kolomnaam,
                        d.fac_kenmerkdomein_kolomtxt
                   INTO v_objectnaam,
                        v_kolomnaam,
                        v_kolomtxt
                   FROM cnt_srtkenmerk sk,
                        fac_kenmerkdomein d
                  WHERE sk.cnt_srtkenmerk_key = v_srtkenmerk_key
                    AND sk.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key
                    AND d.fac_usrtab_key IS NULL;

                 sql_stmt :=
                       'SELECT MAX ('
                    || v_kolomnaam
                    || ') FROM '
                    || v_objectnaam
                    || ' WHERE UPPER (TRIM ('
                    || v_kolomtxt
                    || ')) = UPPER (:pwaarde)';
                 l_cursor_1 := DBMS_SQL.open_cursor;
                 DBMS_SQL.parse (l_cursor_1, sql_stmt, DBMS_SQL.native);
                 DBMS_SQL.BIND_VARIABLE(l_cursor_1,':pwaarde', v_waarde);
                 DBMS_SQL.define_column(l_cursor_1, 1, v_waarde, 255);
                 l_rowsprocessed := DBMS_SQL.execute_and_fetch (l_cursor_1);
                 DBMS_SQL.column_value (l_cursor_1, 1, v_waarde);
                 DBMS_SQL.close_cursor(l_cursor_1);
              END IF;
           ELSE              -- C(Karakter)/D(Datum)/N(Numeriek)/X(Bestandsnaam)
              NULL; -- v_waarde := p_waarde;
           END IF;

           v_errormsg := 'Fout bij bepalen huidige waarde';

           SELECT COUNT (*),
                  MAX (cnt_kenmerkcontract_key)
             INTO ccount,
                  v_kenmerkdeel_key
             FROM cnt_kenmerkcontract
            WHERE cnt_contract_key = p_cnt_key
                  AND cnt_kenmerk_key = v_kenmerk_key;

           IF v_srtkenmerk_type = 'N'  -- Alleen voor numerieke waarden de decimale komma vervangen door punt.
           THEN
               v_waarde := REPLACE (v_waarde, ',', '.');
           END IF;

           IF ccount = 0
           THEN
              v_errormsg := 'Fout bij toevoegen waarde [' || v_waarde || ']';

              INSERT INTO cnt_kenmerkcontract (cnt_contract_key,
                                               cnt_kenmerk_key,
                                               cnt_kenmerkcontract_waarde)
                   VALUES (p_cnt_key,
                           v_kenmerk_key,
                           v_waarde);
           ELSE
              v_errormsg := 'Fout bij bijwerken waarde [' || v_waarde || ']';

              UPDATE   cnt_kenmerkcontract
                 SET   cnt_kenmerkcontract_waarde = v_waarde
               WHERE   cnt_kenmerkcontract_key = v_kenmerkdeel_key;
           END IF;
        ELSE
           -- Verwijder kenmerken die al bestaan maar met de nieuwe import leeg zijn.
           DELETE cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = v_kenmerk_key
              AND cnt_contract_key = p_cnt_key;
        END IF;
     END IF;
  EXCEPTION
     WHEN OTHERS
     THEN
        oracle_err_num := SQLCODE;
        oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
        v_errormsg :=
              v_errormsg
           || ' ORACLE (error '
           || oracle_err_num
           || '/'
           || oracle_err_mes
           || ')';
        fac.imp_writelog (p_import_key,
                          'W',
                          v_aanduiding || v_errormsg,
                          'upsert_cntkenmerk');
  END;
BEGIN
  v_count_tot := 0;
  v_count_cntnew := 0;
  v_count_cntupd := 0;
  v_aanduiding := '';

  v_errormsg := 'Fout bij bepalen user: _FACILITOR';

  SELECT   prs_perslid_key
    INTO   v_facilitor_key
    FROM   prs_perslid
   WHERE   prs_perslid_oslogin = '_FACILITOR';

  FOR rec IN c1
  LOOP
     BEGIN
        v_geldig := 1;
        v_count_tot := v_count_tot + 1;
        v_aanduiding :=
              '['
           || rec.cnt_soort
           || '|'
           || rec.nummer_intern
           || '|'
           || rec.nummer_extern
           || '|'
           || rec.beschrijving
           || '] ';

        -- Eerst controleren of de ingevulde gegevens wel zinning/geldig zijn.
        -- Voor -ontbrekende- verplichte gegevens proberen we wat zinnigs (en
        -- geldigs!) te bedenken.
        -- Toevoegen/bijwerken wordt pas gedaan als alles zinnig is bevonden.

        -- Verplichte velden (via interface) zijn bij import al gecontroleerd!
        -- Afdeling: moet geldig zijn!
        v_errormsg := 'Fout bij bepalen afdeling: ' || rec.afdeling;

        IF (rec.prs_afdeling_key IS NULL)
        THEN
           fac.imp_writelog (p_import_key,
                             'W',
                             v_aanduiding || v_errormsg,
                             'Contract wordt overgeslagen');
           v_geldig := 0;
        END IF;

        -- Eigenaar (als meegegeven)
        -- In geval van abonnement verplicht.
        -- *niet gevonden, wel meegegeven
        IF (rec.perslid_eig IS NOT NULL AND rec.prs_perslid_key_eig IS NULL)
        THEN
           v_errormsg := 'Fout bij bepalen eigenaar: ' || rec.perslid_eig;
           fac.imp_writelog (p_import_key,
                             'W',
                             v_aanduiding || v_errormsg,
                             'leeg gelaten');
        -- *wel gevonden (impliceert meegegeven)
        ELSIF (rec.prs_perslid_key_eig IS NOT NULL)
        THEN
           v_perslid_key_eig := rec.prs_perslid_key_eig;

        -- *niet meegegeven, dus niet gevonden
        -- Speciaal geval abonnementen: abonnee (eigenaar) is dan verplicht.
        -- Contract is een abonnement, als de contractsoort aan een catalogus
        -- gekoppeld is.
        ELSIF (rec.ins_discipline_key IS NOT NULL)
        THEN
           -- Is er een (actuele) catalogus aan deze contractsoort gekoppeld?
           SELECT   COUNT ( * )
             INTO   v_count
             FROM   bes_disc_params p, bes_discipline b
            WHERE   p.bes_disc_params_cnt_disckey = rec.ins_discipline_key
                    AND p.bes_ins_discipline_key = b.ins_discipline_key
                    AND b.ins_discipline_verwijder IS NULL;

           IF (v_count > 0)
           THEN
              -- dit is een abonnement, dus de eigenaar is verplicht
              v_errormsg := 'Fout bij bepalen eigenaar-abonnee';
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Contract wordt overgeslagen');
              v_geldig := 0;
           END IF;
        END IF;

        -- Beheerder: backup _FACILITOR.
        v_errormsg := 'Fout bij bepalen beheerder: ' || rec.perslid_beh;

        IF (rec.prs_perslid_key_beh IS NULL)
        THEN
           fac.imp_writelog (p_import_key,
                             'W',
                             v_aanduiding || v_errormsg,
                             '_FACILITOR gebruikt');
           v_perslid_key_beh := v_facilitor_key;
        ELSE
           v_perslid_key_beh := rec.prs_perslid_key_beh;
        END IF;

        -- Bedrijf: moet geldig zijn!
        v_errormsg := 'Fout bij bepalen bedrijf: ' || rec.bedrijf_naam;

        IF (rec.prs_bedrijf_key IS NULL)
        THEN
           fac.imp_writelog (p_import_key,
                             'W',
                             v_aanduiding || v_errormsg,
                             'Contract wordt overgeslagen');
           v_geldig := 0;
        END IF;

        -- Kostenplaats: moet bestaan.
        -- TODO: Moet de beheerder hier rechten op hebben? (en welke dan?)
        v_errormsg := 'Fout bij bepalen kostenplaats: ' || rec.kpn_code;

        IF (rec.prs_kostenplaats_key IS NULL)
        THEN
           fac.imp_writelog (p_import_key,
                             'W',
                             v_aanduiding || v_errormsg,
                             'Contract wordt overgeslagen');
           v_geldig := 0;
        END IF;

        -- Locatie/gebouw (als meegegeven): moet bestaan en ook passen bij de
        -- contractsoort (type_key 3=Ondersteuning of 5=Leverancier).
        v_errormsg := 'Fout bij bepalen locatie/gebouw: ' || rec.locgeb_code;

        IF (rec.locgeb_code IS NOT NULL)
        THEN
           -- Geen locatie/gebouw gevonden.
           IF (rec.plaats_key IS NULL)
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Contract wordt overgeslagen');
              v_geldig := 0;
           END IF;

           v_errormsg := 'Fout bij matchen contractsoort-scope';

           IF (rec.cnt_srtcontract_type NOT IN (3, 5))
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Contract wordt overgeslagen');
              v_geldig := 0;
           END IF;
        END IF;

        -- Mantel: niet verplicht, wel rapporteren als niets gevonden.
        v_errormsg := 'Fout bij bepalen mantel: ' || rec.mantel_nr;

        IF (rec.mantel_nr IS NOT NULL AND rec.mantel_key IS NULL)
        THEN
           fac.imp_writelog (p_import_key,
                             'W',
                             v_aanduiding || v_errormsg,
                             'Contract niet aan mantel gekoppeld');
        END IF;

        -- Dienst: niet verplicht, wel rapporteren als niets gevonden.
        v_errormsg := 'Fout bij bepalen dienst: ' || rec.dienst;

        IF (rec.dienst IS NOT NULL AND rec.prs_dienst_key IS NULL)
        THEN
           fac.imp_writelog (p_import_key,
                             'W',
                             v_aanduiding || v_errormsg,
                             'Contract niet aan dienst gekoppeld');
        END IF;

        -- Alleen verder gaan als alles zinnig bevonden is.
        IF (v_geldig = 1)
        THEN
           -- Contractsoort: toevoegen (type Leverancier).
           IF (rec.ins_discipline_key IS NULL)
           THEN
              -- Misschien is de contractsoort tijdens import al toegevoegd?
              --  (dan was 'ie er voor de cursor nog niet.)
              BEGIN
                 v_errormsg := 'Fout bij bepalen contractsoort';

                 SELECT   ins_discipline_key
                   INTO   v_cnt_discipline_key
                   FROM   cnt_discipline
                  WHERE   ins_discipline_verwijder IS NULL
                          AND UPPER (ins_discipline_omschrijving) =
                                UPPER (rec.cnt_soort);
              EXCEPTION
                 WHEN NO_DATA_FOUND
                 THEN
                    -- Contractsoort bestaat gewoon niet; toevoegen.
                    v_errormsg :=
                       'Fout bij toevoegen contractsoort:' || rec.cnt_soort;

                    INSERT INTO ins_tab_discipline (
                                                       ins_discipline_module,
                                                       ins_discipline_omschrijving
                                )
                       VALUES   ('CNT', rec.cnt_soort)
                    RETURNING   ins_discipline_key
                         INTO   v_cnt_discipline_key;

                    -- Type Leverancier, geen kostensoort, geen factuurmarges.
                    INSERT INTO cnt_disc_params (
                                                    cnt_ins_discipline_key,
                                                    cnt_srtcontract_type
                               )
                      VALUES   (v_cnt_discipline_key, c_contract_type);

                    fac.imp_writelog (
                       p_import_key,
                       'I',
                          v_aanduiding
                       || 'Contractsoort "'
                       || rec.cnt_soort
                       || '" aangemaakt',
                       'Nieuwe contractsoort'
                    );
              END;
           ELSE
              v_cnt_discipline_key := rec.ins_discipline_key;
           END IF;

           -- Contactpersoon (als meegegeven): bepalen/toevoegen bij bedrijf.
           IF (rec.contact_naam IS NOT NULL
               AND rec.prs_contactpersoon_key IS NULL)
           THEN
              -- Misschien is de contractsoort tijdens import al toegevoegd?
              --  (dan was 'ie er voor de cursor nog niet.)
              BEGIN
                 v_errormsg := 'Fout bij bepalen contactpersoon';

                 SELECT   prs_contactpersoon_key
                   INTO   v_contactpersoon_key
                   FROM   prs_contactpersoon
                  WHERE   prs_contactpersoon_verwijder IS NULL
                          AND prs_bedrijf_key = rec.prs_bedrijf_key
                          AND UPPER (prs_contactpersoon_naam) =
                                UPPER (rec.contact_naam);
              EXCEPTION
                 WHEN NO_DATA_FOUND
                 THEN
                    -- Contactpersoon bestaat gewoon niet; toevoegen.
                    v_errormsg :=
                       'Fout bij toevoegen contactpersoon:'
                       || rec.contact_naam;

                    INSERT INTO prs_contactpersoon (
                                                       prs_contactpersoon_naam,
                                                       prs_bedrijf_key
                                )
                       VALUES   (rec.contact_naam, rec.prs_bedrijf_key)
                    RETURNING   prs_contactpersoon_key
                         INTO   v_contactpersoon_key;

                    fac.imp_writelog (
                       p_import_key,
                       'I',
                          v_aanduiding
                       || 'Contactpersoon "'
                       || rec.contact_naam
                       || '" aangemaakt',
                       'Nieuwe contactpersoon'
                    );
              END;
           ELSE
              v_contactpersoon_key := rec.prs_contactpersoon_key;
           END IF;

           -- Opzegtermijn: bepalen/toevoegen.
           -- Als geen opzegtermijn ingevuld, dan is er geen opzegtermijn.
           v_errormsg := 'Fout bij bepalen opzegtermijn';

           IF (rec.datum_opzeg IS NULL)
           THEN
              -- Opzegtermijn 'Geen' = 0 weken.
              v_termijn_aantal := 0;
              v_termijn_type := 'W';
           ELSE
              bepaal_termijn (rec.datum_opzeg, rec.datum_eind);
           END IF;

           -- Bestaat de termijn al?
           BEGIN
              v_errormsg := 'Fout bij bepalen opzegtermijn';

              SELECT   cnt_termijn_key
                INTO   v_termijn_key_opzeg
                FROM   cnt_termijn
               WHERE   cnt_termijn_type = v_termijn_type
                       AND cnt_termijn_aantal = v_termijn_aantal;
           EXCEPTION
              WHEN NO_DATA_FOUND
              THEN
                 v_errormsg := 'Fout bij toevoegen opzegtermijn';

                 INSERT INTO cnt_termijn (
                                             cnt_termijn_omschrijving,
                                             cnt_termijn_type,
                                             cnt_termijn_aantal
                             )
                    VALUES   (
                                 TO_CHAR (v_termijn_aantal)
                                 || DECODE (v_termijn_type,
                                            'Y',
                                            ' Jaar',
                                            'M',
                                            ' Maand(en)',
                                            'D',
                                            ' Dag(en)'),
                                 v_termijn_type,
                                 v_termijn_aantal
                             )
                 RETURNING   cnt_termijn_key      INTO   v_termijn_key_opzeg;
           END;

           -- Rappeltermijn: bepalen/toevoegen.
           -- Als geen rappeltermijn ingevuld, dan is er geen rappeltermijn.
           v_errormsg := 'Fout bij bepalen rappeltermijn';

           IF (rec.datum_rappel IS NULL)
           THEN
              -- Rappeltermijn 'Geen' = 0 weken.
              v_termijn_aantal := 0;
              v_termijn_type := 'W';
           ELSE
              -- Als geen opzegdatum, dan einddatum.
              bepaal_termijn (rec.datum_rappel,
                              COALESCE (rec.datum_opzeg, rec.datum_eind));
           END IF;

           -- Bestaat de termijn al?
           BEGIN
              v_errormsg := 'Bepalen rappeltermijn';

              SELECT   cnt_termijn_key
                INTO   v_termijn_key_rappel
                FROM   cnt_termijn
               WHERE   cnt_termijn_type = v_termijn_type
                       AND cnt_termijn_aantal = v_termijn_aantal;
           EXCEPTION
              WHEN NO_DATA_FOUND
              THEN
                 v_errormsg := 'Toevoegen rappeltermijn';

                 INSERT INTO cnt_termijn (
                                             cnt_termijn_omschrijving,
                                             cnt_termijn_type,
                                             cnt_termijn_aantal
                             )
                    VALUES   (
                                 TO_CHAR (v_termijn_aantal)
                                 || DECODE (v_termijn_type,
                                            'Y',
                                            ' Jaar',
                                            'M',
                                            ' Maand(en)',
                                            'D',
                                            ' Dag(en)'),
                                 v_termijn_type,
                                 v_termijn_aantal
                             )
                 RETURNING   cnt_termijn_key
                      INTO   v_termijn_key_rappel;
           END;

           -- Controleren of er al een contract met hetzelfde nummer en versie;
           -- bestaat; toevoegen vs. bijwerken.
           v_errormsg := 'Fout bij bepalen contract';

           SELECT   COUNT ( * )
             INTO   v_count
             FROM   cnt_v_aanwezigcontract
            WHERE   TRIM (cnt_contract_nummer_intern) = rec.nummer_intern
                    AND COALESCE (cnt_contract_versie, '0') =
                          COALESCE (rec.versie, '0');

           IF (v_count = 0)       -- Contract bestaat nog niet --> toevoegen.
           THEN
              -- Als rec.nummer_intern is NULL, dan wordt door FACILITOR een
              -- nummer bepaald (= cnt_contract_key)!
              v_errormsg := 'Fout bij toevoegen contract.';

              -- Status van nieuwe melding is afhankelijk van of het contract approval mechanisme actief is en
              -- het bedrag moet groter zijn als limiet 1 anders hoeft er überhaupt niet gefiatteerd te worden en kan het contract direct actief (0) worden.
              IF fac.getSetting('cnt_contract_approval') = 1 AND rec.bedrag > fac.getSetting('cnt_contract_limit1')
              THEN
                v_cnt_status := 2;
              ELSE
                v_cnt_status := 0;
              END IF;

              INSERT INTO cnt_contract (cnt_contract_nummer,
                                        cnt_contract_omschrijving,
                                        cnt_contract_looptijd_tot,
                                        cnt_contract_kosten,
                                        cnt_contract_uurloon,
                                        cnt_prs_bedrijf_key,
                                        cnt_contract_nummer_intern,
                                        cnt_contract_korting,
                                        prs_contactpersoon_key,
                                        ins_discipline_key,
                                        cnt_contract_document,
                                        prs_perslid_key_eig,
                                        prs_perslid_key_beh,
                                        prs_afdeling_key_eig,
                                        cnt_contract_status,
                                        cnt_contract_looptijd_van,
                                        prs_kostenplaats_key,
                                        cnt_contract_termijnkosten,
                                        cnt_contract_opmerking,
                                        cnt_contract_mantel_key,
                                        cnt_contract_opzegtermijn,
                                        cnt_contract_rappeltermijn,
                                        cnt_contract_versie,
                                        prs_dienst_key,
                                        cnt_contract_verlenging)
                 VALUES   (rec.nummer_extern,
                           rec.beschrijving,
                           rec.datum_eind,
                           rec.bedrag,
                           rec.uurtarief,
                           rec.prs_bedrijf_key,
                           rec.nummer_intern,
                           rec.korting,
                           v_contactpersoon_key,
                           v_cnt_discipline_key,
                           rec.omschrijving,
                           v_perslid_key_eig,
                           v_perslid_key_beh,
                           rec.prs_afdeling_key,
                           v_cnt_status,
                           rec.datum_ingang,
                           rec.prs_kostenplaats_key,
                           rec.bedrag_termijn,
                           rec.opmerking,
                           rec.mantel_key,
                           v_termijn_key_opzeg,
                           v_termijn_key_rappel,
                           rec.versie,
                           rec.prs_dienst_key,
                           rec.verlengen)
              RETURNING   cnt_contract_key      INTO   v_contract_key;

              v_srtnoti_code := 'CNTNEW';
              v_count_cntnew := v_count_cntnew + 1;
           ELSE                         -- Contract bestaat al --> bijwerken.
              SELECT   cnt_contract_key
                INTO   v_contract_key
                FROM   cnt_contract
               WHERE   TRIM (cnt_contract_nummer_intern) = rec.nummer_intern
                       AND COALESCE (cnt_contract_versie, '0') = COALESCE (rec.versie, '0')
                       AND cnt_contract_verwijder IS NULL;

              v_errormsg := 'Fout bij bijwerken contract.';

              UPDATE   cnt_contract
                 SET   cnt_contract_nummer = rec.nummer_extern,
                       cnt_contract_omschrijving = rec.beschrijving,
                       cnt_contract_looptijd_tot = rec.datum_eind,
                       cnt_contract_kosten = rec.bedrag,
                       cnt_contract_uurloon = rec.uurtarief,
                       cnt_prs_bedrijf_key = rec.prs_bedrijf_key,
                       cnt_contract_korting = rec.korting,
                       prs_contactpersoon_key = v_contactpersoon_key,
                       ins_discipline_key = v_cnt_discipline_key,
                       cnt_contract_document = rec.omschrijving,
                       prs_perslid_key_eig = v_perslid_key_eig,
                       prs_perslid_key_beh = v_perslid_key_beh,
                       prs_afdeling_key_eig = rec.prs_afdeling_key,
                       cnt_contract_looptijd_van = rec.datum_ingang,
                       prs_kostenplaats_key = rec.prs_kostenplaats_key,
                       cnt_contract_termijnkosten = rec.bedrag_termijn,
                       cnt_contract_opmerking = rec.opmerking,
                       cnt_contract_mantel_key = rec.mantel_key,
                       cnt_contract_opzegtermijn = v_termijn_key_opzeg,
                       cnt_contract_rappeltermijn = v_termijn_key_rappel,
                       cnt_contract_versie = rec.versie,
                       prs_dienst_key = rec.prs_dienst_key,
                       cnt_contract_verlenging = rec.verlengen
               WHERE   cnt_contract_key = v_contract_key;

              v_srtnoti_code := 'CNTUPD';
              v_count_cntupd := v_count_cntupd + 1;
           END IF;

           -- Upsert gebouwscope: bij UPDATE eerst kijken of scope al bestaat.
           -- Zo niet, dan toevoegen (bij INSERT altijd toevoegen).
           -- NB. Op deze manier kan een contract meerdere keren voorkomen in
           --     het importbestand, met verschillende gebouwen.
           IF (rec.plaats_key IS NOT NULL)
           THEN
              -- Komt deze scope al voor?
              SELECT   COUNT ( * )
                INTO   v_count
                FROM   cnt_contract_plaats
               WHERE       cnt_contract_key = v_contract_key
                       AND cnt_alg_plaats_key = rec.plaats_key
                       AND cnt_alg_plaats_code = rec.plaats_code;


              IF (v_count = 0)    -- Scope komt nog niet voor, dus toevoegen.
              THEN
                 v_errormsg := 'Fout bij toevoegen scope';

                 INSERT INTO cnt_contract_plaats (
                                                     cnt_contract_key,
                                                     cnt_alg_plaats_key,
                                                     cnt_alg_plaats_code
                            )
                   VALUES   (
                                v_contract_key,
                                rec.plaats_key,
                                rec.plaats_code
                            );
              END IF;
           END IF;

           -- NULL-waarden resulteren NIET in het wissen van kenmerkvelden
           -- (bijwerken kan wel, maar wissen dus niet)!
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde1);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde2);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde3);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde4);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde5);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde6);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde7);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde8);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde9);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde10);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde11);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde12);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde13);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde14);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde15);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde16);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde17);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde18);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde19);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde20);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde21);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde22);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde23);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde24);
           upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde25);

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

  fac.imp_writelog (p_import_key,
                    'S',
                    'CNT-contracten/#ingelezen: ' || TO_CHAR (v_count_tot),
                    '');
  fac.imp_writelog (
     p_import_key,
     'S',
     'CNT-contracten/#toegevoegd: ' || TO_CHAR (v_count_cntnew),
     ''
  );
  fac.imp_writelog (
     p_import_key,
     'S',
     'CNT-contracten/#bijgewerkt: ' || TO_CHAR (v_count_cntupd),
     ''
  );
  COMMIT;
EXCEPTION
  WHEN OTHERS
  THEN
     oracle_err_num := SQLCODE;
     oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
     v_errormsg :=
           v_errormsg
        || ' ORACLE (error '
        || oracle_err_num
        || '/'
        || oracle_err_mes
        || ')';
     fac.imp_writelog (p_import_key,
                       'E',
                       v_errormsg,
                       'Importproces contracten afgebroken!');
END fac_update_cnt;
/



--------------------------------           Standaard Export Procedures            -----------------------------------
-- JGL: Overigens is bij een ORDER BY DBMS_RANDOM.VALUE niet gegarandeerd dat die voor
--      elke regel een unieke waarde heeft! Vergelijk 'ORDER BY SYSDATE': dit zou ook niet sorteren.
-- http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:3181424400346795479
CREATE OR REPLACE PROCEDURE fac_select_kto_kandidaten (
  p_applname IN VARCHAR2, p_applrun IN VARCHAR2
)
AS
  -- NIET via de koninklijke route fac.gettrackingdate vanwege enorme performance-killer!

  -- Alle reserveringscatalogi met hun percentage, drempel en het aantal afgemelde reserveringen van de afgelopen periode
  -- tot en met 'gisteren' (dus nog niet die van vandaag), of de afgelopen week als het de eerste keer is
  -- NOOT: Alleen ruimte-reserveringen vooralsnog!
  CURSOR c_cluster_r
  IS
       SELECT   d.ins_discipline_key,
                d.ins_discipline_ktopercentage perc,
                COALESCE (d.ins_discipline_ktodrempel, 0) drempel,
                COUNT (res_rsv_ruimte_key) aantal
         FROM   res_rsv_ruimte rrr,
                res_ruimte_opstelling ro,
                res_ruimte rr,
                ins_tab_discipline d
        WHERE   rrr.res_rsv_ruimte_verwijder IS NULL
        AND     rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
        AND     ro.res_ruimte_key = rr.res_ruimte_key
        AND     rr.res_discipline_key = d.ins_discipline_key
        AND     rrr.res_rsv_ruimte_tot > (SELECT GREATEST(COALESCE(MAX(res_rsv_ruimte_kto_verstuurd), SYSDATE-7), SYSDATE-7)
                                           FROM  res_rsv_ruimte irrr,
                                                 res_ruimte_opstelling iro,
                                                 res_ruimte irr
                                           WHERE irrr.res_ruimte_opstel_key = iro.res_ruimte_opstel_key
                                             AND iro.res_ruimte_key = irr.res_ruimte_key
                                             AND irr.res_discipline_key = d.ins_discipline_key)
        AND     rrr.res_rsv_ruimte_tot < SYSDATE
        AND     res_rsv_ruimte_kto_verstuurd IS NULL
        AND     ins_discipline_ktopercentage > 0
     GROUP BY   d.ins_discipline_key,
                d.ins_discipline_ktopercentage,
                d.ins_discipline_ktodrempel;


  CURSOR c_lijst_r (
     p_ins_discipline_key NUMBER
  )
  IS
        SELECT  rrr.res_rsv_ruimte_key,
                SYSDATE ts
        FROM    res_rsv_ruimte rrr,
                res_ruimte_opstelling ro,
                res_ruimte rr,
                res_discipline d,
                prs_perslid p
        WHERE   rrr.res_rsv_ruimte_verwijder IS NULL
        AND     rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
        AND     ro.res_ruimte_key = rr.res_ruimte_key
        AND     rr.res_discipline_key = d.ins_discipline_key
        AND     d.ins_discipline_key = p_ins_discipline_key
        -- Contactpersoon van reservering heeft mail-adres
        AND     rrr.res_rsv_ruimte_contact_key = p.prs_perslid_key
        AND     p.prs_perslid_email IS NOT NULL
        AND     rrr.res_rsv_ruimte_tot > (SELECT GREATEST(COALESCE(MAX(res_rsv_ruimte_kto_verstuurd), SYSDATE-7), SYSDATE-7)
                                           FROM  res_rsv_ruimte irrr,
                                                 res_ruimte_opstelling iro,
                                                 res_ruimte irr
                                           WHERE irrr.res_ruimte_opstel_key = iro.res_ruimte_opstel_key
                                             AND iro.res_ruimte_key = irr.res_ruimte_key
                                             AND irr.res_discipline_key = d.ins_discipline_key)
        AND     rrr.res_rsv_ruimte_tot < SYSDATE
        AND     res_rsv_ruimte_kto_verstuurd IS NULL
        ORDER BY   DBMS_RANDOM.VALUE;

  -- NIET via de koninklijke route fac.gettrackingdate vanwege enorme performance-killer!
  -- Alle vakgroepen met hun percentage, drempel en het aantal afgemelde meldingen van de afgelopen periode
  CURSOR c_cluster_m
  IS
       SELECT   d.ins_discipline_key,
                d.ins_discipline_ktopercentage perc,
                COALESCE (d.ins_discipline_ktodrempel, 0) drempel,
                COUNT (mld_melding_key) aantal
         FROM   mld_melding m,
                mld_stdmelding std,
                mld_discipline d,
                fac_tracking t,
                fac_srtnotificatie sn
        WHERE   m.mld_stdmelding_key = std.mld_stdmelding_key
          AND   std.mld_ins_discipline_key = d.ins_discipline_key
          -- Afgemelde meldingen van afgelopen periode
          AND   m.mld_melding_key = t.fac_tracking_refkey
                AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
                AND sn.fac_srtnotificatie_code = 'MLDAFM'
          AND   t.fac_tracking_datum > (SELECT GREATEST(COALESCE(MAX(mld_melding_kto_verstuurd), SYSDATE-7), SYSDATE-7)
                                          FROM  mld_melding im,
                                                mld_stdmelding istd
                                         WHERE  im.mld_stdmelding_key = istd.mld_stdmelding_key
                                           AND  istd.mld_ins_discipline_key = d.ins_discipline_key)
          AND   mld_melding_kto_verstuurd IS NULL
          AND   ins_discipline_ktopercentage > 0
     GROUP BY   d.ins_discipline_key,
                d.ins_discipline_ktopercentage,
                d.ins_discipline_ktodrempel;

  CURSOR c_lijst_m (
     p_ins_discipline_key                 NUMBER
  )
  IS
       SELECT   m.mld_melding_key,
                SYSDATE ts
         FROM   mld_melding m,
                mld_stdmelding std,
                mld_discipline d,
                prs_perslid p,
                fac_tracking t,
                fac_srtnotificatie sn
        WHERE   m.mld_stdmelding_key = std.mld_stdmelding_key
          AND   std.mld_ins_discipline_key = d.ins_discipline_key
          AND   d.ins_discipline_key = p_ins_discipline_key
          -- Persoon van melding heeft mail-adres
          AND   m.prs_perslid_key = p.prs_perslid_key
          AND   p.prs_perslid_email IS NOT NULL
          AND   m.mld_melding_kto = 1
          -- Afgemelde meldingen van afgelopen periode
          AND   m.mld_melding_key = t.fac_tracking_refkey
          AND   t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
          AND   sn.fac_srtnotificatie_code = 'MLDAFM'
          AND   t.fac_tracking_datum > (SELECT  GREATEST(COALESCE(MAX(mld_melding_kto_verstuurd), SYSDATE-7), SYSDATE-7)
                                          FROM  mld_melding im,
                                                mld_stdmelding istd
                                         WHERE  im.mld_stdmelding_key = istd.mld_stdmelding_key
                                           AND  istd.mld_ins_discipline_key = d.ins_discipline_key)
          AND   mld_melding_kto_verstuurd IS NULL
     ORDER BY   DBMS_RANDOM.VALUE;

  -- NIET via de koninklijke route fac.gettrackingdate vanwege enorme performance-killer!
  -- Alle bestelcatalogi met hun percentage, drempel en het aantal afgemelde bestellingen van de afgelopen periode
  CURSOR c_cluster_b
  IS
       SELECT   d.ins_discipline_key,
                d.ins_discipline_ktopercentage perc,
                COALESCE (d.ins_discipline_ktodrempel, 0) drempel,
                COUNT (b.bes_bestelling_key) aantal
         FROM   bes_bestelling b,
                bes_bestelling_item bi,
                bes_srtdeel sd,
                bes_srtgroep sg,
                bes_discipline d,
                fac_tracking t,
                fac_srtnotificatie sn
        WHERE   b.bes_bestelling_key = bi.bes_bestelling_key
          AND   bi.bes_srtdeel_key = sd.bes_srtdeel_key
          AND   sd.bes_srtgroep_key = sg.bes_srtgroep_key
          AND   sg.ins_discipline_key = d.ins_discipline_key
          -- Afgemelde bestellingen van afgelopen periode
          AND   b.bes_bestelling_key = t.fac_tracking_refkey
          AND   t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
          AND   sn.fac_srtnotificatie_code = 'BESOTV'
          AND   t.fac_tracking_datum > (SELECT GREATEST(COALESCE(MAX(bes_bestelling_kto_verstuurd), SYSDATE-7), SYSDATE-7)
                                        FROM  bes_bestelling ib,
                                              bes_bestelling_item ibi,
                                              bes_srtdeel isd,
                                              bes_srtgroep isg
                                        WHERE ib.bes_bestelling_key = ibi.bes_bestelling_key
                                          AND ibi.bes_srtdeel_key = isd.bes_srtdeel_key
                                          AND isd.bes_srtgroep_key = isg.bes_srtgroep_key
                                          AND isg.ins_discipline_key = d.ins_discipline_key)
        AND     bes_bestelling_kto_verstuurd IS NULL
        AND     ins_discipline_ktopercentage > 0
     GROUP BY   d.ins_discipline_key,
                d.ins_discipline_ktopercentage,
                d.ins_discipline_ktodrempel;


  CURSOR c_lijst_b (
     p_ins_discipline_key                 NUMBER
  )
  IS
       SELECT   DISTINCT b.bes_bestelling_key,
                SYSDATE ts
         FROM   bes_bestelling b,
                bes_bestelling_item bi,
                bes_srtdeel sd,
                bes_srtgroep sg,
                bes_discipline d,
                prs_perslid p,
                fac_tracking t,
                fac_srtnotificatie sn
        WHERE   b.bes_bestelling_key = bi.bes_bestelling_key
          AND   bi.bes_srtdeel_key = sd.bes_srtdeel_key
          AND   sd.bes_srtgroep_key = sg.bes_srtgroep_key
          AND   sg.ins_discipline_key = d.ins_discipline_key
          AND   d.ins_discipline_key = p_ins_discipline_key
          -- Persoon van melding heeft mail-adres
          AND   b.prs_perslid_key = p.prs_perslid_key
          AND   p.prs_perslid_email IS NOT NULL
          -- Afgemelde bestellingen van afgelopen periode
          AND   b.bes_bestelling_key = t.fac_tracking_refkey
          AND   t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
          AND   sn.fac_srtnotificatie_code = 'BESOTV'
          AND   t.fac_tracking_datum > (SELECT GREATEST(COALESCE(MAX(bes_bestelling_kto_verstuurd), SYSDATE-7), SYSDATE-7)
                                        FROM  bes_bestelling ib,
                                              bes_bestelling_item ibi,
                                              bes_srtdeel isd,
                                              bes_srtgroep isg
                                        WHERE ib.bes_bestelling_key = ibi.bes_bestelling_key
                                          AND ibi.bes_srtdeel_key = isd.bes_srtdeel_key
                                          AND isd.bes_srtgroep_key = isg.bes_srtgroep_key
                                          AND isg.ins_discipline_key = d.ins_discipline_key)
        AND     bes_bestelling_kto_verstuurd IS NULL
     ORDER BY   DBMS_RANDOM.VALUE;

  v_aantal_kto     NUMBER;
  v_count_upd      NUMBER;
  v_count          NUMBER;
  v_errorhint      VARCHAR2(200);
  v_omschrijving   VARCHAR2(4000);
  v_errormsg       VARCHAR (200);
  oracle_err_num   NUMBER;
  oracle_err_mes   VARCHAR2 (200);
BEGIN

  -- KTO's op meldingen
  v_errorhint := 'Doorloop de vakgroepen';
  FOR rec1 IN c_cluster_m
  LOOP
     BEGIN
        IF (rec1.perc <> 0 OR rec1.drempel <> 0) AND rec1.aantal > 0
        THEN
           -- Vakgroep heeft afgemelde meldingen in de voorgaande periode,
           -- en het is een vakgroep waarop KTO van toepassing is (volgens ingesteld percentage en/of een drempel)
           v_aantal_kto := TRUNC ( (rec1.perc * rec1.aantal) / 100);
           IF v_aantal_kto < rec1.drempel
           THEN
              v_aantal_kto := rec1.drempel;
           END IF;

           v_count_upd := 1;

           FOR rec2 IN c_lijst_m (rec1.ins_discipline_key)
           LOOP
              BEGIN
                 IF v_count_upd <= v_aantal_kto
                 THEN
                    v_errorhint := 'Toevoegen meldingen kto-notificatie';
                    UPDATE mld_melding
                       SET mld_melding_kto_verstuurd = rec2.ts
                     WHERE mld_melding_key = rec2.mld_melding_key;
                    fac.trackaction('MLDKTO', rec2.mld_melding_key, NULL, rec2.ts, NULL);
                 END IF;
                 v_count_upd := v_count_upd + 1;
              EXCEPTION
                 WHEN OTHERS
                 THEN
                    oracle_err_num := SQLCODE;
                    oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                    v_errormsg := 'Exception ' || oracle_err_mes;
                    fac.writelog (
                       p_applname,
                       'W',
                       v_errormsg,
                       'Aanmaken Melding KTO: ' || rec2.mld_melding_key
                    );
                    COMMIT;
              END;
           END LOOP;
        END IF;
     END;
  END LOOP;

  -- KTO's op reserveringen
  v_errorhint := 'Doorloop de reserveerbare ruimtecatalogi';
  FOR rec1 IN c_cluster_r
  LOOP
     BEGIN
        IF (rec1.perc <> 0 OR rec1.drempel <> 0) AND rec1.aantal > 0
        THEN
           -- Ruimtecatalogus heeft reserveringen die in de voorgaande periode zijn beeindigd
           -- en het is een catalogus waarop KTO van toepassing is (volgens ingesteld percentage en/of een drempel)
           v_aantal_kto := TRUNC ( (rec1.perc * rec1.aantal) / 100);
           IF v_aantal_kto < rec1.drempel
           THEN
              v_aantal_kto := rec1.drempel;
           END IF;

           v_count_upd := 1;

           FOR rec2 IN c_lijst_r (rec1.ins_discipline_key)
           LOOP
              BEGIN
                 IF v_count_upd <= v_aantal_kto
                 THEN
                    v_errorhint := 'Toevoegen reserveringen kto-notificatie';
                    UPDATE res_rsv_ruimte
                       SET res_rsv_ruimte_kto_verstuurd = rec2.ts
                     WHERE res_rsv_ruimte_key = rec2.res_rsv_ruimte_key;
                    fac.trackaction('RESKTO', rec2.res_rsv_ruimte_key, NULL, rec2.ts, NULL);
                 END IF;
                 v_count_upd := v_count_upd + 1;
              EXCEPTION
                 WHEN OTHERS
                 THEN
                    oracle_err_num := SQLCODE;
                    oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                    v_errormsg := 'Exception ' || oracle_err_mes;
                    fac.writelog (
                       p_applname,
                       'W',
                       v_errormsg,
                       'Aanmaken Reservering KTO: ' || rec2.res_rsv_ruimte_key
                    );
                    COMMIT;
              END;
           END LOOP;
        END IF;
     END;
  END LOOP;

  -- KTO's op bestellingen
  v_errorhint := 'Doorloop de bestelcatalogi';
  FOR rec1 IN c_cluster_b
  LOOP
     BEGIN
        IF (rec1.perc <> 0 OR rec1.drempel <> 0) AND rec1.aantal > 0
        THEN
           -- Bestelcatalogus heeft geleverde bestellingen in de voorgaande periode,
           -- en het is een catalogus waarop KTO van toepassing is (volgens ingesteld percentage en/of een drempel)
           v_aantal_kto := TRUNC ( (rec1.perc * rec1.aantal) / 100);
           IF v_aantal_kto < rec1.drempel
           THEN
              v_aantal_kto := rec1.drempel;
           END IF;

           v_count_upd := 1;

           FOR rec2 IN c_lijst_b (rec1.ins_discipline_key)
           LOOP
              BEGIN
                 IF v_count_upd <= v_aantal_kto
                 THEN
                    v_errorhint := 'Toevoegen bestellingen kto-notificatie';
                    UPDATE bes_bestelling
                       SET bes_bestelling_kto_verstuurd = rec2.ts
                     WHERE bes_bestelling_key = rec2.bes_bestelling_key;
                    fac.trackaction('BESKTO', rec2.bes_bestelling_key, NULL, rec2.ts, NULL);
                 END IF;
                 v_count_upd := v_count_upd + 1;
              EXCEPTION
                 WHEN OTHERS
                 THEN
                    oracle_err_num := SQLCODE;
                    oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                    v_errormsg := 'Exception ' || oracle_err_mes;
                    fac.writelog (
                       p_applname,
                       'W',
                       v_errormsg,
                       'Aanmaken Bestelling KTO: ' || rec2.bes_bestelling_key
                    );
                    COMMIT;
              END;
           END LOOP;
        END IF;
     END;
  END LOOP;
END;
/

-- Procedure om aan te geven voor welke meldingen een kto verzonden moet worden.
CREATE OR REPLACE PROCEDURE fac_export_kto_kandidaten (
  p_applname   IN   VARCHAR2,
  p_applrun    IN   VARCHAR2,
  p_filedir    IN   VARCHAR2,
  p_filename   IN   VARCHAR2
)
AS
  v_errormsg       VARCHAR (200);
  oracle_err_num   NUMBER;
  oracle_err_mes   VARCHAR2 (200);
BEGIN
 v_errormsg := 'Geen akties';
END;
/


-- MS-Exchange sync-import: onthoudt de laatste syncstate van een reserveerbare ruimte
-- met betekenis: tot die markering ben ik bij.
-- versie met een CLOB voor de syncstate, omdat die in de praktijk langer
-- dan 4000 karakters blijkt te kunnen zijn. De XSL-stylesheet knipt de syncstate uit
-- de XML op in stukken van max 4000 karakters -- deze import plakt die weer aan elkaar.
CREATE OR REPLACE PROCEDURE fac_import_exchsync (p_import_key IN NUMBER)
AS
  v_newline          fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
  v_fielddelimitor   VARCHAR2 (2);
  v_errormsg         VARCHAR2 (200);
  oracle_err_mes     VARCHAR2 (200);
  header_is_valid    NUMBER;
  --
  v_res_ruimte_key   res_ruimte.res_ruimte_key%TYPE;
  v_syncstate        VARCHAR2(4000);
  v_len              NUMBER;
  v_sync             NUMBER;

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

  rec1               c1%ROWTYPE;
BEGIN
  v_fielddelimitor := fac.import_delimiter(p_import_key);
  header_is_valid := 0;
  v_len := 0;

  -- De res_ruimte_key waar we het over hebben zit in de refkey van de import
  SELECT fac_import_refkey
    INTO v_res_ruimte_key
    FROM fac_import
   WHERE fac_import_key = p_import_key;

  SELECT r.res_ruimte_key - COALESCE(s.res_ruimte_key, 0)
    INTO v_sync
    FROM res_ruimte  r
       , res_ruimte_sync s
   WHERE r.res_ruimte_key = s.res_ruimte_key(+)
     AND r.res_ruimte_extern_id IS NOT NULL
     AND r.res_ruimte_key = v_res_ruimte_key;
  --
  -- v_sync: no_data_found --> niet gevonden, niets doen.
  --                     0 --> bestaat in res_ruimte en res_ruimte_sync.
  --                    >0 --> bestaat alleen in res_ruimte.
  IF (v_sync = 0)
  THEN
    -- Syncstate leegmaken, zodat we 'n append kunnen doen.
    UPDATE res_ruimte_sync
       SET res_ruimte_syncstate = NULL
     WHERE res_ruimte_key = v_res_ruimte_key;
  ELSE
    -- Voeg een res_ruimte_sync record toe.
    INSERT INTO res_ruimte_sync (res_ruimte_key)
    VALUES (v_res_ruimte_key);
  END IF;

  FOR rec1 IN c1 LOOP
     BEGIN
        v_newline := rec1.fac_imp_file_line;
        fac.imp_getfield (v_newline, v_fielddelimitor, v_syncstate);

        IF header_is_valid = 0
        THEN
           IF UPPER (TRIM (v_syncstate)) LIKE '%SYNCSTATE%'
           THEN
              header_is_valid := 1;
              DBMS_OUTPUT.put_line ('goeie header');
           END IF;
        ELSE
           v_errormsg := 'Fout bij update van syncstate';
           DBMS_OUTPUT.put_line ('echte data');

           -- Stylesheet knipt syncstates langer dan 4000 karakters op in meerdere delen
           -- Hier weer aan elkaar plakken.
           UPDATE res_ruimte_sync
              SET res_ruimte_syncstate = res_ruimte_syncstate || TRIM(v_syncstate),
                  res_ruimte_syncdate = SYSDATE
            WHERE res_ruimte_key = v_res_ruimte_key;
        END IF;
     END;
  END LOOP;

  -- Lange syncstate? (>4000) Dat even loggen.
  v_errormsg := 'Fout bij bepalen lengte syncstate';
  SELECT LENGTH(res_ruimte_syncstate)
    INTO v_len
    FROM res_ruimte_sync
   WHERE res_ruimte_key = v_res_ruimte_key;

  IF (v_len > 4000)
  THEN
     fac.imp_writelog (p_import_key,
                       'I',
                       'Lange syncstate, ' || v_len || ' karakters',
                       'res_ruimte_key: ' || v_res_ruimte_key);
  END IF;
EXCEPTION
  WHEN NO_DATA_FOUND
  THEN
     NULL;
  WHEN OTHERS
  THEN
     oracle_err_mes := SUBSTR (SQLERRM, 1, 1000);
     v_errormsg := oracle_err_mes;
     fac.imp_writelog (p_import_key,
                       'E',
                       v_errormsg,
                       'res_ruimte_key: ' || v_res_ruimte_key);
END;
/

CREATE OR REPLACE PROCEDURE fac_update_exchsync (p_import_key IN NUMBER)
AS
BEGIN
  NULL;
END;
/

CREATE OR REPLACE PROCEDURE fac_import_translation (p_import_key IN NUMBER)
AS
  c_delim           VARCHAR2 (2) := fac.import_delimiter(p_import_key);
  v_newline         fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
  v_errormsg        VARCHAR2 (1000);
  v_errorhint       VARCHAR2 (1000);
  oracle_err_num    NUMBER;
  oracle_err_mes    VARCHAR2 (200);
  header_is_valid   NUMBER;
  v_count_tot       NUMBER (10);
  v_count_imp       NUMBER (10);
  v_ongeldig        NUMBER (1);
  v_aanduiding      VARCHAR2 (4000);
  -- De importvelden
  v_label           VARCHAR2 (100);
  v_module          VARCHAR2 (100);
  v_lang            VARCHAR2 (100);
  v_tekst           VARCHAR2 (4000);

  CURSOR c1
  IS
       SELECT *
         FROM fac_imp_file
        WHERE fac_import_key = p_import_key
     ORDER BY fac_imp_file_index;
BEGIN
  DELETE FROM fac_imp_translation;

  COMMIT;
  v_count_tot := 0;
  v_count_imp := 0;
  header_is_valid := 0;

  FOR rec1 IN c1 LOOP
     BEGIN
        v_errormsg := 'Error fetching record';

        v_newline := rec1.fac_imp_file_line;
        v_aanduiding := '';
        v_ongeldig := 0;
        -- Lees alle veldwaarden
        fac.imp_getfield (v_newline, c_delim, v_label);
        fac.imp_getfield (v_newline, c_delim, v_module);
        fac.imp_getfield (v_newline, c_delim, v_lang);
        fac.imp_getfield (v_newline, c_delim, v_tekst);

        v_aanduiding := '[' || v_label || '|' || v_lang || '|' || v_tekst || '] ';

        -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
        -- de juiste kolomkop.
        -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
        IF (header_is_valid = 0)
        THEN
           IF (    UPPER (v_label) = 'LABEL'
               AND UPPER (v_module) = 'MODULE'
               AND UPPER (SUBSTR(v_lang,1,8)) = 'LANGUAGE'       -- er mag best nog wat achter staan
               AND UPPER (SUBSTR(v_tekst,1,11)) = 'TRANSLATION') -- er mag best nog wat achter staan
           THEN
              header_is_valid := 1;
           END IF;
        ELSE
           v_count_tot := v_count_tot + 1;

           -- Controleer alle veldwaarden
           v_errormsg := 'Label invalid';
           v_label := SUBSTR (TRIM (v_label), 1, 60);

           v_errormsg := 'Module invalid';
           v_module := UPPER (SUBSTR (TRIM (v_module), 1, 3));

           --Opportunity: sanitize the module, currently valid are
           -- ASP, BES, BEZ, CNT,FAC, FIN, INS, MLD, MSG, PRJ, PRS, RES

           v_errormsg := 'Language invalid';
           v_lang := SUBSTR (TRIM (v_lang), 1, 3);

           IF (v_lang IS NULL)
           THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                'Record ignored');
              v_ongeldig := 1;
           END IF;

           --
           v_errormsg := 'Translation invalid';
           -- Assume that spaces are relevant so do not trim here
           v_tekst := SUBSTR (v_tekst, 1, 2000);
            --

            -- Insert geformatteerde import record
            IF (v_ongeldig = 0)
            THEN
               BEGIN
                  v_errormsg := 'Error inserting record';

                  INSERT INTO fac_imp_translation (locale_label, locale_module, locale_lang, locale_tekst)
                      VALUES (v_label, v_module, v_lang, v_tekst);

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

  IF (header_is_valid = 0)
  THEN
     fac.imp_writelog (p_import_key,
                       'E',
                       'Invalid FACILITOR translation file',
                       'No valid header [LABEL|MODULE|LANGUAGE|TRANSLATION] found!');
  ELSE
     fac.imp_writelog (p_import_key,
                       'S',
                       'Translation/#valid lines: ' || TO_CHAR (v_count_tot),
                       '');
     fac.imp_writelog (p_import_key,
                       'S',
                       'Translation/#invalid lines: ' || TO_CHAR (v_count_tot - v_count_imp),
                       '');
  END IF;

  COMMIT;
EXCEPTION
  WHEN OTHERS
  THEN
     oracle_err_num := SQLCODE;
     oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
     v_errormsg := v_errormsg || oracle_err_num || '/' || oracle_err_mes;
     fac.imp_writelog (p_import_key,
                       'E',
                       v_aanduiding || v_errormsg,
                       'Import of translation aborted!');
END;
/

CREATE OR REPLACE PROCEDURE fac_update_translation (p_import_key IN NUMBER)
AS
  CURSOR c1
  IS
     SELECT * FROM fac_imp_translation;

  v_errormsg       VARCHAR2 (1000) := '-';
  oracle_err_num   NUMBER;
  oracle_err_mes   VARCHAR2 (200);
  v_aanduiding     VARCHAR2 (4000);
  v_geldig         NUMBER (1);
  v_count_new      NUMBER;
  v_count_upd      NUMBER;
  v_count_tot      NUMBER;
  v_count_skipped  NUMBER;
  v_existingkey    fac_locale_xsl.fac_locale_xsl_key%TYPE;
BEGIN
  v_count_tot := 0;
  v_count_new := 0;
  v_count_upd := 0;
  v_count_skipped := 0;
  v_aanduiding := '';

  FOR rec IN c1 LOOP
     BEGIN
        v_geldig := 1;
        v_aanduiding :=
           '[' || rec.locale_label || '|' || rec.locale_module || '|' || rec.locale_lang || '|' || rec.locale_tekst || '] ';

        v_existingkey := 0;

        -- Valid label? Prevent injection of non-standard labels
        BEGIN
           SELECT 1
             INTO v_geldig
             FROM fac_locale_xsl
            WHERE fac_locale_xsl_module = rec.locale_module
              AND fac_locale_xsl_label = rec.locale_label;
        EXCEPTION
           WHEN NO_DATA_FOUND
           THEN
              v_geldig := 0;
              v_count_skipped := v_count_skipped + 1;
           WHEN TOO_MANY_ROWS
           THEN
              v_geldig := 1;                                                         -- ongewijzigd
        END;

        IF v_geldig = 1
        THEN
           v_count_tot := v_count_tot + 1;

           --existing translation ?
           SELECT MAX (fac_locale_xsl_key)
             INTO v_existingkey
             FROM fac_locale_xsl
            WHERE     fac_locale_xsl_module = rec.locale_module
                  AND fac_locale_xsl_label = rec.locale_label
                  AND fac_locale_xsl_lang = rec.locale_lang;

           IF v_existingkey IS NULL
           THEN
              INSERT INTO fac_locale_xsl (fac_locale_xsl_module,
                                          fac_locale_xsl_label,
                                          fac_locale_xsl_lang,
                                          fac_locale_xsl_tekst)
                  VALUES (rec.locale_module,
                          rec.locale_label,
                          rec.locale_lang,
                          rec.locale_tekst);

              v_count_new := v_count_new + 1;
           ELSE
              UPDATE fac_locale_xsl
                 SET fac_locale_xsl_tekst = rec.locale_tekst,
                     fac_locale_xsl_isvalid = 1
               WHERE fac_locale_xsl_key = v_existingkey;

              v_count_upd := v_count_upd + 1;
           END IF;
        END IF;
     END;
  END LOOP;
  -- Fallback maar weer bijwerken.
  lcl.fallback_languages;

  fac.imp_writelog (p_import_key,
                    'S',
                    '#imported: ' || TO_CHAR (v_count_tot),
                    '');
  fac.imp_writelog (p_import_key,
                    'S',
                    '#added: ' || TO_CHAR (v_count_new),
                    '');
  fac.imp_writelog (p_import_key,
                    'S',
                    '#updated: ' || TO_CHAR (v_count_upd),
                    '');
  fac.imp_writelog (p_import_key,
                    'S',
                    '#ignored: ' || TO_CHAR (v_count_skipped),
                    '');
  COMMIT;
EXCEPTION
  WHEN OTHERS
  THEN
     oracle_err_num := SQLCODE;
     oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
     v_errormsg := v_errormsg || oracle_err_num || '/' || oracle_err_mes;
     fac.imp_writelog (p_import_key,
                       'E',
                       v_errormsg,
                       'Import of translation aborted!');
END;
/

CREATE OR REPLACE PROCEDURE fac_import_exchange (p_import_key IN NUMBER, p_days_from IN NUMBER DEFAULT 0, p_days_to IN NUMBER DEFAULT 90)
IS
BEGIN
   exc.import_exchange (p_import_key, p_days_from, p_days_to);
END fac_import_exchange;
/

CREATE OR REPLACE PROCEDURE fac_update_exchange (p_import_key IN NUMBER, p_days_from IN NUMBER DEFAULT 0, p_days_to IN NUMBER DEFAULT 90)
IS
BEGIN
   exc.update_exchange (p_import_key, p_days_from, p_days_to);
END fac_update_exchange;
/

CREATE OR REPLACE PROCEDURE fac_import_exchfull (p_import_key IN NUMBER, p_days_from IN NUMBER DEFAULT 0, p_days_to IN NUMBER DEFAULT 90)
IS
BEGIN
   exc.import_exchfull (p_import_key, p_days_from, p_days_to);
END fac_import_exchfull;
/

CREATE OR REPLACE PROCEDURE fac_update_exchfull (p_import_key IN NUMBER, p_days_from IN NUMBER DEFAULT 0, p_days_to IN NUMBER DEFAULT 90)
IS
BEGIN
   exc.update_exchfull (p_import_key, p_days_from, p_days_to);
END fac_update_exchfull;
/

REGISTERRUN('$Id$')
