--
-- $Id$
--
-- Script containing customer specific db-configuration for SVRZ.
DEFINE thisfile = 'HMOD.SQL'
DEFINE dbuser   = '^HMOD'

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

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


CREATE OR REPLACE PROCEDURE hmod_import_koffer (p_import_key IN NUMBER)
AS
    c_fielddelimitor     VARCHAR2 (1) := ';';
    v_newline            VARCHAR2 (1000);                        -- Input line
    v_errormsg           VARCHAR2 (1000);
    oracle_err_num       NUMBER;
    oracle_err_mes       VARCHAR2 (200);
    header_is_valid      NUMBER;
    v_count              NUMBER;
    v_ongeldig           NUMBER (1);
    v_mode               NUMBER (1);
    v_aanduiding         VARCHAR2 (200);
    -- v_all_null            BOOLEAN;
    v_count_error        NUMBER (10);
    v_count_tot          NUMBER (10);
    v_count_import       NUMBER (10);
    -- De importvelden:
    v_versiedatum        VARCHAR2 (15);
    v_omschrijving       VARCHAR2 (250);
    v_code               VARCHAR2 (30);
    v_token              VARCHAR2 (20);
    v_mob                VARCHAR2 (20);
    v_hit                VARCHAR2 (20);
    v_lap_en_sim         VARCHAR2 (20);
    v_lapt               VARCHAR2 (20);
    v_tnc                VARCHAR2 (20);
    v_tnc_omschrijving   VARCHAR2 (100);
    v_facilitor          VARCHAR2 (20);
    v_adp                VARCHAR2 (20);
    v_absentiemanager    VARCHAR2 (20);
    v_regas              VARCHAR2 (20);
    v_checks             VARCHAR2 (20);
    v_accountview        VARCHAR2 (20);
    v_elvy               VARCHAR2 (20);
    v_hodnet             VARCHAR2 (20);
    v_proactive          VARCHAR2 (20);
    v_opmerking          VARCHAR2 (1000);
    v_volgnr             NUMBER (10);
    v_lettercode         VARCHAR2 (30);

    CURSOR c
    IS
          SELECT *
            FROM fac_imp_file
           WHERE fac_import_key = p_import_key
        ORDER BY fac_imp_file_index;
BEGIN
    -- Vorige inlees eerst verwijderen
    ---- Voor hmod_koffersysteem geldt dat je inlezen op dezelfde dag mag/kunt overschrijven. Voorgaande versiedatums blijven staan.
    DELETE FROM hmod_imp_koffersysteem
          WHERE versiedatum = TO_CHAR(TRUNC (SYSDATE),'DD-MM-YYYY');
    COMMIT;

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

    FOR rec IN c
    LOOP
        BEGIN
            v_newline := rec.fac_imp_file_line;
            v_errormsg := 'Fout opvragen te importeren rij';
            v_aanduiding := '';

            -- Lees alle veldwaarden: omschrijving;code;token;mob;hit;lap_en_sim;lapt;tnc;tnc omschrijving;facilitor;adp;absentiemanager;regas;checks;accountview;elvy;hodnet;proactive;opmerking
            v_errormsg := 'Fout opvragen te importeren kolom/rij 1';
            fac.imp_getfield (v_newline, c_fielddelimitor, v_omschrijving);
            v_errormsg := 'Fout opvragen te importeren kolom/rij 2';
            fac.imp_getfield (v_newline, c_fielddelimitor, v_code);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_lettercode);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_token);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_mob);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_hit);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_lap_en_sim);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_lapt);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_tnc);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_tnc_omschrijving);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_facilitor);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_adp);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_absentiemanager);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_regas);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_checks);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_accountview);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_elvy);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_hodnet);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_proactive);
            fac.imp_getfield (v_newline, c_fielddelimitor, v_opmerking);

            v_aanduiding :=
                v_versiedatum || '|' || v_omschrijving || '|' || v_code;
            v_count_tot := v_count_tot + 1;

            -- Skip until the header is found
            IF header_is_valid = 0
            THEN
                IF v_omschrijving = 'omschrijving'
                   AND v_code = 'code'
                   AND v_lettercode = 'lettercode'
                   AND v_token = 'token'
                   AND v_mob = 'mob'
                   AND v_hit = 'hit'
                   AND v_lap_en_sim = 'lap_en_sim'
                   AND v_lapt = 'lapt'
                   AND v_tnc = 'tnc'
                   AND v_tnc_omschrijving = 'tnc omschrijving'
                   AND v_facilitor = 'facilitor'
                   AND v_adp = 'adp'
                   AND v_absentiemanager = 'absentiemanager'
                   AND v_regas = 'regas'
                   AND v_checks = 'checks'
                   AND v_accountview = 'accountview'
                   AND v_elvy = 'elvy'
                   AND v_hodnet = 'hodnet'
                   AND v_proactive = 'proactive'
                   AND v_opmerking = 'opmerking'
                THEN
                    header_is_valid := 1;
                END IF;
            ELSE -- Header OK. Vanaf hier in de LOOP eventueel variabele vullen.
                
                BEGIN
                    v_errormsg := 'Versiedatum wordt sysdatum ';

                    SELECT TO_CHAR (TRUNC (SYSDATE), 'DD-MM-YYYY')
                      INTO v_versiedatum
                      FROM DUAL;
                      
                    -- volgnr vullen - dit numerieke veld gebruiken we voor kenmerkdomein-key.. 
                    ---- dit zou ik ook kunnen vullen buiten de LOOP, toch?
                    SELECT COALESCE (MAX (volgnr), 0) 
                    INTO v_volgnr
                    FROM hmod_imp_koffersysteem;
                    v_volgnr := v_volgnr + 1 ; 
                      
                END;

                INSERT INTO hmod_imp_koffersysteem (versiedatum,
                                                    omschrijving,
                                                    code,
                                                    lettercode,
                                                    token,
                                                    mob,
                                                    hit,
                                                    lap_en_sim,
                                                    lapt,
                                                    tnc,
                                                    tnc_omschrijving,
                                                    facilitor,
                                                    adp,
                                                    absentiemanager,
                                                    regas,
                                                    checks,
                                                    accountview,
                                                    elvy,
                                                    hodnet,
                                                    proactive,
                                                    volgnr,
                                                    opmerking)
                     VALUES (v_versiedatum,
                             v_omschrijving,
                             v_code,
                             v_lettercode,
                             v_token,
                             v_mob,
                             v_hit,
                             v_lap_en_sim,
                             v_lapt,
                             v_tnc,
                             v_tnc_omschrijving,
                             v_facilitor,
                             v_adp,
                             v_absentiemanager,
                             v_regas,
                             v_checks,
                             v_accountview,
                             v_elvy,
                             v_hodnet,
                             v_proactive,
                             v_volgnr,
                             v_opmerking);
            END IF;
        END;
    END LOOP;

    IF header_is_valid = 0
    THEN
        fac.imp_writelog (p_import_key,
                          'E',
                          'Ongeldig importbestand',
                          'Geen header of header niet volgens specificatie!');
    ELSE
        -- Afsluiting: Rollback/Delete tabel als er fouten in csv zitten. Initieel voor import koffersysteem nog zonder foutcheck opgezet, dus ook geen v_ongeldig aan het vullen...
        IF v_ongeldig > 0
        THEN
            ROLLBACK;
            -- Met rollback haalt hij ook al mijn errors en waarschuwingen weg!?? Daarom een DELETE
            -- delete from hmod_imp_contractscope where <alleen de ingelzen versiedatum ;
            COMMIT;
            fac.imp_writelog (
                p_import_key,
                'E',
                'Niet ingelezen. Staan aantal ongeldige regels in csv-bestand. Zie bovenstaande ERRORS. Pas deze eerst aan!',
                '');
        ELSE
            COMMIT;
            fac.imp_writelog (
                p_import_key,
                'S',
                'Aantal ingelezen regels: ' || TO_CHAR (v_count_import),
                '');
        END IF;
    END IF;
EXCEPTION
    WHEN OTHERS
    THEN
        ROLLBACK;
        oracle_err_num := SQLCODE;
        oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
        v_errormsg :=
            'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes;
        fac.imp_writelog (p_import_key,
                          'E',
                          v_errormsg || ' - Check !!!! : ' || v_aanduiding,
                          '');
END hmod_import_koffer;
/

CREATE OR REPLACE PROCEDURE hmod_update_koffer (p_import_key IN NUMBER)
AS
    v_errormsg       VARCHAR (200);
    v_errorhint      VARCHAR (200);
    oracle_err_mes   VARCHAR2 (150);
    currentversion   fac_module.fac_module_version%TYPE;
    v_aanduiding     VARCHAR (100);
    v_count          NUMBER;
BEGIN
    --   hmod_update_koffer (p_import_key);
    NULL;
END hmod_update_koffer;
/

-- Voor UDR-rapportage.
-- Later stadium nog aanvullen met personen-koppeling zodat men goed overzicht heeft van wat er per persoon is uitgereikt. Bij herziening van de koffer oook direct in beeld heeft waar eventuele vervolgacties gedaan moeten worden. 
CREATE OR REPLACE VIEW hmod_v_koffersysteem
(
    OMSCHRIJVING_TOTAAL,
    VERSIEDATUM,
    OMSCHRIJVING,
    CODE,
    LETTERCODE,
    TOKEN,
    MOB,
    HIT,
    LAP_EN_SIM,
    LAPT,
    TNC,
    TNC_OMSCHRIJVING,
    FACILITOR,
    ADP,
    ABSENTIEMANAGER,
    REGAS,
    CHECKS,
    ACCOUNTVIEW,
    ELVY,
    HODNET,
    PROACTIVE,
    VOLGNR,
    OPMERKING    
)
AS
    SELECT OMSCHRIJVING || ' (' || code || ')' AS omschrijving_totaal,
           versiedatum,
           omschrijving,
           code,
           lettercode,
           token,
           mob,
           hit,
           lap_en_sim,
           lapt,
           tnc,
           tnc_omschrijving,
           facilitor,
           adp,
           absentiemanager,
           regas,
           checks,
           accountview,
           elvy,
           hodnet,
           proactive,
           volgnr,
           opmerking
      FROM hmod_imp_koffersysteem;

-- Voor keuzelijst (kenmerk domein)
CREATE OR REPLACE VIEW hmod_v_koffersysteem_huidig
(
    VOLGNR,
    OMSCHRIJVING,
    VERSIEDATUM
)
AS
    SELECT 
       VOLGNR,
       OMSCHRIJVING_TOTAAL,
       VERSIEDATUM
      FROM hmod_v_koffersysteem
      WHERE versiedatum = (select max(versiedatum) from hmod_v_koffersysteem)
      ORDER BY omschrijving, versiedatum DESC
     ;

-- Basisview en rapportview voor de telefoon-objecten mobiel en vast per persoon
CREATE OR REPLACE VIEW HMOD_V_TELEFOONNR_KLANTOBJECT
(
    PRS_PERSLID_KEY,
    PRS_NAAM,
    SOORT,
    NUMMER_OBJECT,
    INS_DEEL_KEY,                                                     -- KEY 1
    INS_DEEL_AANMAAK,
    INS_DEEL_KEY2,                              -- KEY2 voor MOBIEL-SIM-OBJECT
    VASTNR_HUIDIG,
    MOBIELNR_HUIDIG
)
AS
    SELECT p.prs_perslid_key,
           prs_perslid_naam || ' (' || prs_perslid_voornaam || ')'
               AS naam_werknemer,
           sd.ins_srtdeel_omschrijving,
           d.ins_deel_upper,
           d.ins_deel_key
               key1,
           d.ins_deel_aanmaak,
           NULL
               key2,
           p.prs_perslid_telefoonnr,
           p.prs_perslid_mobiel
      FROM prs_perslid             p,
           ins_deel                d,
           ins_srtdeel             sd,
           prs_v_aanwezigafdeling  v
     WHERE     p.prs_perslid_key = d.ins_alg_ruimte_key
           AND d.ins_srtdeel_key = 70               -- Telefooncentralenummers
           AND d.ins_alg_ruimte_type = 'P'
           AND d.ins_deel_verwijder IS NULL
           AND d.ins_deel_actief = 1
           AND (   d.ins_deel_vervaldatum IS NULL
                OR TRUNC (d.ins_deel_vervaldatum) > TRUNC (SYSDATE))
           AND d.ins_srtdeel_key = sd.ins_srtdeel_key
           AND p.prs_perslid_verwijder IS NULL
           AND p.prs_afdeling_key = v.prs_afdeling_key
           AND v.prs_bedrijf_key = 41 -- Personen binnen bedrijf Humanitas onder Dak
           AND p.prs_perslid_key NOT IN (721) -- M.u.v. perslid voor met nr '999001' (bestemd voor objecten nog uit te lenen...)
    UNION ALL
    SELECT p.prs_perslid_key,
           prs_perslid_naam || ' (' || prs_perslid_voornaam || ')'
               AS Naam_werknemer,
           sd.ins_srtdeel_omschrijving,
           dd.ins_deel_upper,
           d.ins_deel_key
               Key1,
           d.ins_deel_aanmaak,
           dd.ins_deel_key
               Key2,
           p.prs_perslid_telefoonnr,
           p.prs_perslid_mobiel
      FROM prs_perslid             p,
           ins_deel                d,
           ins_srtdeel             sd,
           prs_v_aanwezigafdeling  v,
           ins_kenmerkdeel         kd,
           ins_deel                dd
     WHERE     p.prs_perslid_key = d.ins_alg_ruimte_key
           AND d.ins_srtdeel_key = 69                        -- Mobieltelefoon
           AND d.ins_alg_ruimte_type = 'P'
           AND d.ins_deel_verwijder IS NULL
           AND d.ins_deel_actief = 1
           AND (   d.ins_deel_vervaldatum IS NULL
                OR TRUNC (d.ins_deel_vervaldatum) > TRUNC (SYSDATE))
           AND d.ins_srtdeel_key = sd.ins_srtdeel_key
           AND p.prs_perslid_verwijder IS NULL
           AND p.prs_afdeling_key = v.prs_afdeling_key
           AND v.prs_bedrijf_key = 41   -- afdeling binnen bedrijf Humanitas..
           AND p.prs_perslid_key NOT IN (721) -- perslid voor met nr '999001' voor objecten nog uit te lenen...
           AND d.ins_deel_key = kd.ins_deel_key
           AND kd.ins_kenmerk_key = 152
           AND kd.ins_kenmerkdeel_verwijder IS NULL
           AND fac.safe_to_number (kd.ins_kenmerkdeel_waarde) =
               dd.ins_deel_key
           AND dd.ins_srtdeel_key = 341             --  SIM-kaarten en nummers
           AND dd.ins_deel_verwijder IS NULL
           AND dd.ins_deel_actief = 1
           AND (   dd.ins_deel_vervaldatum IS NULL
                OR TRUNC (dd.ins_deel_vervaldatum) > TRUNC (SYSDATE)) ;


CREATE OR REPLACE PROCEDURE hmod_prs_telefoonnummers (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
AS
   CURSOR c_vast
   IS
   SELECT PRS_PERSLID_KEY, PRS_NAAM, SOORT, NUMMER_OBJECT, INS_DEEL_KEY, INS_DEEL_AANMAAK, INS_DEEL_KEY2, VASTNR_HUIDIG, MOBIELNR_HUIDIG   
   FROM HMOD_V_TELEFOONNR_KLANTOBJECT
   WHERE SOORT = 'Telefooncentralenummers' AND (VASTNR_HUIDIG<>NUMMER_OBJECT OR VASTNR_HUIDIG is null)  ;
   
   CURSOR c_mob
   IS
   SELECT PRS_PERSLID_KEY, PRS_NAAM, SOORT, NUMMER_OBJECT, INS_DEEL_KEY, INS_DEEL_AANMAAK, INS_DEEL_KEY2, VASTNR_HUIDIG, MOBIELNR_HUIDIG   
   FROM HMOD_V_TELEFOONNR_KLANTOBJECT
   WHERE SOORT = 'Mobieletelefoon' AND (MOBIELNR_HUIDIG<>NUMMER_OBJECT OR MOBIELNR_HUIDIG is null)  ;

   CURSOR c_delvast
   IS 
   SELECT p.prs_perslid_key, p.prs_perslid_telefoonnr
    FROM prs_perslid p
    WHERE 
    p.prs_perslid_key not in (select v.prs_perslid_key from HMOD_V_TELEFOONNR_KLANTOBJECT v where v.soort = 'Telefooncentralenummers')
    and p.prs_afdeling_key in (select v.prs_afdeling_key  from prs_v_aanwezigafdeling v where v.prs_bedrijf_key = 41 and v.prs_afdeling_verwijder is null) -- Onderdeel bedrijf Humanitas...
    and p.prs_perslid_telefoonnr is not null ;  

   CURSOR c_delmob
   IS   
    SELECT p.prs_perslid_key, p.prs_perslid_mobiel
    FROM prs_perslid p
    WHERE 
    p.prs_perslid_key not in (select v.prs_perslid_key from HMOD_V_TELEFOONNR_KLANTOBJECT v where v.soort = 'Mobieletelefoon')
    and p.prs_afdeling_key in (select v.prs_afdeling_key  from prs_v_aanwezigafdeling v where v.prs_bedrijf_key = 41 and v.prs_afdeling_verwijder is null) -- Onderdeel bedrijf Humanitas...
    and p.prs_perslid_mobiel is not null ;  

    v_telefoon_vast    VARCHAR2(15);
    v_telefoon_mobiel  VARCHAR2(15);
    
    v_errormsg       VARCHAR (200);
    v_errorhint      VARCHAR (200);
    oracle_err_mes   VARCHAR2 (150);
    currentversion   fac_module.fac_module_version%TYPE;
    v_aanduiding     VARCHAR (100);
    v_count          NUMBER;

BEGIN
    v_count:=0;
    
    FOR rec IN c_vast
    LOOP

        v_aanduiding :=
               'Vast nummer gewijzigd, ' || CHR(10)
             || 'van ' || COALESCE(rec.vastnr_huidig,'<leeg>') || ' naar ' || rec.nummer_object ;
        v_errorhint := 'telefoonnr vast aanpassen';

    UPDATE prs_perslid p
    SET prs_perslid_telefoonnr = rec.nummer_object
    WHERE p.prs_perslid_key = rec.prs_perslid_key ;

        fac.trackaction (
            'PRSUPD',
            rec.prs_perslid_key,
            3,
            SYSDATE,
               v_aanduiding);

    END LOOP;

    FOR rec IN c_mob
    LOOP
        v_aanduiding :=
               'Mobielnummer gewijzigd, ' || CHR(10)
            || 'van ' || COALESCE(rec.mobielnr_huidig,'<leeg>') || ' naar ' || rec.nummer_object ;
        v_errorhint := 'telefoonnr mobiel aanpassen';

    UPDATE prs_perslid p
    SET prs_perslid_mobiel = rec.nummer_object
    WHERE p.prs_perslid_key = rec.prs_perslid_key ;

        fac.trackaction (
            'PRSUPD',
            rec.prs_perslid_key,
            3,
            SYSDATE,
               v_aanduiding);
    
    END LOOP;

    FOR rec IN c_delvast
    LOOP
        v_aanduiding :=
               'Vast nummer verwijderd ' || CHR(10)
            || 'Was ' || rec.prs_perslid_telefoonnr ;
        v_errorhint := 'vast nummer verwijderen';

    UPDATE prs_perslid p
    SET p.prs_perslid_telefoonnr = ''
    WHERE p.prs_perslid_key = rec.prs_perslid_key ;

        fac.trackaction (
            'PRSUPD',
            rec.prs_perslid_key,
            3,
            SYSDATE,
               v_aanduiding);
    
    END LOOP;

    FOR rec IN c_delmob
    LOOP
        v_aanduiding :=
               'Mobielnummer verwijderd ' || CHR(10)
            || 'Was ' || rec.prs_perslid_mobiel ;
        v_errorhint := 'mobielnummer verwijderen';

    UPDATE prs_perslid p
    SET p.prs_perslid_mobiel = ''
    WHERE p.prs_perslid_key = rec.prs_perslid_key ;

        fac.trackaction (
            'PRSUPD',
            rec.prs_perslid_key,
            3,
            SYSDATE,
               v_aanduiding);
    
    END LOOP;

END;
/

-- script om dagelijks terugkerende scripts aan te roepen.
CREATE OR REPLACE PROCEDURE hmod_select_daily_task (p_applname IN VARCHAR2, p_applrun IN VARCHAR2)
AS
BEGIN
   -- job om de telefoonnummers in persoonkaart te synchroniseren met de eigendommen (gekoppelde telefoonobjecten vast en mobiel)
   hmod_prs_telefoonnummers (p_applname, p_applrun);
END;
/

-- Rapport van de import-personen ADP. 
---- Zowel te gebruiken bij LEZEN als bij VERWERKEN
---- Deze view wordt tevens gebruikt als cursor voor de import-proceduren
CREATE OR REPLACE VIEW hmod_v_prsimport
(
    PRS_PERSLID_KEY,
    PRS_PERSLID_NR,
    PRS_PERSLID_NAAM,
    PRS_PERSLID_VOORNAAM,
    PRS_PERSLID_OSLOGIN,
    PRS_DATUM_UITDIENST,
    PRS_STATUS,
    FORMATIEPLAATS_HUIDIG,
    FORMATIEPLAATS_CSV,
    LETTERCODE,
    TOKEN,
    MOB,
    HIT,
    LAP_EN_SIM,
    LAPT,
    TNC,
    TNC_OMSCHRIJVING,
    FACILITOR,
    ADP,
    ABSENTIEMANAGER,
    REGAS,
    CHECKS,
    ACCOUNTVIEW,
    ELVY,
    HODNET,
    PROACTIVE,
    OPMERKING_KOFFERSYSTEEM,
    DATUM_GELEZEN,
    DATUM_VERWERKT    
)
AS -- Bestaande personen die ook weer in deze PRS-import zitten
  SELECT basis.prs_perslid_key,
         basis.prs_perslid_nr,
         basis.prs_perslid_naam,
         i.prs_perslid_voornaam,
         basis.prs_perslid_oslogin,
         basis.DatumUitDienst,
         CASE
            WHEN d.datum_verwerkt is not null THEN i.prs_perslid_partner_naam -- Deze vul ik tijdens de import met de prs_status
            WHEN d.datum_verwerkt is null and k.code is null THEN 'Basis - Fout'
            ELSE basis.koffersysteem_status
            END as prs_status,
         COALESCE(basis.formatieplaats_huidig,'nvt'),   
         COALESCE (k.code, i.prs_kenmerk3 || ' LET OP! formatieplaats uit CSV staat niet in actueel koffersysteem') AS formatieplaats_CSV,               
         k.lettercode,
         k.token,
         k.mob,
         k.hit,
         k.lap_en_sim,
         k.lapt,
         k.tnc,
         k.tnc_omschrijving,
         k.facilitor,
         k.adp,
         k.absentiemanager,
         k.regas,
         k.checks,
         k.accountview,
         k.elvy,
         k.hodnet,
         k.proactive,
         k.opmerking,
         d.datum_gelezen,
         d.datum_verwerkt         
    FROM (SELECT p.prs_perslid_key,
                 p.prs_perslid_nr,
                 p.prs_perslid_naam,
                 p.prs_perslid_oslogin,
                 a.prs_bedrijf_key,
                 b.prs_bedrijf_naam,
                 (SELECT prs_kenmerklink_waarde
                    FROM prs_kenmerklink
                   WHERE     prs_link_key = p.prs_perslid_key
                         AND prs_kenmerk_key = 1025
                         AND prs_kenmerklink_niveau = 'P'
                         AND prs_kenmerklink_verwijder IS NULL)
                     AS formatieplaats_huidig,
                 (SELECT prs_kenmerklink_waarde
                    FROM prs_kenmerklink
                   WHERE     prs_link_key = p.prs_perslid_key
                         AND prs_kenmerk_key = 1100
                         AND prs_kenmerklink_niveau = 'P'
                         AND prs_kenmerklink_verwijder IS NULL)
                     AS DatumUitDienst,
                 (SELECT kd.fac_usrdata_omschr
                    FROM prs_kenmerklink k, fac_usrdata kd
                   WHERE k.prs_link_key = p.prs_perslid_key    
                         AND k.prs_kenmerk_key = 1081    -- Kenmerkveld Status
                         AND k.prs_kenmerklink_niveau = 'P'
                         AND k.prs_kenmerklink_verwijder IS NULL
                         AND k.prs_kenmerklink_waarde = kd.fac_usrdata_key
                         AND kd.fac_usrtab_key = 82) as Koffersysteem_status                    
            FROM prs_perslid   p,
                 prs_v_afdeling a,
                 prs_bedrijf   b
           WHERE p.prs_afdeling_key = a.prs_afdeling_key
                 AND a.prs_bedrijf_key = b.prs_bedrijf_key
                 AND p.prs_perslid_verwijder IS NULL) basis,
         fac_imp_perslid       i,
         hmod_imp_koffersysteem k,
        (SELECT i.fac_import_key,
                MAX (f.fac_import_datum_gelezen) AS datum_gelezen,
                MAX (f.fac_import_datum_verwerkt) AS datum_verwerkt
           FROM fac_import f, fac_imp_perslid i
          WHERE f.fac_import_key = i.fac_import_key AND f.fac_import_app_key = 41
                GROUP BY i.fac_import_key,
                f.fac_import_datum_gelezen,
                f.fac_import_datum_verwerkt) d
   WHERE     basis.prs_perslid_nr = i.prs_perslid_nr
         AND i.prs_kenmerk3 = k.code (+)
         AND basis.prs_bedrijf_key = 41 -- Alleen voor Humanitas onder Dak mensen
UNION ALL -- NIEUWE PERSONEN die nog niet in BEDRIJF HUMANITAS zitten en die dus bij import toegevoegd gaan worden en met juiste koffersysteem gevuld moet worden...
          ---- Nieuwe personen zitten bij INLEZEN aan deze kant (omdat ze nog geen prs_perslid_key hebben). Bij verwerken hebben ze dit wel en dan zitten de NIEUWE personen in bovenstaande union..
SELECT -1                           AS prs_perslid_key,
       i.prs_perslid_nr,
       i.prs_perslid_naam,
       i.prs_perslid_voornaam,
       NULL as prs_perslid_oslogin, -- Nieuwe mensen krijgen handmatig via voorkant een login
       '' as DatumUitDienst,
       CASE
            WHEN k.code is null THEN 'Nieuw - Fout'
            ELSE 'Nieuw'
            END as prs_status,
       'nvt'                        AS formatieplaats_huidig,               
       COALESCE (k.code, i.prs_kenmerk3 || ' LET OP! formatieplaats uit CSV staat niet in actueel koffersysteem') AS formatieplaats_CSV,
       k.lettercode,
       k.token,
       k.mob,
       k.hit,
       k.lap_en_sim,
       k.lapt,
       k.tnc,
       k.tnc_omschrijving,
       k.facilitor,
       k.adp,
       k.absentiemanager,
       k.regas,
       k.checks,
       k.accountview,
       k.elvy,
       k.hodnet,
       k.proactive,
       k.opmerking,
       d.datum_gelezen,
       d.datum_verwerkt      
  FROM fac_imp_perslid i, hmod_imp_koffersysteem k,
        (SELECT i.fac_import_key,
                MAX (f.fac_import_datum_gelezen) AS datum_gelezen,
                MAX (f.fac_import_datum_verwerkt) AS datum_verwerkt
           FROM fac_import f, fac_imp_perslid i
          WHERE f.fac_import_key = i.fac_import_key AND f.fac_import_app_key = 41
                GROUP BY i.fac_import_key,
                f.fac_import_datum_gelezen,
                f.fac_import_datum_verwerkt) d
 WHERE     i.prs_kenmerk3 = k.code(+)
       AND i.fac_import_key = d.fac_import_key 
       AND UPPER(i.prs_perslid_nr) NOT IN
               (SELECT UPPER(p.prs_perslid_nr)
                  FROM prs_perslid     p,
                       prs_bedrijf     b,
                       prs_v_afdeling  a
                   WHERE p.prs_afdeling_key = a.prs_afdeling_key
                         AND a.prs_bedrijf_key = b.prs_bedrijf_key
                         AND p.prs_perslid_nr IS NOT NULL
                         AND p.prs_perslid_verwijder IS NULL
                         AND b.prs_bedrijf_key = 41 -- Humanitas onder Dak
                         )
UNION ALL -- Alle HUMANITAS medewerkers die wel in Facilitor staan, maar niet in CSV-import zitten - Indien nodig handmatig te verwijderen
SELECT basis.prs_perslid_key,
       basis.prs_perslid_nr,
       basis.prs_perslid_naam,
       basis.prs_perslid_voornaam,
       basis.prs_perslid_oslogin,
       basis.DatumUitDienst,
       'Verwijderen' AS prs_status,
       basis.formatieplaats_huidig,
       'nvt'                                  AS formatieplaats_CSV,
       k.lettercode,
       k.token,
       k.mob,
       k.hit,
       k.lap_en_sim,
       k.lapt,
       k.tnc,
       k.tnc_omschrijving,
       k.facilitor,
       k.adp,
       k.absentiemanager,
       k.regas,
       k.checks,
       k.accountview,
       k.elvy,
       k.hodnet,
       k.proactive,
       k.opmerking,
       d.datum_gelezen,
       d.datum_verwerkt
    FROM (SELECT p.prs_perslid_key,
                 COALESCE(p.prs_perslid_nr,'999') as prs_perslid_nr,
                 p.prs_perslid_naam,
                 p.prs_perslid_voornaam,
                 p.prs_perslid_oslogin,
                 a.prs_bedrijf_key,
                 b.prs_bedrijf_naam,
                 (SELECT prs_kenmerklink_waarde
                    FROM prs_kenmerklink
                   WHERE     prs_link_key = p.prs_perslid_key
                         AND prs_kenmerk_key = 1025
                         AND prs_kenmerklink_niveau = 'P'
                         AND prs_kenmerklink_verwijder IS NULL)
                     AS formatieplaats_huidig,
                 (SELECT prs_kenmerklink_waarde
                    FROM prs_kenmerklink
                   WHERE     prs_link_key = p.prs_perslid_key
                         AND prs_kenmerk_key = 1100
                         AND prs_kenmerklink_niveau = 'P'
                         AND prs_kenmerklink_verwijder IS NULL)
                     AS DatumUitDienst,
                 (SELECT kd.fac_usrdata_omschr
                    FROM prs_kenmerklink k, fac_usrdata kd
                   WHERE k.prs_link_key = p.prs_perslid_key    
                         AND k.prs_kenmerk_key = 1081    -- Kenmerkveld Status
                         AND k.prs_kenmerklink_niveau = 'P'
                         AND k.prs_kenmerklink_verwijder IS NULL
                         AND k.prs_kenmerklink_waarde = kd.fac_usrdata_key
                         AND kd.fac_usrtab_key = 82) as Koffersysteem_status                    
            FROM prs_perslid   p,
                 prs_v_afdeling a,
                 prs_bedrijf   b
           WHERE p.prs_afdeling_key = a.prs_afdeling_key
                 AND a.prs_bedrijf_key = b.prs_bedrijf_key
                 AND b.prs_bedrijf_key = 41
                 AND p.prs_perslid_verwijder IS NULL) basis,
       hmod_imp_koffersysteem  k,
       (  SELECT i.fac_import_key,
                 MAX (f.fac_import_datum_gelezen) AS datum_gelezen,
                 MAX (f.fac_import_datum_verwerkt) AS datum_verwerkt
            FROM fac_import f, fac_imp_perslid i
           WHERE     f.fac_import_key = i.fac_import_key
                 AND f.fac_import_app_key = 41
        GROUP BY i.fac_import_key,
                 f.fac_import_datum_gelezen,
                 f.fac_import_datum_verwerkt) d
 WHERE     basis.formatieplaats_huidig = k.code(+)
       AND basis.Koffersysteem_status != 'Nvt'
       AND basis.prs_perslid_nr NOT IN (SELECT i.prs_perslid_nr
                                          FROM fac_imp_perslid i) ;
                                          
CREATE OR REPLACE PROCEDURE hmod_import_perslid (p_import_key IN NUMBER)
AS
   v_errormsg       VARCHAR2 (1000) := '-';
   v_errorhint      VARCHAR2 (1000) := '-';
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_aanduiding      VARCHAR2 (1000);
   v_count    NUMBER;
   v_count_leeg  NUMBER;
   v_count_fout  NUMBER;
   v_count_nieuw NUMBER;
   v_count_verwijder NUMBER;
   v_count_codeverschilt NUMBER;
   
   CURSOR c  -- Alle medewerkers HUMANITAS die in aangeleverde ADP-personen-bestand zitten
   IS   
   SELECT prs_perslid_key,
         prs_perslid_nr,
         prs_perslid_voornaam,
         prs_perslid_oslogin,
         prs_status,
         formatieplaats_huidig,
         formatieplaats_csv,
         lettercode,         
         token,
         mob,
         hit,
         lap_en_sim,
         lapt,
         tnc,
         tnc_omschrijving,
         facilitor,
         adp,
         absentiemanager,
         regas,
         checks,
         accountview,
         elvy,
         hodnet,
         proactive
    FROM 
    hmod_v_prsimport WHERE instr(prs_status,'Verwijderen') = 0 and prs_status is not null ;

BEGIN
   v_errorhint := 'Generieke import';

   -- Standaard Import. De sequence array staat beschreven in PRS_PAC.SRC bij de import_perslid-PROCEDURE.
   prs.import_perslid (
      p_import_key,
         '0;0;0;0;0;0;1;2;0;3;0;0;0;0;0;0;0;5;0;7;6;0;0;4;0;0;8;9;10;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0',
      'Afdelingscode;Volbrief;Roepnaam;Geslacht;Zakelijk e-mailadres;Omschrijving verkort;Werknemernummer;Geboortenaam;Aanhef brief;Formatie code%');

-- DEF2: Afdelingscode;Volbrief;Roepnaam;Geslacht;Zakelijk e-mailadres;Omschrijving verkort;Werknemernummer;Geboortenaam;Aanhef brief;Formatie code'
-----       1          2           3        4            5                    6                   7                8        9           10              

   COMMIT;

   FOR rec IN c
   LOOP
      BEGIN
         -- Koffersysteem-kenmerken vullen
         IF rec.prs_status = 'Basis' or rec.prs_status = 'Nieuw' -- Dan alle koffersysteemvelden naar personenkaart wegschrijven...
         THEN
         
         UPDATE fac_imp_perslid p
         SET prs_kenmerk6 = rec.token,  -- Token  
             prs_kenmerk7 = rec.mob, -- Mobiel 
             prs_kenmerk8 = rec.hit,  -- Hit 
             prs_kenmerk9 = rec.lap_en_sim,  -- Lap+Sim 
             prs_kenmerk10 = rec.lapt, -- Lapt
             prs_kenmerk11 = rec.tnc, -- Toegangsniveau
             prs_kenmerk12 = rec.facilitor, -- Facilitor
             prs_kenmerk13 = rec.adp,    -- ADP  
             prs_kenmerk14 = rec.absentiemanager, -- Absentiemanager 
             prs_kenmerk15 = rec.regas,  -- Regas 
             prs_kenmerk16 = rec.checks,   -- Checks
             prs_kenmerk17 = rec.accountview, -- Accountview
             prs_kenmerk18 = rec.elvy,  -- Elvy
             prs_kenmerk19 = rec.hodnet, -- HodNet
             prs_kenmerk20 = rec.proactive  -- Proactive
             WHERE p.prs_perslid_nr = rec.prs_perslid_nr;
       END IF;
     
     -- De prs_status (= status voor deze import) ook wegschrijven in fac_imp_perslid. 
     ---- Om updateprocedure mee te sturen... + om rapport import prs goed mee te vullen..
     ---- Omdat er voor koffersysteem al 20 kenmerken gevuld worden, moet ik hier ander veld voor (mis)bruiken.
         UPDATE fac_imp_perslid p
         SET prs_perslid_partner_naam = rec.prs_status  -- Partner_naam voor misbruiken. Wordt in standaard update niet gebruikt (omdat PRS_PERSLID_NAAMGEBRUIK_CODE op 0 meegaat..) 
         WHERE p.prs_perslid_nr = rec.prs_perslid_nr;           
     
     -- Voorletter vullen vanuit Roepnaam
         UPDATE fac_imp_perslid p
         SET prs_perslid_voorletters = substr(rec.prs_perslid_voornaam,1,1) 
         WHERE p.prs_perslid_nr = rec.prs_perslid_nr and rec.prs_perslid_voornaam is not null;  

     -- Basiskoffer - Lettercode vullen - 
         UPDATE fac_imp_perslid p
         SET prs_kenmerk4 = rec.lettercode   
         WHERE p.prs_perslid_nr = rec.prs_perslid_nr;    
     
     -- Loginnaam vullen vanuit huidige personenkaart
        UPDATE fac_imp_perslid p
        SET prs_perslid_oslogin = rec.prs_perslid_oslogin
        WHERE p.prs_perslid_nr = rec.prs_perslid_nr ;
 
       END;
   END LOOP;

   BEGIN
      v_errormsg := 'Checks op importbestand ';
      v_aanduiding := 'Raadpleeg rapport en pas csv-bestand aan en lees opnieuw in';
      v_count := 0;
      v_count_leeg:=0;
      v_count_fout := 0;
      v_count_nieuw := 0;
      v_count_verwijder :=0;
      v_count_codeverschilt  := 0;

   -- Nog even alles tellen. NOG NAGAAN/AFSPREKEN wanneer de import moet doorlopen en wanneer men het eerst wil raadplegen..
   SELECT count (*) INTO v_count FROM hmod_v_prsimport;
   SELECT count (*) INTO v_count_nieuw FROM fac_imp_perslid WHERE (prs_perslid_partner_naam = 'Nieuw' or prs_perslid_partner_naam = 'Nieuw - Fout') ;
   SELECT count (*) INTO v_count_fout FROM fac_imp_perslid WHERE INSTR (prs_perslid_partner_naam, 'Fout') > 0 ;
   SELECT count (*) INTO v_count_verwijder FROM hmod_v_prsimport WHERE INSTR (prs_status, 'Verwijderen') > 0 ;
   SELECT count (*) INTO v_count_leeg FROM fac_imp_perslid WHERE prs_perslid_partner_naam is null ;
   SELECT count (*) INTO v_count_codeverschilt FROM hmod_v_prsimport WHERE prs_status = 'Basis' and formatieplaats_huidig <> formatieplaats_csv  ;   

        IF v_count_leeg > 0 THEN
             fac.imp_writelog (
                p_import_key, 'W', 'Aantal personen zonder import-status is: ' || v_count_leeg,
                   'ACTIE: ' || v_aanduiding);
        END IF;
 
        IF v_count_fout > 0 THEN
             fac.imp_writelog (
                p_import_key, 'W', 'Aantal personen zonder gekoppelde formatieplaats is: ' || v_count_fout,
                   'ACTIE: ' || v_aanduiding);       
        END IF;

        IF v_count_codeverschilt > 0 THEN
             fac.imp_writelog (
                p_import_key, 'W', 'Aantal personen die op BASIS staan, hebben in csv andere formatieplaats dan nu in Facilitor: ' || v_count_codeverschilt,
                   'ACTIE: ' || v_aanduiding);       
        END IF;

        IF v_count_verwijder > 0 THEN
             fac.imp_writelog (
                p_import_key, 'W', 'Aantal te verwijderen personen is: '|| v_count_verwijder,
                   'Ter info');       
        END IF;        

        IF v_count_nieuw > 0 THEN
             fac.imp_writelog (
                p_import_key, 'W', 'Aantal nieuw in te lezen personen is: '|| v_count_nieuw,
                   'Ter info');       
        END IF;        

       IF v_count > 0 THEN
             fac.imp_writelog (
                p_import_key, 'W', 'Aantal totaal te muteren personen is: '|| v_count,
                   'Ter info');       
        END IF;        
        
    END;

-- Nog wat updates uitvoeren op tussentabel...
UPDATE fac_imp_perslid
   SET prs_perslid_geslacht =
           CASE
               WHEN prs_perslid_titel = 'Man' THEN 1
               WHEN prs_perslid_titel = 'Vrouw' THEN 0
               ELSE NULL
           END,
       prs_kenmerk1 = -- Meisjesnaam leegmaken indien man
           CASE
               WHEN prs_perslid_titel = 'Man' THEN ''
               ELSE prs_kenmerk1
           END
       ;

-- Titel kan nu leeggemaakt worden..
UPDATE fac_imp_perslid
   SET prs_perslid_titel = '' ;

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

-- DE UPDATE
CREATE OR REPLACE PROCEDURE hmod_update_perslid (p_import_key IN NUMBER)
IS

   CURSOR c_flex -- Alle records pakken. O.a. voor updaten van de algemene flex-kenmerkvelden
   IS
        SELECT p.prs_perslid_key, p.prs_perslid_nr, i.prs_perslid_partner_naam,i.prs_kenmerk1, i.prs_kenmerk2, i.prs_kenmerk3
          FROM prs_v_aanwezigperslid p, fac_imp_perslid i
         WHERE p.prs_perslid_nr = i.prs_perslid_nr
      ORDER BY 2;


   CURSOR c_flex_koffer -- De flexkenmerken koffersysteem - alleen updaten voor die gevuld zijn
   IS
       SELECT p.prs_perslid_key, p.prs_perslid_nr, i.prs_perslid_partner_naam, i.prs_kenmerk4, i.prs_kenmerk6,i.prs_kenmerk7,i.prs_kenmerk8,i.prs_kenmerk9,i.prs_kenmerk10,i.prs_kenmerk11,i.prs_kenmerk12,i.prs_kenmerk13,i.prs_kenmerk14,i.prs_kenmerk15,i.prs_kenmerk16,i.prs_kenmerk17,i.prs_kenmerk18,i.prs_kenmerk19,i.prs_kenmerk20
          FROM prs_v_aanwezigperslid p, fac_imp_perslid i
         WHERE p.prs_perslid_nr = i.prs_perslid_nr AND (i.prs_perslid_partner_naam = 'Basis' or i.prs_perslid_partner_naam = 'Nieuw')
      ORDER BY 2;
      
   -- CURSOR DELETE
   ----- Goed standaard voorbeeld van STANDAARD DELETE bij Vesteda (VEST)
   ----  Voor HMOD:  <NOG VASTSTELLEN! HOE/WAT !!!>
   ---- Indien er clienten in Faciltior zitten, deze sowieso uitsluiten van verwijderactie
   ---- Handmatig aangemaakte persoon 'Beumer applicatiebeheer' en 'Claudia ten Cate' + ......?
   ---- Omdat er via HRM-workflow wordt gewerkt, beste om dit via kenmerkveld te laten lopen met CHECK ADP-import
   CURSOR c_del  -- Alle medewerkers van bedrijf HUMANITAS die niet in aangeleverde ADP-personen-bestand zitten
   IS   
   SELECT prs_perslid_key,
         prs_perslid_nr,
         prs_status
    FROM 
    hmod_v_prsimport WHERE prs_status = 'Verwijderen' ;


   v_errorhint      VARCHAR2 (1000) := '';
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_aanduiding     VARCHAR2 (1000);
   v_count       NUMBER;
   v_count_leeg  NUMBER;
   v_count_fout  NUMBER;
   v_count_nieuw NUMBER;
   v_count_verwijder NUMBER;
   v_count_codeverschilt NUMBER;   
   
BEGIN
   -- Generieke update.
   v_errorhint :='Fout in generieke update';
   
   -- Nog even alles tellen. NOG NAGAAN/AFSPREKEN wanneer de import moet doorlopen en wanneer men het eerst wil raadplegen..
   v_aanduiding := 'Import afgebroken (conform afspraak) - Zie rapport voor specificaties';
   SELECT count (*) INTO v_count FROM hmod_v_prsimport;
   SELECT count (*) INTO v_count_nieuw FROM fac_imp_perslid WHERE (prs_perslid_partner_naam = 'Nieuw' or prs_perslid_partner_naam = 'Nieuw - Fout');
   SELECT count (*) INTO v_count_fout FROM fac_imp_perslid WHERE INSTR (prs_perslid_partner_naam, 'Fout') > 0 ;
   SELECT count (*) INTO v_count_verwijder FROM hmod_v_prsimport WHERE INSTR (prs_status, 'Verwijderen') > 0 ;
   SELECT count (*) INTO v_count_leeg FROM fac_imp_perslid WHERE prs_perslid_partner_naam is null ;
   SELECT count (*) INTO v_count_codeverschilt FROM hmod_v_prsimport WHERE prs_status = 'Basis' and formatieplaats_huidig <> formatieplaats_csv  ;   
   
   IF v_count < 10
   THEN
      fac.imp_writelog (p_import_key, 'E', 'Het aantal te importeren personen is te klein: ' || TO_CHAR (v_count), v_aanduiding);
      RETURN;
   END IF;

   IF v_count_fout > 3
   THEN
      fac.imp_writelog (p_import_key, 'E', 'Er zitten in import teveel medewerkers met prs_status FOUT: ' || TO_CHAR (v_count_fout), v_aanduiding);
      RETURN;
   END IF;

   IF v_count_nieuw > 10   -- Bijvoorbeeld als alle personeelsnr's in csv zonder vooloopnull zijn... (NOG CHECKEN in KPN)
   THEN
      fac.imp_writelog (p_import_key, 'E', 'Er zijn teveel NIEUWE medewerkers in import, kan niet kloppen: ' || TO_CHAR (v_count_nieuw), v_aanduiding);
      RETURN;
   END IF;

   IF v_count_leeg > 0
   THEN
      fac.imp_writelog (p_import_key, 'E', 'Er zitten in import medewerkers ZONDER prs_status: ' || TO_CHAR (v_count_leeg), v_aanduiding);
      RETURN;
   END IF;

   IF v_count_codeverschilt > 10 THEN   --  Zou 0 moeten zijn straks in praktijk!!!!!
      fac.imp_writelog (p_import_key, 'E', 'Er zijn (teveel) personen die op BASIS staan, maar in csv andere formatieplaats hebben dan nu in Facilitor: ' || TO_CHAR (v_count_codeverschilt), v_aanduiding);       
      RETURN;
   END IF;


   -- Generieke update. NR - key personeelsnr - NULL is geen werkplekken verwijderd
   prs.update_perslid (p_import_key, 'NR', 'NULL');

   -- Update flexvelden algemeen
   FOR rec IN c_flex
   LOOP
      BEGIN
      v_aanduiding   := 'Import prs - ' || TO_CHAR(sysdate, 'dd/mm/yyyy - hh:mi:ss') || ' - status: ' || rec.prs_perslid_partner_naam;
      
      v_errorhint:='Fout bijwerken meisjes';
      PRS.upsertkenmerk (1023, rec.prs_perslid_key, rec.prs_kenmerk1); -- Meisjesnaam
      v_errorhint:='Fout bijwerken briefaanhef';
      PRS.upsertkenmerk (1024, rec.prs_perslid_key, rec.prs_kenmerk2); -- Brief aanhef
      v_errorhint:='Fout bijwerken formatieplaats';
      PRS.upsertkenmerk (1025, rec.prs_perslid_key, rec.prs_kenmerk3); -- Formatieplaats

    -- Nog paar kenmerkvelden bijwerken
    DELETE FROM prs_kenmerklink
      WHERE     prs_link_key = rec.prs_perslid_key
            AND prs_kenmerk_key = 1082  -- Veld om aan te geven dat persoon verwijderd kan worden. Voor de personen die meekomen in de fac_imp_perslid moet deze leeggemaakt worden...
            AND prs_kenmerklink_niveau = 'P'
            AND prs_kenmerklink_verwijder IS NULL;

    IF rec.prs_perslid_partner_naam = 'Nieuw' or rec.prs_perslid_partner_naam = 'Nieuw - Fout'
    THEN
      v_errorhint:='Nieuwe personen krijgen altijd basiskoffer mee';
      PRS.upsertkenmerk (1081, rec.prs_perslid_key, '143'); -- Koffersysteem (status) = key 143    
      
      -- Toevoegen nieuwe personen aan de autorisatiegroep Werknemer - key 79
      INSERT INTO fac_gebruikersgroep (fac_groep_key, fac_gebruikersgroep_aanmaak, prs_perslid_key)
                 VALUES (79, sysdate, rec.prs_perslid_key);
      
    END IF;
    
      fac.trackaction ('PRSUPD', rec.prs_perslid_key, 3,sysdate, v_aanduiding) ;    
 
      END;

    END LOOP;

   -- Update flexvelden Koffersysteem
   FOR rec IN c_flex_koffer
   LOOP
      BEGIN
      v_errorhint:='Fout bijwerken Token';
      PRS.upsertkenmerk (1068, rec.prs_perslid_key, rec.prs_kenmerk6); -- Token, 6 , 1068
      v_errorhint:='Fout bijwerken Mobiel';
      PRS.upsertkenmerk (1067, rec.prs_perslid_key, rec.prs_kenmerk7); -- Mobiel 7 , 1067
      v_errorhint:='Fout bijwerken Hit';
      PRS.upsertkenmerk (1069, rec.prs_perslid_key, rec.prs_kenmerk8); -- Hit 8 , 1069
      v_errorhint:='Fout bijwerken Lap+Sim';
      PRS.upsertkenmerk (1063, rec.prs_perslid_key, rec.prs_kenmerk9); -- Lap+Sim  9 ,  1063
      v_errorhint:='Fout bijwerken Lapt';
      PRS.upsertkenmerk (1065, rec.prs_perslid_key, rec.prs_kenmerk10); -- Lapt  10,  1065
      v_errorhint:='Fout bijwerken Toegangsniveau';
      PRS.upsertkenmerk (1061, rec.prs_perslid_key, rec.prs_kenmerk11); -- Toegangsniveau 11, 1061
      v_errorhint:='Fout bijwerken Facilitor';
      PRS.upsertkenmerk (1072, rec.prs_perslid_key, rec.prs_kenmerk12); -- Facilitor  12 , 1072
      v_errorhint:='Fout bijwerken ADP';
      PRS.upsertkenmerk (1073, rec.prs_perslid_key, rec.prs_kenmerk13);  -- ADP  13 , 1073
      v_errorhint:='Fout bijwerken Absentiemanager';
      PRS.upsertkenmerk (1074, rec.prs_perslid_key, rec.prs_kenmerk14);  -- Absentiemanager 14, 1074
      v_errorhint:='Fout bijwerken Regas';
      PRS.upsertkenmerk (1075, rec.prs_perslid_key, rec.prs_kenmerk15);  -- Regas 15, 1075
      v_errorhint:='Fout bijwerken Checks';
      PRS.upsertkenmerk (1076, rec.prs_perslid_key, rec.prs_kenmerk16);  -- Checks 15,  1076
      v_errorhint:='Fout bijwerken Accountview';
      PRS.upsertkenmerk (1077, rec.prs_perslid_key, rec.prs_kenmerk17);  -- Accountview 17, 1077
      v_errorhint:='Fout bijwerken Elvy';
      PRS.upsertkenmerk (1078, rec.prs_perslid_key, rec.prs_kenmerk18);  -- Elvy  18,  1078
      v_errorhint:='Fout bijwerken HodNet';
      PRS.upsertkenmerk (1079, rec.prs_perslid_key, rec.prs_kenmerk19);  -- HodNet 19, 1079
      v_errorhint:='Fout bijwerken Proactive';
      PRS.upsertkenmerk (1080, rec.prs_perslid_key, rec.prs_kenmerk20);  -- Proactive 20, 1080
      v_errorhint:='Fout bijwerken Basiskoffer';
      PRS.upsertkenmerk (1028, rec.prs_perslid_key, rec.prs_kenmerk4); -- Basiskoffer
      END;
   END LOOP;

   FOR rec IN c_del 
   LOOP
      --  prs.delete_perslid (p_import_key, rec.prs_perslid_key); -- Deze niet draaien voor HMOD ivm de workflow HRM die men in Facilitor uitvoert...?
      -- wel vullen van een kenmerkveld ADP-import 1082
      BEGIN
         v_aanduiding   := 'Import prs - ' || TO_CHAR(sysdate, 'dd/mm/yyyy - hh:mi:ss') || ' - status: ' || rec.prs_status;
         
         v_errorhint:='Bijwerken veld verwijderen';
         PRS.upsertkenmerk (1082, rec.prs_perslid_key,'let op: verwijderen' ); 

        fac.trackaction ('PRSUPD', rec.prs_perslid_key, 3,sysdate, v_aanduiding) ;    
         
      END;
   END LOOP;
   
   BEGIN
   -- Telefoongegevens komen niet mee met de ADP-import. Deze velden worden dus bij deze prs-import leeggegooid. 
   -- De telefoonnummers worden gevuld vanuit de aan de persoon gekoppelde telefoonobjecten (vast en mobiel)
   -- Daarom aan eind van deze prs-import deze telefoonvelden weer vullen door het dagelijks script wat hiervoor 's nachts draait, nogmaals te runnen. 
   hmod_prs_telefoonnummers (null, null);
   END;
   
   COMMIT;

EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ') ';
      fac.imp_writelog (p_import_key, 'E', v_errormsg || v_errorhint, 'Importproces personen afgebroken!');

END hmod_update_perslid;
/

-- Hieronder de standaard import voor Objecten. Vanaf versie 2020.1 komt hier revisie op waardoor er ook direct op organisatie/afdeling ingelezen kan worden.
-- Dit inlezen p organsiatie/afdeling is per direct al voor HMOD van toepassing. Daarom deze procedure al via deze cust opgeleverd. 
-- Indien versie 2020.1 draait op SAAS dan deze procedure verwijderen en droppen.

CREATE OR REPLACE PROCEDURE fac_import_ins2 (p_import_key IN NUMBER)
IS
   c_delim                         VARCHAR2 (1) := ';';
   v_newline                       fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
   v_errormsg                      VARCHAR2 (1000);
   v_errorhint                     VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER;
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_ongeldig                      NUMBER (1);
   v_aanduiding                    VARCHAR (400);
   v_ins_srtkenmerk_key1           VARCHAR2 (255);
   v_ins_srtkenmerk_key2           VARCHAR2 (255);
   v_ins_srtkenmerk_key3           VARCHAR2 (255);
   v_ins_srtkenmerk_key4           VARCHAR2 (255);
   v_ins_srtkenmerk_key5           VARCHAR2 (255);
   v_ins_srtkenmerk_key6           VARCHAR2 (255);
   v_ins_srtkenmerk_key7           VARCHAR2 (255);
   v_ins_srtkenmerk_key8           VARCHAR2 (255);
   v_ins_srtkenmerk_key9           VARCHAR2 (255);
   v_ins_srtkenmerk_key10          VARCHAR2 (255);
   v_ins_srtkenmerk_key11          VARCHAR2 (255);
   v_ins_srtkenmerk_key12          VARCHAR2 (255);
   v_ins_srtkenmerk_key13          VARCHAR2 (255);
   v_ins_srtkenmerk_key14          VARCHAR2 (255);
   v_ins_srtkenmerk_key15          VARCHAR2 (255);
   v_ins_srtkenmerk_key16          VARCHAR2 (255);
   v_ins_srtkenmerk_key17          VARCHAR2 (255);
   v_ins_srtkenmerk_key18          VARCHAR2 (255);
   v_ins_srtkenmerk_key19          VARCHAR2 (255);
   v_ins_srtkenmerk_key20          VARCHAR2 (255);
   -- De importvelden
   v_ins_discipline_omschrijving   VARCHAR2 (255);                      -- C60
   v_ins_discipline_kostensoort    VARCHAR2 (255);                       --C60
   v_ins_srtgroep_omschrijving     VARCHAR2 (255);                      -- C60
   v_ins_srtdeel_code              VARCHAR2 (255);                      -- C10
   v_ins_srtdeel_omschrijving      VARCHAR2 (255);                     -- C100
   v_ins_deel_omschrijving         VARCHAR2 (255);                      -- C60
   v_ins_deel_opmerking            VARCHAR2 (1000);                     -- C320
   v_reserveerbaar                 VARCHAR2 (255);                       -- C1
   v_reserveerbaar_n               NUMBER (1);                           -- N1
   v_res_deel_eenheid              VARCHAR2 (255);                      -- C10
   v_res_deel_prijs                VARCHAR2 (255);                     -- N7,2
   v_res_deel_prijs_n              NUMBER (7, 2);                      -- N7,2
   v_alg_locatie_code              VARCHAR2 (255);                      -- C10
   v_alg_gebouw_code               VARCHAR2 (255);                      -- C12
   v_alg_verdieping_volgnr         VARCHAR2 (255);                       -- N3
   v_alg_verdieping_volgnr_n       NUMBER (3);                           -- N3
   v_alg_ruimte_nr                 VARCHAR2 (255);                      -- C10
   v_res_deel_alg_level            VARCHAR2 (255);       -- C1 (naar -1 t/m 5)
   v_res_deel_alg_level_n          NUMBER (1);                           -- N1
   v_res_discipline_omschrijving   VARCHAR2 (255);                      -- C60
   v_res_discipline_kostensoort    VARCHAR2 (255);                      -- C60
   v_prs_perslid_matchcode         VARCHAR2 (4000);
   v_prs_perslid_matchwaarde       VARCHAR2 (4000);
   v_ins_kenmerkwaarde1            VARCHAR2 (4000);
   v_ins_kenmerkwaarde2            VARCHAR2 (4000);
   v_ins_kenmerkwaarde3            VARCHAR2 (4000);
   v_ins_kenmerkwaarde4            VARCHAR2 (4000);
   v_ins_kenmerkwaarde5            VARCHAR2 (4000);
   v_ins_kenmerkwaarde6            VARCHAR2 (4000);
   v_ins_kenmerkwaarde7            VARCHAR2 (4000);
   v_ins_kenmerkwaarde8            VARCHAR2 (4000);
   v_ins_kenmerkwaarde9            VARCHAR2 (4000);
   v_ins_kenmerkwaarde10           VARCHAR2 (4000);
   v_ins_kenmerkwaarde11           VARCHAR2 (4000);
   v_ins_kenmerkwaarde12           VARCHAR2 (4000);
   v_ins_kenmerkwaarde13           VARCHAR2 (4000);
   v_ins_kenmerkwaarde14           VARCHAR2 (4000);
   v_ins_kenmerkwaarde15           VARCHAR2 (4000);
   v_ins_kenmerkwaarde16           VARCHAR2 (4000);
   v_ins_kenmerkwaarde17           VARCHAR2 (4000);
   v_ins_kenmerkwaarde18           VARCHAR2 (4000);
   v_ins_kenmerkwaarde19           VARCHAR2 (4000);
   v_ins_kenmerkwaarde20           VARCHAR2 (4000);
   v_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;

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

   -- Controleer tijdens import-fase alleen op bestaan van kenmerksoort (of
   -- deze - via een kenmerk - wel is gedefinieerd voor de betreffende object-
   -- discipline/groep/soort, volgt pas tijdens de update-fase)!
   --
   -- kw is bijvoorbeeld 'Parkeercode' of 'Parkeercode|3' waarbij de laatste in groep 3 zit
   -- het resultaat is NULL (als niet gevonden) of 234|3 voor strkenmer_key 234 in groep 3
   -- Als geen groep is meegegeven wordt 234|0 opgeleverd (de default groep)
   FUNCTION bepaal_srtkenmerk_key (p_kw IN VARCHAR)
      RETURN VARCHAR
   IS
      v_srtkenmerk_key   NUMBER;
      v_kenmerk_groep    NUMBER;
      v_kw               VARCHAR(250);
   BEGIN
      v_kenmerk_groep := 0;
      v_kw := p_kw;
      IF INSTR (v_kw, '|') > 1
      THEN
        v_kenmerk_groep := SUBSTR (v_kw, INSTR (v_kw, '|') + 1);
        v_kw := SUBSTR (v_kw, 1, INSTR (v_kw, '|') - 1);
      END IF;

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

      RETURN TO_CHAR(v_srtkenmerk_key) || '|' || TO_CHAR(v_kenmerk_groep);
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         IF p_kw IS NULL OR UPPER (p_kw) LIKE 'KENMERK%'
         THEN
            RETURN NULL;
         ELSE
            fac.imp_writelog (p_import_key,
                              'W',
                              'Fout bij bepalen kenmerksoort [' || p_kw || ']',
                              'Bestaat niet of type ongeldig');
            COMMIT;
            RETURN NULL;
         END IF;
   END;
BEGIN
   -- Eerst opruiming
   DELETE FROM   fac_imp_ins;

   COMMIT;

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

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

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

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij alle NIET-kenmerk kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF UPPER (v_ins_discipline_omschrijving) = 'DISCIPLINEOMSCHRIJVING'
               AND UPPER (v_ins_discipline_kostensoort) = 'DISCIPLINEKOSTENSOORT'
               AND UPPER (v_ins_srtgroep_omschrijving) = 'GROEPSOORTOMSCHRIJVING'
               AND UPPER (v_ins_srtdeel_code) = 'OBJECTSOORTCODE'
               AND UPPER (v_ins_srtdeel_omschrijving) = 'OBJECTSOORTOMSCHRIJVING'
               AND UPPER (v_ins_deel_omschrijving) = 'OBJECTIDENTIFICATIE'
               AND UPPER (v_ins_deel_opmerking) = 'OBJECTOPMERKING'
               AND UPPER (v_reserveerbaar) = 'RESERVEERBAAR'
               AND UPPER (v_res_deel_eenheid) = 'EENHEID'
               AND UPPER (v_res_deel_prijs) = 'PRIJS'
               AND UPPER (v_alg_locatie_code) = 'LOCATIECODE'
               AND UPPER (v_alg_gebouw_code) = 'GEBOUWCODE'
               AND UPPER (v_alg_verdieping_volgnr) = 'BOUWLAAGVOLGNUMMER'
               AND UPPER (v_alg_ruimte_nr) = 'RUIMTENUMMER'
               AND UPPER (v_res_deel_alg_level) = 'RESERVERINGSCOPE'
               AND UPPER (v_res_discipline_omschrijving) = 'CATALOGUSNAAM'
               AND UPPER (v_res_discipline_kostensoort) = 'CATALOGUSKOSTENSOORT'
               AND UPPER (v_prs_perslid_matchcode) = 'PERSOONMATCHCODE'
               AND UPPER (v_prs_perslid_matchwaarde) = 'PERSOONMATCHWAARDE'
               AND UPPER (v_ins_deel_aanmaak) = 'INGANGSDATUM'
               AND UPPER (v_ins_deel_vervaldatum) = 'VERVALDATUM'
               AND UPPER (v_ins_deel_aantal) = 'AANTAL'
            THEN
               v_ins_srtkenmerk_key1 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde1);
               v_ins_srtkenmerk_key2 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde2);
               v_ins_srtkenmerk_key3 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde3);
               v_ins_srtkenmerk_key4 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde4);
               v_ins_srtkenmerk_key5 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde5);
               v_ins_srtkenmerk_key6 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde6);
               v_ins_srtkenmerk_key7 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde7);
               v_ins_srtkenmerk_key8 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde8);
               v_ins_srtkenmerk_key9 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde9);
               v_ins_srtkenmerk_key10 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde10);
               v_ins_srtkenmerk_key11 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde11);
               v_ins_srtkenmerk_key12 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde12);
               v_ins_srtkenmerk_key13 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde13);
               v_ins_srtkenmerk_key14 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde14);
               v_ins_srtkenmerk_key15 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde15);
               v_ins_srtkenmerk_key16 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde16);
               v_ins_srtkenmerk_key17 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde17);
               v_ins_srtkenmerk_key18 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde18);
               v_ins_srtkenmerk_key19 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde19);
               v_ins_srtkenmerk_key20 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde20);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            --
            v_errormsg := 'Locatiecode ongeldig';
            v_alg_locatie_code := TRIM (v_alg_locatie_code);

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

            --
            v_errormsg := 'Gebouwcode ongeldig';
            v_alg_gebouw_code := TRIM (v_alg_gebouw_code);

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

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

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

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

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

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

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

            --
            v_errormsg := 'Catalogusnaam ongeldig';
            v_res_discipline_omschrijving :=
               TRIM (v_res_discipline_omschrijving);

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

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

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

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

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

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

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

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

                  -- Als uit kenmerkheader een geldige kenmerksoort-key volgt,
                  -- dan is kenmerkwaarde<n> gevuld met <key>=<waarde>; zoniet,
                  -- dan is kenmerkwaarde<n> gevuld met <waarde>!
                  -- NB. Een NULL-waarde resulteert NIET in het wissen van een
                  --     kenmerkveld (bijwerken kan wel, maar wissen dus niet)!
                  INSERT INTO fac_imp_ins (
                                               ins_discipline_omschrijving,
                                               ins_discipline_kostensoort,
                                               ins_srtgroep_omschrijving,
                                               ins_srtdeel_code,
                                               ins_srtdeel_omschrijving,
                                               ins_deel_omschrijving,
                                               ins_deel_opmerking,
                                               reserveerbaar,
                                               res_deel_eenheid,
                                               res_deel_prijs,
                                               alg_locatie_code,
                                               alg_gebouw_code,
                                               alg_verdieping_volgnr,
                                               alg_ruimte_nr,
                                               res_deel_alg_level,
                                               res_discipline_omschrijving,
                                               res_discipline_kostensoort,
                                               prs_perslid_matchcode,
                                               prs_perslid_matchwaarde,
                                               ins_kenmerkwaarde1,
                                               ins_kenmerkwaarde2,
                                               ins_kenmerkwaarde3,
                                               ins_kenmerkwaarde4,
                                               ins_kenmerkwaarde5,
                                               ins_kenmerkwaarde6,
                                               ins_kenmerkwaarde7,
                                               ins_kenmerkwaarde8,
                                               ins_kenmerkwaarde9,
                                               ins_kenmerkwaarde10,
                                               ins_kenmerkwaarde11,
                                               ins_kenmerkwaarde12,
                                               ins_kenmerkwaarde13,
                                               ins_kenmerkwaarde14,
                                               ins_kenmerkwaarde15,
                                               ins_kenmerkwaarde16,
                                               ins_kenmerkwaarde17,
                                               ins_kenmerkwaarde18,
                                               ins_kenmerkwaarde19,
                                               ins_kenmerkwaarde20,
                                               ins_deel_aanmaak,
                                               ins_deel_vervaldatum,
                                               ins_deel_aantal
                             )
                    VALUES   (
                                 v_ins_discipline_omschrijving,
                                 v_ins_discipline_kostensoort,
                                 v_ins_srtgroep_omschrijving,
                                 v_ins_srtdeel_code,
                                 v_ins_srtdeel_omschrijving,
                                 v_ins_deel_omschrijving,
                                 v_ins_deel_opmerking,
                                 v_reserveerbaar_n,
                                 v_res_deel_eenheid,
                                 v_res_deel_prijs_n,
                                 v_alg_locatie_code,
                                 v_alg_gebouw_code,
                                 v_alg_verdieping_volgnr_n,
                                 v_alg_ruimte_nr,
                                 v_res_deel_alg_level_n,
                                 v_res_discipline_omschrijving,
                                 v_res_discipline_kostensoort,
                                 v_prs_perslid_matchcode,
                                 v_prs_perslid_matchwaarde,
                                 DECODE (v_ins_srtkenmerk_key1,
                                    NULL, v_ins_kenmerkwaarde1,
                                       TO_CHAR (v_ins_srtkenmerk_key1)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde1, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key2,
                                    NULL, v_ins_kenmerkwaarde2,
                                       TO_CHAR (v_ins_srtkenmerk_key2)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde2, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key3,
                                    NULL, v_ins_kenmerkwaarde3,
                                       TO_CHAR (v_ins_srtkenmerk_key3)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde3, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key4,
                                    NULL, v_ins_kenmerkwaarde4,
                                       TO_CHAR (v_ins_srtkenmerk_key4)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde4, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key5,
                                    NULL, v_ins_kenmerkwaarde5,
                                       TO_CHAR (v_ins_srtkenmerk_key5)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde5, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key6,
                                    NULL, v_ins_kenmerkwaarde6,
                                       TO_CHAR (v_ins_srtkenmerk_key6)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde6, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key7,
                                    NULL, v_ins_kenmerkwaarde7,
                                       TO_CHAR (v_ins_srtkenmerk_key7)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde7, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key8,
                                    NULL, v_ins_kenmerkwaarde8,
                                       TO_CHAR (v_ins_srtkenmerk_key8)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde8, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key9,
                                    NULL, v_ins_kenmerkwaarde9,
                                       TO_CHAR (v_ins_srtkenmerk_key9)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde9, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key10,
                                    NULL, v_ins_kenmerkwaarde10,
                                       TO_CHAR (v_ins_srtkenmerk_key10)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde10, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key11,
                                    NULL, v_ins_kenmerkwaarde11,
                                       TO_CHAR (v_ins_srtkenmerk_key11)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde11, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key12,
                                    NULL, v_ins_kenmerkwaarde12,
                                       TO_CHAR (v_ins_srtkenmerk_key12)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde12, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key13,
                                    NULL, v_ins_kenmerkwaarde13,
                                       TO_CHAR (v_ins_srtkenmerk_key13)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde13, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key14,
                                    NULL, v_ins_kenmerkwaarde14,
                                       TO_CHAR (v_ins_srtkenmerk_key14)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde14, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key15,
                                    NULL, v_ins_kenmerkwaarde15,
                                       TO_CHAR (v_ins_srtkenmerk_key15)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde15, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key16,
                                    NULL, v_ins_kenmerkwaarde16,
                                       TO_CHAR (v_ins_srtkenmerk_key16)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde16, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key17,
                                    NULL, v_ins_kenmerkwaarde17,
                                       TO_CHAR (v_ins_srtkenmerk_key17)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde17, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key18,
                                    NULL, v_ins_kenmerkwaarde18,
                                       TO_CHAR (v_ins_srtkenmerk_key18)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde18, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key19,
                                    NULL, v_ins_kenmerkwaarde19,
                                       TO_CHAR (v_ins_srtkenmerk_key19)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde19, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key20,
                                    NULL, v_ins_kenmerkwaarde20,
                                       TO_CHAR (v_ins_srtkenmerk_key20)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde20, 1, 3900)
                                 ),
                                 v_ins_deel_aanmaak_d,
                                 v_ins_deel_vervaldatum_d,
                                 v_ins_deel_aantal_n
                             );

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

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

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



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

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

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

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

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

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

                    v_count_update := v_count_update + 1;
                END IF;

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

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

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

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

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

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

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

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

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

                    v_count_update := v_count_update + 1;
                END IF;

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

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

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

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

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

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

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

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

                    INSERT INTO res_disc_params (res_ins_discipline_key)
                        VALUES (v_discipline_key);

                    v_count_update := v_count_update + 1;
                END IF;

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

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

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

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

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

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

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

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

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

                    v_count_update := v_count_update + 1;
                END IF;

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

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

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

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

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

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

                v_errormsg := 'Fout bij bepalen groepsoort';

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

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

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

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

                    v_count_update := v_count_update + 1;
                END IF;

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

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

    -- SUBPROC
    -- p_srtkenmerkgroepwaarde = '234|1=37-ZB-DR'
    -- Ofwel: srtkenmerk_key|groep=waarde
    PROCEDURE upsert_inskenmerk (p_deel_key              IN NUMBER,
                                 p_srtkenmerkgroepwaarde IN VARCHAR2)
    AS
        v_kenmerk_key       NUMBER;
        v_srtkenmerk_key    NUMBER;
        v_groep             NUMBER;
        v_waarde            VARCHAR(4000);
        v_srtkenmerk_type   VARCHAR2 (1);
        ccount              NUMBER;
        v_objectnaam        VARCHAR2 (30);
        v_kolomnaam         VARCHAR2 (30);
        v_kolomtxt          VARCHAR2 (30);
        sql_stmt            VARCHAR2 (1000);
        v_kenmerkdeel_key   NUMBER;
        l_cursor_1          INTEGER;
        l_rowsprocessed     NUMBER DEFAULT 0;
    BEGIN
        IF p_srtkenmerkgroepwaarde IS NOT NULL
        THEN
            v_errormsg := 'Fout bij bepalen kenmerk van soort [' || p_srtkenmerkgroepwaarde || ']';

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

            SELECT k.ins_kenmerk_key, sk.ins_srtkenmerk_kenmerktype
              INTO v_kenmerk_key, v_srtkenmerk_type
              FROM ins_deel d,
                   ins_srtdeel sd,
                   ins_srtgroep sg,
                   ins_v_aanwezigkenmerk k,
                   ins_v_aanwezigsrtkenmerk sk
             WHERE     d.ins_deel_key = p_deel_key
                   AND d.ins_srtdeel_key = sd.ins_srtdeel_key
                   AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
                   AND k.ins_srtkenmerk_key = v_srtkenmerk_key
                   AND k.ins_kenmerk_groep = v_groep
                   AND ( (k.ins_srtinstallatie_key = sd.ins_srtdeel_key
                          AND k.ins_kenmerk_niveau = 'S')
                        OR (k.ins_srtinstallatie_key = sg.ins_srtgroep_key
                            AND k.ins_kenmerk_niveau = 'G')
                        OR (k.ins_srtinstallatie_key = sg.ins_discipline_key
                            AND k.ins_kenmerk_niveau = 'D'))
                   AND k.ins_srtkenmerk_key = sk.ins_srtkenmerk_key;

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

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

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

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

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

                v_errormsg := 'Fout bij bepalen huidige waarde';

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

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

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

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

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

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

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

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

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

                v_errormsg := 'Fout bij bepalen groepsoort';

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

                v_errormsg := 'Fout bij bepalen objectsoort';

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

                v_locatie_key := NULL;

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

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

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

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

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

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

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

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

                    v_ruimte_type := 'R';

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

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

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

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

                    v_errormsg := 'Fout bij bepalen type koppeling';

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

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

                    ELSE 
                    v_ruimte_type := 'P' ;
                    END IF;

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

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

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

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

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

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

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

                        v_count_resnew := v_count_resnew + 1;
                    END IF;

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

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

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

                -- NULL-waarden resulteren NIET in het wissen van kenmerkvelden
                -- (bijwerken kan wel, maar wissen dus niet)! ins_kenmerkwaarde1
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);
                upsert_inskenmerk (v_deel_key, rec.[REDACTED]);

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

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

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