From 18e8eac398ab2a72a255e02c33b6bdba5dbc076a Mon Sep 17 00:00:00 2001 From: Erik Groener Date: Thu, 19 Dec 2024 10:10:17 +0000 Subject: [PATCH] FCLT#86003 Probleem met importeren contracten vanuit Mocadocs via FIP-sheet svn path=/Database/trunk/; revision=67441 --- FAC/FAC_PACF.SRC | 3573 ++++++++++++++++++++++---------------------- FAC/FAC_VIEEXP.SRC | 99 ++ 2 files changed, 1892 insertions(+), 1780 deletions(-) diff --git a/FAC/FAC_PACF.SRC b/FAC/FAC_PACF.SRC index 64edb5df..f70967ae 100644 --- a/FAC/FAC_PACF.SRC +++ b/FAC/FAC_PACF.SRC @@ -20473,1069 +20473,1199 @@ END fac_update_faq; -- FSN#25952 Contractenimport CREATE OR REPLACE PROCEDURE fac_import_cnt (p_import_key IN NUMBER) AS - c_delim VARCHAR2 (2) := fac.import_delimiter(p_import_key); - v_newline fac_imp_file.fac_imp_file_line%TYPE; -- Input line - v_errormsg VARCHAR2 (1000); - v_errorhint VARCHAR2 (1000); - oracle_err_num NUMBER; - oracle_err_mes VARCHAR2 (200); - header_is_valid NUMBER; - v_count_tot NUMBER (10); - v_count_imp NUMBER (10); - v_ongeldig NUMBER (1); - v_aanduiding VARCHAR2 (200); - v_cnt_kenmerk_key1 VARCHAR2 (255); - v_cnt_kenmerk_key2 VARCHAR2 (255); - v_cnt_kenmerk_key3 VARCHAR2 (255); - v_cnt_kenmerk_key4 VARCHAR2 (255); - v_cnt_kenmerk_key5 VARCHAR2 (255); - v_cnt_kenmerk_key6 VARCHAR2 (255); - v_cnt_kenmerk_key7 VARCHAR2 (255); - v_cnt_kenmerk_key8 VARCHAR2 (255); - v_cnt_kenmerk_key9 VARCHAR2 (255); - v_cnt_kenmerk_key10 VARCHAR2 (255); - v_cnt_kenmerk_key11 VARCHAR2 (255); - v_cnt_kenmerk_key12 VARCHAR2 (255); - v_cnt_kenmerk_key13 VARCHAR2 (255); - v_cnt_kenmerk_key14 VARCHAR2 (255); - v_cnt_kenmerk_key15 VARCHAR2 (255); - v_cnt_kenmerk_key16 VARCHAR2 (255); - v_cnt_kenmerk_key17 VARCHAR2 (255); - v_cnt_kenmerk_key18 VARCHAR2 (255); - v_cnt_kenmerk_key19 VARCHAR2 (255); - v_cnt_kenmerk_key20 VARCHAR2 (255); - v_cnt_kenmerk_key21 VARCHAR2 (255); - v_cnt_kenmerk_key22 VARCHAR2 (255); - v_cnt_kenmerk_key23 VARCHAR2 (255); - v_cnt_kenmerk_key24 VARCHAR2 (255); - v_cnt_kenmerk_key25 VARCHAR2 (255); - -- De importvelden - v_nummer_intern VARCHAR2 (100); -- cnt_contract_nummer_intern - v_nummer_extern VARCHAR2 (100); -- cnt_contract_nummer - v_cnt_soort VARCHAR2 (100); -- ins_discipline_omschrijving - v_beschrijving VARCHAR2 (1000); -- cnt_contract_omschrijving - v_mantel_nr VARCHAR2 (100); -- cnt_contract_nummer_intern - v_omschrijving VARCHAR2 (1000); -- cnt_contract_document - v_versie VARCHAR2 (100); -- cnt_contract_versie - v_dienst VARCHAR2 (100); -- prs_dienst_omschrijving - v_afdeling VARCHAR2 (100); -- prs_afdeling_naam - v_perslid_eig VARCHAR2 (100); -- prs_perslid_oslogin - v_perslid_beh VARCHAR2 (100); -- prs_perslid_oslogin - v_opmerking VARCHAR2 (1000); -- cnt_contract_opmerking - v_datum_ingang VARCHAR2 (100); - v_d_datum_ingang DATE; -- cnt_contract_looptijd_van - v_datum_eind VARCHAR2 (100); - v_d_datum_eind DATE; -- cnt_contract_looptijd_tot - v_datum_opzeg VARCHAR2 (100); - v_d_datum_opzeg DATE; -- opzegdatum - v_datum_rappel VARCHAR2 (100); - v_d_datum_rappel DATE; -- rappeldatum - v_bedrijf_naam VARCHAR2 (100); -- prs_bedrijf_naam/leverancier_nr - v_contact_naam VARCHAR2 (100); -- prs_contactpersoon_naam - v_kpn_code VARCHAR2 (100); -- prs_kostenplaats_nr - v_bedrag VARCHAR2 (100); - v_n_bedrag NUMBER (11, 2); -- cnt_contract_kosten - v_bedrag_termijn VARCHAR2 (100); - v_n_bedrag_termijn NUMBER (11, 2); -- cnt_contract_termijnkosten - v_uurtarief VARCHAR2 (100); - v_n_uurtarief NUMBER (6, 2); -- cnt_contract_uurloon - v_korting VARCHAR2 (100); - v_n_korting NUMBER (4, 2); -- cnt_contract_korting - v_gebouwcode VARCHAR2 (100); -- alg_locatie_code/gebouw_code - v_verlengen VARCHAR2 (100); -- cnt_contract_verlenging - v_flex1 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex2 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex3 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex4 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex5 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex6 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex7 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex8 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex9 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex10 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex11 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex12 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex13 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex14 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex15 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex16 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex17 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex18 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex19 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex20 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex21 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex22 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex23 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex24 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde - v_flex25 VARCHAR2 (1053); -- cnt_kenmerkcontract_waarde + CURSOR c1 + IS + SELECT fac_imp_csv_index + , fac_imp_csv_col01 CONTRACTNR + , fac_imp_csv_col02 VERSIE + , fac_imp_csv_col03 EXTERNNR + , fac_imp_csv_col04 CONTRACTSOORT + , fac_imp_csv_col05 BESCHRIJVING + , fac_imp_csv_col06 MANTELNR + , fac_imp_csv_col07 MANTELNR_VERSIE + , fac_imp_csv_col08 OMSCHRIJVING + , fac_imp_csv_col09 DIENST + , fac_imp_csv_col10 EIGENAAR_AFD + , fac_imp_csv_col11 EIGENAAR_EMAIL + , fac_imp_csv_col12 BEHEERDER_EMAIL + , fac_imp_csv_col13 OPMERKING + , fac_imp_csv_col14 INGANGSDATUM + , fac_imp_csv_col15 RAPPELDATUM + , fac_imp_csv_col16 OPZEGDATUM + , fac_imp_csv_col17 EINDDATUM + , fac_imp_csv_col18 SOORT_CONTACTPARTIJ + , fac_imp_csv_col19 BEDRIJFNAAM + , fac_imp_csv_col20 CONTACTNAAM + , fac_imp_csv_col21 KOSTENPLAATSCODE + , fac_imp_csv_col22 KOSTENSOORTCODE + , fac_imp_csv_col23 CONTRACTBEDRAG + , fac_imp_csv_col24 TERMIJNBEDRAG + , fac_imp_csv_col25 UURTARIEF + , fac_imp_csv_col26 KORTING + , fac_imp_csv_col27 SCOPETYPE + , fac_imp_csv_col28 LOCATIEGEBOUW_CODE + , fac_imp_csv_col29 VERLENGEN + , fac_imp_csv_col30 flex_01 + , fac_imp_csv_col31 flex_02 + , fac_imp_csv_col32 flex_03 + , fac_imp_csv_col33 flex_04 + , fac_imp_csv_col34 flex_05 + , fac_imp_csv_col35 flex_06 + , fac_imp_csv_col36 flex_07 + , fac_imp_csv_col37 flex_08 + , fac_imp_csv_col38 flex_09 + , fac_imp_csv_col39 flex_10 + , fac_imp_csv_col40 flex_11 + , fac_imp_csv_col41 flex_12 + , fac_imp_csv_col42 flex_13 + , fac_imp_csv_col43 flex_14 + , fac_imp_csv_col44 flex_15 + , fac_imp_csv_col45 flex_16 + , fac_imp_csv_col46 flex_17 + , fac_imp_csv_col47 flex_18 + , fac_imp_csv_col48 flex_19 + , fac_imp_csv_col49 flex_20 + , fac_imp_csv_col50 flex_21 + , fac_imp_csv_col51 flex_22 + , fac_imp_csv_col52 flex_23 + , fac_imp_csv_col53 flex_24 + , fac_imp_csv_col54 flex_25 + FROM fac_imp_csv + WHERE fac_imp_csv_index > 1 + AND fac_import_key = p_import_key; - CURSOR c1 - IS - SELECT * - FROM fac_imp_file - WHERE fac_import_key = p_import_key - ORDER BY fac_imp_file_index; + v_errormsg VARCHAR2(1000); + v_errorhint VARCHAR2(1000); + oracle_err_num NUMBER; + oracle_err_mes VARCHAR2(200); + v_aanduiding VARCHAR2(200); + v_header_is_valid NUMBER(1) := 0; + v_ongeldig NUMBER(1) := 0; + v_count_rec NUMBER(10) := 0; + v_count_imp NUMBER(10) := 0; + v_ref_key NUMBER(10); - -- Controleer tijdens import-fase alleen op het bestaan van een kenmerk met de meegegeven omschrijving of kenmerk key. - -- De omschrijving (header van kolom) kan de omschrijving zijn van het kenmerksoort of het kenmerk. - -- De omschrijving van het kenmerksoort kan namelijk overruled worden door de omschrijving van het kenmerk. - -- Daarnaast kan hetzelfde kenmerk vaker voorkomen voor verschillende groepen. - -- Of het kenmerksoort/kenmerk wel is gedefinieerd voor de betreffende - -- object-discipline/groep/soort, volgt pas tijdens de update-fase)! - -- - -- p_kw is bijvoorbeeld 'Looptijd Maximaal', 'Looptijd Maximaal|3', 1049 of 1049|3 waarbij de tweede en laatste in groep 3 zitten - -- het resultaat is NULL (als niet gevonden) of Looptijd Maximaal|3 of 1049|3 voor kenmer_key 1049 in groep 3 - -- Als geen groep is meegegeven dan wordt 'Looptijd Maximaal|0' opgeleverd (de default groep) - FUNCTION bepaal_kenmerk (p_kw IN VARCHAR2) + -- De importvelden + v_nummer_intern cnt_contract.cnt_contract_nummer_intern%TYPE; --VARCHAR2(30) + v_versie cnt_contract.cnt_contract_versie%TYPE; --VARCHAR2(10) + v_nummer_extern cnt_contract.cnt_contract_nummer%TYPE; --VARCHAR2(30) + v_cnt_soort ins_tab_discipline.ins_discipline_omschrijving%TYPE; --VARCHAR2(60) --> cnt_contract.ins_discipline_key + v_beschrijving cnt_contract.cnt_contract_omschrijving%TYPE; --VARCHAR2(50) + v_mantel_nr cnt_contract.cnt_contract_nummer_intern%TYPE; --VARCHAR2(30) |-> cnt_contract.cnt_contract_mantel_key + v_mantel_nr_versie cnt_contract.cnt_contract_versie%TYPE; --VARCHAR2(10) | + v_omschrijving cnt_contract.cnt_contract_document%TYPE; --VARCHAR2(2048) + v_dienst prs_dienst.prs_dienst_omschrijving%TYPE; --VARCHAR2(60) --> cnt_contract.prs_dienst_key + v_afdeling prs_afdeling.prs_afdeling_naam%TYPE; --VARCHAR2(15) --> cnt_contract.prs_afdeling_key_eig + v_perslid_eig prs_perslid.prs_perslid_email%TYPE; --VARCHAR2(200) --> cnt_contract.prs_perslid_key_eig + v_perslid_beh prs_perslid.prs_perslid_email%TYPE; --VARCHAR2(200) --> cnt_contract.prs_perslid_key_beh + v_opmerking cnt_contract.cnt_contract_opmerking%TYPE; --VARCHAR2(4000) + v_ingangsdatum cnt_contract.cnt_contract_looptijd_van%TYPE; --DATE + v_rappeldatum cnt_contract.cnt_contract_aanmaak%TYPE; --DATE --> cnt_contact.cnt_contract_rappeltermijn + v_opzegdatum cnt_contract.cnt_contract_aanmaak%TYPE; --DATE --> cnt_contract.cnt_contract_opzegtermijn + v_einddatum cnt_contract.cnt_contract_looptijd_tot%TYPE; --DATE + v_srtcontact VARCHAR2 (1); --P of B + v_bedrijfnaam prs_perslid.prs_perslid_email%TYPE; --VARCHAR (200) --> cnt_contract.cnt_prs_bedrijf_key + v_contactnaam prs_contactpersoon.prs_contactpersoon_email%TYPE; --VARCHAR2(200) --> cnt_contract.prs_contactpersoon_key + v_kpn_code prs_kostenplaats.prs_kostenplaats_nr%TYPE; --VARCHAR2(30) --> cnt_contract.prs_kostenplaats_key + v_kostensoort_code prs_kostensoort.prs_kostensoort_oms%TYPE; --VARCHAR2(60) --> cnt_contract.prs_kostensoort_key + v_bedrag cnt_contract.cnt_contract_kosten%TYPE; --NUMBER(11,2) + v_bedrag_termijn cnt_contract.cnt_contract_termijnkosten%TYPE; --NUMBER(11,2) + v_uurtarief cnt_contract.cnt_contract_uurloon%TYPE; --NUMBER(6,2) + v_korting cnt_contract.cnt_contract_korting%TYPE; --NUMBER(5,2) + v_scope_type cnt_contract_plaats.cnt_alg_plaats_code%TYPE; --VARCHAR2(1) --> cnt_contract_plaats.cnt_alg_plaats_code + v_gebouwcode alg_gebouw.alg_gebouw_code%TYPE; --VARCHAR2(12) --> cnt_contract_plaats.cnt_alg_plaats_key + v_verlengen cnt_contract.cnt_contract_verlenging%TYPE; --NUMBER(1) + + v_cnt_kenmerk_01 fac_imp_cnt.flex1%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_02 fac_imp_cnt.flex2%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_03 fac_imp_cnt.flex3%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_04 fac_imp_cnt.flex4%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_05 fac_imp_cnt.flex5%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_06 fac_imp_cnt.flex6%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_07 fac_imp_cnt.flex7%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_08 fac_imp_cnt.flex8%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_09 fac_imp_cnt.flex9%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_10 fac_imp_cnt.flex10%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_11 fac_imp_cnt.flex11%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_12 fac_imp_cnt.flex12%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_13 fac_imp_cnt.flex13%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_14 fac_imp_cnt.flex14%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_15 fac_imp_cnt.flex15%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_16 fac_imp_cnt.flex16%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_17 fac_imp_cnt.flex17%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_18 fac_imp_cnt.flex18%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_19 fac_imp_cnt.flex19%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_20 fac_imp_cnt.flex20%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_21 fac_imp_cnt.flex21%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_22 fac_imp_cnt.flex22%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_23 fac_imp_cnt.flex23%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_24 fac_imp_cnt.flex24%TYPE; --VARCHAR2(255); + v_cnt_kenmerk_25 fac_imp_cnt.flex25%TYPE; --VARCHAR2(255); + + v_header VARCHAR2(500) := 'CONTRACTNR;VERSIE;EXTERNNR;CONTRACTSOORT;BESCHRIJVING;' + || 'MANTELNR;MANTELNR_VERSIE;OMSCHRIJVING;DIENST;EIGENAAR_AFD;' + || 'EIGENAAR_EMAIL;BEHEERDER_EMAIL;OPMERKING;INGANGSDATUM;RAPPELDATUM;' + || 'OPZEGDATUM;EINDDATUM;SOORT_CONTACTPARTIJ;BEDRIJFSNAAM;CONTACTNAAM;' + || 'KOSTENPLAATSCODE;KOSTENSOORTCODE;CONTRACTBEDRAG;TERMIJNBEDRAG;UURTARIEF;' + || 'KORTING;SCOPETYPE;LOCATIEGEBOUW_CODE;VERLENGEN'; + v_header_csv VARCHAR2(500); + v_flex_naam_01 fac_imp_cnt.flex1%TYPE; + v_flex_naam_02 fac_imp_cnt.flex2%TYPE; + v_flex_naam_03 fac_imp_cnt.flex3%TYPE; + v_flex_naam_04 fac_imp_cnt.flex4%TYPE; + v_flex_naam_05 fac_imp_cnt.flex5%TYPE; + v_flex_naam_06 fac_imp_cnt.flex6%TYPE; + v_flex_naam_07 fac_imp_cnt.flex7%TYPE; + v_flex_naam_08 fac_imp_cnt.flex8%TYPE; + v_flex_naam_09 fac_imp_cnt.flex9%TYPE; + v_flex_naam_10 fac_imp_cnt.flex10%TYPE; + v_flex_naam_11 fac_imp_cnt.flex11%TYPE; + v_flex_naam_12 fac_imp_cnt.flex12%TYPE; + v_flex_naam_13 fac_imp_cnt.flex13%TYPE; + v_flex_naam_14 fac_imp_cnt.flex14%TYPE; + v_flex_naam_15 fac_imp_cnt.flex15%TYPE; + v_flex_naam_16 fac_imp_cnt.flex16%TYPE; + v_flex_naam_17 fac_imp_cnt.flex17%TYPE; + v_flex_naam_18 fac_imp_cnt.flex18%TYPE; + v_flex_naam_19 fac_imp_cnt.flex19%TYPE; + v_flex_naam_20 fac_imp_cnt.flex20%TYPE; + v_flex_naam_21 fac_imp_cnt.flex21%TYPE; + v_flex_naam_22 fac_imp_cnt.flex22%TYPE; + v_flex_naam_23 fac_imp_cnt.flex23%TYPE; + v_flex_naam_24 fac_imp_cnt.flex24%TYPE; + v_flex_naam_25 fac_imp_cnt.flex25%TYPE; + + -- Controleer tijdens import-fase alleen op het bestaan van een kenmerk met de meegegeven omschrijving of kenmerk key. + -- De omschrijving (header van kolom) kan de omschrijving zijn van het kenmerksoort of het kenmerk. + -- De omschrijving van het kenmerksoort kan namelijk overruled worden door de omschrijving van het kenmerk. + -- Daarnaast kan hetzelfde kenmerk vaker voorkomen voor verschillende groepen. + -- Of het kenmerksoort/kenmerk wel is gedefinieerd voor de betreffende + -- object-discipline/groep/soort, volgt pas tijdens de update-fase)! + -- + -- p_kw is bijvoorbeeld 'Looptijd Maximaal', 'Looptijd Maximaal|3', 1049 of 1049|3 waarbij de tweede en laatste in groep 3 zitten + -- het resultaat is NULL (als niet gevonden) of Looptijd Maximaal|3 of 1049|3 voor kenmer_key 1049 in groep 3 + -- Als geen groep is meegegeven dan wordt 'Looptijd Maximaal|0' opgeleverd (de default groep) + FUNCTION bepaal_kenmerk (p_kw IN VARCHAR2) + RETURN VARCHAR + IS + v_kenmerk_key NUMBER; + v_kenmerk_groep NUMBER; + v_kw VARCHAR(250); + BEGIN + v_kenmerk_groep := 0; + v_kw := p_kw; + IF INSTR (v_kw, '|') > 1 + THEN + v_kenmerk_groep := SUBSTR (v_kw, INSTR (v_kw, '|') + 1); + v_kw := SUBSTR (v_kw, 1, INSTR (v_kw, '|') - 1); + END IF; + + IF fac.safe_to_number(v_kw) IS NULL + THEN -- kenmerkwaarde is alfanumeriek (dus omschrijving)! + SELECT MIN(k.cnt_kenmerk_key) + INTO v_kenmerk_key + FROM cnt_kenmerk k, + cnt_srtkenmerk sk + WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key + AND k.cnt_kenmerk_groep = v_kenmerk_groep + AND COALESCE(UPPER(k.cnt_kenmerk_omschrijving), sk.cnt_srtkenmerk_upper) = UPPER(v_kw) + AND sk.cnt_srtkenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'r', 'S', 'X', 'V') + AND k.cnt_kenmerk_verwijder IS NULL + AND sk.cnt_srtkenmerk_verwijder IS NULL; + ELSE -- kenmerkwaarde is numeriek (dus key)! + SELECT k.cnt_kenmerk_key + INTO v_kenmerk_key + FROM cnt_kenmerk k, + cnt_srtkenmerk sk + WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key + AND k.cnt_kenmerk_groep = v_kenmerk_groep + AND k.cnt_kenmerk_key = fac.safe_to_number(v_kw) + AND sk.cnt_srtkenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'r', 'S', 'X', 'V') + AND k.cnt_kenmerk_verwijder IS NULL + AND sk.cnt_srtkenmerk_verwijder IS NULL; + END IF; + + IF v_kenmerk_key IS NULL + THEN + RETURN NULL; + ELSE + -- Er is een kenmerksoort of kenmerk aanwezig met de omschrijving/kenmerk_key (v_kw) + RETURN v_kw || '|' || TO_CHAR(v_kenmerk_groep); + END IF; + EXCEPTION + WHEN NO_DATA_FOUND + THEN + IF p_kw IS NULL OR UPPER (p_kw) LIKE 'KENMERK%' + THEN + RETURN NULL; + ELSE + fac.imp_writelog ( p_import_key, 'W' + , 'Fout bij bepalen kenmerk [' || p_kw || ']' + , 'Bestaat niet of type ongeldig'); + COMMIT; + RETURN NULL; + END IF; + END; -- bepaal_kenmerk + + FUNCTION kenmerk_waarde( p_import_key IN NUMBER + , p_import_index IN NUMBER + , p_aanduiding IN VARCHAR2 + , p_flex_naam IN VARCHAR2 + , p_flex_waarde IN VARCHAR2) RETURN VARCHAR - IS - v_kenmerk_key NUMBER; - v_kenmerk_groep NUMBER; - v_kw VARCHAR(250); - BEGIN - v_kenmerk_groep := 0; - v_kw := p_kw; - IF INSTR (v_kw, '|') > 1 - THEN - v_kenmerk_groep := SUBSTR (v_kw, INSTR (v_kw, '|') + 1); - v_kw := SUBSTR (v_kw, 1, INSTR (v_kw, '|') - 1); - END IF; + IS + v_flexval VARCHAR2(200); + v_flx VARCHAR2(255); + BEGIN + v_flx := bepaal_kenmerk(p_flex_waarde); - IF fac.safe_to_number (v_kw) IS NULL - THEN -- kenmerkwaarde is alfanumeriek (dus omschrijving)! - SELECT MIN(k.cnt_kenmerk_key) - INTO v_kenmerk_key - FROM cnt_kenmerk k, - cnt_srtkenmerk sk - WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key - AND k.cnt_kenmerk_groep = v_kenmerk_groep - AND COALESCE(UPPER(k.cnt_kenmerk_omschrijving), sk.cnt_srtkenmerk_upper) = UPPER(v_kw) - AND sk.cnt_srtkenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'r', 'S', 'X', 'V') - AND k.cnt_kenmerk_verwijder IS NULL - AND sk.cnt_srtkenmerk_verwijder IS NULL; - ELSE -- kenmerkwaarde is numeriek (dus key)! - SELECT k.cnt_kenmerk_key - INTO v_kenmerk_key - FROM cnt_kenmerk k, - cnt_srtkenmerk sk - WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key - AND k.cnt_kenmerk_groep = v_kenmerk_groep - AND k.cnt_kenmerk_key = fac.safe_to_number (v_kw) - AND sk.cnt_srtkenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'r', 'S', 'X', 'V') - AND k.cnt_kenmerk_verwijder IS NULL - AND sk.cnt_srtkenmerk_verwijder IS NULL; - END IF; - - IF v_kenmerk_key IS NULL - THEN - RETURN NULL; - ELSE - -- Er is een kenmerksoort of kenmerk aanwezig met de omschrijving/kenmerk_key (v_kw) - RETURN v_kw || '|' || TO_CHAR(v_kenmerk_groep); - END IF; - EXCEPTION - WHEN NO_DATA_FOUND - THEN - IF p_kw IS NULL OR UPPER (p_kw) LIKE 'KENMERK%' - THEN - RETURN NULL; - ELSE - fac.imp_writelog (p_import_key, - 'W', - 'Fout bij bepalen kenmerk [' || p_kw || ']', - 'Bestaat niet of type ongeldig'); - COMMIT; - RETURN NULL; - END IF; - END; -BEGIN - -- Eerst opruiming - DELETE FROM fac_imp_cnt; - - COMMIT; - - v_count_tot := 0; - v_count_imp := 0; - header_is_valid := 0; - - FOR rec1 IN c1 - LOOP - BEGIN - v_errormsg := 'Fout FETCH importregel'; - - v_newline := rec1.fac_imp_file_line; - v_errormsg := 'Fout bij opvragen importregel'; - v_aanduiding := ''; - v_ongeldig := 0; - -- Lees alle veldwaarden - fac.imp_getfield (v_newline, c_delim, v_nummer_intern); - fac.imp_getfield (v_newline, c_delim, v_nummer_extern); - fac.imp_getfield (v_newline, c_delim, v_cnt_soort); - fac.imp_getfield (v_newline, c_delim, v_beschrijving); - fac.imp_getfield (v_newline, c_delim, v_mantel_nr); - fac.imp_getfield (v_newline, c_delim, v_omschrijving); - fac.imp_getfield (v_newline, c_delim, v_versie); - fac.imp_getfield (v_newline, c_delim, v_dienst); - fac.imp_getfield (v_newline, c_delim, v_afdeling); - fac.imp_getfield (v_newline, c_delim, v_perslid_eig); - fac.imp_getfield (v_newline, c_delim, v_perslid_beh); - fac.imp_getfield (v_newline, c_delim, v_opmerking); - fac.imp_getfield (v_newline, c_delim, v_datum_ingang); - fac.imp_getfield (v_newline, c_delim, v_datum_rappel); - fac.imp_getfield (v_newline, c_delim, v_datum_opzeg); - fac.imp_getfield (v_newline, c_delim, v_datum_eind); - fac.imp_getfield (v_newline, c_delim, v_bedrijf_naam); - fac.imp_getfield (v_newline, c_delim, v_contact_naam); - fac.imp_getfield (v_newline, c_delim, v_kpn_code); - fac.imp_getfield (v_newline, c_delim, v_bedrag); - fac.imp_getfield (v_newline, c_delim, v_bedrag_termijn); - fac.imp_getfield (v_newline, c_delim, v_uurtarief); - fac.imp_getfield (v_newline, c_delim, v_korting); - fac.imp_getfield (v_newline, c_delim, v_gebouwcode); - fac.imp_getfield (v_newline, c_delim, v_verlengen); - fac.imp_getfield (v_newline, c_delim, v_flex1); - fac.imp_getfield (v_newline, c_delim, v_flex2); - fac.imp_getfield (v_newline, c_delim, v_flex3); - fac.imp_getfield (v_newline, c_delim, v_flex4); - fac.imp_getfield (v_newline, c_delim, v_flex5); - fac.imp_getfield (v_newline, c_delim, v_flex6); - fac.imp_getfield (v_newline, c_delim, v_flex7); - fac.imp_getfield (v_newline, c_delim, v_flex8); - fac.imp_getfield (v_newline, c_delim, v_flex9); - fac.imp_getfield (v_newline, c_delim, v_flex10); - fac.imp_getfield (v_newline, c_delim, v_flex11); - fac.imp_getfield (v_newline, c_delim, v_flex12); - fac.imp_getfield (v_newline, c_delim, v_flex13); - fac.imp_getfield (v_newline, c_delim, v_flex14); - fac.imp_getfield (v_newline, c_delim, v_flex15); - fac.imp_getfield (v_newline, c_delim, v_flex16); - fac.imp_getfield (v_newline, c_delim, v_flex17); - fac.imp_getfield (v_newline, c_delim, v_flex18); - fac.imp_getfield (v_newline, c_delim, v_flex19); - fac.imp_getfield (v_newline, c_delim, v_flex20); - fac.imp_getfield (v_newline, c_delim, v_flex21); - fac.imp_getfield (v_newline, c_delim, v_flex22); - fac.imp_getfield (v_newline, c_delim, v_flex23); - fac.imp_getfield (v_newline, c_delim, v_flex24); - fac.imp_getfield (v_newline, c_delim, v_flex25); - - v_aanduiding := '[' || v_cnt_soort || '|' || v_nummer_intern || '] '; - - -- 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_nummer_intern) = 'CONTRACTNR' - AND UPPER (v_versie) = 'VERSIE' - AND UPPER (v_dienst) = 'DIENST' - AND UPPER (v_verlengen) = 'VERLENGEN') - THEN - v_cnt_kenmerk_key1 := bepaal_kenmerk (v_flex1); - v_cnt_kenmerk_key2 := bepaal_kenmerk (v_flex2); - v_cnt_kenmerk_key3 := bepaal_kenmerk (v_flex3); - v_cnt_kenmerk_key4 := bepaal_kenmerk (v_flex4); - v_cnt_kenmerk_key5 := bepaal_kenmerk (v_flex5); - v_cnt_kenmerk_key6 := bepaal_kenmerk (v_flex6); - v_cnt_kenmerk_key7 := bepaal_kenmerk (v_flex7); - v_cnt_kenmerk_key8 := bepaal_kenmerk (v_flex8); - v_cnt_kenmerk_key9 := bepaal_kenmerk (v_flex9); - v_cnt_kenmerk_key10 := bepaal_kenmerk (v_flex10); - v_cnt_kenmerk_key11 := bepaal_kenmerk (v_flex11); - v_cnt_kenmerk_key12 := bepaal_kenmerk (v_flex12); - v_cnt_kenmerk_key13 := bepaal_kenmerk (v_flex13); - v_cnt_kenmerk_key14 := bepaal_kenmerk (v_flex14); - v_cnt_kenmerk_key15 := bepaal_kenmerk (v_flex15); - v_cnt_kenmerk_key16 := bepaal_kenmerk (v_flex16); - v_cnt_kenmerk_key17 := bepaal_kenmerk (v_flex17); - v_cnt_kenmerk_key18 := bepaal_kenmerk (v_flex18); - v_cnt_kenmerk_key19 := bepaal_kenmerk (v_flex19); - v_cnt_kenmerk_key20 := bepaal_kenmerk (v_flex20); - v_cnt_kenmerk_key21 := bepaal_kenmerk (v_flex21); - v_cnt_kenmerk_key22 := bepaal_kenmerk (v_flex22); - v_cnt_kenmerk_key23 := bepaal_kenmerk (v_flex23); - v_cnt_kenmerk_key24 := bepaal_kenmerk (v_flex24); - v_cnt_kenmerk_key25 := bepaal_kenmerk (v_flex25); - - header_is_valid := 1; - END IF; - ELSE - v_count_tot := v_count_tot + 1; - - -- Controleer alle veldwaarden - v_errormsg := 'Contractnr ongeldig'; - v_nummer_intern := SUBSTR (TRIM (v_nummer_intern), 1, 30); - - v_errormsg := 'Externnr ongeldig'; - v_nummer_extern := SUBSTR (TRIM (v_nummer_extern), 1, 30); - - -- - v_errormsg := 'Contractsoort ongedefinieerd'; - v_cnt_soort := SUBSTR (TRIM (v_cnt_soort), 1, 60); - IF (v_cnt_soort IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Regel wordt overgeslagen'); - v_ongeldig := 1; - END IF; - - -- - v_errormsg := 'Beschrijving ongedefinieerd'; - v_beschrijving := SUBSTR (TRIM (v_beschrijving), 1, 50); - IF (v_beschrijving IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Regel wordt overgeslagen'); - v_ongeldig := 1; - END IF; - - v_errormsg := 'Mantelnr ongeldig'; - v_mantel_nr := SUBSTR (TRIM (v_mantel_nr), 1, 30); - - v_errormsg := 'Omschrijving ongeldig'; - v_omschrijving := SUBSTR (TRIM (v_omschrijving), 1, 1000); - - v_errormsg := 'Versie ongeldig'; - v_versie := SUBSTR (TRIM (v_versie), 1, 10); - - v_errormsg := 'Dienst ongeldig'; - v_dienst := SUBSTR (TRIM (v_dienst), 1, 60); - - -- - v_errormsg := 'Eigenaarafdeling (code) ongedefinieerd'; - v_afdeling := SUBSTR (TRIM (v_afdeling), 1, 15); - IF (v_afdeling IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Regel wordt overgeslagen'); - v_ongeldig := 1; - END IF; - - v_errormsg := 'Eigenaar (login) ongeldig'; - v_perslid_eig := SUBSTR (TRIM (v_perslid_eig), 1, 30); - - -- - v_errormsg := 'Beheerder (login) ongedefinieerd'; - v_perslid_beh := SUBSTR (TRIM (v_perslid_beh), 1, 30); - IF (v_perslid_beh IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Regel wordt overgeslagen'); - v_ongeldig := 1; - END IF; - - v_errormsg := 'Opmerking ongeldig'; - v_opmerking := SUBSTR (TRIM (v_opmerking), 1, 1000); - - -- - v_errormsg := - 'Ingansdatum ongedefinieerd/ongeldig [' || TRIM (v_datum_ingang) || ']'; - v_d_datum_ingang := - fac.safe_to_date (TRIM (v_datum_ingang), 'dd-mm-yyyy'); - IF (v_d_datum_ingang IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Regel wordt overgeslagen'); - v_ongeldig := 1; - END IF; - - -- - v_errormsg := - 'Rappeldatum ongeldig [' || TRIM (v_datum_rappel) || ']'; - v_d_datum_rappel := - fac.safe_to_date (TRIM (v_datum_rappel), 'dd-mm-yyyy'); - IF (v_datum_rappel IS NOT NULL AND v_d_datum_rappel IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Regel wordt overgeslagen'); - v_ongeldig := 1; - END IF; - - -- - v_errormsg := - 'Opzegdatum ongeldig [' || TRIM (v_datum_opzeg) || ']'; - v_d_datum_opzeg := - fac.safe_to_date (TRIM (v_datum_opzeg), 'dd-mm-yyyy'); - IF (v_datum_opzeg IS NOT NULL AND v_d_datum_opzeg IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Regel wordt overgeslagen'); - v_ongeldig := 1; - END IF; - - -- - v_errormsg := 'Einddatum ongedefinieerd/ongeldig [' || TRIM (v_datum_eind) || ']'; - v_d_datum_eind := - fac.safe_to_date (TRIM (v_datum_eind), 'dd-mm-yyyy'); - IF (v_d_datum_eind IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Regel wordt overgeslagen'); - v_ongeldig := 1; - END IF; - - -- - v_errormsg := 'Bedrijfnaam ongedefinieerd'; - v_bedrijf_naam := SUBSTR (TRIM (v_bedrijf_naam), 1, 60); - IF (v_bedrijf_naam IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Regel wordt overgeslagen'); - v_ongeldig := 1; - END IF; - - v_errormsg := 'Contactnaam ongeldig'; - v_contact_naam := SUBSTR (TRIM (v_contact_naam), 1, 30); - - -- - v_errormsg := 'Kostenplaatscode ongeldig'; - v_kpn_code := SUBSTR (TRIM (v_kpn_code), 1, 30); - IF (v_kpn_code IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Regel wordt overgeslagen'); - v_ongeldig := 1; - END IF; - - -- - v_errormsg := - 'Contractbedrag ongeldig ]' || TRIM (v_bedrag) || ']'; - v_n_bedrag := fac.safe_to_number (v_bedrag); - - IF (v_bedrag IS NOT NULL AND v_n_bedrag IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Contractbedrag wordt genegeerd'); - END IF; - - -- - v_errormsg := - 'Termijnbedrag ongeldig ]' || TRIM (v_bedrag_termijn) || ']'; - v_n_bedrag_termijn := fac.safe_to_number (v_bedrag_termijn); - - IF (v_bedrag_termijn IS NOT NULL AND v_n_bedrag_termijn IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Termijnbedrag wordt genegeerd'); - END IF; - - -- - v_errormsg := 'Uurtarief ongeldig ]' || TRIM (v_uurtarief) || ']'; - v_n_uurtarief := fac.safe_to_number (v_uurtarief); - - IF (v_uurtarief IS NOT NULL AND v_n_uurtarief IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Uurtarief wordt genegeerd'); - END IF; - - -- - v_errormsg := 'Korting ongeldig ]' || TRIM (v_korting) || ']'; - v_n_korting := fac.safe_to_number (v_korting); - - IF (v_korting IS NOT NULL AND v_n_korting IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Korting wordt genegeerd'); - END IF; - - v_errormsg := 'Gebouwcode ongeldig'; - v_gebouwcode := SUBSTR (TRIM (v_gebouwcode), 1, 12); - - v_errormsg := 'Verlenging ongeldig'; - v_verlengen := SUBSTR (TRIM (v_verlengen), 1, 1); - - -- De rest alleen ff trimmen. - v_flex1 := TRIM (v_flex1); - v_flex2 := TRIM (v_flex2); - v_flex3 := TRIM (v_flex3); - v_flex4 := TRIM (v_flex4); - v_flex5 := TRIM (v_flex5); - v_flex6 := TRIM (v_flex6); - v_flex7 := TRIM (v_flex7); - v_flex8 := TRIM (v_flex8); - v_flex9 := TRIM (v_flex9); - v_flex10 := TRIM (v_flex10); - v_flex11 := TRIM (v_flex11); - v_flex12 := TRIM (v_flex12); - v_flex13 := TRIM (v_flex13); - v_flex14 := TRIM (v_flex14); - v_flex15 := TRIM (v_flex15); - v_flex16 := TRIM (v_flex16); - v_flex17 := TRIM (v_flex17); - v_flex18 := TRIM (v_flex18); - v_flex19 := TRIM (v_flex19); - v_flex20 := TRIM (v_flex20); - v_flex21 := TRIM (v_flex21); - v_flex22 := TRIM (v_flex22); - v_flex23 := TRIM (v_flex23); - v_flex24 := TRIM (v_flex24); - v_flex25 := TRIM (v_flex25); - - -- 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 flex gevuld met =; zoniet, dan is - -- flex gevuld met ! - -- NB. Een NULL-waarde resulteert NIET in het wissen van een - -- kenmerkveld (bijwerken kan wel, maar wissen dus niet)! - INSERT INTO fac_imp_cnt ( - nummer_intern, - nummer_extern, - cnt_soort, - beschrijving, - mantel_nr, - omschrijving, - afdeling, - perslid_eig, - perslid_beh, - opmerking, - datum_ingang, - datum_eind, - datum_opzeg, - datum_rappel, - bedrijf_naam, - contact_naam, - kpn_code, - bedrag, - bedrag_termijn, - uurtarief, - korting, - gebouwcode, - verlengen, - versie, - dienst, - flex1, - flex2, - flex3, - flex4, - flex5, - flex6, - flex7, - flex8, - flex9, - flex10, - flex11, - flex12, - flex13, - flex14, - flex15, - flex16, - flex17, - flex18, - flex19, - flex20, - flex21, - flex22, - flex23, - flex24, - flex25 - ) - VALUES ( - v_nummer_intern, - v_nummer_extern, - v_cnt_soort, - v_beschrijving, - v_mantel_nr, - v_omschrijving, - v_afdeling, - v_perslid_eig, - v_perslid_beh, - v_opmerking, - v_d_datum_ingang, - v_d_datum_eind, - v_d_datum_opzeg, - v_d_datum_rappel, - v_bedrijf_naam, - v_contact_naam, - v_kpn_code, - v_n_bedrag, - v_n_bedrag_termijn, - v_n_uurtarief, - v_n_korting, - v_gebouwcode, - v_verlengen, - v_versie, - v_dienst, - DECODE (v_cnt_kenmerk_key1, NULL, v_flex1, TO_CHAR (v_cnt_kenmerk_key1) || '=' || SUBSTR (v_flex1, 1, 200)), - DECODE (v_cnt_kenmerk_key2, NULL, v_flex2, TO_CHAR (v_cnt_kenmerk_key2) || '=' || SUBSTR (v_flex2, 1, 200)), - DECODE (v_cnt_kenmerk_key3, NULL, v_flex3, TO_CHAR (v_cnt_kenmerk_key3) || '=' || SUBSTR (v_flex3, 1, 200)), - DECODE (v_cnt_kenmerk_key4, NULL, v_flex4, TO_CHAR (v_cnt_kenmerk_key4) || '=' || SUBSTR (v_flex4, 1, 200)), - DECODE (v_cnt_kenmerk_key5, NULL, v_flex5, TO_CHAR (v_cnt_kenmerk_key5) || '=' || SUBSTR (v_flex5, 1, 200)), - DECODE (v_cnt_kenmerk_key6, NULL, v_flex6, TO_CHAR (v_cnt_kenmerk_key6) || '=' || SUBSTR (v_flex6, 1, 200)), - DECODE (v_cnt_kenmerk_key7, NULL, v_flex7, TO_CHAR (v_cnt_kenmerk_key7) || '=' || SUBSTR (v_flex7, 1, 200)), - DECODE (v_cnt_kenmerk_key8, NULL, v_flex8, TO_CHAR (v_cnt_kenmerk_key8) || '=' || SUBSTR (v_flex8, 1, 200)), - DECODE (v_cnt_kenmerk_key9, NULL, v_flex9, TO_CHAR (v_cnt_kenmerk_key9) || '=' || SUBSTR (v_flex9, 1, 200)), - DECODE (v_cnt_kenmerk_key10, NULL, v_flex10, TO_CHAR (v_cnt_kenmerk_key10) || '=' || SUBSTR (v_flex10, 1, 200)), - DECODE (v_cnt_kenmerk_key11, NULL, v_flex11, TO_CHAR (v_cnt_kenmerk_key11) || '=' || SUBSTR (v_flex11, 1, 200)), - DECODE (v_cnt_kenmerk_key12, NULL, v_flex12, TO_CHAR (v_cnt_kenmerk_key12) || '=' || SUBSTR (v_flex12, 1, 200)), - DECODE (v_cnt_kenmerk_key13, NULL, v_flex13, TO_CHAR (v_cnt_kenmerk_key13) || '=' || SUBSTR (v_flex13, 1, 200)), - DECODE (v_cnt_kenmerk_key14, NULL, v_flex14, TO_CHAR (v_cnt_kenmerk_key14) || '=' || SUBSTR (v_flex14, 1, 200)), - DECODE (v_cnt_kenmerk_key15, NULL, v_flex15, TO_CHAR (v_cnt_kenmerk_key15) || '=' || SUBSTR (v_flex15, 1, 200)), - DECODE (v_cnt_kenmerk_key16, NULL, v_flex16, TO_CHAR (v_cnt_kenmerk_key16) || '=' || SUBSTR (v_flex16, 1, 200)), - DECODE (v_cnt_kenmerk_key17, NULL, v_flex17, TO_CHAR (v_cnt_kenmerk_key17) || '=' || SUBSTR (v_flex17, 1, 200)), - DECODE (v_cnt_kenmerk_key18, NULL, v_flex18, TO_CHAR (v_cnt_kenmerk_key18) || '=' || SUBSTR (v_flex18, 1, 200)), - DECODE (v_cnt_kenmerk_key19, NULL, v_flex19, TO_CHAR (v_cnt_kenmerk_key19) || '=' || SUBSTR (v_flex19, 1, 200)), - DECODE (v_cnt_kenmerk_key20, NULL, v_flex20, TO_CHAR (v_cnt_kenmerk_key20) || '=' || SUBSTR (v_flex20, 1, 200)), - DECODE (v_cnt_kenmerk_key21, NULL, v_flex21, TO_CHAR (v_cnt_kenmerk_key21) || '=' || SUBSTR (v_flex21, 1, 200)), - DECODE (v_cnt_kenmerk_key22, NULL, v_flex22, TO_CHAR (v_cnt_kenmerk_key22) || '=' || SUBSTR (v_flex22, 1, 200)), - DECODE (v_cnt_kenmerk_key23, NULL, v_flex23, TO_CHAR (v_cnt_kenmerk_key23) || '=' || SUBSTR (v_flex23, 1, 200)), - DECODE (v_cnt_kenmerk_key24, NULL, v_flex24, TO_CHAR (v_cnt_kenmerk_key24) || '=' || SUBSTR (v_flex24, 1, 200)), - DECODE (v_cnt_kenmerk_key25, NULL, v_flex25, TO_CHAR (v_cnt_kenmerk_key25) || '=' || SUBSTR (v_flex25, 1, 200)) + IF v_flx IS NULL + THEN + v_flexval := SUBSTR(TRIM(p_flex_waarde), 1, 255); + ELSE + v_flexval := SUBSTR(TRIM(p_flex_waarde), 1, 200); + IF LENGTH(TRIM(p_flex_waarde)) > 200 + THEN + fac.imp_writelog( p_import_key, 'W' + , p_aanduiding || p_flex_naam || ' - Aangepast ivm lengte groter dan 255' + , p_import_index ); + END IF; + v_flexval := TO_CHAR(v_flx) || '=' || v_flexval; + END IF; - COMMIT; - v_count_imp := v_count_imp + 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; + RETURN v_flexval; + END; -- kenmerk_waarde - 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', - 'Contracten/#ingelezen importregels: ' || TO_CHAR (v_count_tot), - '' - ); - fac.imp_writelog ( - p_import_key, - 'S', - 'Contracten/#ongeldige niet ingelezen importregels: ' - || TO_CHAR (v_count_tot - v_count_imp), - '' - ); - END IF; +BEGIN + v_errormsg := 'Fout inlezen header '; + SELECT REPLACE(UPPER(fac_imp_csv_col01 ||';'|| fac_imp_csv_col02 ||';'|| fac_imp_csv_col03 ||';'|| fac_imp_csv_col04 ||';'|| fac_imp_csv_col05 ||';'|| + fac_imp_csv_col06 ||';'|| fac_imp_csv_col07 ||';'|| fac_imp_csv_col08 ||';'|| fac_imp_csv_col09 ||';'|| fac_imp_csv_col10 ||';'|| + fac_imp_csv_col11 ||';'|| fac_imp_csv_col12 ||';'|| fac_imp_csv_col13 ||';'|| fac_imp_csv_col14 ||';'|| fac_imp_csv_col15 ||';'|| + fac_imp_csv_col16 ||';'|| fac_imp_csv_col17 ||';'|| fac_imp_csv_col18 ||';'|| fac_imp_csv_col19 ||';'|| fac_imp_csv_col20 ||';'|| + fac_imp_csv_col21 ||';'|| fac_imp_csv_col22 ||';'|| fac_imp_csv_col23 ||';'|| fac_imp_csv_col24 ||';'|| fac_imp_csv_col25 ||';'|| + fac_imp_csv_col26 ||';'|| fac_imp_csv_col27 ||';'|| fac_imp_csv_col28 ||';'|| fac_imp_csv_col29 + ), ' ', '') + , fac_imp_csv_col30, fac_imp_csv_col31, fac_imp_csv_col32, fac_imp_csv_col33, fac_imp_csv_col34 + , fac_imp_csv_col35, fac_imp_csv_col36, fac_imp_csv_col37, fac_imp_csv_col38, fac_imp_csv_col39 + , fac_imp_csv_col40, fac_imp_csv_col41, fac_imp_csv_col42, fac_imp_csv_col43, fac_imp_csv_col44 + , fac_imp_csv_col45, fac_imp_csv_col46, fac_imp_csv_col47, fac_imp_csv_col48, fac_imp_csv_col49 + , fac_imp_csv_col50, fac_imp_csv_col51, fac_imp_csv_col52, fac_imp_csv_col53, fac_imp_csv_col54 + INTO v_header_csv -- standaard header + , v_flex_naam_01, v_flex_naam_02, v_flex_naam_03, v_flex_naam_04, v_flex_naam_05 -- kenmerk kolom namen + , v_flex_naam_06, v_flex_naam_07, v_flex_naam_08, v_flex_naam_09, v_flex_naam_10 + , v_flex_naam_11, v_flex_naam_12, v_flex_naam_13, v_flex_naam_14, v_flex_naam_15 + , v_flex_naam_16, v_flex_naam_17, v_flex_naam_18, v_flex_naam_19, v_flex_naam_20 + , v_flex_naam_21, v_flex_naam_22, v_flex_naam_23, v_flex_naam_24, v_flex_naam_25 + FROM fac_imp_csv + WHERE fac_imp_csv_index = 1 + AND fac_import_key = p_import_key; + + -- Eerst opruiming + DELETE FROM fac_imp_cnt; - COMMIT; + IF (v_header LIKE v_header_csv || '%') + THEN + v_header_is_valid := 1; + FOR rec IN c1 + LOOP + BEGIN + v_count_rec := v_count_rec + 1; + v_aanduiding := '[' || rec.contractnr || '|' || rec.versie || '] '; + + -- CSV-kolom A: Controleer het contractnummer op lengte + v_nummer_intern := SUBSTR(TRIM(rec.contractnr), 1, 30); + IF LENGTH(TRIM(rec.contractnr)) > 30 + THEN + fac.imp_writelog( p_import_key, 'W', v_aanduiding || 'ContractRr - Aangepast ivm lengte groter dan 30' + , rec.fac_imp_csv_index || ' - ' || rec.contractnr || ' wordt: ' || v_nummer_intern + ); + END IF; + + -- CSV-kolom B: Controleer de versie op lengte + v_versie := SUBSTR(TRIM(rec.versie), 1, 10); + IF LENGTH(TRIM(rec.versie)) > 10 + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Versie - Aangepast ivm lengte groter dan 10' + , rec.fac_imp_csv_index || ' - ' || rec.versie || ' wordt: ' || v_versie + ); + END IF; + + -- CSV-kolom C: Controleer het extern contractnummer op lengte + v_nummer_extern := SUBSTR(TRIM(rec.externnr), 1, 30); + IF LENGTH(TRIM(rec.externnr)) > 30 + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'ExternNr - Aangepast ivm lengte groter dan 30' + , rec.fac_imp_csv_index || ' - ' || rec.externnr || ' wordt: ' || v_nummer_extern + ); + END IF; + + -- CSV-kolom D: Controleer de lengte van het contractsoort en of het ingevuld is + v_cnt_soort := SUBSTR(TRIM(rec.contractsoort), 1, 60); + BEGIN + SELECT ins_discipline_key + INTO v_ref_key + FROM cnt_discipline + WHERE ins_discipline_omschrijving = v_cnt_soort + AND ins_discipline_verwijder IS NULL; + EXCEPTION + WHEN NO_DATA_FOUND THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Contractsoort - Is onbekend' + , rec.fac_imp_csv_index || ' - ' || v_cnt_soort || ', Regel wordt overgeslagen' + ); + v_ongeldig := 1; + END; + + -- CSV-kolom E: Controleer de lengte van de contract beschrijving + v_beschrijving := SUBSTR(TRIM(rec.beschrijving),1,50); + IF LENGTH(TRIM(rec.beschrijving)) > 50 + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Beschrijving - Aangepast ivm lengte groter dan 50' + , rec.fac_imp_csv_index || ' - ' || rec.beschrijving || ' wordt: ' || v_beschrijving + ); + ELSE + IF v_beschrijving IS NULL + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Beschrijving - Is niet ingevuld' + , rec.fac_imp_csv_index || ' - Regel wordt overgeslagen' + ); + v_ongeldig := 1; + END IF; + END IF; + + -- CSV-kolom F: Controleer de lengte van het mantelcontract nummer + v_mantel_nr := SUBSTR(TRIM(rec.mantelnr), 1, 30); + IF LENGTH(TRIM(rec.mantelnr)) > 30 + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'MantelNr - Aangepast ivm lengte groter dan 30' + , rec.fac_imp_csv_index || ' - ' || rec.mantelnr || ' wordt: ' || v_mantel_nr + ); + END IF; + + -- CSV-kolom G: Controleer de lengte van het mantelcontract versie + v_mantel_nr_versie := SUBSTR(TRIM(v_mantel_nr_versie), 1, 10); + IF LENGTH(TRIM(rec.mantelnr_versie)) > 10 + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'MantelNr_versie - Aangepast ivm lengte groter dan 10' + , rec.fac_imp_csv_index || ' - ' || rec.mantelnr_versie || ' wordt: ' || v_mantel_nr_versie + ); + END IF; + + -- CSV-kolom H: Controleer de lengte van contract omschrijving + v_omschrijving := SUBSTR(TRIM(rec.omschrijving), 1, 1000); + IF LENGTH(TRIM(rec.omschrijving)) > 1000 + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Omschrijving - Lengte (' || TO_CHAR(LENGTH(TRIM(rec.omschrijving))) || ') aangepast tot 1000' + , rec.fac_imp_csv_index + ); + END IF; + + -- CSV-kolom I: Controleer of er een geldige dienst is ingevuld (geen dienst is ook goed) + v_dienst := SUBSTR(TRIM(rec.dienst), 1, 60); + IF v_dienst IS NOT NULL + THEN + BEGIN + SELECT prs_dienst_key + INTO v_ref_key + FROM prs_dienst + WHERE prs_dienst_omschrijving = v_dienst; + EXCEPTION + WHEN NO_DATA_FOUND THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Dienst - Is onbekend' + , rec.fac_imp_csv_index || ' - ' || v_dienst || ', Regel wordt overgeslagen' + ); + v_ongeldig := 1; + END; + END IF; + + -- CSV-kolom J: Controleer of de afdelingscode bestaat + v_afdeling := SUBSTR(TRIM(rec.eigenaar_afd), 1, 15); + BEGIN + SELECT prs_afdeling_key + INTO v_ref_key + FROM prs_afdeling + WHERE prs_afdeling_upper = UPPER(v_afdeling) + AND prs_afdeling_verwijder IS NULL; + EXCEPTION + WHEN NO_DATA_FOUND THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Eigenaar_afd - Is onbekend' + , rec.fac_imp_csv_index || ' - ' || v_afdeling || ', Regel wordt overgeslagen' + ); + v_ongeldig := 1; + END; + + -- CSV-kolom K: Controleer of er een geldig eigenaar mailadres is ingevuld (mag leeg zijn) + v_perslid_eig := SUBSTR(TRIM(rec.eigenaar_email), 1, 200); + IF v_perslid_eig IS NOT NULL + THEN + BEGIN + SELECT prs_perslid_key + INTO v_ref_key + FROM prs_perslid + WHERE prs_perslid_email = v_perslid_eig; + EXCEPTION + WHEN NO_DATA_FOUND THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Eigenaar_email - Is onbekend' + , rec.fac_imp_csv_index || ' - ' || v_perslid_eig || ', Regel wordt overgeslagen' + ); + v_ongeldig := 1; + END; + END IF; + + -- CSV-kolom L: Controleer of er een geldig beheerder mailadres is ingevuld (mag niet leeg zijn) + v_perslid_beh := SUBSTR(TRIM(rec.beheerder_email), 1, 200); + IF v_perslid_beh IS NULL + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Beheerder_email - Is niet ingevuld' + , rec.fac_imp_csv_index || ', Regel wordt overgeslagen' + ); + v_ongeldig := 1; + ELSE + BEGIN + SELECT prs_perslid_key + INTO v_ref_key + FROM prs_perslid + WHERE prs_perslid_email = v_perslid_beh; + EXCEPTION + WHEN NO_DATA_FOUND THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Beheerder_email - Is onbekend' + , rec.fac_imp_csv_index || ' - ' || v_perslid_beh || ', Regel wordt overgeslagen' + ); + v_ongeldig := 1; + END; + END IF; + + -- CSV-kolom M: Controleeer de lengte van contract opmerking + v_opmerking := SUBSTR(TRIM(rec.opmerking), 1, 1000); + IF LENGTH(TRIM(rec.opmerking)) > 1000 + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Opmerking - Lengte (' || TO_CHAR(LENGTH(TRIM(rec.opmerking))) || ') aangepast tot 1000' + , rec.fac_imp_csv_index + ); + END IF; + + -- CSV-kolom N: Controleer ingangsdatum op geldig format en aanwezigheid + v_ingangsdatum := fac.safe_to_date(TRIM(rec.ingangsdatum), 'dd-mm-yyyy'); + IF v_ingangsdatum IS NULL + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Ingangsdatum - Is niet aanwezig of ongeldig' + , rec.fac_imp_csv_index || ' - ' || rec.ingangsdatum || ', Regel wordt overgeslagen' + ); + v_ongeldig := 1; + END IF; + + -- CSV-kolom O: Controleer rappeldatum op geldig format + v_rappeldatum := fac.safe_to_date(TRIM(rec.rappeldatum), 'dd-mm-yyyy'); + IF v_rappeldatum IS NULL AND rec.rappeldatum IS NOT NULL + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Rappeldatum - Is ongeldig' + , rec.fac_imp_csv_index || ' - ' || rec.rappeldatum || ', Regel wordt overgeslagen' + ); + v_ongeldig := 1; + END IF; + + -- CSV-kolom P: Controleer opzegdatum op geldig format + v_opzegdatum := fac.safe_to_date(TRIM(rec.opzegdatum), 'dd-mm-yyyy'); + IF v_opzegdatum IS NULL AND rec.opzegdatum IS NOT NULL + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Opzegdatum - Is ongeldig' + , rec.fac_imp_csv_index || ' - ' || rec.opzegdatum || ', Regel wordt overgeslagen' + ); + v_ongeldig := 1; + END IF; + + -- CSV-kolom Q: Controleer einddatum op geldig format en aanwezigheid + v_einddatum := fac.safe_to_date(TRIM(rec.einddatum), 'dd-mm-yyyy'); + IF v_einddatum IS NULL + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Einddatum - Is niet aanwezig of ongeldig' + , rec.fac_imp_csv_index || ' - ' || rec.einddatum || ', Regel wordt overgeslagen' + ); + v_ongeldig := 1; + END IF; + + -- CSV-kolom R: Controle soort contractpartij + v_srtcontact := SUBSTR(TRIM(rec.soort_contactpartij), 1, 1); + IF v_srtcontact IS NULL OR v_srtcontact NOT IN ('B','P') + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Soort_contactpartij - Is niet aanwezig of ongeldig' + , rec.fac_imp_csv_index || ' - ' || rec.soort_contactpartij || ', Regel wordt overgeslagen' + ); + v_ongeldig := 1; + END IF; + + -- CSV-kolom S: Controle lengte bedrijfsnaam + IF v_srtcontact = 'B' + THEN + v_bedrijfnaam := SUBSTR(TRIM(rec.bedrijfnaam), 1, 60); -- naam van bedrijf: prs_bedrijf.prs_bedrijf_naam + IF LENGTH(TRIM(rec.bedrijfnaam)) > 60 + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Bedrijfnaam - Aangepast ivm lengte groter dan 60' + , rec.fac_imp_csv_index || ' - ' || rec.bedrijfnaam || ' wordt: ' || v_bedrijfnaam + ); + END IF; + ELSE + v_bedrijfnaam := SUBSTR(TRIM(rec.bedrijfnaam), 1, 200); -- emailadres van persoon: prs_perslid.prs_perslid_email + IF LENGTH(TRIM(rec.bedrijfnaam)) > 200 + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Bedrijfnaam - Aangepast ivm lengte groter dan 200' + , rec.fac_imp_csv_index || ' - ' || rec.bedrijfnaam + ); + END IF; + END IF; + IF v_bedrijfnaam IS NULL + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Bedrijfnaam - Is niet aanwezig' + , rec.fac_imp_csv_index + ); + v_ongeldig := 1; + END IF; + + -- CSV-kolom T: Controle contact mailadres + v_contactnaam := SUBSTR(TRIM(rec.contactnaam), 1, 200); + IF LENGTH(TRIM(rec.contactnaam)) > 200 + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Contactnaam - Aangepast ivm lengte groter dan 200' + , rec.fac_imp_csv_index + ); + END IF; + + -- CSV-kolom U: Controle Kostenplaatscode + v_kpn_code := SUBSTR(TRIM(rec.kostenplaatscode), 1, 30); + BEGIN + SELECT prs_kostenplaats_key + INTO v_ref_key + FROM prs_kostenplaats + WHERE prs_kostenplaats_nr = v_kpn_code + AND prs_kostenplaats_verwijder IS NULL; + EXCEPTION + WHEN NO_DATA_FOUND THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'KostenplaatsCode - Is onbekend of niet ingevuld' + , rec.fac_imp_csv_index || ' - ' || v_kpn_code || ', Regel wordt overgeslagen' + ); + v_ongeldig := 1; + END; + + -- CSV-kolom V: Controle Kostensoortcode + v_kostensoort_code := SUBSTR(TRIM(rec.kostensoortcode), 1, 60); + IF LENGTH(TRIM(rec.kostensoortcode)) IS NOT NULL + THEN + BEGIN + SELECT prs_kostensoort_key + INTO v_ref_key + FROM prs_kostensoort + WHERE prs_kostensoort_upper = UPPER(v_kostensoort_code) + AND prs_kostensoort_verwijder IS NULL; + EXCEPTION + WHEN NO_DATA_FOUND THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'KostensoortCode - Is onbekend of niet ingevuld' + , rec.fac_imp_csv_index || ' - ' || v_kostensoort_code || ', Regel wordt overgeslagen' + ); + v_ongeldig := 1; + END; + END IF; + + -- CSV-kolom W: Controle of contractbedrag geldig is + v_bedrag := fac.safe_to_number(rec.contractbedrag); + IF v_bedrag IS NULL AND rec.contractbedrag IS NOT NULL + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Contractbedrag - Wordt genegeerd' + , rec.fac_imp_csv_index || ' - ' || rec.contractbedrag + ); + END IF; + + -- CSV-kolom X: Controle of termijnbedrag geldig is + v_bedrag_termijn := fac.safe_to_number(rec.termijnbedrag); + IF v_bedrag_termijn IS NULL AND rec.termijnbedrag IS NOT NULL + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Termijnbedrag - Wordt genegeerd' + , rec.fac_imp_csv_index || ' - ' || rec.termijnbedrag + ); + END IF; + + -- CSV-kolom Y: Controle of uurtarief geldig is + v_uurtarief := fac.safe_to_number(rec.uurtarief); + IF v_uurtarief IS NULL AND rec.uurtarief IS NOT NULL + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Uurtrief - Wordt genegeerd' + , rec.fac_imp_csv_index || ' - ' || rec.uurtarief + ); + END IF; + + -- CSV-kolom Z: Controle of korting geldig is + v_korting := fac.safe_to_number(rec.korting); + IF v_korting IS NULL AND rec.korting IS NOT NULL + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Korting - Wordt genegeerd' + , rec.fac_imp_csv_index || ' - ' || rec.korting + ); + END IF; + + -- CSV-kolom AA: Controle ScopeType + IF TRIM(rec.locatiegebouw_code) IS NULL + THEN + v_scope_type := NULL; + ELSE + v_scope_type := SUBSTR(TRIM(rec.scopetype), 1, 1); + IF v_scope_type IS NULL OR v_scope_type NOT IN ('L', 'G') + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'ScopeType - Is niet aanwezig of ongeldig' + , rec.fac_imp_csv_index || ' - ' || v_scope_type || ', Regel wordt overgeslagen' + ); + v_ongeldig := 1; + END IF; + END IF; + + -- CSV-kolom AB: Controle Locatiegebouw_code + IF v_scope_type IS NOT NULL + THEN + IF v_scope_type = 'L' + THEN + v_gebouwcode := SUBSTR(TRIM(rec.locatiegebouw_code), 1, 10); + IF LENGTH(TRIM(rec.locatiegebouw_code)) > 10 + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Locatiegebouw_code - Aangepast ivm lengte groter dan 10 voor locatie' + , rec.fac_imp_csv_index || ' - ' || rec.locatiegebouw_code || ' wordt: ' || v_gebouwcode + ); + END IF; + END IF; + IF v_scope_type = 'G' + THEN + v_gebouwcode := SUBSTR(TRIM(rec.locatiegebouw_code), 1, 12); + IF LENGTH(TRIM(rec.locatiegebouw_code)) > 12 + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Locatiegebouw_code - Aangepast ivm lengte groter dan 12 voor gebouw' + , rec.fac_imp_csv_index || ' - ' || rec.locatiegebouw_code || ' wordt: ' || v_gebouwcode + ); + END IF; + END IF; + ELSE + v_gebouwcode := NULL; + END IF; + + -- CSV-kolom AC: Controle op geldige waarde voor verlengen + v_verlengen := fac.safe_to_number(rec.verlengen); + IF v_verlengen NOT IN (0,1,2,3,5) + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || 'Verlengen - Ongeldige waarde' + , rec.fac_imp_csv_index || ' - ' || rec.verlengen || ', Regel wordt overgeslagen' + ); + v_ongeldig := 1; + END IF; + + -- De flexkenmerkwaarden + v_cnt_kenmerk_01 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_01, rec.flex_01); + v_cnt_kenmerk_02 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_02, rec.flex_02); + v_cnt_kenmerk_03 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_03, rec.flex_03); + v_cnt_kenmerk_04 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_04, rec.flex_04); + v_cnt_kenmerk_05 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_05, rec.flex_05); + v_cnt_kenmerk_06 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_06, rec.flex_06); + v_cnt_kenmerk_07 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_07, rec.flex_07); + v_cnt_kenmerk_08 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_08, rec.flex_08); + v_cnt_kenmerk_09 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_09, rec.flex_09); + v_cnt_kenmerk_10 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_10, rec.flex_10); + v_cnt_kenmerk_11 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_11, rec.flex_11); + v_cnt_kenmerk_12 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_12, rec.flex_12); + v_cnt_kenmerk_13 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_13, rec.flex_13); + v_cnt_kenmerk_14 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_14, rec.flex_14); + v_cnt_kenmerk_15 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_15, rec.flex_15); + v_cnt_kenmerk_16 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_16, rec.flex_16); + v_cnt_kenmerk_17 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_17, rec.flex_17); + v_cnt_kenmerk_18 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_18, rec.flex_18); + v_cnt_kenmerk_19 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_19, rec.flex_19); + v_cnt_kenmerk_20 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_20, rec.flex_20); + v_cnt_kenmerk_21 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_21, rec.flex_21); + v_cnt_kenmerk_22 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_22, rec.flex_22); + v_cnt_kenmerk_23 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_23, rec.flex_23); + v_cnt_kenmerk_24 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_24, rec.flex_24); + v_cnt_kenmerk_25 := kenmerk_waarde(p_import_key, rec.fac_imp_csv_index, v_aanduiding, v_flex_naam_25, rec.flex_25); + + -- 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 flex gevuld met =; zoniet, dan is + -- flex gevuld met ! + -- NB. Een NULL-waarde resulteert NIET in het wissen van een + -- kenmerkveld (bijwerken kan wel, maar wissen dus niet)! + INSERT INTO fac_imp_cnt + ( nummer_intern + , versie + , nummer_extern + , cnt_soort + , beschrijving + , mantel_nr + , mantel_nr_versie + , omschrijving + , dienst + , afdeling + , perslid_eig + , perslid_beh + , opmerking + , datum_ingang + , datum_rappel + , datum_opzeg + , datum_eind + , soortcontact + , bedrijf_naam + , contact_naam + , kpn_code + , kostensoort + , bedrag + , bedrag_termijn + , uurtarief + , korting + , scope + , gebouwcode + , verlengen + , flex1, flex2, flex3, flex4, flex5 + , flex6, flex7, flex8, flex9, flex10 + , flex11, flex12, flex13, flex14, flex15 + , flex16, flex17, flex18, flex19, flex20 + , flex21, flex22, flex23, flex24, flex25 + ) + VALUES ( v_nummer_intern + , v_versie + , v_nummer_extern + , v_cnt_soort + , v_beschrijving + , v_mantel_nr + , v_mantel_nr_versie + , v_omschrijving + , v_dienst + , v_afdeling + , v_perslid_eig + , v_perslid_beh + , v_opmerking + , v_ingangsdatum + , v_rappeldatum + , v_opzegdatum + , v_einddatum + , v_srtcontact + , v_bedrijfnaam + , v_contactnaam + , v_kpn_code + , v_kostensoort_code + , v_bedrag + , v_bedrag_termijn + , v_uurtarief + , v_korting + , v_scope_type + , v_gebouwcode + , v_verlengen + , v_cnt_kenmerk_01, v_cnt_kenmerk_02, v_cnt_kenmerk_03, v_cnt_kenmerk_04, v_cnt_kenmerk_05 + , v_cnt_kenmerk_06, v_cnt_kenmerk_07, v_cnt_kenmerk_08, v_cnt_kenmerk_09, v_cnt_kenmerk_10 + , v_cnt_kenmerk_11, v_cnt_kenmerk_12, v_cnt_kenmerk_13, v_cnt_kenmerk_14, v_cnt_kenmerk_15 + , v_cnt_kenmerk_16, v_cnt_kenmerk_17, v_cnt_kenmerk_18, v_cnt_kenmerk_19, v_cnt_kenmerk_20 + , v_cnt_kenmerk_21, v_cnt_kenmerk_22, v_cnt_kenmerk_23, v_cnt_kenmerk_24, v_cnt_kenmerk_25 + ); + COMMIT; + v_count_imp := v_count_imp + 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; + END LOOP; + END IF; + + IF (v_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' + , 'Contracten/#ingelezen importregels: ' || TO_CHAR (v_count_rec) + , ''); + fac.imp_writelog ( p_import_key, 'S' + , 'Contracten/#ongeldige niet ingelezen importregels: ' || TO_CHAR (v_count_rec - v_count_imp) + , ''); + 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 contracten afgebroken!'); + 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 contracten afgebroken!'); END fac_import_cnt; / CREATE OR REPLACE PROCEDURE fac_update_cnt (p_import_key IN NUMBER) AS - -- Cursor zoekt direct alle afgeleide gegevens. - -- Een leeg veld betekent dus: óf deze regel overslaan, óf nieuwe data toevoegen. - CURSOR c1 - IS - SELECT a.nummer_intern, - a.nummer_extern, - a.cnt_soort, - dp.cnt_srtcontract_type, - a.ins_discipline_key, - a.beschrijving, - a.mantel_nr, - a.mantel_key, - a.omschrijving, - a.versie, - a.dienst, - a.prs_dienst_key, - a.afdeling, - a.prs_afdeling_key, - a.perslid_eig, - a.prs_perslid_key_eig, - a.prs_afdeling_key_eig, - a.perslid_beh, - a.prs_perslid_key_beh, - a.opmerking, - a.datum_ingang, - a.datum_eind, - a.datum_opzeg, - a.datum_rappel, - a.bedrijf_naam, - a.prs_bedrijf_key, - a.contact_naam, - cp.prs_contactpersoon_key, - a.kpn_code, - a.prs_kostenplaats_key, - a.bedrag, - a.bedrag_termijn, - a.uurtarief, - a.korting, - a.gebouwcode locgeb_code, - COALESCE (l.alg_locatie_key, g.alg_gebouw_key) plaats_key, - DECODE (l.alg_locatie_key, - NULL, DECODE (g.alg_gebouw_key, NULL, NULL, 'G'), - 'L') - plaats_code, - a.verlengen, - a.flex1 cnt_kenmerkwaarde1, - a.flex2 cnt_kenmerkwaarde2, - a.flex3 cnt_kenmerkwaarde3, - a.flex4 cnt_kenmerkwaarde4, - a.flex5 cnt_kenmerkwaarde5, - a.flex6 cnt_kenmerkwaarde6, - a.flex7 cnt_kenmerkwaarde7, - a.flex8 cnt_kenmerkwaarde8, - a.flex9 cnt_kenmerkwaarde9, - a.flex10 cnt_kenmerkwaarde10, - a.flex11 cnt_kenmerkwaarde11, - a.flex12 cnt_kenmerkwaarde12, - a.flex13 cnt_kenmerkwaarde13, - a.flex14 cnt_kenmerkwaarde14, - a.flex15 cnt_kenmerkwaarde15, - a.flex16 cnt_kenmerkwaarde16, - a.flex17 cnt_kenmerkwaarde17, - a.flex18 cnt_kenmerkwaarde18, - a.flex19 cnt_kenmerkwaarde19, - a.flex20 cnt_kenmerkwaarde20, - a.flex21 cnt_kenmerkwaarde21, - a.flex22 cnt_kenmerkwaarde22, - a.flex23 cnt_kenmerkwaarde23, - a.flex24 cnt_kenmerkwaarde24, - a.flex25 cnt_kenmerkwaarde25 - FROM (SELECT i.nummer_intern, - i.nummer_extern, - i.cnt_soort, - disc.ins_discipline_key, - i.beschrijving, - i.mantel_nr, - mntl.cnt_contract_key mantel_key, - i.omschrijving, - i.versie, - i.dienst, - d.prs_dienst_key, - i.afdeling, - afd.prs_afdeling_key, - i.perslid_eig, - eig.prs_perslid_key prs_perslid_key_eig, - eig.prs_afdeling_key - prs_afdeling_key_eig, - i.perslid_beh, - beh.prs_perslid_key prs_perslid_key_beh, - i.opmerking, - i.datum_ingang, - i.datum_eind, - i.datum_opzeg, - i.datum_rappel, - i.bedrijf_naam, - (SELECT MIN (prs_bedrijf_key) - FROM prs_v_aanwezigbedrijf - WHERE prs_bedrijf_contract IS NOT NULL - AND (TRIM ( - prs_bedrijf_naam_upper - ) = - UPPER (i.bedrijf_naam) - OR UPPER(TRIM(prs_leverancier_nr)) = - UPPER ( - i.bedrijf_naam - ))) - prs_bedrijf_key, - i.contact_naam, - i.kpn_code, - kpn.prs_kostenplaats_key, - i.bedrag, - i.bedrag_termijn, - i.uurtarief, - i.korting, - i.gebouwcode, - -- NULL --> Onbekend - -- J --> Ja (verlengen), nog wel te wijzigen - -- N --> Nee (niet verlengen), nog wel te wijzigen - DECODE (i.verlengen, - NULL, NULL, - 'J', 1, - 'N', 0, - NULL) - verlengen, - i.flex1, - i.flex2, - i.flex3, - i.flex4, - i.flex5, - i.flex6, - i.flex7, - i.flex8, - i.flex9, - i.flex10, - i.flex11, - i.flex12, - i.flex13, - i.flex14, - i.flex15, - i.flex16, - i.flex17, - i.flex18, - i.flex19, - i.flex20, - i.flex21, - i.flex22, - i.flex23, - i.flex24, - i.flex25 - FROM fac_imp_cnt i, - (SELECT * - FROM cnt_discipline - WHERE ins_discipline_verwijder IS NULL) - disc, - (SELECT c.* - FROM cnt_v_aanwezigcontract c, - cnt_disc_params dp - WHERE c.ins_discipline_key = - dp.cnt_ins_discipline_key - AND dp.cnt_srtcontract_type = - 6) mntl, - prs_dienst d, - (SELECT * - FROM prs_afdeling - WHERE prs_afdeling_verwijder IS NULL) - afd, - prs_v_aanwezigperslid eig, - prs_v_aanwezigperslid beh, - prs_v_aanwezigkostenplaats kpn - WHERE UPPER (i.cnt_soort) = - UPPER(TRIM(disc.ins_discipline_omschrijving(+))) - AND UPPER (i.mantel_nr) = - UPPER(TRIM(mntl.cnt_contract_nummer_intern(+))) - AND UPPER (i.dienst) = - UPPER(TRIM(d.prs_dienst_omschrijving(+))) - AND UPPER (i.afdeling) = - TRIM (afd.prs_afdeling_upper(+)) - AND UPPER (i.perslid_eig) = - COALESCE ( - TRIM ( - eig.prs_perslid_oslogin(+) - ), - TRIM ( - eig.prs_perslid_oslogin2(+) + -- Cursor zoekt direct alle afgeleide gegevens. + -- Een leeg veld betekent dus: óf deze regel overslaan, óf nieuwe data toevoegen. + CURSOR c1 + IS + WITH imp_cnt AS + ( SELECT i.nummer_intern + , i.versie + , i.nummer_extern + , i.cnt_soort + , i.beschrijving + , i.mantel_nr + , i.mantel_nr_versie + , i.omschrijving + , i.dienst + , i.afdeling + , i.perslid_eig + , i.perslid_beh + , i.opmerking + , i.datum_ingang + , i.datum_rappel + , i.datum_opzeg + , i.datum_eind + , i.soortcontact + , i.bedrijf_naam + , i.contact_naam + , i.kpn_code + , i.kostensoort + , i.bedrag + , i.bedrag_termijn + , i.uurtarief + , i.korting + , i.scope + , i.gebouwcode + , i.verlengen + , disc.ins_discipline_key + , mntl.cnt_contract_key mantel_key + , d.prs_dienst_key + , afd.prs_afdeling_key + , eig.prs_afdeling_key prs_afdeling_key_eig + , eig.prs_perslid_key prs_perslid_key_eig + , beh.prs_perslid_key prs_perslid_key_beh + , CASE WHEN i.soortcontact = 'P' + THEN (SELECT prs_perslid_key + FROM prs_perslid + WHERE LOWER(TRIM(prs_perslid_email)) = LOWER(i.bedrijf_naam) + ) + ELSE (SELECT MIN (prs_bedrijf_key) + FROM prs_bedrijf + WHERE (1=1) --prs_bedrijf_contract IS NOT NULL + AND ( TRIM(prs_bedrijf_naam_upper) = UPPER (i.bedrijf_naam) + OR UPPER(TRIM(prs_leverancier_nr)) = UPPER (i.bedrijf_naam) + ) + ) + END prs_bedrijf_key + , kpn.prs_kostenplaats_key + , ksr.prs_kostensoort_key + , i.flex1, i.flex2, i.flex3, i.flex4, i.flex5 + , i.flex6, i.flex7, i.flex8, i.flex9, i.flex10 + , i.flex11, i.flex12, i.flex13, i.flex14, i.flex15 + , i.flex16, i.flex17, i.flex18, i.flex19, i.flex20 + , i.flex21, i.flex22, i.flex23, i.flex24, i.flex25 + FROM fac_imp_cnt i + , (SELECT * + FROM cnt_discipline + WHERE ins_discipline_verwijder IS NULL + ) disc + , (SELECT c.* + FROM cnt_v_aanwezigcontract c + , cnt_disc_params dp + WHERE c.ins_discipline_key = dp.cnt_ins_discipline_key + AND dp.cnt_srtcontract_type = 6 + ) mntl + , prs_dienst d + , (SELECT * + FROM prs_afdeling + WHERE prs_afdeling_verwijder IS NULL + ) afd + , prs_v_aanwezigperslid eig + , prs_v_aanwezigperslid beh + , prs_v_aanwezigkostenplaats kpn + , prs_kostensoort ksr + WHERE UPPER(i.cnt_soort) = UPPER(TRIM(disc.ins_discipline_omschrijving(+))) + AND UPPER(i.mantel_nr) = UPPER(TRIM(mntl.cnt_contract_nummer_intern(+))) + AND UPPER(i.dienst) = UPPER(TRIM(d.prs_dienst_omschrijving(+))) + AND UPPER(i.afdeling) = TRIM(afd.prs_afdeling_upper(+)) + AND UPPER(i.perslid_eig) = UPPER(TRIM(eig.prs_perslid_email(+))) + AND UPPER(i.perslid_beh) = UPPER(TRIM(beh.prs_perslid_email(+))) + AND UPPER(i.kpn_code) = TRIM(kpn.prs_kostenplaats_upper(+)) + AND UPPER(i.kostensoort) = TRIM(ksr.prs_kostensoort_upper(+)) + ) + SELECT a.nummer_intern + , a.nummer_extern + , a.cnt_soort + , dp.cnt_srtcontract_type + , a.ins_discipline_key + , a.beschrijving + , a.mantel_nr + , a.mantel_nr_versie + , a.mantel_key + , a.omschrijving + , a.versie + , a.dienst + , a.prs_dienst_key + , a.afdeling + , a.prs_afdeling_key + , a.perslid_eig + , a.prs_perslid_key_eig + , a.prs_afdeling_key_eig + , a.perslid_beh + , a.prs_perslid_key_beh + , a.opmerking + , a.datum_ingang + , a.datum_eind + , a.datum_opzeg + , a.datum_rappel + , a.soortcontact + , a.bedrijf_naam + , a.prs_bedrijf_key + , a.contact_naam + , cp.prs_contactpersoon_key + , a.kpn_code + , a.prs_kostenplaats_key + , a.kostensoort + , a.prs_kostensoort_key + , a.bedrag + , a.bedrag_termijn + , a.uurtarief + , a.korting + , a.scope locgeb_scope + , a.gebouwcode locgeb_code + , gg.plaats_scope + , gg.plaats_key + , a.verlengen + , a.flex1 cnt_kenmerkwaarde1 + , a.flex2 cnt_kenmerkwaarde2 + , a.flex3 cnt_kenmerkwaarde3 + , a.flex4 cnt_kenmerkwaarde4 + , a.flex5 cnt_kenmerkwaarde5 + , a.flex6 cnt_kenmerkwaarde6 + , a.flex7 cnt_kenmerkwaarde7 + , a.flex8 cnt_kenmerkwaarde8 + , a.flex9 cnt_kenmerkwaarde9 + , a.flex10 cnt_kenmerkwaarde10 + , a.flex11 cnt_kenmerkwaarde11 + , a.flex12 cnt_kenmerkwaarde12 + , a.flex13 cnt_kenmerkwaarde13 + , a.flex14 cnt_kenmerkwaarde14 + , a.flex15 cnt_kenmerkwaarde15 + , a.flex16 cnt_kenmerkwaarde16 + , a.flex17 cnt_kenmerkwaarde17 + , a.flex18 cnt_kenmerkwaarde18 + , a.flex19 cnt_kenmerkwaarde19 + , a.flex20 cnt_kenmerkwaarde20 + , a.flex21 cnt_kenmerkwaarde21 + , a.flex22 cnt_kenmerkwaarde22 + , a.flex23 cnt_kenmerkwaarde23 + , a.flex24 cnt_kenmerkwaarde24 + , a.flex25 cnt_kenmerkwaarde25 + FROM imp_cnt a + , cnt_disc_params dp + , prs_contactpersoon cp + , (SELECT 'L' plaats_scope + , alg_locatie_key plaats_key + , alg_locatie_code plaats_code + FROM alg_v_aanweziglocatie + UNION + SELECT 'G' + , alg_gebouw_key + , alg_gebouw_code + FROM alg_v_aanweziggebouw + ) gg + WHERE a.ins_discipline_key = dp.cnt_ins_discipline_key + AND UPPER(a.contact_naam) = UPPER(TRIM(cp.prs_contactpersoon_email(+))) + AND a.prs_bedrijf_key = cp.prs_bedrijf_key(+) + AND a.scope = gg.plaats_scope(+) + AND a.gebouwcode = gg.plaats_code(+); + + -- Constanten + c_contract_type NUMBER := 5; -- Leverancier (met scope) + + v_errormsg VARCHAR2(1000) := '-'; + oracle_err_num NUMBER; + oracle_err_mes VARCHAR2(200); + v_aanduiding VARCHAR2(200); + v_geldig NUMBER(1); + v_facilitor_key NUMBER; + v_perslid_key_eig NUMBER; + v_perslid_key_beh NUMBER; + v_typecontract_key NUMBER; + v_cnt_discipline_key NUMBER; + v_contactpersoon_key NUMBER; + v_cnt_status NUMBER; + v_termijn_type VARCHAR2(1); + v_termijn_aantal NUMBER; + v_termijn_key_opzeg NUMBER; + v_termijn_key_rappel NUMBER; + v_contract_key NUMBER; + v_count NUMBER; + v_count_tot NUMBER; + v_count_cntnew NUMBER; + v_count_cntupd NUMBER; + v_srtnoti_code VARCHAR2(6); +v_fulltext varchar2(2000); + + -- SUBPROC + PROCEDURE bepaal_termijn( p_start IN DATE + , p_eind IN DATE + , p_termijn_type OUT VARCHAR2 + , p_termijn_aantal OUT NUMBER + , p_afronden IN BOOLEAN + ) + AS + v_type VARCHAR2(1) := 'W'; + v_aantal NUMBER := 0; + v_zelfde_dag BOOLEAN; + v_zelfde_weekdag BOOLEAN; + v_zelfde_maand BOOLEAN; + min_jaar NUMBER := 3; -- Afronden op jaren als het aantal dagen groter is dan dit aantal jaren + min_maand NUMBER := 3; -- Afronden op maanden als het aantal dagen groter is dan dit aantal maanden. + min_week NUMBER := 4; -- Afronden op weken als het aantal dagen groter is dan dit aantal weken. + BEGIN + IF p_start IS NOT NULL AND p_eind > p_start + THEN + v_zelfde_weekdag := (TO_CHAR(p_start, 'D') = TO_CHAR(p_eind, 'D')); + v_zelfde_dag := (TO_CHAR(p_start, 'dd') = TO_CHAR(p_eind, 'dd')); + v_zelfde_maand := (TO_CHAR(p_start, 'mm') = TO_CHAR(p_eind, 'mm')); + CASE WHEN (v_zelfde_dag AND v_zelfde_maand) + THEN + v_type := 'Y'; + v_aantal := TO_NUMBER(TO_CHAR(p_eind, 'yyyy')) - TO_NUMBER(TO_CHAR(p_start, 'yyyy')); + WHEN (v_zelfde_dag AND NOT v_zelfde_maand) + THEN + v_type := 'M'; + v_aantal := ROUND(MONTHS_BETWEEN(p_eind, p_start)); + WHEN (v_zelfde_weekdag) + THEN + v_type := 'W'; + v_aantal := ROUND((p_eind - p_start) / 7); + ELSE + v_type := 'D'; + v_aantal := p_eind - p_start; + IF p_afronden + THEN + CASE WHEN v_aantal > (365 * min_jaar) + THEN -- afronden op jaren + v_type := 'Y'; + v_aantal := ROUND(v_aantal / 365); + WHEN v_aantal > (30 * min_maand) + THEN -- afronden op maanden + v_type := 'M'; + v_aantal := ROUND(v_aantal / 30); + WHEN v_aantal > (7 * min_week) + THEN -- afronden op weken + v_type := 'W'; + v_aantal := ROUND(v_aantal / 7); + END CASE; + END IF; + END CASE; + END IF; + -- + v_aantal := LEAST(v_aantal, 999); + IF v_aantal < 0 + THEN + v_aantal := 0; + v_type := 'W'; + END IF; + -- + p_termijn_type := v_type; + p_termijn_aantal := v_aantal; + END; -- SUBPROC bepaal_termijn + + -- SUBPROC + -- p_kenmerkwaarde = 'Looptijd Maximaal|1=24'. Ofwel: kenmerk_omschrijving|groep=waarde. + -- p_kenmerkwaarde = '1049|1=24'. Ofwel: kenmerk_key|groep=waarde. + PROCEDURE upsert_cntkenmerk( p_cnt_key IN NUMBER + , p_kenmerkwaarde IN VARCHAR2) + AS + v_kenmerk_key NUMBER; + v_srtkenmerk_type cnt_srtkenmerk.cnt_srtkenmerk_kenmerktype%TYPE; + ccount NUMBER; + v_srtkenmerk_key NUMBER; + v_groep NUMBER; + v_kenmerk VARCHAR2 (50); + v_waarde VARCHAR2 (255); + v_objectnaam fac_kenmerkdomein.fac_kenmerkdomein_objectnaam%TYPE; + v_kolomnaam fac_kenmerkdomein.fac_kenmerkdomein_kolomnaam%TYPE; + v_kolomtxt fac_kenmerkdomein.fac_kenmerkdomein_kolomtxt%TYPE; + sql_stmt VARCHAR2 (1000); + v_kenmerkdeel_key NUMBER; + l_cursor_1 INTEGER; + l_rowsprocessed NUMBER DEFAULT 0; + BEGIN + IF p_kenmerkwaarde IS NOT NULL + THEN + v_errormsg := 'Fout bij bepalen kenmerk [' || SUBSTR(p_kenmerkwaarde, 1, 200) || ']'; + + v_kenmerk := SUBSTR (p_kenmerkwaarde, 1, INSTR (p_kenmerkwaarde, '|') - 1); + v_groep := fac.safe_to_number(SUBSTR( p_kenmerkwaarde + , INSTR(p_kenmerkwaarde, '|') + 1 + , INSTR(p_kenmerkwaarde, '=') - 1 - INSTR(p_kenmerkwaarde, '|') ) - ) - AND UPPER (i.perslid_beh) = - COALESCE ( - TRIM ( - beh.prs_perslid_oslogin(+) - ), - TRIM ( - beh.prs_perslid_oslogin2(+) - ) - ) - AND UPPER (i.kpn_code) = - TRIM ( - kpn.prs_kostenplaats_upper(+) - )) a - LEFT JOIN - cnt_disc_params dp - ON a.ins_discipline_key = dp.cnt_ins_discipline_key - LEFT JOIN - prs_contactpersoon cp - ON cp.prs_contactpersoon_verwijder IS NULL - AND UPPER (a.contact_naam) = - UPPER (TRIM (cp.prs_contactpersoon_naam)) - AND a.prs_bedrijf_key = cp.prs_bedrijf_key - LEFT JOIN - ( SELECT TRIM (alg_locatie_code) alg_locatie_code, - MIN (alg_locatie_key) alg_locatie_key - FROM alg_v_aanweziglocatie - GROUP BY TRIM (alg_locatie_code)) l - ON UPPER (a.gebouwcode) = UPPER (l.alg_locatie_code) - LEFT JOIN - ( SELECT TRIM (alg_gebouw_code) alg_gebouw_code, - MIN (alg_gebouw_key) alg_gebouw_key - FROM alg_v_aanweziggebouw - GROUP BY TRIM (alg_gebouw_code)) g - ON UPPER (a.gebouwcode) = UPPER (g.alg_gebouw_code); + ); + v_waarde := SUBSTR(p_kenmerkwaarde, INSTR(p_kenmerkwaarde, '=') + 1); - -- Constanten - c_contract_type NUMBER := 5; -- Leverancier (met scope) - - v_errormsg VARCHAR2 (1000) := '-'; - oracle_err_num NUMBER; - oracle_err_mes VARCHAR2 (200); - v_aanduiding VARCHAR2 (200); - v_geldig NUMBER (1); - v_facilitor_key NUMBER; - v_perslid_key_eig NUMBER; - v_perslid_key_beh NUMBER; - v_typecontract_key NUMBER; - v_cnt_discipline_key NUMBER; - v_contactpersoon_key NUMBER; - v_cnt_status NUMBER; - v_termijn_type VARCHAR2 (1); - v_termijn_aantal NUMBER; - v_termijn_key_opzeg NUMBER; - v_termijn_key_rappel NUMBER; - v_contract_key NUMBER; - v_count NUMBER; - v_count_tot NUMBER; - v_count_cntnew NUMBER; - v_count_cntupd NUMBER; - v_srtnoti_code VARCHAR2 (6); - - -- SUBPROC - PROCEDURE bepaal_termijn (p_start IN DATE, p_eind IN DATE) - AS - v_num_months NUMBER; - BEGIN - v_termijn_type := 'D'; - v_termijn_aantal := 0; - - IF p_start IS NOT NULL AND p_eind > p_start - THEN - -- Kijk of het verschil een of meer jaren is. - IF (TO_CHAR (p_eind, 'ddmm') = TO_CHAR (p_start, 'ddmm')) - THEN - -- Verschil is aantal jaren. - v_termijn_type := 'Y'; - v_termijn_aantal := - TO_NUMBER (TO_CHAR (p_eind, 'yyyy')) - - TO_NUMBER (TO_CHAR (p_start, 'yyyy')); - ELSE - v_num_months := ROUND ( (p_eind - p_start) / 30); - - IF (ADD_MONTHS (p_eind, -v_num_months) = p_start) - --IF (TO_CHAR (p_eind, 'dd') = TO_CHAR (p_start, 'dd') ) - THEN - -- Verschil is aantal maanden. - v_termijn_type := 'M'; - v_termijn_aantal := - (TO_NUMBER (TO_CHAR (p_eind, 'yyyy')) * 12 - + TO_NUMBER (TO_CHAR (p_eind, 'mm'))) - - (TO_NUMBER (TO_CHAR (p_start, 'yyyy')) * 12 - + TO_NUMBER (TO_CHAR (p_start, 'mm'))); - ELSE - -- Verschil is aantal dagen. - v_termijn_type := 'D'; - v_termijn_aantal := p_eind - p_start; - END IF; - END IF; - END IF; - - IF v_termijn_aantal < 0 - THEN - -- 0 weken = termijn 'Geen'. - v_termijn_aantal := 0; - v_termijn_type := 'W'; - END IF; - - IF v_termijn_aantal > 999 - THEN - v_termijn_aantal := 999; - END IF; - END; - - -- SUBPROC - -- p_kenmerkwaarde = 'Looptijd Maximaal|1=24'. Ofwel: kenmerk_omschrijving|groep=waarde. - -- p_kenmerkwaarde = '1049|1=24'. Ofwel: kenmerk_key|groep=waarde. - PROCEDURE upsert_cntkenmerk (p_cnt_key IN NUMBER, - p_kenmerkwaarde IN VARCHAR2) - AS - v_kenmerk_key NUMBER; - v_srtkenmerk_type cnt_srtkenmerk.cnt_srtkenmerk_kenmerktype%TYPE; - ccount NUMBER; - v_srtkenmerk_key NUMBER; - v_groep NUMBER; - v_kenmerk VARCHAR2 (50); - v_waarde VARCHAR2 (255); - v_objectnaam fac_kenmerkdomein.fac_kenmerkdomein_objectnaam%TYPE; - v_kolomnaam fac_kenmerkdomein.fac_kenmerkdomein_kolomnaam%TYPE; - v_kolomtxt fac_kenmerkdomein.fac_kenmerkdomein_kolomtxt%TYPE; - sql_stmt VARCHAR2 (1000); - v_kenmerkdeel_key NUMBER; - l_cursor_1 INTEGER; - l_rowsprocessed NUMBER DEFAULT 0; - BEGIN - IF p_kenmerkwaarde IS NOT NULL - THEN - v_errormsg := 'Fout bij bepalen kenmerk [' || SUBSTR(p_kenmerkwaarde, 1, 200) || ']'; - - v_kenmerk := SUBSTR (p_kenmerkwaarde, 1, INSTR (p_kenmerkwaarde, '|') - 1); - v_groep := fac.safe_to_number ( - SUBSTR (p_kenmerkwaarde, - INSTR (p_kenmerkwaarde, '|') + 1, - INSTR (p_kenmerkwaarde, '=') - 1 - INSTR (p_kenmerkwaarde, '|'))); - v_waarde := SUBSTR (p_kenmerkwaarde, INSTR (p_kenmerkwaarde, '=') + 1); - - IF fac.safe_to_number (v_kenmerk) IS NULL - THEN - -- Er kunnen drie kenmerken met dezelfde omschrijving gedefinieerd worden voor een object, - -- namenlijk op drie niveaus discipline (D), 0bjectgroep (G) en objectsoort (S). - -- Bij meerdere dezelfde kenmerken nemen we het kenmerk met de laagste volgnummer. - SELECT cnt_kenmerk_key, - cnt_srtkenmerk_key, - cnt_srtkenmerk_kenmerktype - INTO v_kenmerk_key, - v_srtkenmerk_key, - v_srtkenmerk_type - FROM ( SELECT k.cnt_kenmerk_key, - sk.cnt_srtkenmerk_key, - sk.cnt_srtkenmerk_kenmerktype, - k.cnt_kenmerk_volgnummer - FROM cnt_v_aanwezigcontract c, - cnt_kenmerk k, - cnt_srtkenmerk sk + IF fac.safe_to_number(v_kenmerk) IS NULL + THEN + -- Er kunnen drie kenmerken met dezelfde omschrijving gedefinieerd worden voor een object, + -- namenlijk op drie niveaus discipline (D), 0bjectgroep (G) en objectsoort (S). + -- Bij meerdere dezelfde kenmerken nemen we het kenmerk met de laagste volgnummer. + SELECT cnt_kenmerk_key + , cnt_srtkenmerk_key + , cnt_srtkenmerk_kenmerktype + INTO v_kenmerk_key + , v_srtkenmerk_key + , v_srtkenmerk_type + FROM ( SELECT k.cnt_kenmerk_key + , sk.cnt_srtkenmerk_key + , sk.cnt_srtkenmerk_kenmerktype + , k.cnt_kenmerk_volgnummer + FROM cnt_v_aanwezigcontract c + , cnt_kenmerk k + , cnt_srtkenmerk sk WHERE ( c.ins_discipline_key = k.cnt_srtcontract_key - or k.cnt_srtcontract_key is null + or k.cnt_srtcontract_key IS NULL ) AND k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key AND c.cnt_contract_key = p_cnt_key @@ -21543,761 +21673,644 @@ AS AND COALESCE(UPPER(k.cnt_kenmerk_omschrijving), sk.cnt_srtkenmerk_upper) = UPPER(v_kenmerk) AND k.cnt_kenmerk_verwijder IS NULL AND sk.cnt_srtkenmerk_verwijder IS NULL - ORDER BY k.cnt_kenmerk_volgnummer) - WHERE ROWNUM = 1; - ELSE - SELECT k.cnt_kenmerk_key, - sk.cnt_srtkenmerk_key, - sk.cnt_srtkenmerk_kenmerktype - INTO v_kenmerk_key, - v_srtkenmerk_key, - v_srtkenmerk_type - FROM cnt_kenmerk k, - cnt_srtkenmerk sk - WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key - AND k.cnt_kenmerk_groep = v_groep - AND k.cnt_kenmerk_key = v_kenmerk - ORDER BY k.cnt_kenmerk_volgnummer; - END IF; + ORDER BY k.cnt_kenmerk_volgnummer + ) + WHERE ROWNUM = 1; + ELSE + SELECT k.cnt_kenmerk_key + , sk.cnt_srtkenmerk_key + , sk.cnt_srtkenmerk_kenmerktype + INTO v_kenmerk_key + , v_srtkenmerk_key + , v_srtkenmerk_type + FROM cnt_kenmerk k + , cnt_srtkenmerk sk + WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key + AND k.cnt_kenmerk_groep = v_groep + AND k.cnt_kenmerk_key = v_kenmerk + ORDER BY k.cnt_kenmerk_volgnummer; + END IF; + IF v_waarde IS NOT NULL + THEN + IF v_srtkenmerk_type IN ('R', 'r', 'S') + THEN + v_errormsg := 'Fout bij bepalen eigen tabel'; + SELECT COUNT (*) + INTO ccount + FROM cnt_srtkenmerk sk + , fac_kenmerkdomein d + WHERE sk.cnt_srtkenmerk_key = v_srtkenmerk_key + AND sk.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key + AND d.fac_usrtab_key IS NOT NULL; - IF v_waarde IS NOT NULL - THEN - IF v_srtkenmerk_type IN ('R', 'r', 'S') - THEN - v_errormsg := 'Fout bij bepalen eigen tabel'; + v_errormsg := 'Fout bij bepalen nieuwe waarde [' || SUBSTR(v_waarde, 1, 200) || ']'; + IF ccount = 1 + THEN + -- Eigen tabel + SELECT TO_CHAR (ud.fac_usrdata_key) + INTO v_waarde + FROM cnt_srtkenmerk sk + , fac_kenmerkdomein d + , fac_v_aanwezigusrdata ud + WHERE sk.cnt_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 cnt_srtkenmerk sk + , fac_kenmerkdomein d + WHERE sk.cnt_srtkenmerk_key = v_srtkenmerk_key + AND sk.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key + AND d.fac_usrtab_key IS NULL; - SELECT COUNT (*) - INTO ccount - FROM cnt_srtkenmerk sk, - fac_kenmerkdomein d - WHERE sk.cnt_srtkenmerk_key = v_srtkenmerk_key - AND sk.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key - AND d.fac_usrtab_key IS NOT 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 nieuwe waarde [' || SUBSTR(v_waarde, 1, 200) || ']'; + v_errormsg := 'Fout bij bepalen huidige waarde'; + SELECT COUNT(*) + , MAX(cnt_kenmerkcontract_key) + INTO ccount + , v_kenmerkdeel_key + FROM cnt_kenmerkcontract + WHERE cnt_contract_key = p_cnt_key + AND cnt_kenmerk_key = v_kenmerk_key; - IF ccount = 1 - THEN - -- Eigen tabel - SELECT TO_CHAR (ud.fac_usrdata_key) - INTO v_waarde - FROM cnt_srtkenmerk sk, - fac_kenmerkdomein d, - fac_v_aanwezigusrdata ud - WHERE sk.cnt_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 cnt_srtkenmerk sk, - fac_kenmerkdomein d - WHERE sk.cnt_srtkenmerk_key = v_srtkenmerk_key - AND sk.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key - AND d.fac_usrtab_key IS NULL; + IF v_srtkenmerk_type = 'N' -- Alleen voor numerieke waarden de decimale komma vervangen door punt. + THEN + v_waarde := REPLACE(v_waarde, ',', '.'); + END IF; - 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; + IF ccount = 0 + THEN + v_errormsg := 'Fout bij toevoegen waarde [' || SUBSTR(v_waarde, 1, 200) || ']'; + INSERT INTO cnt_kenmerkcontract + ( cnt_contract_key + , cnt_kenmerk_key + , cnt_kenmerkcontract_waarde + ) + VALUES ( p_cnt_key + , v_kenmerk_key + , v_waarde + ); + ELSE + v_errormsg := 'Fout bij bijwerken waarde [' || SUBSTR(v_waarde, 1, 200) || ']'; + UPDATE cnt_kenmerkcontract + SET cnt_kenmerkcontract_waarde = v_waarde + WHERE cnt_kenmerkcontract_key = v_kenmerkdeel_key; + END IF; + ELSE + -- Verwijder kenmerken die al bestaan maar met de nieuwe import leeg zijn. + DELETE cnt_kenmerkcontract + WHERE cnt_kenmerk_key = v_kenmerk_key + AND cnt_contract_key = p_cnt_key; + END IF; + END IF; + EXCEPTION + WHEN OTHERS THEN + oracle_err_num := SQLCODE; + oracle_err_mes := SUBSTR (SQLERRM, 1, 200); + v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || v_errormsg + , 'upsert_cntkenmerk' + ); + END; -- SUBPROC upsert_cntkenmerk - v_errormsg := 'Fout bij bepalen huidige waarde'; - - SELECT COUNT (*), - MAX (cnt_kenmerkcontract_key) - INTO ccount, - v_kenmerkdeel_key - FROM cnt_kenmerkcontract - WHERE cnt_contract_key = p_cnt_key - AND cnt_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 [' || SUBSTR(v_waarde, 1, 200) || ']'; - - INSERT INTO cnt_kenmerkcontract (cnt_contract_key, - cnt_kenmerk_key, - cnt_kenmerkcontract_waarde) - VALUES (p_cnt_key, - v_kenmerk_key, - v_waarde); - ELSE - v_errormsg := 'Fout bij bijwerken waarde [' || SUBSTR(v_waarde, 1, 200) || ']'; - - UPDATE cnt_kenmerkcontract - SET cnt_kenmerkcontract_waarde = v_waarde - WHERE cnt_kenmerkcontract_key = v_kenmerkdeel_key; - END IF; - ELSE - -- Verwijder kenmerken die al bestaan maar met de nieuwe import leeg zijn. - DELETE cnt_kenmerkcontract - WHERE cnt_kenmerk_key = v_kenmerk_key - AND cnt_contract_key = p_cnt_key; - END IF; - END IF; - EXCEPTION - WHEN OTHERS - THEN - oracle_err_num := SQLCODE; - oracle_err_mes := SUBSTR (SQLERRM, 1, 200); - v_errormsg := - v_errormsg - || ' ORACLE (error ' - || oracle_err_num - || '/' - || oracle_err_mes - || ')'; - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'upsert_cntkenmerk'); - END; BEGIN - v_count_tot := 0; - v_count_cntnew := 0; - v_count_cntupd := 0; - v_aanduiding := ''; + v_count_tot := 0; + v_count_cntnew := 0; + v_count_cntupd := 0; + v_aanduiding := ''; - v_errormsg := 'Fout bij bepalen user: _FACILITOR'; + v_errormsg := 'Fout bij bepalen user: _FACILITOR'; - SELECT prs_perslid_key - INTO v_facilitor_key - FROM prs_perslid - WHERE prs_perslid_oslogin = '_FACILITOR'; + SELECT prs_perslid_key + INTO v_facilitor_key + FROM prs_perslid + WHERE prs_perslid_oslogin = '_FACILITOR'; - FOR rec IN c1 - LOOP - BEGIN - v_geldig := 1; - v_count_tot := v_count_tot + 1; - v_aanduiding := - '[' - || rec.cnt_soort - || '|' - || rec.nummer_intern - || '|' - || rec.nummer_extern - || '|' - || rec.beschrijving - || '] '; + FOR rec IN c1 + LOOP + BEGIN + v_geldig := 1; + v_count_tot := v_count_tot + 1; + v_aanduiding := '['|| rec.cnt_soort ||'|'|| rec.nummer_intern ||'|'|| rec.nummer_extern ||'|'|| rec.beschrijving ||'] '; - -- Eerst controleren of de ingevulde gegevens wel zinning/geldig zijn. - -- Voor -ontbrekende- verplichte gegevens proberen we wat zinnigs (en - -- geldigs!) te bedenken. - -- Toevoegen/bijwerken wordt pas gedaan als alles zinnig is bevonden. + -- Eerst controleren of de ingevulde gegevens wel zinning/geldig zijn. + -- Voor -ontbrekende- verplichte gegevens proberen we wat zinnigs (en + -- geldigs!) te bedenken. + -- Toevoegen/bijwerken wordt pas gedaan als alles zinnig is bevonden. - -- Verplichte velden (via interface) zijn bij import al gecontroleerd! - -- Afdeling: moet geldig zijn! - v_errormsg := 'Fout bij bepalen afdeling: ' || rec.afdeling; - - IF (rec.prs_afdeling_key IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Contract wordt overgeslagen'); - v_geldig := 0; - END IF; - - -- Eigenaar (als meegegeven) - -- In geval van abonnement verplicht. - -- *niet gevonden, wel meegegeven - IF (rec.perslid_eig IS NOT NULL AND rec.prs_perslid_key_eig IS NULL) - THEN - v_errormsg := 'Fout bij bepalen eigenaar: ' || rec.perslid_eig; - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'leeg gelaten'); - -- *wel gevonden (impliceert meegegeven) - ELSIF (rec.prs_perslid_key_eig IS NOT NULL) - THEN - v_perslid_key_eig := rec.prs_perslid_key_eig; - - -- *niet meegegeven, dus niet gevonden - -- Speciaal geval abonnementen: abonnee (eigenaar) is dan verplicht. - -- Contract is een abonnement, als de contractsoort aan een catalogus - -- gekoppeld is. - ELSIF (rec.ins_discipline_key IS NOT NULL) - THEN - -- Is er een (actuele) catalogus aan deze contractsoort gekoppeld? - SELECT COUNT ( * ) - INTO v_count - FROM bes_disc_params p, bes_discipline b - WHERE p.bes_disc_params_cnt_disckey = rec.ins_discipline_key - AND p.bes_ins_discipline_key = b.ins_discipline_key - AND b.ins_discipline_verwijder IS NULL; - - IF (v_count > 0) - THEN - -- dit is een abonnement, dus de eigenaar is verplicht - v_errormsg := 'Fout bij bepalen eigenaar-abonnee'; - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Contract wordt overgeslagen'); - v_geldig := 0; - END IF; - END IF; - - -- Beheerder: backup _FACILITOR. - v_errormsg := 'Fout bij bepalen beheerder: ' || rec.perslid_beh; - - IF (rec.prs_perslid_key_beh IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - '_FACILITOR gebruikt'); - v_perslid_key_beh := v_facilitor_key; - ELSE - v_perslid_key_beh := rec.prs_perslid_key_beh; - END IF; - - -- Bedrijf: moet geldig zijn! - v_errormsg := 'Fout bij bepalen bedrijf: ' || rec.bedrijf_naam; - - IF (rec.prs_bedrijf_key IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Contract wordt overgeslagen'); - v_geldig := 0; - END IF; - - -- Kostenplaats: moet bestaan. - -- TODO: Moet de beheerder hier rechten op hebben? (en welke dan?) - v_errormsg := 'Fout bij bepalen kostenplaats: ' || rec.kpn_code; - - IF (rec.prs_kostenplaats_key IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Contract wordt overgeslagen'); - v_geldig := 0; - END IF; - - -- Locatie/gebouw (als meegegeven): moet bestaan en ook passen bij de - -- contractsoort (type_key 3=Ondersteuning of 5=Leverancier). - v_errormsg := 'Fout bij bepalen locatie/gebouw: ' || rec.locgeb_code; - - IF (rec.locgeb_code IS NOT NULL) - THEN - -- Geen locatie/gebouw gevonden. - IF (rec.plaats_key IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Contract wordt overgeslagen'); - v_geldig := 0; - END IF; - - v_errormsg := 'Fout bij matchen contractsoort-scope'; - - IF (rec.cnt_srtcontract_type NOT IN (3, 5)) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Contract wordt overgeslagen'); - v_geldig := 0; - END IF; - END IF; - - -- Mantel: niet verplicht, wel rapporteren als niets gevonden. - v_errormsg := 'Fout bij bepalen mantel: ' || rec.mantel_nr; - - IF (rec.mantel_nr IS NOT NULL AND rec.mantel_key IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Contract niet aan mantel gekoppeld'); - END IF; - - -- Dienst: niet verplicht, wel rapporteren als niets gevonden. - v_errormsg := 'Fout bij bepalen dienst: ' || rec.dienst; - - IF (rec.dienst IS NOT NULL AND rec.prs_dienst_key IS NULL) - THEN - fac.imp_writelog (p_import_key, - 'W', - v_aanduiding || v_errormsg, - 'Contract niet aan dienst gekoppeld'); - END IF; - - -- Alleen verder gaan als alles zinnig bevonden is. - IF (v_geldig = 1) - THEN - -- Contractsoort: toevoegen (type Leverancier). - IF (rec.ins_discipline_key IS NULL) - THEN - -- Misschien is de contractsoort tijdens import al toegevoegd? - -- (dan was 'ie er voor de cursor nog niet.) - BEGIN - v_errormsg := 'Fout bij bepalen contractsoort'; - - SELECT ins_discipline_key - INTO v_cnt_discipline_key - FROM cnt_discipline - WHERE ins_discipline_verwijder IS NULL - AND UPPER (ins_discipline_omschrijving) = - UPPER (rec.cnt_soort); - EXCEPTION - WHEN NO_DATA_FOUND - THEN - -- Contractsoort bestaat gewoon niet; toevoegen. - v_errormsg := - 'Fout bij toevoegen contractsoort:' || rec.cnt_soort; - - INSERT INTO ins_tab_discipline ( - ins_discipline_module, - ins_discipline_omschrijving - ) - VALUES ('CNT', rec.cnt_soort) - RETURNING ins_discipline_key - INTO v_cnt_discipline_key; - - -- Type Leverancier, geen kostensoort, geen factuurmarges. - INSERT INTO cnt_disc_params ( - cnt_ins_discipline_key, - cnt_srtcontract_type - ) - VALUES (v_cnt_discipline_key, c_contract_type); - - fac.imp_writelog ( - p_import_key, - 'I', - v_aanduiding - || 'Contractsoort "' - || rec.cnt_soort - || '" aangemaakt', - 'Nieuwe contractsoort' - ); - END; - ELSE - v_cnt_discipline_key := rec.ins_discipline_key; - END IF; - - -- Contactpersoon (als meegegeven): bepalen/toevoegen bij bedrijf. - IF (rec.contact_naam IS NOT NULL - AND rec.prs_contactpersoon_key IS NULL) - THEN - -- Misschien is de contractsoort tijdens import al toegevoegd? - -- (dan was 'ie er voor de cursor nog niet.) - BEGIN - v_errormsg := 'Fout bij bepalen contactpersoon'; - - SELECT prs_contactpersoon_key - INTO v_contactpersoon_key - FROM prs_contactpersoon - WHERE prs_contactpersoon_verwijder IS NULL - AND prs_bedrijf_key = rec.prs_bedrijf_key - AND UPPER (prs_contactpersoon_naam) = - UPPER (rec.contact_naam); - EXCEPTION - WHEN NO_DATA_FOUND - THEN - -- Contactpersoon bestaat gewoon niet; toevoegen. - v_errormsg := - 'Fout bij toevoegen contactpersoon:' - || rec.contact_naam; - - INSERT INTO prs_contactpersoon ( - prs_contactpersoon_naam, - prs_bedrijf_key - ) - VALUES (rec.contact_naam, rec.prs_bedrijf_key) - RETURNING prs_contactpersoon_key - INTO v_contactpersoon_key; - - fac.imp_writelog ( - p_import_key, - 'I', - v_aanduiding - || 'Contactpersoon "' - || rec.contact_naam - || '" aangemaakt', - 'Nieuwe contactpersoon' - ); - END; - ELSE - v_contactpersoon_key := rec.prs_contactpersoon_key; - END IF; - - -- Opzegtermijn: bepalen/toevoegen. - -- Als geen opzegtermijn ingevuld, dan is er geen opzegtermijn. - v_errormsg := 'Fout bij bepalen opzegtermijn'; - - IF (rec.datum_opzeg IS NULL) - THEN - -- Opzegtermijn 'Geen' = 0 weken. - v_termijn_aantal := 0; - v_termijn_type := 'W'; - ELSE - bepaal_termijn (rec.datum_opzeg, rec.datum_eind); - END IF; - - -- Bestaat de termijn al? - BEGIN - v_errormsg := 'Fout bij bepalen opzegtermijn'; - - SELECT cnt_termijn_key - INTO v_termijn_key_opzeg - FROM cnt_termijn - WHERE cnt_termijn_type = v_termijn_type - AND cnt_termijn_aantal = v_termijn_aantal; - EXCEPTION - WHEN NO_DATA_FOUND - THEN - v_errormsg := 'Fout bij toevoegen opzegtermijn'; - - INSERT INTO cnt_termijn ( - cnt_termijn_omschrijving, - cnt_termijn_type, - cnt_termijn_aantal - ) - VALUES ( - TO_CHAR (v_termijn_aantal) - || DECODE (v_termijn_type, - 'Y', - ' Jaar', - 'M', - ' Maand(en)', - 'D', - ' Dag(en)'), - v_termijn_type, - v_termijn_aantal - ) - RETURNING cnt_termijn_key INTO v_termijn_key_opzeg; - END; - - -- Rappeltermijn: bepalen/toevoegen. - -- Als geen rappeltermijn ingevuld, dan is er geen rappeltermijn. - v_errormsg := 'Fout bij bepalen rappeltermijn'; - - IF (rec.datum_rappel IS NULL) - THEN - -- Rappeltermijn 'Geen' = 0 weken. - v_termijn_aantal := 0; - v_termijn_type := 'W'; - ELSE - -- Als geen opzegdatum, dan einddatum. - bepaal_termijn (rec.datum_rappel, - COALESCE (rec.datum_opzeg, rec.datum_eind)); - END IF; - - -- Bestaat de termijn al? - BEGIN - v_errormsg := 'Bepalen rappeltermijn'; - - SELECT cnt_termijn_key - INTO v_termijn_key_rappel - FROM cnt_termijn - WHERE cnt_termijn_type = v_termijn_type - AND cnt_termijn_aantal = v_termijn_aantal; - EXCEPTION - WHEN NO_DATA_FOUND - THEN - v_errormsg := 'Toevoegen rappeltermijn'; - - INSERT INTO cnt_termijn ( - cnt_termijn_omschrijving, - cnt_termijn_type, - cnt_termijn_aantal - ) - VALUES ( - TO_CHAR (v_termijn_aantal) - || DECODE (v_termijn_type, - 'Y', - ' Jaar', - 'M', - ' Maand(en)', - 'D', - ' Dag(en)'), - v_termijn_type, - v_termijn_aantal - ) - RETURNING cnt_termijn_key - INTO v_termijn_key_rappel; - END; - - -- Controleren of er al een contract met hetzelfde nummer en versie; - -- bestaat; toevoegen vs. bijwerken. - v_errormsg := 'Fout bij bepalen contract'; - - SELECT COUNT ( * ) - INTO v_count - FROM cnt_v_aanwezigcontract - WHERE TRIM (cnt_contract_nummer_intern) = rec.nummer_intern - AND COALESCE (cnt_contract_versie, '0') = - COALESCE (rec.versie, '0'); - - IF (v_count = 0) -- Contract bestaat nog niet --> toevoegen. - THEN - -- Als rec.nummer_intern is NULL, dan wordt door FACILITOR een - -- nummer bepaald (= cnt_contract_key)! - v_errormsg := 'Fout bij toevoegen contract.'; - - -- Status van nieuwe melding is afhankelijk van of het contract approval mechanisme actief is en - -- het bedrag moet groter zijn als limiet 1 anders hoeft er überhaupt niet gefiatteerd te worden en kan het contract direct actief (0) worden. - IF fac.getSetting('cnt_contract_approval') = 1 AND rec.bedrag > fac.getSetting('cnt_contract_limit1') - THEN - v_cnt_status := 2; - ELSE - v_cnt_status := 0; - END IF; - - INSERT INTO cnt_contract (cnt_contract_nummer, - cnt_contract_omschrijving, - cnt_contract_looptijd_tot, - cnt_contract_kosten, - cnt_contract_uurloon, - cnt_prs_bedrijf_key, - cnt_contract_nummer_intern, - cnt_contract_korting, - prs_contactpersoon_key, - ins_discipline_key, - cnt_contract_document, - prs_perslid_key_eig, - prs_perslid_key_beh, - prs_afdeling_key_eig, - cnt_contract_status, - cnt_contract_looptijd_van, - prs_kostenplaats_key, - cnt_contract_termijnkosten, - cnt_contract_opmerking, - cnt_contract_mantel_key, - cnt_contract_opzegtermijn, - cnt_contract_rappeltermijn, - cnt_contract_versie, - prs_dienst_key, - cnt_contract_verlenging) - VALUES (rec.nummer_extern, - rec.beschrijving, - rec.datum_eind, - rec.bedrag, - rec.uurtarief, - rec.prs_bedrijf_key, - rec.nummer_intern, - rec.korting, - v_contactpersoon_key, - v_cnt_discipline_key, - rec.omschrijving, - v_perslid_key_eig, - v_perslid_key_beh, - rec.prs_afdeling_key, - v_cnt_status, - rec.datum_ingang, - rec.prs_kostenplaats_key, - rec.bedrag_termijn, - rec.opmerking, - rec.mantel_key, - v_termijn_key_opzeg, - v_termijn_key_rappel, - rec.versie, - rec.prs_dienst_key, - rec.verlengen) - RETURNING cnt_contract_key INTO v_contract_key; - - v_srtnoti_code := 'CNTNEW'; - v_count_cntnew := v_count_cntnew + 1; - ELSE -- Contract bestaat al --> bijwerken. - SELECT cnt_contract_key - INTO v_contract_key - FROM cnt_contract - WHERE TRIM (cnt_contract_nummer_intern) = rec.nummer_intern - AND COALESCE (cnt_contract_versie, '0') = COALESCE (rec.versie, '0') - AND cnt_contract_verwijder IS NULL; - - v_errormsg := 'Fout bij bijwerken contract.'; - - UPDATE cnt_contract - SET cnt_contract_nummer = rec.nummer_extern, - cnt_contract_omschrijving = rec.beschrijving, - cnt_contract_looptijd_tot = rec.datum_eind, - cnt_contract_kosten = rec.bedrag, - cnt_contract_uurloon = rec.uurtarief, - cnt_prs_bedrijf_key = rec.prs_bedrijf_key, - cnt_contract_korting = rec.korting, - prs_contactpersoon_key = v_contactpersoon_key, - ins_discipline_key = v_cnt_discipline_key, - cnt_contract_document = rec.omschrijving, - prs_perslid_key_eig = v_perslid_key_eig, - prs_perslid_key_beh = v_perslid_key_beh, - prs_afdeling_key_eig = rec.prs_afdeling_key, - cnt_contract_looptijd_van = rec.datum_ingang, - prs_kostenplaats_key = rec.prs_kostenplaats_key, - cnt_contract_termijnkosten = rec.bedrag_termijn, - cnt_contract_opmerking = rec.opmerking, - cnt_contract_mantel_key = rec.mantel_key, - cnt_contract_opzegtermijn = v_termijn_key_opzeg, - cnt_contract_rappeltermijn = v_termijn_key_rappel, - cnt_contract_versie = rec.versie, - prs_dienst_key = rec.prs_dienst_key, - cnt_contract_verlenging = rec.verlengen - WHERE cnt_contract_key = v_contract_key; - - v_srtnoti_code := 'CNTUPD'; - v_count_cntupd := v_count_cntupd + 1; - END IF; - - -- Upsert gebouwscope: bij UPDATE eerst kijken of scope al bestaat. - -- Zo niet, dan toevoegen (bij INSERT altijd toevoegen). - -- NB. Op deze manier kan een contract meerdere keren voorkomen in - -- het importbestand, met verschillende gebouwen. - IF (rec.plaats_key IS NOT NULL) - THEN - -- Komt deze scope al voor? - SELECT COUNT ( * ) - INTO v_count - FROM cnt_contract_plaats - WHERE cnt_contract_key = v_contract_key - AND cnt_alg_plaats_key = rec.plaats_key - AND cnt_alg_plaats_code = rec.plaats_code; - - - IF (v_count = 0) -- Scope komt nog niet voor, dus toevoegen. - THEN - v_errormsg := 'Fout bij toevoegen scope'; - - INSERT INTO cnt_contract_plaats ( - cnt_contract_key, - cnt_alg_plaats_key, - cnt_alg_plaats_code - ) - VALUES ( - v_contract_key, - rec.plaats_key, - rec.plaats_code + -- Verplichte velden (via interface) zijn bij import al gecontroleerd! + -- Afdeling: moet geldig zijn! + v_errormsg := 'Fout bij bepalen afdeling: ' || rec.afdeling; + IF (rec.prs_afdeling_key IS NULL) + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || v_errormsg + , 'Contract wordt overgeslagen' ); - END IF; - END IF; + v_geldig := 0; + END IF; - -- NULL-waarden resulteren NIET in het wissen van kenmerkvelden - -- (bijwerken kan wel, maar wissen dus niet)! - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde1); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde2); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde3); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde4); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde5); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde6); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde7); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde8); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde9); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde10); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde11); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde12); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde13); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde14); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde15); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde16); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde17); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde18); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde19); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde20); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde21); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde22); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde23); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde24); - upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde25); + -- Eigenaar (als meegegeven) + -- In geval van abonnement verplicht. + IF (rec.perslid_eig IS NOT NULL AND rec.prs_perslid_key_eig IS NULL) + THEN -- *niet gevonden, wel meegegeven + v_errormsg := 'Fout bij bepalen eigenaar: ' || rec.perslid_eig; + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || v_errormsg + , 'leeg gelaten' + ); + ELSIF (rec.prs_perslid_key_eig IS NOT NULL) + THEN -- *wel gevonden (impliceert meegegeven) + v_perslid_key_eig := rec.prs_perslid_key_eig; + ELSE -- *niet meegegeven, dus niet gevonden + IF (rec.ins_discipline_key IS NOT NULL) + THEN -- Speciaal geval abonnementen: abonnee (eigenaar) is dan verplicht. + -- Contract is een abonnement, als de contractsoort aan een catalogus + -- gekoppeld is. + -- Is er een (actuele) catalogus aan deze contractsoort gekoppeld? + SELECT COUNT(*) + INTO v_count + FROM bes_disc_params p + , bes_discipline b + WHERE p.bes_disc_params_cnt_disckey = rec.ins_discipline_key + AND p.bes_ins_discipline_key = b.ins_discipline_key + AND b.ins_discipline_verwijder IS NULL; - fac.trackaction (v_srtnoti_code, - v_contract_key, - NULL, - NULL, - NULL); - COMMIT; - END IF; - EXCEPTION - WHEN OTHERS - THEN - oracle_err_num := SQLCODE; - oracle_err_mes := SUBSTR (SQLERRM, 1, 200); - v_errormsg := - v_errormsg - || ' ORACLE (error ' - || oracle_err_num - || '/' - || oracle_err_mes - || ')'; - fac.imp_writelog (p_import_key, - 'E', - v_aanduiding || v_errormsg, - ''); - COMMIT; - END; - END LOOP; + IF (v_count > 0) + THEN -- dit is een abonnement, dus de eigenaar is verplicht + v_errormsg := 'Fout bij bepalen eigenaar-abonnee'; + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || v_errormsg + , 'Contract wordt overgeslagen' + ); + v_geldig := 0; + END IF; + END IF; + END IF; - fac.imp_writelog (p_import_key, - 'S', - 'CNT-contracten/#ingelezen: ' || TO_CHAR (v_count_tot), - ''); - fac.imp_writelog ( - p_import_key, - 'S', - 'CNT-contracten/#toegevoegd: ' || TO_CHAR (v_count_cntnew), - '' - ); - fac.imp_writelog ( - p_import_key, - 'S', - 'CNT-contracten/#bijgewerkt: ' || TO_CHAR (v_count_cntupd), - '' - ); - COMMIT; + -- Beheerder: backup _FACILITOR. + v_errormsg := 'Fout bij bepalen beheerder: ' || rec.perslid_beh; + IF (rec.prs_perslid_key_beh IS NULL) + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || v_errormsg + , '_FACILITOR gebruikt' + ); + v_perslid_key_beh := v_facilitor_key; + ELSE + v_perslid_key_beh := rec.prs_perslid_key_beh; + END IF; + + -- Bedrijf: moet geldig zijn! + v_errormsg := 'Fout bij bepalen bedrijf: ' || rec.bedrijf_naam; + IF (rec.prs_bedrijf_key IS NULL) + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || v_errormsg + , 'Contract wordt overgeslagen' + ); + v_geldig := 0; + END IF; + + -- Kostenplaats: moet bestaan. + v_errormsg := 'Fout bij bepalen kostenplaats: ' || rec.kpn_code; + IF (rec.prs_kostenplaats_key IS NULL) + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || v_errormsg + , 'Contract wordt overgeslagen' + ); + v_geldig := 0; + END IF; + + -- Locatie/gebouw (als meegegeven): moet bestaan en ook passen bij de + -- contractsoort (type_key 3=Ondersteuning of 5=Leverancier). + IF (rec.locgeb_scope IS NOT NULL) + THEN + v_errormsg := 'Fout bij bepalen locatie/gebouw: ' || rec.locgeb_scope ||'|'|| rec.locgeb_code; + IF (rec.plaats_key IS NULL) + THEN -- Geen locatie/gebouw gevonden. + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || v_errormsg + , 'Contract/scope wordt overgeslagen' + ); + v_geldig := 0; + END IF; + + v_errormsg := 'Fout bij matchen contractsoort-scope'; + IF (rec.cnt_srtcontract_type NOT IN (3, 5)) + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || v_errormsg + , 'Contract/scope wordt overgeslagen' + ); + v_geldig := 0; + END IF; + END IF; + + -- Mantel: niet verplicht, wel rapporteren als niets gevonden. + v_errormsg := 'Fout bij bepalen mantel: ' || rec.mantel_nr; + IF (rec.mantel_nr IS NOT NULL AND rec.mantel_key IS NULL) + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || v_errormsg + , 'Contract niet aan mantel gekoppeld' + ); + END IF; + + -- Dienst: niet verplicht, wel rapporteren als niets gevonden. + v_errormsg := 'Fout bij bepalen dienst: ' || rec.dienst; + IF (rec.dienst IS NOT NULL AND rec.prs_dienst_key IS NULL) + THEN + fac.imp_writelog( p_import_key, 'W' + , v_aanduiding || v_errormsg + , 'Contract niet aan dienst gekoppeld' + ); + END IF; + + -- Alleen verder gaan als alles zinnig bevonden is. + IF (v_geldig = 1) + THEN + -- Contractsoort: toevoegen (type Leverancier). + IF (rec.ins_discipline_key IS NULL) + THEN + -- Misschien is de contractsoort tijdens import al toegevoegd? + -- (dan was 'ie er voor de cursor nog niet.) + BEGIN + v_errormsg := 'Fout bij bepalen contractsoort'; + SELECT ins_discipline_key + INTO v_cnt_discipline_key + FROM cnt_discipline + WHERE ins_discipline_verwijder IS NULL + AND UPPER(ins_discipline_omschrijving) = UPPER(rec.cnt_soort); + EXCEPTION + WHEN NO_DATA_FOUND THEN + -- Contractsoort bestaat gewoon niet; toevoegen. + v_errormsg := 'Fout bij toevoegen contractsoort:' || rec.cnt_soort; + INSERT INTO ins_tab_discipline + ( ins_discipline_module + , ins_discipline_omschrijving + ) + VALUES ( 'CNT' + , rec.cnt_soort + ) + RETURNING ins_discipline_key + INTO v_cnt_discipline_key; + + -- Type Leverancier, geen kostensoort, geen factuurmarges. + INSERT INTO cnt_disc_params + ( cnt_ins_discipline_key + , cnt_srtcontract_type + ) + VALUES ( v_cnt_discipline_key + , c_contract_type + ); + + fac.imp_writelog( p_import_key, 'I' + , v_aanduiding || 'Contractsoort "' || rec.cnt_soort || '" aangemaakt' + , 'Nieuwe contractsoort' + ); + END; + ELSE + v_cnt_discipline_key := rec.ins_discipline_key; + END IF; + + -- Contactpersoon (als meegegeven): bepalen/toevoegen bij bedrijf. + IF (rec.contact_naam IS NOT NULL AND rec.prs_contactpersoon_key IS NULL) + THEN + -- Misschien is de contractsoort tijdens import al toegevoegd? + -- (dan was 'ie er voor de cursor nog niet.) + BEGIN + v_errormsg := 'Fout bij bepalen contactpersoon'; + SELECT prs_contactpersoon_key + INTO v_contactpersoon_key + FROM prs_contactpersoon + WHERE prs_contactpersoon_verwijder IS NULL + AND prs_bedrijf_key = rec.prs_bedrijf_key + AND UPPER(prs_contactpersoon_naam) = UPPER(rec.contact_naam); + EXCEPTION + WHEN NO_DATA_FOUND THEN + -- Contactpersoon bestaat gewoon niet; toevoegen. + v_errormsg := 'Fout bij toevoegen contactpersoon:' || rec.contact_naam; + INSERT INTO prs_contactpersoon + ( prs_contactpersoon_naam + , prs_bedrijf_key + ) + VALUES ( rec.contact_naam + , rec.prs_bedrijf_key + ) + RETURNING prs_contactpersoon_key + INTO v_contactpersoon_key; + + fac.imp_writelog( p_import_key, 'I' + , v_aanduiding || 'Contactpersoon "' || rec.contact_naam || '" aangemaakt' + , 'Nieuwe contactpersoon' + ); + END; + ELSE + v_contactpersoon_key := rec.prs_contactpersoon_key; + END IF; + + -- Opzegtermijn: bepalen/toevoegen. + -- Als geen opzegtermijn ingevuld, dan is er geen opzegtermijn: 'Geen' = 0 weken. + v_errormsg := 'Fout bij bepalen opzegtermijn'; + bepaal_termijn(rec.datum_opzeg, rec.datum_eind, v_termijn_type, v_termijn_aantal, true); + + -- Bestaat de termijn al? + BEGIN + v_errormsg := 'Fout bij bepalen opzegtermijn'; + SELECT cnt_termijn_key + INTO v_termijn_key_opzeg + FROM cnt_termijn + WHERE cnt_termijn_type = v_termijn_type + AND cnt_termijn_aantal = v_termijn_aantal; + EXCEPTION + WHEN NO_DATA_FOUND THEN + v_errormsg := 'Fout bij toevoegen opzegtermijn'; + INSERT INTO cnt_termijn + ( cnt_termijn_omschrijving + , cnt_termijn_type + , cnt_termijn_aantal + ) + VALUES ( TO_CHAR(v_termijn_aantal) || CASE WHEN v_termijn_type = 'Y' THEN 'Jaar' + WHEN v_termijn_type = 'M' THEN 'Maand(en)' + WHEN v_termijn_type = 'D' THEN 'Dage(en)' + END + , v_termijn_type + , v_termijn_aantal + ) + RETURNING cnt_termijn_key + INTO v_termijn_key_opzeg; + END; + + -- Rappeltermijn: bepalen/toevoegen. + -- Als geen rappeltermijn ingevuld, dan is er geen rappeltermijn: 'Geen' = 0 weken. + v_errormsg := 'Fout bij bepalen rappeltermijn'; + -- Als geen opzegdatum, dan einddatum. + bepaal_termijn(rec.datum_rappel, COALESCE(rec.datum_opzeg, rec.datum_eind), v_termijn_type, v_termijn_aantal, true); + + -- Bestaat de termijn al? + BEGIN + v_errormsg := 'Bepalen rappeltermijn'; + SELECT cnt_termijn_key + INTO v_termijn_key_rappel + FROM cnt_termijn + WHERE cnt_termijn_type = v_termijn_type + AND cnt_termijn_aantal = v_termijn_aantal; + EXCEPTION + WHEN NO_DATA_FOUND THEN + v_errormsg := 'Toevoegen rappeltermijn'; + INSERT INTO cnt_termijn + ( cnt_termijn_omschrijving + , cnt_termijn_type + , cnt_termijn_aantal + ) + VALUES ( TO_CHAR(v_termijn_aantal) || CASE WHEN v_termijn_type = 'Y' THEN 'Jaar' + WHEN v_termijn_type = 'M' THEN 'Maand(en)' + WHEN v_termijn_type = 'D' THEN 'Dage(en)' + END + , v_termijn_type + , v_termijn_aantal + ) + RETURNING cnt_termijn_key + INTO v_termijn_key_rappel; + END; + + -- Controleren of er al een contract met hetzelfde nummer en versie; + -- bestaat; toevoegen vs. bijwerken. + v_errormsg := 'Fout bij bepalen contract'; + SELECT COUNT(*) + INTO v_count + FROM cnt_v_aanwezigcontract + WHERE TRIM(cnt_contract_nummer_intern) = rec.nummer_intern + AND COALESCE(cnt_contract_versie, '0') = COALESCE(rec.versie, '0'); + + IF (v_count = 0) -- Contract bestaat nog niet --> toevoegen. + THEN + -- Als rec.nummer_intern is NULL, dan wordt door FACILITOR een + -- nummer bepaald (= cnt_contract_key)! + v_errormsg := 'Fout bij toevoegen contract.'; + -- Status van nieuwe melding is afhankelijk van of het contract approval mechanisme actief is en + -- het bedrag moet groter zijn als limiet 1 anders hoeft er überhaupt niet gefiatteerd te worden en kan het contract direct actief (0) worden. + IF fac.getSetting('cnt_contract_approval') = 1 AND rec.bedrag > fac.getSetting('cnt_contract_limit1') + THEN + v_cnt_status := 2; + ELSE + v_cnt_status := 0; + END IF; + + INSERT INTO cnt_contract + ( cnt_contract_nummer + , cnt_contract_omschrijving + , cnt_contract_looptijd_tot + , cnt_contract_kosten + , cnt_contract_uurloon + , cnt_prs_bedrijf_key + , cnt_contract_nummer_intern + , cnt_contract_korting + , prs_contactpersoon_key + , ins_discipline_key + , cnt_contract_document + , prs_perslid_key_eig + , prs_perslid_key_beh + , prs_afdeling_key_eig + , cnt_contract_status + , cnt_contract_looptijd_van + , prs_kostenplaats_key + , prs_kostensoort_key + , cnt_contract_termijnkosten + , cnt_contract_opmerking + , cnt_contract_mantel_key + , cnt_contract_opzegtermijn + , cnt_contract_rappeltermijn + , cnt_contract_versie + , prs_dienst_key + , cnt_contract_verlenging + ) + VALUES ( rec.nummer_extern + , rec.beschrijving + , rec.datum_eind + , rec.bedrag + , rec.uurtarief + , rec.prs_bedrijf_key + , rec.nummer_intern + , rec.korting + , v_contactpersoon_key + , v_cnt_discipline_key + , rec.omschrijving + , v_perslid_key_eig + , v_perslid_key_beh + , rec.prs_afdeling_key + , v_cnt_status + , rec.datum_ingang + , rec.prs_kostenplaats_key + , rec.prs_kostensoort_key + , rec.bedrag_termijn + , rec.opmerking + , rec.mantel_key + , v_termijn_key_opzeg + , v_termijn_key_rappel + , rec.versie + , rec.prs_dienst_key + , rec.verlengen + ) + RETURNING cnt_contract_key + INTO v_contract_key; + + v_srtnoti_code := 'CNTNEW'; + v_count_cntnew := v_count_cntnew + 1; + ELSE -- Contract bestaat al --> bijwerken. + SELECT c.cnt_contract_key + INTO v_contract_key + FROM cnt_contract c + WHERE TRIM(c.cnt_contract_nummer_intern) = rec.nummer_intern + AND COALESCE(c.cnt_contract_versie, '0') = COALESCE(rec.versie, '0') + AND c.cnt_contract_verwijder IS NULL + AND c.cnt_contract_looptijd_tot = (SELECT MAX(d.cnt_contract_looptijd_tot) + FROM cnt_contract d + WHERE d.cnt_contract_nummer_intern = c.cnt_contract_nummer_intern + AND COALESCE(d.cnt_contract_versie, '0') = COALESCE(c.cnt_contract_versie, '0') + ); + + v_errormsg := 'Fout bij bijwerken contract.'; + UPDATE cnt_contract + SET cnt_contract_nummer = rec.nummer_extern + , cnt_contract_omschrijving = rec.beschrijving + , cnt_contract_looptijd_tot = rec.datum_eind + , cnt_contract_kosten = rec.bedrag + , cnt_contract_uurloon = rec.uurtarief + , cnt_prs_bedrijf_key = rec.prs_bedrijf_key + , cnt_contract_korting = rec.korting + , prs_contactpersoon_key = v_contactpersoon_key + , ins_discipline_key = v_cnt_discipline_key + , cnt_contract_document = rec.omschrijving + , prs_perslid_key_eig = v_perslid_key_eig + , prs_perslid_key_beh = v_perslid_key_beh + , prs_afdeling_key_eig = rec.prs_afdeling_key + , cnt_contract_looptijd_van = rec.datum_ingang + , prs_kostenplaats_key = rec.prs_kostenplaats_key + , prs_kostensoort_key = rec.prs_kostensoort_key + , cnt_contract_termijnkosten = rec.bedrag_termijn + , cnt_contract_opmerking = rec.opmerking + , cnt_contract_mantel_key = rec.mantel_key + , cnt_contract_opzegtermijn = v_termijn_key_opzeg + , cnt_contract_rappeltermijn = v_termijn_key_rappel + , cnt_contract_versie = rec.versie + , prs_dienst_key = rec.prs_dienst_key + , cnt_contract_verlenging = rec.verlengen + WHERE cnt_contract_key = v_contract_key; + + v_srtnoti_code := 'CNTUPD'; + v_count_cntupd := v_count_cntupd + 1; + END IF; + + -- Upsert gebouwscope: bij UPDATE eerst kijken of scope al bestaat. + -- Zo niet, dan toevoegen (bij INSERT altijd toevoegen). + -- NB. Op deze manier kan een contract meerdere keren voorkomen in + -- het importbestand, met verschillende gebouwen. + IF (rec.plaats_key IS NOT NULL) + THEN -- Komt deze scope al voor? + SELECT COUNT(*) + INTO v_count + FROM cnt_contract_plaats + WHERE cnt_contract_key = v_contract_key + AND cnt_alg_plaats_key = rec.plaats_key + AND cnt_alg_plaats_code = rec.plaats_scope; + + IF (v_count = 0) -- Scope komt nog niet voor, dus toevoegen. + THEN + v_errormsg := 'Fout bij toevoegen scope'; + INSERT INTO cnt_contract_plaats + ( cnt_contract_key + , cnt_alg_plaats_key + , cnt_alg_plaats_code + ) + VALUES ( v_contract_key + , rec.plaats_key + , rec.plaats_scope + ); + END IF; + END IF; + + -- NULL-waarden resulteren NIET in het wissen van kenmerkvelden + -- (bijwerken kan wel, maar wissen dus niet)! + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde1); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde2); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde3); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde4); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde5); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde6); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde7); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde8); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde9); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde10); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde11); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde12); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde13); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde14); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde15); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde16); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde17); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde18); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde19); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde20); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde21); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde22); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde23); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde24); + upsert_cntkenmerk (v_contract_key, rec.cnt_kenmerkwaarde25); + + fac.trackaction(v_srtnoti_code, v_contract_key, NULL, NULL, NULL); + COMMIT; + END IF; + EXCEPTION + WHEN OTHERS THEN + oracle_err_num := SQLCODE; + oracle_err_mes := SUBSTR(SQLERRM, 1, 200); + v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; + COMMIT; + END; + END LOOP; + + fac.imp_writelog( p_import_key, 'S', 'CNT-contracten/#ingelezen: ' || TO_CHAR (v_count_tot), ''); + fac.imp_writelog( p_import_key, 'S', 'CNT-contracten/#toegevoegd: ' || TO_CHAR (v_count_cntnew), ''); + fac.imp_writelog( p_import_key, 'S', 'CNT-contracten/#bijgewerkt: ' || TO_CHAR (v_count_cntupd), ''); + 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_errormsg, - 'Importproces contracten afgebroken!'); + 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_errormsg + , 'Importproces contracten afgebroken!' + ); END fac_update_cnt; / - - -------------------------------- Standaard Export Procedures ----------------------------------- -- JGL: Overigens is bij een ORDER BY DBMS_RANDOM.VALUE niet gegarandeerd dat die voor -- elke regel een unieke waarde heeft! Vergelijk 'ORDER BY SYSDATE': dit zou ook niet sorteren. diff --git a/FAC/FAC_VIEEXP.SRC b/FAC/FAC_VIEEXP.SRC index 21212094..52c366b1 100644 --- a/FAC/FAC_VIEEXP.SRC +++ b/FAC/FAC_VIEEXP.SRC @@ -496,5 +496,104 @@ SELECT l.alg_locatie_code Locatiecode AND p.prs_perslid_apikey IS NULL ; +CREATE OR REPLACE VIEW fac_v_exp_contract +AS +SELECT c.cnt_contract_nummer_intern ContractNr --A_nummer_intern + , c.cnt_contract_versie Versie --B_versie + , c.cnt_contract_nummer ExternNr --C_nummer_extern + , (SELECT ins_discipline_omschrijving + FROM cnt_discipline + WHERE ins_discipline_key = c.ins_discipline_key) ContractSoort --D_contractsoort + , c.cnt_contract_omschrijving Beschrijving --E_beschrijving + , m.cnt_contract_nummer_intern MantelNr --F_mantel_nummer + , m.cnt_contract_versie MantelNr_versie --G_mantel_versie + , TRANSLATE(c.cnt_contract_document, chr(10)||chr(13), '\n') Omschrijving --H_omschrijving + , (SELECT prs_dienst_omschrijving + FROM prs_dienst + WHERE prs_dienst_key = c.prs_dienst_key) Dienst --I_dienst + , a.prs_afdeling_naam Eigenaar_afd --J_afdeling + , e.prs_perslid_email Eigenaar_email --K_eigenaar + , b.prs_perslid_email Beheerder_email --L_beheerder + , TRANSLATE(c.cnt_contract_opmerking, chr(10)||chr(13), '\n') Opmerking --M_opmerking + , TO_CHAR(c.cnt_contract_looptijd_van, 'dd-mm-yyyy') Ingangsdatum --N_ingangsdatum + , TO_CHAR(cnt.cnt_getTermijndatum( cnt.cnt_getTermijndatum( c.cnt_contract_looptijd_tot + , c.cnt_contract_opzegtermijn + , -1) + , c.cnt_contract_rappeltermijn + , -1), 'dd-mm-yyyy') Rappeldatum --O_rappeldatum + , TO_CHAR(cnt.cnt_getTermijndatum( c.cnt_contract_looptijd_tot + , c.cnt_contract_opzegtermijn + , -1), 'dd-mm-yyyy') Opzegdatum --P_opzegdatum + , TO_CHAR(c.cnt_contract_looptijd_tot, 'dd-mm-yyyy') Einddatum --Q_einddatum + , CASE WHEN c.cnt_prs_perslid_key IS NOT NULL + THEN 'P' + ELSE 'B' + END Soort_contactpartij --R_soortcontact + , CASE WHEN c.cnt_prs_perslid_key IS NOT NULL + THEN (SELECT prs_perslid_email + FROM prs_perslid + WHERE prs_perslid_key = c.cnt_prs_perslid_key) + ELSE (SELECT prs_bedrijf_naam + FROM prs_bedrijf + WHERE prs_bedrijf_key = c.cnt_prs_bedrijf_key) + END Bedrijfsnaam --S_bedrijfnaam + , (SELECT prs_contactpersoon_email + FROM prs_contactpersoon + WHERE prs_contactpersoon_key = c.prs_contactpersoon_key) ContactNaam --T_contactpersoon + , (SELECT prs_kostenplaats_nr + FROM prs_kostenplaats + WHERE prs_kostenplaats_key = c.prs_kostenplaats_key) KostenplaatsCode --U_kostenplaatscode + , (SELECT prs_kostensoort_oms + FROM prs_kostensoort + WHERE prs_kostensoort_key = c.prs_kostensoort_key) KostensoortCode --V_kostensoortcode + , TO_CHAR(c.cnt_contract_kosten) Contractbedrag --W_contractbedrag + , TO_CHAR(c.cnt_contract_termijnkosten) Termijnbedrag --X_termijnbedrag + , TO_CHAR(c.cnt_contract_uurloon) Uurtarief --Y_uurtarief + , TO_CHAR(c.cnt_contract_korting) Korting --Z_korting + , p.cnt_alg_plaats_code ScopeType --AA_scope + , (SELECT MIN(CASE WHEN p.cnt_alg_plaats_code = 'L' THEN alg_locatie_code + WHEN p.cnt_alg_plaats_code = 'G' THEN alg_gebouw_code + ELSE '' + END) + FROM alg_v_gebouw_gegevens + WHERE CASE WHEN p.cnt_alg_plaats_code = 'L' THEN alg_locatie_key + WHEN p.cnt_alg_plaats_code = 'G' THEN alg_gebouw_key + END = p.cnt_alg_plaats_key + ) LocatieGebouw_code --AB_locatiegebouw + , c.cnt_contract_verlenging Verlengen --AC_verlengen + --, CASE WHEN c.cnt_contract_verlenging = 5 + -- THEN cnt.cnt_getTermijndatum( c.cnt_contract_looptijd_tot + -- , c.cnt_contract_verleng_termijn + -- , 1) + -- ELSE NULL + -- END Verlengdatum + FROM cnt_contract c + , (SELECT mm.cnt_contract_key + , mm.cnt_contract_nummer_intern + , mm.cnt_contract_versie + FROM cnt_contract mm + , cnt_disc_params md + WHERE mm.ins_discipline_key = md.cnt_ins_discipline_key + AND md.cnt_srtcontract_type = 6 + AND mm.cnt_contract_status != 1 + ) m + , cnt_contract_plaats p + , prs_afdeling a + , prs_v_aanwezigperslid b + , prs_v_aanwezigperslid e + , prs_kostenplaats k + WHERE c.cnt_contract_mantel_key = m.cnt_contract_key(+) + AND c.cnt_contract_key = p.cnt_contract_key(+) + AND c.prs_afdeling_key_eig = a.prs_afdeling_key + AND c.prs_perslid_key_beh = b.prs_perslid_key + AND c.prs_perslid_key_eig = e.prs_perslid_key + AND c.prs_kostenplaats_key = k.prs_kostenplaats_key + AND c.cnt_contract_verwijder IS NULL + AND a.prs_afdeling_verwijder IS NULL + AND b.prs_perslid_email IS NOT NULL + AND k.prs_kostenplaats_verwijder IS NULL + ORDER BY c.cnt_contract_nummer_intern + , c.cnt_contract_versie +; REGISTERRUN('$Id$')