--
-- $Id$
--
-- Script containing customer specific sql statements for the FACILITOR database
-- Voor dbuser invullen: - indien script voor 1 klant is: 'AADS' (de klantcode, zoals vermeld in fac_version_cust)
--                       - script is voor meerdere klanten: 'AAXX' (de groepcode, zoals vermeld in fac_version_group)
--                       - script is voor meerdere klanten met naam volgens een bepaald patroon: '^AA|^ASMS|^GULU|^NMMS|^RABO|^ZKHM'
-- Ook als het script gedraaid wordt voor de verkeerde cust wordt er een logfile gemaakt.
-- (dit in tegenstelling tot sample_xxxx.sql)

DEFINE thisfile = 'KW1C.SQL'
DEFINE dbuser   = 'KW1C'

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 KW1C
IS
    PROCEDURE VERWERKEN_RUIMTEKAART;
END;
/

CREATE OR REPLACE PACKAGE BODY KW1C
IS
    PROCEDURE VERWERKEN_RUIMTEKAART
    AS
        v_errormsg       VARCHAR2 (1000);
        oracle_err_num   NUMBER;
        oracle_err_mes   VARCHAR2 (200);

        -- stap 1: bepalen of er per vandaag een mutatie is voor cat/type
        CURSOR CAT IS
            SELECT r.alg_ruimte_key,
                   r.alg_ruimte_nr,
                   mutatiedatum.mutatiedatum,
                   ruimtetype.alg_kenmerk_key_type, ---> dit is de kenmerkkey voor deze nieuwe waarde
                   ruimtetype.huidig_type,                               --> ter info de oude waarde
                   ruimtetype.new_type_kenmerkwaarde,           ---> dit is de key van nieuwe waarde
                   ruimtetype.nieuw_type_omschrijving,                  ---> dit is de nieuwe waarde
                   categorie.alg_kenmerk_key_categorie, ---> dit is de kenmerkkey voor deze nieuwe waarde
                   categorie.huidige_categorie,                          --> ter info de oude waarde
                   categorie.new_categorie_kenmerkwaarde,       ---> dit is de key van nieuwe waarde
                   categorie.nieuwe_categorie_omschrijving,             ---> dit is de nieuwe waarde
                   aantal_wp.aant_wp_huidig,
                   aantal_wp.aant_wp_nieuw,
                   ruimtetype.onrgoedkenmerk_to_delete_type, --> deze mag weg als alles is opgeschoond
                   ruimtetype.onrgoedkenmerk_to_archive_type, --> deze mag een einddatum krijgen vandaag - 1
                   mutatiedatum.onrgoedkenmerk_to_delete_mutatiedat, --> deze mag weg als alles is opgeschoond
                   categorie.onrgoedkenmerk_to_archive_categorie, --> deze mag een einddatum krijgen vandaag - 1
                   categorie.onrgoedkenmerk_to_delete_categorie, --> deze mag weg als alles is opgeschoond
                   aantal_wp.onrgoedkenmerk_to_archive_wp, --> deze mag een einddatum krijgen vandaag - 1
                   aantal_wp.onrgoedkenmerk_to_delete_wp   --> deze mag weg als alles is opgeschoond
              FROM alg_ruimte  r,
                   (SELECT fac.safe_to_date (kw.alg_onrgoedkenmerk_waarde, 'dd-mm-yyyy')
                               mutatiedatum,
                           kw.alg_onrgoedkenmerk_key
                               onrgoedkenmerk_to_delete_mutatiedat,
                           kw.alg_onrgoed_key
                               ruimte_key
                      FROM alg_kenmerk k, alg_onrgoedkenmerk kw
                     WHERE     k.alg_kenmerk_key = 1082
                           AND kw.alg_kenmerk_key = k.alg_kenmerk_key
                           AND kw.alg_onrgoed_niveau = 'R') mutatiedatum,
                   (SELECT r.alg_ruimte_key                  ruimte_key,
                           huidig.aant_wp_huidig,
                           nieuw.aant_wp_nieuw,
                           huidig.alg_kenmerk_key,
                           huidig.alg_onrgoedkenmerk_key     onrgoedkenmerk_to_archive_wp,
                           nieuw.alg_onrgoedkenmerk_key      onrgoedkenmerk_to_delete_wp
                      FROM (SELECT kw.alg_onrgoedkenmerk_key,
                                   kw.alg_onrgoed_key,
                                   k.alg_kenmerk_key,
                                   kw.alg_onrgoedkenmerk_waarde     aant_wp_nieuw
                              FROM alg_kenmerk k, alg_onrgoedkenmerk kw
                             WHERE     k.alg_kenmerk_key = 1240
                                   AND kw.alg_kenmerk_key = k.alg_kenmerk_key
                                   AND kw.alg_onrgoedkenmerk_verwijder IS NULL
                                   AND kw.alg_onrgoed_niveau = 'R') nieuw,
                           (SELECT kw.alg_onrgoedkenmerk_key,
                                   kw.alg_onrgoed_key,
                                   k.alg_kenmerk_key,
                                   kw.alg_onrgoedkenmerk_waarde     aant_wp_huidig
                              FROM alg_kenmerk k, alg_onrgoedkenmerk kw
                             WHERE     k.alg_kenmerk_key = 1006
                                   AND kw.alg_kenmerk_key = k.alg_kenmerk_key
                                   AND kw.alg_onrgoedkenmerk_verwijder IS NULL
                                   AND kw.alg_onrgoed_niveau = 'R') huidig,
                           alg_ruimte  r
                     WHERE     r.alg_ruimte_key = nieuw.alg_onrgoed_key
                           AND r.alg_ruimte_key = huidig.alg_onrgoed_key(+)) aantal_wp,
                   (SELECT r.alg_ruimte_key                  ruimte_key,
                           huidig.omschrijving               huidig_type,
                           nieuw.omschrijving                nieuw_type_omschrijving,
                           huidig.alg_kenmerk_key            alg_kenmerk_key_type,
                           typen.fac_usrdata_key             new_type_kenmerkwaarde,
                           huidig.alg_onrgoedkenmerk_key     onrgoedkenmerk_to_archive_type,
                           nieuw.alg_onrgoedkenmerk_key      onrgoedkenmerk_to_delete_type
                      FROM (SELECT kw.alg_onrgoedkenmerk_key,
                                   kw.alg_onrgoed_key,
                                   k.alg_kenmerk_key,
                                   type_new.fac_usrdata_omschr     omschrijving
                              FROM alg_kenmerk k, alg_onrgoedkenmerk kw, fac_usrdata type_new
                             WHERE     k.alg_kenmerk_key = 1081
                                   AND kw.alg_kenmerk_key = k.alg_kenmerk_key
                                   AND fac.safe_to_number (kw.alg_onrgoedkenmerk_waarde) =
                                       type_new.fac_usrdata_key
                                   AND type_new.fac_usrtab_key = 41        -- keuzelijst nieuwe type
                                   AND kw.alg_onrgoedkenmerk_verwijder IS NULL
                                   AND kw.alg_onrgoed_niveau = 'R') nieuw,
                           (SELECT kw.alg_onrgoedkenmerk_key,
                                   kw.alg_onrgoed_key,
                                   k.alg_kenmerk_key,
                                   type_new.fac_usrdata_omschr     omschrijving
                              FROM alg_kenmerk k, alg_onrgoedkenmerk kw, fac_usrdata type_new
                             WHERE     k.alg_kenmerk_key = 1008
                                   AND kw.alg_kenmerk_key = k.alg_kenmerk_key
                                   AND fac.safe_to_number (kw.alg_onrgoedkenmerk_waarde) =
                                       type_new.fac_usrdata_key
                                   AND type_new.fac_usrtab_key = 3                -- keuzelijst type
                                   AND kw.alg_onrgoedkenmerk_verwijder IS NULL
                                   AND kw.alg_onrgoed_niveau = 'R') huidig,
                           alg_ruimte   r,
                           fac_usrdata  typen
                     WHERE     typen.fac_usrtab_key = 3                          -- keuzelijst typen
                           AND UPPER (nieuw.omschrijving) = UPPER (typen.fac_usrdata_omschr) --- op basis van de omschrijvingen kan de juiste key bepaald worden
                           AND r.alg_ruimte_key = nieuw.alg_onrgoed_key
                           AND r.alg_ruimte_key = huidig.alg_onrgoed_key(+)) ruimtetype,
                   (SELECT r.alg_ruimte_key                  ruimte_key,
                           huidig.omschrijving               huidige_categorie,
                           nieuw.omschrijving                nieuwe_categorie_omschrijving,
                           huidig.alg_kenmerk_key            alg_kenmerk_key_categorie,
                           categorie.fac_usrdata_key         new_categorie_kenmerkwaarde,
                           huidig.alg_onrgoedkenmerk_key     onrgoedkenmerk_to_archive_categorie,
                           nieuw.alg_onrgoedkenmerk_key      onrgoedkenmerk_to_delete_categorie
                      FROM (SELECT kw.alg_onrgoedkenmerk_key,
                                   kw.alg_onrgoed_key,
                                   k.alg_kenmerk_key,
                                   categorie_new.fac_usrdata_omschr     omschrijving
                              FROM alg_kenmerk k, alg_onrgoedkenmerk kw, fac_usrdata categorie_new
                             WHERE     k.alg_kenmerk_key = 1080
                                   AND kw.alg_kenmerk_key = k.alg_kenmerk_key
                                   AND fac.safe_to_number (kw.alg_onrgoedkenmerk_waarde) =
                                       categorie_new.fac_usrdata_key
                                   AND categorie_new.fac_usrtab_key = 42 -- keuzelijst nieuwe categorieen
                                   AND kw.alg_onrgoedkenmerk_verwijder IS NULL
                                   AND kw.alg_onrgoed_niveau = 'R') nieuw,
                           (SELECT kw.alg_onrgoedkenmerk_key,
                                   kw.alg_onrgoed_key,
                                   k.alg_kenmerk_key,
                                   categorie.fac_usrdata_omschr     omschrijving
                              FROM alg_kenmerk k, alg_onrgoedkenmerk kw, fac_usrdata categorie
                             WHERE     k.alg_kenmerk_key = 1060
                                   AND kw.alg_kenmerk_key = k.alg_kenmerk_key
                                   AND fac.safe_to_number (kw.alg_onrgoedkenmerk_waarde) =
                                       categorie.fac_usrdata_key
                                   AND categorie.fac_usrtab_key = 21         -- keuzelijst categorie
                                   AND kw.alg_onrgoedkenmerk_verwijder IS NULL
                                   AND kw.alg_onrgoed_niveau = 'R') huidig,
                           alg_ruimte   r,
                           fac_usrdata  categorie
                     WHERE     categorie.fac_usrtab_key = 21                 -- keuzelijst categorie
                           AND UPPER (nieuw.omschrijving) = UPPER (categorie.fac_usrdata_omschr) --- op basis van de omschrijvingen kan de juiste key bepaald worden
                           AND r.alg_ruimte_key = nieuw.alg_onrgoed_key
                           AND r.alg_ruimte_key = huidig.alg_onrgoed_key(+)) categorie
             WHERE     mutatiedatum.ruimte_key = r.alg_ruimte_key
                   AND ruimtetype.ruimte_key(+) = r.alg_ruimte_key
                   AND categorie.ruimte_key(+) = r.alg_ruimte_key
                   AND aantal_wp.ruimte_key(+) = r.alg_ruimte_key
                   AND mutatiedatum.mutatiedatum < TRUNC (SYSDATE + 1);

        -- stap 2: bepalen of er per vandaag een mutatie is voor vloer
        CURSOR VLOER IS
            SELECT r.alg_ruimte_key,
                   r.alg_ruimte_nr,
                   mutatiedatum.mutatiedatum,
                   mutatiedatum.onrgoedkenmerk_to_delete_mutatiedat, --> deze mag weg als alles is opgeschoond
                   vloer.alg_kenmerk_key_vloer,      ---> dit is de kenmerkkey voor de nieuwe waarde
                   vloer.huidige_vloer,                                 ---> ter info de oude waarde
                   vloer.to_archive_vloer,          ---> deze mag een einddatum krijgen vandaag - 1,
                   vloer_new.nieuwe_vloer_key,                  ---> dit is de key van nieuwe waarde
                   vloer_new.nieuwe_vloer_omschr,                       ---> dit is de nieuwe waarde
                   vloer_new.to_delete_vloer               --> deze mag weg als alles is opgeschoond
              FROM alg_ruimte  r,
                   (SELECT fac.safe_to_date (kw.alg_onrgoedkenmerk_waarde, 'dd-mm-yyyy')
                               mutatiedatum,
                           kw.alg_onrgoedkenmerk_key
                               onrgoedkenmerk_to_delete_mutatiedat,
                           kw.alg_onrgoed_key
                               ruimte_key
                      FROM alg_kenmerk k, alg_onrgoedkenmerk kw
                     WHERE     k.alg_kenmerk_key = 1084
                           AND kw.alg_kenmerk_key = k.alg_kenmerk_key
                           AND kw.alg_onrgoed_niveau = 'R') mutatiedatum,
                   (SELECT kw.alg_onrgoed_key            ruimte_key,
                           kw.alg_kenmerk_key            alg_kenmerk_key_vloer,
                           kw.alg_onrgoedkenmerk_key     to_archive_vloer,
                           ud.fac_usrdata_omschr         huidige_vloer
                      FROM alg_kenmerk k, alg_onrgoedkenmerk kw, fac_usrdata ud
                     WHERE     k.alg_kenmerk_key = 1009
                           AND k.alg_kenmerk_key = kw.alg_kenmerk_key
                           AND fac.safe_to_number (kw.alg_onrgoedkenmerk_waarde) =
                               ud.fac_usrdata_key
                           AND kw.alg_onrgoed_niveau = 'R'
                           AND kw.alg_onrgoedkenmerk_verwijder IS NULL) vloer,
                   (SELECT kw.alg_onrgoed_key            ruimte_key,
                           kw.alg_onrgoedkenmerk_key     to_delete_vloer,
                           ud.fac_usrdata_key            nieuwe_vloer_key,
                           ud.fac_usrdata_omschr         nieuwe_vloer_omschr
                      FROM alg_kenmerk k, alg_onrgoedkenmerk kw, fac_usrdata ud
                     WHERE     k.alg_kenmerk_key = 1083
                           AND k.alg_kenmerk_key = kw.alg_kenmerk_key
                           AND fac.safe_to_number (kw.alg_onrgoedkenmerk_waarde) =
                               ud.fac_usrdata_key
                           AND kw.alg_onrgoed_niveau = 'R'
                           AND kw.alg_onrgoedkenmerk_verwijder IS NULL) vloer_new
             WHERE     r.alg_ruimte_key = vloer.ruimte_key(+) --- (+) outer join, voor als er nog geen waarde is
                   AND r.alg_ruimte_key = vloer_new.ruimte_key
                   AND r.alg_ruimte_key = mutatiedatum.ruimte_key
                   AND mutatiedatum.mutatiedatum < TRUNC (SYSDATE + 1);

        -- stap 3: bepalen of er per vandaag een mutatie is voor de ruimteomschrijving
        CURSOR OMSCHRIJVING IS
            SELECT r.alg_ruimte_key,
                   r.alg_ruimte_nr,
                   mutatiedatum.mutatiedatum,
                   mutatiedatum.onrgoedkenmerk_to_delete_mutatiedat, --> deze mag weg als alles is opgeschoond
                   r.alg_ruimte_omschrijving,                           ---> ter info de oude waarde
                   omschr_nieuw.omschrijving_nieuw,                     ---> dit is de nieuwe waarde
                   omschr_nieuw.to_delete_omschr           --> deze mag weg als alles is opgeschoond
              FROM alg_ruimte  r,
                   (SELECT fac.safe_to_date (kw.alg_onrgoedkenmerk_waarde, 'dd-mm-yyyy')
                               mutatiedatum,
                           kw.alg_onrgoedkenmerk_key
                               onrgoedkenmerk_to_delete_mutatiedat,
                           kw.alg_onrgoed_key
                               ruimte_key
                      FROM alg_kenmerk k, alg_onrgoedkenmerk kw
                     WHERE     k.alg_kenmerk_key = 1262
                           AND kw.alg_kenmerk_key = k.alg_kenmerk_key
                           AND kw.alg_onrgoed_niveau = 'R') mutatiedatum,
                   (SELECT kw.alg_onrgoed_key               ruimte_key,
                           kw.alg_onrgoedkenmerk_key        to_delete_omschr,
                           kw.alg_onrgoedkenmerk_waarde     omschrijving_nieuw
                      FROM alg_kenmerk k, alg_onrgoedkenmerk kw
                     WHERE     k.alg_kenmerk_key = 1261
                           AND k.alg_kenmerk_key = kw.alg_kenmerk_key
                           AND kw.alg_onrgoed_niveau = 'R'
                           AND kw.alg_onrgoedkenmerk_verwijder IS NULL) omschr_nieuw
             WHERE     r.alg_ruimte_key = omschr_nieuw.ruimte_key
                   AND r.alg_ruimte_key = mutatiedatum.ruimte_key
                   AND mutatiedatum.mutatiedatum < TRUNC (SYSDATE + 1);
    BEGIN
        -- kenmerken die zijn leeggehaald krijgen geen einddatum maar een NULL waarde
        -- om problemen te voorkomen met dubbele waarden geven we die eerst een einddatum
        UPDATE alg_onrgoedkenmerk ok
           SET ok.alg_onrgoedkenmerk_verwijder = SYSDATE
         WHERE ok.alg_onrgoedkenmerk_waarde IS NULL AND ok.alg_onrgoedkenmerk_verwijder IS NULL;

        FOR rec IN CAT
        LOOP
            IF rec.onrgoedkenmerk_to_archive_categorie IS NOT NULL
            THEN
                -- de oude waarden (categorie archiveren) geven we een verwijderdatum vandaag-1
                UPDATE alg_onrgoedkenmerk ok
                   SET ok.alg_onrgoedkenmerk_verwijder = SYSDATE - 1
                 WHERE ok.alg_onrgoedkenmerk_key =
                       fac.safe_to_number (rec.onrgoedkenmerk_to_archive_categorie);

                fac.trackaction ('ALGRUP',
                                 rec.alg_ruimte_key,
                                 3,
                                 SYSDATE,
                                 'Categorie ' || rec.huidige_categorie || ' gearchiveerd');

                COMMIT;
            END IF;

            IF rec.onrgoedkenmerk_to_archive_type IS NOT NULL
            THEN
                -- de oude waarden (type archiveren) geven we een verwijderdatum vandaag-1
                UPDATE alg_onrgoedkenmerk ok
                   SET ok.alg_onrgoedkenmerk_verwijder = SYSDATE - 1
                 WHERE ok.alg_onrgoedkenmerk_key =
                       fac.safe_to_number (rec.onrgoedkenmerk_to_archive_type);

                fac.trackaction ('ALGRUP',
                                 rec.alg_ruimte_key,
                                 3,
                                 SYSDATE,
                                 'Type ' || rec.huidig_type || ' gearchiveerd');

                COMMIT;
            END IF;

            IF rec.onrgoedkenmerk_to_archive_wp IS NOT NULL
            THEN
                -- de oude waarden (type archiveren) geven we een verwijderdatum vandaag-1
                UPDATE alg_onrgoedkenmerk ok
                   SET ok.alg_onrgoedkenmerk_verwijder = SYSDATE - 1
                 WHERE ok.alg_onrgoedkenmerk_key =
                       fac.safe_to_number (rec.onrgoedkenmerk_to_archive_wp);

                fac.trackaction ('ALGRUP',
                                 rec.alg_ruimte_key,
                                 3,
                                 SYSDATE,
                                 'Aantal werkplekken ' || rec.aant_wp_huidig || ' gearchiveerd');

                COMMIT;
            END IF;

            IF     rec.new_categorie_kenmerkwaarde IS NOT NULL
               AND rec.new_type_kenmerkwaarde IS NOT NULL
            THEN
                -- de nieuwe waarde voor categorie voegen we toe
                INSERT INTO alg_onrgoedkenmerk (alg_onrgoed_key,
                                                alg_onrgoed_niveau,
                                                alg_kenmerk_key,
                                                alg_onrgoedkenmerk_waarde)
                     VALUES (rec.alg_ruimte_key,
                             'R',
                             1060,
                             fac.safe_to_number (rec.new_categorie_kenmerkwaarde));

                -- de nieuwe waarde voor type voegen we toe
                INSERT INTO alg_onrgoedkenmerk (alg_onrgoed_key,
                                                alg_onrgoed_niveau,
                                                alg_kenmerk_key,
                                                alg_onrgoedkenmerk_waarde)
                     VALUES (rec.alg_ruimte_key,
                             'R',
                             1008,
                             fac.safe_to_number (rec.new_type_kenmerkwaarde));

                fac.trackaction (
                    'ALGRUP',
                    rec.alg_ruimte_key,
                    3,
                    SYSDATE,
                       'Categorie en type omgezet naar : '
                    || rec.nieuwe_categorie_omschrijving
                    || ' - '
                    || rec.nieuw_type_omschrijving);

                -- de mutatie velden --> die moeten weer leeggemaakt worden voor een volgende mutatie
                DELETE alg_onrgoedkenmerk ok
                 WHERE    ok.alg_onrgoedkenmerk_key =
                          fac.safe_to_number (rec.onrgoedkenmerk_to_delete_type)
                       OR ok.alg_onrgoedkenmerk_key =
                          fac.safe_to_number (rec.onrgoedkenmerk_to_delete_mutatiedat)
                       OR ok.alg_onrgoedkenmerk_key =
                          fac.safe_to_number (rec.onrgoedkenmerk_to_delete_categorie);

                fac.trackaction ('ALGRUP',
                                 rec.alg_ruimte_key,
                                 3,
                                 SYSDATE,
                                 'Mutatievelden categorie en type opgeschoond');
                COMMIT;
            END IF;

            IF rec.aant_wp_nieuw IS NOT NULL
            THEN
                -- de nieuwe waarde voor aantal werkplekken voegen we toe
                INSERT INTO alg_onrgoedkenmerk (alg_onrgoed_key,
                                                alg_onrgoed_niveau,
                                                alg_kenmerk_key,
                                                alg_onrgoedkenmerk_waarde)
                     VALUES (rec.alg_ruimte_key,
                             'R',
                             1006,
                             fac.safe_to_number (rec.aant_wp_nieuw));

                fac.trackaction ('ALGRUP',
                                 rec.alg_ruimte_key,
                                 3,
                                 SYSDATE,
                                 'Aantal werkplekken omgezet naar : ' || rec.aant_wp_nieuw);

                -- de mutatie velden --> die moeten weer leeggemaakt worden voor een volgende mutatie
                DELETE alg_onrgoedkenmerk ok
                 WHERE ok.alg_onrgoedkenmerk_key =
                       fac.safe_to_number (rec.onrgoedkenmerk_to_delete_wp);

                fac.trackaction ('ALGRUP',
                                 rec.alg_ruimte_key,
                                 3,
                                 SYSDATE,
                                 'Mutatieveld aantal werkplekken opgeschoond');
                COMMIT;
            END IF;
        END LOOP;

        FOR rec IN VLOER
        LOOP
            -- de oude waarden (categorie en type archiveren) geven we een verwijderdatum vandaag-1
            IF rec.huidige_vloer IS NOT NULL
            THEN
                UPDATE alg_onrgoedkenmerk ok
                   SET ok.alg_onrgoedkenmerk_verwijder = SYSDATE - 1
                 WHERE ok.alg_onrgoedkenmerk_key = fac.safe_to_number (rec.to_archive_vloer);

                fac.trackaction ('ALGRUP',
                                 rec.alg_ruimte_key,
                                 3,
                                 SYSDATE,
                                 'Vloerafwerking ' || rec.huidige_vloer || ' gearchiveerd');

                COMMIT;
            END IF;

            -- de nieuwe waarde voor categorie voegen we toe
            IF rec.nieuwe_vloer_key IS NOT NULL
            THEN
                INSERT INTO alg_onrgoedkenmerk (alg_onrgoed_key,
                                                alg_onrgoed_niveau,
                                                alg_kenmerk_key,
                                                alg_onrgoedkenmerk_waarde)
                     VALUES (rec.alg_ruimte_key,
                             'R',
                             1009,
                             fac.safe_to_number (rec.nieuwe_vloer_key));

                fac.trackaction ('ALGRUP',
                                 rec.alg_ruimte_key,
                                 3,
                                 SYSDATE,
                                 'Vloerafwerking omgezet naar : ' || rec.nieuwe_vloer_omschr);

                -- de mutatie velden --> die moeten weer leeggemaakt worden voor een volgende mutatie
                DELETE alg_onrgoedkenmerk ok
                 WHERE    ok.alg_onrgoedkenmerk_key = fac.safe_to_number (rec.to_delete_vloer)
                       OR ok.alg_onrgoedkenmerk_key =
                          fac.safe_to_number (rec.onrgoedkenmerk_to_delete_mutatiedat);

                fac.trackaction ('ALGRUP',
                                 rec.alg_ruimte_key,
                                 3,
                                 SYSDATE,
                                 'Mutatievelden vloerafwerking opgeschoond');
                COMMIT;
            END IF;
        END LOOP;

        FOR rec IN OMSCHRIJVING
        LOOP
            UPDATE alg_ruimte r
               SET r.alg_ruimte_omschrijving = rec.omschrijving_nieuw
             WHERE r.alg_ruimte_key = rec.alg_ruimte_key;

            fac.trackaction (
                'ALGRUP',
                rec.alg_ruimte_key,
                3,
                SYSDATE,
                   'Ruimteomschrijving omgezet van '
                || rec.alg_ruimte_omschrijving
                || ' naar '
                || rec.omschrijving_nieuw);

            -- de mutatie velden --> die moeten weer leeggemaakt worden voor een volgende mutatie
            DELETE alg_onrgoedkenmerk ok
             WHERE    ok.alg_onrgoedkenmerk_key = fac.safe_to_number (rec.to_delete_omschr)
                   OR ok.alg_onrgoedkenmerk_key =
                      fac.safe_to_number (rec.onrgoedkenmerk_to_delete_mutatiedat);

            fac.trackaction ('ALGRUP',
                             rec.alg_ruimte_key,
                             3,
                             SYSDATE,
                             'Mutatievelden ruimteomschrijving opgeschoond');
            COMMIT;
        END LOOP;
    END VERWERKEN_RUIMTEKAART;
END;
/

CREATE OR REPLACE PROCEDURE KW1C_DAILY
AS
    v_errormsg       VARCHAR2 (1000);
    oracle_err_num   NUMBER;
    oracle_err_mes   VARCHAR2 (200);
BEGIN
    KW1C.VERWERKEN_RUIMTEKAART;
EXCEPTION
    WHEN OTHERS
    THEN
        oracle_err_num := SQLCODE;
        oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
        v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
        fac.writelog ('DAILY',
                      'E',
                      'Proces afgebroken!',
                      v_errormsg);
END KW1C_DAILY;
/

CREATE OR REPLACE VIEW KW1C_V_SYNC_ALG_RUIMTE
(
    ALG_RUIMTE_KEY,
    ALG_VERDIEPING_KEY,
    CADLABEL
)
AS
    SELECT r.alg_ruimte_key, v.alg_verdieping_key, LOWER (r.alg_ruimte_nr) cadlabel
      FROM alg_ruimte      r,
           alg_verdieping  v,
           alg_gebouw      g,
           alg_locatie     l
     WHERE     r.alg_verdieping_key = v.alg_verdieping_key
           AND v.alg_gebouw_key = g.alg_gebouw_key
           AND g.alg_locatie_key = l.alg_locatie_key
           AND (r.alg_srtruimte_key NOT IN (81) OR r.alg_srtruimte_key IS NULL);

-- Sleepbaar thema vloerafwerking

CREATE OR REPLACE VIEW KW1C_V_CAD_THEMA_VLOERAFW
(
    ALG_RUIMTE_KEY,
    WAARDE,
    WAARDE_KEY
)
AS
    SELECT r.alg_ruimte_key,
           COALESCE (gf.fac_usrdata_omschr, 'Onbekend'),
           COALESCE (gf.fac_usrdata_key, 161)
      FROM alg_ruimte  r,
           (SELECT rr.alg_ruimte_key, ud.fac_usrdata_omschr, ud.fac_usrdata_key
              FROM alg_onrgoedkenmerk    ok,
                   fac_usrdata           ud,
                   fac_kenmerkdomein     rk,
                   alg_kenmerk           k,
                   alg_v_aanwezigruimte  rr
             WHERE     rk.fac_usrtab_key = ud.fac_usrtab_key
                   AND k.fac_kenmerkdomein_key = rk.fac_kenmerkdomein_key
                   AND TO_CHAR (ud.fac_usrdata_key) = ok.alg_onrgoedkenmerk_waarde
                   AND ok.alg_onrgoedkenmerk_verwijder IS NULL
                   AND k.alg_kenmerk_key = 1009
                   AND rr.alg_ruimte_key = ok.alg_onrgoed_key) gf
     WHERE     gf.alg_ruimte_key(+) = r.alg_ruimte_key
           AND (r.alg_srtruimte_key NOT IN (81) OR r.alg_srtruimte_key IS NULL);

CREATE OR REPLACE TRIGGER kw1c_t_thema_vloerafw_i_iu
    INSTEAD OF INSERT OR UPDATE
    ON KW1C_V_CAD_THEMA_VLOERAFW
    FOR EACH ROW
BEGIN
    --- kenmerk bijwerken, let op: de nieuwe waarde is de key en dus niet de omschrijving
    alg.upsertkenmerk (1009, :new.alg_ruimte_key, :new.waarde_key);
END;
/

CREATE OR REPLACE VIEW KW1C_V_CAD_THEMA_RUIMTEGEBR
(
    ALG_RUIMTE_KEY,
    WAARDE,
    WAARDE_KEY
)
AS
    SELECT r.alg_ruimte_key,
           a.prs_afdeling_naam || ' - ' || a.prs_afdeling_omschrijving     waarde,
           a.prs_afdeling_key                                              afdeling_key
      FROM alg_ruimte r, prs_ruimteafdeling ra, prs_afdeling a
     WHERE     r.alg_ruimte_key = ra.alg_ruimte_key
           AND a.prs_afdeling_key = ra.prs_afdeling_key
           AND ra.prs_ruimteafdeling_verwijder IS NULL
           AND SYSDATE BETWEEN ra.prs_ruimteafdeling_ingangsdatum
                           AND COALESCE (ra.prs_ruimteafdeling_einddatum, TRUNC (SYSDATE) + 1);

CREATE OR REPLACE PROCEDURE kw1c_import_historie (p_import_key IN NUMBER)
AS
BEGIN
    NULL;
END kw1c_import_historie;
/

CREATE OR REPLACE PROCEDURE kw1c_update_historie (p_import_key IN NUMBER)
IS
    v_aanduiding     VARCHAR2 (200);
    v_errorhint      VARCHAR2 (1000);
    v_errormsg       VARCHAR2 (1000);
    oracle_err_num   NUMBER;
    oracle_err_mes   VARCHAR2 (200);
    v_count          NUMBER;

    CURSOR vloer IS
        SELECT UPPER (i.fac_imp_csv_col02)                              ruimtenr_oud,
               i.fac_imp_csv_col03                                      vloertypecode,
               i.fac_imp_csv_col04                                      vloertypenaam,
               fac.safe_to_date (i.fac_imp_csv_col05, 'dd-mm-yyyy')     begindatum,
               fac.safe_to_date (i.fac_imp_csv_col06, 'dd-mm-yyyy')     einddatum,
               v.fac_usrdata_key                                        vloertype_key,
               rn.alg_ruimte_key,
               rn.alg_ruimte_nr
          FROM fac_imp_csv  i,
               (SELECT r.alg_ruimte_key,
                       UPPER (rk.alg_onrgoedkenmerk_waarde)     ruimte_nr_oud,
                       r.alg_ruimte_nr
                  FROM alg_kenmerk k, alg_onrgoedkenmerk rk, alg_ruimte r
                 WHERE     k.alg_kenmerk_key = rk.alg_kenmerk_key
                       AND k.alg_kenmerk_key = 1062
                       AND rk.alg_onrgoed_niveau = 'R'
                       AND r.alg_ruimte_key = rk.alg_onrgoed_key) rn,
               (SELECT d.fac_usrdata_key, d.fac_usrdata_code, d.fac_usrdata_upper
                  FROM fac_usrtab t, fac_usrdata d
                 WHERE t.fac_usrtab_key = 4 AND d.fac_usrtab_key = t.fac_usrtab_key) v
         WHERE     UPPER (i.fac_imp_csv_col01) = 'VLOERAFWERKING'
               AND v.fac_usrdata_code = i.fac_imp_csv_col03
               AND rn.ruimte_nr_oud = UPPER (i.fac_imp_csv_col02)
               --- AND i.fac_imp_csv_col06 IS NOT NULL hiermee nemen we alleen verwijderde datums op, maar kunnen we verschillen in de huidige situatie niet vinden
               AND NOT EXISTS                  --- het huidige vloertype laten we buiten beschouwing
                       (SELECT r.alg_ruimte_key, rk.alg_onrgoedkenmerk_waarde vloerafwerking_key
                          FROM alg_kenmerk k, alg_onrgoedkenmerk rk, alg_ruimte r
                         WHERE     k.alg_kenmerk_key = rk.alg_kenmerk_key
                               AND k.alg_kenmerk_key = 1009
                               AND rk.alg_onrgoed_niveau = 'R'
                               AND r.alg_ruimte_key = rk.alg_onrgoed_key
                               AND rk.alg_onrgoedkenmerk_verwijder IS NULL
                               AND r.alg_ruimte_key = rn.alg_ruimte_key
                               AND rk.alg_onrgoedkenmerk_waarde = v.fac_usrdata_key);

    CURSOR org IS
        SELECT UPPER (i.fac_imp_csv_col02)                                              ruimtenr_oud,
               i.fac_imp_csv_col03                                                      oe,
               fac.safe_to_date (SUBSTR (i.fac_imp_csv_col04, 1, 10), 'dd-mm-yyyy')     begindatum,
               fac.safe_to_date (SUBSTR (i.fac_imp_csv_col05, 1, 10), 'dd-mm-yyyy')     einddatum,
               rn.alg_ruimte_key,
               rn.alg_ruimte_nr,
               a.prs_afdeling_key,
               a.prs_afdeling_naam
          FROM fac_imp_csv   i,
               prs_afdeling  a,
               (SELECT r.alg_ruimte_key,
                       UPPER (rk.alg_onrgoedkenmerk_waarde)     ruimte_nr_oud,
                       r.alg_ruimte_nr
                  FROM alg_kenmerk k, alg_onrgoedkenmerk rk, alg_ruimte r
                 WHERE     k.alg_kenmerk_key = rk.alg_kenmerk_key
                       AND k.alg_kenmerk_key = 1062
                       AND rk.alg_onrgoed_niveau = 'R'
                       AND r.alg_ruimte_key = rk.alg_onrgoed_key) rn
         WHERE     UPPER (i.fac_imp_csv_col01) = 'ORGANISATIE'
               AND rn.ruimte_nr_oud = UPPER (i.fac_imp_csv_col02)
               AND a.prs_afdeling_naam = i.fac_imp_csv_col03
               AND a.prs_afdeling_verwijder IS NULL;

    CURSOR ruimtedetails IS
        SELECT UPPER (i.fac_imp_csv_col02)                              ruimtenr_oud,
               i.fac_imp_csv_col03                                      ruimtecategorie,
               c.categorie                                              categorie_omschrijving,
               i.fac_imp_csv_col04                                      ruimtetype,
               t.ruimtetype                                             ruimtetype_omschrijving,
               fac.safe_to_date (i.fac_imp_csv_col05, 'dd-mm-yyyy')     begindatum,
               fac.safe_to_date (i.fac_imp_csv_col06, 'dd-mm-yyyy')     einddatum,
               c.fac_usrdata_key                                        categorie_key,
               t.fac_usrdata_key                                        type_key,
               rn.alg_ruimte_key,
               rn.alg_ruimte_nr
          FROM fac_imp_csv  i,
               (SELECT r.alg_ruimte_key,
                       UPPER (rk.alg_onrgoedkenmerk_waarde)     ruimte_nr_oud,
                       r.alg_ruimte_nr
                  FROM alg_kenmerk k, alg_onrgoedkenmerk rk, alg_ruimte r
                 WHERE     k.alg_kenmerk_key = rk.alg_kenmerk_key
                       AND k.alg_kenmerk_key = 1062
                       AND rk.alg_onrgoed_niveau = 'R'
                       AND r.alg_ruimte_key = rk.alg_onrgoed_key) rn,
               (SELECT d.fac_usrdata_key,
                       d.fac_usrdata_code,
                       d.fac_usrdata_upper || ' ' || d.fac_usrdata_omschr     categorie
                  FROM fac_usrtab t, fac_usrdata d
                 WHERE t.fac_usrtab_key = 21 AND d.fac_usrtab_key = t.fac_usrtab_key) c,
               (SELECT d.fac_usrdata_key,
                       d.fac_usrdata_code,
                       fac_usrdata_upper || ' ' || d.fac_usrdata_omschr     ruimtetype
                  FROM fac_usrtab t, fac_usrdata d
                 WHERE t.fac_usrtab_key = 3 AND d.fac_usrtab_key = t.fac_usrtab_key) t
         WHERE     UPPER (i.fac_imp_csv_col01) = 'TYPE'
               AND TO_CHAR (c.fac_usrdata_code) = TO_CHAR (i.fac_imp_csv_col03)
               AND t.fac_usrdata_code = i.fac_imp_csv_col04
               AND rn.ruimte_nr_oud = UPPER (i.fac_imp_csv_col02)
               AND NOT EXISTS              --- de huidge ruimtecategorie laten we buiten beschouwing
                       (SELECT r.alg_ruimte_key, rk.alg_onrgoedkenmerk_waarde ruimtecategorie
                          FROM alg_kenmerk k, alg_onrgoedkenmerk rk, alg_ruimte r
                         WHERE     k.alg_kenmerk_key = rk.alg_kenmerk_key
                               AND k.alg_kenmerk_key = 1060
                               AND rk.alg_onrgoed_niveau = 'R'
                               AND r.alg_ruimte_key = rk.alg_onrgoed_key
                               AND rk.alg_onrgoedkenmerk_verwijder IS NULL
                               AND r.alg_ruimte_key = rn.alg_ruimte_key
                               AND rk.alg_onrgoedkenmerk_waarde = c.fac_usrdata_key)
               AND NOT EXISTS                 --- het huidige ruimtetype laten we buiten beschouwing
                       (SELECT r.alg_ruimte_key, rk.alg_onrgoedkenmerk_waarde ruimtetype
                          FROM alg_kenmerk k, alg_onrgoedkenmerk rk, alg_ruimte r
                         WHERE     k.alg_kenmerk_key = rk.alg_kenmerk_key
                               AND k.alg_kenmerk_key = 1008
                               AND rk.alg_onrgoed_niveau = 'R'
                               AND r.alg_ruimte_key = rk.alg_onrgoed_key
                               AND rk.alg_onrgoedkenmerk_verwijder IS NULL
                               AND r.alg_ruimte_key = rn.alg_ruimte_key
                               AND rk.alg_onrgoedkenmerk_waarde = t.fac_usrdata_key);
BEGIN
    FOR rec IN vloer
    LOOP
        BEGIN
            --- om de historie te vullen vullen we de tabel alg_onrgoedkenmerk met 'vervallen' waarden
            INSERT INTO alg_onrgoedkenmerk (alg_onrgoed_key,
                                            alg_onrgoed_niveau,
                                            alg_kenmerk_key,
                                            alg_onrgoedkenmerk_waarde,
                                            alg_onrgoedkenmerk_aanmaak,
                                            alg_onrgoedkenmerk_verwijder)
                 VALUES (rec.alg_ruimte_key,
                         'R',
                         1009,
                         rec.vloertype_key,
                         rec.begindatum,
                         rec.einddatum);

            IF (rec.einddatum IS NOT NULL)
            THEN
                fac.trackaction (
                    'ALGRUP',
                    rec.alg_ruimte_key,
                    3,
                    rec.einddatum,
                    'Vloerafwerking ' || rec.vloertypenaam || ' opgenomen in het archief');
            END IF;
        EXCEPTION
            WHEN OTHERS
            THEN
                oracle_err_num := SQLCODE;
                oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                v_errormsg :=
                       v_errorhint
                    || ' ORACLE (error '
                    || oracle_err_num
                    || '/'
                    || oracle_err_mes
                    || ')';
                fac.imp_writelog (
                    p_import_key,
                    'W',
                    v_aanduiding || v_errormsg,
                    'Historie ruimte ' || rec.alg_ruimte_nr || ' kan niet worden gevuld');
                COMMIT;
        END;
    END LOOP;

    FOR rec IN org
    LOOP
        BEGIN
            INSERT INTO prs_ruimteafdeling (prs_afdeling_key,
                                            alg_ruimte_key,
                                            prs_ruimteafdeling_bezetting,
                                            prs_ruimteafdeling_ingangsdatum,
                                            prs_ruimteafdeling_einddatum)
                 VALUES (rec.prs_afdeling_key,
                         rec.alg_ruimte_key,
                         '100',
                         rec.begindatum,
                         rec.einddatum);

            IF (rec.einddatum IS NOT NULL)
            THEN
                fac.trackaction (
                    'ALGRUP',
                    rec.alg_ruimte_key,
                    3,
                    rec.einddatum,
                    'Ruimtegebruiker ' || rec.prs_afdeling_naam || ' opgenomen in het archief');
            END IF;
        EXCEPTION
            WHEN OTHERS
            THEN
                oracle_err_num := SQLCODE;
                oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                v_errormsg :=
                       v_errorhint
                    || ' ORACLE (error '
                    || oracle_err_num
                    || '/'
                    || oracle_err_mes
                    || ')';
                fac.imp_writelog (
                    p_import_key,
                    'W',
                    v_aanduiding || v_errormsg,
                    'Historie ruimte ' || rec.alg_ruimte_nr || ' kan niet worden gevuld');
                COMMIT;
        END;
    END LOOP;

    FOR rec IN ruimtedetails
    LOOP
        BEGIN
            --- om de historie te vullen vullen we de tabel alg_onrgoedkenmerk met 'vervallen' waarden
            INSERT INTO alg_onrgoedkenmerk (alg_onrgoed_key,
                                            alg_onrgoed_niveau,
                                            alg_kenmerk_key,
                                            alg_onrgoedkenmerk_waarde,
                                            alg_onrgoedkenmerk_aanmaak,
                                            alg_onrgoedkenmerk_verwijder)
                 VALUES (rec.alg_ruimte_key,
                         'R',
                         1060,
                         rec.categorie_key,
                         rec.begindatum,
                         rec.einddatum);

            IF (rec.einddatum IS NOT NULL)
            THEN
                fac.trackaction (
                    'ALGRUP',
                    rec.alg_ruimte_key,
                    3,
                    rec.einddatum,
                    'Categorie ' || rec.categorie_omschrijving || ' opgenomen in het archief');
            END IF;

            INSERT INTO alg_onrgoedkenmerk (alg_onrgoed_key,
                                            alg_onrgoed_niveau,
                                            alg_kenmerk_key,
                                            alg_onrgoedkenmerk_waarde,
                                            alg_onrgoedkenmerk_aanmaak,
                                            alg_onrgoedkenmerk_verwijder)
                 VALUES (rec.alg_ruimte_key,
                         'R',
                         1008,
                         rec.type_key,
                         rec.begindatum,
                         rec.einddatum);

            IF (rec.einddatum IS NOT NULL)
            THEN
                fac.trackaction (
                    'ALGRUP',
                    rec.alg_ruimte_key,
                    3,
                    rec.einddatum,
                    'Ruimtetype ' || rec.ruimtetype_omschrijving || ' opgenomen in het archief');
            END IF;
        EXCEPTION
            WHEN OTHERS
            THEN
                oracle_err_num := SQLCODE;
                oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                v_errormsg :=
                       v_errorhint
                    || ' ORACLE (error '
                    || oracle_err_num
                    || '/'
                    || oracle_err_mes
                    || ')';
                fac.imp_writelog (
                    p_import_key,
                    'W',
                    v_aanduiding || v_errormsg,
                    'Historie ruimte ' || rec.alg_ruimte_nr || ' kan niet worden gevuld');
                COMMIT;
        END;
    END LOOP;

    -- we ruimen de import tabel direct weer netjes op aangezien dit een generieke importtabel is
    DELETE FAC_IMP_CSV i
     WHERE i.fac_import_key = p_import_key;
     
END kw1c_update_historie;
/

CREATE OR REPLACE VIEW kw1c_export_gebouw
(
    LocatieCode,
    GebouwCode,
    GebouwNaam,
    Adres,
    Postcode,
    Plaats,
    Begindatum,
    Einddatum,
    Breedtegraad,
    Lengtegraad
)
AS
    SELECT l.alg_locatie_code,
           g.alg_gebouw_code,
           g.alg_gebouw_naam,
           l.alg_locatie_adres,
           l.alg_locatie_postcode,
           l.alg_locatie_plaats,
           ind.ingangsdatum,
           uitd.einddatum,
           g.alg_gebouw_x,
           g.alg_gebouw_y
      FROM alg_locatie  l,
           alg_gebouw   g,
           (SELECT ok.alg_onrgoed_key,
                   fac.safe_to_date (ok.alg_onrgoedkenmerk_waarde, 'DD-MM-YYYY')     ingangsdatum
              FROM alg_onrgoedkenmerk ok, alg_kenmerk k
             WHERE     k.alg_kenmerk_key = ok.alg_kenmerk_key
                   AND ok.alg_onrgoed_niveau = 'G'
                   AND k.alg_kenmerk_key = 1001
                   AND ok.alg_onrgoedkenmerk_verwijder IS NULL) ind,
           (SELECT ok.alg_onrgoed_key,
                   fac.safe_to_date (ok.alg_onrgoedkenmerk_waarde, 'DD-MM-YYYY')     einddatum
              FROM alg_onrgoedkenmerk ok, alg_kenmerk k
             WHERE     k.alg_kenmerk_key = ok.alg_kenmerk_key
                   AND ok.alg_onrgoed_niveau = 'G'
                   AND k.alg_kenmerk_key = 1160
                   AND ok.alg_onrgoedkenmerk_verwijder IS NULL) uitd
     WHERE     l.alg_locatie_key = g.alg_locatie_key
           AND ind.alg_onrgoed_key(+) = g.alg_gebouw_key
           AND uitd.alg_onrgoed_key(+) = g.alg_gebouw_key
           AND g.alg_srtgebouw_key NOT IN (61);

CREATE OR REPLACE VIEW kw1c_export_locatie
(
    Code,
    Naam,
    NaamVolledig,
    Adres,
    Postcode,
    Plaats,
    Breedtegraad,
    Lengtegraad,
    Begindatum,
    Einddatum
)
AS
    SELECT l.alg_locatie_code,
           l.alg_locatie_omschrijving,
           NULL,
           l.alg_locatie_adres,
           l.alg_locatie_postcode,
           l.alg_locatie_plaats,
           l.alg_locatie_x,
           l.alg_locatie_y,
           ind.ingangsdatum,
           uitd.einddatum
      FROM alg_locatie  l,
           (SELECT ok.alg_onrgoed_key,
                   fac.safe_to_date (ok.alg_onrgoedkenmerk_waarde, 'DD-MM-YYYY')     ingangsdatum
              FROM alg_onrgoedkenmerk ok, alg_kenmerk k
             WHERE     k.alg_kenmerk_key = ok.alg_kenmerk_key
                   AND ok.alg_onrgoed_niveau = 'L'
                   AND k.alg_kenmerk_key = 1120
                   AND ok.alg_onrgoedkenmerk_verwijder IS NULL) ind,
           (SELECT ok.alg_onrgoed_key,
                   fac.safe_to_date (ok.alg_onrgoedkenmerk_waarde, 'DD-MM-YYYY')     einddatum
              FROM alg_onrgoedkenmerk ok, alg_kenmerk k
             WHERE     k.alg_kenmerk_key = ok.alg_kenmerk_key
                   AND ok.alg_onrgoed_niveau = 'L'
                   AND k.alg_kenmerk_key = 1200
                   AND ok.alg_onrgoedkenmerk_verwijder IS NULL) uitd
     WHERE     l.alg_locatie_key = ind.alg_onrgoed_key(+)
           AND l.alg_locatie_key = uitd.alg_onrgoed_key(+);

CREATE OR REPLACE VIEW kw1c_export_ruimtecategorien
(
    RuimteCategorieCode,
    RuimteCategorieNaam
)
AS
    SELECT d.fac_usrdata_code, d.fac_usrdata_omschr
      FROM fac_usrtab t, fac_usrdata d
     WHERE     t.fac_usrtab_key = 21
           AND t.fac_usrtab_key = d.fac_usrtab_key
           AND d.fac_usrdata_verwijder IS NULL
           AND (d.fac_usrdata_vervaldatum IS NULL OR d.fac_usrdata_vervaldatum > TRUNC (SYSDATE));

CREATE OR REPLACE VIEW kw1c_export_ruimtedetails
(
    ruimtecode,
    oppervlakte,
    aantalwerkplekken,
    ruimtecategoriecode,
    ruimtetypecode,
    begindatum,
    einddatum
)
AS
    SELECT r.alg_ruimte_nr,
           r.alg_ruimte_bruto_vloeropp,
           wp.aantal_wp,
           cat.cat_code,
           t.type_code,
           t.startdatum      begindatum,
           t.vervaldatum     einddatum
      FROM alg_ruimte  r,
           (SELECT ok.alg_onrgoed_key, fac.safe_to_number (ok.alg_onrgoedkenmerk_waarde) aantal_wp
              FROM alg_onrgoedkenmerk ok, alg_kenmerk k
             WHERE     k.alg_kenmerk_key = ok.alg_kenmerk_key
                   AND ok.alg_onrgoed_niveau = 'R'
                   AND k.alg_kenmerk_key = 1006
                   AND ok.alg_onrgoedkenmerk_verwijder IS NULL) wp,
           (SELECT ok.alg_onrgoed_key, d.fac_usrdata_code cat_code, d.fac_usrdata_key
              FROM alg_onrgoedkenmerk  ok,
                   alg_kenmerk         k,
                   fac_usrdata         d,
                   fac_usrtab          t
             WHERE     k.alg_kenmerk_key = ok.alg_kenmerk_key
                   AND ok.alg_onrgoed_niveau = 'R'
                   AND k.alg_kenmerk_key = 1060
                   AND d.fac_usrdata_key = ok.alg_onrgoedkenmerk_waarde
                   AND t.fac_usrtab_key = d.fac_usrtab_key
                   AND ok.alg_onrgoedkenmerk_verwijder IS NULL
                   AND t.fac_usrtab_key = 21) cat,
           (SELECT ok.alg_onrgoed_key,
                   d.fac_usrdata_code                  type_code,
                   ok.alg_onrgoedkenmerk_verwijder     vervaldatum,
                   ok.alg_onrgoedkenmerk_aanmaak       startdatum,
                   d.fac_usrdata_parentkey
              FROM alg_onrgoedkenmerk  ok,
                   alg_kenmerk         k,
                   fac_usrdata         d,
                   fac_usrtab          t
             WHERE     k.alg_kenmerk_key = ok.alg_kenmerk_key
                   AND ok.alg_onrgoed_niveau = 'R'
                   AND k.alg_kenmerk_key = 1008
                   AND d.fac_usrdata_key = ok.alg_onrgoedkenmerk_waarde
                   AND t.fac_usrtab_key = d.fac_usrtab_key
                   AND t.fac_usrtab_key = 3) t
     WHERE     wp.alg_onrgoed_key(+) = r.alg_ruimte_key
           AND cat.alg_onrgoed_key = r.alg_ruimte_key
           AND t.alg_onrgoed_key = r.alg_ruimte_key
           AND cat.fac_usrdata_key = t.fac_usrdata_parentkey
           AND r.alg_ruimte_verwijder IS  NULL
           AND (r.alg_srtruimte_key NOT IN (81) OR r.alg_srtruimte_key IS NULL);

CREATE OR REPLACE VIEW kw1c_export_ruimtegebruik
(
    RuimteCode,
    OrganisatieEenheidCode,
    Begindatum,
    Einddatum,
    Status
)
AS
    SELECT r.alg_ruimte_nr,
           rg.prs_afdeling_naam,
           rg.prs_ruimteafdeling_ingangsdatum,
           rg.prs_ruimteafdeling_einddatum,
           CASE WHEN rg.prs_afdeling_naam = '002' THEN 'Buiten gebruik' ELSE 'In gebruik' END    status
      FROM alg_ruimte  r,
           (SELECT ra.alg_ruimte_key,
                   a.prs_afdeling_naam,
                   ra.prs_ruimteafdeling_ingangsdatum,
                   ra.prs_ruimteafdeling_einddatum
              FROM prs_afdeling a, prs_ruimteafdeling ra
             WHERE a.prs_afdeling_key = ra.prs_afdeling_key) rg
     WHERE     rg.alg_ruimte_key = r.alg_ruimte_key
     AND r.alg_ruimte_verwijder IS NULL
           AND (r.alg_srtruimte_key NOT IN (81) OR r.alg_srtruimte_key IS NULL);

CREATE OR REPLACE VIEW kw1c_export_ruimtes
(
    Code,
    Naam,
    GebouwCode,
    LocatieCode,
    Actief,
    VerdiepingCode,
    VerdiepingNaam,
    Virtueel
)
AS
    SELECT r.alg_ruimte_nr,
           r.alg_ruimte_omschrijving,
           g.alg_gebouw_code,
           l.alg_locatie_code,
           CASE
               WHEN     (ind.ingangsdatum < SYSDATE OR ind.ingangsdatum IS NULL)
                    AND (uitd.einddatum > SYSDATE OR uitd.einddatum IS NULL)
               THEN
                   'Ja'
               ELSE
                   'Nee'
           END    actief,
           v.alg_verdieping_code,
           v.alg_verdieping_omschrijving,
           CASE
               WHEN    l.alg_locatie_upper LIKE '%EXTERN%'
                    OR UPPER (v.alg_verdieping_omschrijving) LIKE '%TERREIN%'
               THEN
                   'Ja'
               ELSE
                   'Nee'
           END    virtueel
      FROM alg_ruimte      r,
           alg_verdieping  v,
           alg_gebouw      g,
           alg_locatie     l,
           (SELECT fac.safe_to_date (ok.alg_onrgoedkenmerk_waarde, 'dd-mm-yyyy')     ingangsdatum,
                   ok.alg_onrgoed_key                                                ruimte_key
              FROM alg_kenmerk k, alg_onrgoedkenmerk ok
             WHERE     k.alg_kenmerk_key = ok.alg_kenmerk_key
                   AND ok.alg_onrgoedkenmerk_verwijder IS NULL
                   AND k.alg_kenmerk_key = 1220) ind,
           (SELECT fac.safe_to_date (ok.alg_onrgoedkenmerk_waarde, 'dd-mm-yyyy')     einddatum,
                   ok.alg_onrgoed_key                                                ruimte_key
              FROM alg_kenmerk k, alg_onrgoedkenmerk ok
             WHERE     k.alg_kenmerk_key = ok.alg_kenmerk_key
                   AND ok.alg_onrgoedkenmerk_verwijder IS NULL
                   AND k.alg_kenmerk_key = 1221) uitd
     WHERE     r.alg_verdieping_key = v.alg_verdieping_key
           AND v.alg_gebouw_key = g.alg_gebouw_key
           AND g.alg_locatie_key = l.alg_locatie_key
           AND ind.ruimte_key(+) = r.alg_ruimte_key
           AND uitd.ruimte_key(+) = r.alg_ruimte_key
           AND r.alg_ruimte_verwijder IS NULL
           AND (r.alg_srtruimte_key NOT IN (81) OR r.alg_srtruimte_key IS NULL);

CREATE OR REPLACE VIEW kw1c_export_ruimtetype
(
    RuimtetypeCode,
    RuimtetypeNaam
)
AS
    SELECT ud.fac_usrdata_code, ud.fac_usrdata_omschr
      FROM fac_usrdata ud, fac_usrtab ut
     WHERE     ut.fac_usrtab_key = ud.fac_usrtab_key
           AND ut.fac_usrtab_key = 3
           AND ud.fac_usrdata_verwijder IS NULL
           AND (ud.fac_usrdata_vervaldatum IS NULL OR ud.fac_usrdata_vervaldatum > TRUNC (SYSDATE));

CREATE OR REPLACE VIEW kw1c_export_vloerafw
(
    ruimtecode,
    vloertypecode,
    vloertypenaam,
    begindatum,
    einddatum
)
AS
    SELECT r.alg_ruimte_nr,
           ud.fac_usrdata_code,
           ud.fac_usrdata_omschr,
           ok.alg_onrgoedkenmerk_aanmaak,
           ok.alg_onrgoedkenmerk_verwijder
      FROM fac_usrdata         ud,
           fac_usrtab          ut,
           alg_onrgoedkenmerk  ok,
           alg_kenmerk         k,
           alg_ruimte          r
     WHERE     ut.fac_usrtab_key = ud.fac_usrtab_key
           AND ut.fac_usrtab_key = 4
           AND k.alg_kenmerk_key = ok.alg_kenmerk_key
           AND k.alg_kenmerk_key = 1009
           AND ok.alg_onrgoed_niveau = 'R'
           AND ok.alg_onrgoed_key = r.alg_ruimte_key
           AND r.alg_ruimte_verwijder IS NULL
           AND fac.safe_to_number (ok.alg_onrgoedkenmerk_waarde) = ud.fac_usrdata_key
           AND (r.alg_srtruimte_key NOT IN (81) OR r.alg_srtruimte_key IS NULL);

CREATE OR REPLACE VIEW kw1c_export_vloerafw_types
(
    referentie,
    naam,
    omschrijving,
    hardheid
)
AS
    SELECT ud.fac_usrdata_code,
           ud.fac_usrdata_omschr,
           NULL,
           ud.fac_usrdata_omschr2
      FROM fac_usrdata ud, fac_usrtab ut
     WHERE     ut.fac_usrtab_key = ud.fac_usrtab_key
           AND ut.fac_usrtab_key = 4
           AND ud.fac_usrdata_verwijder IS NULL
           AND (ud.fac_usrdata_vervaldatum IS NULL OR ud.fac_usrdata_vervaldatum > TRUNC (SYSDATE));

CREATE OR REPLACE PROCEDURE kw1c_export_mail_acp (p_applname   IN VARCHAR2,
                                                  p_applrun    IN VARCHAR2,
                                                  p_filedir    IN VARCHAR2,
                                                  p_filename   IN VARCHAR2)
AS
    v_aanduiding     VARCHAR2 (200);
    v_errorhint      VARCHAR2 (1000);
    v_errormsg       VARCHAR2 (1000);
    oracle_err_num   NUMBER;
    oracle_err_mes   VARCHAR2 (200);


    CURSOR mail IS
        SELECT p.prs_perslid_email, p.prs_perslid_key
          FROM prs_perslid p
         WHERE     p.prs_perslid_verwijder IS NULL
               AND p.prs_perslid_inactief IS NULL
               AND UPPER (p.prs_perslid_email) LIKE '%@KW1C.NL';
BEGIN
    v_aanduiding := 'Init';
    v_errormsg := 'Init';

    FOR rec IN mail
    LOOP
        BEGIN
            UPDATE prs_perslid p
               SET p.prs_perslid_email =
                       REPLACE (UPPER (p.prs_perslid_email), '@KW1C.NL', '@takw1c.nl')
             WHERE p.prs_perslid_key = rec.prs_perslid_key;

            fac.trackaction ('PRSUPD',
                             rec.prs_perslid_key,
                             3,
                             SYSDATE,
                             'Mailadres omgezet naar @takw1c.nl');
        EXCEPTION
            WHEN OTHERS
            THEN
                oracle_err_num := SQLCODE;
                oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                v_errormsg :=
                       v_errorhint
                    || ' ORACLE (error '
                    || oracle_err_num
                    || '/'
                    || oracle_err_mes
                    || ')';
                fac.writelog (p_applname,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Onbekende fout!');
        END;
    END LOOP;
END kw1c_export_mail_acp;
/

CREATE OR REPLACE PROCEDURE kw1c_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 KW1C_TEST.kw1c_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;
/

CREATE OR REPLACE PROCEDURE kw1c_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_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);

         v_aanduiding :=
               '['
            || v_alg_gebouw_code
            || '|'
            || v_oprognose_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'
            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 (REPLACE (v_oprognose_gebouw_code, '"', ''));

 v_aanduiding :=
               '['
            || v_alg_gebouw_code
            || '|'
            || v_oprognose_gebouw_code
            || '|'
            || v_ins_deel_externnr
            || '|'
            || v_ins_deel_omschrijving
            || '|'
            || v_ins_srtcontrole_omschrijving
            || '] ';


            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 := '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(SUBSTR(d.ins_deel_externnr, 1, 6)) = 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)
                    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));

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

CREATE OR REPLACE PROCEDURE kw1c_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_org,
            i.ins_deel_externnr,
            i.ins_deel_key,
            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_aantal_org,
            i.ins_deel_aantal 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
      FROM  fac_imp_csv, ins_deel i
     WHERE fac_imp_csv_col02 = substr (i.ins_deel_externnr, 1, 6)
     AND ins_deel_verwijder IS NULL
     AND 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_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;

         -- 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;
        
        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 := kw1c.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 = FAC.safe_to_number(rec.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;
/


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