--
-- $Id$
--
-- Script containing customer specific sql statements for the FACILITOR database

DEFINE thisfile = 'SZDB.SQL'
DEFINE dbuser   = 'SZDB'

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
COLUMN fcltcusttxt NEW_VALUE fcltcusttxt NOPRINT;
WHENEVER SQLERROR CONTINUE;
SELECT adm.getscriptspoolfile('&thisfile') AS fcltlogfile FROM DUAL;
SPOOL &fcltlogfile
WHENEVER SQLERROR EXIT;
SELECT adm.checkscriptcust('&dbuser') AS fcltcusttxt FROM DUAL;
WHENEVER SQLERROR CONTINUE;
---------------------------------------
PROMPT &fcltcusttxt
---------------------------------------
SET DEFINE OFF

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


CREATE OR REPLACE PACKAGE SZDB
AS
   PROCEDURE processemail (pfrom      IN VARCHAR2,
                           pto        IN VARCHAR2,
                           psubject   IN VARCHAR2,
                           pbody      IN VARCHAR2,
                           psessionid IN VARCHAR2,
                           pemailkey  IN NUMBER);

   PROCEDURE mld_after_insert (p_melding_key IN NUMBER);

   FUNCTION imp_getfield_nr (p_parseline        IN VARCHAR2,
                             p_fielddelimitor   IN VARCHAR2,
                             p_nr               IN NUMBER
                            ) RETURN VARCHAR2;

   PROCEDURE res_after_insert (p_res_rsv_ruimte_key IN NUMBER);

END;
/

CREATE OR REPLACE PACKAGE BODY SZDB
AS
   -- Status: proven concept
   PROCEDURE processemail (pfrom      IN VARCHAR2,
                           pto        IN VARCHAR2,
                           psubject   IN VARCHAR2,
                           pbody      IN VARCHAR2,
                           psessionid IN VARCHAR2,
                           pemailkey  IN NUMBER
                          )
   AS
      sender              prs_perslid.prs_perslid_key%TYPE;
      kostenplaats        prs_afdeling.prs_kostenplaats_key%TYPE;
      newkey              mld_melding.mld_melding_key%TYPE;
      defaultstdmelding   fac_setting.fac_setting_default%TYPE;
      kkey_att            mld_kenmerk.mld_kenmerk_key%TYPE;
      kkey_mail           mld_kenmerk.mld_kenmerk_key%TYPE;
      errormsg            fac_result.fac_result_waarde%TYPE;
   BEGIN
      -- Valideer de sender in pfrom: kennen we deze?
      SELECT prs_perslid_key, d.prs_kostenplaats_key
        INTO sender, kostenplaats
        FROM prs_perslid p, prs_afdeling d
       WHERE p.prs_afdeling_key = d.prs_afdeling_key
             AND UPPER (prs_perslid_email) = UPPER (pfrom);

      CASE
         WHEN UPPER (pto) LIKE 'MELDING@%'
         THEN
            defaultstdmelding := 1;
            kkey_att := 1;
            kkey_mail := 2;

            -- suggested extensions:
            -- check for MLDUSE-write autorisations
            -- parse the subject to find an appropriate stdmelding, if uniquely possible
            -- append (as a note?) to an existing melding if #key is found in the subject
            BEGIN
               INSERT INTO mld_melding (mld_melding_module,
                                        mld_meldbron_key,
                                        mld_melding_datum,
                                        mld_melding_onderwerp,
                                        mld_melding_omschrijving,
                                        mld_melding_status,
                                        mld_stdmelding_key,
                                        prs_perslid_key,
                                        prs_perslid_key_voor,
                                        prs_kostenplaats_key,
                                        mld_melding_spoed)
                   VALUES ('MLD',
                           4,                                            -- email
                           SYSDATE,
                           SUBSTR (psubject, 1, 80),
                           SUBSTR (REPLACE (SUBSTR (pbody, 1, 4000),
                                            CHR (13) || CHR (10) || CHR (13) || CHR (10),
                                            CHR (13) || CHR (10)),
                                   1,
                                   4000),              -- verwijder onnodige witregels
                           NULL,
                           defaultstdmelding,
                           sender,
                           sender,
                           kostenplaats,
                           3)
                RETURNING mld_melding_key
                     INTO newkey;


               INSERT INTO fac_result (fac_result_sessionid,
                                       fac_result_naam,
                                       fac_result_waarde)
                               VALUES (psessionid,
                                       'kenmerkpath',
                                       'MLD\M' || to_char( TRUNC(newkey/1000), 'FM0000') || '___\M' || newkey || '\' || kkey_att || '\');

               INSERT INTO fac_result (fac_result_sessionid,
                                       fac_result_naam,
                                       fac_result_waarde)
                               VALUES (psessionid,
                                       'kenmerkorgmailpath',
                                       'MLD\M' || TO_CHAR (TRUNC (newkey / 1000), 'FM0000') || '___\M' || newkey || '\' || kkey_mail || '\');

               mld.setmeldingstatus (newkey, 2, sender);
            END;
         ELSE
            NULL;
      END CASE;

      IF errormsg IS NOT NULL
      THEN
         INSERT INTO fac_result (fac_result_sessionid,
                                 fac_result_naam,
                                 fac_result_waarde)
             VALUES (psessionid, 'errormsg', errormsg);
      END IF;
   EXCEPTION
      WHEN OTHERS
      THEN
         fac.writelog (
                  'PROCESSEMAIL',
                  'W',
                     'Mail kon niet verwerkt worden afzender: '
                  || pfrom
                  || '['
                  || errormsg
                  || ']',
                     'OTHERS (error '
                  || SQLCODE
                  || '/'
                  || SUBSTR (SQLERRM, 1, 100)
                  || ')');
         INSERT INTO fac_result (fac_result_sessionid,
                                 fac_result_naam,
                                 fac_result_waarde)
             VALUES (psessionid,
                     'errormsg',
                     'Database fout - Neem contact op met uw systeembeheerder');
   END;

   PROCEDURE mld_after_insert (p_melding_key IN NUMBER)
   AS
       c_kenmerk_key       MLD_KENMERK.MLD_KENMERK_KEY%TYPE := 43; -- Datum kamer beschikbaar
       v_kenmerk_oms       MLD_KENMERK.MLD_KENMERK_OMSCHRIJVING%TYPE;
       v_kenmerkm_waarde   MLD_KENMERKMELDING.MLD_KENMERKMELDING_WAARDE%TYPE;
       v_melding_oms       MLD_MELDING.MLD_MELDING_OMSCHRIJVING%TYPE;
       c_stdmelding_key    MLD_STDMELDING.MLD_STDMELDING_KEY%TYPE := 111; -- Mutatie / Nieuwe client
       v_stdmelding_key    MLD_STDMELDING.MLD_STDMELDING_KEY%TYPE;
   BEGIN
       SELECT COALESCE (mld_kenmerk_omschrijving, mld_srtkenmerk_omschrijving)
         INTO v_kenmerk_oms
         FROM mld_kenmerk k, mld_srtkenmerk sk
        WHERE     k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
              AND k.mld_kenmerk_key = c_kenmerk_key;

       SELECT mld_melding_omschrijving, mld_stdmelding_key
         INTO v_melding_oms, v_stdmelding_key
         FROM mld_melding
        WHERE mld_melding_key = p_melding_key;

       IF v_stdmelding_key = c_stdmelding_key
       THEN
           v_kenmerkm_waarde := FLX.getflex ('MLD', c_kenmerk_key, p_melding_key);

           IF v_kenmerkm_waarde IS NOT NULL
           THEN
               IF INSTR (v_melding_oms, v_kenmerk_oms) = 1
               THEN
                   -- Het kenmerk staat al in de omschrijving. Dan overschrijven we die.
                   v_melding_oms :=
                          v_kenmerk_oms
                       || ': '
                       || v_kenmerkm_waarde
                       || CHR (10)
                       || SUBSTR (v_melding_oms,
                                  LENGTH (v_kenmerk_oms) + 14,
                                  3900);
               ELSE
                   v_melding_oms :=
                          v_kenmerk_oms
                       || ': '
                       || v_kenmerkm_waarde
                       || CHR (10)
                       || SUBSTR (v_melding_oms, 1, 3900);
               END IF;

               UPDATE mld_melding
                  SET mld_melding_omschrijving = v_melding_oms
                WHERE mld_melding_key = p_melding_key;
           END IF;
       END IF;

       COMMIT;
   END;

   FUNCTION imp_getfield_nr (p_parseline        IN VARCHAR2,
                             p_fielddelimitor   IN VARCHAR2,
                             p_nr               IN NUMBER
                            ) RETURN VARCHAR2
   AS
      v_return_str VARCHAR2(1000);
   BEGIN
      fac.imp_getfield_nr (p_parseline, p_fielddelimitor, p_nr, v_return_str);
      RETURN v_return_str;
   END;

   PROCEDURE res_after_insert (p_res_rsv_ruimte_key IN NUMBER)
   AS
       v_count           NUMBER;
       v_onderwerp       VARCHAR2(100);
       v_reservering_key NUMBER;
   BEGIN
       SELECT COUNT (*)
         INTO v_count
         FROM fac_tracking t, fac_srtnotificatie sn
        WHERE     t.fac_tracking_refkey = p_res_rsv_ruimte_key
              AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
              AND sn.fac_srtnotificatie_code = 'RES2BO';

       IF v_count = 0
       THEN

           SELECT 'Nieuwe reservering (' || rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr || ') ' ||  rd.res_deel_omschrijving || ' op ' || to_char(res_rsv_ruimte_van, 'dd-mm-yyyy'),
                  rrr.res_reservering_key
             INTO v_onderwerp, v_reservering_key
             FROM res_rsv_ruimte rrr, res_rsv_deel rrd, res_deel rd
            WHERE rrr.res_rsv_ruimte_key = rrd.res_rsv_ruimte_key
              AND rrd.res_deel_key = rd.res_deel_key
              AND rrr.res_rsv_ruimte_key = p_res_rsv_ruimte_key
              AND rrr.res_activiteit_key = 30 -- Beleef-o-theek
              AND ROWNUM = 1;

           fac.trackaction ('RES2BO',
                            p_res_rsv_ruimte_key,
                            NULL,
                            NULL,
                            NULL);

           fac.putnotificationsrtprio (NULL,
                                       10981,   -- Notificatie user beleef-o-theek
                                       'RES2BO',
                                       v_reservering_key,
                                       v_onderwerp,
                                       NULL,
                                       NULL,
                                       NULL,
                                       p_res_rsv_ruimte_key,
                                       2,
                                       NULL);
       END IF;
   EXCEPTION WHEN NO_DATA_FOUND
   THEN
      -- dan was het geen reservering van de Beleef-o-theek
      NULL;
   END;

END;
/

CREATE OR REPLACE VIEW szdb_v_mutatie_status
AS
      SELECT m.mld_melding_key,
             mld_melding_datum,
             LISTAGG (
                    km.mld_kenmerk_omschrijving
                 || ': '
                 || km.mld_kenmerkmelding_waarde,
                 CHR (10))
             WITHIN GROUP (ORDER BY km.mld_kenmerk_volgnummer)
                 AS details,
             l.alg_locatie_code,
             l.alg_locatie_omschrijving,
             aog.alg_gebouw_code,
             aog.alg_gebouw_naam,
             aog.alg_verdieping_code,
             aog.alg_ruimte_nr,
             aog.alg_ruimte_omschrijving,
             FLX.getflex('MLD', 43, m.mld_melding_key) kamer_leeg,
             ms.mld_statuses_omschrijving,
             o.mld_opdr_bedrijfopdr_volgnr,
             COALESCE (pf.prs_perslid_naam_full, b.prs_bedrijf_naam)
                 uitvoerder,
             o.mld_opdr_plandatum,
             os.mld_statusopdr_omschrijving,
             o.mld_opdr_omschrijving
        FROM mld_melding                m,
             mld_opdr                   o,
             prs_v_perslid_fullnames_all pf,
             prs_bedrijf                b,
             mld_statuses               ms,
             mld_statusopdr             os,
             alg_v_allonrgoed_gegevens  aog,
             alg_locatie                l,
             (SELECT km.mld_melding_key,
                     k.mld_kenmerk_volgnummer,
                     k.MLD_KENMERK_OMSCHRIJVING,
                     km.mld_kenmerkmelding_waarde
                FROM mld_kenmerk k, mld_kenmerkmelding km
               WHERE     k.mld_kenmerk_key = km.mld_kenmerk_key
                     AND k.mld_kenmerk_omschrijving IS NOT NULL) km
       WHERE     mld_stdmelding_key = 111                           -- mutatie
             AND m.mld_melding_key = o.mld_melding_key(+)
             AND m.mld_melding_key = km.mld_melding_key(+)
             AND o.mld_uitvoerende_keys = b.prs_bedrijf_key(+)
             AND o.mld_uitvoerende_keys = pf.prs_perslid_key(+)
             AND m.mld_melding_status = ms.mld_statuses_key
             AND o.mld_statusopdr_key = os.mld_statusopdr_key(+)
             AND m.mld_alg_onroerendgoed_keys = aog.alg_onroerendgoed_keys
             AND m.mld_alg_locatie_key = l.alg_locatie_key
    GROUP BY m.mld_melding_key,
             ms.mld_statuses_omschrijving,
             o.mld_opdr_bedrijfopdr_volgnr,
             os.mld_statusopdr_omschrijving,
             pf.prs_perslid_naam_full,
             b.prs_bedrijf_naam,
             o.mld_opdr_plandatum,
             o.mld_opdr_omschrijving,
             mld_melding_datum,
             l.alg_locatie_code,
             l.alg_locatie_omschrijving,
             aog.alg_gebouw_code,
             aog.alg_gebouw_naam,
             aog.alg_verdieping_code,
             aog.alg_ruimte_nr,
             aog.alg_ruimte_omschrijving,
             ms.mld_statuses_omschrijving;

-- Notificatie view om personen die een object op hun naam gekregen hebben te notificeren.
CREATE OR REPLACE VIEW szdb_v_noti_ins_2_prs
AS
    SELECT 'CUST01'                      code,
           NULL                          sender,
           d.ins_alg_ruimte_key          receiver,
           'Ontvangstbevestiging ' || sd.ins_srtdeel_omschrijving || ' ' || d.ins_deel_omschrijving text,
           d.ins_deel_key                key,
           NULL                          xkey
      FROM fac_tracking t, ins_deel d, ins_srtdeel sd
     WHERE     t.fac_tracking_refkey = d.ins_deel_key
           AND d.ins_srtdeel_key = sd.ins_srtdeel_key
           AND UPPER (fac_tracking_oms) LIKE '%PLAATS OF EIGENAAR%'
           AND fac_srtnotificatie_key = 137
           AND ins_alg_ruimte_type = 'P'
           AND t.fac_tracking_datum BETWEEN (SELECT   fac_notificatie_job_nextrun
                                                    -   fac_notificatie_job_interval
                                                      / 24
                                               FROM fac_notificatie_job
                                              WHERE fac_notificatie_job_view =
                                                    'SZDB_V_NOTI_INS_2_PRS')
                                        AND (SELECT fac_notificatie_job_nextrun
                                               FROM fac_notificatie_job
                                              WHERE fac_notificatie_job_view =
                                                    'SZDB_V_NOTI_INS_2_PRS');

-- MJOB
CREATE OR REPLACE PROCEDURE szdb_import_mjobelementen (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_dummy                         VARCHAR  (255);
   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_ins_deel_externnr             VARCHAR2 (255);                      -- C60
   v_alg_locatie_code              VARCHAR2 (255);                      -- C10
   v_alg_gebouw_code               VARCHAR2 (255);                      -- C12
   v_alg_verdieping_volgnr         VARCHAR2 (255);                       -- N3
   v_alg_ruimte_nr                 VARCHAR2 (255);                      -- C20

   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_file_index                    NUMBER;

   v_alg_gebouw_key                NUMBER;
   v_alg_verdieping_key            NUMBER;
   v_alg_ruimte_key                NUMBER;
   v_ins_deel_key                  NUMBER;
   v_ins_srtdeel_key               NUMBER;
   v_ins_srtgroep_key              NUMBER;
   v_ins_discipline_key            NUMBER;
   v_ins_deel_volgnr               NUMBER;
   -- Overige velden:
   CURSOR c1
   IS
        SELECT   *
          FROM   fac_imp_file
         WHERE   fac_import_key = p_import_key
      ORDER BY   fac_imp_file_index;

    CURSOR c IS
          SELECT *
            FROM fac_imp_ins
        ORDER BY alg_gebouw_code, ins_deel_omschrijving;

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

   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_alg_gebouw_code);      -- Objectcode
         fac.imp_getfield (v_newline, c_delim, v_ins_srtdeel_code);     -- Componentcode
         fac.imp_getfield (v_newline, c_delim, v_ins_deel_externnr);    -- Element-ID
         fac.imp_getfield (v_newline, c_delim, v_ins_deel_opmerking);   -- Component omschrijving
--         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde1);   -- Opmerkingen//
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde2);   -- Fabrikant
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde3);   -- Kenmerken
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde4);   -- Type
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde5);   -- Cap
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde6);   -- Eenheid Cap
         fac.imp_getfield (v_newline, c_delim, v_ins_deel_aantal);      -- Aantal
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde7);   -- Eenheid aantal
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde8);   -- Bouwjaar
         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_alg_gebouw_code
            || '|'
            || v_ins_deel_externnr
            || '|'
            || v_ins_srtdeel_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_alg_gebouw_code) = 'GEBOUW_CODE'
               AND UPPER (v_ins_srtdeel_code) = 'SRTDEEL_CODE'
               AND UPPER (v_ins_deel_externnr) = 'DEEL_EXTERNNR'
               AND UPPER (v_ins_deel_opmerking) = 'DEEL_OPMERKING'
               AND UPPER (v_ins_kenmerkwaarde2) = 'FABRIKANT'
               AND UPPER (v_ins_kenmerkwaarde3) = 'OPMERKINGEN'
               AND UPPER (v_ins_kenmerkwaarde4) = 'TYPE'
               AND UPPER (v_ins_kenmerkwaarde5) = 'CAP'
               AND UPPER (v_ins_kenmerkwaarde6) = 'EENHEID CAP'
               AND UPPER (v_ins_deel_aantal) = 'DEEL_AANTAL'
               AND UPPER (v_ins_kenmerkwaarde7) = 'EENHEID AANTAL'
               AND UPPER (v_ins_kenmerkwaarde8) = 'BOUWJAAR'
            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;
            ELSE
               IF rec1.fac_imp_file_index = 1
               THEN

                  fac.imp_writelog (p_import_key,
                                    'E',
                                    'Ongeldige header aangetroffen:',
                                    'GEBOUW_CODE: ' || UPPER (v_alg_gebouw_code) || CHR(10) ||
                                    'SRTDEEL_CODE: ' || UPPER (v_ins_srtdeel_code) || CHR(10) ||
                                    'DEEL_EXTERNNR: ' || UPPER (v_ins_deel_externnr) || CHR(10) ||
                                    'DEEL_OPMERKING: ' || UPPER (v_ins_deel_opmerking) || CHR(10) ||
                                    'FABRIKANT: ' || UPPER (v_ins_kenmerkwaarde2) || CHR(10) ||
                                    'OPMERKINGEN: ' || UPPER (v_ins_kenmerkwaarde3) || CHR(10) ||
                                    'TYPE: ' || UPPER (v_ins_kenmerkwaarde4) || CHR(10) ||
                                    'CAP: ' || UPPER (v_ins_kenmerkwaarde5) || CHR(10) ||
                                    'EENHEID CAP: ' || UPPER (v_ins_kenmerkwaarde6) || CHR(10) ||
                                    'DEEL_AANTAL: ' || UPPER (v_ins_deel_aantal) || CHR(10) ||
                                    'EENHEID AANTAL: ' || UPPER (v_ins_kenmerkwaarde7) || CHR(10) ||
                                    'BOUWJAAR: ' || UPPER (v_ins_kenmerkwaarde8));
                END IF;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden

            v_errormsg := 'Gebouwcode kan niet gevonden worden';
            v_alg_gebouw_code := TRIM (v_alg_gebouw_code);

            SELECT alg_gebouw_key, alg_locatie_code
              INTO v_alg_gebouw_key, v_alg_locatie_code
              FROM alg_gebouw g, alg_locatie l
             WHERE g.alg_locatie_key = l.alg_locatie_key
               AND alg_gebouw_verwijder IS NULL
               AND UPPER(alg_gebouw_code) = v_alg_gebouw_code;

            v_alg_verdieping_volgnr := 0;
            BEGIN
               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 alg_verdieping_volgnr = 0;
            EXCEPTION WHEN NO_DATA_FOUND
            THEN
               INSERT INTO alg_verdieping (alg_gebouw_key, alg_verdieping_volgnr, alg_verdieping_omschrijving, alg_verdieping_code)
                      VALUES (v_alg_gebouw_key, 0, 'Begane grond', '0')
                      RETURNING alg_verdieping_key INTO v_alg_verdieping_key;
               fac.imp_writelog (p_import_key, 'I', v_aanduiding, 'Verdieping aangemaakt');
            END;

            v_alg_ruimte_nr := '_';
            BEGIN
               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 alg_ruimte_nr = '_';
            EXCEPTION WHEN NO_DATA_FOUND
            THEN
               INSERT INTO alg_ruimte (alg_verdieping_key, alg_ruimte_nr, alg_ruimte_omschrijving)
                      VALUES (v_alg_verdieping_key, '_', 'MJOP ruimte')
                      RETURNING alg_ruimte_key INTO v_alg_ruimte_key;
               fac.imp_writelog (p_import_key, 'I', v_aanduiding, 'Ruimte aangemaakt');
            END;
            --

            v_errormsg := 'Bepaal objectsoort';
            BEGIN
               v_ins_srtdeel_code := TRIM(v_ins_srtdeel_code);
               SELECT ins_srtdeel_omschrijving, ins_srtdeel_key, ins_srtgroep_key
                 INTO v_ins_srtdeel_omschrijving, v_ins_srtdeel_key, v_ins_srtgroep_key
                 FROM ins_srtdeel
                WHERE ins_srtdeel_verwijder IS NULL
                  AND ins_srtdeel_code = v_ins_srtdeel_code;

               v_errormsg := 'Bepaal objectgroep';
               SELECT ins_srtgroep_omschrijving, ins_discipline_key
                 INTO v_ins_srtgroep_omschrijving, v_ins_discipline_key
                 FROM ins_srtgroep
                WHERE ins_srtgroep_key = v_ins_srtgroep_key;

               v_errormsg := 'Bepaal discipline';
               SELECT ins_discipline_omschrijving
                 INTO v_ins_discipline_omschrijving
                 FROM ins_discipline
                WHERE ins_discipline_key = v_ins_discipline_key;

            EXCEPTION WHEN NO_DATA_FOUND
            THEN
               v_errormsg := 'Nieuwe NL/SfB code';
               v_ins_discipline_omschrijving := 'MJOB';
               v_ins_srtdeel_omschrijving := v_ins_srtdeel_code || 'Onbekend';
               BEGIN
                  SELECT ins_srtgroep_omschrijving
                    INTO v_ins_srtgroep_omschrijving
                    FROM ins_v_srtgroep_gegevens
                   WHERE ins_discipline_omschrijving = 'MJOB'
                     AND SUBSTR(v_ins_srtdeel_code, 1, 2) = SUBSTR(ins_srtgroep_omschrijving, 1,2);

               EXCEPTION WHEN NO_DATA_FOUND
               THEN
                  v_ins_srtgroep_omschrijving := SUBSTR(v_ins_srtdeel_code, 1, 2) || '-Onbekend';
               END;
            END;

            BEGIN
               v_errormsg := 'Bepaal object id - Kijk of het externnr bestaat';
               SELECT d.ins_deel_omschrijving
                 INTO v_ins_deel_omschrijving
                 FROM ins_v_deel_gegevens dg, ins_deel d
                WHERE dg.ins_deel_key = d.ins_deel_key
                  AND dg.alg_gebouw_upper = v_alg_gebouw_code
                  AND d.ins_deel_externnr = v_ins_deel_externnr;

            EXCEPTION WHEN NO_DATA_FOUND
            THEN
               v_ins_deel_omschrijving := NULL;
            END;

            IF v_ins_deel_omschrijving IS NULL
            THEN
               v_errormsg := 'Bepaal object id - maak een nieuw nummer aan';
               SELECT MAX(FAC.safe_to_number(SUBSTR(ins_deel_omschrijving, INSTR(ins_deel_omschrijving, '-')+1, 100)))
                 INTO v_ins_deel_volgnr
                 FROM ins_v_deel_gegevens
                WHERE ins_discipline_omschrijving = 'MJOB'
                  AND ins_deel_omschrijving LIKE v_ins_srtdeel_code || '%';

               IF v_ins_deel_volgnr IS NULL
               THEN
                  v_ins_deel_volgnr := 0;
               END IF;

               v_ins_deel_omschrijving := v_ins_srtdeel_code || LPAD(v_ins_deel_volgnr + 1, 3, '0');
            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;

            --
            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 := 'Bepaling registratiedatum';
            v_ins_kenmerkwaarde8 := TRIM(v_ins_kenmerkwaarde8);
            IF v_ins_kenmerkwaarde8 IS NOT NULL AND LENGTH(v_ins_kenmerkwaarde8) = 4
            THEN
               v_ins_deel_aanmaak := '01-01-' || TRIM(v_ins_kenmerkwaarde8);
               v_ins_deel_aanmaak_d := TO_DATE(v_ins_deel_aanmaak, 'dd-mm-yyyy');
            END IF;

            -- De rest alleen ff trimmen.
            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,
                                               alg_locatie_code,
                                               alg_gebouw_code,
                                               alg_verdieping_volgnr,
                                               alg_ruimte_nr,
                                               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_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_alg_locatie_code,
                                 v_alg_gebouw_code,
                                 v_alg_verdieping_volgnr,
                                 v_alg_ruimte_nr,
                                 DECODE (v_ins_kenmerk_key1, NULL, v_ins_kenmerkwaarde1, DECODE(v_ins_kenmerk_key1, NULL, NULL, TO_CHAR (v_ins_kenmerk_key1) || '=' || SUBSTR (v_ins_kenmerkwaarde1, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key2, NULL, v_ins_kenmerkwaarde2, DECODE(v_ins_kenmerk_key2, NULL, NULL, TO_CHAR (v_ins_kenmerk_key2) || '=' || SUBSTR (v_ins_kenmerkwaarde2, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key3, NULL, v_ins_kenmerkwaarde3, DECODE(v_ins_kenmerk_key3, NULL, NULL, TO_CHAR (v_ins_kenmerk_key3) || '=' || SUBSTR (v_ins_kenmerkwaarde3, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key4, NULL, v_ins_kenmerkwaarde4, DECODE(v_ins_kenmerk_key4, NULL, NULL, TO_CHAR (v_ins_kenmerk_key4) || '=' || SUBSTR (v_ins_kenmerkwaarde4, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key5, NULL, v_ins_kenmerkwaarde5, DECODE(v_ins_kenmerk_key5, NULL, NULL, TO_CHAR (v_ins_kenmerk_key5) || '=' || SUBSTR (v_ins_kenmerkwaarde5, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key6, NULL, v_ins_kenmerkwaarde6, DECODE(v_ins_kenmerk_key6, NULL, NULL, TO_CHAR (v_ins_kenmerk_key6) || '=' || SUBSTR (v_ins_kenmerkwaarde6, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key7, NULL, v_ins_kenmerkwaarde7, DECODE(v_ins_kenmerk_key7, NULL, NULL, TO_CHAR (v_ins_kenmerk_key7) || '=' || SUBSTR (v_ins_kenmerkwaarde7, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key8, NULL, v_ins_kenmerkwaarde8, DECODE(v_ins_kenmerk_key8, NULL, NULL, TO_CHAR (v_ins_kenmerk_key8) || '=' || SUBSTR (v_ins_kenmerkwaarde8, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key9, NULL, v_ins_kenmerkwaarde9, DECODE(v_ins_kenmerk_key9, NULL, NULL, TO_CHAR (v_ins_kenmerk_key9) || '=' || SUBSTR (v_ins_kenmerkwaarde9, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key10, NULL, v_ins_kenmerkwaarde10, DECODE(v_ins_kenmerk_key10, NULL, NULL, TO_CHAR (v_ins_kenmerk_key10) || '=' || SUBSTR (v_ins_kenmerkwaarde10, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key11, NULL, v_ins_kenmerkwaarde11, DECODE(v_ins_kenmerk_key11, NULL, NULL, TO_CHAR (v_ins_kenmerk_key11) || '=' || SUBSTR (v_ins_kenmerkwaarde11, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key12, NULL, v_ins_kenmerkwaarde12, DECODE(v_ins_kenmerk_key12, NULL, NULL, TO_CHAR (v_ins_kenmerk_key12) || '=' || SUBSTR (v_ins_kenmerkwaarde12, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key13, NULL, v_ins_kenmerkwaarde13, DECODE(v_ins_kenmerk_key13, NULL, NULL, TO_CHAR (v_ins_kenmerk_key13) || '=' || SUBSTR (v_ins_kenmerkwaarde13, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key14, NULL, v_ins_kenmerkwaarde14, DECODE(v_ins_kenmerk_key14, NULL, NULL, TO_CHAR (v_ins_kenmerk_key14) || '=' || SUBSTR (v_ins_kenmerkwaarde14, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key15, NULL, v_ins_kenmerkwaarde15, DECODE(v_ins_kenmerk_key15, NULL, NULL, TO_CHAR (v_ins_kenmerk_key15) || '=' || SUBSTR (v_ins_kenmerkwaarde15, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key16, NULL, v_ins_kenmerkwaarde16, DECODE(v_ins_kenmerk_key16, NULL, NULL, TO_CHAR (v_ins_kenmerk_key16) || '=' || SUBSTR (v_ins_kenmerkwaarde16, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key17, NULL, v_ins_kenmerkwaarde17, DECODE(v_ins_kenmerk_key17, NULL, NULL, TO_CHAR (v_ins_kenmerk_key17) || '=' || SUBSTR (v_ins_kenmerkwaarde17, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key18, NULL, v_ins_kenmerkwaarde18, DECODE(v_ins_kenmerk_key18, NULL, NULL, TO_CHAR (v_ins_kenmerk_key18) || '=' || SUBSTR (v_ins_kenmerkwaarde18, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key19, NULL, v_ins_kenmerkwaarde19, DECODE(v_ins_kenmerk_key19, NULL, NULL, TO_CHAR (v_ins_kenmerk_key19) || '=' || SUBSTR (v_ins_kenmerkwaarde19, 1, 3900))),
                                 DECODE (v_ins_kenmerk_key20, NULL, v_ins_kenmerkwaarde20, DECODE(v_ins_kenmerk_key20, NULL, NULL, TO_CHAR (v_ins_kenmerk_key20) || '=' || SUBSTR (v_ins_kenmerkwaarde20, 1, 3900))),
                                 v_ins_deel_aanmaak_d,
                                 v_ins_deel_aantal_n,
                                 v_ins_deel_externnr
                             );

                  COMMIT;
                  v_count_import := v_count_import + 1;
               END;

            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,
                              '');
            COMMIT;
      END;
   END LOOP;

    -- We gaan nu de nummering van de objecten aanpassen. Ze hebben allemaal het hoogste bestaande nummer + 1 meegekregen.
    v_alg_gebouw_code := 'Leeg';
    v_ins_srtdeel_code := 'Leeg';

    FOR rec IN c
    LOOP
        BEGIN
            IF    rec.alg_gebouw_code <> v_alg_gebouw_code
               OR rec.ins_srtdeel_code <> v_ins_srtdeel_code
            THEN
                v_ins_deel_volgnr :=
                    FAC.safe_to_number (
                        SUBSTR (rec.ins_deel_omschrijving, INSTR (rec.ins_deel_omschrijving, '-', 1) + 1, 100));
                v_alg_gebouw_code := rec.alg_gebouw_code;
                v_ins_srtdeel_code := rec.ins_srtdeel_code;
            ELSE
                v_ins_deel_volgnr := v_ins_deel_volgnr + 1;

                UPDATE fac_imp_ins
                   SET ins_deel_omschrijving =
                              rec.ins_srtdeel_code
                           || LPAD (v_ins_deel_volgnr, 3, '0')
                 WHERE     ins_deel_externnr = rec.ins_deel_externnr
                       AND alg_gebouw_code = v_alg_gebouw_code;
            END IF;
        END;
    END LOOP;

   IF (header_is_valid = 1)
   THEN
      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 szdb_import_mjobelementen;
/


CREATE OR REPLACE PROCEDURE szdb_update_mjobelementen (
    p_import_key   IN NUMBER)
IS

BEGIN
   fac_update_ins (p_import_key);
END;
/

CREATE OR REPLACE PROCEDURE szdb_import_mjobgebreken (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);
   v_file_index                     NUMBER;
   v_count                         NUMBER;
   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 (400);

   v_stdmelding_key                NUMBER;
   v_gebrek_code                   VARCHAR2(100);

   v_omvang_key                    NUMBER;
   v_intensiteit_key               NUMBER;
   v_ernst_key                     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

   DELETE cnd_imp_nen2767_results;

    SELECT mld_srtkenmerk_key
      INTO v_omvang_key
      FROM mld_srtkenmerk
     WHERE mld_srtkenmerk_code = 'OMVANG';

    SELECT mld_srtkenmerk_key
      INTO v_ernst_key
      FROM mld_srtkenmerk
     WHERE mld_srtkenmerk_code = 'ERNST';

    SELECT mld_srtkenmerk_key
      INTO v_intensiteit_key
      FROM mld_srtkenmerk
     WHERE mld_srtkenmerk_code = 'INTENSITEIT';

   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_nr (v_newline, c_delim, 6, v_gebrek_code);

         IF v_gebrek_code IS NOT NULL AND v_file_index <> 1
         THEN
            BEGIN
               SELECT mld_stdmelding_key
                 INTO v_stdmelding_key
                 FROM mld_stdmelding
                WHERE mld_stdmelding_code = v_gebrek_code;

            EXCEPTION WHEN NO_DATA_FOUND
            THEN
               INSERT INTO mld_stdmelding (mld_stdmelding_code,
                                           mld_ins_discipline_key,
                                           mld_stdmelding_omschrijving,
                                           mld_stdmelding_hint,
                                           mld_stdmelding_subject,
                                           mld_stdmelding_t_accepttijd,
                                           mld_stdmelding_t_uitvoertijd,
                                           mld_stdmelding_t_uitvtijd_pr1,
                                           mld_stdmelding_t_uitvtijd_pr2,
                                           mld_stdmelding_t_uitvtijd_pr4,
                                           alg_onrgoed_niveau,
                                           alg_onrgoed_obj_niveau,
                                           ins_srtinst_verplichtstatus,
                                           mld_stdmelding_slabewaken)

                   SELECT v_gebrek_code,
                          d.ins_discipline_key,
                          v_gebrek_code || ' Onbekend',
                          v_gebrek_code || ' Onbekend',
                          0,
                          MLD_T_UITVOERTIJD (NULL, 'U'),
                          MLD_T_UITVOERTIJD (2, 'D'),
                          MLD_T_UITVOERTIJD (NULL, 'D'),
                          MLD_T_UITVOERTIJD (NULL, 'D'),
                          MLD_T_UITVOERTIJD (NULL, 'D'),
                          'G',
                          'G',
                          2,
                          0
                     FROM ins_tab_discipline d, ins_srtdiscipline sd
                    WHERE     REGEXP_SUBSTR (v_gebrek_code, '[[:alpha:]]*[[:digit:]]*') =
                              SUBSTR (ins_discipline_omschrijving, 1, INSTR (ins_discipline_omschrijving, ' ') - 1)
                          AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                          AND sd.ins_srtdiscipline_omschrijving = 'NEN2767 - Conditiemeting'
                          AND ins_discipline_code <> 'GEEN';

               BEGIN
                 SELECT mld_stdmelding_key
                   INTO v_stdmelding_key
                   FROM mld_stdmelding
                  WHERE mld_stdmelding_code = v_gebrek_code;

                  fac.imp_writelog (p_import_key,
                                    'I',
                                    v_gebrek_code || ' aangemaakt.',
                                    '');

                 -- ernst
                 INSERT INTO mld_kenmerk (mld_srtkenmerk_key,
                                          mld_stdmelding_key,
                                          mld_kenmerk_niveau,
                                          mld_kenmerk_verplicht,
                                          mld_kenmerk_volgnummer)
                      VALUES (v_ernst_key,
                              v_stdmelding_key,
                              'S',
                              1,
                              10);

                 -- omvang
                 INSERT INTO mld_kenmerk (mld_srtkenmerk_key,
                                          mld_stdmelding_key,
                                          mld_kenmerk_niveau,
                                          mld_kenmerk_verplicht,
                                          mld_kenmerk_volgnummer)
                      VALUES (v_omvang_key,
                              v_stdmelding_key,
                              'S',
                              1,
                              20);

                 -- ernst
                 INSERT INTO mld_kenmerk (mld_srtkenmerk_key,
                                          mld_stdmelding_key,
                                          mld_kenmerk_niveau,
                                          mld_kenmerk_verplicht,
                                          mld_kenmerk_volgnummer)
                      VALUES (v_intensiteit_key,
                              v_stdmelding_key,
                              'S',
                              1,
                              30);
               EXCEPTION WHEN NO_DATA_FOUND
               THEN
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_gebrek_code || ' kan niet aangemaakt worden.',
                                    '');
               END;

               -- dbms_output.put_line ('Ontbrekende code: ' || v_gebrek_code);
            END;
         END IF;
      END;
   END LOOP;

   -- Nu de gebreken importeren
   cnd_import_nen2767_results (p_import_key);

   -- En het externe nummer vervangen door het interne nummer
   UPDATE cnd_imp_nen2767_results r
      SET ins_deel_omschrijving = (SELECT ins_deel_omschrijving
                                     FROM ins_deel d
                                    WHERE d.ins_deel_externnr = r.ins_deel_omschrijving)
    WHERE fac_import_key = p_import_key;

   -- voeg aan de elementen zonder gebrek toe
   INSERT INTO cnd_imp_nen2767_results (fac_import_key,
                                        alg_gebouw_code,
                                        ins_deel_omschrijving,
                                        mld_melding_datum,
                                        prs_perslid_email,
                                        gebrekcode,
                                        aspect1,
                                        aspect2,
                                        aspect3,
                                        aspect4,
                                        aspect5,
                                        aspect6,
                                        aspect7)
       SELECT p_import_key,
              h.alg_gebouw_code,
              ins_deel_omschrijving,
              mld_melding_datum,
              prs_perslid_email,
              'GEEN',
              'NVT',
              'NVT',
              'NVT',
              'NVT',
              'NVT',
              'NVT',
              'NVT'
         FROM ins_v_deel_gegevens  dg,
              (SELECT alg_gebouw_code, mld_melding_datum, prs_perslid_email
                 FROM cnd_imp_nen2767_results
                WHERE ROWNUM = 1) h
        WHERE     dg.ins_discipline_omschrijving = 'MJOB'
              AND alg_gebouw_upper IN (SELECT r.alg_gebouw_code
                                         FROM cnd_imp_nen2767_results r)
              AND ins_deel_omschrijving NOT IN (SELECT r.ins_deel_omschrijving
                                                  FROM cnd_imp_nen2767_results r);

   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 gebreken afgebroken! regel:' || v_file_index);
END szdb_import_mjobgebreken;
/


CREATE OR REPLACE PROCEDURE szdb_update_mjobgebreken (
    p_import_key   IN NUMBER)
IS
BEGIN
   cnd_update_nen2767_results (p_import_key);
END;
/

CREATE OR REPLACE PROCEDURE szdb_import_mjobtaken (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_dummy                         VARCHAR  (255);
   v_alg_gebouw_code                VARCHAR2 (255);                      --VARCHAR2(12),
   v_ins_deel_externnr              VARCHAR2 (255);                      --VARCHAR2(256),
   v_ins_deel_omschrijving          VARCHAR2 (255);                      --VARCHAR2(60),
   v_ins_srtcontrole_omschrijving   VARCHAR2 (255);                      --VARCHAR2(60),
   v_ins_srtcontrole_level          VARCHAR2 (255);                      --NUMBER(3),
   v_ins_srtcontroledl_xcp_materia  VARCHAR2 (255);                      --NUMBER(9,2),
   v_ins_srtcontroledl_xcp_aantal   VARCHAR2 (255);                      --NUMBER(8,2),
   v_ins_srtcontroledl_xcp_startdat VARCHAR2 (255);                      --DATE,
   v_ins_srtcontroledl_xcp_periode  VARCHAR2 (255);                      --NUMBER(6,2)
   v_ins_srtcontroledl_xcp_perc     VARCHAR2 (255);                      --NUMBER(3)

   v_file_index                    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   szdb_imp_mjob;

   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_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_alg_gebouw_code);
         fac.imp_getfield (v_newline, c_delim, v_ins_deel_externnr);
         fac.imp_getfield (v_newline, c_delim, v_ins_deel_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_ins_srtcontrole_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_ins_srtcontroledl_xcp_materia);
         fac.imp_getfield (v_newline, c_delim, v_ins_srtcontroledl_xcp_aantal);
         fac.imp_getfield (v_newline, c_delim, v_ins_srtcontrole_level);
         fac.imp_getfield (v_newline, c_delim, v_ins_srtcontroledl_xcp_startdat);
         fac.imp_getfield (v_newline, c_delim, v_ins_srtcontroledl_xcp_periode);
         fac.imp_getfield (v_newline, c_delim, v_ins_srtcontroledl_xcp_perc);

         v_aanduiding :=
               '['
            || v_alg_gebouw_code
            || '|'
            || v_ins_deel_externnr
            || '|'
            || v_ins_deel_omschrijving
            || '|'
            || 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 NIET-kenmerk kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF UPPER (v_alg_gebouw_code) = 'GEBOUW_CODE'
               AND UPPER (v_ins_deel_externnr) = 'DEEL_EXTERNNR'
               AND UPPER (v_ins_deel_omschrijving) = 'DEEL_OMSCHRIJVING'
               AND UPPER (v_ins_srtcontrole_omschrijving) = 'SRTCONTROLE_OMSCHRIJVING'
               AND UPPER (v_ins_srtcontroledl_xcp_materia) = 'SRTCONTROLEDL_XCP_MATERIA'
               AND UPPER (v_ins_srtcontroledl_xcp_aantal) = 'SRTCONTROLEDL_XCP_AANTAL'
               AND UPPER (v_ins_srtcontrole_level) = 'SRTCONTROLE_LEVEL'
               AND UPPER (v_ins_srtcontroledl_xcp_startdat) = 'SRTCONTROLE_STARTJAAR'
               AND UPPER (v_ins_srtcontroledl_xcp_periode) = 'SRTCONTROLE_PERIODE'
               AND UPPER (v_ins_srtcontroledl_xcp_perc) = 'SRTCONTROLE_PERCENTAGE'
            THEN
               header_is_valid := 1;
            ELSE
               IF rec1.fac_imp_file_index = 1
               THEN

                  fac.imp_writelog (p_import_key,
                                    'E',
                                    'Ongeldige header aangetroffen:',
                                    'GEBOUW_CODE: ' || UPPER (v_alg_gebouw_code) || CHR(10) ||
                                    'DEEL_EXTERNNR: ' || UPPER (v_ins_deel_externnr) || CHR(10) ||
                                    'DEEL_OMSCHRIJVING: ' || UPPER (v_ins_deel_omschrijving) || CHR(10) ||
                                    'SRTCONTROLE_OMSCHRIJVING: ' || UPPER (v_ins_srtcontrole_omschrijving) || CHR(10) ||
                                    'SRTCONTROLEDL_XCP_MATERIA: ' || UPPER (v_ins_srtcontroledl_xcp_materia) || CHR(10) ||
                                    'SRTCONTROLEDL_XCP_AANTAL: ' || UPPER (v_ins_srtcontroledl_xcp_aantal) || CHR(10) ||
                                    'SRTCONTROLE_LEVEL: ' || UPPER (v_ins_srtcontrole_level) || CHR(10) ||
                                    'SRTCONTROLE_STARTJAAR: ' || UPPER (v_ins_srtcontroledl_xcp_startdat) || CHR(10) ||
                                    'SRTCONTROLE_PERIODE: ' || UPPER (v_ins_srtcontroledl_xcp_periode) || CHR(10) ||
                                    'SRTCONTROLE_PERCENTAGE: ' || UPPER (v_ins_srtcontroledl_xcp_perc));
                END IF;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden

            v_errormsg := 'Gebouwcode kan niet gevonden worden';
            v_alg_gebouw_code := TRIM (v_alg_gebouw_code);

            BEGIN
               SELECT 1
                 INTO v_dummy
                 FROM alg_gebouw g
                WHERE alg_gebouw_verwijder IS NULL
                  AND UPPER(alg_gebouw_code) = v_alg_gebouw_code;
            EXCEPTION WHEN NO_DATA_FOUND
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'E',
                  v_aanduiding || v_errormsg,
                     'Gebouw is niet gevonden'
               );
               v_ongeldig := 1;
            END;

            v_errormsg := 'Objectid kan niet gevonden worden';
            v_ins_deel_omschrijving := TRIM (v_ins_deel_omschrijving);
            IF v_ins_deel_omschrijving IS NOT NULL
            THEN
               BEGIN
                  SELECT 1
                    INTO v_dummy
                    FROM ins_v_deel_gegevens
                   WHERE UPPER(ins_deel_omschrijving) = UPPER(v_ins_deel_omschrijving)
                     AND alg_gebouw_upper = UPPER(v_alg_gebouw_code);
               EXCEPTION WHEN NO_DATA_FOUND
               THEN
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     v_aanduiding || v_errormsg,
                        'Object is niet gevonden op id '
                  );
                  v_ongeldig := 1;
               END;
            END IF;

            v_errormsg := 'Object externnr kan niet gevonden worden';
            v_ins_deel_externnr := TRIM (v_ins_deel_externnr);
            IF v_ins_deel_externnr IS NOT NULL
            THEN
               BEGIN
                  SELECT 1
                    INTO v_dummy
                    FROM ins_v_deel_gegevens dg, ins_deel d
                   WHERE dg.ins_deel_key = d.ins_deel_key
                     AND UPPER(d.ins_deel_externnr) = UPPER(v_ins_deel_externnr)
                     AND dg.alg_gebouw_upper = UPPER(v_alg_gebouw_code);
               EXCEPTION WHEN NO_DATA_FOUND
               THEN
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     v_aanduiding || v_errormsg,
                        'Object is niet gevonden op extern id '
                  );
                  v_ongeldig := 1;
               END;
            END IF;

            v_errormsg := 'Controle op kosten';
            IF FAC.safe_to_number(v_ins_srtcontroledl_xcp_materia) IS NULL
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'E',
                  v_aanduiding || v_errormsg,''
               );
               v_ongeldig := 1;
            END IF;

            v_errormsg := 'Controle op aantal';
            IF v_ins_srtcontroledl_xcp_aantal IS NOT NULL AND FAC.safe_to_number(v_ins_srtcontroledl_xcp_aantal) IS NULL
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'E',
                  v_aanduiding || v_errormsg,''
               );
               v_ongeldig := 1;
            END IF;

            v_errormsg := 'Controle op startjaar';
            IF v_ins_srtcontroledl_xcp_startdat IS NOT NULL AND FAC.safe_to_date('01-01-' || v_ins_srtcontroledl_xcp_startdat, 'dd-mm-yyyy') IS NULL
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'E',
                  v_aanduiding || v_errormsg,''
               );
               v_ongeldig := 1;
            END IF;

            v_errormsg := 'Controle op periode';
            IF v_ins_srtcontroledl_xcp_periode IS NOT NULL AND FAC.safe_to_number(v_ins_srtcontroledl_xcp_periode) IS NULL
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'E',
                  v_aanduiding || v_errormsg,''
               );
               v_ongeldig := 1;
            END IF;

            v_errormsg := 'Controle op percentage';
            IF v_ins_srtcontroledl_xcp_perc IS NOT NULL AND FAC.safe_to_number(v_ins_srtcontroledl_xcp_perc) IS NULL
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'E',
                  v_aanduiding || v_errormsg,''
               );
               v_ongeldig := 1;
            END IF;

            -- 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 szdb_imp_mjob (alg_gebouw_code,
                                             ins_deel_externnr,
                                             ins_deel_omschrijving,
                                             ins_srtcontrole_omschrijving,
                                             ins_srtcontrole_level,
                                             ins_srtcontroledl_xcp_materia,
                                             ins_srtcontroledl_xcp_aantal,
                                             ins_srtcontroledl_xcp_startdat,
                                             ins_srtcontroledl_xcp_periode,
                                             ins_srtcontroledl_xcp_perc)
                    VALUES  ( SUBSTR(v_alg_gebouw_code,1,12),
                              SUBSTR(v_ins_deel_externnr,1,256),
                              SUBSTR(v_ins_deel_omschrijving,1,60),
                              SUBSTR(v_ins_srtcontrole_omschrijving,1,60),
                              FAC.safe_to_number(v_ins_srtcontrole_level),
                              FAC.safe_to_number(v_ins_srtcontroledl_xcp_materia),
                              FAC.safe_to_number(v_ins_srtcontroledl_xcp_aantal),
                              FAC.safe_to_date('01-01-' || v_ins_srtcontroledl_xcp_startdat, 'dd-mm-yyyy'),
                              v_ins_srtcontroledl_xcp_periode,
                              FAC.safe_to_number(v_ins_srtcontroledl_xcp_perc));

                  COMMIT;
                  v_count_import := v_count_import + 1;
               END;

            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,
                              '');
            COMMIT;
      END;
   END LOOP;

   IF (header_is_valid = 1)
   THEN
      fac.imp_writelog (
         p_import_key,
         'S',
         'Taken/aantal ingelezen importregels: ' || TO_CHAR (v_count_tot),
         ''
      );
      fac.imp_writelog (
         p_import_key,
         'S',
         'Taken/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 taken afgebroken! regel:' || v_file_index);
END szdb_import_mjobtaken;
/


CREATE OR REPLACE PROCEDURE szdb_update_mjobtaken (
    p_import_key   IN NUMBER)
IS

   CURSOR c IS
   SELECT * FROM szdb_imp_mjob;

   v_errormsg                      VARCHAR2 (1000);
   v_errorhint                     VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_ongeldig                      NUMBER (1);
   v_aanduiding                    VARCHAR (400);
   v_ins_deel_key                  NUMBER;
   v_ins_srtdeel_key               NUMBER;
   v_ins_srtcontrole_key           NUMBER;
   v_ins_srtcontroledl_xcp_key     NUMBER;
   v_ctr_discipline_key            NUMBER;
   v_alg_gebouw_key                NUMBER;
   v_ins_srtdeel_code              INS_SRTDEEL.INS_SRTDEEL_CODE%TYPE;

BEGIN
   SELECT MIN(ctr_ins_discipline_key)
     INTO v_ctr_discipline_key
     FROM ctr_disc_params
    WHERE ctr_disc_params_ismjob = 1;

   -- controleer op verwijderde records
   FOR rec IN c
   LOOP
      BEGIN
         v_ins_deel_key := NULL;
         v_aanduiding := rec.alg_gebouw_code || '|' || rec.ins_deel_omschrijving  || '|' || rec.ins_deel_externnr  || '|' || rec.ins_srtcontrole_omschrijving;
         v_errormsg := 'Gebouwcode kan niet gevonden worden';

         BEGIN
            SELECT alg_gebouw_key
              INTO v_alg_gebouw_key
              FROM alg_gebouw g
             WHERE alg_gebouw_verwijder IS NULL
               AND UPPER(alg_gebouw_code) = rec.alg_gebouw_code;
         EXCEPTION WHEN NO_DATA_FOUND
         THEN
            fac.imp_writelog (
               p_import_key,
               'E',
               v_aanduiding || v_errormsg,
                  'Gebouw is niet gevonden'
            );
         END;

         v_errormsg := 'Objectid kan niet gevonden worden';
         IF rec.ins_deel_omschrijving IS NOT NULL
         THEN
            BEGIN
               SELECT dg.ins_deel_key, sd.ins_srtdeel_key, sd.ins_srtdeel_code
                 INTO v_ins_deel_key, v_ins_srtdeel_key, v_ins_srtdeel_code
                 FROM ins_v_deel_gegevens dg, ins_srtdeel sd
                WHERE dg.ins_srtdeel_key = sd.ins_srtdeel_key
                  AND UPPER(dg.ins_deel_omschrijving) = UPPER(rec.ins_deel_omschrijving)
                  AND dg.alg_gebouw_upper = UPPER(rec.alg_gebouw_code);
            EXCEPTION WHEN NO_DATA_FOUND
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'E',
                  v_aanduiding || v_errormsg,
                     'Object is niet gevonden op id '
               );
               v_ongeldig := 1;
            END;
         END IF;

         v_errormsg := 'Object externnr kan niet gevonden worden';
         IF rec.ins_deel_externnr IS NOT NULL AND v_ins_deel_key IS NULL
         THEN
            BEGIN
               SELECT d.ins_deel_key, sd.ins_srtdeel_key, sd.ins_srtdeel_code
                 INTO v_ins_deel_key, v_ins_srtdeel_key, v_ins_srtdeel_code
                 FROM ins_v_deel_gegevens dg, ins_deel d, ins_srtdeel sd
                WHERE dg.ins_deel_key = d.ins_deel_key
                  AND d.ins_srtdeel_key = sd.ins_srtdeel_key
                  AND UPPER(d.ins_deel_externnr) = UPPER(rec.ins_deel_externnr)
                  AND dg.alg_gebouw_upper = UPPER(rec.alg_gebouw_code);
            EXCEPTION WHEN NO_DATA_FOUND
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'E',
                  v_aanduiding || v_errormsg,
                     'Object is niet gevonden op extern id '
               );
               v_ongeldig := 1;
            END;
         END IF;

         -- kijk of de srtcontrole al bestaat
         v_errormsg := 'Kijk of de taak al bestaat';
         BEGIN
            SELECT ins_srtcontrole_key
              INTO v_ins_srtcontrole_key
              FROM ins_srtcontrole
             WHERE ins_srtinstallatie_key = v_ins_srtdeel_key
               AND ins_srtcontrole_niveau = 'S'
               AND ins_srtcontrole_omschrijving = SUBSTR(v_ins_srtdeel_code || ' - ' || rec.ins_srtcontrole_omschrijving, 1, 60)
               AND ctr_discipline_key = v_ctr_discipline_key;

            UPDATE ins_srtcontrole
               SET ins_srtcontrole_level = rec.ins_srtcontrole_level
             WHERE ins_srtcontrole_key = v_ins_srtcontrole_key;

         EXCEPTION WHEN NO_DATA_FOUND
         THEN
             v_errormsg := 'Aanmaken nieuwe taak';
            INSERT INTO ins_srtcontrole (ins_srtinstallatie_key,
                                         ins_srtcontrole_niveau,
                                         ins_srtcontrole_omschrijving,
                                         ctr_discipline_key,
                                         ins_srtcontrole_periode,
                                         ins_srtcontrole_eenheid,
                                         ins_srtcontrole_level,
                                         ins_srtcontrole_materiaal,
                                         ins_srtcontrole_percentage)
                  VALUES (v_ins_srtdeel_key,
                          'S',
                         SUBSTR(v_ins_srtdeel_code || ' - ' || rec.ins_srtcontrole_omschrijving, 1, 60),
                         v_ctr_discipline_key,
                         0,    -- periode wordt in het xcp record opgegeven
                         4,    -- standaard jaar voor MJOB
                         rec.ins_srtcontrole_level,
                         0,    -- kosten worden in het xcp record vermeld.
                         100)
             RETURNING ins_srtcontrole_key INTO v_ins_srtcontrole_key;
         END;

         -- kijk of de taak uitzondering al bestaat
         v_errormsg := 'Kijk of de taak al bestaat';
         BEGIN
            SELECT ins_srtcontroledl_xcp_key
              INTO v_ins_srtcontroledl_xcp_key
              FROM ins_srtcontroledl_xcp
             WHERE ins_deel_key = v_ins_deel_key
               AND ins_srtcontrole_key = v_ins_srtcontrole_key;

            UPDATE ins_srtcontroledl_xcp
               SET ins_srtcontroledl_xcp_periode = rec.ins_srtcontroledl_xcp_periode,
                   ins_srtcontroledl_xcp_aantal = rec.ins_srtcontroledl_xcp_aantal,
                   ins_srtcontroledl_xcp_materia = rec.ins_srtcontroledl_xcp_materia,
                   ins_srtcontroledl_xcp_perc = rec.ins_srtcontroledl_xcp_perc,
                   ins_srtcontroledl_xcp_startdat = rec.ins_srtcontroledl_xcp_startdat
             WHERE ins_srtcontroledl_xcp_key = v_ins_srtcontroledl_xcp_key;

         EXCEPTION WHEN NO_DATA_FOUND
         THEN
             v_errormsg := 'Aanmaken nieuwe taak uitzondering ';
            INSERT INTO ins_srtcontroledl_xcp (ins_deel_key,
                                               ins_srtcontrole_key,
                                               ins_srtcontroledl_xcp_periode,
                                               ins_srtcontroledl_xcp_aantal,
                                               ins_srtcontroledl_xcp_materia,
                                               ins_srtcontroledl_xcp_perc,
                                               ins_srtcontroledl_xcp_startdat)
                  VALUES (v_ins_deel_key,
                          v_ins_srtcontrole_key,
                          rec.ins_srtcontroledl_xcp_periode,
                          rec.ins_srtcontroledl_xcp_aantal,
                          rec.ins_srtcontroledl_xcp_materia,
                          rec.ins_srtcontroledl_xcp_perc,
                          rec.ins_srtcontroledl_xcp_startdat)
             RETURNING ins_srtcontroledl_xcp_key INTO v_ins_srtcontroledl_xcp_key;
         END;

         fac.imp_writelog (p_import_key, 'I', v_aanduiding || 'Taak is aangemaakt: ' || v_aanduiding, '');
         COMMIT;

         -- TODO moeten we ook taken gaan verwijderen?

      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;

END;
/

-- rapportage om foto's toe te voegen
CREATE OR REPLACE VIEW szdb_v_upload_foto_script
AS
SELECT alg_gebouw_code,
          'cscript "..\..\Fotos\UploadFotoBijGebrek.js" "https://szdb.facilitor.nl/api2" 4201 '
       || mld_melding_key
       || ' "'
       || foto
       || '"'    url
  FROM (SELECT aogg.alg_gebouw_code,
               m.mld_melding_key,
               1                                                            volgorde,
               szdb.imp_getfield_nr (mld_kenmerkmelding_waarde, ':', 1)     foto
          FROM mld_kenmerkmelding km, mld_melding m, alg_v_onroerendgoed_gegevens aogg
         WHERE     aogg.alg_onroerendgoed_keys = m.mld_alg_onroerendgoed_keys
               AND m.mld_melding_key = km.mld_melding_key
               AND mld_kenmerk_key = 4202
        UNION ALL
        SELECT aogg.alg_gebouw_code,
               m.mld_melding_key,
               2,
               szdb.imp_getfield_nr (mld_kenmerkmelding_waarde, ':', 2)
          FROM mld_kenmerkmelding km, mld_melding m, alg_v_onroerendgoed_gegevens aogg
         WHERE     aogg.alg_onroerendgoed_keys = m.mld_alg_onroerendgoed_keys
               AND m.mld_melding_key = km.mld_melding_key
               AND mld_kenmerk_key = 4202
        UNION ALL
        SELECT aogg.alg_gebouw_code,
               m.mld_melding_key,
               3,
               szdb.imp_getfield_nr (mld_kenmerkmelding_waarde, ':', 3)
          FROM mld_kenmerkmelding km, mld_melding m, alg_v_onroerendgoed_gegevens aogg
         WHERE     aogg.alg_onroerendgoed_keys = m.mld_alg_onroerendgoed_keys
               AND m.mld_melding_key = km.mld_melding_key
               AND mld_kenmerk_key = 4202
        UNION ALL
        SELECT aogg.alg_gebouw_code,
               m.mld_melding_key,
               4,
               szdb.imp_getfield_nr (mld_kenmerkmelding_waarde, ':', 4)
          FROM mld_kenmerkmelding km, mld_melding m, alg_v_onroerendgoed_gegevens aogg
         WHERE     aogg.alg_onroerendgoed_keys = m.mld_alg_onroerendgoed_keys
               AND m.mld_melding_key = km.mld_melding_key
               AND mld_kenmerk_key = 4202)
 WHERE foto IS NOT NULL;

-- View voor de afhandeling van speel-o-theek atributen
CREATE OR REPLACE VIEW szdb_v_rap_bo_beleefotheek
AS
        SELECT res_reservering_key || '/' || res_rsv_ruimte_volgnr                                      nummer,
           DECODE (FLX.getflex ('RES', 1, rrr.res_rsv_ruimte_key), NULL, 'Uitgeven', 'Innemen')     actie,
           rrr.res_rsv_ruimte_key,
           rrr.res_rsv_ruimte_omschrijving,
           pf.prs_perslid_naam_full,
           res_rsv_ruimte_van,
           res_rsv_ruimte_tot,
           rd.res_deel_omschrijving,
           alg_gebouw_naam,
           alg_verdieping_volgnr,
           alg_ruimte_nr,
           alg_ruimte_omschrijving, FLX.getflex ('RES', 1, rrr.res_rsv_ruimte_key) inf , FLX.getflex ('RES', 2, rrr.res_rsv_ruimte_key) uit
      FROM res_rsv_ruimte           rrr,
           res_rsv_deel             rrd,
           res_deel                 rd,
           prs_v_perslid_fullnames  pf,
           alg_v_ruimte_gegevens    rg
     WHERE     rrr.res_activiteit_key = 30
           AND COALESCE (FLX.getflex ('RES', 2, rrr.res_rsv_ruimte_key), '0') <> '1'
           AND rrr.res_rsv_ruimte_host_key = pf.prs_perslid_key
           AND rrr.res_rsv_ruimte_key = rrd.res_rsv_ruimte_key
           AND rrd.res_deel_key = rd.res_deel_key
           AND rrr.alg_ruimte_key = rg.alg_ruimte_key
           AND rrr.res_rsv_ruimte_verwijder IS NULL
           AND rrd.res_rsv_deel_verwijder IS NULL;

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