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


DEFINE thisfile = 'ZLMV.SQL'
DEFINE dbuser   = 'ZLMV'

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 ZLMV
AS
    FUNCTION getfirststartdate(p_startdatum IN DATE, p_refdatum IN DATE, p_cyclus IN NUMBER) 
           RETURN DATE;
   
    PROCEDURE inactivate_prs;

    PROCEDURE anonimiseer_bezoeker;

END;
/


CREATE OR REPLACE PACKAGE BODY ZLMV
AS
   FUNCTION getfirststartdate(p_startdatum IN DATE, p_refdatum IN DATE, p_cyclus IN NUMBER) 
            RETURN DATE
   AS
    v_startdatum DATE;
   BEGIN
        IF (p_startdatum<p_refdatum AND p_cyclus>0) 
        THEN        
          v_startdatum := ADD_MONTHS(p_startdatum, p_cyclus*12);
    
          IF (v_startdatum<p_refdatum)
            THEN
                v_startdatum:=zlmv.getfirststartdate(v_startdatum, p_refdatum, p_cyclus);
            END IF;
        ELSE
                v_startdatum:=p_startdatum;    
          END IF;
            
      RETURN v_startdatum;
     
   END;  


    PROCEDURE inactivate_prs
    AS
        v_errormsg       VARCHAR2 (1000);
        v_errorhint      VARCHAR2 (1000);
        oracle_err_num   NUMBER;
        oracle_err_mes   VARCHAR2 (200);
        v_count          NUMBER (10);
        v_perslid_naam   VARCHAR (100);
        v_perslid_nr     VARCHAR (30);

        --- Als een persoon 12 maanden niet meer heeft ingelogd verwijderen we deze
        CURSOR prs_del IS
              SELECT p.prs_perslid_key, p.prs_perslid_oslogin
                FROM prs_v_aanwezigperslid p
               WHERE p.prs_perslid_login <
                     TRUNC (ADD_MONTHS (SYSDATE, -6), 'mm')
            GROUP BY p.prs_perslid_key, p.prs_perslid_oslogin;
    BEGIN
        FOR rec IN prs_del
        LOOP
            BEGIN
                v_errormsg := 'Verwijderen van de persoon is NIET gelukt';
                v_errorhint :=
                       'Heeft de persoon met prs_perslid_key '
                    || TO_CHAR (rec.prs_perslid_key)
                    || ' historie?';

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

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

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

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

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

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

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

                -- *** werkplekken ***

                DELETE prs_perslidwerkplek
                 WHERE prs_perslid_key = rec.prs_perslid_key;

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

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

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

                    DELETE FROM prs_kostenplaatsgrp
                          WHERE prs_perslid_key = rec.prs_perslid_key;

                    DELETE FROM prs_perslidkostenplaats
                          WHERE prs_perslid_key = rec.prs_perslid_key;

                    DELETE FROM fac_gebruikersgroep
                          WHERE prs_perslid_key = rec.prs_perslid_key;

                    DELETE FROM prs_perslid
                          WHERE prs_perslid_key = rec.prs_perslid_key;

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

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

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

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




    PROCEDURE anonimiseer_bezoeker
    AS
        anonymize_period      NUMBER := 42;
        bez_generic_visitor   VARCHAR2 (2001)
                                  := lcl.l ('lcl_bez_generic_visitor');
        v_count               NUMBER;

        CURSOR c_afspraak IS
              SELECT a.bez_afspraak_key
                FROM bez_afspraak a,
                     (SELECT datum_van
                        FROM (SELECT TRUNC (MIN (bez_afspraak_datum))    datum_van
                                FROM bez_afspraak a
                               WHERE     bez_afspraak_datum <
                                         (SYSDATE - anonymize_period)
                                     AND NOT EXISTS
                                             (SELECT ft.fac_tracking_key
                                                FROM fac_tracking ft
                                               WHERE     ft.fac_tracking_refkey =
                                                         bez_afspraak_key
                                                     AND ft.fac_srtnotificatie_key =
                                                         (SELECT fac_srtnotificatie_key
                                                            FROM fac_srtnotificatie
                                                           WHERE fac_srtnotificatie_code =
                                                                 'BEZANO'))))
                     van,
                     (SELECT TRUNC (SYSDATE - anonymize_period) --- 6 weken dus 6*7
                                                                    datum_tot
                        FROM DUAL) tot
               WHERE     a.bez_afspraak_datum BETWEEN van.datum_van
                                                  AND tot.datum_tot
                     AND NOT EXISTS
                             (SELECT ft.fac_tracking_key
                                FROM fac_tracking ft
                               WHERE     ft.fac_tracking_refkey =
                                         a.bez_afspraak_key
                                     AND ft.fac_srtnotificatie_key =
                                         (SELECT fac_srtnotificatie_key
                                            FROM fac_srtnotificatie
                                           WHERE fac_srtnotificatie_code =
                                                 'BEZANO'))
            ORDER BY a.bez_afspraak_key;
    BEGIN
        FOR rec IN c_afspraak
        LOOP
            -- Verwijder alle kenmerkwaarden van bezoekers van de afspraak waarvan het ampersand 8 (BITAND) bit van het bez_kenmerk.bez_kenmerk_systeem veld is gezet.
            DELETE FROM bez_kenmerkwaarde bkw
                  WHERE     bkw.bez_bezoekers_key IN
                                (SELECT b.bez_bezoekers_key
                                   FROM bez_bezoekers b
                                  WHERE b.bez_afspraak_key =
                                        rec.bez_afspraak_key)
                        AND bkw.bez_kenmerk_key IN
                                (SELECT bk.bez_kenmerk_key
                                   FROM bez_kenmerk bk
                                  WHERE     bk.bez_kenmerk_key =
                                            bkw.bez_kenmerk_key
                                        AND BITAND (bk.bez_kenmerk_systeem,
                                                    8) =
                                            8);

            -- Anonimiseer alle bezoekers.
            UPDATE bez_bezoekers
               SET bez_afspraak_naam = bez_generic_visitor,
                --   bez_afspraak_bedrijf = NULL,
                   bez_afspraak_opmerking = NULL,
                   bez_bezoekers_telefoon = NULL,
                   bez_bezoekers_email = NULL,
                   bez_bezoekers_kenteken = NULL
             WHERE bez_afspraak_key = rec.bez_afspraak_key;

            -- Anonimiseer alle afspraken.
            -- Door de trigger in de update wordt automatische de naam van de host in de gastheer geplakt.
            -- Daardoor wordt de lcl "Ganonimiseerd" in vele gevallen niet blijvend in de gasheer gezet.
            -- De persoon (prs record) moet daarom eerst aangepast worden.
            -- Tijdens het anonimiseren van de persoon wordt daarom de bez_afspraak_gastheer ook geanonimiseerd.
            -- In de gevallen dat er geen host wordt gebruikt en alleen tekst voor de persoon (gastheer) wordt ingevuld wordt het veld wel blijvend gezet.
            UPDATE bez_afspraak
               SET bez_afspraak_gastheer = bez_generic_visitor,
                   bez_afspraak_telefoonnr = NULL,
                   bez_afspraak_opmerking = NULL
             WHERE bez_afspraak_key = rec.bez_afspraak_key;

            -- Alle BEZ tracking anonimiseren m.b.t. de afspraak.
            UPDATE fac_tracking
               SET fac_tracking_oms = NULL
             WHERE     fac_srtnotificatie_key IN
                           (SELECT fac_srtnotificatie_key
                              FROM fac_srtnotificatie
                             WHERE     fac_srtnotificatie_xmlnode =
                                       'afspraak'
                                   AND fac_srtnotificatie_code != 'BEZANO')
                   AND fac_tracking_refkey = rec.bez_afspraak_key
                   AND fac_tracking_oms IS NOT NULL;

            -- Alle BEZ tracking anonimiseren m.b.t. de bezoekers van de afspraak.
            UPDATE fac_tracking
               SET fac_tracking_oms = NULL
             WHERE     fac_srtnotificatie_key IN
                           (SELECT fac_srtnotificatie_key
                              FROM fac_srtnotificatie
                             WHERE fac_srtnotificatie_xmlnode = 'bezoeker')
                   AND fac_tracking_refkey IN
                           (SELECT bb.bez_bezoekers_key
                              FROM bez_bezoekers bb
                             WHERE bb.bez_afspraak_key = rec.bez_afspraak_key)
                   AND fac_tracking_oms IS NOT NULL;

            -- Anonimiseren van de afspraak tracken.
            fac.trackaction ('BEZANO',
                             rec.bez_afspraak_key,
                             NULL,
                             NULL,
                             NULL);

            IF v_count >= 1000
            THEN
                COMMIT;
                v_count := 0;
            ELSE
                v_count := v_count + 1;
            END IF;
        END LOOP;
    END;
END;
/

CREATE OR REPLACE PROCEDURE ZLMV_IMPORT_IMPPERSLID(p_import_key IN NUMBER)
AS
  CURSOR c1 is
      SELECT fac_imp_csv_col01  prs_voornaam,
             fac_imp_csv_col02  prs_tussenvoegsel,
             fac_imp_csv_col03  prs_achternaam,
             fac_imp_csv_col04  prs_email,
             fac_imp_csv_col05  prs_titel,
             fac_imp_csv_col06  prs_afdeling
      FROM fac_imp_csv
      WHERE fac_import_key=p_import_key
   ORDER BY fac_imp_csv_key;

   v_header   NUMBER:=0;
   v_afdeling_code  VARCHAR2(15);
   v_functie  VARCHAR2(60);
BEGIN
      v_header :=0;
      DELETE FROM fac_imp_perslid;
      DELETE FROM fac_imp_organisatie;

      FOR rec in C1
      LOOP
        IF rec.prs_voornaam='GivenName' AND v_header=0
        THEN
          v_header:=1;
        ELSE
             BEGIN
              SELECT prs_afdeling_naam
                INTO v_afdeling_code
                FROM prs_afdeling
               WHERE UPPER(prs_afdeling_omschrijving)=UPPER(rec.prs_afdeling);
             EXCEPTION
             WHEN NO_DATA_FOUND THEN
              v_afdeling_code:='Onbekend';
             END;

             IF length(rec.prs_titel)>1 THEN
                v_functie:=rec.prs_titel;
             ELSE
                v_functie:='Onbekend';
             END IF;
             INSERT INTO fac_imp_perslid(fac_import_key,
                                         prs_afdeling_naam,
                                         prs_perslid_voornaam,
                                         prs_perslid_tussenvoegsel,
                                         prs_perslid_naam,
                                         prs_perslid_email,
                                         prs_srtperslid_omschrijving)
                                  VALUES(p_import_key,
                                         v_afdeling_code,
                                         rec.prs_voornaam,
                                         rec.prs_tussenvoegsel,
                                         rec.prs_achternaam,
                                         rec.prs_email,
                                         v_functie);
        END IF;
      END LOOP;

END;
/


CREATE OR REPLACE PROCEDURE ZLMV_UPDATE_IMPPERSLID(p_import_key IN NUMBER)
AS
  CURSOR p_del
  IS
     SELECT *
       FROM prs_perslid p
      WHERE p.prs_perslid_verwijder IS NULL
        AND p.prs_perslid_email NOT IN (SELECT prs_perslid_email
                                          FROM fac_imp_perslid);

  CURSOR p_wrkplk
  IS
    SELECT p.prs_perslid_key, a.alg_ruimte_key
      FROM prs_perslid p, prs_afdeling pa, ALG_V_AANWEZIGRUIMTE a
     WHERE p.PRS_AFDELING_KEY=pa.prs_afdeling_key
       AND UPPER(pa.prs_afdeling_omschrijving)='FACILITAIR'
       AND pa.prs_afdeling_verwijder IS NULL
       AND p.prs_perslid_verwijder IS NULL
       AND UPPER(a.alg_ruimte_omschrijving)='FACILITAIR'
       AND a.alg_ruimte_nr='0.31';

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


BEGIN
  prs.update_perslid (p_import_key, 'EMAIL', 'A', 1);

  -- Opschonen van personen die niet meer in de import zitten
  FOR rec IN p_del
   LOOP
      prs.delete_perslid (p_import_key, rec.prs_perslid_key);
   END LOOP;

  -- Alle medewerkers Fcailitrair krijgen werkplek in Ruimte Facilitair gebouw C2
  FOR rec IN p_wrkplk
  LOOP
            v_aanduiding := 'Perslidkey: ' || rec.prs_perslid_key;
            v_errorhint :=
                   'Specifieke werkplek koppelen voor perslid: '
                || rec.prs_perslid_key;

            BEGIN
                prs.movetoruimte (rec.prs_perslid_key, rec.alg_ruimte_key, '');
            EXCEPTION
                WHEN OTHERS
                THEN
                    oracle_err_num := SQLCODE;
                    oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                    fac.writelog (
                        'Toewijzen Facilitair specifieke werkplek',
                        'E',
                           'Error '
                        || v_aanduiding
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes,
                        v_errorhint);
            END;
  END LOOP;



END;
/


CREATE OR REPLACE PROCEDURE zlmv_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_oprognose_gebouw_code         VARCHAR2 (255);
   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_oprognose_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);   -- Foto
         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_oprognose_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'
               AND UPPER (v_ins_kenmerkwaarde9) = 'FOTO'
            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_oprognose_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) || CHR(10) ||
                                    'FOTO: ' || UPPER (v_ins_kenmerkwaarde9));
                END IF;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden

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

            SELECT alg_gebouw_key, alg_gebouw_code, alg_locatie_code
              INTO v_alg_gebouw_key, v_alg_gebouw_code, v_alg_locatie_code
              FROM alg_gebouw g, alg_locatie l, alg_onrgoedkenmerk aok, alg_kenmerk ak
             WHERE g.alg_locatie_key = l.alg_locatie_key
               AND alg_gebouw_verwijder IS NULL
               AND aok.alg_onrgoed_key = g.alg_gebouw_key
               AND aok.alg_onrgoed_niveau='G'
               AND ak.alg_kenmerk_key = aok.alg_kenmerk_key
               AND ak.alg_kenmerk_code='OPROGNOSE_CODE'
               AND UPPER(aok.alg_onrgoedkenmerk_waarde) = UPPER(v_oprognose_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 = SUBSTR(v_ins_srtdeel_code,1,4);

               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 := SUBSTR(v_ins_srtdeel_code,1,4) || '-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');
               v_ins_deel_omschrijving := v_ins_srtdeel_code||'-'||v_ins_deel_externnr;
            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,
                                 SUBSTR(v_ins_srtdeel_code,1,4),
                                 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;

   

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

CREATE OR REPLACE PROCEDURE zlmv_update_mjobelementen (
    p_import_key   IN NUMBER)
IS
    v_aanduiding                    VARCHAR (400);
    v_kenmerk_foto                  NUMBER;
BEGIN
   fac_update_ins (p_import_key);
   BEGIN
      v_aanduiding:='Ophalen oprognose kenmerk key is mislukt';
      SELECT i.ins_kenmerk_key 
        INTO v_kenmerk_foto
        FROM ins_kenmerk i
       where     i.ins_kenmerk_code='OPROGNOSE_FOTO'
             AND i.ins_kenmerk_verwijder IS NULL;
             
      UPDATE ins_deel i 
         SET i.ins_deel_image = (SELECT ins_kenmerkdeel_waarde 
                                   FROM ins_kenmerkdeel 
                                  WHERE     ins_deel_key=i.ins_deel_key 
                                        AND ins_kenmerk_key=v_kenmerk_foto) 
       WHERE i.ins_deel_key IN (SELECT ins_deel_key 
                                  FROM ins_kenmerkdeel 
                                 WHERE ins_kenmerk_key=v_kenmerk_foto);
 
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
      fac.imp_writelog (p_import_key,
                        'W',
                        v_aanduiding,
                        'Afbeelding objecten updaten !');  
  END;
  
END;
/
-- EINE MJOB Elementen Import
CREATE OR REPLACE PROCEDURE zlmv_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_oprognose_gebouw_code          VARCHAR2 (255);
   v_alg_gebouw_code                VARCHAR2 (255);                      --VARCHAR2(12),
   v_alg_locatie_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_ins_srtcontroledl_xcp_eenh     VARCHAR2 (255);
   v_ins_srtcontrole_btw            VARCHAR2 (255);
   
   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


   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_oprognose_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);
         fac.imp_getfield (v_newline, c_delim, v_ins_srtcontroledl_xcp_eenh);
         fac.imp_getfield (v_newline, c_delim, v_ins_srtcontrole_btw);

         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_oprognose_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'
               AND UPPER (v_ins_srtcontroledl_xcp_eenh) = 'SRTCONTROLE_EENHEID'
               AND UPPER (v_ins_srtcontrole_btw) = 'SRTCONTROLE_BTW'
            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_oprognose_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_oprognose_gebouw_code := TRIM (v_oprognose_gebouw_code);

            BEGIN
               SELECT g.alg_gebouw_code, l.alg_locatie_code
                 INTO v_alg_gebouw_code, v_alg_locatie_code
                 FROM alg_gebouw g, alg_onrgoedkenmerk aok, alg_kenmerk ak, alg_locatie l
                WHERE     g.alg_gebouw_verwijder IS NULL
                      AND aok.alg_onrgoed_key = g.alg_gebouw_key
                      AND aok.alg_onrgoed_niveau='G'
                      AND ak.alg_kenmerk_key = aok.alg_kenmerk_key
                      AND ak.alg_kenmerk_code='OPROGNOSE_CODE'
                      AND UPPER(aok.alg_onrgoedkenmerk_waarde) = UPPER(v_oprognose_gebouw_code)
                      AND l.alg_locatie_key=g.alg_locatie_key;
                      
            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 := '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 fac_imp_csv (FAC_IMPORT_KEY,
                                           fac_imp_csv_index,
                                           fac_imp_csv_col01,
                                           fac_imp_csv_col02,
                                           fac_imp_csv_col03,
                                           fac_imp_csv_col04,
                                           fac_imp_csv_col05,
                                           fac_imp_csv_col06,
                                           fac_imp_csv_col07,
                                           fac_imp_csv_col08,
                                           fac_imp_csv_col09,
                                           fac_imp_csv_col10,
                                           fac_imp_csv_col11,
                                           fac_imp_csv_col12,
                                           fac_imp_csv_col13)
                    VALUES  ( p_import_key,
                              v_file_index,
                              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),   -- de prijs m,oet per stuk zijn.
                              FAC.safe_to_number(v_ins_srtcontroledl_xcp_aantal),
                              '01-01-' || v_ins_srtcontroledl_xcp_startdat,
                              v_ins_srtcontroledl_xcp_periode,
                              FAC.safe_to_number(v_ins_srtcontroledl_xcp_perc),
                              v_ins_srtcontroledl_xcp_eenh,
                              SUBSTR(v_alg_locatie_code,1,12),
                              v_ins_srtcontrole_btw);

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


CREATE OR REPLACE PROCEDURE zlmv_update_mjobtaken (
    p_import_key   IN NUMBER)
IS

   CURSOR c IS
    SELECT  fac_imp_csv_col01 alg_gebouw_code,
            fac_imp_csv_col02 ins_deel_externnr,
            fac_imp_csv_col03 ins_deel_omschrijving,
            fac_imp_csv_col04 ins_srtcontrole_omschrijving,
            fac_imp_csv_col05 ins_srtcontrole_level,
            fac_imp_csv_col06 ins_srtcontroledl_xcp_materia,
            fac_imp_csv_col07 ins_srtcontroledl_xcp_aantal,
            fac_imp_csv_col08 ins_srtcontroledl_xcp_startdat,
            fac_imp_csv_col09 ins_srtcontroledl_xcp_periode,
            fac_imp_csv_col10 ins_srtcontroledl_xcp_perc,
            fac_imp_csv_col11 ins_srtcontroledl_xcp_eenh,
            fac_imp_csv_col12 alg_locatie_code,
            fac_imp_csv_col13 ins_srtcontrole_btw
      FROM  fac_imp_csv
     WHERE  fac_import_key=p_import_key;

   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_deel_aantal                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;
   v_ins_deel_eenheid               VARCHAR2(30);
   v_ins_srtcontroledl_xcp_startdat DATE;
   v_ins_srtcontroledl_xcp_aantal   NUMBER; 
   v_ins_srtcontroledl_xcp_perc     NUMBER;
   v_srtcontrole_btw_key            NUMBER;
   v_refdate                        DATE;

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 g.alg_gebouw_key 
              INTO v_alg_gebouw_key
              FROM alg_gebouw g, alg_locatie l
             WHERE alg_gebouw_verwijder IS NULL
               AND UPPER(alg_gebouw_code) = rec.alg_gebouw_code
               AND l.alg_locatie_key=g.alg_locatie_key
               AND l.alg_locatie_code=rec.alg_locatie_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,
                       dg.ins_deel_aantal,
                       ken.ins_kenmerkdeel_waarde
                  INTO v_ins_deel_key, v_ins_srtdeel_key, v_ins_srtdeel_code, v_ins_deel_aantal, v_ins_deel_eenheid    
                  FROM ins_v_deel_gegevens  dg,
                       ins_srtdeel          sd,                       
                       (SELECT ikd.ins_deel_key, ikd.ins_kenmerkdeel_waarde
                          FROM ins_kenmerkdeel ikd, ins_kenmerk ik
                         WHERE     ikd.ins_kenmerk_key = ik.ins_kenmerk_key
                               AND ik.ins_kenmerk_code = 'MJOB_EENHEID_AANTAL'
                               AND ikd.ins_kenmerkdeel_verwijder IS NULL) ken
                WHERE      dg.ins_srtdeel_key = sd.ins_srtdeel_key
                       AND UPPER(dg.ins_deel_omschrijving) = UPPER(rec.ins_deel_omschrijving)
                       AND ken.ins_deel_key(+) = dg.ins_deel_key
                       AND dg.alg_gebouw_key = v_alg_gebouw_key;
                       
            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, d.ins_deel_aantal
                 INTO v_ins_deel_key, v_ins_srtdeel_key, v_ins_srtdeel_code, v_ins_deel_aantal
                 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_key = v_alg_gebouw_key;
            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;

         BEGIN
              SELECT btw.fin_btwtabelwaarde_key 
                INTO v_srtcontrole_btw_key
                FROM fin_btwtabel bt, 
                     fin_btwtabelwaarde btw
               WHERE     bt.fin_btwtabel_omschrijving='NL standaard'
                     AND btw.fin_btwtabel_key = bt.fin_btwtabel_key
                     AND btw.fin_btwtabelwaarde_code=rec.ins_srtcontrole_btw
                     AND btw.fin_btwtabelwaarde_verwijder IS NULL; 
         
         EXCEPTION
         WHEN NO_DATA_FOUND            
         THEN
            v_srtcontrole_btw_key:=NULL;
         END;


         -- 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,
                                         fin_btwtabelwaarde_key)
                  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,
                         v_srtcontrole_btw_key)  -- BTW tarief zoals vermeld op de oPrognose taak.
             RETURNING ins_srtcontrole_key INTO v_ins_srtcontrole_key;
         END;
        
        v_ins_srtcontroledl_xcp_perc:=FAC.safe_to_number(rec.ins_srtcontroledl_xcp_perc)*100;       
                
        IF v_ins_srtcontroledl_xcp_perc>100 THEN
            v_ins_srtcontroledl_xcp_perc:=100;        
        END IF;
        
        IF v_ins_srtcontroledl_xcp_perc < 100 THEN
            v_ins_srtcontroledl_xcp_aantal:=NULL;
        ELSE
            IF rec.ins_srtcontroledl_xcp_aantal <> v_ins_deel_aantal THEN
                v_ins_srtcontroledl_xcp_aantal:=FAC.safe_to_number(rec.ins_srtcontroledl_xcp_aantal);
            ELSE
                v_ins_srtcontroledl_xcp_aantal:=NULL;            
            END IF;    
            
        END IF;
        
        
           -- wat is het aantal op de taak (in de oprognose staat een hvh_reken die we hier gebruiken ipv de ins_deel_aantal)
        -- v_ins_srtcontroledl_xcp_aantal := FAC.safe_to_number(rec.ins_srtcontroledl_xcp_aantal);
    --    IF (v_ins_srtcontroledl_xcp_aantal=1 AND v_ins_deel_aantal>1) 
     --    THEN
     --         v_ins_srtcontroledl_xcp_aantal:= v_ins_deel_aantal;
     --    END IF;  
         
         

         -- Ophalen freeze jaar en eerst stardatum          
         v_ins_srtcontroledl_xcp_startdat:=FAC.safe_to_date(rec.ins_srtcontroledl_xcp_startdat, 'dd-mm-yyyy');
         v_refdate := FAC.safe_to_date('01-01-'||fac.getsetting('mjb_start_year'),'DD-MM-YYYY');
            
         IF (v_ins_srtcontroledl_xcp_startdat<=v_refdate) 
         THEN
                v_ins_srtcontroledl_xcp_startdat := zlmv.getfirststartdate(v_ins_srtcontroledl_xcp_startdat, v_refdate,rec.ins_srtcontroledl_xcp_periode);
         END IF;        
            
         
         
         -- kijk of de taak uitzondering al bestaat
         
         v_errormsg := 'Kijk of de XCP 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 = FAC.safe_to_number(rec.ins_srtcontroledl_xcp_periode),
                   ins_srtcontroledl_xcp_aantal = v_ins_srtcontroledl_xcp_aantal,
                   ins_srtcontroledl_xcp_materia = FAC.safe_to_number(rec.ins_srtcontroledl_xcp_materia),
                   ins_srtcontroledl_xcp_perc =  v_ins_srtcontroledl_xcp_perc,
                   ins_srtcontroledl_xcp_startdat = v_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,
                                               ins_srtcontroledl_xcp_aanteh)
                  VALUES (v_ins_deel_key,
                          v_ins_srtcontrole_key,
                          FAC.safe_to_number(rec.ins_srtcontroledl_xcp_periode),
                          v_ins_srtcontroledl_xcp_aantal,
                          FAC.safe_to_number(rec.ins_srtcontroledl_xcp_materia),
                          v_ins_srtcontroledl_xcp_perc,
                          v_ins_srtcontroledl_xcp_startdat,
                          rec.ins_srtcontroledl_xcp_eenh)
             RETURNING ins_srtcontroledl_xcp_key INTO v_ins_srtcontroledl_xcp_key;
         END;
         
         -- Moeten we nu kijken welke XCP taken er zijn aangemaakt en of deze al afgerond hadden moeten zijn zodat ze niet worden doorgeschoven naar het volgene jaar ?
         
         
          
          
          
          

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

-- EIND MJOB Taken


CREATE OR REPLACE PROCEDURE ZLMV_DAILY
AS
BEGIN
    -- inactiveren personen die 12 maanden niet hebben ingelogd
    -- zlmv.inactivate_prs ();  moet nu via de scim koppeling worden geregeld.

    -- anonimiseer bezoekers to 42 dagen terug
    zlmv.anonimiseer_bezoeker ();

END;
/




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