--
-- $Id$
--
-- Eerste MJOB script om de kenmerken aan te maken en
-- voor iedere locatie een ruimte 0 op verdieping 0 aan te maken.

DEFINE thisfile = 'MJOB_INI.SQL'
DEFINE dbuser   = '^AA|^AQQA|^ASMS|^GULU|^NMMS|^RABO|^ZKHM|^INLO|^EXPO'

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
WHENEVER SQLERROR EXIT;
SELECT adm.scriptspoolfile('&dbuser', '&thisfile') AS fcltlogfile FROM DUAL;
WHENEVER SQLERROR CONTINUE;
SPOOL &fcltlogfile
SET DEFINE OFF

------ payload begin ------


DECLARE

CURSOR c IS
          SELECT 'OMS' omschrijving, 'X' kenmerktype, 1 lengte, 1 deci, 1 nmin, 1 nmax, 0 volgnummer FROM DUAL
UNION ALL SELECT 'Eenheid',                           'C', 10,    NULL, NULL, NULL, 10 FROM DUAL
UNION ALL SELECT 'Bouwjaar',                          'N', 4,     NULL, NULL, NULL, 15 FROM DUAL
UNION ALL SELECT 'Fabricaat',                         'C', 50,    NULL, NULL, NULL, 20 FROM DUAL
UNION ALL SELECT 'Type',                              'C', 250,   NULL, NULL, NULL, 30 FROM DUAL
UNION ALL SELECT 'Capaciteit',                        'C', 100,   NULL, NULL, NULL, 40 FROM DUAL
UNION ALL SELECT 'Aantal v2',                         'N', 8,     2,    NULL, NULL, 50 FROM DUAL
UNION ALL SELECT 'Plaats',                            'C', 200,   NULL, NULL, NULL, 50 FROM DUAL
UNION ALL SELECT 'Huidige Conditie',                  'N', 2,     NULL, NULL, NULL, 70 FROM DUAL
UNION ALL SELECT 'Gewenste Conditie',                 'N', 2,     NULL, NULL, NULL, 80 FROM DUAL
UNION ALL SELECT 'Datum laatste asset survey',        'D', NULL,  NULL, NULL, NULL, 150 FROM DUAL
UNION ALL SELECT 'Referentienummer leverancier',      'C', 50,    NULL, NULL, NULL, 130 FROM DUAL
UNION ALL SELECT 'Kritische asset',                   'N', 1,     NULL, 0,    1,    160 FROM DUAL
UNION ALL SELECT 'Vervaldatum',                       'D', NULL,  NULL, NULL, NULL, 180 FROM DUAL
UNION ALL SELECT 'NLSFB-6',                           'C', 10,    NULL, NULL, NULL, 190 FROM DUAL
UNION ALL SELECT 'Bijlagen',                          'M', NULL,  NULL, NULL, NULL, 800 FROM DUAL;

v_srtkenmerk_key NUMBER(10);
v_kenmerk_key    NUMBER(10);
v_discipline_key  NUMBER(10);
v_disc_params_key NUMBER(10);
BEGIN

   BEGIN
      SELECT ins_discipline_key
        INTO v_discipline_key
        FROM ins_discipline
       WHERE ins_discipline_omschrijving = 'Gebouwobjecten';
   EXCEPTION WHEN NO_DATA_FOUND
   THEN
      INSERT INTO ins_tab_discipline (ins_discipline_module, ins_discipline_omschrijving, ins_discipline_min_level)
      VALUES ('INS', 'Gebouwobjecten', 1)
      RETURNING ins_discipline_key INTO v_discipline_key;
   END;

   BEGIN
      SELECT ins_disc_params_key
        INTO v_disc_params_key
        FROM ins_disc_params dp
       WHERE dp.ins_discipline_key = v_discipline_key;
   EXCEPTION WHEN NO_DATA_FOUND
   THEN
      INSERT INTO ins_disc_params (ins_discipline_key, ins_disc_params_autonum)
      VALUES (v_discipline_key, 2);
   END;

   FOR rec IN c
   LOOP
      -- skip de header
      IF rec.omschrijving <> 'OMS'
      THEN
         BEGIN
            SELECT ins_srtkenmerk_key
              INTO v_srtkenmerk_key
              FROM ins_srtkenmerk
             WHERE ins_srtkenmerk_upper = UPPER(rec.omschrijving);
         EXCEPTION WHEN NO_DATA_FOUND
         THEN
            INSERT INTO ins_srtkenmerk (ins_srtkenmerk_omschrijving, ins_srtkenmerk_kenmerktype, ins_srtkenmerk_lengte, ins_srtkenmerk_dec, ins_srtkenmerk_nmin, ins_srtkenmerk_nmax)
            VALUES (rec.omschrijving, rec.kenmerktype, rec.lengte, rec.deci, rec.nmin, rec.nmax)
            RETURNING ins_srtkenmerk_key INTO v_srtkenmerk_key;
         END;

         BEGIN
            SELECT ins_kenmerk_key
              INTO v_kenmerk_key
              FROM ins_kenmerk
             WHERE ins_srtkenmerk_key = v_srtkenmerk_key;
         EXCEPTION WHEN NO_DATA_FOUND
         THEN
            INSERT INTO ins_kenmerk (ins_srtkenmerk_key, ins_srtinstallatie_key, ins_kenmerk_niveau, ins_kenmerk_volgnummer, ins_kenmerk_bewerkniveau)
            VALUES (v_srtkenmerk_key, v_discipline_key, 'D', rec.volgnummer, 'D');
         END;

      END IF;
   END LOOP;

   COMMIT;
END;
/



INSERT INTO alg_verdieping (alg_gebouw_key,
                            alg_verdieping_omschrijving,
                            alg_verdieping_volgnr,
                            alg_verdieping_code)
    SELECT g.alg_gebouw_key,
           'Verdieping 0',
           0,
           0
      FROM alg_gebouw g
     WHERE NOT EXISTS
               (SELECT alg_verdieping_key
                  FROM alg_verdieping v
                 WHERE     v.alg_gebouw_key = g.alg_gebouw_key
                       AND v.alg_verdieping_volgnr = 0);

INSERT INTO alg_ruimte (alg_verdieping_key,
                        alg_srtruimte_key,
                        alg_ruimte_nr,
                        alg_ruimte_omschrijving)
    SELECT v.alg_verdieping_key,
           1,
           0,
           'Technische installaties'
      FROM alg_verdieping v
     WHERE     alg_verdieping_volgnr = 0
           AND NOT EXISTS
                   (SELECT alg_ruimte_nr
                      FROM alg_ruimte r
                     WHERE     r.alg_verdieping_key = v.alg_verdieping_key
                           AND r.alg_ruimte_nr = '0');




CREATE OR REPLACE PROCEDURE fac_import_ins (p_import_key IN NUMBER)
IS
   c_delim                         VARCHAR2 (1) := ';';
   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_srtkenmerk_key1           VARCHAR2 (255);
   v_ins_srtkenmerk_key2           VARCHAR2 (255);
   v_ins_srtkenmerk_key3           VARCHAR2 (255);
   v_ins_srtkenmerk_key4           VARCHAR2 (255);
   v_ins_srtkenmerk_key5           VARCHAR2 (255);
   v_ins_srtkenmerk_key6           VARCHAR2 (255);
   v_ins_srtkenmerk_key7           VARCHAR2 (255);
   v_ins_srtkenmerk_key8           VARCHAR2 (255);
   v_ins_srtkenmerk_key9           VARCHAR2 (255);
   v_ins_srtkenmerk_key10          VARCHAR2 (255);
   v_ins_srtkenmerk_key11          VARCHAR2 (255);
   v_ins_srtkenmerk_key12          VARCHAR2 (255);
   v_ins_srtkenmerk_key13          VARCHAR2 (255);
   v_ins_srtkenmerk_key14          VARCHAR2 (255);
   v_ins_srtkenmerk_key15          VARCHAR2 (255);
   v_ins_srtkenmerk_key16          VARCHAR2 (255);
   v_ins_srtkenmerk_key17          VARCHAR2 (255);
   v_ins_srtkenmerk_key18          VARCHAR2 (255);
   v_ins_srtkenmerk_key19          VARCHAR2 (255);
   v_ins_srtkenmerk_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);                      -- C10
   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_omschrijving   VARCHAR2 (255);                      -- C60
   v_res_discipline_kostensoort    VARCHAR2 (255);                      -- C60
   v_prs_perslid_matchcode         VARCHAR2 (255);
   v_prs_perslid_matchwaarde       VARCHAR2 (255);
   v_ins_kenmerkwaarde1            VARCHAR2 (4000);
   v_ins_kenmerkwaarde2            VARCHAR2 (4000);
   v_ins_kenmerkwaarde3            VARCHAR2 (4000);
   v_ins_kenmerkwaarde4            VARCHAR2 (4000);
   v_ins_kenmerkwaarde5            VARCHAR2 (4000);
   v_ins_kenmerkwaarde6            VARCHAR2 (4000);
   v_ins_kenmerkwaarde7            VARCHAR2 (4000);
   v_ins_kenmerkwaarde8            VARCHAR2 (4000);
   v_ins_kenmerkwaarde9            VARCHAR2 (4000);
   v_ins_kenmerkwaarde10           VARCHAR2 (4000);
   v_ins_kenmerkwaarde11           VARCHAR2 (4000);
   v_ins_kenmerkwaarde12           VARCHAR2 (4000);
   v_ins_kenmerkwaarde13           VARCHAR2 (4000);
   v_ins_kenmerkwaarde14           VARCHAR2 (4000);
   v_ins_kenmerkwaarde15           VARCHAR2 (4000);
   v_ins_kenmerkwaarde16           VARCHAR2 (4000);
   v_ins_kenmerkwaarde17           VARCHAR2 (4000);
   v_ins_kenmerkwaarde18           VARCHAR2 (4000);
   v_ins_kenmerkwaarde19           VARCHAR2 (4000);
   v_ins_kenmerkwaarde20           VARCHAR2 (4000);
   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 bestaan van kenmerksoort (of
   -- deze - via een kenmerk - wel is gedefinieerd voor de betreffende object-
   -- discipline/groep/soort, volgt pas tijdens de update-fase)!
   --
   -- kw is bijvoorbeeld 'Parkeercode' of 'Parkeercode|3' waarbij de laatste in groep 3 zit
   -- het resultaat is NULL (als niet gevonden) of 234|3 voor strkenmer_key 234 in groep 3
   -- Als geen groep is meegegeven wordt 234|0 opgeleverd (de default groep)
   FUNCTION bepaal_srtkenmerk_key (p_kw IN VARCHAR)
      RETURN VARCHAR
   IS
      v_srtkenmerk_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   ins_srtkenmerk_key
           INTO   v_srtkenmerk_key
           FROM   ins_v_aanwezigsrtkenmerk
          WHERE   ins_srtkenmerk_upper = UPPER (v_kw)
                  AND ins_srtkenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B');
      ELSE                             -- kenmerkwaarde is numeriek (dus key)!
         SELECT   ins_srtkenmerk_key
           INTO   v_srtkenmerk_key
           FROM   ins_v_aanwezigsrtkenmerk
          WHERE   ins_srtkenmerk_key = fac.safe_to_number (v_kw)
                  AND ins_srtkenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B');
      END IF;

      RETURN TO_CHAR(v_srtkenmerk_key) || '|' || TO_CHAR(v_kenmerk_groep);
   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 kenmerksoort [' || 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_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_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) = 'OBJECTOMSCHRIJVING'
               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_omschrijving) = 'CATALOGUSNAAM'
               AND UPPER (v_res_discipline_kostensoort) =
                     'CATALOGUSKOSTENSOORT'
               AND UPPER (v_prs_perslid_matchcode) = 'PERSOONMATCHCODE'
               AND UPPER (v_prs_perslid_matchwaarde) = 'PERSOONMATCHWAARDE'
            THEN
               v_ins_srtkenmerk_key1 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde1);
               v_ins_srtkenmerk_key2 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde2);
               v_ins_srtkenmerk_key3 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde3);
               v_ins_srtkenmerk_key4 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde4);
               v_ins_srtkenmerk_key5 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde5);
               v_ins_srtkenmerk_key6 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde6);
               v_ins_srtkenmerk_key7 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde7);
               v_ins_srtkenmerk_key8 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde8);
               v_ins_srtkenmerk_key9 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde9);
               v_ins_srtkenmerk_key10 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde10);
               v_ins_srtkenmerk_key11 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde11);
               v_ins_srtkenmerk_key12 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde12);
               v_ins_srtkenmerk_key13 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde13);
               v_ins_srtkenmerk_key14 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde14);
               v_ins_srtkenmerk_key15 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde15);
               v_ins_srtkenmerk_key16 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde16);
               v_ins_srtkenmerk_key17 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde17);
               v_ins_srtkenmerk_key18 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde18);
               v_ins_srtkenmerk_key19 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde19);
               v_ins_srtkenmerk_key20 := bepaal_srtkenmerk_key (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) > 10
            THEN
               v_alg_ruimte_nr := SUBSTR (v_alg_ruimte_nr, 1, 10);
               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 := '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;

            -- 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_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
                             )
                    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_omschrijving,
                                 v_res_discipline_kostensoort,
                                 v_prs_perslid_matchcode,
                                 v_prs_perslid_matchwaarde,
                                 DECODE (v_ins_srtkenmerk_key1,
                                    NULL, v_ins_kenmerkwaarde1,
                                       TO_CHAR (v_ins_srtkenmerk_key1)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde1, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key2,
                                    NULL, v_ins_kenmerkwaarde2,
                                       TO_CHAR (v_ins_srtkenmerk_key2)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde2, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key3,
                                    NULL, v_ins_kenmerkwaarde3,
                                       TO_CHAR (v_ins_srtkenmerk_key3)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde3, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key4,
                                    NULL, v_ins_kenmerkwaarde4,
                                       TO_CHAR (v_ins_srtkenmerk_key4)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde4, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key5,
                                    NULL, v_ins_kenmerkwaarde5,
                                       TO_CHAR (v_ins_srtkenmerk_key5)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde5, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key6,
                                    NULL, v_ins_kenmerkwaarde6,
                                       TO_CHAR (v_ins_srtkenmerk_key6)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde6, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key7,
                                    NULL, v_ins_kenmerkwaarde7,
                                       TO_CHAR (v_ins_srtkenmerk_key7)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde7, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key8,
                                    NULL, v_ins_kenmerkwaarde8,
                                       TO_CHAR (v_ins_srtkenmerk_key8)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde8, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key9,
                                    NULL, v_ins_kenmerkwaarde9,
                                       TO_CHAR (v_ins_srtkenmerk_key9)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde9, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key10,
                                    NULL, v_ins_kenmerkwaarde10,
                                       TO_CHAR (v_ins_srtkenmerk_key10)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde10, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key11,
                                    NULL, v_ins_kenmerkwaarde11,
                                       TO_CHAR (v_ins_srtkenmerk_key11)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde11, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key12,
                                    NULL, v_ins_kenmerkwaarde12,
                                       TO_CHAR (v_ins_srtkenmerk_key12)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde12, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key13,
                                    NULL, v_ins_kenmerkwaarde13,
                                       TO_CHAR (v_ins_srtkenmerk_key13)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde13, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key14,
                                    NULL, v_ins_kenmerkwaarde14,
                                       TO_CHAR (v_ins_srtkenmerk_key14)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde14, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key15,
                                    NULL, v_ins_kenmerkwaarde15,
                                       TO_CHAR (v_ins_srtkenmerk_key15)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde15, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key16,
                                    NULL, v_ins_kenmerkwaarde16,
                                       TO_CHAR (v_ins_srtkenmerk_key16)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde16, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key17,
                                    NULL, v_ins_kenmerkwaarde17,
                                       TO_CHAR (v_ins_srtkenmerk_key17)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde17, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key18,
                                    NULL, v_ins_kenmerkwaarde18,
                                       TO_CHAR (v_ins_srtkenmerk_key18)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde18, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key19,
                                    NULL, v_ins_kenmerkwaarde19,
                                       TO_CHAR (v_ins_srtkenmerk_key19)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde19, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key20,
                                    NULL, v_ins_kenmerkwaarde20,
                                       TO_CHAR (v_ins_srtkenmerk_key20)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde20, 1, 3900)
                                 )
                             );

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

------ payload end   ------

SET DEFINE OFF
BEGIN adm.systrackscriptId ('$Id$', 0); END;
/

COMMIT;
SET ECHO OFF
SPOOL OFF
SET DEFINE ON
PROMPT Logfile of this upgrade is: &fcltlogfile