diff --git a/PDKL/PDKL.sql b/PDKL/PDKL.sql new file mode 100644 index 000000000..69afc71e7 --- /dev/null +++ b/PDKL/PDKL.sql @@ -0,0 +1,1638 @@ +-- +-- $Id$ +-- +-- Script containing customer specific sql statements for the FACILITOR database +-- + +DEFINE thisfile = 'PDKL.SQL' +DEFINE dbuser = 'PDKL' + +SET ECHO ON +SET DEFINE ON +COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT; +COLUMN fcltcusttxt NEW_VALUE fcltcusttxt NOPRINT; +WHENEVER SQLERROR CONTINUE; + +SELECT adm.getscriptspoolfile ('&thisfile') AS fcltlogfile FROM DUAL; + +SPOOL &fcltlogfile +WHENEVER SQLERROR EXIT; + +SELECT adm.checkscriptcust ('&dbuser') AS fcltcusttxt FROM DUAL; + +WHENEVER SQLERROR CONTINUE; +--------------------------------------- +PROMPT &fcltcusttxt +--------------------------------------- +SET DEFINE OFF + +------ payload begin ------ + +-- Procedures om catalogi in te lezen en te verwerken + +CREATE OR REPLACE PROCEDURE pdkl_import_catalogus (p_import_key IN NUMBER) +IS + p_discipline_key NUMBER (10); + p_bedrijf_key NUMBER (10); + + 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); + v_aanduiding VARCHAR2 (200); + header_is_valid NUMBER := 0; + v_count_tot NUMBER (10) := 0; + v_count_import NUMBER (10) := 0; + v_ongeldig NUMBER (1) := 0; + + -- De importvelden + v_discipline_omschrijving VARCHAR2 (255); + v_bedrijf_naam VARCHAR2 (255); + v_catalogus_datum VARCHAR2 (255); + v_srtdeel_nr VARCHAR2 (255); + v_srtgroep_omschrijving VARCHAR2 (255); + v_srtdeel_omschrijving VARCHAR2 (255); + v_srtdeel_prijs VARCHAR2 (255); + v_srtdeel_eenheid VARCHAR2 (255); + v_srtdeel_image VARCHAR2 (255); + v_srtdeel_veelvoud VARCHAR2 (255); + v_srtdeel_btw VARCHAR2 (255); + v_srtdeel_vervaldatum VARCHAR2 (255); + v_srtdeel_inkprijs VARCHAR2 (255); + v_srtdeel_minimum VARCHAR2 (255); + v_bes_staffeltabel_naam VARCHAR2 (255); + v_srtdeel_wijzigdagen VARCHAR2 (255); + v_srtdeel_annuleerdagen VARCHAR2 (255); + v_srtdeel_opmerking VARCHAR2 (4000); -- straks afgekapt op 2000 + v_srtdeel_maximum VARCHAR2 (255); + v_srtdeel_notitie VARCHAR2 (255); + v_srtdeel_volgnr VARCHAR2 (255); + v_srtdeel_voorraadmin VARCHAR2 (255); + v_srtdeel_voorraadmax VARCHAR2 (255); + + -- Overige velden: + v_discipline_key NUMBER (10); + v_bedrijf_key NUMBER (10); + v_bes_staffeltabel_key NUMBER (10); + + + CURSOR c1 IS + SELECT fac_imp_file_line, + LENGTH (TRIM (REPLACE (fac_imp_file_line, c_delim, ''))) regellengte + FROM FAC_IMP_FILE + WHERE fac_import_key = p_import_key + ORDER BY fac_imp_file_index; +BEGIN + SELECT ins_discipline_key, prs_bedrijf_key + INTO p_discipline_key, p_bedrijf_key + FROM fac_import fi, fac_import_app fia + WHERE fi.fac_import_key = p_import_key AND fi.fac_import_app_key = fia.fac_import_app_key; + + -- Eerst opruiming + -- LET OP: we ondersteunen geen multi-variant meer + DELETE FROM fac_imp_catalogus; + + FOR rec IN c1 + LOOP + BEGIN + v_aanduiding := ''; + v_errorhint := 'Fout inlezen importregel'; + v_newline := rec.fac_imp_file_line; + v_ongeldig := 0; + + -- Lees alle veldwaarden + fac.imp_getfield (v_newline, c_delim, v_discipline_omschrijving); + fac.imp_getfield (v_newline, c_delim, v_bedrijf_naam); + fac.imp_getfield (v_newline, c_delim, v_catalogus_datum); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_nr); + fac.imp_getfield (v_newline, c_delim, v_srtgroep_omschrijving); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_omschrijving); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_prijs); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_eenheid); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_image); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_veelvoud); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_btw); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_vervaldatum); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_inkprijs); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_minimum); + fac.imp_getfield (v_newline, c_delim, v_bes_staffeltabel_naam); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_wijzigdagen); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_annuleerdagen); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_opmerking); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_maximum); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_notitie); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_volgnr); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_voorraadmin); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_voorraadmax); + + -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen + -- de juiste kolomkop. Ik controleer daarbij - sinds UWVA#21562 - bijna alle + -- kolommen (spaties in kolomheaders zijn onhandig bij "round-trip syncen"). + -- Ik negeer alles totdat ik een geldige header ben gepasseerd. + IF (header_is_valid = 0) + THEN + IF UPPER (TRIM (v_discipline_omschrijving)) LIKE 'CATALOGUS%' + AND UPPER (TRIM (v_bedrijf_naam)) = 'LEVERANCIER' + --AND UPPER (TRIM (v_catalogus_datum)) = 'CAT DATUM' -- Laat maar! + AND UPPER (TRIM (v_srtdeel_nr)) = 'ARTIKELNR' + AND UPPER (TRIM (v_srtgroep_omschrijving)) = 'GROEP' + AND UPPER (TRIM (v_srtdeel_omschrijving)) = 'OMSCHRIJVING' + AND UPPER (TRIM (v_srtdeel_prijs)) = 'PRIJS' + AND UPPER (TRIM (v_srtdeel_eenheid)) = 'EENHEID' + AND UPPER (TRIM (v_srtdeel_image)) = 'PICTURE' + AND UPPER (TRIM (v_srtdeel_veelvoud)) = 'ORDERAANTAL' + AND UPPER (TRIM (v_srtdeel_btw)) = 'TAX' + AND UPPER (TRIM (v_srtdeel_vervaldatum)) = 'DUEDATE' + AND UPPER (TRIM (v_srtdeel_inkprijs)) = 'INKOOPPRIJS' + AND UPPER (TRIM (v_srtdeel_minimum)) = 'MINIMUM' + AND UPPER (TRIM (v_bes_staffeltabel_naam)) = 'STAFFELTABEL' + --AND UPPER (TRIM (v_srtdeel_wijzigdagen)) = 'WIJZIGDAGEN' -- Laat maar! + --AND UPPER (TRIM (v_srtdeel_annuleerdagen)) = 'ANNULEERDAGEN' -- Laat maar! + AND UPPER (TRIM (v_srtdeel_opmerking)) = 'OPMERKING' + AND UPPER (TRIM (v_srtdeel_maximum)) = 'MAXIMUM' + AND UPPER (TRIM (v_srtdeel_notitie)) = 'NOTITIE' + AND UPPER (TRIM (v_srtdeel_volgnr)) = 'VOLGNUMMER' + AND UPPER (TRIM (v_srtdeel_voorraadmin)) = 'MINIMUMVOORRAAD' + AND UPPER (TRIM (v_srtdeel_voorraadmax)) = 'MAXIMUMVOORRAAD' + THEN + header_is_valid := 1; + END IF; + ELSIF rec.regellengte > 1 -- Lege regels overslaan! + THEN + v_count_tot := v_count_tot + 1; + v_aanduiding := + '[' + || TRIM (v_discipline_omschrijving) + || '|' + || TRIM (v_bedrijf_naam) + || '|' + || TRIM (v_srtdeel_nr) + || '] '; + + v_discipline_omschrijving := TRIM (v_discipline_omschrijving); + v_errorhint := 'Catalogus onbekend/ongeldig; regel wordt niet ingelezen'; + + SELECT ins_discipline_key + INTO v_discipline_key + FROM INS_TAB_DISCIPLINE + WHERE UPPER (ins_discipline_omschrijving) = UPPER (v_discipline_omschrijving) + AND COALESCE (p_discipline_key, ins_discipline_key) = ins_discipline_key -- CONN#20934/Import bedoelt voor catalogus? + AND ins_discipline_module = 'BES' + AND ins_discipline_verwijder IS NULL; + + v_bedrijf_naam := TRIM (v_bedrijf_naam); + v_errorhint := 'Bedrijf onbekend/ongeldig; regel wordt niet ingelezen'; + + SELECT prs_bedrijf_key + INTO v_bedrijf_key + FROM PRS_BEDRIJF + WHERE UPPER (prs_bedrijf_naam) = UPPER (v_bedrijf_naam) + AND COALESCE (p_bedrijf_key, prs_bedrijf_key) = prs_bedrijf_key -- Import bedoelt voor bedrijf? + AND prs_bedrijf_verwijder IS NULL; + + v_errorhint := 'Fout bij controleren importregel'; + + -- Indien leeg, dan catalogusdatum=SYSDATE gebruiken! + v_catalogus_datum := + COALESCE (TRIM (v_catalogus_datum), TO_CHAR (SYSDATE, 'yyyymmdd')); + + IF fac.safe_to_date (v_catalogus_datum, 'yyyymmdd') IS NULL + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ongeldige catalogusdatum', + 'Regel wordt niet ingelezen'); + v_ongeldig := 1; + END IF; + + v_srtdeel_nr := TRIM (v_srtdeel_nr); + + IF LENGTH (v_srtdeel_nr) > 32 + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Artikelnummer te lang', + 'Nummer wordt afgebroken (Nr:' || v_srtdeel_nr || ')'); + END IF; + + v_srtgroep_omschrijving := TRIM (v_srtgroep_omschrijving); + + IF LENGTH (v_srtgroep_omschrijving) > 60 + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Groepomschrijving te lang', + 'Omschrijving wordt afgebroken (Nr:' || v_srtdeel_nr || ')'); + END IF; + + v_srtdeel_omschrijving := TRIM (v_srtdeel_omschrijving); + + IF LENGTH (v_srtdeel_omschrijving) > 100 + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Artikelomschrijving te lang', + 'Omschrijving wordt afgebroken (Nr:' || v_srtdeel_nr || ')'); + END IF; + + -- Indien leeg, dan blijft/wordt prijs=ongedefinieerd=NULL! + v_srtdeel_prijs := TRIM (v_srtdeel_prijs); + + IF v_srtdeel_prijs IS NOT NULL AND fac.safe_to_number (v_srtdeel_prijs) IS NULL + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ongeldige prijs', + 'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'); + v_ongeldig := 1; + END IF; + + v_srtdeel_eenheid := TRIM (v_srtdeel_eenheid); + + IF LENGTH (v_srtdeel_eenheid) > 30 + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Eenheid te lang', + 'Eenheid wordt afgebroken (Nr:' || v_srtdeel_nr || ')'); + END IF; + + v_srtdeel_image := TRIM (v_srtdeel_image); + + IF LENGTH (v_srtdeel_image) > 255 + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Imagenaam te lang', + 'Naam wordt afgebroken (Nr:' || v_srtdeel_nr || ')'); + END IF; + + -- Veelvoud mag niet negatief of meer zijn dan 6 posities lang. + -- Indien leeg, dan veelvoud=1! + v_srtdeel_veelvoud := COALESCE (TRIM (v_srtdeel_veelvoud), '1'); + + IF fac.safe_to_number (v_srtdeel_veelvoud) IS NULL + OR fac.safe_to_number (v_srtdeel_veelvoud) < 0 + OR fac.safe_to_number (v_srtdeel_veelvoud) > 999999 + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ongeldig veelvoud', + 'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'); + v_ongeldig := 1; + END IF; + + -- Indien leeg, dan blijft/wordt BTW-tarief=ongedefinieerd=NULL! + v_srtdeel_btw := TRIM (v_srtdeel_btw); + + IF v_srtdeel_btw IS NOT NULL AND fac.safe_to_number (v_srtdeel_btw) IS NULL + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ongeldig BTW-tarief', + 'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'); + v_ongeldig := 1; + END IF; + + -- Indien leeg, dan blijft/wordt vervaldatum=ongedefinieerd=NULL! + v_srtdeel_vervaldatum := TRIM (v_srtdeel_vervaldatum); + + IF v_srtdeel_vervaldatum IS NOT NULL + AND fac.safe_to_date (v_srtdeel_vervaldatum, 'yyyymmdd') IS NULL + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ongeldige vervaldatum', + 'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'); + v_ongeldig := 1; + END IF; + + -- Indien leeg, dan blijft/wordt inkoopprijs=ongedefinieerd=NULL! + v_srtdeel_inkprijs := TRIM (v_srtdeel_inkprijs); + + IF v_srtdeel_inkprijs IS NOT NULL + AND fac.safe_to_number (v_srtdeel_inkprijs) IS NULL + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ongeldige inkoopprijs', + 'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'); + v_ongeldig := 1; + END IF; + + -- Minimum mag niet negatief of meer zijn dan 6 posities lang. + -- Indien leeg, dan blijft/wordt minimum=ongedefinieerd=NULL! + v_srtdeel_minimum := TRIM (v_srtdeel_minimum); + + IF v_srtdeel_minimum IS NOT NULL + AND ( fac.safe_to_number (v_srtdeel_minimum) IS NULL + OR fac.safe_to_number (v_srtdeel_minimum) < 0 + OR fac.safe_to_number (v_srtdeel_minimum) > 999999) + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ongeldig minimum', + 'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'); + v_ongeldig := 1; + END IF; + + v_bes_staffeltabel_naam := TRIM (v_bes_staffeltabel_naam); + v_errorhint := 'Fout bij bepalen staffeltabel; regel wordt niet ingelezen'; + + IF v_bes_staffeltabel_naam IS NOT NULL + THEN + SELECT bes_staffeltabel_key + INTO v_bes_staffeltabel_key + FROM bes_staffeltabel + WHERE UPPER (bes_staffeltabel_naam) = UPPER (v_bes_staffeltabel_naam); + END IF; + + -- Wijzigdagen mag niet negatief of meer zijn dan 3 posities lang. + -- Indien leeg, dan blijft/wordt wijzigdagen=ongedefinieerd=NULL! + v_srtdeel_wijzigdagen := TRIM (v_srtdeel_wijzigdagen); + + IF v_srtdeel_wijzigdagen IS NOT NULL + AND ( fac.safe_to_number (v_srtdeel_wijzigdagen) IS NULL + OR fac.safe_to_number (v_srtdeel_wijzigdagen) < 0 + OR fac.safe_to_number (v_srtdeel_wijzigdagen) > 999) + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ongeldig aantal wijzigdagen', + 'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'); + v_ongeldig := 1; + END IF; + + -- Annuleerdagen mag niet negatief of meer zijn dan 3 posities lang. + -- Indien leeg, dan blijft/wordt annuleerdagen=ongedefinieerd=NULL! + v_srtdeel_annuleerdagen := TRIM (v_srtdeel_annuleerdagen); + + IF v_srtdeel_annuleerdagen IS NOT NULL + AND ( fac.safe_to_number (v_srtdeel_annuleerdagen) IS NULL + OR fac.safe_to_number (v_srtdeel_annuleerdagen) < 0 + OR fac.safe_to_number (v_srtdeel_annuleerdagen) > 999) + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ongeldig aantal annuleerdagen', + 'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'); + v_ongeldig := 1; + END IF; + + v_srtdeel_opmerking := TRIM (v_srtdeel_opmerking); + + IF LENGTH (v_srtdeel_opmerking) > 2000 + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Opmerking te lang', + 'Opmerking wordt afgebroken (Nr:' || v_srtdeel_nr || ')'); + END IF; + + v_srtdeel_notitie := TRIM (v_srtdeel_notitie); + + IF LENGTH (v_srtdeel_notitie) > 50 + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Notitie te lang', + 'Notitie wordt afgebroken (Nr:' || v_srtdeel_nr || ')'); + END IF; + + -- Maximum mag niet negatief of meer zijn dan 6 posities lang. + -- Indien leeg, dan blijft/wordt maximum=ongedefinieerd=NULL! + v_srtdeel_maximum := TRIM (v_srtdeel_maximum); + + IF v_srtdeel_maximum IS NOT NULL + AND ( fac.safe_to_number (v_srtdeel_maximum) IS NULL + OR fac.safe_to_number (v_srtdeel_maximum) < 0 + OR fac.safe_to_number (v_srtdeel_maximum) > 999999) + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ongeldig maximum', + 'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'); + v_ongeldig := 1; + END IF; + + -- Volgnummer mag niet negatief of meer zijn dan 3 posities lang. + -- Indien leeg, dan blijft/wordt volgnummer=ongedefinieerd=NULL! + v_srtdeel_volgnr := TRIM (v_srtdeel_volgnr); + + IF v_srtdeel_volgnr IS NOT NULL + AND ( fac.safe_to_number (v_srtdeel_volgnr) IS NULL + OR fac.safe_to_number (v_srtdeel_volgnr) < 0 + OR fac.safe_to_number (v_srtdeel_volgnr) > 999) + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ongeldig volgnummer', + 'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'); + v_ongeldig := 1; + END IF; + + -- Minimale voorraad mag niet negatief of meer zijn dan 3 posities lang. + -- Indien leeg, dan blijft/wordt min voorraad=ongedefinieerd=NULL! + v_srtdeel_voorraadmin := TRIM (v_srtdeel_voorraadmin); + + IF v_srtdeel_voorraadmin IS NOT NULL + AND ( fac.safe_to_number (v_srtdeel_voorraadmin) IS NULL + OR fac.safe_to_number (v_srtdeel_voorraadmin) < 0 + OR fac.safe_to_number (v_srtdeel_voorraadmin) > 999) + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ongeldige minimale voorraad', + 'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'); + v_ongeldig := 1; + END IF; + + -- Maximale voorraad mag niet negatief of meer zijn dan 3 posities lang. + -- Indien leeg, dan blijft/wordt max voorraad=ongedefinieerd=NULL! + v_srtdeel_voorraadmax := TRIM (v_srtdeel_voorraadmax); + + IF v_srtdeel_voorraadmax IS NOT NULL + AND ( fac.safe_to_number (v_srtdeel_voorraadmax) IS NULL + OR fac.safe_to_number (v_srtdeel_voorraadmax) < 0 + OR fac.safe_to_number (v_srtdeel_voorraadmax) > 999) + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ongeldige maximale voorraad', + 'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'); + v_ongeldig := 1; + END IF; + + IF v_ongeldig = 0 + THEN + v_errorhint := 'Fout toevoegen importregel'; + + INSERT INTO PDKL_IMP_CATALOGUS (fac_import_key, + ins_discipline_key, + prs_bedrijf_key, + fac_imp_catalogus_datum, + ins_srtdeel_nr, + ins_srtgroep_omschrijving, + ins_srtdeel_omschrijving, + ins_srtdeel_prijs, + ins_srtdeel_inkprijs, + ins_srtdeel_eenheid, + ins_srtdeel_image, + ins_srtdeel_veelvoud, + ins_srtdeel_btw, + ins_srtdeel_vervaldatum, + ins_srtdeel_minimum, + bes_staffeltabel_key, + ins_srtdeel_wijzigdagen, + ins_srtdeel_annuleerdagen, + ins_srtdeel_opmerking, + bes_srtdeel_maximum, + bes_srtdeel_notitie, + bes_srtdeel_volgnr, + bes_srtdeel_voorraadmin, + bes_srtdeel_voorraadmax) + VALUES (p_import_key, + v_discipline_key, + v_bedrijf_key, + fac.safe_to_date (v_catalogus_datum, 'yyyymmdd'), + SUBSTR (v_srtdeel_nr, 1, 32), + SUBSTR (v_srtgroep_omschrijving, 1, 60), + SUBSTR (v_srtdeel_omschrijving, 1, 100), + fac.safe_to_number (v_srtdeel_prijs), + fac.safe_to_number (v_srtdeel_inkprijs), + SUBSTR (v_srtdeel_eenheid, 1, 30), + SUBSTR (v_srtdeel_image, 1, 255), + fac.safe_to_number (v_srtdeel_veelvoud), + fac.safe_to_number (v_srtdeel_btw), + fac.safe_to_date (v_srtdeel_vervaldatum, 'yyyymmdd'), + fac.safe_to_number (v_srtdeel_minimum), + v_bes_staffeltabel_key, + fac.safe_to_number (v_srtdeel_wijzigdagen), + fac.safe_to_number (v_srtdeel_annuleerdagen), + SUBSTR (v_srtdeel_opmerking, 1, 2000), + fac.safe_to_number (v_srtdeel_maximum), + SUBSTR (v_srtdeel_notitie, 1, 50), + fac.safe_to_number (v_srtdeel_volgnr), + fac.safe_to_number (v_srtdeel_voorraadmin), + fac.safe_to_number (v_srtdeel_voorraadmax)); + + v_count_import := v_count_import + 1; + END IF; + END IF; + EXCEPTION + WHEN OTHERS + THEN + oracle_err_num := SQLCODE; + oracle_err_mes := SUBSTR (SQLERRM, 1, 200); + v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || v_errormsg, + v_errorhint); + END; + END LOOP; + + IF (header_is_valid = 0) + THEN + fac.imp_writelog (p_import_key, + 'E', + 'Ongeldig importbestand', + 'Geen header of header niet volgens specificatie!'); + ELSE + fac.imp_writelog (p_import_key, + 'S', + 'Inleesproces: aantal ingelezen importregels: ' || TO_CHAR (v_count_tot), + ''); + fac.imp_writelog ( + p_import_key, + 'S', + 'Inleesproces: aantal ongeldige niet ingelezen importregels: ' + || TO_CHAR (v_count_tot - v_count_import), + ''); + END IF; + + COMMIT; +EXCEPTION + WHEN OTHERS + THEN + oracle_err_num := SQLCODE; + oracle_err_mes := SUBSTR (SQLERRM, 1, 200); + v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; + fac.imp_writelog (p_import_key, + 'E', + v_aanduiding || v_errormsg, + 'Inlezen catalogus afgebroken!'); +END pdkl_import_catalogus; +/ + +CREATE OR REPLACE PROCEDURE pdkl_update_catalogus (p_import_key IN NUMBER) +AS + v_errormsg VARCHAR2 (1000); + oracle_err_num NUMBER; + oracle_err_mes VARCHAR2 (200); + v_aanduiding VARCHAR2 (200); + v_disc_oms ins_tab_discipline.ins_discipline_omschrijving%TYPE; + v_bedr_naam prs_bedrijf.prs_bedrijf_naam%TYPE; + + -- Voor n catalogus + PROCEDURE l_update_catalogus (pdisc_key IN NUMBER, pbedr_key IN NUMBER) + AS + CURSOR c_delsrtdeel (cdisc_key IN NUMBER, cbedr_key IN NUMBER) + IS + SELECT sd.bes_srtdeel_key, sd.bes_srtdeel_nr, sd.bes_srtdeel_omschrijving + FROM bes_srtdeel sd, bes_srtgroep sg + WHERE sd.bes_srtgroep_key = sg.bes_srtgroep_key + AND sg.ins_discipline_key = cdisc_key + AND sd.prs_bedrijf_key = cbedr_key + AND sd.bes_srtdeel_verwijder IS NULL + AND NOT EXISTS -- Niet meer in importbestand irt. cat/bedrijf! + (SELECT 1 + FROM pdkl_imp_catalogus f + WHERE fac_import_key = p_import_key + AND f.ins_discipline_key = cdisc_key + AND f.prs_bedrijf_key = cbedr_key + AND UPPER (f.ins_srtdeel_nr) = UPPER (sd.bes_srtdeel_nr)); + + CURSOR c_delsrtgroep (cdisc_key IN NUMBER, cbedr_key IN NUMBER) + IS + SELECT sg.bes_srtgroep_key, sg.bes_srtgroep_omschrijving + FROM bes_srtgroep sg + WHERE sg.ins_discipline_key = cdisc_key + AND sg.bes_srtgroep_verwijder IS NULL + AND NOT EXISTS -- Niet meer in importbestand irt. alleen cat! + (SELECT 1 + FROM pdkl_imp_catalogus f + WHERE fac_import_key = p_import_key + AND f.ins_discipline_key = cdisc_key + AND UPPER (f.ins_srtgroep_omschrijving) = + UPPER (sg.bes_srtgroep_omschrijving)) + AND NOT EXISTS -- Waaronder geen artikelen van ander bedrijf! + (SELECT 1 + FROM bes_srtdeel sd + WHERE sd.bes_srtgroep_key = sg.bes_srtgroep_key + AND sd.prs_bedrijf_key <> cbedr_key); + + CURSOR c_inssrtgroep (cdisc_key IN NUMBER, cbedr_key IN NUMBER) + IS + SELECT DISTINCT f.ins_srtgroep_omschrijving + FROM pdkl_imp_catalogus f + WHERE fac_import_key = p_import_key + AND f.ins_srtgroep_omschrijving IS NOT NULL + AND f.ins_discipline_key = cdisc_key + AND f.prs_bedrijf_key = cbedr_key + AND NOT EXISTS + (SELECT 1 + FROM bes_srtgroep sg + WHERE sg.ins_discipline_key = cdisc_key + AND UPPER (sg.bes_srtgroep_omschrijving) = + UPPER (f.ins_srtgroep_omschrijving) + AND sg.bes_srtgroep_verwijder IS NULL); + + CURSOR c_updsrtdeel (cdisc_key IN NUMBER, cbedr_key IN NUMBER) + IS + SELECT s.bes_srtdeel_key, f.* + FROM pdkl_imp_catalogus f, bes_srtgroep g, bes_srtdeel s + WHERE fac_import_key = p_import_key + AND f.ins_discipline_key = cdisc_key + AND f.prs_bedrijf_key = cbedr_key + AND g.ins_discipline_key = cdisc_key + AND g.bes_srtgroep_key = s.bes_srtgroep_key + AND UPPER (s.bes_srtdeel_nr) = UPPER (f.ins_srtdeel_nr) + AND s.prs_bedrijf_key = cbedr_key + AND s.bes_srtdeel_verwijder IS NULL; + + CURSOR c_inssrtdeel (cdisc_key IN NUMBER, cbedr_key IN NUMBER) + IS + SELECT f.* + FROM pdkl_imp_catalogus f + WHERE fac_import_key = p_import_key + AND f.ins_discipline_key = cdisc_key + AND f.prs_bedrijf_key = cbedr_key + AND NOT EXISTS + (SELECT 1 + FROM bes_srtgroep g, bes_srtdeel s + WHERE g.ins_discipline_key = cdisc_key + AND g.bes_srtgroep_key = s.bes_srtgroep_key + AND UPPER (s.bes_srtdeel_nr) = UPPER (f.ins_srtdeel_nr) + AND s.prs_bedrijf_key = cbedr_key + AND s.bes_srtdeel_verwijder IS NULL); + + ccount NUMBER (10); + l_srtgroep_key NUMBER (10); + l_bes_srtdeel_key bes_srtdeel.bes_srtdeel_key%TYPE; + l_omschrijving bes_srtdeel.bes_srtdeel_omschrijving%TYPE; + l_prijs bes_srtdeel_prijs.bes_srtdeel_prijs_prijs%TYPE; + l_inkprijs bes_srtdeel_prijs.bes_srtdeel_prijs_inkprijs%TYPE; + l_veelvoud bes_srtdeel.bes_srtdeel_veelvoud%TYPE; + l_minimum bes_srtdeel.bes_srtdeel_minimum%TYPE; + l_wijzigdagen bes_srtdeel.bes_srtdeel_wijzigdagen%TYPE; + l_annuleerdagen bes_srtdeel.bes_srtdeel_annuleerdagen%TYPE; + l_opmerking bes_srtdeel.bes_srtdeel_opmerking%TYPE; + l_maximum bes_srtdeel.bes_srtdeel_maximum%TYPE; + l_notitie bes_srtdeel.bes_srtdeel_notitie%TYPE; + l_volgnr bes_srtdeel.bes_srtdeel_volgnr%TYPE; + l_voorraadmin bes_srtdeel.bes_srtdeel_voorraadmin%TYPE; + l_voorraadmax bes_srtdeel.bes_srtdeel_voorraadmax%TYPE; + BEGIN + -- DELETE SRTDEEL + ccount := 0; + + FOR rec IN c_delsrtdeel (pdisc_key, pbedr_key) + LOOP + v_errormsg := 'Fout bij verwijderen artikel ' || rec.bes_srtdeel_nr; + + UPDATE bes_srtdeel + SET bes_srtdeel_verwijder = SYSDATE + WHERE bes_srtdeel_key = rec.bes_srtdeel_key; + + v_errormsg := 'Fout bij verwijderen artikelkenmerken ' || rec.bes_srtdeel_nr; + + UPDATE bes_kenmerk + SET bes_kenmerk_verwijder = SYSDATE + WHERE bes_kenmerk_niveau = 'S' AND bes_srtinstallatie_key = rec.bes_srtdeel_key; + + fac.imp_writelog ( + p_import_key, + 'I', + v_aanduiding + || 'Artikel ' + || rec.bes_srtdeel_nr + || '/' + || rec.bes_srtdeel_omschrijving + || ' is verwijderd', + ''); + ccount := ccount + 1; + END LOOP; + + fac.imp_writelog ( + p_import_key, + 'S', + v_aanduiding || 'Er zijn ' || TO_CHAR (ccount) || ' artikelen verwijderd', + ''); + + COMMIT; + + -- DELETE SRTGROEP + ccount := 0; + + FOR rec IN c_delsrtgroep (pdisc_key, pbedr_key) + LOOP + v_errormsg := 'Fout bij verwijderen groep ' || rec.bes_srtgroep_omschrijving; + + UPDATE bes_srtgroep + SET bes_srtgroep_verwijder = SYSDATE + WHERE bes_srtgroep_key = rec.bes_srtgroep_key; + + v_errormsg := 'Fout bij verwijderen groepskenmerken ' || rec.bes_srtgroep_omschrijving; + + UPDATE bes_kenmerk + SET bes_kenmerk_verwijder = SYSDATE + WHERE bes_kenmerk_niveau = 'G' AND bes_srtinstallatie_key = rec.bes_srtgroep_key; + + fac.imp_writelog ( + p_import_key, + 'I', + v_aanduiding || 'Groep ' || rec.bes_srtgroep_omschrijving || ' is verwijderd', + ''); + ccount := ccount + 1; + END LOOP; + + fac.imp_writelog (p_import_key, + 'S', + v_aanduiding || 'Er zijn ' || TO_CHAR (ccount) || ' groepen verwijderd', + ''); + + COMMIT; + + -- INSERT SRTGROEP + ccount := 0; + + FOR rec IN c_inssrtgroep (pdisc_key, pbedr_key) + LOOP + BEGIN + v_errormsg := 'Fout bij toevoegen groep ' || rec.ins_srtgroep_omschrijving; + + INSERT INTO bes_srtgroep (ins_discipline_key, bes_srtgroep_omschrijving) + VALUES (pdisc_key, rec.ins_srtgroep_omschrijving); + + fac.imp_writelog ( + p_import_key, + 'I', + v_aanduiding || 'Groep ' || rec.ins_srtgroep_omschrijving || ' is toegevoegd', + ''); + ccount := ccount + 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, + ''); + END; + END LOOP; + + fac.imp_writelog (p_import_key, + 'S', + v_aanduiding || 'Er zijn ' || TO_CHAR (ccount) || ' groepen toegevoegd', + ''); + + COMMIT; + + -- UPDATE SRTDEEL + ccount := 0; + + FOR rec IN c_updsrtdeel (pdisc_key, pbedr_key) + LOOP + BEGIN + v_errormsg := 'Fout bij bepalen groep ' || rec.ins_srtgroep_omschrijving; + + SELECT bes_srtgroep_key + INTO l_srtgroep_key + FROM bes_srtgroep + WHERE bes_srtgroep_verwijder IS NULL + AND ins_discipline_key = pdisc_key + AND UPPER (bes_srtgroep_omschrijving) = + UPPER (rec.ins_srtgroep_omschrijving); + + v_errormsg := 'Fout bij bepalen huidige artikel-velden ' || rec.ins_srtdeel_nr; + + -- Tbv. logging de oude waarden opzoeken. + SELECT bes_srtdeel_omschrijving, + bes.getsrtdeelprijs (rec.bes_srtdeel_key, NULL), + bes.getsrtdeelinkprijs (rec.bes_srtdeel_key, NULL), + bes_srtdeel_veelvoud, + bes_srtdeel_minimum, + bes_srtdeel_wijzigdagen, + bes_srtdeel_annuleerdagen, + bes_srtdeel_opmerking, + bes_srtdeel_maximum, + bes_srtdeel_notitie, + bes_srtdeel_volgnr, + bes_srtdeel_voorraadmin, + bes_srtdeel_voorraadmax + INTO l_omschrijving, + l_prijs, + l_inkprijs, + l_veelvoud, + l_minimum, + l_wijzigdagen, + l_annuleerdagen, + l_opmerking, + l_maximum, + l_notitie, + l_volgnr, + l_voorraadmin, + l_voorraadmax + FROM bes_srtdeel + WHERE bes_srtdeel_verwijder IS NULL AND bes_srtdeel_key = rec.bes_srtdeel_key; + + v_errormsg := 'Fout bij bijwerken artikel ' || rec.ins_srtdeel_nr; + + -- Codetechnisch zou hier bes.upsert_srtdeel() passen, maar die doet bv nog geen inkprijs. + -- Later nog eens TODO + UPDATE bes_srtdeel + SET bes_srtgroep_key = l_srtgroep_key, + bes_srtdeel_omschrijving = rec.ins_srtdeel_omschrijving, + bes_srtdeel_image = rec.ins_srtdeel_image, + bes_srtdeel_btw = rec.ins_srtdeel_btw, + bes_srtdeel_eenheid = rec.ins_srtdeel_eenheid, + bes_srtdeel_vervaldatum = rec.ins_srtdeel_vervaldatum, + bes_srtdeel_veelvoud = rec.ins_srtdeel_veelvoud, + bes_srtdeel_minimum = rec.ins_srtdeel_minimum, + bes_staffeltabel_key = rec.bes_staffeltabel_key, + bes_srtdeel_wijzigdagen = rec.ins_srtdeel_wijzigdagen, + bes_srtdeel_annuleerdagen = rec.ins_srtdeel_annuleerdagen, + bes_srtdeel_opmerking = rec.ins_srtdeel_opmerking, + bes_srtdeel_maximum = rec.bes_srtdeel_maximum, + bes_srtdeel_notitie = rec.bes_srtdeel_notitie, + bes_srtdeel_volgnr = rec.bes_srtdeel_volgnr, + bes_srtdeel_voorraadmin = rec.bes_srtdeel_voorraadmin, + bes_srtdeel_voorraadmax = rec.bes_srtdeel_voorraadmax + WHERE bes_srtdeel_verwijder IS NULL AND bes_srtdeel_key = rec.bes_srtdeel_key; + + IF l_omschrijving <> rec.ins_srtdeel_omschrijving + THEN + fac.imp_writelog ( + p_import_key, + 'I', + 'Artikel ' + || rec.ins_srtdeel_nr + || '/' + || rec.ins_srtdeel_omschrijving + || ' is gewijzigd', + 'Omschrijving ' || l_omschrijving || ' -> ' || rec.ins_srtdeel_omschrijving); + END IF; + + bes.upsert_srtdeel_prijs (rec.bes_srtdeel_key, + rec.ins_srtdeel_prijs, + rec.ins_srtdeel_inkprijs); + + IF l_prijs <> rec.ins_srtdeel_prijs + THEN + fac.imp_writelog ( + p_import_key, + 'I', + 'Artikel ' + || rec.ins_srtdeel_nr + || '/' + || rec.ins_srtdeel_omschrijving + || ' is gewijzigd', + 'Prijs ' || l_prijs || ' -> ' || rec.ins_srtdeel_prijs); + END IF; + + IF l_inkprijs <> rec.ins_srtdeel_inkprijs + THEN + fac.imp_writelog ( + p_import_key, + 'I', + 'Artikel ' + || rec.ins_srtdeel_nr + || '/' + || rec.ins_srtdeel_omschrijving + || ' is gewijzigd', + 'Inkoopprijs ' || l_inkprijs || ' -> ' || rec.ins_srtdeel_inkprijs); + END IF; + + IF l_veelvoud <> rec.ins_srtdeel_veelvoud + THEN + fac.imp_writelog ( + p_import_key, + 'I', + 'Artikel ' + || rec.ins_srtdeel_nr + || '/' + || rec.ins_srtdeel_omschrijving + || ' is gewijzigd', + 'Bestelveelvoud ' || l_veelvoud || ' -> ' || rec.ins_srtdeel_veelvoud); + END IF; + + IF l_minimum <> rec.ins_srtdeel_minimum + THEN + fac.imp_writelog ( + p_import_key, + 'I', + 'Artikel ' + || rec.ins_srtdeel_nr + || '/' + || rec.ins_srtdeel_omschrijving + || ' is gewijzigd', + 'Bestelminimum ' || l_minimum || ' -> ' || rec.ins_srtdeel_minimum); + END IF; + + IF l_wijzigdagen <> rec.ins_srtdeel_wijzigdagen + THEN + fac.imp_writelog ( + p_import_key, + 'I', + 'Artikel ' + || rec.ins_srtdeel_nr + || '/' + || rec.ins_srtdeel_omschrijving + || ' is gewijzigd', + 'Wijzigdagen ' || l_wijzigdagen || ' -> ' || rec.ins_srtdeel_wijzigdagen); + END IF; + + IF l_annuleerdagen <> rec.ins_srtdeel_annuleerdagen + THEN + fac.imp_writelog ( + p_import_key, + 'I', + 'Artikel ' + || rec.ins_srtdeel_nr + || '/' + || rec.ins_srtdeel_omschrijving + || ' is gewijzigd', + 'Annuleerdagen ' + || l_annuleerdagen + || ' -> ' + || rec.ins_srtdeel_annuleerdagen); + END IF; + + IF l_opmerking <> rec.ins_srtdeel_opmerking + THEN + fac.imp_writelog ( + p_import_key, + 'I', + 'Artikel ' + || rec.ins_srtdeel_nr + || '/' + || rec.ins_srtdeel_omschrijving + || ' is gewijzigd', + 'Opmerking ' || l_opmerking || ' -> ' || rec.ins_srtdeel_opmerking); + END IF; + + IF l_maximum <> rec.bes_srtdeel_maximum + THEN + fac.imp_writelog ( + p_import_key, + 'I', + 'Artikel ' + || rec.ins_srtdeel_nr + || '/' + || rec.ins_srtdeel_omschrijving + || ' is gewijzigd', + 'Maximum ' || l_maximum || ' -> ' || rec.bes_srtdeel_maximum); + END IF; + + IF l_notitie <> rec.bes_srtdeel_notitie + THEN + fac.imp_writelog ( + p_import_key, + 'I', + 'Artikel ' + || rec.ins_srtdeel_nr + || '/' + || rec.ins_srtdeel_omschrijving + || ' is gewijzigd', + 'Notitie ' || l_notitie || ' -> ' || rec.bes_srtdeel_notitie); + END IF; + + IF l_volgnr <> rec.bes_srtdeel_volgnr + THEN + fac.imp_writelog ( + p_import_key, + 'I', + 'Artikel ' + || rec.ins_srtdeel_nr + || '/' + || rec.ins_srtdeel_omschrijving + || ' is gewijzigd', + 'Volgnr ' || l_volgnr || ' -> ' || rec.bes_srtdeel_volgnr); + END IF; + + + + IF l_voorraadmin <> rec.bes_srtdeel_voorraadmin + THEN + fac.imp_writelog ( + p_import_key, + 'I', + 'Artikel ' + || rec.ins_srtdeel_nr + || '/' + || rec.ins_srtdeel_omschrijving + || ' is gewijzigd', + 'Minimale voorraad ' + || l_voorraadmin + || ' -> ' + || rec.bes_srtdeel_voorraadmin); + END IF; + + IF l_voorraadmax <> rec.bes_srtdeel_voorraadmax + THEN + fac.imp_writelog ( + p_import_key, + 'I', + 'Artikel ' + || rec.ins_srtdeel_nr + || '/' + || rec.ins_srtdeel_omschrijving + || ' is gewijzigd', + 'Maximale voorraad ' + || l_voorraadmax + || ' -> ' + || rec.bes_srtdeel_voorraadmax); + END IF; + + ccount := ccount + 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, + ''); + END; + END LOOP; + + fac.imp_writelog ( + p_import_key, + 'S', + v_aanduiding || 'Er zijn ' || TO_CHAR (ccount) || ' artikelen bijgewerkt', + ''); + + COMMIT; + + -- INSERT SRTDEEL + ccount := 0; + + FOR rec IN c_inssrtdeel (pdisc_key, pbedr_key) + LOOP + BEGIN + v_errormsg := 'Fout bij bepalen groep ' || rec.ins_srtgroep_omschrijving; + + SELECT bes_srtgroep_key + INTO l_srtgroep_key + FROM bes_srtgroep + WHERE bes_srtgroep_verwijder IS NULL + AND ins_discipline_key = pdisc_key + AND UPPER (bes_srtgroep_omschrijving) = + UPPER (rec.ins_srtgroep_omschrijving); + + v_errormsg := 'Fout bij toevoegen artikel ' || rec.ins_srtdeel_nr; + + INSERT INTO bes_srtdeel (bes_srtgroep_key, + bes_srtdeel_nr, + bes_srtdeel_omschrijving, + bes_srtdeel_image, + bes_srtdeel_btw, + bes_srtdeel_eenheid, + bes_srtdeel_dimensie, + prs_bedrijf_key, + bes_srtdeel_vervaldatum, + bes_srtdeel_veelvoud, + bes_srtdeel_minimum, + bes_staffeltabel_key, + bes_srtdeel_wijzigdagen, + bes_srtdeel_annuleerdagen, + bes_srtdeel_opmerking, + bes_srtdeel_maximum, + bes_srtdeel_notitie, + bes_srtdeel_volgnr, + bes_srtdeel_voorraadmin, + bes_srtdeel_voorraadmax) + VALUES (l_srtgroep_key, + rec.ins_srtdeel_nr, + rec.ins_srtdeel_omschrijving, + rec.ins_srtdeel_image, + rec.ins_srtdeel_btw, + rec.ins_srtdeel_eenheid, + 0, + pbedr_key, + rec.ins_srtdeel_vervaldatum, + rec.ins_srtdeel_veelvoud, + rec.ins_srtdeel_minimum, + rec.bes_staffeltabel_key, + rec.ins_srtdeel_wijzigdagen, + rec.ins_srtdeel_annuleerdagen, + rec.ins_srtdeel_opmerking, + rec.bes_srtdeel_maximum, + rec.bes_srtdeel_notitie, + rec.bes_srtdeel_volgnr, + rec.bes_srtdeel_voorraadmin, + rec.bes_srtdeel_voorraadmax) + RETURNING bes_srtdeel_key + INTO l_bes_srtdeel_key; + + bes.upsert_srtdeel_prijs (l_bes_srtdeel_key, + rec.ins_srtdeel_prijs, + rec.ins_srtdeel_inkprijs); + + fac.imp_writelog ( + p_import_key, + 'I', + v_aanduiding + || 'Artikel ' + || rec.ins_srtdeel_nr + || '/' + || rec.ins_srtdeel_omschrijving + || ' is toegevoegd', + ''); + ccount := ccount + 1; + EXCEPTION + WHEN DUP_VAL_ON_INDEX + THEN + v_errormsg := 'Artikelnummer dubbel in importbestand'; + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || v_errormsg, + ''); + 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, + ''); + END; + END LOOP; + + fac.imp_writelog ( + p_import_key, + 'S', + v_aanduiding || 'Er zijn ' || TO_CHAR (ccount) || ' artikelen toegevoegd', + ''); + + COMMIT; + END; +BEGIN + -- Doorloop alle catalogi/ bedrijven. Er kunnen er in theorie meerdere tegelijk zijn + FOR rec IN (SELECT DISTINCT ins_discipline_key, prs_bedrijf_key + FROM pdkl_imp_catalogus + WHERE fac_import_key = p_import_key) + LOOP + BEGIN + -- Puur voor logging toch even catalogus- en bedrijfsnaam bepalen! + v_aanduiding := '[' || TO_CHAR (rec.ins_discipline_key) || '] '; + v_errormsg := 'Fout bepalen catalogus'; + + SELECT ins_discipline_omschrijving + INTO v_disc_oms + FROM ins_tab_discipline + WHERE ins_discipline_key = rec.ins_discipline_key; + + v_aanduiding := '[' || TO_CHAR (rec.prs_bedrijf_key) || '] '; + v_errormsg := 'Fout bepalen bedrijf'; + + SELECT prs_bedrijf_naam + INTO v_bedr_naam + FROM prs_v_aanwezigbedrijf + WHERE prs_bedrijf_key = rec.prs_bedrijf_key; + + fac.imp_writelog ( + p_import_key, + 'I', + 'Import van catalogus ' || v_disc_oms || '/' || v_bedr_naam, + 'discipline: ' || rec.ins_discipline_key || ', bedrijf: ' || rec.prs_bedrijf_key); + + COMMIT; + + v_aanduiding := '[' || v_disc_oms || '|' || v_bedr_naam || '] '; + l_update_catalogus (rec.ins_discipline_key, rec.prs_bedrijf_key); + 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; +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, + 'Verwerken catalogus afgebroken!'); +END pdkl_update_catalogus; +/ + +CREATE OR REPLACE VIEW PDKL_V_RAP_FIP_ARTPRIJS +AS + SELECT sd.bes_srtdeel_key key, + sd.bes_srtdeel_nr artikelnummer, + sd.bes_srtdeel_omschrijving artikelomschrijving, + b.prs_bedrijf_key, + b.prs_bedrijf_naam leverancier, + cat.ins_discipline_key, + cat.ins_discipline_omschrijving catalogus, + sp.bes_srtdeel_prijs_prijs prijs, + '' nieuwe_prijs, + '' ingangsdatum + FROM bes_srtdeel_prijs sp, + bes_srtdeel sd, + prs_bedrijf b, + bes_srtgroep gr, + ins_tab_discipline cat + WHERE sp.bes_srtdeel_prijs_vervaldatum IS NULL + AND sp.bes_srtdeel_key = sd.bes_srtdeel_key + AND sd.bes_srtdeel_verwijder IS NULL + AND sd.prs_bedrijf_key = b.prs_bedrijf_key + AND gr.bes_srtgroep_key = sd.bes_srtgroep_key + AND cat.ins_discipline_key = gr.ins_discipline_key; + +CREATE OR REPLACE PROCEDURE pdkl_import_prijs (p_import_key IN NUMBER) +IS + p_srtdeel_key NUMBER (10); + 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); + v_aanduiding VARCHAR2 (200); + v_file_index NUMBER; + header_is_valid NUMBER := 0; + v_count_tot NUMBER (10) := 0; + v_count_import NUMBER (10) := 0; + v_ongeldig NUMBER (1) := 0; + + -- De importvelden + v_srtdeel_key VARCHAR2 (255); + v_srtdeel_nr VARCHAR2 (255); + v_srtdeel_omschrijving VARCHAR2 (255); + v_bedrijf_naam VARCHAR2 (255); + v_discipline_omschrijving VARCHAR2 (255); + v_discipline_key VARCHAR2 (255); + v_srtdeel_prijs VARCHAR2 (255); + v_srtdeel_prijs_nieuw VARCHAR2 (255); + v_ingangsdatum VARCHAR2 (255); + + CURSOR c1 IS + SELECT fac_imp_file_line, + fac_imp_file_index, + LENGTH (TRIM (REPLACE (fac_imp_file_line, c_delim, ''))) regellengte + FROM FAC_IMP_FILE + WHERE fac_import_key = p_import_key + ORDER BY fac_imp_file_index; +BEGIN + DELETE FAC_IMP_CSV + WHERE fac_import_key = p_import_key; + + FOR rec IN c1 + LOOP + BEGIN + v_aanduiding := ''; + v_errorhint := 'Fout inlezen importregel'; + v_newline := rec.fac_imp_file_line; + v_file_index := rec.fac_imp_file_index; + + v_ongeldig := 0; + + -- Lees alle veldwaarden + fac.imp_getfield (v_newline, c_delim, v_srtdeel_nr); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_omschrijving); + fac.imp_getfield (v_newline, c_delim, v_bedrijf_naam); + fac.imp_getfield (v_newline, c_delim, v_discipline_omschrijving); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_prijs); + fac.imp_getfield (v_newline, c_delim, v_srtdeel_prijs_nieuw); + fac.imp_getfield (v_newline, c_delim, v_ingangsdatum); + + -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen + -- de juiste kolomkop. Ik controleer daarbij - sinds UWVA#21562 - bijna alle + -- kolommen (spaties in kolomheaders zijn onhandig bij "round-trip syncen"). + -- Ik negeer alles totdat ik een geldige header ben gepasseerd. + IF (header_is_valid = 0) + THEN + IF UPPER (TRIM (v_srtdeel_nr)) = 'ARTIKELNUMMER' + AND UPPER (TRIM (v_srtdeel_omschrijving)) = 'ARTIKELOMSCHRIJVING' + AND UPPER (TRIM (v_bedrijf_naam)) = 'LEVERANCIER' + AND UPPER (TRIM (v_discipline_omschrijving)) = 'CATALOGUS' + AND UPPER (TRIM (v_srtdeel_prijs)) = 'PRIJS' + AND UPPER (TRIM (v_srtdeel_prijs_nieuw)) = 'NIEUWE_PRIJS' + AND UPPER (TRIM (v_ingangsdatum)) = 'INGANGSDATUM' + THEN + header_is_valid := 1; + END IF; + ELSIF rec.regellengte > 1 -- Lege regels overslaan! + THEN + v_count_tot := v_count_tot + 1; + v_aanduiding := + '[' + || TRIM (v_discipline_omschrijving) + || TRIM (v_srtdeel_nr) + || '|' + || TRIM (v_srtdeel_omschrijving) + || '] '; + + -- Discipline en artikelnummer zijn verplicht + v_srtdeel_nr := TRIM (v_srtdeel_nr); + v_discipline_omschrijving := TRIM (v_discipline_omschrijving); + + IF v_srtdeel_nr IS NULL OR v_discipline_omschrijving IS NULL + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Artikelnummer en/of discipline niet gevuld', + 'Incomplete regel wordt niet ingelezen'); + v_ongeldig := 1; + END IF; + + -- Indien leeg, dan blijft/wordt ingangsdatum=ongedefinieerd=NULL! + v_ingangsdatum := TRIM (v_ingangsdatum); + + IF v_ingangsdatum IS NOT NULL + AND fac.safe_to_date (v_ingangsdatum, 'yyyymmdd') IS NULL + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ongeldige ingangsdatum', + 'Regel wordt niet ingelezen (key:' || v_srtdeel_key || ')'); + v_ongeldig := 1; + END IF; + + IF v_ongeldig = 0 + THEN + v_errorhint := 'Fout toevoegen importregel'; + + INSERT INTO FAC_IMP_CSV (fac_import_key, + fac_imp_csv_index, + 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) + VALUES (p_import_key, + v_file_index, + v_srtdeel_nr, + v_srtdeel_omschrijving, + v_bedrijf_naam, + v_discipline_omschrijving, + TO_CHAR (v_srtdeel_prijs), + TO_CHAR (v_srtdeel_prijs_nieuw), + v_ingangsdatum); + + v_count_import := v_count_import + 1; + END IF; + END IF; + EXCEPTION + WHEN OTHERS + THEN + oracle_err_num := SQLCODE; + oracle_err_mes := SUBSTR (SQLERRM, 1, 200); + v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || v_errormsg, + v_errorhint); + END; + END LOOP; + + UPDATE fac_imp_csv i + SET i.fac_imp_csv_col10 = + (SELECT cat.ins_discipline_key + FROM ins_tab_discipline cat + WHERE cat.ins_discipline_module = 'BES' + AND cat.ins_discipline_verwijder IS NULL + AND cat.ins_discipline_omschrijving = i.fac_imp_csv_col05); + + UPDATE fac_imp_csv i + SET i.fac_imp_csv_col01 = + (SELECT sd.bes_srtdeel_key + FROM bes_srtdeel sd, bes_srtgroep sg + WHERE sd.bes_srtgroep_key = sg.bes_srtgroep_key + AND sd.bes_srtdeel_verwijder IS NULL + AND ( sd.bes_srtdeel_vervaldatum IS NULL + OR sd.bes_srtdeel_vervaldatum > SYSDATE) + AND sd.bes_srtdeel_nr = i.fac_imp_csv_col02 + AND sg.ins_discipline_key = i.fac_imp_csv_col10); + + 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', + 'Inleesproces: aantal ingelezen importregels: ' || TO_CHAR (v_count_tot), + ''); + fac.imp_writelog ( + p_import_key, + 'S', + 'Inleesproces: aantal ongeldige niet ingelezen importregels: ' + || TO_CHAR (v_count_tot - v_count_import), + ''); + END IF; + + COMMIT; +EXCEPTION + WHEN OTHERS + THEN + oracle_err_num := SQLCODE; + oracle_err_mes := SUBSTR (SQLERRM, 1, 200); + v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; + fac.imp_writelog (p_import_key, + 'E', + v_aanduiding || v_errormsg, + 'Inlezen catalogus afgebroken!'); +END pdkl_import_prijs; +/ + +CREATE OR REPLACE PROCEDURE pdkl_update_prijs (p_import_key IN NUMBER) +AS + v_errormsg VARCHAR2 (1000); + oracle_err_num NUMBER; + oracle_err_mes VARCHAR2 (200); + v_aanduiding VARCHAR2 (200); + + v_currentprijs bes_srtdeel_prijs.bes_srtdeel_prijs_prijs%TYPE; + v_oude_prijs NUMBER; + v_max_ingangsdatum DATE; + + CURSOR c1 IS + SELECT fac_imp_csv_col01 bes_srtdeel_key, + fac_imp_csv_col02 artikelnr, + fac.safe_to_number (REPLACE (fac_imp_csv_col07, ',', '.')) nieuwe_prijs, + fac.safe_to_date (fac_imp_csv_col08, 'yyyymmdd') ingangsdatum + FROM FAC_IMP_CSV + WHERE fac_import_key = p_import_key; +BEGIN + FOR rec IN c1 + LOOP + IF rec.bes_srtdeel_key IS NULL + THEN + fac.imp_writelog (p_import_key, + 'W', + 'Artikel ' || rec.artikelnr || ' kon niet worden bijgewerkt', + 'Artikel is niet gevonden (catalogus of artikel is onbekend)'); + ELSE + -- Bepaal de actuele prijs + v_currentprijs := bes.getsrtdeelprijs (rec.bes_srtdeel_key, NULL); + + -- Bepaald de laatste vervaldatum + SELECT MAX (sdp.bes_srtdeel_prijs_vervaldatum) + INTO v_max_ingangsdatum + FROM bes_srtdeel_prijs sdp + WHERE sdp.bes_srtdeel_key = rec.bes_srtdeel_key + GROUP BY sdp.bes_srtdeel_key; + + --- er is geen (actuele) prijs bekend, dan kunnen we de prijs gewoon toevoegen + IF (v_currentprijs IS NULL AND rec.nieuwe_prijs IS NOT NULL) + THEN + INSERT INTO bes_srtdeel_prijs (bes_srtdeel_key, bes_srtdeel_prijs_prijs) + VALUES (rec.bes_srtdeel_key, ROUND (rec.nieuwe_prijs, 2)); + + fac.imp_writelog ( + p_import_key, + 'I', + 'Artikel ' || rec.bes_srtdeel_key || '/' || rec.artikelnr || ' is gewijzigd', + 'Artikel heeft: ' || rec.nieuwe_prijs || ' per: ' || rec.ingangsdatum); + --- er zijn al 1 of meer (toekomstige) prijzen, bepaal wat er moet gebeuren + ELSE + IF v_max_ingangsdatum IS NULL + THEN + -- er is nog geen vervaldatum v_max_ingangsdatum IS NULL, we nemen aan: er is nog maar 1 bestaand prijsrecord + -- de prijs zonder vervaldatum moet komen te vervallen op (p_ingangsdatum - 1) + -- de nieuwe prijs kan toegevoegd worden + UPDATE bes_srtdeel_prijs sdp + SET sdp.bes_srtdeel_prijs_vervaldatum = rec.ingangsdatum - 1 + WHERE sdp.bes_srtdeel_key = rec.bes_srtdeel_key + AND sdp.bes_srtdeel_prijs_vervaldatum IS NULL; + + INSERT INTO bes_srtdeel_prijs (bes_srtdeel_key, bes_srtdeel_prijs_prijs) + VALUES (rec.bes_srtdeel_key, ROUND (rec.nieuwe_prijs, 2)); + + fac.imp_writelog ( + p_import_key, + 'I', + 'Artikel ' + || rec.bes_srtdeel_key + || '/' + || rec.artikelnr + || ' is gewijzigd', + 'Artikel heeft nu een prijs: ' || round(rec.nieuwe_prijs,2)); + ELSE + IF (rec.ingangsdatum - 1) > v_max_ingangsdatum + THEN + -- de nieuwe vervaldatum ligt na de laatste vervaldatum (p_ingangsdatum - 1) > v_max_ingangsdatum + -- de prijs zonder vervaldatum moet de nieuwe vervaldatum krijgen (p_ingangsdatum - 1) + -- de nieuwe prijs kan toegevoegd worden + UPDATE bes_srtdeel_prijs sdp + SET sdp.bes_srtdeel_prijs_vervaldatum = rec.ingangsdatum - 1 + WHERE sdp.bes_srtdeel_key = rec.bes_srtdeel_key + AND sdp.bes_srtdeel_prijs_vervaldatum IS NULL; + + INSERT INTO bes_srtdeel_prijs (bes_srtdeel_key, bes_srtdeel_prijs_prijs) + VALUES (rec.bes_srtdeel_key, ROUND (rec.nieuwe_prijs, 2)); + + fac.imp_writelog ( + p_import_key, + 'I', + 'Artikel ' + || rec.bes_srtdeel_key + || '/' + || rec.artikelnr + || ' is gewijzigd', + 'Vervaldatum is opgegeven voor huidige prijs. Nieuwe prijs: ' + || ROUND(rec.nieuwe_prijs,2) + || ' per: ' + || rec.ingangsdatum); + ELSE + IF (rec.ingangsdatum - 1) = v_max_ingangsdatum + THEN + -- de nieuwe vervaldatum is gelijk aan de laatste vervaldatum (p_ingangsdatum - 1) = v_max_ingangsdatum + -- de regel zonder vervaldatum moet de nieuwe prijs krijgen, want dat is de laatste prijswijziging + -- de vervaldatum blijft ongewijzigd + UPDATE bes_srtdeel_prijs sdp + SET sdp.bes_srtdeel_prijs_prijs = ROUND (rec.nieuwe_prijs, 2) + WHERE sdp.bes_srtdeel_prijs_vervaldatum IS NULL + AND sdp.bes_srtdeel_key = rec.bes_srtdeel_key; + + fac.imp_writelog ( + p_import_key, + 'I', + 'Artikel ' + || rec.bes_srtdeel_key + || '/' + || rec.artikelnr + || ' is gewijzigd', + 'Nieuwe vervaldatum is gelijk aan de laatste vervaldatum. Prijs is aangepast naar: ' + || ROUND(rec.nieuwe_prijs,2)); + ELSE + IF (rec.ingangsdatum - 1) < v_max_ingangsdatum + THEN + -- de nieuwe vervaldatum ligt voor de laatste vervaldatum (p_ingangsdatum - 1) < v_max_ingangsdatum + -- we doen niets, er is al een nieuwere prijs bekend + -- we geven alleen een melding om handmatig de prijzen te controleren en aan te passen + fac.imp_writelog ( + p_import_key, + 'W', + 'Artikelprijs ' + || rec.bes_srtdeel_key + || '/' + || rec.artikelnr + || ' is niet gewijzigd', + 'Er is al een toekomstige prijsupdate bekend bij dit artikel'); + END IF; + END IF; + END IF; + END IF; + END IF; + END IF; + + COMMIT; + + END LOOP; +END pdkl_update_prijs; +/ +------ payload end ------ + +SET DEFINE OFF + +BEGIN + adm.systrackscriptId ('$Id$', 0); +END; +/ + +COMMIT; +SET ECHO OFF +SPOOL OFF +SET DEFINE ON +PROMPT Logfile of this upgrade is: &fcltlogfile \ No newline at end of file