diff --git a/FMHN/fmhn.sql b/FMHN/fmhn.sql new file mode 100644 index 000000000..834174a7d --- /dev/null +++ b/FMHN/fmhn.sql @@ -0,0 +1,5187 @@ + -- +-- $Id$ +-- +-- Script containing customer specific db-configuration for FMHN. +DEFINE thisfile = 'FMHN.SQL' +DEFINE dbuser = '^FMHN' + +SET ECHO ON +SET DEFINE ON +COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT; +WHENEVER SQLERROR EXIT; +SELECT adm.scriptspoolfile('&dbuser', '&thisfile') AS fcltlogfile FROM DUAL; +WHENEVER SQLERROR CONTINUE; +SPOOL &fcltlogfile +SET DEFINE OFF + +------ payload begin ------ + +-- Aangepaste import voor ruimten i.v.m. beperkingen export Stabicad + +CREATE OR REPLACE PROCEDURE fmhn_import_ruimten (p_import_key IN NUMBER + ) +AS + c_fielddelimitor VARCHAR2 (1) := ';'; + v_newline fac_imp_file.fac_imp_file_line%TYPE; -- Input line + v_errormsg VARCHAR2 (1000); + v_errorhint VARCHAR2 (1000); + oracle_err_num NUMBER; + oracle_err_mes VARCHAR2 (200); + header_is_valid NUMBER; + v_count NUMBER; + v_ongeldig NUMBER (1); + v_mode NUMBER (1); + v_aanduiding VARCHAR2 (200); + v_alg_kenmerk_key1 VARCHAR2 (255); + v_alg_kenmerk_key2 VARCHAR2 (255); + v_alg_kenmerk_key3 VARCHAR2 (255); + v_alg_kenmerk_key4 VARCHAR2 (255); + v_alg_kenmerk_key5 VARCHAR2 (255); + v_volledig_ruimtenr VARCHAR2 (255); + v_bouwdeel NUMBER (1); + -- De importvelden: + v_locatie_code VARCHAR2 (255); -- 10 + v_gebouw_code VARCHAR2 (255); -- 12 + v_verdieping_volgnr VARCHAR2 (255); -- 3,0 + v_verdieping_volgnr_n NUMBER (3, 0); -- 3,0 + v_srtruimte_omschrijving VARCHAR2 (255); -- 30 + v_ruimte_nr VARCHAR2 (255); -- 10 + v_ruimte_omschrijving VARCHAR2 (255); -- 30 + v_ruimte_bruto_vloeropp VARCHAR2 (255); -- 8,2 + v_ruimte_bruto_vloeropp_n NUMBER (8, 2); -- 8,2 + v_afdeling_naam VARCHAR2 (255); -- 10 + v_ruimte_afdeling_bezetting VARCHAR2 (255); -- 8,5 + v_ruimte_afdeling_bezetting_n VARCHAR2 (255); -- 8,5 + v_reserveerbaar VARCHAR2 (255); -- 1 + v_res_discipline_omschrijving VARCHAR2 (255); -- 60 + v_res_discipline_expire_dagen VARCHAR2 (255); -- 3 + v_res_disc_expire_dagen_n NUMBER (3, 0); -- 3 + v_res_ruimte_prijs VARCHAR2 (255); -- 7,2 + v_res_ruimte_prijs_n NUMBER (7, 2); -- 7,2 + v_res_opstelling_omschrijving VARCHAR2 (255); -- 30 + v_res_ruimte_opstel_bezoekers VARCHAR2 (255); -- 5,0 + v_res_ruimte_opstel_bez_n NUMBER (5, 0); -- 5,0 + v_res_ruimte_nr VARCHAR2 (255); -- 40 + v_res_ruimte_omschrijving VARCHAR2 (255); -- 255 + v_alg_kenmerkwaarde1 VARCHAR2 (255); + v_alg_kenmerkwaarde2 VARCHAR2 (255); + v_alg_kenmerkwaarde3 VARCHAR2 (255); + v_alg_kenmerkwaarde4 VARCHAR2 (255); + v_alg_kenmerkwaarde5 VARCHAR2 (255); + + CURSOR c1 + IS + SELECT * + FROM fac_imp_file + WHERE fac_import_key = p_import_key + ORDER BY fac_imp_file_index; + + -- Controleer tijdens import-fase op bestaan van kenmerk + FUNCTION bepaal_kenmerk_key (kw IN VARCHAR) + RETURN NUMBER + IS + v_kenmerk_key NUMBER; + BEGIN + IF fac.safe_to_number (kw) IS NULL + THEN -- kenmerkwaarde is alfanumeriek (dus omschrijving)! + SELECT alg_kenmerk_key + INTO v_kenmerk_key + FROM alg_kenmerk + WHERE alg_kenmerk_upper = UPPER (kw) + AND alg_kenmerk_verwijder IS NULL + AND alg_kenmerk_niveau = 'R' + AND alg_kenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B', 'V'); + ELSE -- kenmerkwaarde is numeriek (dus key)! + SELECT alg_kenmerk_key + INTO v_kenmerk_key + FROM alg_kenmerk + WHERE alg_kenmerk_key = fac.safe_to_number (kw) + AND alg_kenmerk_verwijder IS NULL + AND alg_kenmerk_niveau = 'R' + AND alg_kenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B', 'V'); + END IF; + + RETURN v_kenmerk_key; + EXCEPTION + WHEN NO_DATA_FOUND + THEN + IF kw IS NULL OR UPPER (kw) LIKE 'KENMERK%' + THEN + RETURN NULL; + ELSE + fac.imp_writelog (p_import_key, + 'W', + 'Fout bij bepalen kenmerk [' || kw || ']', + 'Bestaat niet of type ongeldig'); + COMMIT; + RETURN NULL; + END IF; + END; +BEGIN + DELETE FROM fac_imp_onrgoed2; + + header_is_valid := 0; + v_count := 0; + + SELECT COUNT (*) bouwdelen + INTO v_bouwdeel + FROM fac_imp_file + WHERE fac_import_key = p_import_key + AND fac_imp_file_line LIKE '%Verdiepingsnummer%' + ORDER BY fac_imp_file_index; + +-- Bepaal of er meer dan 1 bouwdeel wordt ingelezen (ieder bouwdeel heeft een header regel in de CSV + IF v_bouwdeel > 1 + THEN + v_bouwdeel := 1; + fac.imp_writelog (p_import_key, + 'I', + 'Er zijn bouwdelen gevonden.', + 'Tijdens het verwerken zullen de verdiepingen worden gesplitst per bouwdeel.' + ); + ELSE + v_bouwdeel := 0; + fac.imp_writelog (p_import_key, + 'I', + 'Geen bouwdelen gevonden.', + 'Deze verdieping wordt op de normale manier verwerkt.' + ); + END IF; + +-- Update de headerregel, de header uit Stabicad is niet bruikbaar. Kenmerk 1 = Volledig ruimtenummer i.v.m. de 10 posties beperking tot release 2021.1 + UPDATE fac_imp_file + SET fac_imp_file_line = 'Ruimtenummer;Ruimteomschrijving;Vloeroppervlak;Locatiecode;Gebouwcode;Bouwlaagvolgnummer;Ruimtefunctie;Afdelingscode;Bezetting;ReserveerbareRuimte;Categorie;Expiredagen;Prijs;Opstelling;AantalBezoekers;Naam;Omschrijving;Volledig Ruimtenummer;kenmerk2;kenmerk3;kenmerk4;kenmerk5' + WHERE fac_import_key = p_import_key + AND fac_imp_file_index = 1; + +-- Nu de bouwdelen zijn geteld en de header is omgehangen mogen andere eventuele header regels weg. + DELETE fac_imp_file + WHERE fac_import_key = p_import_key + AND fac_imp_file_line LIKE '%Verdiepingsnummer%'; + + FOR rec1 IN c1 + LOOP + BEGIN + v_errormsg := 'Fout FETCH te importeren rij'; + + v_newline := rec1.fac_imp_file_line; + v_errormsg := 'Fout opvragen te importeren rij'; + v_aanduiding := ''; + v_errorhint := ''; + v_ongeldig := 0; + + -- Lees alle veldwaarden, aangepast op export uit Stabicad + fac.imp_getfield (v_newline, c_fielddelimitor, v_ruimte_nr); + fac.imp_getfield (v_newline, c_fielddelimitor, v_ruimte_omschrijving); + fac.imp_getfield (v_newline, c_fielddelimitor, v_ruimte_bruto_vloeropp); + fac.imp_getfield (v_newline, c_fielddelimitor, v_locatie_code); + fac.imp_getfield (v_newline, c_fielddelimitor, v_gebouw_code); + fac.imp_getfield (v_newline, c_fielddelimitor, v_verdieping_volgnr); + fac.imp_getfield (v_newline, c_fielddelimitor, v_srtruimte_omschrijving); + fac.imp_getfield (v_newline, c_fielddelimitor, v_afdeling_naam); -- Alles vanaf hier is NULL + fac.imp_getfield (v_newline, c_fielddelimitor, v_ruimte_afdeling_bezetting); + fac.imp_getfield (v_newline, c_fielddelimitor, v_reserveerbaar); + fac.imp_getfield (v_newline, c_fielddelimitor, v_res_discipline_omschrijving); + fac.imp_getfield (v_newline, c_fielddelimitor, v_res_discipline_expire_dagen); + fac.imp_getfield (v_newline, c_fielddelimitor, v_res_ruimte_prijs); + fac.imp_getfield (v_newline, c_fielddelimitor, v_res_opstelling_omschrijving); + fac.imp_getfield (v_newline, c_fielddelimitor, v_res_ruimte_opstel_bezoekers); + fac.imp_getfield (v_newline, c_fielddelimitor, v_res_ruimte_nr); + fac.imp_getfield (v_newline, c_fielddelimitor, v_res_ruimte_omschrijving); + fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_kenmerkwaarde1); + fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_kenmerkwaarde2); + fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_kenmerkwaarde3); + fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_kenmerkwaarde4); + fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_kenmerkwaarde5); + + v_aanduiding := + v_locatie_code || '|' || v_gebouw_code || '|' || v_verdieping_volgnr || '|' || v_ruimte_nr || '| '; + + IF (header_is_valid = 0) + THEN + IF UPPER (v_locatie_code) = 'LOCATIECODE' + AND UPPER (v_ruimte_nr) = 'RUIMTENUMMER' + AND UPPER (v_res_ruimte_omschrijving) = 'OMSCHRIJVING' + THEN + v_alg_kenmerk_key1 := bepaal_kenmerk_key (v_alg_kenmerkwaarde1); + v_alg_kenmerk_key2 := bepaal_kenmerk_key (v_alg_kenmerkwaarde2); + v_alg_kenmerk_key3 := bepaal_kenmerk_key (v_alg_kenmerkwaarde3); + v_alg_kenmerk_key4 := bepaal_kenmerk_key (v_alg_kenmerkwaarde4); + v_alg_kenmerk_key5 := bepaal_kenmerk_key (v_alg_kenmerkwaarde5); + + header_is_valid := 1; + END IF; + ELSE + v_count := v_count + 1; + v_errormsg := 'Fout inlezen locatie [' || v_locatie_code || ']'; + + v_locatie_code := TRIM(v_locatie_code); + IF LENGTH (v_locatie_code) > 10 + THEN + v_locatie_code := SUBSTR (v_locatie_code, 1, 10); + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Locatie-aanduiding is te lang', + 'Aanduiding wordt afgebroken tot <' || v_locatie_code || '>' + ); + END IF; + + -- + v_errormsg := 'Fout inlezen gebouw [' || v_gebouw_code || ']'; + + v_gebouw_code := TRIM(v_gebouw_code); + IF LENGTH (v_gebouw_code) > 12 + THEN + v_gebouw_code := SUBSTR (v_gebouw_code, 1, 12); + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Gebouwcode-aanduiding is te lang', + 'Aanduiding wordt afgebroken tot <' || v_gebouw_code || '>' + ); + END IF; + + -- + v_errormsg := '1 Fout inlezen verdiepingvolgnr [' || v_verdieping_volgnr || ']'; + v_errorhint := 'Geef een geheel getal niet groter dan 3 posities'; + + IF (NVL (LENGTH (ROUND (fac.safe_to_number (v_verdieping_volgnr))), 10)) > 3 + THEN + fac.imp_writelog (p_import_key, + 'E', + v_aanduiding || 'xyz Ongeldig verdiepingvolgnummer [' || v_verdieping_volgnr || ']', + v_errorhint + ); + v_ongeldig := 1; + ELSE + v_verdieping_volgnr_n := ROUND (fac.safe_to_number (v_verdieping_volgnr)); + END IF; + + -- + v_errormsg := 'Fout inlezen ruimtefunctie [' || v_srtruimte_omschrijving || ']'; + + v_srtruimte_omschrijving := TRIM(v_srtruimte_omschrijving); + IF LENGTH (v_srtruimte_omschrijving) > 50 + THEN + v_srtruimte_omschrijving := SUBSTR (v_srtruimte_omschrijving, 1, 50); + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ruimtefunctie-aanduiding is te lang', + 'Aanduiding wordt afgebroken tot <' || v_srtruimte_omschrijving || '>' + ); + END IF; + + -- + v_errormsg := 'Fout inlezen ruimtenummer [' || v_ruimte_nr || ']'; + + -- Schrijf het volledige ruimtenummer per record weg in een eigen variabele + v_ruimte_nr := TRIM(v_ruimte_nr); + v_volledig_ruimtenr := TRIM(v_ruimte_nr); + IF LENGTH (v_ruimte_nr) > 10 + THEN + v_ruimte_nr := SUBSTR (v_ruimte_nr, -10); + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ruimtenr-aanduiding is te lang', + 'Aanduiding wordt afgebroken tot <' || v_ruimte_nr || '>' + ); + END IF; + + -- + v_errormsg := 'Fout inlezen ruimte [' || v_ruimte_omschrijving || ']'; + + v_ruimte_omschrijving := TRIM(v_ruimte_omschrijving); + IF LENGTH (v_ruimte_omschrijving) > 30 + THEN + v_ruimte_omschrijving := SUBSTR (v_ruimte_omschrijving, 1, 30); + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ruimte-aanduiding is te lang', + 'Aanduiding wordt afgebroken tot <' || v_ruimte_omschrijving || '>' + ); + END IF; + + -- + v_errormsg := 'Fout inlezen ruimte oppervlakte [' || v_ruimte_bruto_vloeropp || ']'; + v_errorhint := 'Maximaal grootte getal is 99999.99'; + + IF TRIM (v_ruimte_bruto_vloeropp) IS NULL + THEN + v_ruimte_bruto_vloeropp_n := TO_NUMBER (NULL); + ELSE + -- nls_numeric_characters wordt verondersteld + v_ruimte_bruto_vloeropp_n := TO_NUMBER (TRIM (REPLACE (v_ruimte_bruto_vloeropp, ',', '.')), '999999D99'); + END IF; + + -- + v_errormsg := 'Fout inlezen afdelingscode [' || v_afdeling_naam || ']'; + + v_afdeling_naam := TRIM(v_afdeling_naam); + IF LENGTH (v_afdeling_naam) > 15 + THEN + v_afdeling_naam := SUBSTR (v_afdeling_naam, 1, 15); + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Afdelingscode is te lang', + 'Afdelingscode wordt afgebroken tot <' || v_afdeling_naam || '>' + ); + END IF; + + -- + v_errormsg := 'Fout inlezen ruimtebezetting [' || v_ruimte_afdeling_bezetting || ']'; + v_errorhint := 'Maximaal grootte getal is 999.99999'; + + IF TRIM (v_ruimte_afdeling_bezetting) IS NULL + THEN + v_ruimte_afdeling_bezetting_n := TO_NUMBER (NULL); + ELSE + -- nls_numeric_characters wordt verondersteld + v_ruimte_afdeling_bezetting_n := TO_NUMBER (TRIM (REPLACE (v_ruimte_afdeling_bezetting, ',', '.')), '999D99999'); + END IF; + + -- + v_reserveerbaar := SUBSTR (TRIM (v_reserveerbaar), 1, 1); + -- + v_errormsg := 'Fout inlezen catalogus [' || v_res_discipline_omschrijving || ']'; + + v_res_discipline_omschrijving := TRIM(v_res_discipline_omschrijving); + IF LENGTH (v_res_discipline_omschrijving) > 60 + THEN + v_res_discipline_omschrijving := SUBSTR (v_res_discipline_omschrijving, 1, 60); + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Categorie-aanduiding ruimte is te lang', + 'Aanduiding wordt afgebroken tot <' || v_res_discipline_omschrijving || '>' + ); + END IF; + + -- + v_errormsg := 'Fout inlezen expire dagen [' || v_res_discipline_expire_dagen || ']'; + v_errorhint := 'Geef geheel getal niet groter dan 3 posities'; + + IF TRIM (v_res_discipline_expire_dagen) IS NULL + THEN + v_res_disc_expire_dagen_n := 0; + ELSE + v_res_disc_expire_dagen_n := TO_NUMBER (v_res_discipline_expire_dagen); + END IF; + + -- + v_errormsg := 'Fout inlezen prijs reserveerbare ruimte [' || v_res_ruimte_prijs || ']'; + v_errorhint := 'Maximaal grootte getal is 99999.99 '; + + IF (TRIM (v_res_ruimte_prijs) IS NULL) + THEN + v_res_ruimte_prijs_n := TO_NUMBER (NULL); + ELSE + -- nls_numeric_characters wordt verondersteld + v_res_ruimte_prijs_n := TO_NUMBER (TRIM (REPLACE (v_res_ruimte_prijs, ',', '.')), '999999D99'); + END IF; + + -- + v_errormsg := 'Fout inlezen opstelling [' || v_res_opstelling_omschrijving || ']'; + + v_res_opstelling_omschrijving := TRIM(v_res_opstelling_omschrijving); + IF LENGTH (v_res_opstelling_omschrijving) > 30 + THEN + v_res_opstelling_omschrijving := SUBSTR (v_res_opstelling_omschrijving, 1, 30); + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ruimteopstelling-aanduiding is te lang', + 'Aanduiding wordt afgebroken tot <' || v_res_opstelling_omschrijving || '>' + ); + END IF; + + -- + v_errormsg := 'Fout inlezen aantal bezoekers [' || v_res_ruimte_opstel_bezoekers || ']'; + v_errorhint := 'Geef geheel getal niet groter dan 5 posities'; + + IF TRIM (v_res_ruimte_opstel_bezoekers) IS NULL + THEN + v_res_ruimte_opstel_bez_n := TO_NUMBER (NULL); + ELSE + v_res_ruimte_opstel_bez_n := TO_NUMBER (v_res_ruimte_opstel_bezoekers); + END IF; + + -- + v_errormsg := 'Fout inlezen ruimte nummer reserveerbare ruimte omschrijving [' || v_res_ruimte_nr || ']'; + + v_res_ruimte_nr := TRIM(v_res_ruimte_nr); + IF LENGTH (v_res_ruimte_nr) > 40 + THEN + v_errormsg := 'Fout inlezen ruimte nummer reserveerbare ruimte omschrijving [' || v_res_ruimte_nr || ']'; + v_res_ruimte_nr := SUBSTR (v_res_ruimte_nr, 1, 40); + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ruimtenr-aanduiding reserveerbare ruimte is te lang', + 'Aanduiding wordt afgebroken tot <' || v_res_ruimte_nr || '>' + ); + v_errormsg := 'Fout inlezen ruimte nummer reserveerbare ruimte omschrijving [' || v_res_ruimte_nr || ']'; + END IF; + + v_errormsg := 'Fout inlezen ruimte nummer reserveerbare ruimte omschrijving [' || v_res_ruimte_nr || ']'; + -- + v_errormsg := 'Fout inlezen reserveerbare ruimte [' || v_res_ruimte_omschrijving || ']'; + + v_res_ruimte_omschrijving := TRIM(v_res_ruimte_omschrijving); + IF LENGTH (v_res_ruimte_omschrijving) > 255 + THEN + v_res_ruimte_omschrijving := SUBSTR (v_res_ruimte_omschrijving, 1, 255); + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding || 'Ruimte-aanduiding reserveerbare ruimte is te lang', + 'Aanduiding wordt afgebroken tot <' || v_res_ruimte_omschrijving || '>' + ); + END IF; + + v_alg_kenmerkwaarde1 := TRIM (v_alg_kenmerkwaarde1); + v_alg_kenmerkwaarde2 := TRIM (v_alg_kenmerkwaarde2); + v_alg_kenmerkwaarde3 := TRIM (v_alg_kenmerkwaarde3); + v_alg_kenmerkwaarde4 := TRIM (v_alg_kenmerkwaarde4); + v_alg_kenmerkwaarde5 := TRIM (v_alg_kenmerkwaarde5); + + -- Insert geformatteerde import record + IF v_ongeldig = 0 + THEN + v_errormsg := 'Fout bij toevoegen te impoteren ruimte [' || v_res_ruimte_omschrijving || ']'; + + INSERT INTO fac_imp_onrgoed2 ( + alg_locatie_code, + alg_gebouw_code, + alg_verdieping_volgnr, + alg_srtruimte_omschrijving, + alg_ruimte_nr, + alg_ruimte_omschrijving, + alg_ruimte_bruto_vloeropp, + prs_afdeling_naam, + prs_ruimteafdeling_bezetting, + reserveerbaar, + res_discipline_omschrijving, + res_discipline_expire_dagen, + res_ruimte_prijs, + res_opstelling_omschrijving, + res_ruimte_opstel_bezoekers, + res_ruimte_nr, + res_ruimte_omschrijving, + alg_kenmerkwaarde1, + alg_kenmerkwaarde2, + alg_kenmerkwaarde3, + alg_kenmerkwaarde4, + alg_kenmerkwaarde5 + ) + VALUES ( + v_locatie_code, + v_gebouw_code, + v_verdieping_volgnr_n, + v_srtruimte_omschrijving, + v_ruimte_nr, + v_ruimte_omschrijving, + v_ruimte_bruto_vloeropp_n, + v_afdeling_naam, + v_ruimte_afdeling_bezetting_n, + v_reserveerbaar, + v_res_discipline_omschrijving, + v_res_disc_expire_dagen_n, + v_res_ruimte_prijs_n, + v_res_opstelling_omschrijving, + v_res_ruimte_opstel_bez_n, + v_res_ruimte_nr, + v_res_ruimte_omschrijving, + DECODE (v_alg_kenmerk_key1, + NULL, v_alg_kenmerkwaarde1, + TO_CHAR (v_alg_kenmerk_key1) + || '=' + || SUBSTR (v_volledig_ruimtenr, 1, 200) -- Volledig ruimtenummer + ), + DECODE (v_alg_kenmerk_key2, + NULL, v_alg_kenmerkwaarde2, + TO_CHAR (v_alg_kenmerk_key2) + || '=' + || SUBSTR (v_alg_kenmerkwaarde2, 1, 200) + ), + DECODE (v_alg_kenmerk_key3, + NULL, v_alg_kenmerkwaarde3, + TO_CHAR (v_alg_kenmerk_key3) + || '=' + || SUBSTR (v_alg_kenmerkwaarde3, 1, 200) + ), + DECODE (v_alg_kenmerk_key4, + NULL, v_alg_kenmerkwaarde4, + TO_CHAR (v_alg_kenmerk_key4) + || '=' + || SUBSTR (v_alg_kenmerkwaarde4, 1, 200) + ), -- We parkeren het bouwdeel verdiepingnummer even in kenmerk 5 + DECODE (v_bouwdeel, 1, SUBSTR (v_volledig_ruimtenr, 1, 1) || '-' || v_verdieping_volgnr_n, + DECODE (v_alg_kenmerk_key5, + NULL, v_alg_kenmerkwaarde5, + TO_CHAR (v_alg_kenmerk_key5) + || '=' + || SUBSTR (v_alg_kenmerkwaarde5, 1, 200) + )) + ); + END IF; + END IF; + END; + END LOOP; + + IF (header_is_valid = 0) + THEN + fac.imp_writelog (p_import_key, + 'E', + v_aanduiding || 'Ongeldig importbestand', + 'Geen geldige headerregel aanwezig' + ); + ELSE + fac.imp_writelog (p_import_key, 'S', 'Ruimte: aantal ingelezen regels: ' || TO_CHAR (v_count), ''); + END IF; + + COMMIT; +EXCEPTION + WHEN OTHERS + THEN + oracle_err_num := SQLCODE; + oracle_err_mes := SUBSTR (SQLERRM, 1, 100); + v_errormsg := v_errormsg || ' Error ' || oracle_err_num || '/' || oracle_err_mes; + fac.imp_writelog (p_import_key, + 'E', + v_errormsg, + 'Eventeel resterende regels worden niet meer ingelezen!' + ); +END fmhn_import_ruimten; +/ + +CREATE OR REPLACE PROCEDURE fmhn_update_ruimten ( + p_import_key IN NUMBER +) IS + + c_fielddelimitor VARCHAR2 (1) := ';'; + + v_newline fac_imp_file.fac_imp_file_line%TYPE; -- Input line + v_errormsg VARCHAR2 (1000); + v_errorhint VARCHAR2 (1000); + oracle_err_num NUMBER; + oracle_err_mes VARCHAR2 (200); + v_aanduiding VARCHAR2 (200); + + v_count NUMBER(10); + v_count_update NUMBER(10); + v_count_tot NUMBER(10); + v_bouwdeel NUMBER(10); + + -- De importvelden: + v_regio_omschrijving VARCHAR2(255); -- 30 + v_district_omschrijving VARCHAR2(255); -- 30 + v_locatie_code VARCHAR2(255); -- 10 + v_locatie_omschrijving VARCHAR2(255); -- 60 + v_gebouw_code VARCHAR2(255); -- 12 + v_gebouw_naam VARCHAR2(255); -- 30 + v_srtgebouw_omschrijving VARCHAR2(255); -- 30 + v_locatie_verantw VARCHAR2(255); -- 30 + v_locatie_verantw_tel VARCHAR2(255); -- 15 + v_locatie_adres VARCHAR2(255); -- 50 + v_locatie_postcode VARCHAR2(255); -- 12 + v_locatie_plaats VARCHAR2(255); -- 30 + v_locatie_land VARCHAR2(255); -- 30 + v_locatie_post_adres VARCHAR2(255); -- 50 + v_locatie_post_postcode VARCHAR2(255); -- 12 + v_locatie_post_plaats VARCHAR2(255); -- 30 + v_locatie_post_land VARCHAR2(255); -- 30 + + v_regio_key NUMBER(10); + v_district_key NUMBER(10); + v_locatie_key NUMBER(10); + v_srtgebouw_key NUMBER(10); + v_gebouw_key NUMBER(10); + v_verdieping_key NUMBER(10); + v_verdieping_volgnr NUMBER(3); + v_srtruimte_key NUMBER(10); + v_ruimte_key NUMBER(10); + v_res_ruimte_key NUMBER(10); + v_ruimte_omschrijving res_ruimte.res_ruimte_nr%TYPE; -- 40 + + v_discipline_key NUMBER(10); + v_opstelling_key NUMBER(10); + v_ruimteafdeling_key NUMBER(10); + + CURSOR cVerdieping + IS + SELECT min(alg_locatie_code) alg_locatie_code + ,min(alg_gebouw_code) alg_gebouw_code + ,alg_verdieping_volgnr alg_verdieping_volgnr + ,alg_kenmerkwaarde5 verdiepingnummer + FROM fac_imp_onrgoed2 + GROUP BY upper(alg_locatie_code), upper(alg_gebouw_code), alg_verdieping_volgnr, alg_kenmerkwaarde5; + + recVerdieping cVerdieping%ROWTYPE; + + CURSOR cBouwdeel + IS + SELECT ROWNUM getal, sub.waarde verdiepingnummer + FROM (SELECT DISTINCT alg_kenmerkwaarde5 waarde FROM fac_imp_onrgoed2) sub; + + CURSOR cSrtRuimte + IS + SELECT min(alg_srtruimte_omschrijving) alg_srtruimte_omschrijving + FROM fac_imp_onrgoed2 + GROUP BY alg_srtruimte_omschrijving; + + recSrtRuimte cSrtRuimte%ROWTYPE; + + CURSOR cRuimte + IS + SELECT alg_locatie_code, + alg_gebouw_code, + alg_verdieping_volgnr, + alg_srtruimte_omschrijving, + alg_ruimte_nr, + alg_ruimte_omschrijving, + alg_ruimte_bruto_vloeropp, + reserveerbaar, + res_discipline_omschrijving, + res_ruimte_prijs, + res_opstelling_omschrijving, + res_ruimte_opstel_bezoekers, + res_ruimte_nr, + res_ruimte_omschrijving, + i.prs_afdeling_naam, + prs_afdeling_key, + prs_ruimteafdeling_bezetting, + fac.safe_to_number (SUBSTR (alg_kenmerkwaarde1, 1, INSTR (alg_kenmerkwaarde1, '=') - 1)) + kenmerk_key1, + SUBSTR (alg_kenmerkwaarde1, INSTR (alg_kenmerkwaarde1, '=') + 1) waarde1, + fac.safe_to_number (SUBSTR (alg_kenmerkwaarde2, 1, INSTR (alg_kenmerkwaarde2, '=') - 1)) + kenmerk_key2, + SUBSTR (alg_kenmerkwaarde2, INSTR (alg_kenmerkwaarde2, '=') + 1) waarde2, + fac.safe_to_number (SUBSTR (alg_kenmerkwaarde3, 1, INSTR (alg_kenmerkwaarde3, '=') - 1)) + kenmerk_key3, + SUBSTR (alg_kenmerkwaarde3, INSTR (alg_kenmerkwaarde3, '=') + 1) waarde3, + fac.safe_to_number (SUBSTR (alg_kenmerkwaarde4, 1, INSTR (alg_kenmerkwaarde4, '=') - 1)) + kenmerk_key4, + SUBSTR (alg_kenmerkwaarde4, INSTR (alg_kenmerkwaarde4, '=') + 1) waarde4, + fac.safe_to_number (SUBSTR (alg_kenmerkwaarde5, 1, INSTR (alg_kenmerkwaarde5, '=') - 1)) + kenmerk_key5, + SUBSTR (alg_kenmerkwaarde5, INSTR (alg_kenmerkwaarde5, '=') + 1) waarde5 + FROM fac_imp_onrgoed2 i, + prs_afdeling a + WHERE a.prs_afdeling_verwijder IS NULL + AND UPPER(i.prs_afdeling_naam) = a.prs_afdeling_upper(+); + + recRuimte cRuimte%ROWTYPE; + + CURSOR cOpstelling + IS + SELECT min(res_opstelling_omschrijving) res_opstelling_omschrijving + ,UPPER(res_opstelling_omschrijving) res_opstelling_upper + FROM FAC_IMP_ONRGOED2 + WHERE res_opstelling_omschrijving IS NOT NULL + GROUP BY UPPER(res_opstelling_omschrijving); + + recOpstelling cOpstelling%ROWTYPE; + + CURSOR cCategorie + IS + SELECT min(res_discipline_omschrijving) res_discipline_omschrijving + ,upper(res_discipline_omschrijving) res_discipline_upper + ,NVL(res_discipline_expire_dagen,0) res_discipline_expire_dagen + FROM FAC_IMP_ONRGOED2 + WHERE reserveerbaar in ('Y','y','J','j') + GROUP BY upper(res_discipline_omschrijving) + , res_discipline_expire_dagen; + + recCategorie cCategorie%ROWTYPE; + + CURSOR cResRuimte + IS + SELECT * + FROM FAC_IMP_ONRGOED2 + WHERE RESERVEERBAAR in ('J','j','Y','y'); + + recResRuimte cResRuimte%ROWTYPE; + +-- SUBPROC + PROCEDURE upsert_algkenmerk (p_ruimte_key IN NUMBER, + p_kenmerk_key IN NUMBER, + p_waarde IN VARCHAR2) + AS + v_kenmerk_type VARCHAR2 (1); + ccount NUMBER; + v_waarde VARCHAR2 (255); + v_objectnaam VARCHAR2 (30); + v_kolomnaam VARCHAR2 (30); + v_kolomtxt VARCHAR2 (30); + sql_stmt VARCHAR2 (1000); + l_cursor_1 INTEGER; + l_rowsprocessed NUMBER DEFAULT 0; + BEGIN + IF (p_kenmerk_key IS NOT NULL AND p_waarde IS NOT NULL) + THEN + v_errormsg := 'Fout bij bepalen kenmerktype'; + SELECT alg_kenmerk_kenmerktype + INTO v_kenmerk_type + FROM alg_kenmerk + WHERE alg_kenmerk_verwijder IS NULL + AND alg_kenmerk_key = p_kenmerk_key + AND alg_kenmerk_niveau = 'R'; + + IF v_kenmerk_type IN ('R', 'S') + THEN + v_errormsg := 'Fout bij bepalen eigen tabel'; + + SELECT COUNT ( * ) + INTO ccount + FROM alg_kenmerk k, fac_kenmerkdomein d + WHERE k.alg_kenmerk_key = p_kenmerk_key + AND k.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key + AND d.fac_usrtab_key IS NOT NULL; + + v_errormsg := 'Fout bij bepalen nieuwe waarde [' || p_waarde || ']'; + + IF ccount = 1 + THEN -- Eigen tabel + SELECT TO_CHAR (ud.fac_usrdata_key) + INTO v_waarde + FROM alg_kenmerk k, fac_kenmerkdomein d, fac_v_aanwezigusrdata ud + WHERE k.alg_kenmerk_key = p_kenmerk_key + AND k.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key + AND d.fac_usrtab_key = ud.fac_usrtab_key + AND UPPER (TRIM (ud.fac_usrdata_omschr)) = UPPER (p_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 alg_kenmerk k, fac_kenmerkdomein d + WHERE k.alg_kenmerk_key = p_kenmerk_key + AND k.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key + AND d.fac_usrtab_key IS NULL; + + sql_stmt := 'SELECT MAX (' + || v_kolomnaam + || ') FROM ' + || v_objectnaam + || ' WHERE UPPER (TRIM (' + || v_kolomtxt + || ')) = UPPER (:pwaarde)'; + l_cursor_1 := DBMS_SQL.open_cursor; + DBMS_SQL.parse (l_cursor_1, sql_stmt, DBMS_SQL.native); + DBMS_SQL.BIND_VARIABLE(l_cursor_1,':pwaarde', p_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) + v_waarde := p_waarde; + END IF; + + v_errormsg := 'Fout bij toevoegen/bijwerken kenmerk'; + alg.upsertkenmerk (p_kenmerk_key, + p_ruimte_key, + v_waarde); + 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_algkenmerk'); + END; + +BEGIN + +SELECT COUNT (DISTINCT alg_kenmerkwaarde5) INTO v_bouwdeel FROM fac_imp_onrgoed2; + +IF v_bouwdeel > 0 + THEN + FOR rec IN cBouwdeel + LOOP + BEGIN + UPDATE fac_imp_onrgoed2 + SET alg_verdieping_volgnr = fac.safe_to_number (alg_verdieping_volgnr || rec.getal) -- verdieping 14 met 3 bouwdelen wordt dus 141 142 143 + WHERE alg_kenmerkwaarde5 = rec.verdiepingnummer; + + COMMIT; + END; + END LOOP; +END IF; + + -- **************** + -- ***VERDIEPING*** + -- **************** + OPEN cVerdieping; + v_count_update := 0; + v_count_tot := 0; + IF cVerdieping%ISOPEN THEN + + LOOP + BEGIN + v_errormsg := ''; + v_errorhint := ''; + v_aanduiding := ''; + + FETCH cVerdieping INTO recVerdieping; + EXIT WHEN cVerdieping%NOTFOUND; + v_count_tot := v_count_tot + 1; + v_aanduiding := recVerdieping.ALG_LOCATIE_CODE||'|'||recVerdieping.ALG_GEBOUW_CODE||'|'||recVerdieping.ALG_VERDIEPING_VOLGNR||'| '; + + v_errorhint := ' Fout bij bepalen locatie ['||recVerdieping.ALG_LOCATIE_CODE||']'; + + SELECT ALG_LOCATIE_KEY + INTO v_locatie_key + FROM ALG_LOCATIE + WHERE UPPER(ALG_LOCATIE_CODE) = UPPER(recVerdieping.ALG_LOCATIE_CODE) + AND ALG_LOCATIE_VERWIJDER IS NULL; + + v_errorhint := ' Fout bij bepalen gebouw ['||recVerdieping.ALG_GEBOUW_CODE||']'; + + SELECT ALG_GEBOUW_KEY + INTO v_gebouw_key + FROM ALG_GEBOUW + WHERE UPPER(ALG_GEBOUW_CODE) = UPPER(recVerdieping.ALG_GEBOUW_CODE) + AND ALG_LOCATIE_KEY = v_locatie_key + AND ALG_GEBOUW_VERWIJDER IS NULL; + + v_errorhint := 'Fout bij toevoegen verdieping'; + + SELECT count(*) + INTO v_count + FROM alg_v_aanwezigverdieping + WHERE alg_gebouw_key = v_gebouw_key + AND ALG_VERDIEPING_VOLGNR = recVerdieping.ALG_VERDIEPING_VOLGNR; + + IF (v_count = 0) THEN + + insert into ALG_VERDIEPING + (ALG_GEBOUW_KEY + ,ALG_VERDIEPING_VOLGNR + ,ALG_VERDIEPING_CODE + ,ALG_VERDIEPING_OMSCHRIJVING + ) + values + (v_gebouw_key + ,recVerdieping.ALG_VERDIEPING_VOLGNR + ,DECODE (recVerdieping.verdiepingnummer, NULL, to_char(recVerdieping.ALG_VERDIEPING_VOLGNR), recVerdieping.verdiepingnummer) + ,DECODE (recVerdieping.verdiepingnummer, NULL, 'Verdieping '||to_char(recVerdieping.ALG_VERDIEPING_VOLGNR), 'Verdieping '||to_char(recVerdieping.verdiepingnummer)) + ); + + END IF; + + commit; + + v_count_update := v_count_update + 1; + + EXCEPTION WHEN OTHERS THEN + oracle_err_num := SQLCODE; + oracle_err_mes := SUBSTR(SQLERRM, 1, 200); + v_errormsg := 'Fout tijdens verwerken verdieping ['||recVerdieping.ALG_LOCATIE_CODE||'-'||recVerdieping.ALG_GEBOUW_CODE||'-'||to_number(recVerdieping.ALG_VERDIEPING_VOLGNR)||']'; + v_errorhint := v_errorhint||': ' || oracle_err_mes; + + fac.imp_writelog (p_import_key, + 'E', + v_aanduiding||v_errormsg, + v_errorhint + ); + commit; + END; + END LOOP; + + fac.imp_writelog (p_import_key, + 'S', + 'Verdieping: verwerkte regels zonder foutmelding: '||to_char(v_count_update), + '' + ); + + fac.imp_writelog (p_import_key, + 'S', + 'Verdieping: verwerkte regels met foutmelding: '||to_char(v_count_tot-v_count_update), + '' + ); + END IF; + CLOSE cVerdieping; + + -- Maak kenmerk5 nu maar weer leeg als deze gebruikt is voor bouwdelen. + IF v_bouwdeel > 0 THEN + UPDATE fac_imp_onrgoed2 + SET alg_kenmerkwaarde5 = NULL + WHERE alg_kenmerkwaarde5 IS NOT NULL; + END IF; + + -- ******************* + -- ***RUIMTEFUNCTIE*** + -- ******************* + OPEN cSrtRuimte; + v_count_update := 0; + v_count_tot := 0; + IF cSrtRuimte%ISOPEN THEN + + LOOP + BEGIN + v_errormsg := ''; + v_errorhint := ''; + v_aanduiding := ''; + + FETCH cSrtRuimte INTO recSrtRuimte; + EXIT WHEN cSrtRuimte%NOTFOUND; + v_count_tot := v_count_tot + 1; + v_aanduiding := recSrtRuimte.ALG_SRTRUIMTE_OMSCHRIJVING||'| '; + + v_errorhint := ' Fout bij toevoegen ruimtefunctie'; + + SELECT count(*) + INTO v_count + FROM alg_srtruimte + WHERE upper(alg_srtruimte_omschrijving) = upper(recSrtRuimte.ALG_SRTRUIMTE_OMSCHRIJVING) + AND alg_srtruimte_verwijder is null; + + IF (v_count = 0) THEN + + insert into ALG_SRTRUIMTE + (ALG_SRTRUIMTE_OMSCHRIJVING + ) + values + (recSrtRuimte.ALG_SRTRUIMTE_OMSCHRIJVING + ); + + END IF; + + commit; + + v_count_update := v_count_update + 1; + + EXCEPTION WHEN OTHERS THEN + oracle_err_num := SQLCODE; + oracle_err_mes := SUBSTR(SQLERRM, 1, 200); + v_errormsg := 'Fout tijdens verwerken ruimtefunctie ['||recSrtRuimte.ALG_SRTRUIMTE_OMSCHRIJVING||']'; + v_errorhint := v_errorhint||': ' || oracle_err_mes; + + fac.imp_writelog (p_import_key, + 'E', + v_aanduiding||v_errormsg, + v_errorhint + ); + commit; + END; + END LOOP; + + fac.imp_writelog (p_import_key, + 'S', + 'Ruimtefunctie: verwerkte regels zonder foutmelding: '||to_char(v_count_update), + '' + ); + + fac.imp_writelog (p_import_key, + 'S', + 'Ruimtefunctie: verwerkte regels met foutmelding: '||to_char(v_count_tot-v_count_update), + '' + ); + END IF; + CLOSE cSrtRuimte; + + -- ************ + -- ***RUIMTE*** + -- ************ + OPEN cRuimte; + v_count_update := 0; + v_count_tot := 0; + IF cRuimte%ISOPEN THEN + + LOOP + BEGIN + v_errormsg := ''; + v_errorhint := ''; + v_aanduiding := ''; + v_ruimte_key := NULL; + + FETCH cRuimte INTO recRuimte; + EXIT WHEN cRuimte%NOTFOUND; + v_count_tot := v_count_tot + 1; + v_aanduiding := recRuimte.ALG_LOCATIE_CODE||'|'||recRuimte.ALG_GEBOUW_CODE||'|'||recRuimte.ALG_VERDIEPING_VOLGNR||'|'||recRuimte.ALG_RUIMTE_NR||'| '; + + v_errorhint := ' Fout bij bepalen locatie'; + + SELECT ALG_LOCATIE_KEY + INTO v_locatie_key + FROM ALG_LOCATIE + WHERE UPPER(ALG_LOCATIE_CODE) = UPPER(recRuimte.ALG_LOCATIE_CODE) + AND ALG_LOCATIE_verwijder is null; + + v_errorhint := ' Fout bij bepalen gebouw'; + + SELECT ALG_GEBOUW_KEY + INTO v_gebouw_key + FROM ALG_GEBOUW + WHERE UPPER(ALG_GEBOUW_CODE) = UPPER(recRuimte.ALG_GEBOUW_CODE) + AND ALG_LOCATIE_KEY = v_locatie_key + AND ALG_GEBOUW_verwijder is null; + + v_errorhint := ' Fout bij bepalen verdieping'; + + SELECT ALG_VERDIEPING_KEY + INTO v_verdieping_key + FROM ALG_VERDIEPING + WHERE ALG_GEBOUW_KEY = v_gebouw_key + AND ALG_VERDIEPING_VOLGNR = recRuimte.ALG_VERDIEPING_VOLGNR + AND ALG_VERDIEPING_verwijder is null; + + v_errorhint := ' Fout bij bepalen ruimtefunctie'||' ['||recRuimte.alg_srtruimte_omschrijving||']'; + + SELECT ALG_SRTRUIMTE_KEY + INTO v_srtruimte_key + FROM ALG_SRTRUIMTE + WHERE upper(alg_srtruimte_omschrijving) = upper(recRuimte.ALG_SRTRUIMTE_OMSCHRIJVING) + AND ALG_SRTRUIMTE_verwijder is null; + + SELECT count(*) + INTO v_count + FROM ALG_RUIMTE + WHERE ALG_VERDIEPING_KEY = v_verdieping_key + AND UPPER(ALG_RUIMTE_NR) = UPPER(recRuimte.ALG_RUIMTE_NR) + -- als ruimteomschrijving in sheet afwijkt geeft dit een onduidelijke error, dan liever + -- de omschrijving negeren en gewoon niet bijwerken +-- AND UPPER(ALG_RUIMTE_OMSCHRIJVING) = UPPER(recRuimte.ALG_RUIMTE_OMSCHRIJVING) + AND alg_ruimte_verwijder is null; + + v_errorhint := ' Fout bij toevoegen ruimte'; + + IF v_count = 0 THEN + + insert into ALG_RUIMTE + (ALG_VERDIEPING_KEY + ,ALG_SRTRUIMTE_KEY + ,ALG_RUIMTE_NR + ,ALG_RUIMTE_OMSCHRIJVING + ,ALG_RUIMTE_OPMERKING + ,ALG_RUIMTE_BRUTO_VLOEROPP + ) + values + (v_verdieping_key + ,v_srtruimte_key + ,recRuimte.ALG_RUIMTE_NR + ,recRuimte.ALG_RUIMTE_OMSCHRIJVING + ,'' + ,TO_NUMBER(recRuimte.ALG_RUIMTE_BRUTO_VLOEROPP) + ) + RETURNING ALG_RUIMTE_KEY + INTO v_ruimte_key; + + END IF; + + commit; + + v_count_update := v_count_update + 1; + + -- Als de ruimte al bestaat, dan nog de key ophalen, zodat we 'm hieronder kunnen gebruiken. + IF (v_ruimte_key IS NULL) + THEN + v_errorhint := ' Fout bij bepalen ruimte'; + + SELECT ALG_RUIMTE_KEY + INTO v_ruimte_key + FROM ALG_RUIMTE + WHERE ALG_VERDIEPING_KEY = v_verdieping_key + AND UPPER(ALG_RUIMTE_NR) = UPPER(recRuimte.ALG_RUIMTE_NR) + AND alg_ruimte_verwijder is null; + END IF; + + -- ******************** + -- ***RUIMTEAFDELING*** + -- ******************** + -- AAES#25942: koppel afdeling(en) aan ruimte; één afdeling per regel, ruimte kan meerdere keren voorkomen. + IF (recRuimte.prs_afdeling_naam IS NOT NULL) + THEN + IF (recRuimte.prs_afdeling_key IS NULL) + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding||' afdeling ['||recRuimte.prs_afdeling_naam||']', + 'Afdeling niet gevonden' + ); + ELSE + IF (recRuimte.prs_ruimteafdeling_bezetting IS NULL) + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding||' afdeling ['||recRuimte.prs_afdeling_naam||']', + 'Fout: afdeling gevuld, bezetting leeg!' + ); + ELSIF (recRuimte.prs_ruimteafdeling_bezetting > 100 OR recRuimte.prs_ruimteafdeling_bezetting < 0) + THEN + fac.imp_writelog (p_import_key, + 'W', + v_aanduiding||' afdeling ['||recRuimte.prs_afdeling_naam||']', + 'Ongeldige ruimtebezetting ['||TO_CHAR(recRuimte.prs_ruimteafdeling_bezetting)||'] verwacht 0 <= bezetting <= 100' + ); + ELSE + BEGIN + SELECT COUNT(*), MAX(prs_ruimteafdeling_key) + INTO v_count, v_ruimteafdeling_key + FROM prs_ruimteafdeling + WHERE prs_ruimteafdeling_verwijder IS NULL + AND prs_afdeling_key = recRuimte.prs_afdeling_key + AND alg_ruimte_key = v_ruimte_key; + + IF (v_count = 0) + THEN + v_errorhint := ' Fout bij toevoegen ruimtebezetting'; + + INSERT INTO prs_ruimteafdeling + (prs_afdeling_key + ,alg_ruimte_key + ,prs_ruimteafdeling_bezetting) + VALUES + (recRuimte.prs_afdeling_key + ,v_ruimte_key + ,recRuimte.prs_ruimteafdeling_bezetting + ); + END IF; + + IF (v_count = 1) + THEN + v_errorhint := ' Fout bij aanpassen ruimtebezetting'; + + UPDATE prs_ruimteafdeling + SET prs_ruimteafdeling_bezetting = recRuimte.prs_ruimteafdeling_bezetting + WHERE prs_ruimteafdeling_key = v_ruimteafdeling_key; + END IF; + + EXCEPTION WHEN OTHERS THEN + oracle_err_num := SQLCODE; + oracle_err_mes := SUBSTR(SQLERRM, 1, 200); + v_errormsg := 'Fout tijdens verwerken ruimteafdeling ['|| + recRuimte.ALG_LOCATIE_CODE||'-'||recRuimte.ALG_GEBOUW_CODE||'-'||recRuimte.ALG_VERDIEPING_VOLGNR||'-'||recRuimte.ALG_RUIMTE_NR + ||'] / ['||recRuimte.PRS_AFDELING_NAAM||']'; + v_errorhint := v_errorhint||': ' || oracle_err_mes; + + fac.imp_writelog (p_import_key, + 'E', + v_aanduiding||v_errormsg, + v_errorhint + ); + commit; + END; + END IF; + END IF; + END IF; + + -- ******************* + -- ***FLEXKENMERKEN*** + -- ******************* + v_errorhint := ' Fout bij toevoegen/bijwerken flexkenmerken'; + + upsert_algkenmerk (v_ruimte_key, recRuimte.kenmerk_key1, recRuimte.waarde1); + upsert_algkenmerk (v_ruimte_key, recRuimte.kenmerk_key2, recRuimte.waarde2); + upsert_algkenmerk (v_ruimte_key, recRuimte.kenmerk_key3, recRuimte.waarde3); + upsert_algkenmerk (v_ruimte_key, recRuimte.kenmerk_key4, recRuimte.waarde4); + upsert_algkenmerk (v_ruimte_key, recRuimte.kenmerk_key5, recRuimte.waarde5); + + EXCEPTION WHEN OTHERS THEN + oracle_err_num := SQLCODE; + oracle_err_mes := SUBSTR(SQLERRM, 1, 200); + v_errormsg := 'Fout tijdens verwerken ruimte ['||recRuimte.ALG_LOCATIE_CODE||'-'||recRuimte.ALG_GEBOUW_CODE||'-'||recRuimte.ALG_VERDIEPING_VOLGNR||'-'||recRuimte.ALG_RUIMTE_NR||']'; + v_errorhint := v_errorhint||': ' || oracle_err_mes; + + fac.imp_writelog (p_import_key, + 'E', + v_aanduiding||v_errormsg, + v_errorhint + ); + commit; + END; + + END LOOP; + + fac.imp_writelog (p_import_key, + 'S', + 'Ruimte: verwerkte regels zonder foutmelding: '||to_char(v_count_update), + '' + ); + + fac.imp_writelog (p_import_key, + 'S', + 'Ruimte: verwerkte regels met foutmelding: '||to_char(v_count_tot-v_count_update), + '' + ); + END IF; + CLOSE cRuimte; + + -- **************** + -- ***OPSTELLING*** + -- **************** + OPEN cOpstelling; + v_count_update := 0; + v_count_tot := 0; + IF cOpstelling%ISOPEN THEN + + LOOP + BEGIN + v_errormsg := ''; + v_errorhint := ''; + v_aanduiding := ''; + + FETCH cOpstelling INTO recOpstelling; + EXIT WHEN cOpstelling%NOTFOUND; + v_count_tot := v_count_tot + 1; + v_aanduiding := recOpstelling.RES_OPSTELLING_OMSCHRIJVING||'| '; + + v_errorhint := ' Fout bij toevoegen opstelling'; + + select count(*) + into v_count + from RES_OPSTELLING + where RES_OPSTELLING_verwijder is null + and trim(RES_OPSTELLING_upper) = upper(trim(recOpstelling.RES_OPSTELLING_OMSCHRIJVING)); + + IF (v_count = 0) THEN + + insert into RES_OPSTELLING + (RES_OPSTELLING_OMSCHRIJVING + ) + values + (trim(recOpstelling.RES_OPSTELLING_OMSCHRIJVING) + ); + + END IF; + + commit; + + v_count_update := v_count_update + 1; + + EXCEPTION WHEN OTHERS THEN + oracle_err_num := SQLCODE; + oracle_err_mes := SUBSTR(SQLERRM, 1, 200); + v_errormsg := 'Fout tijdens verwerken opstelling ['||recOpstelling.RES_OPSTELLING_OMSCHRIJVING||']'; + v_errorhint := v_errorhint||': ' || oracle_err_mes; + + fac.imp_writelog (p_import_key, + 'E', + v_aanduiding||v_errormsg, + v_errorhint + ); + commit; + END; + END LOOP; + + fac.imp_writelog (p_import_key, + 'S', + 'Opstelling: verwerkte regels zonder foutmelding: '||to_char(v_count_update), + '' + ); + + fac.imp_writelog (p_import_key, + 'S', + 'Opstelling: verwerkte regels met foutmelding: '||to_char(v_count_tot-v_count_update), + '' + ); + END IF; + CLOSE cOpstelling; + + -- *************** + -- ***CATEGORIE*** + -- *************** + OPEN cCategorie; + v_count_update := 0; + v_count_tot := 0; + IF cCategorie%ISOPEN THEN + + LOOP + BEGIN + v_errormsg := ''; + v_errorhint := ''; + v_aanduiding := ''; + + FETCH cCategorie INTO recCategorie; + EXIT WHEN cCategorie%NOTFOUND; + v_count_tot := v_count_tot + 1; + v_aanduiding := recCategorie.res_discipline_omschrijving||'| '; + + v_errorhint := ' Fout bij toevoegen categorie'; + + select count(*) + into v_count + from ins_tab_discipline + where ins_discipline_verwijder is null + and ins_discipline_module='RES' + and upper(trim(ins_discipline_omschrijving)) = upper(trim(recCategorie.res_discipline_omschrijving)); + + IF (v_count = 0) THEN + + INSERT INTO ins_tab_discipline + (ins_discipline_module + ,ins_discipline_omschrijving + ,ins_discipline_verwijder + ,ins_discipline_min_level) + VALUES + ('RES' + ,trim(recCategorie.res_discipline_omschrijving) + ,to_date(null) + ,3) + RETURNING ins_discipline_key + INTO v_discipline_key; + + INSERT INTO res_disc_params + (res_ins_discipline_key + ,res_disc_params_expire_dagen) + VALUES + (v_discipline_key + ,recCategorie.res_discipline_expire_dagen + ); + + END IF; + + commit; + + v_count_update := v_count_update + 1; + + EXCEPTION WHEN OTHERS THEN + oracle_err_num := SQLCODE; + oracle_err_mes := SUBSTR(SQLERRM, 1, 200); + v_errormsg := 'Fout tijdens verwerken catalogus ['||recCategorie.res_discipline_omschrijving||']'; + v_errorhint := v_errorhint||': ' || oracle_err_mes; + + fac.imp_writelog (p_import_key, + 'E', + v_aanduiding||v_errormsg, + v_errorhint + ); + commit; + END; + END LOOP; + + fac.imp_writelog (p_import_key, + 'S', + 'Categorie: verwerkte regels zonder foutmelding: '||to_char(v_count_update), + '' + ); + + fac.imp_writelog (p_import_key, + 'S', + 'Categorie: verwerkte regels met foutmelding: '||to_char(v_count_tot-v_count_update), + '' + ); + END IF; + CLOSE cCategorie; + + -- *************** + -- ***RESRUIMTE*** + -- *************** + OPEN cResRuimte; + v_count_update := 0; + v_count_tot := 0; + IF cResRuimte%ISOPEN THEN + + LOOP + BEGIN + v_errormsg := ''; + v_errorhint := ''; + v_aanduiding := ''; + + FETCH cResRuimte INTO recResRuimte; + EXIT WHEN cResRuimte%NOTFOUND; + v_count_tot := v_count_tot + 1; + v_aanduiding := recResRuimte.ALG_LOCATIE_CODE||'|'||recResRuimte.ALG_GEBOUW_CODE||'|'||recResRuimte.ALG_VERDIEPING_VOLGNR||'|'||recResRuimte.ALG_RUIMTE_NR||'| '; + + v_errorhint := ' Fout bij bepalen locatie'; + + SELECT ALG_LOCATIE_KEY + INTO v_locatie_key + FROM ALG_LOCATIE + WHERE UPPER(ALG_LOCATIE_CODE) = UPPER(recResRuimte.ALG_LOCATIE_CODE) + AND alg_locatie_verwijder is null; + + v_errorhint := ' Fout bij bepalen gebouw'; + + SELECT ALG_GEBOUW_KEY + INTO v_gebouw_key + FROM ALG_GEBOUW + WHERE UPPER(ALG_GEBOUW_CODE) = UPPER(recResRuimte.ALG_GEBOUW_CODE) + AND ALG_LOCATIE_KEY = v_locatie_key + AND alg_gebouw_verwijder is null; + + v_errorhint := ' Fout bij bepalen verdieping'; + + SELECT ALG_VERDIEPING_KEY, ALG_VERDIEPING_VOLGNR + INTO v_verdieping_key, v_verdieping_volgnr + FROM ALG_VERDIEPING + WHERE ALG_GEBOUW_KEY = v_gebouw_key + AND ALG_VERDIEPING_VOLGNR = recResRuimte.ALG_VERDIEPING_VOLGNR; + + v_errorhint := ' Fout bij bepalen ruimte'; + + SELECT ALG_RUIMTE_KEY + INTO v_ruimte_key + FROM ALG_V_AANWEZIGRUIMTE + WHERE ALG_VERDIEPING_KEY = v_verdieping_key + AND ALG_RUIMTE_UPPER_NR = UPPER(recResRuimte.ALG_RUIMTE_NR); + + v_errorhint := ' Fout bij bepalen catalogus ['||recResRuimte.res_discipline_omschrijving||']'; + + SELECT ins_discipline_key + INTO v_discipline_key + FROM RES_V_RES_CATALOGUS + WHERE ins_discipline_verwijder IS NULL + AND ins_discipline_min_level = 3 + AND upper(trim(ins_discipline_omschrijving)) = upper(trim(recResRuimte.res_discipline_omschrijving)); + + v_errorhint := ' Fout bij bepalen opstelling ['||recResRuimte.RES_OPSTELLING_OMSCHRIJVING||']'; + + SELECT RES_OPSTELLING_KEY + INTO v_opstelling_key + FROM RES_OPSTELLING + WHERE UPPER(trim(RES_OPSTELLING_OMSCHRIJVING)) = UPPER(trim(recResRuimte.RES_OPSTELLING_OMSCHRIJVING)) + AND RES_OPSTELLING_verwijder is null; + + v_errorhint := ' Fout bij samenstellen ruimte-omschrijving'; + + IF (recResRuimte.RES_RUIMTE_NR IS NULL) THEN + v_ruimte_omschrijving := SUBSTR( recResRuimte.ALG_LOCATIE_CODE || '-' || recResRuimte.ALG_GEBOUW_CODE || '-' || TO_CHAR(recResRuimte.ALG_VERDIEPING_VOLGNR) || '-' || recResRuimte.ALG_RUIMTE_NR,1,40); + ELSE + v_ruimte_omschrijving := recResRuimte.RES_RUIMTE_NR; + END IF; + + v_errorhint := 'Fout bij bepalen reserveerbare ruimte'; + + SELECT count(*) + INTO v_count + FROM RES_RUIMTE + WHERE RES_RUIMTE_UPPER = upper(v_ruimte_omschrijving) + AND res_ruimte_verwijder is null; + + IF v_count = 0 THEN + + v_errorhint := 'Fout bij toevoegen reserveerbare ruimte'; + + INSERT INTO RES_RUIMTE + (RES_RUIMTE_NR + ,RES_RUIMTE_UPPER + ,RES_RUIMTE_PRIJS + ,RES_RUIMTE_OMSCHRIJVING + ,RES_DISCIPLINE_KEY + ) + VALUES + (v_ruimte_omschrijving + ,upper(v_ruimte_omschrijving) + ,recResRuimte.RES_RUIMTE_PRIJS + ,recResRuimte.RES_RUIMTE_OMSCHRIJVING + ,v_discipline_key + ) + RETURNING RES_RUIMTE_KEY + INTO v_res_ruimte_key; + + v_errorhint := 'Fout bij koppelen ruimte en reserveerbare ruimte'; + + insert into RES_ALG_RUIMTE + (RES_RUIMTE_KEY + ,ALG_RUIMTE_KEY + ) + values + (v_res_ruimte_key + ,v_ruimte_key + ); + + ELSE + + SELECT RES_RUIMTE_KEY + INTO v_res_ruimte_key + FROM RES_RUIMTE + WHERE RES_RUIMTE_UPPER = upper(v_ruimte_omschrijving) + AND res_ruimte_verwijder IS NULL; + + END IF; + + v_errorhint := 'Fout bij koppelen opstelling en reserveerbare ruimte'; + + insert into RES_RUIMTE_OPSTELLING + (RES_RUIMTE_KEY + ,RES_OPSTELLING_KEY + ,RES_RUIMTE_OPSTEL_BEZOEKERS + ) + values + (v_res_ruimte_key + ,v_opstelling_key + ,NVL(recResRuimte.RES_RUIMTE_OPSTEL_BEZOEKERS, 0) + ); + + commit; + + v_count_update := v_count_update + 1; + + EXCEPTION WHEN OTHERS THEN + oracle_err_num := SQLCODE; + oracle_err_mes := SUBSTR(SQLERRM, 1, 200); + v_errormsg := 'Reserveerbare ruimte ['||recResRuimte.RES_RUIMTE_OMSCHRIJVING||']'; + v_errorhint := v_errorhint||': ' || oracle_err_mes; + + fac.imp_writelog (p_import_key, + 'E', + v_aanduiding||v_errormsg, + v_errorhint + ); + commit; + END; + END LOOP; + + fac.imp_writelog (p_import_key, + 'S', + 'Res. ruimte: verwerkte regels zonder foutmelding: '||to_char(v_count_update), + '' + ); + + fac.imp_writelog (p_import_key, + 'S', + 'Res. ruimte: verwerkte regels met foutmelding: '||to_char(v_count_tot-v_count_update), + '' + ); + END IF; + CLOSE cResRuimte; + +EXCEPTION + WHEN OTHERS + THEN + oracle_err_mes := SUBSTR (SQLERRM, 1, 150); + v_errormsg := '(ORACLE error ' || oracle_err_mes || ')'; + fac.imp_writelog (p_import_key, + 'E', + 'Fout tijdens importeren van onroerend goed (verdieping en ruimte) ', + '' + ); +END fmhn_update_ruimten; +/ + +CREATE OR REPLACE VIEW fmhn_v_rap_import_log +( + fclt_f_applicatie, + datum, + fclt_f_status, + omschrijving, + hint +) +AS + SELECT COALESCE (fac_import_app_code, imp_log_applicatie), + TO_CHAR (imp_log_datum, 'dd-mm-yyyy hh24:mi'), + imp_log_status, + imp_log_omschrijving, + imp_log_hint + FROM imp_log il1, fac_import fi1, fac_import_app fia1 + WHERE il1.fac_import_key = fi1.fac_import_key(+) + AND fi1.fac_import_app_key = fia1.fac_import_app_key(+) + AND NOT EXISTS + (SELECT 1 + FROM imp_log il2, fac_import fi2 + WHERE il2.fac_import_key = fi2.fac_import_key + AND fi2.fac_import_app_key = fi1.fac_import_app_key + AND il2.fac_import_key > il1.fac_import_key); +/* +CREATE TABLE fmhn_imp_bez +( + reservering_id VARCHAR2 (30), + afspraak_key NUMBER (10), + locatiecode VARCHAR2 (10), + gebouwcode VARCHAR2 (12), + verdiepingcode VARCHAR2 (10), + ruimtenr VARCHAR2 (14), + datum DATE, + van DATE, + tot DATE, + contactpersoon VARCHAR2 (50), + naam VARCHAR2 (30), + bedrijf VARCHAR2 (60), + parkeerplaats VARCHAR2 (1), + actie VARCHAR2 (60), + telefoon VARCHAR2 (20), + email VARCHAR2 (200), + kenteken VARCHAR2 (10) +); +*/ +/* +CREATE OR REPLACE PROCEDURE fmhn_import_bez (p_import_key IN NUMBER) +AS + c_delim VARCHAR2 (1) := ';'; + v_newline VARCHAR2 (1000); -- Input line + v_errormsg VARCHAR2 (1000); + oracle_err_num NUMBER; + oracle_err_mes VARCHAR2 (200); + header_is_valid NUMBER; + v_count_tot NUMBER (10); + v_count_import NUMBER (10); + v_ongeldig NUMBER (1); + v_aanduiding VARCHAR2 (200); + -- De importvelden: + v_reservering_id VARCHAR2 (255); -- C/res_reservering_key+'/'+res_rsv_ruimte_volgnr + v_afspraak_id VARCHAR2 (255); -- N10/bez_afspraak_key + v_locatiecode VARCHAR2 (255); -- C10/alg_locatie_code + --TODO: + --v_gebouwcode VARCHAR2 (255); -- C12/alg_gebouw_code + --v_verdiepingcode VARCHAR2 (255); -- C10/alg_verdieping_code + --v_ruimtenr VARCHAR2 (255); -- C14/alg_ruimte_nr + v_datum VARCHAR2 (255); -- D/bez_afspraak_datum + v_van VARCHAR2 (255); -- D/bez_afspraak_datum + v_van_d DATE; + v_tot VARCHAR2 (255); -- D/bez_afspraak_eind + v_tot_d DATE; + v_contactpersoon VARCHAR2 (255); -- C50/bez_afspraak_gastheer + v_naam VARCHAR2 (255); -- C30/bez_afspraak_naam + v_bedrijf VARCHAR2 (255); -- C60/bez_afspraak_bedrijf + v_p VARCHAR2 (255); -- C/J(a) of N(ee)=>res_rsv_deel + v_actie VARCHAR2 (255); -- C/Ophalen of Doorlopen=>bez_kenmerkwaarde_waarde + v_telefoon VARCHAR2 (255); -- C20/bez_bezoekers_telefoon + v_email VARCHAR2 (255); -- C200/bez_bezoekers_email + v_kenteken VARCHAR2 (255); -- C10/bez_bezoekers_kenteken + + CURSOR c1 + IS + SELECT * + FROM fac_imp_file + WHERE fac_import_key = p_import_key + ORDER BY fac_imp_file_index; +BEGIN + DELETE FROM fmhn_imp_bez; + COMMIT; + + v_count_tot := 0; + v_count_import := 0; + header_is_valid := 0; -- Geen header, dus altijd valid! + + FOR rec1 IN c1 + LOOP + BEGIN + v_newline := rec1.fac_imp_file_line; + v_errormsg := 'Fout opvragen importregel'; + v_aanduiding := ''; + v_ongeldig := 0; + -- Lees alle veldwaarden + -- ReserveringId;AfspraakId;Locatiecode;Datum;Van;Tot;Contactpersoon;Naam;Bedrijf;P;Actie;Telefoon;Email;Kenteken + fac.imp_getfield (v_newline, c_delim, v_reservering_id); + fac.imp_getfield (v_newline, c_delim, v_afspraak_id); + fac.imp_getfield (v_newline, c_delim, v_locatiecode); + --fac.imp_getfield (v_newline, c_delim, v_gebouwcode); + --fac.imp_getfield (v_newline, c_delim, v_verdiepingcode); + --fac.imp_getfield (v_newline, c_delim, v_ruimtenr); + fac.imp_getfield (v_newline, c_delim, v_datum); + fac.imp_getfield (v_newline, c_delim, v_van); + fac.imp_getfield (v_newline, c_delim, v_tot); + fac.imp_getfield (v_newline, c_delim, v_contactpersoon); + fac.imp_getfield (v_newline, c_delim, v_naam); + fac.imp_getfield (v_newline, c_delim, v_bedrijf); + fac.imp_getfield (v_newline, c_delim, v_p); + fac.imp_getfield (v_newline, c_delim, v_actie); + fac.imp_getfield (v_newline, c_delim, v_telefoon); + fac.imp_getfield (v_newline, c_delim, v_email); + fac.imp_getfield (v_newline, c_delim, v_kenteken); + v_aanduiding := + '[' + || TRIM (v_reservering_id) + || '|' + || TRIM (v_afspraak_id) + || '|' + || TRIM (v_locatiecode) + || '|' + || TRIM (v_datum) || ' ' || TRIM (v_van) || '-' || TRIM (v_tot) + || '|' + || TRIM (v_contactpersoon) + || '|' + || TRIM (v_naam) + || '|' + || TRIM (v_bedrijf) + || '] '; + + -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen + -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen! + -- Ik negeer alles totdat ik een geldige header ben gepasseerd. + IF header_is_valid = 0 + THEN + IF UPPER (TRIM (v_reservering_id)) = 'RESERVERINGID' + AND UPPER (TRIM (v_afspraak_id)) = 'AFSPRAAKID' + AND UPPER (TRIM (v_locatiecode)) = 'LOCATIECODE' + --AND UPPER (TRIM (v_gebouwcode)) = 'GEBOUWCODE' + --AND UPPER (TRIM (v_verdiepingcode)) = 'VERDIEPINGCODE' + --AND UPPER (TRIM (v_ruimtenr)) = 'RUIMTENR' + AND UPPER (TRIM (v_datum)) = 'DATUM' + AND UPPER (TRIM (v_van)) = 'VAN' + AND UPPER (TRIM (v_tot)) = 'TOT' + AND UPPER (TRIM (v_contactpersoon)) = 'CONTACTPERSOON' + AND UPPER (TRIM (v_naam)) = 'NAAM' + AND UPPER (TRIM (v_bedrijf)) = 'BEDRIJF' + AND UPPER (TRIM (v_p)) = 'P' + AND UPPER (TRIM (v_actie)) = 'ACTIE' + AND UPPER (TRIM (v_telefoon)) = 'TELEFOON' + AND UPPER (TRIM (v_email)) = 'EMAIL' + AND UPPER (TRIM (v_kenteken)) = 'KENTEKEN' + THEN + header_is_valid := 1; + END IF; + ELSE + v_count_tot := v_count_tot + 1; + -- Controleer alle veldwaarden + v_errormsg := 'ReserveringId ongeldig; formaat niet /'; + v_reservering_id := TRIM (v_reservering_id); + + IF v_reservering_id IS NOT NULL + AND (fac.safe_to_number (SUBSTR (v_reservering_id, 1, INSTR (v_reservering_id, '/') - 1)) IS NULL + OR fac.safe_to_number (SUBSTR (v_reservering_id, INSTR (v_reservering_id, '/') + 1)) IS NULL) + THEN + v_ongeldig := 1; + fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel wordt overgeslagen!'); + END IF; + + -- + v_errormsg := 'AfspraakId ongeldig; formaat niet '; + v_afspraak_id := TRIM (v_afspraak_id); + + IF v_afspraak_id IS NOT NULL AND fac.safe_to_number (v_afspraak_id) IS NULL + THEN + v_ongeldig := 1; + fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel wordt overgeslagen!'); + END IF; + + -- + v_errormsg := 'Locatiecode ongeldig; ongedefinieerd of te lang'; + v_locatiecode := TRIM (v_locatiecode); + + IF COALESCE (v_reservering_id, v_afspraak_id) IS NULL + THEN + IF v_locatiecode IS NOT NULL AND LENGTH (v_locatiecode) > 10 + THEN + v_ongeldig := 1; + fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel wordt overgeslagen!'); + END IF; + ELSE + IF v_locatiecode IS NOT NULL + THEN + v_locatiecode := NULL; + fac.imp_writelog (p_import_key, 'I', v_aanduiding, 'Locatiecode wordt genegeerd!'); + END IF; + END IF; + + -- TODO: Gebouwcode/Verdiepingcode/Ruimtenr! + + -- TODO: Controle op binnen openingstijden? + v_errormsg := 'Datum/van ongeldig; ongedefinieerd'; + v_datum := TRIM (v_datum); + v_van := TRIM (v_van); + v_van_d := fac.safe_to_date (v_datum || ' ' || SUBSTR ('0' || v_van, -5), 'dd-mm-yyyy hh24:mi'); + + IF COALESCE (v_reservering_id, v_afspraak_id) IS NULL + THEN + IF v_van_d IS NULL + THEN + v_ongeldig := 1; + fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel wordt overgeslagen!'); + END IF; + ELSE + IF v_datum IS NOT NULL OR v_van IS NOT NULL + THEN + v_van_d := NULL; + fac.imp_writelog (p_import_key, 'I', v_aanduiding, 'Datum/van wordt genegeerd!'); + END IF; + END IF; + + -- TODO: Controle op binnen openingstijden? + v_errormsg := 'Datum/tot ongeldig; ongedefinieerd of voor van-tijdstip'; + v_datum := TRIM (v_datum); + v_tot := TRIM (v_tot); + v_tot_d := fac.safe_to_date (v_datum || ' ' || SUBSTR ('0' || v_tot, -5), 'dd-mm-yyyy hh24:mi'); + + IF COALESCE (v_reservering_id, v_afspraak_id) IS NULL + THEN + IF v_tot_d IS NULL OR v_tot_d < v_van_d + THEN + v_ongeldig := 1; + fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel wordt overgeslagen!'); + END IF; + ELSE + IF v_datum IS NOT NULL OR v_tot IS NOT NULL + THEN + v_tot_d := NULL; + fac.imp_writelog (p_import_key, 'I', v_aanduiding, 'Datum/tot wordt genegeerd!'); + END IF; + END IF; + + -- + v_errormsg := 'Contactpersoon ongeldig; ongedefinieerd of te lang'; + v_contactpersoon := TRIM (v_contactpersoon); + + IF COALESCE (v_reservering_id, v_afspraak_id) IS NULL + THEN + IF v_contactpersoon IS NULL + THEN + v_ongeldig := 1; + fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel wordt overgeslagen!'); + ELSIF LENGTH (v_contactpersoon) > 50 + THEN + fac.imp_writelog (p_import_key, 'I', v_aanduiding, 'Contactpersoon wordt afgekapt!'); + END IF; + ELSE + IF v_contactpersoon IS NOT NULL + THEN + v_contactpersoon := NULL; + fac.imp_writelog (p_import_key, 'I', v_aanduiding, 'Contactpersoon wordt genegeerd!'); + END IF; + END IF; + + -- + v_errormsg := 'Naam ongeldig; ongedefinieerd of te lang'; + v_naam := TRIM (v_naam); + + IF v_naam IS NULL OR LENGTH (v_naam) > 30 + THEN + fac.imp_writelog (p_import_key, 'I', v_aanduiding || v_errormsg, 'Naam wordt afgekapt!'); + END IF; + + -- + v_errormsg := 'Bedrijf ongeldig; ongedefinieerd of te lang'; + v_bedrijf := TRIM (v_bedrijf); + + IF v_bedrijf IS NULL OR LENGTH (v_bedrijf) > 60 + THEN + fac.imp_writelog (p_import_key, 'I', v_aanduiding || v_errormsg, 'Bedrijf wordt afgekapt!'); + END IF; + + -- + v_errormsg := 'P ongeldig; formaat niet J(a) of N(ee)'; + v_p := TRIM (v_p); + + IF v_p IS NOT NULL AND NOT (UPPER (v_p) = 'J' OR UPPER (v_p) = 'N' OR UPPER (v_p) = 'JA' OR UPPER (v_p) = 'NEE') + THEN + --v_p := 'N'; + fac.imp_writelog (p_import_key, 'I', v_aanduiding || v_errormsg, v_p || ' Bezoeker krijgt geen parkeerplaats!'); + END IF; + + -- + v_errormsg := 'Actie ongeldig; formaat niet Ophalen of Doorlopen'; + v_actie := TRIM (v_actie); + + IF v_actie IS NOT NULL AND NOT (UPPER (v_actie) = 'OPHALEN' OR UPPER (v_actie) = 'DOORLOPEN') + THEN + --v_actie := 'Ophalen'; + fac.imp_writelog (p_import_key, 'I', v_aanduiding || v_errormsg, v_actie || ' Bezoeker wordt opgehaald!'); + END IF; + + -- TODO: Telefooon/Email/Kenteken! + + -- Insert geformatteerde import record + IF v_ongeldig = 0 + THEN + BEGIN + v_errormsg := 'Fout wegschrijven importregel'; + + INSERT INTO fmhn_imp_bez (reservering_id, + afspraak_key, + locatiecode, + datum, + van, + tot, + contactpersoon, + naam, + bedrijf, + parkeerplaats, + actie, + telefoon, + email, + kenteken) + VALUES (v_reservering_id, + fac.safe_to_number (v_afspraak_id), + v_locatiecode, + v_van_d, + v_van_d, + v_tot_d, + SUBSTR (v_contactpersoon, 1, 50), + SUBSTR (v_naam, 1, 30), + SUBSTR (v_bedrijf, 1, 60), + SUBSTR (v_p, 1, 1), + v_actie, + NULL, + NULL, + NULL); + + v_count_import := v_count_import + 1; + EXCEPTION + WHEN OTHERS + THEN + oracle_err_num := SQLCODE; + oracle_err_mes := SUBSTR (SQLERRM, 1, 200); + v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; + fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, ''); + COMMIT; + END; + END IF; + END IF; + END; + END LOOP; + + IF (header_is_valid = 0) + THEN + fac.imp_writelog (p_import_key, 'E', 'Ongeldig importbestand', 'Geen header of header niet volgens specificatie!'); + ELSE + fac.imp_writelog (p_import_key, 'S', 'Bezoekers/#ingelezen importregels: ' || TO_CHAR (v_count_tot), ''); + fac.imp_writelog (p_import_key, 'S', 'Bezoekers/#ongeldige niet ingelezen importregels: ' || TO_CHAR (v_count_tot - v_count_import), ''); + END IF; + COMMIT; +EXCEPTION + WHEN OTHERS + THEN + oracle_err_num := SQLCODE; + oracle_err_mes := SUBSTR (SQLERRM, 1, 200); + v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; + fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Inleesproces bezoekers afgebroken!'); +END fmhn_import_bez; +/ + +CREATE OR REPLACE PROCEDURE fmhn_update_bez (p_import_key IN NUMBER) +AS + v_errormsg VARCHAR2 (1000) := '-'; + oracle_err_num NUMBER; + oracle_err_mes VARCHAR2 (200); + v_aanduiding VARCHAR2 (200); + v_importeur_key NUMBER (10); + v_actie_key_def NUMBER (10); + v_actie_key_all NUMBER (10); + v_prev_rsv_ruimte_key NUMBER (10); + v_prev_afspraak_key NUMBER (10); + v_prev_locatie_key NUMBER (10); + v_prev_datum_van DATE; + v_prev_datum_tot DATE; + v_prev_contactpersoon VARCHAR2 (50); + v_cur_afspraak_key NUMBER (10); + v_cur_bezoekers_key NUMBER (10); + v_cur_deel_key NUMBER (10); + v_count_tot NUMBER (10) := 0; + v_count_new NUMBER (10) := 0; + v_count NUMBER (10); + + CURSOR c1 + IS + SELECT i.reservering_id, + COALESCE (rrr.res_rsv_ruimte_key, -1) res_rsv_ruimte_key, + i.afspraak_key, + COALESCE (a.bez_afspraak_key, -1) bez_afspraak_key, + i.locatiecode, + COALESCE (rrr.alg_locatie_key, a.alg_locatie_key, l.alg_locatie_key, -1) alg_locatie_key, + COALESCE (rrr.res_rsv_ruimte_van, a.bez_afspraak_datum, i.van) van, + COALESCE (rrr.res_rsv_ruimte_tot, a.bez_afspraak_eind, i.tot) tot, + COALESCE (rph.prs_perslid_naam_friendly, aph.prs_perslid_naam_friendly, i.contactpersoon) contactpersoon, + i.bedrijf, i.naam, i.parkeerplaats, i.actie, + COALESCE (rrr.res_rsv_ruimte_host_key, a.bez_afspraak_host_key) host_key, + COALESCE (rrr.res_rsv_ruimte_contact_key, a.bez_afspraak_contact_key) contact_key + FROM (SELECT * FROM fmhn_imp_bez) i + LEFT JOIN (SELECT rrr.res_rsv_ruimte_key, + rrr.res_reservering_key, + rrr.res_rsv_ruimte_volgnr, + rrr.res_rsv_ruimte_van, + rrr.res_rsv_ruimte_tot, + rrr.res_rsv_ruimte_host_key, + rrr.res_rsv_ruimte_contact_key, + aog.alg_locatie_key + FROM res_v_aanwezigrsv_ruimte rrr, + res_ruimte_opstelling rro, + ( SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key + FROM res_alg_ruimte + WHERE res_alg_ruimte_verwijder IS NULL + GROUP BY res_ruimte_key) rar1, + ( SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key + FROM res_alg_ruimte + WHERE res_alg_ruimte_verwijder IS NOT NULL + GROUP BY res_ruimte_key) rar2, + alg_v_allonroerendgoed aog + WHERE rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+) + AND rro.res_ruimte_key = rar1.res_ruimte_key(+) + AND rro.res_ruimte_key = rar2.res_ruimte_key(+) + AND COALESCE (rar1.alg_ruimte_key, rar2.alg_ruimte_key, rrr.alg_ruimte_key) = aog.alg_ruimte_key) rrr + ON i.reservering_id = TO_CHAR (rrr.res_reservering_key) || '/' || TO_CHAR (rrr.res_rsv_ruimte_volgnr) + LEFT JOIN prs_v_perslid_fullnames_all rph + ON rrr.res_rsv_ruimte_host_key = rph.prs_perslid_key + LEFT JOIN bez_afspraak a + ON i.afspraak_key = a.bez_afspraak_key + LEFT JOIN prs_v_perslid_fullnames_all aph + ON a.bez_afspraak_host_key = aph.prs_perslid_key + LEFT JOIN alg_v_aanweziglocatie l + ON UPPER (i.locatiecode) = UPPER (l.alg_locatie_code) + ORDER BY 1, 3, 5, 7, 8, 9, 10, 11; +BEGIN + v_errormsg := 'Fout bepalen importeur'; + SELECT prs_perslid_key + INTO v_importeur_key + FROM fac_import + WHERE fac_import_key = p_import_key; + + v_errormsg := 'Fout bepalen actie'; + SELECT MAX (DECODE (bez_actie_default, 1, bez_actie_key, -1)), + MAX (DECODE (COALESCE (bez_actie_default, 0), 0, bez_actie_key, -1)) + INTO v_actie_key_def, + v_actie_key_all + FROM bez_actie + WHERE bez_actie_verwijder IS NULL + AND bez_actie_flags = 0; + + v_prev_rsv_ruimte_key := -1; + v_prev_afspraak_key := -1; + v_prev_locatie_key := -1; + v_prev_datum_van := TRUNC (SYSDATE); + v_prev_datum_tot := TRUNC (SYSDATE); + v_prev_contactpersoon := ''; + v_cur_afspraak_key := -1; + v_cur_bezoekers_key := -1; + v_cur_deel_key := -1; + + FOR rec IN c1 + LOOP + BEGIN + v_aanduiding := + '[' + || TO_CHAR (rec.res_rsv_ruimte_key) + || '|' + || TO_CHAR (rec.bez_afspraak_key) + || '|' + || TO_CHAR (rec.alg_locatie_key) + || '|' + || TO_CHAR (rec.van, 'dd-mm-yyyy hh24:mi') || '-' || TO_CHAR (rec.tot, 'hh24:mi') + || '|' + || rec.contactpersoon + || '|' + || rec.bedrijf + || '|' + || rec.naam + || '] '; + v_count_tot := v_count_tot + 1; + + -- TODO: Autorisaties strakker controleren? + v_errormsg := 'Fout bepalen autorisatie'; + SELECT COUNT ( * ) + INTO v_count + FROM (SELECT * + FROM fac_gebruikersgroep gg + WHERE gg.prs_perslid_key = 10321 -- Simone=28142 + AND EXISTS + (SELECT 1 + FROM fac_groeprechten + WHERE fac_functie_key = 15 -- BEZUSE + AND fac_groep_key = gg.fac_groep_key) + AND (gg.prs_perslid_key = COALESCE (rec.contact_key, v_importeur_key) -- Importeur = contact! + OR EXISTS -- Importeur zit in een VERVANGER-groep met contact voor betreffende afspraak! + (SELECT 1 + FROM fac_gebruikersgroep gg2, fac_groep g2 + WHERE gg2.prs_perslid_key = rec.contact_key -- Saskia=10321 + AND gg2.fac_groep_key = g2.fac_groep_key + AND g2.fac_groep_collega = 1 + AND g2.fac_groep_key = gg.fac_groep_key)) + UNION ALL + SELECT * + FROM fac_gebruikersgroep gg + WHERE gg.prs_perslid_key = v_importeur_key -- Simone=28142 + AND EXISTS + (SELECT 1 + FROM fac_groeprechten + WHERE fac_functie_key = 321 -- BEZFOF + AND fac_gebruiker_prs_level_write < 9 + AND fac_gebruiker_alg_level_write < 9 + AND fac_groep_key = gg.fac_groep_key)); + + IF v_count = 0 + THEN + fac.imp_writelog (p_import_key, 'E', v_aanduiding || 'Niet geautoriseerd om deze bezoeker aan te melden', ''); + ELSIF rec.van < SYSDATE + THEN + fac.imp_writelog (p_import_key, 'E', v_aanduiding || 'Bezoek aanmelden terug in de tijd niet toegestaan', ''); + ELSIF rec.reservering_id IS NOT NULL AND rec.res_rsv_ruimte_key = -1 + THEN + fac.imp_writelog (p_import_key, 'E', v_aanduiding || 'Fout bepalen bestaande reservering', ''); + ELSIF rec.afspraak_key IS NOT NULL AND rec.bez_afspraak_key = -1 + THEN + fac.imp_writelog (p_import_key, 'E', v_aanduiding || 'Fout bepalen bestaande afspraak', ''); + ELSIF rec.locatiecode IS NOT NULL AND rec.alg_locatie_key = -1 + THEN + fac.imp_writelog (p_import_key, 'E', v_aanduiding || 'Fout bepalen locatie nieuwe afspraak', ''); + ELSIF v_prev_rsv_ruimte_key != rec.res_rsv_ruimte_key + OR v_prev_afspraak_key != rec.bez_afspraak_key + OR v_prev_locatie_key != rec.alg_locatie_key + OR v_prev_datum_van != rec.van + OR v_prev_datum_tot != rec.tot + OR UPPER (v_prev_contactpersoon) != UPPER (rec.contactpersoon) + THEN + v_errormsg := 'Fout bepalen bestaande/nieuwe afspraak'; + IF rec.res_rsv_ruimte_key != -1 -- Bestaande reservering + THEN + v_prev_rsv_ruimte_key := rec.res_rsv_ruimte_key; + v_prev_afspraak_key := -1; + + -- Bepalen bestaande/nieuwe afspraak bij bestaande reservering! + SELECT COUNT (*) + INTO v_count + FROM bez_afspraak + WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key; + + IF v_count = 0 + THEN + -- Toevoegen afspraak bij reservering! + v_errormsg := 'Fout toevoegen afspraak bij reservering'; + INSERT INTO bez_afspraak (prs_perslid_key, + bez_afspraak_datum, + bez_actie_key, + bez_afspraak_ruimte, + bez_afspraak_opmerking, + bez_afspraak_eind, + bez_afspraak_gastheer, + bez_afspraak_telefoonnr, + alg_locatie_key, + res_rsv_ruimte_key, + alg_onrgoed_keys, + bez_afspraak_host_key, + bez_afspraak_contact_key) + VALUES (NULL, + rec.van, + COALESCE (v_actie_key_def, v_actie_key_all), + NULL, + NULL, -- Opmerking + rec.tot, + rec.contactpersoon, + NULL, -- Telefoon + rec.alg_locatie_key, + rec.res_rsv_ruimte_key, + NULL, + rec.host_key, + rec.contact_key) + RETURNING bez_afspraak_key + INTO v_cur_afspraak_key; + + fac.trackaction ('BEZMUT', v_cur_afspraak_key, v_importeur_key, NULL, ''); + fac.imp_writelog (p_import_key, 'I', v_aanduiding || 'Afspraak ' || TO_CHAR (v_cur_afspraak_key) || ' aangemaakt', ''); + ELSE + SELECT bez_afspraak_key + INTO v_cur_afspraak_key + FROM bez_afspraak + WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key; + END IF; + ELSIF rec.bez_afspraak_key != -1 -- Bestaande losse afspraak + THEN + v_prev_rsv_ruimte_key := -1; + v_prev_afspraak_key := rec.bez_afspraak_key; + + v_cur_afspraak_key := rec.bez_afspraak_key; + ELSE -- Nieuwe losse afspraak + v_prev_rsv_ruimte_key := -1; + v_prev_afspraak_key := -1; + + -- Toevoegen losse afspraak! + v_errormsg := 'Fout toevoegen losse afspraak'; + INSERT INTO bez_afspraak (prs_perslid_key, + bez_afspraak_datum, + bez_actie_key, + bez_afspraak_ruimte, + bez_afspraak_opmerking, + bez_afspraak_eind, + bez_afspraak_gastheer, + bez_afspraak_telefoonnr, + alg_locatie_key, + res_rsv_ruimte_key, + alg_onrgoed_keys, + bez_afspraak_host_key, + bez_afspraak_contact_key) + VALUES (v_importeur_key, + rec.van, + COALESCE (v_actie_key_def, v_actie_key_all), + NULL, + NULL, -- Opmerking + rec.tot, + rec.contactpersoon, -- TODO: Bij huidige BEZ-settings genegeerd en geldt host=importeur! + NULL, -- Telefoon + rec.alg_locatie_key, + NULL, + NULL, + v_importeur_key, + v_importeur_key) + RETURNING bez_afspraak_key + INTO v_cur_afspraak_key; + + fac.trackaction ('BEZMUT', v_cur_afspraak_key, v_importeur_key, NULL, ''); + fac.imp_writelog (p_import_key, 'I', v_aanduiding || 'Afspraak ' || TO_CHAR (v_cur_afspraak_key) || ' aangemaakt', ''); + END IF; + + v_prev_locatie_key := rec.alg_locatie_key; + v_prev_datum_van := rec.van; + v_prev_datum_tot := rec.tot; + v_prev_contactpersoon := rec.contactpersoon; + + -- Verwijderen huidige bezoeker(s) inclusief kenmerken/parkeerplaatsen! + v_errormsg := 'Fout verwijderen bezoeker(s)'; + DELETE FROM bez_kenmerkwaarde bk + WHERE EXISTS + (SELECT 1 + FROM bez_bezoekers + WHERE bez_afspraak_key = v_cur_afspraak_key + AND bez_bezoekers_key = bk.bez_bezoekers_key); + DELETE FROM res_rsv_deel rrd + WHERE EXISTS + (SELECT 1 + FROM bez_bezoekers + WHERE bez_afspraak_key = v_cur_afspraak_key + AND bez_bezoekers_key = rrd.bez_bezoekers_key); + DELETE FROM bez_bezoekers WHERE bez_afspraak_key = v_cur_afspraak_key; + + SELECT MIN (rd.res_deel_key) + INTO v_cur_deel_key + FROM res_deel rd, ins_deel d + WHERE rd.res_deel_verwijder IS NULL + AND rd.res_discipline_key = 781 -- TODO: Minder hard-coded! + AND rd.res_ins_deel_key = d.ins_deel_key + AND d.ins_alg_locatie_key = rec.alg_locatie_key + AND NOT EXISTS + (SELECT 1 + FROM res_v_aanwezigrsv_deel + WHERE res_deel_key = rd.res_deel_key + AND res_rsv_deel_van <= rec.tot + AND res_rsv_deel_tot >= rec.van); + + -- Toevoegen eerste bezoeker! + v_errormsg := 'Fout toevoegen eerste bezoeker'; + INSERT INTO bez_bezoekers (bez_afspraak_key, bez_afspraak_naam, bez_afspraak_bedrijf, bez_afspraak_opmerking) + VALUES (v_cur_afspraak_key, rec.naam, rec.bedrijf, NULL) + RETURNING bez_bezoekers_key + INTO v_cur_bezoekers_key; + + IF rec.parkeerplaats = 'J' + THEN + -- Toevoegen parkeerplaats! + v_errormsg := 'Fout bepalen eerste bezoeker-parkeerplaats'; + SELECT MIN (rd.res_deel_key) + INTO v_cur_deel_key + FROM res_deel rd, ins_deel d + WHERE rd.res_deel_verwijder IS NULL + AND rd.res_discipline_key = 781 -- TODO: Minder hard-coded! + AND rd.res_ins_deel_key = d.ins_deel_key + AND d.ins_alg_locatie_key = rec.alg_locatie_key + AND NOT EXISTS + (SELECT 1 + FROM res_v_aanwezigrsv_deel + WHERE res_deel_key = rd.res_deel_key + AND res_rsv_deel_van <= rec.tot + AND res_rsv_deel_tot >= rec.van); + + IF v_cur_deel_key IS NOT NULL + THEN + v_errormsg := 'Fout toevoegen eerste bezoeker-parkeerplaats'; + INSERT INTO res_rsv_deel (res_deel_key, res_rsv_deel_aantal, res_rsv_deel_van, res_rsv_deel_tot, res_status_bo_key, res_rsv_ruimte_key, bez_bezoekers_key, res_rsv_deel_dirtlevel) + VALUES (v_cur_deel_key, 1, rec.van, rec.tot, 2, DECODE (rec.res_rsv_ruimte_key, -1, NULL, rec.res_rsv_ruimte_key), v_cur_bezoekers_key, 0); + ELSE + fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Geen parkeerplaats beschikbaar', ''); + END IF; + END IF; + + -- Toevoegen Ophalen/Doorlopen! TODO: Minder hard-coded! + v_errormsg := 'Fout toevoegen eerste bezoeker-actie'; + INSERT INTO bez_kenmerkwaarde (bez_bezoekers_key, bez_kenmerk_key, bez_kenmerkwaarde_waarde) + VALUES (v_cur_bezoekers_key, 1160, DECODE (rec.actie, 'Doorlopen', '2002', '2001')); + + fac.trackaction ('BEZUPD', v_cur_afspraak_key, v_importeur_key, NULL, 'Afspraak ' || TO_CHAR (v_cur_afspraak_key) || ' is gewijzigd' || CHR (13) || CHR (10) || 'Bezoekers via import toegevoegd/bijgewerkt'); + -- TODO: Verwijderen (BEZUPD-tracking wordt standaard al getoond bij eventueel gekoppelde reservering)! + --IF rec.res_rsv_ruimte_key != -1 + --THEN + -- fac.trackaction ('RESUPD', rec.res_rsv_ruimte_key, v_importeur_key, NULL, 'Afspraak ' || TO_CHAR (v_cur_afspraak_key) || ' is gewijzigd' || CHR (13) || CHR (10) || 'Bezoekers via import toegevoegd/bijgewerkt'); + --END IF; + ELSE + -- Toevoegen volgende bezoeker! + v_errormsg := 'Fout toevoegen volgende bezoeker'; + INSERT INTO bez_bezoekers (bez_afspraak_key, bez_afspraak_naam, bez_afspraak_bedrijf, bez_afspraak_opmerking) + VALUES (v_cur_afspraak_key, rec.naam, rec.bedrijf, NULL) + RETURNING bez_bezoekers_key + INTO v_cur_bezoekers_key; + + -- Toevoegen parkeerplaats! + IF rec.parkeerplaats = 'J' + THEN + -- Toevoegen parkeerplaats! + v_errormsg := 'Fout bepalen eerste bezoeker-parkeerplaats'; + SELECT MIN (rd.res_deel_key) + INTO v_cur_deel_key + FROM res_deel rd, ins_deel d + WHERE rd.res_deel_verwijder IS NULL + AND rd.res_discipline_key = 781 -- TODO: Minder hard-coded! + AND rd.res_ins_deel_key = d.ins_deel_key + AND d.ins_alg_locatie_key = rec.alg_locatie_key + AND NOT EXISTS + (SELECT 1 + FROM res_v_aanwezigrsv_deel + WHERE res_deel_key = rd.res_deel_key + AND res_rsv_deel_van <= rec.tot + AND res_rsv_deel_tot >= rec.van); + + IF v_cur_deel_key IS NOT NULL + THEN + v_errormsg := 'Fout toevoegen eerste bezoeker-parkeerplaats'; + INSERT INTO res_rsv_deel (res_deel_key, res_rsv_deel_aantal, res_rsv_deel_van, res_rsv_deel_tot, res_status_bo_key, res_rsv_ruimte_key, bez_bezoekers_key, res_rsv_deel_dirtlevel) + VALUES (v_cur_deel_key, 1, rec.van, rec.tot, 2, DECODE (rec.res_rsv_ruimte_key, -1, NULL, rec.res_rsv_ruimte_key), v_cur_bezoekers_key, 0); + ELSE + fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Geen parkeerplaats beschikbaar', ''); + END IF; + END IF; + + -- Toevoegen Ophalen/Doorlopen! TODO: Minder hard-coded! + v_errormsg := 'Fout toevoegen volgende bezoeker-actie'; + INSERT INTO bez_kenmerkwaarde (bez_bezoekers_key, bez_kenmerk_key, bez_kenmerkwaarde_waarde) + VALUES (v_cur_bezoekers_key, 1160, DECODE (rec.actie, 'Doorlopen', '2002', '2001')); + END IF; + + v_count_new := v_count_new + 1; + 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, ''); + END; + END LOOP; + + fac.imp_writelog (p_import_key, 'S', 'Bezoekers/#ingelezen: ' || TO_CHAR (v_count_tot), ''); + fac.imp_writelog (p_import_key, 'S', 'Bezoekers/#toegevoegd: ' || TO_CHAR (v_count_new), ''); + 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 bezoekers afgebroken!'); +END fmhn_update_bez; +/ +*/ +CREATE OR REPLACE VIEW fmhn_v_rap_res_looplijst +( + hide_f_srt, + nr, + fclt_f_gebouw, + datum, + begintijd, + eindtijd, + fclt_f_ruimte, + opstelling, + aantal, + omschrijving, + meldingen, + voorzieningen, + catering, + beveiliging, + schoonmaak, + res_rsv_ruimte_key +) +AS + SELECT DISTINCT + TO_CHAR (rr.res_rsv_ruimte_van, 'yyyy-mm-dd') || rg.alg_gebouw_upper || TO_CHAR (rr.res_rsv_ruimte_van, 'hh24:mi') + hide_f_srt, + rr.res_reservering_key || '/' || rr.res_rsv_ruimte_volgnr nr, + rg.alg_gebouw_omschrijving fclt_f_gebouw, + rr.res_rsv_ruimte_van datum, + TO_CHAR (rr.res_rsv_ruimte_van, 'hh24:mi') begintijd, + TO_CHAR (rr.res_rsv_ruimte_tot, 'hh24:mi') eindtijd, + r.res_ruimte_nr fclt_f_ruimte, + o.res_opstelling_omschrijving opstelling, + rr.res_rsv_ruimte_bezoekers aantal, + rr.res_rsv_ruimte_omschrijving omschrijving, + mld.aant meldingen, + --voorzieningen, + CASE + WHEN LENGTH (voorzieningen) > 75 + THEN SUBSTR (voorzieningen, 1, 75) || ' ...' + ELSE voorzieningen + END + voorzieningen, + CASE + WHEN LENGTH (catering) > 75 + THEN SUBSTR (catering, 1, 75) || ' ...' + ELSE catering + END + catering, + CASE + WHEN LENGTH (beveiliging) > 75 + THEN SUBSTR (beveiliging, 1, 75) || ' ...' + ELSE beveiliging + END + beveiliging, + CASE + WHEN LENGTH (schoonmaak) > 75 + THEN SUBSTR (schoonmaak, 1, 75) || ' ...' + ELSE schoonmaak + END + schoonmaak, + rr.res_rsv_ruimte_key + FROM res_rsv_ruimte rr, + res_ruimte_opstelling ro, + res_opstelling o, + res_ruimte r, + res_alg_ruimte ar, + alg_v_ruimte_gegevens rg, + ( SELECT res_rsv_ruimte_key, + 'ja (' || COUNT (res_rsv_ruimte_key) || ')' aant + FROM mld_melding + WHERE res_rsv_ruimte_key IS NOT NULL + GROUP BY res_rsv_ruimte_key) mld, + ( SELECT res_rsv_ruimte_key, + listagg (voorziening, ', ') WITHIN GROUP (ORDER BY voorziening) + AS voorzieningen + FROM (SELECT res_rsv_ruimte_key, + res_deel_omschrijving voorziening + FROM res_deel rd, res_rsv_deel rrd + WHERE res_rsv_deel_verwijder IS NULL + AND rd.res_deel_key = rrd.res_deel_key + AND res_rsv_ruimte_key IS NOT NULL) + GROUP BY res_rsv_ruimte_key) voorz, + ( SELECT res_rsv_ruimte_key, + listagg (artikel, ', ') WITHIN GROUP (ORDER BY artikel) + AS catering + FROM (SELECT res_rsv_ruimte_key, + res_rsv_artikel_aantal || ' x ' || res_artikel_omschrijving + artikel + FROM res_rsv_artikel rra, res_artikel ra + WHERE rra.res_rsv_artikel_verwijder IS NULL + AND rra.res_rsv_ruimte_key IS NOT NULL + AND rra.res_artikel_key = ra.res_artikel_key + AND ra.res_discipline_key NOT IN (3590, 3591)) -- Reguliere catering + GROUP BY res_rsv_ruimte_key) cat, + ( SELECT res_rsv_ruimte_key, + listagg (artikel, ', ') WITHIN GROUP (ORDER BY artikel desc) + AS beveiliging + FROM (SELECT res_rsv_ruimte_key, + res_rsv_artikel_aantal || ' x ' || res_artikel_omschrijving + artikel + FROM res_rsv_artikel rra, res_artikel ra + WHERE rra.res_rsv_artikel_verwijder IS NULL + AND rra.res_rsv_ruimte_key IS NOT NULL + AND rra.res_artikel_key = ra.res_artikel_key + AND ra.res_discipline_key = 3590) -- Beveiliging + GROUP BY res_rsv_ruimte_key) beveiliging, + ( SELECT res_rsv_ruimte_key, + listagg (artikel, ', ') WITHIN GROUP (ORDER BY artikel desc) + AS schoonmaak + FROM (SELECT res_rsv_ruimte_key, + res_rsv_artikel_aantal || ' x ' || res_artikel_omschrijving + artikel + FROM res_rsv_artikel rra, res_artikel ra + WHERE rra.res_rsv_artikel_verwijder IS NULL + AND rra.res_rsv_ruimte_key IS NOT NULL + AND rra.res_artikel_key = ra.res_artikel_key + AND ra.res_discipline_key = 3591) -- Schoonmaak + GROUP BY res_rsv_ruimte_key) schoonmaak + WHERE TRUNC (rr.res_rsv_ruimte_van) > TO_DATE ('01-07-2020', 'dd-mm-yyyy') + AND rr.res_rsv_ruimte_verwijder IS NULL + AND rr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key + AND ro.res_opstelling_key = o.res_opstelling_key + AND ro.res_ruimte_key = r.res_ruimte_key + AND r.res_ruimte_key = ar.res_ruimte_key + AND ar.res_alg_ruimte_verwijder IS NULL + AND ar.alg_ruimte_key = rg.alg_ruimte_key + AND rr.res_rsv_ruimte_key = mld.res_rsv_ruimte_key(+) + AND rr.res_rsv_ruimte_key = voorz.res_rsv_ruimte_key(+) + AND rr.res_rsv_ruimte_key = cat.res_rsv_ruimte_key(+) + AND rr.res_rsv_ruimte_key = beveiliging.res_rsv_ruimte_key(+) + AND rr.res_rsv_ruimte_key = schoonmaak.res_rsv_ruimte_key(+); + +CREATE OR REPLACE VIEW fmhn_v_rap_cateringtoday +( + hide_f_srt, + nr, + fclt_f_gebouw, + datum, + begintijd, + eindtijd, + fclt_f_ruimte, + opstelling, + aantal, + omschrijving, + meldingen, + voorzieningen, + catering, + res_rsv_ruimte_key, + afgeleverd +) +AS + SELECT dvr.hide_f_srt, + dvr.nr, + dvr.fclt_f_gebouw, + dvr.datum, + dvr.begintijd, + dvr.eindtijd, + dvr.fclt_f_ruimte, + dvr.opstelling, + dvr.aantal, + dvr.omschrijving, + dvr.meldingen, + dvr.voorzieningen, + dvr.catering, + dvr.res_rsv_ruimte_key, + DECODE (st.res_kenmerkreservering_waarde, + 1, lcl.l ('lcl_yes'), + lcl.l ('lcl_no')) + afgeleverd + FROM fmhn_v_rap_res_looplijst dvr, + (SELECT rk.res_rsv_ruimte_key, + sk.res_srtkenmerk_omschrijving, + res_kenmerkreservering_waarde + FROM res_v_aanwezigkenmerkwaarde rk, res_kenmerk k, res_srtkenmerk sk + WHERE rk.res_kenmerk_key = k.res_kenmerk_key + AND k.res_srtkenmerk_key = sk.res_srtkenmerk_key + AND sk.res_srtkenmerk_key = 101) st + WHERE TRUNC (dvr.datum) = TRUNC (SYSDATE) + AND dvr.catering IS NOT NULL + AND dvr.res_rsv_ruimte_key = st.res_rsv_ruimte_key(+); + +CREATE OR REPLACE VIEW fmhn_v_rap_res_middelen +( + hide_f_srt, + nr, + fclt_f_gebouw, + datum, + begintijd, + eindtijd, + fclt_f_ruimte, + opstelling, + aantal, + omschrijving, + meldingen, + --voorzieningen, + catering, -- Middelen + res_rsv_ruimte_key, + afgeleverd +) +AS + SELECT dvr.hide_f_srt, + dvr.nr, + dvr.fclt_f_gebouw, + dvr.datum, + dvr.begintijd, + dvr.eindtijd, + dvr.fclt_f_ruimte, + dvr.opstelling, + dvr.aantal, + dvr.omschrijving, + dvr.meldingen, + --dvr.voorzieningen, + dvr.voorzieningen catering, + dvr.res_rsv_ruimte_key, + DECODE (st.res_kenmerkreservering_waarde, + 1, lcl.l ('lcl_yes'), + lcl.l ('lcl_no')) + afgeleverd + FROM fmhn_v_rap_res_looplijst dvr, + (SELECT rk.res_rsv_ruimte_key, + sk.res_srtkenmerk_omschrijving, + res_kenmerkreservering_waarde + FROM res_v_aanwezigkenmerkwaarde rk, res_kenmerk k, res_srtkenmerk sk + WHERE rk.res_kenmerk_key = k.res_kenmerk_key + AND k.res_srtkenmerk_key = sk.res_srtkenmerk_key + AND sk.res_srtkenmerk_key = 101) st -- Afgeleverd-vinkveld + WHERE TRUNC (dvr.datum) = TRUNC (SYSDATE) + AND dvr.voorzieningen IS NOT NULL + AND dvr.res_rsv_ruimte_key = st.res_rsv_ruimte_key(+); + +CREATE OR REPLACE FORCE VIEW fmhn_v_rap_res_catering +( + hide_f_srt, + nr, + fclt_f_gebouw, + datum, + begintijd, + eindtijd, + fclt_f_ruimte, + opstelling, + aantal, + omschrijving, + meldingen, + --voorzieningen, + catering, -- Catering + res_rsv_ruimte_key, + afgeleverd +) +AS + SELECT dvr.hide_f_srt, + dvr.nr, + dvr.fclt_f_gebouw, + dvr.datum, + dvr.begintijd, + dvr.eindtijd, + dvr.fclt_f_ruimte, + dvr.opstelling, + dvr.aantal, + dvr.omschrijving, + dvr.meldingen, + --dvr.voorzieningen, + dvr.catering, + dvr.res_rsv_ruimte_key, + DECODE (st.res_kenmerkreservering_waarde, + 1, lcl.l ('lcl_yes'), + lcl.l ('lcl_no')) + afgeleverd + FROM fmhn_v_rap_res_looplijst dvr, + (SELECT rk.res_rsv_ruimte_key, + sk.res_srtkenmerk_omschrijving, + res_kenmerkreservering_waarde + FROM res_v_aanwezigkenmerkwaarde rk, res_kenmerk k, res_srtkenmerk sk + WHERE rk.res_kenmerk_key = k.res_kenmerk_key + AND k.res_srtkenmerk_key = sk.res_srtkenmerk_key + AND sk.res_srtkenmerk_key = 101) st -- Afgeleverd-vinkveld + WHERE TRUNC (dvr.datum) = TRUNC (SYSDATE) + AND dvr.catering IS NOT NULL + AND dvr.res_rsv_ruimte_key = st.res_rsv_ruimte_key(+); + +CREATE OR REPLACE VIEW fmhn_v_rap_res_beveiliging +( + hide_f_srt, + nr, + fclt_f_gebouw, + datum, + begintijd, + eindtijd, + fclt_f_ruimte, + opstelling, + aantal, + omschrijving, + meldingen, + --voorzieningen, + catering, -- Beveiliging + res_rsv_ruimte_key, + afgeleverd +) +AS + SELECT dvr.hide_f_srt, + dvr.nr, + dvr.fclt_f_gebouw, + dvr.datum, + dvr.begintijd, + dvr.eindtijd, + dvr.fclt_f_ruimte, + dvr.opstelling, + dvr.aantal, + dvr.omschrijving, + dvr.meldingen, + --dvr.voorzieningen, + dvr.beveiliging catering, + dvr.res_rsv_ruimte_key, + DECODE (st.res_kenmerkreservering_waarde, + 1, lcl.l ('lcl_yes'), + lcl.l ('lcl_no')) + afgeleverd + FROM fmhn_v_rap_res_looplijst dvr, + (SELECT rk.res_rsv_ruimte_key, + sk.res_srtkenmerk_omschrijving, + res_kenmerkreservering_waarde + FROM res_v_aanwezigkenmerkwaarde rk, res_kenmerk k, res_srtkenmerk sk + WHERE rk.res_kenmerk_key = k.res_kenmerk_key + AND k.res_srtkenmerk_key = sk.res_srtkenmerk_key + AND sk.res_srtkenmerk_key = 101) st -- Afgeleverd-vinkveld + WHERE TRUNC (dvr.datum) = TRUNC (SYSDATE) + AND dvr.beveiliging IS NOT NULL + AND dvr.res_rsv_ruimte_key = st.res_rsv_ruimte_key(+); + +CREATE OR REPLACE VIEW fmhn_v_rap_res_schoonmaak +( + hide_f_srt, + nr, + fclt_f_gebouw, + datum, + begintijd, + eindtijd, + fclt_f_ruimte, + opstelling, + aantal, + omschrijving, + meldingen, + --voorzieningen, + catering, -- Schoonmaak + res_rsv_ruimte_key, + afgeleverd +) +AS + SELECT dvr.hide_f_srt, + dvr.nr, + dvr.fclt_f_gebouw, + dvr.datum, + dvr.begintijd, + dvr.eindtijd, + dvr.fclt_f_ruimte, + dvr.opstelling, + dvr.aantal, + dvr.omschrijving, + dvr.meldingen, + --dvr.voorzieningen, + dvr.schoonmaak catering, + dvr.res_rsv_ruimte_key, + DECODE (st.res_kenmerkreservering_waarde, + 1, lcl.l ('lcl_yes'), + lcl.l ('lcl_no')) + afgeleverd + FROM fmhn_v_rap_res_looplijst dvr, + (SELECT rk.res_rsv_ruimte_key, + sk.res_srtkenmerk_omschrijving, + res_kenmerkreservering_waarde + FROM res_v_aanwezigkenmerkwaarde rk, res_kenmerk k, res_srtkenmerk sk + WHERE rk.res_kenmerk_key = k.res_kenmerk_key + AND k.res_srtkenmerk_key = sk.res_srtkenmerk_key + AND sk.res_srtkenmerk_key = 101) st -- Afgeleverd-vinkveld + WHERE TRUNC (dvr.datum) = TRUNC (SYSDATE) + AND dvr.schoonmaak IS NOT NULL + AND dvr.res_rsv_ruimte_key = st.res_rsv_ruimte_key(+); + +CREATE OR REPLACE PROCEDURE fmhn_select_speednoti (p_applname IN VARCHAR2, + p_applrun IN VARCHAR2) +AS + v_errormsg VARCHAR2 (1000); + oracle_err_num NUMBER; + oracle_err_mes VARCHAR2 (200); + v_curdatetime DATE := SYSDATE; + + CURSOR c_resupdvico + IS + WITH lastchange AS (SELECT res_activiteit_verwijder datum FROM res_activiteit WHERE res_activiteit_key = 0) -- Overig/Bah! + SELECT DISTINCT + '[' || TO_CHAR (rrr.res_reservering_key) || '/' || TO_CHAR (rrr.res_rsv_ruimte_volgnr) || '|' || cust01.fac_srtnotificatie_code || '] ' + aanduiding, + rrr.res_reservering_key, + rrr.res_rsv_ruimte_key, + 'CUST01' noti, + REPLACE ( + REPLACE ( + lcl.x ('fac_srtnotificatie_oms', cust01.fac_srtnotificatie_key, cust01.fac_srtnotificatie_oms), + '##KEY##', TO_CHAR (rrr.res_reservering_key) || '/' || TO_CHAR (rrr.res_rsv_ruimte_volgnr)), + '##DESC##', rrr.res_rsv_ruimte_omschrijving) + subj, + SUBSTR (ba.prs_bedrijfadres_url, INSTR (ba.prs_bedrijfadres_url, 'mailto:') + 7) mailto + FROM fac_tracking t, + fac_srtnotificatie resupd, + lastchange, + res_rsv_ruimte rrr, + --res_ruimte_opstelling ro, + --res_ruimte rr, + --res_rsv_deel rrd, + --res_deel rd, + --res_discipline td, + res_disc_params dp, + prs_bedrijf b, + prs_bedrijfadres ba, + fac_srtnotificatie cust01 + WHERE t.fac_srtnotificatie_key = 31 -- RESUPD + AND t.fac_srtnotificatie_key = resupd.fac_srtnotificatie_key + AND t.fac_tracking_datum > DECODE (SIGN ((lastchange.datum + 1) - SYSDATE), -1, TRUNC (SYSDATE, 'hh24'), lastchange.datum) + AND INSTR (UPPER (t.fac_tracking_oms), 'RESERVEERBAAR OBJECT') > 0 + AND INSTR (UPPER (t.fac_tracking_oms), 'VICO') > 0 + AND t.fac_tracking_refkey = rrr.res_rsv_ruimte_key + AND rrr.res_rsv_ruimte_verwijder IS NULL + AND rrr.res_rsv_ruimte_van > v_curdatetime -- Toekomstig + --AND rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key -- Alleen ruimtereserveringen + --AND ro.res_ruimte_key = rr.res_ruimte_key + --AND rrr.res_rsv_ruimte_key = rrd.res_rsv_ruimte_key + --AND COALESCE (rrd.res_rsv_deel_verwijder, rrd.res_rsv_deel_mutatie, rrd.res_rsv_deel_aanmaak) > DECODE (SIGN ((lastchange.datum + 1) - SYSDATE), -1, TRUNC (SYSDATE, 'hh24'), lastchange.datum) + --AND rrd.res_deel_key = rd.res_deel_key + --AND rd.res_discipline_key = td.ins_discipline_key + --AND td.ins_discipline_key = dp.res_ins_discipline_key + --AND rd.res_discipline_key = dp.res_ins_discipline_key + AND dp.res_ins_discipline_key = 3589 -- ViCo + AND dp.prs_bedrijf_key = b.prs_bedrijf_key + AND b.prs_bedrijf_key = ba.prs_bedrijf_key + AND ba.prs_bedrijfadres_type = 'N' + AND cust01.fac_srtnotificatie_code = 'CUST01' + ORDER BY 2, 3, 4; +BEGIN + FOR rec IN c_resupdvico + LOOP + BEGIN + -- CUST01-notificatie naar BO ViCo (incl. RESINF-tracking)! + v_errormsg := 'Fout toevoegen CUST01-email'; + fac.putnotificationsrtprio (NULL, -- pfrom + NULL, -- pto + rec.noti, -- pcode + rec.res_reservering_key, -- pref + rec.subj, -- poptmessage + NULL, -- poptstatus + rec.mailto, -- poptemail + NULL, -- poptmobile + rec.res_rsv_ruimte_key, -- pxref + NULL, -- pprio + NULL, -- psender + NULL -- pattach + ); + 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.writelog (p_applname, 'E', rec.aanduiding || v_errormsg, 'ResUpdViCo-loop'); + COMMIT; + END; + END LOOP; + + v_errormsg := 'Fout bijwerken lastchange'; -- Bah, heul smerig (bepaald via verwijderde activiteit)! + UPDATE res_activiteit + SET res_activiteit_verwijder = v_curdatetime + WHERE res_activiteit_key = 0; + 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.writelog (p_applname, 'E', 'Proces afgebroken!', v_errormsg); +END fmhn_select_speednoti; +/ + +CREATE OR REPLACE PROCEDURE fmhn_import_org (p_import_key IN NUMBER) +AS + c_delim VARCHAR2 (1) := ';'; -- Field seperator + v_newline fac_imp_file.fac_imp_file_line%TYPE; -- Import line + v_errormsg VARCHAR2 (1000) := ''; + oracle_err_num NUMBER; + oracle_err_mes VARCHAR2 (200); + v_aanduiding VARCHAR2 (1000) := ''; + header_is_valid NUMBER := 0; + v_count_tot NUMBER (10) := 0; + v_count_imp NUMBER (10) := 0; + -- De importvelden + v_mincode VARCHAR2 (255); + v_afdid VARCHAR2 (255); + v_afdcode VARCHAR2 (255); + v_afdoms VARCHAR2 (255); + v_afdidparent VARCHAR2 (255); + v_kpnr VARCHAR2 (255); + v_kpoms VARCHAR2 (255); + v_begindat VARCHAR2 (255); + v_einddat VARCHAR2 (255); + v_operator VARCHAR2 (255); + + 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 + --DELETE FROM fmhn_imp_org; + --COMMIT; + + FOR rec1 IN c1 + LOOP + BEGIN + v_newline := rec1.fac_imp_file_line; + v_errormsg := 'Fout opvragen importregel'; + v_aanduiding := ''; + -- Lees alle veldwaarden + -- mincode;afdid;afdcode;afdoms;afdidparent;kpnr;kpoms;begindat;einddat + fac.imp_getfield (v_newline, c_delim, v_mincode); + fac.imp_getfield (v_newline, c_delim, v_afdid); + fac.imp_getfield (v_newline, c_delim, v_afdcode); + fac.imp_getfield (v_newline, c_delim, v_afdoms); + fac.imp_getfield (v_newline, c_delim, v_afdidparent); + fac.imp_getfield (v_newline, c_delim, v_kpnr); + fac.imp_getfield (v_newline, c_delim, v_kpoms); + fac.imp_getfield (v_newline, c_delim, v_begindat); + fac.imp_getfield (v_newline, c_delim, v_einddat); + fac.imp_getfield (v_newline, c_delim, v_operator); + + v_aanduiding := '[' || v_mincode || '|' || v_afdid || '|' || v_afdcode || v_afdoms || '] '; + + -- Ik controleer of ik een geldige header heb, dat is: in de juiste + -- kolommen de juiste kolomkop. Ik controleer daarbij ALLE kolommen! + -- Ik negeer alles totdat ik een geldige header ben gepasseerd. + IF (header_is_valid = 0) + THEN + IF v_mincode = 'mincode' + AND v_afdid = 'afdid' + AND v_afdcode = 'afdcode' + AND v_afdoms = 'afdoms' + AND v_afdidparent = 'afdidparent' + AND v_kpnr = 'kpnr' + AND v_kpoms = 'kpoms' + AND v_begindat = 'begindat' + AND v_einddat = 'einddat' + --AND v_operator = 'operator' + THEN + header_is_valid := 1; + END IF; + ELSIF (rec1.regellengte > 0) -- Lege regels overslaan + THEN + BEGIN + v_count_tot := v_count_tot + 1; + + -- Direct wegschrijven; controleer alle veldwaarden maar niet. + v_errormsg := 'Fout wegschrijven importregel'; + + INSERT INTO fmhn_imp_org (fac_import_key, + volgnr, + mincode, + afdid, + afdcode, + afdoms, + afdidparent, + kpnr, + kpoms, + begindat, + einddat, + operator) + VALUES (p_import_key, + v_count_tot, + SUBSTR (TRIM (v_mincode), 1, 10), -- C6 + SUBSTR (TRIM (v_afdid), 1, 101), -- C100 + SUBSTR (TRIM (v_afdcode), 1, 15), -- C15 + SUBSTR (TRIM (v_afdoms), 1, 70), -- C60 vs. C70 in IDM + SUBSTR (TRIM (v_afdidparent), 1, 101), -- C100 + SUBSTR (TRIM (v_kpnr), 1, 30), -- C20 + SUBSTR (TRIM (v_kpoms), 1, 60), -- C60 + --fac.safe_to_date (TRIM (v_begindat), 'yyyy-mm-dd'), + fac.safe_to_date (SUBSTR (TRIM (v_begindat), 1, 10), 'yyyy-mm-dd'), + --fac.safe_to_date (TRIM (v_einddat), 'yyyy-mm-dd'), + fac.safe_to_date (SUBSTR (TRIM (v_einddat), 1, 10), 'yyyy-mm-dd'), + SUBSTR (TRIM (v_operator), 1, 6)); + + 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, ''); + END; + + IF MOD (v_count_tot, 500) = 0 THEN COMMIT; END IF; + END IF; + END; + END LOOP; + + IF (header_is_valid = 0) + THEN + fac.imp_writelog (p_import_key, 'E', 'Ongeldig importbestand', 'Geen header of header niet volgens afspraak!'); + ELSE + fac.imp_writelog (p_import_key, 'S', 'Afdelingen/#ingelezen importregels: ' || TO_CHAR (v_count_tot), ''); + fac.imp_writelog (p_import_key, 'S', 'Afdelingen/#ongeldige niet ingelezen importregels: ' || TO_CHAR (v_count_tot - v_count_imp), ''); + 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, 'Inleesproces Afdelingen afgebroken!'); + + -- Maak importtabel leeg om import van foutieve bestanden te voorkomen! + --DELETE FROM fmhn_imp_org; +END; +/ +/* +SELECT x1.prs_afdeling_naam oud, '#' || x1.prs_afdeling_naam nieuw + FROM fmhn_imp_org x1 + WHERE x1.prs_bedrijf_naam IS NOT NULL AND x1.prs_afdeling_naam IS NOT NULL -- Geen lege/ongeldige regels + AND COALESCE (x1.einddatum, SYSDATE + 1) > TRUNC (SYSDATE) + AND UPPER (x1.prs_afdeling_naam_parent) = UPPER (x1.prs_afdeling_naam); + +UPDATE fmhn_imp_org x1 + SET x1.prs_afdeling_naam = '#' || x1.prs_afdeling_naam + WHERE x1.prs_bedrijf_naam IS NOT NULL AND x1.prs_afdeling_naam IS NOT NULL -- Geen lege/ongeldige regels + AND COALESCE (x1.einddatum, SYSDATE + 1) > TRUNC (SYSDATE) + AND UPPER (x1.prs_afdeling_naam_parent) = UPPER (x1.prs_afdeling_naam); + +SELECT x1.prs_bedrijf_naam, x1.prs_afdeling_naam_parent, x1.prs_afdeling_naam + FROM fmhn_imp_org x1 + WHERE x1.prs_bedrijf_naam IS NOT NULL AND x1.prs_afdeling_naam IS NOT NULL -- Geen lege/ongeldige regels + AND COALESCE (x1.einddatum, SYSDATE + 1) > TRUNC (SYSDATE) + AND EXISTS -- Dezelfde afdeling ook onder andere parent! + (SELECT 1 + FROM fmhn_imp_org x2 + WHERE x2.prs_bedrijf_naam IS NOT NULL AND x2.prs_afdeling_naam IS NOT NULL -- Geen lege/ongeldige regels + AND COALESCE (x2.einddatum, SYSDATE + 1) > TRUNC (SYSDATE) + AND x2.prs_afdeling_naam_parent != x1.prs_afdeling_naam_parent + AND x2.prs_afdeling_naam = x1.prs_afdeling_naam) + AND EXISTS -- Afdelingen onder dezelfde afdelingen onder andere parent! + (SELECT 1 + FROM fmhn_imp_org x3 + WHERE x3.prs_bedrijf_naam IS NOT NULL AND x3.prs_afdeling_naam IS NOT NULL -- Geen lege/ongeldige regels + AND COALESCE (x3.einddatum, SYSDATE + 1) > TRUNC (SYSDATE) + AND x3.prs_afdeling_naam_parent != x1.prs_afdeling_naam_parent + AND x3.prs_afdeling_naam_parent = x1.prs_afdeling_naam); +*/ +CREATE OR REPLACE PROCEDURE fmhn_update_org (p_import_key IN NUMBER) +AS + v_errormsg VARCHAR2 (1000) := ''; + oracle_err_num NUMBER; + oracle_err_mes VARCHAR2 (200); + v_aanduiding VARCHAR2 (1000) := ''; + v_count_tot NUMBER (10) := 0; + v_count_upd NUMBER (10) := 0; + v_count NUMBER; + l_impcountafd NUMBER; + v_mincode VARCHAR2 (6); + v_bedrijf_key prs_bedrijf.prs_bedrijf_key%TYPE; + v_minomschr_key fac_usrdata.fac_usrdata_key%TYPE; + v_minomschr fac_usrdata.fac_usrdata_omschr%TYPE; + v_afdidroot prs_kenmerklink.prs_kenmerklink_waarde%TYPE; + v_minafko VARCHAR2 (10); + l_oldcountafd NUMBER; + --l_oldcountkpn NUMBER; + v_rootvolgnr NUMBER; + l_cur_lev NUMBER; + lafdelingkey prs_afdeling.prs_afdeling_key%TYPE; + l_cur_parentkey prs_afdeling.prs_afdeling_parentkey%TYPE; + l_cur_afdcode prs_kenmerklink.prs_kenmerklink_waarde%TYPE; + l_new_lev NUMBER; + l_new_parentkey prs_afdeling.prs_afdeling_parentkey%TYPE; + l_new_grandparentkey prs_afdeling.prs_afdeling_parentkey%TYPE; + l_afdpadparent prs_kenmerklink.prs_kenmerklink_waarde%TYPE; + lkostenplaatskey prs_kostenplaats.prs_kostenplaats_key%TYPE; + v_kpnr prs_kostenplaats.prs_kostenplaats_nr%TYPE; + v_kpoms prs_kostenplaats.prs_kostenplaats_omschrijving%TYPE; + l_vervcountafd NUMBER; + --l_vervcountkpn NUMBER; + l_newcountafd NUMBER; + --l_newcountkpn NUMBER; + + -- Uitgangspunt is dat afbeelding in Facilitor stuctureel gelijk blijft aan + -- structuur zoals geimporteerd uit IDM. + -- Wel geldt dat er in Facilitor slechts 5 niveaus zijn (excl. bedrijf) + -- en in IDM meer. De "lagere" regionen worden daarom op niveau 5 gehangen + -- (onder niveau 4)! + CURSOR cafdboomdelta (p_volgnr NUMBER) + IS + -- SELECT volgnr, mincode, afdid, afdcode, afdoms, afdidparent, kpnr, kpoms, begindat, einddat, operator + -- FROM fmhn_imp_org + -- WHERE fac_import_key = p_import_key + --ORDER BY volgnr; + SELECT LEVEL imp_lev, + volgnr, mincode, afdid, afdcode, afdoms, afdidparent, kpnr, kpoms, begindat, einddat, operator + FROM (SELECT * FROM fmhn_imp_org WHERE fac_import_key = p_import_key) + CONNECT BY PRIOR afdid = afdidparent + START WITH volgnr = p_volgnr + ORDER BY LEVEL; +BEGIN + -- Hoeveel afdelingen ontvangen? + SELECT COUNT ( * ) + INTO l_impcountafd + FROM fmhn_imp_org + WHERE fac_import_key = p_import_key; + + -- Randvoorwaarde dat alle personen in importbestand dezelfde mincode! + v_errormsg := 'Fout (uniek) bepalen mincode'; + SELECT DISTINCT mincode + INTO v_mincode + FROM fmhn_imp_org + WHERE fac_import_key = p_import_key; + + -- Randvoorwaarde dat één intern bedrijf bestaat met bepaalde mincode! + v_errormsg := 'Fout (uniek) bepalen bedrijf'; + SELECT b.prs_bedrijf_key, ud.fac_usrdata_key, ud.fac_usrdata_omschr, afdid.prs_kenmerklink_waarde + INTO v_bedrijf_key, v_minomschr_key, v_minomschr, v_afdidroot + FROM prs_v_aanwezigbedrijf b, + (SELECT * FROM prs_v_aanwezigkenmerklink WHERE prs_kenmerk_key = 1020) mincode, -- Ministeriecode (bij Bedrijf) + fac_v_aanwezigusrdata ud, + (SELECT * FROM prs_v_aanwezigkenmerklink WHERE prs_kenmerk_key = 1021) afdid -- Organisatieonderdeelcode (bij Bedrijf) + WHERE b.prs_bedrijf_intern = 1 + AND b.prs_bedrijf_key = mincode.prs_link_key + AND fac.safe_to_number (mincode.prs_kenmerklink_waarde) = ud.fac_usrdata_key + AND ud.fac_usrdata_upper = UPPER (v_mincode) + AND b.prs_bedrijf_key = afdid.prs_link_key(+); + v_minafko := TRIM (SUBSTR (v_minomschr, INSTR (v_minomschr, '-') + 1)); + + -- Hoeveel afdelingen actief voor ministerie in Facilitor? + SELECT COUNT ( * ) + INTO l_oldcountafd + FROM prs_v_afdeling_boom ab, prs_afdeling afd + WHERE ab.prs_bedrijf_key = v_bedrijf_key + AND ab.prs_afdeling_key = afd.prs_afdeling_key + AND afd.prs_afdeling_verwijder IS NULL + AND UPPER (COALESCE (afd.prs_afdeling_omschrijving, '-')) NOT LIKE 'VERVALLEN:%'; + + -- Hoeveel kostenplaatsen actief voor ministerie in Facilitor? + --SELECT COUNT ( * ) + -- INTO l_oldcountkpn + -- FROM prs_v_aanwezigkostenplaats + -- WHERE prs_kostenplaats_module = 'PRS' + -- AND UPPER (prs_kostenplaats_nr) LIKE UPPER (v_minafko) || '%' + -- AND UPPER (COALESCE (prs_kostenplaats_omschrijving, '-')) NOT LIKE 'VERVALLEN:%'; +/* + -- Controles op problemen in ontvangen bericht (igv. full-load). + SELECT afdid FROM fmhn_imp_org + MINUS + SELECT afdid + FROM fmhn_imp_org + CONNECT BY PRIOR afdid = afdidparent + START WITH afdidparent IS NULL; + + -- Bijwerken dat het 'Organisatielevel (in IDM)'-kenmerk correct gevuld! + -- Check op verplichte velden bij INSERT: afdcode, afdoms! +*/ + -- Voorkennis: CSV-import zou full-load moeten zijn met één afdeling zonder + -- parent. Bij >1 afdelingen zonder parent, pak laagste volgnr! + -- IDM-import zou een XML-bericht per afdeling moeten aanbieden + -- met volgnr=1 (in de juiste volgorde). Bij >1 afdelingen, dan + -- op volgnr verwerken! + + -- Bepaal volgnr van root in ontvangen afdelingsboom. + v_errormsg := 'Fout (uniek) bepalen root'; + SELECT COUNT ( * ), MIN (volgnr) + INTO v_count, v_rootvolgnr + FROM fmhn_imp_org + WHERE fac_import_key = p_import_key + AND afdidparent IS NULL; + + IF l_impcountafd > 1 AND (v_count > 1 OR v_rootvolgnr IS NULL) + THEN + fac.imp_writelog (p_import_key, 'E', v_errormsg, 'Full-load ongeldig'); + RETURN; + END IF; + + FOR rc IN cafdboomdelta (COALESCE (v_rootvolgnr, 1)) + LOOP + BEGIN + v_aanduiding := '[' || TO_CHAR (rc.volgnr) || '|' || rc.mincode || '|' || rc.afdid || '] '; + v_count_tot := v_count_tot + 1; + + -- Is de ontvangen afdeling het hoogste niveau=interne bedrijf? Dit + -- is het geval als geldt: Geen parent ontvangen en INSERT! + -- Randvoorwaarde is dat in IDM op hoogste niveau maar één afdeling + -- bestaat! Zo niet, dan wint één tak van de boom! + IF rc.afdidparent IS NULL AND COALESCE (UPPER (rc.operator), 'INSERT') = 'INSERT' + THEN + --v_errormsg := 'Fout bijwerken bedrijfsnaam'; + --UPDATE prs_bedrijf + -- SET prs_bedrijf_naam = SUBSTR (rc.afdoms, 1, 60) + -- WHERE prs_bedrijf_key = v_bedrijf_key; + + IF v_afdidroot IS NULL -- Organisatieonderdeelcode nog niet gevuld (of gewijzigd)? + THEN + v_errormsg := 'Fout bijwerken bedrijf'; + prs.upsertkenmerk (1021, v_bedrijf_key, rc.afdid); -- Organisatieonderdeelcode + v_afdidroot := rc.afdid; + ELSIF v_afdidroot <> rc.afdid + THEN + v_errormsg := 'Fout bijwerken bedrijf'; + prs.upsertkenmerk (1021, v_bedrijf_key, rc.afdid); -- Organisatieonderdeelcode + v_afdidroot := rc.afdid; + + fac.imp_writelog (p_import_key, 'I', v_aanduiding, 'Organisatieonderdeelcode van ministerie gewijzigd'); + END IF; + END IF; + + --fac.imp_writelog (p_import_key, 'S', TO_CHAR (v_count_tot), v_afdidroot || '/' || rc.afdid ); -- Logging! + IF v_afdidroot = rc.afdid -- Hoogste niveau=intern bedrijf! + THEN + v_errormsg := 'Doe verder niets (geen level, pad, etc.)'; + ELSE + -- Vanaf hier hebben ontvangen afdelingen bij INSERT een parent. + -- Bestaat afdeling al en wat is dan huidige parent? + v_errormsg := 'Fout bepalen afdeling'; + BEGIN + SELECT fac.safe_to_number (orglev.prs_kenmerklink_waarde), + a.prs_afdeling_key, + a.prs_afdeling_parentkey, + afdcode.prs_kenmerklink_waarde + INTO l_cur_lev, + lafdelingkey, + l_cur_parentkey, + l_cur_afdcode + FROM prs_afdeling a, -- LET OP: Niet prs_v_aanwezigafdeling (want soms "lager" dan 5)! + --prs_v_afdeling_boom ab, + (SELECT * FROM prs_v_aanwezigkenmerklink WHERE prs_kenmerk_key = 1003) orglev, -- Organisatielevel (in IDM) + (SELECT * FROM prs_v_aanwezigkenmerklink WHERE prs_kenmerk_key = 1001) afdcode -- Afdelingscode (was Identificatie afdeling) + WHERE a.prs_afdeling_verwijder IS NULL + AND UPPER (a.prs_afdeling_externid) = UPPER (rc.mincode || rc.afdid) + --AND a.prs_afdeling_key = ab.prs_afdeling_key(+) -- LET OP: Kan tijdelijk uit beeld raken ("lager" dan 5)! + AND a.prs_afdeling_key = orglev.prs_link_key(+) + AND a.prs_afdeling_key = afdcode.prs_link_key(+); + EXCEPTION + WHEN NO_DATA_FOUND + THEN + l_cur_lev := -1; + lafdelingkey := -1; + l_cur_parentkey := -1; + l_cur_afdcode := rc.afdcode; -- Verplicht bij INSERT! + END; + + -- Bepaal parent en parent van (soms zelf verschoven) parent! + -- Parent verplicht vanaf level=2 bij CSV-import, INSERT en indien + -- ontvangen! + v_errormsg := 'Fout bepalen parent'; + IF rc.afdidparent IS NULL -- Geen parent ontvangen! + THEN + -- Geen huidige parent? + IF l_cur_parentkey IS NULL + THEN -- UPDATE/DELETE van een Afdeling-1! + l_new_lev := 2; + l_new_parentkey := TO_NUMBER (NULL); + l_new_grandparentkey := TO_NUMBER (NULL); + l_afdpadparent := v_minafko; -- Root meenemen in pad! + ELSE -- UPDATE/DELETE van een Afdeling-2 of lager! + -- Bepaal gegevens van bestaande parent! + SELECT fac.safe_to_number (orglev.prs_kenmerklink_waarde) + 1, + a.prs_afdeling_key, + a.prs_afdeling_parentkey, + afdpad.prs_kenmerklink_waarde + INTO l_new_lev, -- = l_cur_lev + l_new_parentkey, -- = l_cur_parentkey + l_new_grandparentkey, + l_afdpadparent + FROM prs_afdeling a, -- LET OP: Of prs_v_aanwezigafdeling (parent nooit "lager" dan 5)! + (SELECT * FROM prs_v_aanwezigkenmerklink WHERE prs_kenmerk_key = 1003) orglev, -- Organisatielevel (in IDM) + (SELECT * FROM prs_v_aanwezigkenmerklink WHERE prs_kenmerk_key = 1004) afdpad -- Afdelingspad + WHERE a.prs_afdeling_verwijder IS NULL + AND a.prs_afdeling_key = l_cur_parentkey + AND a.prs_afdeling_key = orglev.prs_link_key(+) + AND a.prs_afdeling_key = afdpad.prs_link_key(+); + END IF; + ELSE -- Parent ontvangen! + -- Parent is root? + IF rc.afdidparent = v_afdidroot + THEN -- UPDATE/DELETE van een Afdeling-1! + l_new_lev := 2; + l_new_parentkey := TO_NUMBER (NULL); + l_new_grandparentkey := TO_NUMBER (NULL); + l_afdpadparent := v_minafko; -- Root meenemen in pad! + ELSE -- UPDATE/DELETE van een Afdeling-2 of lager! + -- Bepaal gegevens van ontvangen parent! + SELECT fac.safe_to_number (orglev.prs_kenmerklink_waarde) + 1, + a.prs_afdeling_key, + a.prs_afdeling_parentkey, + afdpad.prs_kenmerklink_waarde + INTO l_new_lev, + l_new_parentkey, + l_new_grandparentkey, + l_afdpadparent + FROM prs_afdeling a, -- LET OP: Of prs_v_aanwezigafdeling (parent nooit "lager" dan 5)! + --prs_v_afdeling_boom ab, + (SELECT * FROM prs_v_aanwezigkenmerklink WHERE prs_kenmerk_key = 1003) orglev, -- Organisatielevel (in IDM) + (SELECT * FROM prs_v_aanwezigkenmerklink WHERE prs_kenmerk_key = 1004) afdpad -- Afdelingspad + WHERE a.prs_afdeling_verwijder IS NULL + AND UPPER (a.prs_afdeling_externid) = UPPER (rc.mincode || rc.afdidparent) + --AND a.prs_afdeling_key = ab.prs_afdeling_key -- LET OP: Parent kan nooit uit beeld raken ("lager" dan 5)! + AND a.prs_afdeling_key = orglev.prs_link_key(+) + AND a.prs_afdeling_key = afdpad.prs_link_key(+); + END IF; + END IF; + + -- Bij mapping van IDM-afdelingen slaan we geen level over en geldt: + -- level=1 => Bedrijf + -- level=2 => Afdeling-1 + -- level=3 => Afdeling-2 + -- level=4 => Afdeling-3 + -- level=5 => Afdeling-4 + -- level=6 => Afdeling-5 + -- : + -- level=n => Afdeling-5 + -- Waarde in rc.afdid voor een (of enkele) ministeries >15 doordat + -- een prefix is toegevoegd en daarom prs_afdeling_naam gevuld met + -- laatste 15 posities! + IF lafdelingkey = -1 -- Nieuwe afdeling -> toevoegen! + THEN + v_errormsg := 'Ongeldige operator voor niet bestaande afdeling'; + IF COALESCE (UPPER (rc.operator), 'INSERT') = 'INSERT' + THEN + v_errormsg := 'Fout toevoegen afdeling'; + IF l_new_lev = 2 -- Ingelezen afdeling betreft Afdeling-1 + THEN + INSERT INTO prs_afdeling (prs_bedrijf_key, + prs_afdeling_parentkey, + prs_afdeling_naam, + prs_afdeling_omschrijving, + --prs_kostenplaats_key, + prs_afdeling_externid) + VALUES (v_bedrijf_key, + NULL, -- l_new_parentkey = NULL + SUBSTR (rc.afdid, GREATEST (-LENGTH (rc.afdid), -15)), + rc.afdoms, + --lkostenplaatskey, + UPPER (rc.mincode || rc.afdid)) + RETURNING prs_afdeling_key + INTO lafdelingkey; + ELSIF l_new_lev <= 6 -- Afdeling-2 t/m Afdeling-5 + THEN + INSERT INTO prs_afdeling (prs_bedrijf_key, + prs_afdeling_parentkey, + prs_afdeling_naam, + prs_afdeling_omschrijving, + --prs_kostenplaats_key, + prs_afdeling_externid) + VALUES (NULL, + l_new_parentkey, + SUBSTR (rc.afdid, GREATEST (-LENGTH (rc.afdid), -15)), + rc.afdoms, + --lkostenplaatskey, + UPPER (rc.mincode || rc.afdid)) + RETURNING prs_afdeling_key + INTO lafdelingkey; + ELSE -- Omhoog geschoven afdeling op niveau Afdeling-5 + -- Doordat cursor van hoog naar laag door organisatie + -- loopt, komen afdelingen vanaf level>=7 keurig onder + -- gewenste Afdeling-4 te hangen. + INSERT INTO prs_afdeling (prs_bedrijf_key, + prs_afdeling_parentkey, + prs_afdeling_naam, + prs_afdeling_omschrijving, + --prs_kostenplaats_key, + prs_afdeling_externid) + VALUES (NULL, + l_new_grandparentkey, + SUBSTR (rc.afdid, GREATEST (-LENGTH (rc.afdid), -15)), + rc.afdoms, + --lkostenplaatskey, + UPPER (rc.mincode || rc.afdid)) + RETURNING prs_afdeling_key + INTO lafdelingkey; + END IF; + + fac.imp_writelog (p_import_key, 'I', v_aanduiding, 'Afdeling toegevoegd'); + ELSE + fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, ''); + END IF; + ELSE -- Bestaande afdeling -> bijwerken (misschien)! + v_errormsg := 'Ongeldige operator voor bestaande afdeling'; + IF COALESCE (UPPER (rc.operator), 'UPDATE') = 'UPDATE' + THEN + -- Zonodig bijwerken omschrijving (kon eerder vervallen + -- zijn) en/of omhangen naar de juiste plek in de boom. + v_errormsg := 'Fout bijwerken afdeling'; + IF l_new_lev = 2 -- Ingelezen afdeling betreft Afdeling-1 + THEN + UPDATE prs_afdeling + SET prs_bedrijf_key = v_bedrijf_key, + prs_afdeling_parentkey = NULL, + prs_afdeling_naam = SUBSTR (rc.afdid, GREATEST (-LENGTH (rc.afdid), -15)), + prs_afdeling_omschrijving = COALESCE (rc.afdoms, prs_afdeling_omschrijving) + --prs_kostenplaats_key = COALESCE (lkostenplaatskey, prs_kostenplaats_key) + WHERE prs_afdeling_key = lafdelingkey; + ELSIF l_new_lev <= 6 -- Afdeling-2 t/m Afdeling-5 + THEN + UPDATE prs_afdeling + SET prs_bedrijf_key = NULL, + prs_afdeling_parentkey = l_new_parentkey, + prs_afdeling_naam = SUBSTR (rc.afdid, GREATEST (-LENGTH (rc.afdid), -15)), + prs_afdeling_omschrijving = COALESCE (rc.afdoms, prs_afdeling_omschrijving) + --prs_kostenplaats_key = COALESCE (lkostenplaatskey, prs_kostenplaats_key) + WHERE prs_afdeling_key = lafdelingkey; + ELSE -- Omhoog geschoven afdeling op niveau Afdeling-5 + -- Doordat cursor van hoog naar laag door organisatie + -- loopt, komen afdelingen vanaf level>=7 keurig onder + -- gewenste Afdeling-4 te hangen. + UPDATE prs_afdeling + SET prs_bedrijf_key = NULL, + prs_afdeling_parentkey = l_new_grandparentkey, + prs_afdeling_naam = SUBSTR (rc.afdid, GREATEST (-LENGTH (rc.afdid), -15)), + prs_afdeling_omschrijving = COALESCE (rc.afdoms, prs_afdeling_omschrijving) + --prs_kostenplaats_key = COALESCE (lkostenplaatskey, prs_kostenplaats_key) + WHERE prs_afdeling_key = lafdelingkey; + END IF; + + IF l_new_lev <> l_cur_lev + THEN + fac.imp_writelog (p_import_key, 'I', v_aanduiding, 'Afdeling omgehangen naar level=' || TO_CHAR (l_new_lev)); + END IF; + ELSIF UPPER (rc.operator) = 'DELETE' + THEN + -- Zet afdeling en eventueel kostenplaats op VERVALLEN; de rest handmatig verder maar regelen! + v_errormsg := 'Fout inactiveren afdeling'; + UPDATE prs_afdeling + SET prs_afdeling_omschrijving = SUBSTR ('VERVALLEN:' || COALESCE (prs_afdeling_omschrijving, '-'), 1, 60) + WHERE prs_afdeling_key = lafdelingkey + AND UPPER (COALESCE (prs_afdeling_omschrijving, '-')) NOT LIKE 'VERVALLEN:%'; + + v_errormsg := 'Fout inactiveren kostenplaats'; + UPDATE prs_kostenplaats + SET prs_kostenplaats_omschrijving = SUBSTR ('VERVALLEN:' || COALESCE (prs_kostenplaats_omschrijving, '-'), 1, 60) + WHERE prs_kostenplaats_key = lkostenplaatskey + AND UPPER (COALESCE (prs_kostenplaats_omschrijving, '-')) NOT LIKE 'VERVALLEN:%' + AND NOT EXISTS + (SELECT 1 + FROM prs_afdeling + WHERE prs_kostenplaats_key = lkostenplaatskey + AND prs_afdeling_key <> lafdelingkey); + ELSE + fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, ''); + END IF; + END IF; + + -- Kostenplaats-afhandeling bij INSERT of UPDATE! + IF COALESCE (UPPER (rc.operator), 'INSERT') <> 'DELETE' + THEN + -- Bepaal huidige kostenplaats van - hier bekende - afdeling! + v_errormsg := 'Fout bepalen kostenplaats (afdeling)'; + SELECT prs_kostenplaats_key + INTO lkostenplaatskey + FROM prs_afdeling + WHERE prs_afdeling_key = lafdelingkey; + + -- Als eerder een kostenplaats standaard was aangemaakt en nu + -- wordt een kostenplaats ontvangen, dan standaard kostenplaats + -- niet bijwerken, maar nieuwe kostenplaats aanmaken/koppelen! + -- Het schonen van niet gebruikte standaard kostenplaatsen komt + -- later nog wel een keertje. + IF lkostenplaatskey IS NULL OR rc.kpnr IS NOT NULL -- Afdeling zonder kostenplaats of kpnnr ontvangen! + THEN + IF rc.kpnr IS NULL -- Bij INSERT beide niet ontvangen! Bij UPDATE anders omschrijving mogelijk op '-'! + THEN + v_kpnr := v_minafko || rc.afdid; + --v_kpoms := COALESCE (rc.afdcode, '-'); + v_kpoms := l_afdpadparent || '#' || l_cur_afdcode; + ELSE -- Bij INSERT beide ontvangen! Bij UPDATE anders omschrijving mogelijk op '-'! + v_kpnr := v_minafko || rc.kpnr; + --v_kpoms := COALESCE (rc.kpoms, '-'); + v_kpoms := COALESCE (rc.kpoms, l_afdpadparent || '#' || l_cur_afdcode); + END IF; + + v_errormsg := 'Fout bepalen kostenplaats (bestaand)'; + BEGIN + SELECT prs_kostenplaats_key + INTO lkostenplaatskey + FROM prs_v_aanwezigkostenplaats + WHERE prs_kostenplaats_upper = UPPER (v_kpnr); + EXCEPTION + WHEN NO_DATA_FOUND + THEN + lkostenplaatskey := -1; + END; + + IF lkostenplaatskey = -1 -- Kostenplaats bestaat niet! + THEN + v_errormsg := 'Fout toevoegen kostenplaats'; + INSERT INTO prs_kostenplaats (prs_kostenplaats_nr, + prs_kostenplaats_omschrijving, + prs_kostenplaats_module, + prs_kostenplaats_begin, + prs_kostenplaats_eind) + VALUES (v_kpnr, + SUBSTR (v_kpoms, 1, 60), + 'PRS', + SYSDATE, + NULL) + RETURNING prs_kostenplaats_key + INTO lkostenplaatskey; + END IF; + + v_errormsg := 'Fout bijwerken kostenplaats (afdeling)'; + UPDATE prs_afdeling + SET prs_kostenplaats_key = lkostenplaatskey + WHERE prs_afdeling_key = lafdelingkey; + ELSE -- Tja, afdeling met kostenplaats en geen kpnr ontvangen, dan mogelijk bijwerken omschrijving! + -- TODO (maar laat FMH daar eerst maar eens achter komen): + -- Eerst nog checken op dubbel gebruik van kostenplaatsen? + v_errormsg := 'Fout bijwerken kostenplaats (bestaand)'; + UPDATE prs_kostenplaats + SET prs_kostenplaats_omschrijving = COALESCE (rc.kpoms, prs_kostenplaats_omschrijving) + WHERE prs_kostenplaats_key = lkostenplaatskey; + END IF; + END IF; + + v_errormsg := 'Fout bijwerken mincode'; + prs.upsertkenmerk (1023, lafdelingkey, TO_CHAR (v_minomschr_key)); -- Ministeriecode + IF rc.afdcode IS NOT NULL + THEN + v_errormsg := 'Fout bijwerken afdcode'; + prs.upsertkenmerk (1001, lafdelingkey, rc.afdcode); -- Afdelingscode (was Identificatie afdeling) + END IF; + IF rc.afdidparent IS NOT NULL + THEN + v_errormsg := 'Fout bijwerken afdidparent'; + prs.upsertkenmerk (1002, lafdelingkey, rc.afdidparent); -- Identificatie parentafd. + END IF; + IF l_new_lev <> l_cur_lev + THEN + v_errormsg := 'Fout bijwerken orglevel'; + prs.upsertkenmerk (1003, lafdelingkey, TO_CHAR (l_new_lev)); -- Organisatielevel (in IDM) + END IF; + -- TODO (maar laat FMH daar eerst maar eens achter komen): + -- Als parent wordt verschoven (omhoog of omlaag), dan blijven + -- code+parent ongewijzigd, maar zal level+pad wijzigen! + -- Zonder updates vanuit IDM voor de onderliggende afdelingen, + -- gebeurt niets in Facilitor en kloppen level+pad niet meer! + IF rc.afdcode IS NOT NULL OR rc.afdidparent IS NOT NULL OR l_new_lev <> l_cur_lev + THEN + v_errormsg := 'Fout bijwerken afdpad'; + prs.upsertkenmerk (1004, lafdelingkey, l_afdpadparent || '#' || l_cur_afdcode); -- Afdelingspad + END IF; + IF rc.begindat IS NOT NULL + THEN + v_errormsg := 'Fout bijwerken begindat'; + prs.upsertkenmerk (1005, lafdelingkey, TO_CHAR (rc.begindat, 'dd-mm-yyyy')); -- Begindatum + END IF; + IF rc.einddat IS NOT NULL + THEN + v_errormsg := 'Fout bijwerken einddat'; + prs.upsertkenmerk (1006, lafdelingkey, TO_CHAR (rc.einddat, 'dd-mm-yyyy')); -- Einddatum + END IF; + + v_count_upd := v_count_upd + 1; + IF MOD (v_count_upd, 500) = 0 THEN COMMIT; 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, 'E', v_aanduiding || v_errormsg, 'Niet succesvol verwerkt'); + END; + END LOOP; + + fac.imp_writelog (p_import_key, 'S', '#Afdelingen/Ontvangen: ' || TO_CHAR (v_count_tot) || ' -> Succesvol: ' || TO_CHAR (v_count_upd), ''); +/* + -- Zet kostenplaatsen op VERVALLEN; de rest handmatig verder maar regelen! + v_errormsg := 'Fout inactiveren kostenplaatsen'; + SELECT COUNT ( * ) + INTO l_vervcountkpn + FROM prs_v_aanwezigkostenplaats kp + WHERE kp.prs_kostenplaats_module = 'PRS' + AND UPPER (COALESCE (kp.prs_kostenplaats_omschrijving, '-')) NOT LIKE 'VERVALLEN:%' + AND NOT EXISTS + (SELECT 1 + FROM fmhn_imp_org + WHERE UPPER (prs_kostenplaats_nr) = kp.prs_kostenplaats_upper); + + UPDATE prs_kostenplaats kp + SET kp.prs_kostenplaats_omschrijving = SUBSTR ('VERVALLEN:' || COALESCE (prs_kostenplaats_omschrijving, '-'), 1, 60) + WHERE kp.prs_kostenplaats_verwijder IS NULL + AND kp.prs_kostenplaats_module = 'PRS' + AND UPPER (COALESCE (prs_kostenplaats_omschrijving, '-')) NOT LIKE 'VERVALLEN:%' + AND NOT EXISTS + (SELECT 1 + FROM fmhn_imp_org + WHERE UPPER (prs_kostenplaats_nr) = kp.prs_kostenplaats_upper); +*/ + -- For summary only. + SELECT COUNT ( * ) + INTO l_newcountafd + FROM prs_v_aanwezigafdeling a, prs_v_afdeling_boom ab + WHERE UPPER (COALESCE (a.prs_afdeling_omschrijving, '-')) NOT LIKE 'VERVALLEN:%' + AND a.prs_afdeling_key = ab.prs_afdeling_key + AND ab.prs_bedrijf_key = v_bedrijf_key; +/* + SELECT COUNT ( * ) + INTO l_newcountkpn + FROM prs_v_aanwezigkostenplaats + WHERE prs_kostenplaats_module = 'PRS' + AND UPPER (COALESCE (prs_kostenplaats_omschrijving, '-')) NOT LIKE 'VERVALLEN:%'; +*/ + fac.imp_writelog (p_import_key, 'S', 'Aantal afdelingen in importbestand: ' || TO_CHAR (l_impcountafd), ''); + fac.imp_writelog (p_import_key, 'S', 'Aantal actieve afdelingen vooraf: ' || TO_CHAR (l_oldcountafd) || ' -> nu: ' || TO_CHAR (l_newcountafd), ''); +/* + fac.imp_writelog (p_import_key, 'S', 'Aantal actieve kostenplaatsen vooraf: ' || TO_CHAR (l_oldcountkpn) || ' -> nu: ' || TO_CHAR (l_newcountkpn), ''); + fac.imp_writelog (p_import_key, 'S', 'Aantal kostenplaatsen vervallen: ' || TO_CHAR (l_vervcountkpn), ''); +*/ +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, 'Importproces Afdelingen afgebroken!'); +END; +/ +/* +SELECT afdid, LENGTH (afdid) FROM fmhn_imp_org; + +SELECT afdcode, LENGTH (afdcode) FROM fmhn_imp_org; + + SELECT afdid, COUNT ( * ) + FROM fmhn_imp_org +GROUP BY afdid; + + SELECT LEVEL imp_lev, + volgnr, + mincode, + afdid, + afdcode, + afdoms, + afdidparent, + kpnr, + kpoms, + begindat, + einddat + FROM fmhn_imp_org +--WHERE fac_import_key = p_import_key +CONNECT BY PRIOR afdid = afdidparent +START WITH afdidparent IS NULL -- TODO: Of '0'? + ORDER BY LEVEL; +*/ +CREATE OR REPLACE PROCEDURE fmhn_import_prs (p_import_key IN NUMBER) +AS + c_delim VARCHAR2 (1) := ';'; -- Field seperator + v_newline fac_imp_file.fac_imp_file_line%TYPE; -- Import line + v_errormsg VARCHAR2 (1000) := ''; + oracle_err_num NUMBER; + oracle_err_mes VARCHAR2 (200); + v_aanduiding VARCHAR2 (1000) := ''; + header_is_valid NUMBER := 0; + v_count_tot NUMBER (10) := 0; + v_count_imp NUMBER (10) := 0; + -- De importvelden + v_mincode VARCHAR2 (255); + v_prsnr VARCHAR2 (255); + v_afdid VARCHAR2 (255); + v_achternaam VARCHAR2 (255); + v_tussenvoegsel VARCHAR2 (255); + v_voorletters VARCHAR2 (255); + v_voornaam VARCHAR2 (255); + v_mv VARCHAR2 (255); + v_tel VARCHAR2 (255); + v_mob VARCHAR2 (255); + v_email VARCHAR2 (255); + v_begindat VARCHAR2 (255); + v_einddat VARCHAR2 (255); + v_stamgeb VARCHAR2 (255); + v_operator VARCHAR2 (255); + + 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 + --DELETE FROM fmhn_imp_prs; + --COMMIT; + + FOR rec1 IN c1 + LOOP + BEGIN + v_newline := rec1.fac_imp_file_line; + v_errormsg := 'Fout opvragen importregel'; + v_aanduiding := ''; + -- Lees alle veldwaarden + -- mincode;afdid;afdcode;afdoms;afdidparent;kpnr;kpoms;begindat;einddat + fac.imp_getfield (v_newline, c_delim, v_mincode); + fac.imp_getfield (v_newline, c_delim, v_prsnr); + fac.imp_getfield (v_newline, c_delim, v_afdid); + fac.imp_getfield (v_newline, c_delim, v_achternaam); + fac.imp_getfield (v_newline, c_delim, v_tussenvoegsel); + fac.imp_getfield (v_newline, c_delim, v_voorletters); + fac.imp_getfield (v_newline, c_delim, v_voornaam); + fac.imp_getfield (v_newline, c_delim, v_mv); + fac.imp_getfield (v_newline, c_delim, v_tel); + fac.imp_getfield (v_newline, c_delim, v_mob); + fac.imp_getfield (v_newline, c_delim, v_email); + fac.imp_getfield (v_newline, c_delim, v_begindat); + fac.imp_getfield (v_newline, c_delim, v_einddat); + fac.imp_getfield (v_newline, c_delim, v_stamgeb); + fac.imp_getfield (v_newline, c_delim, v_operator); + + v_aanduiding := '[' || v_mincode || '|' || v_prsnr || '|' || v_afdid || v_email || '] '; + + -- Ik controleer of ik een geldige header heb, dat is: in de juiste + -- kolommen de juiste kolomkop. Ik controleer daarbij ALLE kolommen! + -- Ik negeer alles totdat ik een geldige header ben gepasseerd. + IF (header_is_valid = 0) + THEN + IF v_mincode = 'mincode' + AND v_prsnr = 'prsnr' + AND v_afdid = 'afdid' + AND v_achternaam = 'achternaam' + AND v_tussenvoegsel = 'tussenvoegsel' + AND v_voorletters = 'voorletters' + AND v_voornaam = 'voornaam' + AND v_mv = 'mv' + AND v_tel = 'tel' + AND v_mob = 'mob' + AND v_email = 'email' + AND v_begindat = 'begindat' + AND v_einddat = 'einddat' + AND v_stamgeb = 'stamgeb' + --AND v_operator = 'operator' + THEN + header_is_valid := 1; + END IF; + ELSIF (rec1.regellengte > 0) -- Lege regels overslaan + THEN + BEGIN + v_count_tot := v_count_tot + 1; + + -- Direct wegschrijven; controleer alle veldwaarden maar niet. + v_errormsg := 'Fout wegschrijven importregel'; + INSERT INTO fmhn_imp_prs (fac_import_key, + volgnr, + mincode, + prsnr, + afdid, + achternaam, + tussenvoegsel, + voorletters, + voornaam, + mv, + tel, + mob, + email, + begindat, + einddat, + stamgeb, + operator) + VALUES (p_import_key, + v_count_imp, + SUBSTR (TRIM (v_mincode), 1, 10), -- C6 + SUBSTR (TRIM (v_prsnr), 1, 20), -- C20 + SUBSTR (TRIM (v_afdid), 1, 101), -- C100 + SUBSTR (TRIM (v_achternaam), 1, 60), -- C60 + SUBSTR (TRIM (v_tussenvoegsel), 1, 15), -- C15 (of '[wis]') + SUBSTR (TRIM (v_voorletters), 1, 15), -- C15 + SUBSTR (TRIM (v_voornaam), 1, 30), -- C30 + DECODE (v_mv, '[wis]', 'X', SUBSTR (TRIM (v_mv), 1, 1)), -- C1 (X, M, V of NULL) + SUBSTR (TRIM (v_tel), 1, 15), -- C15 + SUBSTR (TRIM (v_mob), 1, 15), -- C15 (of '[wis]') + SUBSTR (TRIM (v_email), 1, 200), -- C200 + fac.safe_to_date (TRIM (v_begindat), 'yyyy-mm-dd'), + fac.safe_to_date (TRIM (v_einddat), 'yyyy-mm-dd'), + SUBSTR (TRIM (v_stamgeb), 1, 30), -- C30 + SUBSTR (TRIM (v_operator), 1, 6)); + + 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, ''); + END; + + IF MOD (v_count_tot, 500) = 0 THEN COMMIT; END IF; + END IF; + END; + END LOOP; + + IF (header_is_valid = 0) + THEN + fac.imp_writelog (p_import_key, 'E', 'Ongeldig importbestand', 'Geen header of header niet volgens afspraak!'); + ELSE + fac.imp_writelog (p_import_key, 'S', 'Personen/#ingelezen importregels: ' || TO_CHAR (v_count_tot), ''); + fac.imp_writelog (p_import_key, 'S', 'Personen/#ongeldige niet ingelezen importregels: ' || TO_CHAR (v_count_tot - v_count_imp), ''); + 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, 'Inleesproces Personen afgebroken!'); + + -- Maak importtabel leeg om import van foutieve bestanden te voorkomen! + --DELETE FROM fmhn_imp_prs; +END; +/ + +CREATE OR REPLACE PROCEDURE fmhn_update_prs (p_import_key IN NUMBER) +AS + -- Maximaal percentage aan nieuwe medewerkers tov. actieve medewerkers met een e-mail + c_max_delta_percentage NUMBER (10) := 50; -- 50%! + c_functie VARCHAR2 (60) := 'Medewerker'; + v_errormsg VARCHAR2 (1000) := ''; + oracle_err_num NUMBER; + oracle_err_mes VARCHAR2 (200); + v_aanduiding VARCHAR2 (1000) := ''; + v_count_prs_import NUMBER (10); -- #actieve personen na import! + v_count_prs_actual NUMBER (10); -- #actieve personen voor import! + v_count_tot NUMBER (10) := 0; + v_count_upd NUMBER (10) := 0; + v_count NUMBER; + v_mincode VARCHAR2 (6); + v_bedrijf_key prs_bedrijf.prs_bedrijf_key%TYPE; + v_minomschr_key fac_usrdata.fac_usrdata_key%TYPE; + v_minomschr fac_usrdata.fac_usrdata_omschr%TYPE; + v_afdidroot prs_kenmerklink.prs_kenmerklink_waarde%TYPE; + v_srtperslid_key prs_srtperslid.prs_srtperslid_key%TYPE; + v_afdeling_key prs_afdeling.prs_afdeling_key%TYPE; + v_achternaam VARCHAR2 (60); + v_perslid_key prs_perslid.prs_perslid_key%TYPE; + v_ruimte_key alg_ruimte.alg_ruimte_key%TYPE; + + CURSOR cprsdelta + IS + SELECT volgnr, + mincode, + prsnr, + afdid, + achternaam, + tussenvoegsel, + voorletters, + voornaam, + mv, + tel, + mob, + email, + begindat, + einddat, + stamgeb, + operator + FROM fmhn_imp_prs + WHERE fac_import_key = p_import_key + ORDER BY volgnr; +BEGIN + -- Randvoorwaarde dat alle personen in importbestand dezelfde mincode! + v_errormsg := 'Fout (uniek) bepalen mincode'; + SELECT DISTINCT mincode + INTO v_mincode + FROM fmhn_imp_prs + WHERE fac_import_key = p_import_key; + + -- Randvoorwaarde dat één intern bedrijf bestaat met bepaalde mincode! + v_errormsg := 'Fout (uniek) bepalen bedrijf'; + SELECT b.prs_bedrijf_key, ud.fac_usrdata_key, ud.fac_usrdata_omschr, afdid.prs_kenmerklink_waarde + INTO v_bedrijf_key, v_minomschr_key, v_minomschr, v_afdidroot + FROM prs_v_aanwezigbedrijf b, + (SELECT * FROM prs_v_aanwezigkenmerklink WHERE prs_kenmerk_key = 1020) mincode, -- Ministeriecode (bij Bedrijf) + fac_v_aanwezigusrdata ud, + (SELECT * FROM prs_v_aanwezigkenmerklink WHERE prs_kenmerk_key = 1021) afdid -- Organisatieonderdeelcode (bij Bedrijf) + WHERE b.prs_bedrijf_intern = 1 + AND b.prs_bedrijf_key = mincode.prs_link_key + AND fac.safe_to_number (mincode.prs_kenmerklink_waarde) = ud.fac_usrdata_key + AND ud.fac_usrdata_upper = UPPER (v_mincode) + AND b.prs_bedrijf_key = afdid.prs_link_key(+); + + -- Bepaal distinct aantal personen in bestand voor mincode. + --SELECT COUNT (DISTINCT mincode || prsnr) + SELECT COUNT (*) + INTO v_count_prs_import + FROM fmhn_imp_prs + WHERE fac_import_key = p_import_key; + + -- Bepaal huidig aantal personen in Facilitor voor mincode. + SELECT DECODE (COUNT ( * ), 0, 1, COUNT ( * )) + INTO v_count_prs_actual + FROM prs_v_aanwezigperslid p, prs_v_afdeling_boom ab + WHERE p.prs_perslid_externid IS NOT NULL + AND p.prs_afdeling_key = ab.prs_afdeling_key + AND ab.prs_bedrijf_key = v_bedrijf_key; + + /* Alleen controleren bij verwijderen van personen! + IF (TRUNC ( (v_count_prs_import / v_count_prs_actual) * 100) < (100 - c_max_delta_percentage)) + THEN + fac.imp_writelog (p_import_key, 'E', + 'Verschil tussen te importeren en huidig aantal personen te groot!', + '- #personen/import = [' || TO_CHAR (v_count_prs_import) || ']' + || CHR (13) || CHR (10) + || '- #personen/huidig = [' || TO_CHAR (v_count_prs_actual) || ']'); + RETURN; + END IF; + */ + FOR rc IN cprsdelta + LOOP + BEGIN + v_aanduiding := '[' || rc.mincode || '|' || rc.prsnr || '|' || rc.afdid || '|' || rc.email || '] '; + v_count_tot := v_count_tot + 1; + + -- Afdeling moet bestaan bij bulk-import en INSERT! + v_errormsg := 'Fout bepalen functie'; + IF COALESCE (UPPER (rc.operator), 'INSERT') = 'INSERT' + THEN + -- Bestaat functie? + SELECT prs_srtperslid_key + INTO v_srtperslid_key + FROM prs_srtperslid + WHERE prs_srtperslid_verwijder IS NULL + AND UPPER (prs_srtperslid_omschrijving) = UPPER (c_functie); + ELSE + v_srtperslid_key := TO_NUMBER (NULL); -- Don't care! + END IF; + + -- Afdeling moet bestaan bij bulk-import, INSERT en indien ontvangen! + v_errormsg := 'Fout bepalen afdeling'; + IF COALESCE (rc.operator,'INSERT') = 'INSERT' OR rc.afdid IS NOT NULL + THEN + -- Bestaat afdeling? + SELECT prs_afdeling_key + INTO v_afdeling_key + FROM prs_afdeling + WHERE prs_afdeling_verwijder IS NULL + AND UPPER (prs_afdeling_externid) = UPPER (rc.mincode || rc.afdid); + ELSE + v_afdeling_key := TO_NUMBER (NULL); -- Don't care! + END IF; + + v_achternaam := SUBSTR (rc.achternaam, 1, 60); + IF LENGTH (rc.achternaam) > 60 + THEN + fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Achternaam afgebroken tot ' || v_achternaam, 'Achternaam te lang'); + END IF; + + -- Bestaat persoon? + v_errormsg := 'Fout bepalen persoon'; + SELECT MAX (prs_perslid_key), COUNT ( * ) + INTO v_perslid_key, v_count + FROM prs_v_aanwezigperslid + WHERE UPPER (prs_perslid_externid) = UPPER (rc.mincode || rc.prsnr); + + IF v_count = 0 + THEN + v_errormsg := 'Ongeldige operator voor niet bestaande persoon'; + IF COALESCE (UPPER (rc.operator), 'INSERT') = 'INSERT' + THEN + v_errormsg := 'Fout toevoegen persoon'; + INSERT INTO prs_perslid (prs_perslid_module, + prs_srtperslid_key, + prs_afdeling_key, + prs_perslid_naam, + prs_perslid_tussenvoegsel, + prs_perslid_voorletters, + prs_perslid_voornaam, + --prs_perslid_titel, + prs_perslid_geslacht, + --prs_perslid_nr, + --prs_perslid_oslogin, + --prs_perslid_apikey, + --prs_perslid_dienstverband, + prs_perslid_ingangsdatum, + prs_perslid_einddatum, + prs_perslid_telefoonnr, + prs_perslid_mobiel, + prs_perslid_email, + prs_perslid_externid) + VALUES ('PRS', + v_srtperslid_key, + v_afdeling_key, + v_achternaam, + rc.tussenvoegsel, + rc.voorletters, + rc.voornaam, + --rc.titel, + DECODE (UPPER (rc.mv), 'M', 1, 'V', 0, NULL), + --rc.prsnr, + --NULL, + --NULL, + --NULL, + rc.begindat, + rc.einddat, + rc.tel, + rc.mob, + rc.email, + rc.mincode || rc.prsnr) + RETURNING prs_perslid_key + INTO v_perslid_key; + + -- Alleen initieel vullen bij INSERT (daarna nooit meer)! + v_errormsg := 'Fout bijwerken mincode'; + prs.upsertkenmerk (1024, v_perslid_key, rc.mincode); -- Ministeriecode + + v_errormsg := 'Fout bijwerken prsnr'; + prs.upsertkenmerk (1009, v_perslid_key, rc.prsnr); -- Identificatie persoon + ELSE + fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Operator ongeldig'); + v_perslid_key := -1; + END IF; + ELSIF v_count = 1 + THEN + v_errormsg := 'Ongeldige operator voor bestaande persoon'; + IF COALESCE (UPPER (rc.operator), 'UPDATE') = 'UPDATE' + THEN + v_errormsg := 'Fout bijwerken persoon'; + UPDATE prs_perslid + SET prs_afdeling_key = COALESCE (v_afdeling_key, prs_afdeling_key), + prs_perslid_naam = COALESCE (v_achternaam, prs_perslid_naam), + prs_perslid_tussenvoegsel = DECODE (rc.tussenvoegsel, '[wis]', NULL, COALESCE (rc.tussenvoegsel, prs_perslid_tussenvoegsel)), + prs_perslid_voorletters = COALESCE (rc.voorletters, prs_perslid_voorletters), + prs_perslid_voornaam = COALESCE (rc.voornaam, prs_perslid_voornaam), + prs_perslid_geslacht = DECODE (rc.mv, 'X', NULL, DECODE (UPPER (rc.mv), 'M', 1, 'V', 0, prs_perslid_geslacht)), + prs_perslid_ingangsdatum = COALESCE (rc.begindat, prs_perslid_ingangsdatum), + prs_perslid_einddatum = COALESCE (rc.einddat, prs_perslid_einddatum), + prs_perslid_telefoonnr = COALESCE (rc.tel, prs_perslid_telefoonnr), + prs_perslid_mobiel = DECODE (rc.mob, '[wis]', NULL, COALESCE (rc.mob, prs_perslid_mobiel)), + prs_perslid_email = COALESCE (rc.email, prs_perslid_email) + WHERE prs_perslid_key = v_perslid_key; + ELSIF UPPER (rc.operator) = 'DELETE' + THEN + v_errormsg := 'Fout verwijderen persoon'; + prs.delete_perslid (p_import_key, v_perslid_key); + v_perslid_key := -1; + ELSE + fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Operator ongeldig'); + v_perslid_key := -1; + END IF; + ELSE + fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Personeelsnummer niet uniek'); + v_perslid_key := -1; + END IF; + + IF v_perslid_key > 0 + THEN + IF rc.stamgeb IS NOT NULL + THEN + v_errormsg := 'Fout bepalen huidige ruimte in gebouw'; + SELECT COUNT ( * ) + INTO v_count + FROM prs_perslidwerkplek pw, prs_werkplek w, alg_v_aanwezigruimte r, alg_verdieping v, alg_gebouw g + WHERE pw.prs_perslid_key = v_perslid_key + AND pw.prs_werkplek_key = w.prs_werkplek_key + AND w.prs_alg_ruimte_key = r.alg_ruimte_key + AND r.alg_verdieping_key = v.alg_verdieping_key + AND v.alg_gebouw_key = g.alg_gebouw_key + AND UPPER (g.alg_gebouw_code) = UPPER (rc.stamgeb); + + -- Als persoon in gebouw reeds een werkplek heeft en de nieuwe zou + -- in de default ruimte zijn, dan wordt onderstaande overgeslagen. + IF v_count = 0 + THEN + v_errormsg := 'Fout bepalen default ruimte of gebouw'; + SELECT r1.alg_ruimte_key + INTO v_ruimte_key + FROM alg_v_aanweziggebouw g1, alg_verdieping v1, alg_v_aanwezigruimte r1 + WHERE UPPER (g1.alg_gebouw_code) = UPPER (rc.stamgeb) + AND NOT EXISTS + (SELECT 1 + FROM alg_v_aanweziggebouw + WHERE UPPER (alg_gebouw_code) = UPPER (rc.stamgeb) + AND alg_locatie_key < g1.alg_locatie_key) + AND g1.alg_gebouw_key = v1.alg_gebouw_key + AND v1.alg_verdieping_key = r1.alg_verdieping_key + AND r1.alg_ruimte_nr = '_' + AND NOT EXISTS -- Geen ruimte '_' op lagere verdieping! + (SELECT 1 + FROM alg_verdieping v2, alg_v_aanwezigruimte r2 + WHERE v2.alg_verdieping_key = r2.alg_verdieping_key + AND r2.alg_ruimte_nr = '_' + AND v2.alg_gebouw_key = v1.alg_gebouw_key + AND v2.alg_verdieping_volgnr < v1.alg_verdieping_volgnr); + + v_errormsg := 'Fout bijwerken ruimte'; + prs.movetoruimte (v_perslid_key, v_ruimte_key, NULL); + END IF; + END IF; + v_count_upd := v_count_upd + 1; + END IF; + IF MOD (v_count_tot, 500) = 0 THEN 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, 'Niet succesvol verwerkt'); + END; + END LOOP; + + fac.imp_writelog (p_import_key, 'S', '#Personen/Ontvangen: ' || TO_CHAR (v_count_tot) || ' -> Succesvol: ' || TO_CHAR (v_count_upd), ''); +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, 'Importproces Personen afgebroken!'); +END; +/ + +CREATE OR REPLACE PROCEDURE fmhn_import_rel (p_import_key IN NUMBER) +AS + c_delim VARCHAR2 (1) := ';'; -- Field seperator + v_newline fac_imp_file.fac_imp_file_line%TYPE; -- Import line + v_errormsg VARCHAR2 (1000) := ''; + oracle_err_num NUMBER; + oracle_err_mes VARCHAR2 (200); + v_aanduiding VARCHAR2 (1000) := ''; + header_is_valid NUMBER := 0; + v_count_tot NUMBER (10) := 0; + v_count_imp NUMBER (10) := 0; + -- De importvelden + v_levnr VARCHAR2 (255); + v_bedrnaam VARCHAR2 (255); + v_postadres VARCHAR2 (255); + v_ppostcode VARCHAR2 (255); + v_pplaats VARCHAR2 (255); + v_pland VARCHAR2 (255); + v_bezoekadres VARCHAR2 (255); + v_bpostcode VARCHAR2 (255); + v_bplaats VARCHAR2 (255); + v_bland VARCHAR2 (255); + v_status VARCHAR2 (255); + v_classificatie VARCHAR2 (255); + v_sector VARCHAR2 (255); + v_subsector VARCHAR2 (255); + v_telefoon VARCHAR2 (255); + v_email VARCHAR2 (255); + v_contractant VARCHAR2 (255); + + 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 + DELETE FROM fac_imp_ext_bedrijf; + COMMIT; + + FOR rec1 IN c1 + LOOP + BEGIN + v_newline := rec1.fac_imp_file_line; + v_errormsg := 'Fout opvragen importregel'; + v_aanduiding := ''; + -- Lees alle veldwaarden + --Leveranciernr;Bedrijfsnaam;Postadres;PPostcode;PPlaats;PLand;BezoekAdres;BPostcode;BPlaats;BLand;Status;Classificatie;Sector;SubSector;Telefoon;Email;Contractant + fac.imp_getfield (v_newline, c_delim, v_levnr); + fac.imp_getfield (v_newline, c_delim, v_bedrnaam); + fac.imp_getfield (v_newline, c_delim, v_postadres); + fac.imp_getfield (v_newline, c_delim, v_ppostcode); + fac.imp_getfield (v_newline, c_delim, v_pplaats); + fac.imp_getfield (v_newline, c_delim, v_pland); + fac.imp_getfield (v_newline, c_delim, v_bezoekadres); + fac.imp_getfield (v_newline, c_delim, v_bpostcode); + fac.imp_getfield (v_newline, c_delim, v_bplaats); + fac.imp_getfield (v_newline, c_delim, v_bland); + fac.imp_getfield (v_newline, c_delim, v_status); + fac.imp_getfield (v_newline, c_delim, v_classificatie); + fac.imp_getfield (v_newline, c_delim, v_sector); + fac.imp_getfield (v_newline, c_delim, v_subsector); + fac.imp_getfield (v_newline, c_delim, v_telefoon); + fac.imp_getfield (v_newline, c_delim, v_email); + fac.imp_getfield (v_newline, c_delim, v_contractant); + + v_aanduiding := '[' || v_levnr || '|' || v_bedrnaam || '] '; + + -- Ik controleer of ik een geldige header heb, dat is: in de juiste + -- kolommen de juiste kolomkop. Ik controleer daarbij ALLE kolommen! + -- Ik negeer alles totdat ik een geldige header ben gepasseerd. + IF (header_is_valid = 0) + THEN + IF UPPER (v_levnr) = 'LEVERANCIERNR' + AND UPPER (v_bedrnaam) = 'BEDRIJFSNAAM' + AND UPPER (v_postadres) = 'POSTADRES' + AND UPPER (v_ppostcode) = 'PPOSTCODE' + AND UPPER (v_pplaats) = 'PPLAATS' + AND UPPER (v_pland) = 'PLAND' + AND UPPER (v_bezoekadres) = 'BEZOEKADRES' + AND UPPER (v_bpostcode) = 'BPOSTCODE' + AND UPPER (v_bplaats) = 'BPLAATS' + AND UPPER (v_bland) = 'BLAND' + AND UPPER (v_status) = 'STATUS' + AND UPPER (v_classificatie) = 'CLASSIFICATIE' + AND UPPER (v_sector) = 'SECTOR' + AND UPPER (v_subsector) = 'SUBSECTOR' + AND UPPER (v_telefoon) = 'TELEFOON' + AND UPPER (v_email) = 'EMAIL' + AND UPPER (v_contractant) = 'CONTRACTANT' + THEN + header_is_valid := 1; + END IF; + ELSIF (rec1.regellengte > 0) -- Lege regels overslaan + THEN + BEGIN + v_count_tot := v_count_tot + 1; + + -- Direct wegschrijven; controleer alle veldwaarden maar niet. + v_errormsg := 'Fout wegschrijven importregel'; + INSERT INTO fac_imp_ext_bedrijf (prs_leverancier_nr, + prs_bedrijf_naam, + prs_bedrijf_bezoek_adres, + prs_bedrijf_bezoek_postcode, + prs_bedrijf_bezoek_plaats, + prs_bedrijf_bezoek_land, + prs_bedrijf_post_adres, + prs_bedrijf_post_postcode, + prs_bedrijf_post_plaats, + prs_bedrijf_post_land, + prs_bedrijf_contract, + prs_bedrijf_telefoon, + prs_bedrijf_email, + prs_dienst_omschrijving, -- Status + prs_bedrijf_overig1, + prs_bedrijf_overig2, + prs_bedrijf_overig3) + VALUES (TRIM (v_levnr), + TRIM (v_bedrnaam), + TRIM (v_bezoekadres), + TRIM (v_bpostcode), + TRIM (v_bplaats), + TRIM (v_bland), + TRIM (v_postadres), + TRIM (v_ppostcode), + TRIM (v_pplaats), + TRIM (v_pland), + DECODE (SUBSTR (UPPER (COALESCE (TRIM (v_contractant), 'N')), 1, 1), 'N', 0, 'J', 1, 9), -- 9=Error! + TRIM (v_telefoon), + TRIM (v_email), + TRIM (v_status), + TRIM (v_classificatie), + TRIM (v_sector), + TRIM (v_subsector)); + + 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, ''); + END; + END IF; + END; + END LOOP; + + IF (header_is_valid = 0) + THEN + fac.imp_writelog (p_import_key, 'E', 'Ongeldig importbestand', 'Geen header of header niet volgens afspraak!'); + ELSE + fac.imp_writelog (p_import_key, 'S', 'Relaties/#ingelezen importregels: ' || TO_CHAR (v_count_tot), ''); + fac.imp_writelog (p_import_key, 'S', 'Relaties/#ongeldige niet ingelezen importregels: ' || TO_CHAR (v_count_tot - v_count_imp), ''); + 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, 'E', v_aanduiding || v_errormsg, 'Inleesproces Relaties afgebroken!'); +END fmhn_import_rel; +/ + +CREATE OR REPLACE PROCEDURE fmhn_update_rel (p_import_key IN NUMBER) +AS + v_errormsg VARCHAR2 (1000) := ''; + oracle_err_num NUMBER; + oracle_err_mes VARCHAR2 (200); + v_aanduiding VARCHAR2 (1000) := ''; + v_count NUMBER (10); + v_count_tot NUMBER (10) := 0; + v_count_new NUMBER (10) := 0; + v_count_upd NUMBER (10) := 0; + v_count_del NUMBER (10) := 0; + + -- SUBPROC + PROCEDURE add_bedrijf (p_import_key IN NUMBER) + AS + CURSOR c1 + IS + SELECT * + FROM fac_imp_ext_bedrijf ib + WHERE NOT EXISTS + (SELECT 1 + FROM fac_imp_ext_bedrijf + WHERE UPPER (prs_bedrijf_naam) = + UPPER (ib.prs_bedrijf_naam) + AND prs_leverancier_nr < ib.prs_leverancier_nr) + ORDER BY ib.prs_bedrijf_naam, ib.prs_leverancier_nr; + + v_bedrijf_key NUMBER (10); + BEGIN + FOR rec IN c1 + LOOP + BEGIN + v_aanduiding := '[' || rec.prs_leverancier_nr || '|' || rec.prs_bedrijf_naam || '] '; + v_count_tot := v_count_tot + 1; + + v_errormsg := 'Fout bepalen bedrijf'; + IF rec.prs_leverancier_nr IS NULL + THEN + fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Leveranciersnummer ongedefinieerd'); + COMMIT; + ELSE + SELECT COUNT ( * ) + INTO v_count + FROM prs_v_aanwezigbedrijf + WHERE UPPER (TRIM (prs_leverancier_nr)) = UPPER (rec.prs_leverancier_nr); + + IF v_count = 0 + THEN + v_errormsg := 'Fout toevoegen bedrijf'; + INSERT INTO prs_bedrijf (prs_leverancier_nr, + prs_bedrijf_naam, + prs_bedrijf_bezoek_adres, + prs_bedrijf_bezoek_postcode, + prs_bedrijf_bezoek_plaats, + prs_bedrijf_bezoek_land, + prs_bedrijf_post_adres, + prs_bedrijf_post_postcode, + prs_bedrijf_post_plaats, + prs_bedrijf_post_land, + --prs_bedrijf_leverancier, + --prs_bedrijf_uitvoerende, + prs_bedrijf_contract, + --prs_bedrijf_huurder, + prs_bedrijf_telefoon, + prs_bedrijf_email) + VALUES (rec.prs_leverancier_nr, + rec.prs_bedrijf_naam, + rec.prs_bedrijf_bezoek_adres, + rec.prs_bedrijf_bezoek_postcode, + rec.prs_bedrijf_bezoek_plaats, + rec.prs_bedrijf_bezoek_land, + rec.prs_bedrijf_post_adres, + rec.prs_bedrijf_post_postcode, + rec.prs_bedrijf_post_plaats, + rec.prs_bedrijf_post_land, + --NULL, + --NULL, + DECODE (rec.prs_bedrijf_contract, 1, 1, NULL), + --NULL, + rec.prs_bedrijf_telefoon, + rec.prs_bedrijf_email) + RETURNING prs_bedrijf_key + INTO v_bedrijf_key; + + v_count_new := v_count_new + 1; + ELSE -- v_count > 0 + SELECT prs_bedrijf_key + INTO v_bedrijf_key + FROM prs_v_aanwezigbedrijf + WHERE UPPER (prs_leverancier_nr) = UPPER (rec.prs_leverancier_nr); + + v_errormsg := 'Fout bijwerken bedrijf'; + UPDATE prs_bedrijf + SET prs_bedrijf_naam = COALESCE (rec.prs_bedrijf_naam, prs_bedrijf_naam), + prs_bedrijf_bezoek_adres = COALESCE (rec.prs_bedrijf_bezoek_adres, prs_bedrijf_bezoek_adres), + prs_bedrijf_bezoek_postcode = COALESCE (rec.prs_bedrijf_bezoek_postcode, prs_bedrijf_bezoek_postcode), + prs_bedrijf_bezoek_plaats = COALESCE (rec.prs_bedrijf_bezoek_plaats, prs_bedrijf_bezoek_plaats), + prs_bedrijf_bezoek_land = COALESCE (rec.prs_bedrijf_bezoek_land, prs_bedrijf_bezoek_land), + prs_bedrijf_post_adres = COALESCE (rec.prs_bedrijf_post_adres, prs_bedrijf_post_adres), + prs_bedrijf_post_postcode = COALESCE (rec.prs_bedrijf_post_postcode, prs_bedrijf_post_postcode), + prs_bedrijf_post_plaats = COALESCE (rec.prs_bedrijf_post_plaats, prs_bedrijf_post_plaats), + prs_bedrijf_post_land = COALESCE (rec.prs_bedrijf_post_land, prs_bedrijf_post_land), + --prs_bedrijf_leverancier = prs_bedrijf_leverancier, + --prs_bedrijf_uitvoerende =prs_bedrijf_uitvoerende, + prs_bedrijf_contract = DECODE (rec.prs_bedrijf_contract, 1, 1, NULL), + --prs_bedrijf_huurder = prs_bedrijf_huurder, + prs_bedrijf_telefoon = COALESCE (rec.prs_bedrijf_telefoon, prs_bedrijf_telefoon), + prs_bedrijf_email = COALESCE (rec.prs_bedrijf_email, prs_bedrijf_email) + WHERE prs_bedrijf_key = v_bedrijf_key; + + v_count_upd := v_count_upd + 1; + END IF; + + v_errormsg := 'Fout bijwerken Status'; + prs.upsertkenmerk (1046, v_bedrijf_key, rec.prs_dienst_omschrijving); -- Status + v_errormsg := 'Fout bijwerken Classificatie'; + prs.upsertkenmerk (1040, v_bedrijf_key, rec.prs_bedrijf_overig1); -- Classificatie + v_errormsg := 'Fout bijwerken Sector'; + prs.upsertkenmerk (1042, v_bedrijf_key, rec.prs_bedrijf_overig2); -- Sector + v_errormsg := 'Fout bijwerken Subsector'; + prs.upsertkenmerk (1042, v_bedrijf_key, rec.prs_bedrijf_overig3); -- Subsector + + IF MOD (v_count_tot, 500) = 0 THEN COMMIT; 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, 'E', v_aanduiding || v_errormsg, ''); + COMMIT; + END; + END LOOP; + + fac.imp_writelog (p_import_key, 'S', 'Relaties/#ingelezen: ' || TO_CHAR (v_count_tot), ''); + fac.imp_writelog (p_import_key, 'S', 'Relaties/#toegevoegd: ' || TO_CHAR (v_count_new), ''); + fac.imp_writelog (p_import_key, 'S', 'Relaties/#bijgewerkt: ' || TO_CHAR (v_count_upd), ''); + COMMIT; + END; + + -- SUBPROC + PROCEDURE del_bedrijf (p_import_key IN NUMBER) + AS + CURSOR c1 + IS + SELECT * + FROM prs_v_aanwezigbedrijf b + WHERE b.prs_bedrijf_intern IS NULL + AND b.prs_leverancier_nr IS NOT NULL + AND NOT EXISTS + (SELECT 1 + FROM fac_imp_ext_bedrijf + WHERE prs_leverancier_nr = b.prs_leverancier_nr) + ORDER BY b.prs_bedrijf_naam, b.prs_leverancier_nr; + + v_bedrijf_key NUMBER (10); + BEGIN + FOR rec IN c1 + LOOP + BEGIN + v_aanduiding := '[' || rec.prs_leverancier_nr || '|' || rec.prs_bedrijf_naam || '] '; + + --v_errormsg := 'Fout verwijderen bedrijf'; + --UPDATE prs_bedrijf + -- SET prs_bedrijf_verwijder = SYSDATE + -- WHERE prs_bedrijf_key = rec.prs_bedrijf_key; + + v_errormsg := 'Fout bijwerken Status=Vervallen'; + prs.upsertkenmerk (1046, v_bedrijf_key, 'Vervallen'); -- Status + + v_count_del := v_count_del + 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, 'E', v_aanduiding || v_errormsg, ''); + COMMIT; + END; + END LOOP; + + fac.imp_writelog (p_import_key, 'S', 'Relaties/#vervallen: ' || TO_CHAR (v_count_del), ''); + COMMIT; + END; +-- MAIN +BEGIN + SELECT COUNT ( * ) INTO v_count FROM fac_imp_ext_bedrijf; + + IF v_count < 100 + THEN + fac.imp_writelog (p_import_key, 'E', 'Het aantal te importeren relaties is te klein (' || TO_CHAR (v_count) || ')', ''); + RETURN; + END IF; + + -- Toevoegen Status-entries in Eigen tabel 221='Lifecycle REL'! + v_errormsg := 'Fout bijwerken Status-entries'; + INSERT INTO fac_usrdata (fac_usrtab_key, fac_usrdata_code, fac_usrdata_omschr) + SELECT 221, 'Vervallen', 'Vervallen' + FROM DUAL + WHERE NOT EXISTS + (SELECT 1 + FROM fac_usrdata + WHERE fac_usrtab_key = 221 -- Lifecycle REL + AND UPPER (TRIM (fac_usrdata_omschr)) = UPPER ('Vervallen')); + INSERT INTO fac_usrdata (fac_usrtab_key, fac_usrdata_code, fac_usrdata_omschr) + SELECT DISTINCT 221, SUBSTR (ib.prs_dienst_omschrijving, 1, 40), SUBSTR (ib.prs_dienst_omschrijving, 1, 60) + FROM fac_imp_ext_bedrijf ib + WHERE NOT EXISTS + (SELECT 1 + FROM fac_usrdata + WHERE fac_usrtab_key = 221 -- Lifecycle REL + AND UPPER (TRIM (fac_usrdata_omschr)) = UPPER (ib.prs_dienst_omschrijving)); + COMMIT; + + add_bedrijf (p_import_key); + del_bedrijf (p_import_key); -- Zet op Status-kenmerkveld op 'Vervallen'! +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, 'Importproces relaties afgebroken!'); +END fmhn_update_rel; +/ + +--View voor Burgertelefonie +CREATE OR REPLACE VIEW fmhn_v_rap_faq_kenm +( + kb_key, + vraag, + antwoord, + datum, + wijzigdatum, + oorsprong, + url, + taal, + zichtbaar, + zichtbaar_code, + productgroep, + subproductgroep, + zoekwoorden, + invoerder, + scope, + plaats, + aantalmeldingen, + aantalplaatsen, + organisatieonderdeel, + afdeling, + telefoonnummer, + bgg, + mobiel, + email, + opmerking, + contactpersoon, + contactgegevens +) +AS + SELECT f.fac_faq_key kb_key, + f.fac_faq_question vraag, + f.fac_faq_answer antwoord, + f.fac_faq_datum datum, + f.fac_faq_wijzigdatum wijzigdatum, + f.fac_faq_source oorsprong, + f.fac_faq_url url, + f.fac_faq_lang taal, + DECODE (f.fac_faq_level, + 1, lcl.l ('lcl_faq_level1'), + 2, lcl.l ('lcl_faq_level2'), + 3, lcl.l ('lcl_faq_level3')) + zichtbaar, + f.fac_faq_level zichtbaar_code, + (SELECT MIN(CASE + WHEN sd.ins_srtdiscipline_prefix IS NULL THEN '' + ELSE sd.ins_srtdiscipline_prefix || '-' + END + || m1.ins_discipline_omschrijving) + FROM mld_v_aanwezigdiscipline m1, + ins_srtdiscipline sd, + mld_stdmeldingfaq mf + WHERE m1.ins_srtdiscipline_key = sd.ins_srtdiscipline_key + AND m1.ins_discipline_key = mf.ins_discipline_key + AND mf.fac_faq_key = f.fac_faq_key) + productgroep, + (SELECT MIN (sm.mld_stdmelding_omschrijving) + FROM mld_stdmeldingfaq mf, mld_stdmelding sm + WHERE mf.mld_stdmelding_key = sm.mld_stdmelding_key(+) + AND mf.fac_faq_key = f.fac_faq_key) + subproductgroep, + fac_faq_hint zoekwoorden, + pf.prs_perslid_naam_full invoerder, + (SELECT MIN (NVL (o.alg_type, 'L')) + FROM alg_v_allonroerendgoed o, alg_algfaq af + WHERE af.alg_onroerendgoed_keys = o.alg_onroerendgoed_keys(+) + AND af.fac_faq_key = f.fac_faq_key) + scope, + (SELECT MIN(l.alg_locatie_code + || DECODE (o.alg_plaatsaanduiding, + NULL, NULL, + '-' || o.alg_plaatsaanduiding)) + FROM alg_v_aanweziglocatie l, + alg_v_onroerendgoed_gegevens o, + alg_algfaq af + WHERE af.alg_onroerendgoed_keys = o.alg_onroerendgoed_keys(+) + AND af.alg_locatie_key = l.alg_locatie_key + AND af.fac_faq_key = f.fac_faq_key) + plaats, + (SELECT COUNT ( * ) + FROM mld_stdmeldingfaq mf + WHERE mf.fac_faq_key = f.fac_faq_key) + aantalmeldingen, + (SELECT COUNT ( * ) + FROM alg_algfaq af + WHERE af.fac_faq_key = f.fac_faq_key) + aantalplaatsen, + (SELECT faq_kenmerkwaarde_waarde + FROM faq_kenmerkwaarde kmwa, faq_kenmerk kma + WHERE f.fac_faq_key = kmwa.fac_faq_key + AND kma.faq_kenmerk_key = kmwa.faq_kenmerk_key + AND UPPER (kma.faq_kenmerk_omschrijving) = + 'ORGANISATIEONDERDEEL') + AS organisatieonderdeel, + (SELECT faq_kenmerkwaarde_waarde + FROM faq_kenmerkwaarde kmwa, faq_kenmerk kma + WHERE f.fac_faq_key = kmwa.fac_faq_key + AND kma.faq_kenmerk_key = kmwa.faq_kenmerk_key + AND UPPER (kma.faq_kenmerk_omschrijving) = 'AFDELING') + AS afdeling, + (SELECT faq_kenmerkwaarde_waarde + FROM faq_kenmerkwaarde kmwa, faq_kenmerk kma + WHERE f.fac_faq_key = kmwa.fac_faq_key + AND kma.faq_kenmerk_key = kmwa.faq_kenmerk_key + AND UPPER (kma.faq_kenmerk_omschrijving) = 'TELEFOONNUMMER') + AS telefoonnummer, + (SELECT faq_kenmerkwaarde_waarde + FROM faq_kenmerkwaarde kmwa, faq_kenmerk kma + WHERE f.fac_faq_key = kmwa.fac_faq_key + AND kma.faq_kenmerk_key = kmwa.faq_kenmerk_key + AND UPPER (kma.faq_kenmerk_omschrijving) = 'BGG') + AS bgg, + (SELECT faq_kenmerkwaarde_waarde + FROM faq_kenmerkwaarde kmwa, faq_kenmerk kma + WHERE f.fac_faq_key = kmwa.fac_faq_key + AND kma.faq_kenmerk_key = kmwa.faq_kenmerk_key + AND UPPER (kma.faq_kenmerk_omschrijving) = 'MOBIEL') + AS mobiel, + (SELECT faq_kenmerkwaarde_waarde + FROM faq_kenmerkwaarde kmwa, faq_kenmerk kma + WHERE f.fac_faq_key = kmwa.fac_faq_key + AND kma.faq_kenmerk_key = kmwa.faq_kenmerk_key + AND UPPER (kma.faq_kenmerk_omschrijving) = 'EMAIL') + AS email, + (SELECT faq_kenmerkwaarde_waarde + FROM faq_kenmerkwaarde kmwa, faq_kenmerk kma + WHERE f.fac_faq_key = kmwa.fac_faq_key + AND kma.faq_kenmerk_key = kmwa.faq_kenmerk_key + AND UPPER (kma.faq_kenmerk_omschrijving) = 'OPMERKING') + AS opmerking, + (SELECT faq_kenmerkwaarde_waarde + FROM faq_kenmerkwaarde kmwa, faq_kenmerk kma + WHERE f.fac_faq_key = kmwa.fac_faq_key + AND kma.faq_kenmerk_key = kmwa.faq_kenmerk_key + AND UPPER (kma.faq_kenmerk_omschrijving) = 'CONTACTPERSOON') + AS contactpersoon, + contact.kenmerken AS contactgegevens + FROM fac_faq f, + prs_v_perslid_fullnames_all pf, + ( SELECT kb_key, + listagg (kenmerken, CHR (10)) + WITHIN GROUP (ORDER BY kb_key) + kenmerken + FROM (SELECT kb_key, (kenmerk || ': ' || waarde_c) AS kenmerken + FROM fac_v_udr_faqkenmerk_cnd + WHERE kenmerk IN + ('Telefoonnummer', + 'Mobiel', + 'BGG', + 'Email', + 'Contactpersoon')) + GROUP BY kb_key) contact + WHERE f.prs_perslid_key = pf.prs_perslid_key(+) + AND f.fac_faq_key = contact.kb_key(+); + +-- CAD sync-view, de orginele ruimtenummers landen in een kenmerk bij de ruimte. + +CREATE OR REPLACE VIEW fmhn_v_sync_alg_ruimte +( + alg_ruimte_key, + alg_verdieping_key, + cadlabel +) +AS + SELECT r.alg_ruimte_key, + r.alg_verdieping_key, + COALESCE (k.alg_onrgoedkenmerk_waarde, r.alg_ruimte_nr) cadlabel + FROM alg_ruimte r, alg_onrgoedkenmerk k + WHERE r.alg_ruimte_key = k.alg_onrgoed_key AND k.alg_kenmerk_key = 1000; + +-- Domein-view tbv. alle medewerkers uit IDM! +-- Als P-kenmerk 1009=Identificatie persoon gevuld, dan uiteindelijk (in mijn +-- wijsheid, maar twijfel) besloten om medewerker te beschouwen als uit IDM. +-- Bewust niet op basis B-kenmerk 1020=Ministeriecode of prs_perslid_externid! +CREATE OR REPLACE VIEW fmhn_v_idm_medewerker +( + prs_perslid_key, + prs_perslid_naam_full, + prs_perslid_naam_friendly, + prs_perslid_verwijder +) +AS + SELECT p.prs_perslid_key, + pf.prs_perslid_naam_full, + pf.prs_perslid_naam_friendly, + p.prs_perslid_verwijder + FROM prs_perslid p, + prs_v_perslid_fullnames pf + WHERE p.prs_perslid_apikey IS NULL + AND SUBSTR (COALESCE (p.prs_perslid_oslogin, 'X'), 1, 1) != '_' + AND p.prs_perslid_key = pf.prs_perslid_key; +/* + AND EXISTS + (SELECT 1 + FROM prs_v_aanwezigkenmerklink + WHERE prs_kenmerk_key = 1009 -- Identificatie persoon + AND prs_link_key = p.prs_perslid_key); +*/ + +-- Rapportages tbv. Personenvervoer +CREATE OR REPLACE VIEW fmhn_v_rap_medewerkers +( + person_id, + mincode, + prsnr, + --department_id, + --afdeling, + account_id, + kostenplaats, + achternaam, + tussenvoegsel, + voorletters, + voornaam, + titel, + telefoon, + mobiel, + email +) +AS + SELECT p.prs_perslid_key, + TRIM (SUBSTR (ud.fac_usrdata_omschr, INSTR (ud.fac_usrdata_omschr, '-') + 1)), + SUBSTR (p.prs_perslid_externid, 3), + --a.prs_afdeling_key, + --afdpad.prs_kenmerklink_waarde, + kp.prs_kostenplaats_key, + kp.prs_kostenplaats_omschrijving, + p.prs_perslid_naam, + p.prs_perslid_tussenvoegsel, + p.prs_perslid_voorletters, + p.prs_perslid_voornaam, + --p.prs_perslid_titel, + DECODE (p.prs_perslid_geslacht, 1, 'Dhr', 0, 'Mevr', 'Onbekend'), + p.prs_perslid_telefoonnr, + p.prs_perslid_mobiel, + p.prs_perslid_email + FROM prs_v_aanwezigperslid p, + prs_afdeling a, + prs_v_afdeling_boom ab, + prs_bedrijf b, + (SELECT * FROM prs_v_aanwezigkenmerklink WHERE prs_kenmerk_key = 1020) mincode, -- Ministeriecode (bij Bedrijf) + fac_v_aanwezigusrdata ud, + --(SELECT * FROM prs_v_aanwezigkenmerklink WHERE prs_kenmerk_key = 1009) prsnr, -- Identificatie persoon + (SELECT * FROM prs_v_aanwezigkenmerklink WHERE prs_kenmerk_key = 1004) afdpad, -- Afdelingspad + prs_kostenplaats kp + WHERE p.prs_perslid_apikey IS NULL + AND SUBSTR (COALESCE (p.prs_perslid_oslogin, 'X'), 1, 1) != '_' + AND p.prs_afdeling_key = a.prs_afdeling_key + AND a.prs_afdeling_key = ab.prs_afdeling_key + AND ab.prs_bedrijf_key = b.prs_bedrijf_key + AND b.prs_bedrijf_key = mincode.prs_link_key(+) + AND fac.safe_to_number (mincode.prs_kenmerklink_waarde) = ud.fac_usrdata_key(+) + --AND p.prs_perslid_key = prsnr.prs_link_key(+) + AND a.prs_afdeling_key = afdpad.prs_link_key(+) + AND a.prs_kostenplaats_key = kp.prs_kostenplaats_key(+); +/* + AND EXISTS + (SELECT 1 + FROM prs_v_aanwezigkenmerklink + WHERE prs_kenmerk_key = 1009 -- Identificatie persoon + AND prs_link_key = p.prs_perslid_key); +*/ +CREATE OR REPLACE VIEW fmhn_v_rap_ritkosten +( + tertaal, + startdatum, + einddatum, + aanvrager, -- Aangevraagd door + meldingnummer, + type_rit_nummer, + type_rit, + van_adres, + van_plaats, + naar_adres, + naar_plaats, + aangevraagd_voor, + kostenplaats, + inhuur_jn, + normbedrag, + aantal_uren, + kosten, + ritnummer_fl +) +AS + SELECT DECODE (ed.mld_kenmerkmelding_waarde, + NULL, 'Ongeldig', + SUBSTR (ed.mld_kenmerkmelding_waarde, -4) || '-' + || DECODE ( + TO_CHAR (fac.safe_to_date (ed.mld_kenmerkmelding_waarde, 'dd-mm-yyyy'), 'mm'), + '10', '3', + '09', '3', + '08', '2', + '07', '2', + '06', '2', + '05', '2', + '1')) + tertaal, + fac.safe_to_date (sd.mld_kenmerkmelding_waarde, 'dd-mm-yyyy') + startdatum, + fac.safe_to_date (ed.mld_kenmerkmelding_waarde, 'dd-mm-yyyy') + einddatum, + pfd.prs_perslid_naam_full aanvrager, + x.mld_melding_key meldingnummer, + SUBSTR (tr_ud.fac_usrdata_code, INSTR (tr_ud.fac_usrdata_code, '/') + 1) + type_rit_nummer, + tr_ud.fac_usrdata_omschr type_rit, + va.mld_kenmerkmelding_waarde || ' ' || vhn.mld_kenmerkmelding_waarde + van_adres, + vp.mld_kenmerkmelding_waarde van_plaats, + na.mld_kenmerkmelding_waarde || ' ' || nhn.mld_kenmerkmelding_waarde + naar_adres, + np.mld_kenmerkmelding_waarde naar_plaats, + pfv.prs_perslid_naam_full aangevraagd_voor, + kp.prs_kostenplaats_omschrijving kostenplaats, + DECODE (ih.mld_kenmerkmelding_waarde, NULL, 'N', 'J') inhuur_jn, + COALESCE (tr_ud.fac_usrdata_prijs, 0) normbedrag, + ROUND ((fac.safe_to_date (ed.mld_kenmerkmelding_waarde || ' ' || et.mld_kenmerkmelding_waarde, 'dd-mm-yyyy hh24:mi') + - fac.safe_to_date (sd.mld_kenmerkmelding_waarde || ' ' || st.mld_kenmerkmelding_waarde, 'dd-mm-yyyy hh24:mi')) + * 24, 2) + aantal_uren, + COALESCE (tr_ud.fac_usrdata_prijs, 0) + * ROUND ((fac.safe_to_date (ed.mld_kenmerkmelding_waarde || ' ' || et.mld_kenmerkmelding_waarde, 'dd-mm-yyyy hh24:mi') + - fac.safe_to_date (sd.mld_kenmerkmelding_waarde || ' ' || st.mld_kenmerkmelding_waarde, 'dd-mm-yyyy hh24:mi')) + * 24, 2) + kosten, + rn.mld_kenmerkmelding_waarde ritnummer_fl + FROM (SELECT mld_melding_key, prs_perslid_key_voor, prs_kostenplaats_key + FROM mld_melding + WHERE mld_stdmelding_key = 1) x + LEFT JOIN mld_v_aanwezigkenmerkmelding ad + ON x.mld_melding_key = ad.mld_melding_key + AND ad.mld_kenmerk_key = 41 -- Aanvraag door + LEFT JOIN prs_v_perslid_fullnames_all pfd + ON fac.safe_to_number (ad.mld_kenmerkmelding_waarde) = pfd.prs_perslid_key + LEFT JOIN mld_v_aanwezigkenmerkmelding tr + ON x.mld_melding_key = tr.mld_melding_key + AND tr.mld_kenmerk_key = 1 -- Type rit + LEFT JOIN fac_v_aanwezigusrdata tr_ud + ON fac.safe_to_number (tr.mld_kenmerkmelding_waarde) = tr_ud.fac_usrdata_key + LEFT JOIN mld_v_aanwezigkenmerkmelding va + ON x.mld_melding_key = va.mld_melding_key + AND va.mld_kenmerk_key = 11 -- Van adres + LEFT JOIN mld_v_aanwezigkenmerkmelding vhn + ON x.mld_melding_key = vhn.mld_melding_key + AND vhn.mld_kenmerk_key = 12 -- Van huisnummer + LEFT JOIN mld_v_aanwezigkenmerkmelding vp + ON x.mld_melding_key = vp.mld_melding_key + AND vp.mld_kenmerk_key = 14 -- Van plaats + LEFT JOIN mld_v_aanwezigkenmerkmelding na + ON x.mld_melding_key = na.mld_melding_key + AND na.mld_kenmerk_key = 17 -- Naar adres + LEFT JOIN mld_v_aanwezigkenmerkmelding nhn + ON x.mld_melding_key = nhn.mld_melding_key + AND nhn.mld_kenmerk_key = 18 -- Naar huisnummer + LEFT JOIN mld_v_aanwezigkenmerkmelding np + ON x.mld_melding_key = np.mld_melding_key + AND np.mld_kenmerk_key = 20 -- Naar plaats + LEFT JOIN prs_v_perslid_fullnames_all pfv + ON x.prs_perslid_key_voor = pfv.prs_perslid_key -- Aanvraag voor + LEFT JOIN prs_v_aanwezigkostenplaats kp + ON x.prs_kostenplaats_key = kp.prs_kostenplaats_key -- Kostenplaats + LEFT JOIN mld_v_aanwezigkenmerkmelding ih + ON x.mld_melding_key = ih.mld_melding_key + AND ih.mld_kenmerk_key = 9 -- Inhuur + LEFT JOIN mld_v_aanwezigkenmerkmelding sd + ON x.mld_melding_key = sd.mld_melding_key + AND sd.mld_kenmerk_key = 22 -- Startdatum + LEFT JOIN mld_v_aanwezigkenmerkmelding st + ON x.mld_melding_key = st.mld_melding_key + AND st.mld_kenmerk_key = 23 -- Starttijd + LEFT JOIN mld_v_aanwezigkenmerkmelding ed + ON x.mld_melding_key = ed.mld_melding_key + AND ed.mld_kenmerk_key = 24 -- Einddatum + LEFT JOIN mld_v_aanwezigkenmerkmelding et + ON x.mld_melding_key = et.mld_melding_key + AND et.mld_kenmerk_key = 25 -- Eindttijd + LEFT JOIN mld_v_aanwezigkenmerkmelding rn + ON x.mld_melding_key = rn.mld_melding_key + AND rn.mld_kenmerk_key = 2 -- Ritnummer +; + +CREATE OR REPLACE PACKAGE FMHN +AS + PROCEDURE sluiten_ritten; +END; +/ + +CREATE OR REPLACE PACKAGE BODY FMHN +AS + -- Maandelijks sluiten lopende Rit-meldingen over voorgaande maand zoals + -- vanuit Flowlogic aangemaakt! + PROCEDURE sluiten_ritten + AS + c_applname VARCHAR2 (50) := 'SLUITEN_RITTEN'; + v_errormsg VARCHAR2 (1000); + oracle_err_num NUMBER; + oracle_err_mes VARCHAR2 (200); + v_aanduiding VARCHAR2 (200); + v_count_tot NUMBER (10) := 0; + + CURSOR c_ritten + IS + SELECT m.mld_melding_key, m.mld_melding_onderwerp + FROM mld_melding m, + (SELECT * FROM mld_v_aanwezigkenmerkmelding WHERE mld_kenmerk_key = 24) ed -- Einddatum + WHERE m.mld_stdmelding_key = 1 -- Rit vanuit Flowlogic aangemaakt + --AND m.mld_melding_key = 1 + AND m.mld_melding_status IN (2, 3, 4, 99) -- Nieuw/Te accepteren/In behandeling (zou altijd Nieuw moeten zijn!) + AND m.mld_melding_key = ed.mld_melding_key + AND fac.safe_to_date (ed.mld_kenmerkmelding_waarde, 'dd-mm-yyyy') < SYSDATE; -- TODO:TRUNC (SYSDATE, 'mm'); + BEGIN + -- LET OP: DAILY-taak draait dagelijks na middernacht (begin van dag) en + -- ritten - over de voorgaande maand - worden alleen in de nacht + -- na 22e dag van de maand gesloten. + --IF TO_CHAR (SYSDATE, 'dd') = '23' -- TODO:Nacht na 22e dag van de maand! + --THEN + FOR rec IN c_ritten + LOOP + v_aanduiding := '[' || TO_CHAR (rec.mld_melding_key) || '|' || rec.mld_melding_onderwerp || '] '; + v_count_tot := v_count_tot + 1; + MLD.setmeldingstatus (rec.mld_melding_key, 5, NULL); -- Afgemeld (incl. tracking) + MLD.setmeldingstatus (rec.mld_melding_key, 6, NULL); -- Administratief verwerkt (incl. tracking) + IF MOD (v_count_tot, 500) = 0 THEN COMMIT; END IF; + END LOOP; + fac.writelog (c_applname, 'S', '#Ritten gesloten: ' || TO_CHAR (v_count_tot), ''); + COMMIT; + --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.writelog (c_applname, 'E', v_aanduiding || v_errormsg, 'Daily achtergrond taak afgebroken!'); + END; +END; +/ + +-- Dagelijkse taak +CREATE OR REPLACE PROCEDURE FMHN_DAILY +AS +BEGIN + -- Maandelijks sluiten geregistreerde ritten vanuit Flowlogic! + fmhn.sluiten_ritten (); +END; +/ + +CREATE OR REPLACE VIEW FMHN_V_NOTI_CNTREMINDER +( + CODE, + SENDER, + RECEIVER, + TEXT, + KEY, + PAR1, + PAR2, + XKEY + --XEMAIL, + --XMOBILE, + --FAC_SRTNOTIFICATIE_KEY, + --ATTACHMENTS, + --XSENDER, + --PRS_BEDRIJFADRES_KEY +) +AS -- Op Rappeltermijn voor Actiedatum naar 1e Aanspreekpunt + SELECT 'CNTMAI', + NULL, + c.prs_perslid_key_eig, + 'Actie: Contract ' || c.cnt_contract_nummer_intern || DECODE (cnt_contract_versie, NULL, '', '.' || cnt_contract_versie) + || ' ' || b.prs_bedrijf_naam || ' ' || c.cnt_contract_omschrijving, + c.cnt_contract_key, + c.cnt_contract_nummer_intern, + fac.safe_to_date (kc.cnt_kenmerkcontract_waarde, 'dd-mm-yyyy'), + NULL + --NULL xemail, + --NULL xmobile, + --NULL fac_srtnotificatie_key, + --NULL attachments, + --NULL xsender, + --NULL prs_bedrijfadres_key + FROM cnt_v_aanwezigcontract c, prs_bedrijf b, cnt_termijn ct, + --(SELECT * FROM cnt_kenmerkcontract WHERE cnt_kenmerkcontract_verwijder IS NULL AND cnt_kenmerk_key IN (8, 28, 29, 30)) kc, -- Actiedatum contractbeheer + (SELECT * FROM cnt_kenmerkcontract WHERE cnt_kenmerkcontract_verwijder IS NULL AND cnt_kenmerk_key IN (9, 25, 26, 27)) kc -- Actiedatum + WHERE c.cnt_contract_status = 0 + AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key + AND c.cnt_contract_rappeltermijn = ct.cnt_termijn_key + AND c.cnt_contract_key = kc.cnt_contract_key + AND TRUNC (DECODE (ct.cnt_termijn_type, + 'W', SYSDATE + (ct.cnt_termijn_aantal * 7), + 'M', ADD_MONTHS (SYSDATE, ct.cnt_termijn_aantal), + 'Y', ADD_MONTHS (SYSDATE, ct.cnt_termijn_aantal * 12), + SYSDATE + ct.cnt_termijn_aantal)) = fac.safe_to_date (kc.cnt_kenmerkcontract_waarde, 'dd-mm-yyyy') + UNION -- Op Rappeldatum naar 1e Aanspreekpunt + SELECT 'CNTMAI', + NULL, + c.prs_perslid_key_eig, + 'Rappel: Contract ' || c.cnt_contract_nummer_intern || DECODE (cnt_contract_versie, NULL, '', '.' || cnt_contract_versie) + || ' ' || b.prs_bedrijf_naam || ' ' || c.cnt_contract_omschrijving, + c.cnt_contract_key, + c.cnt_contract_nummer_intern, + cnt.cnt_getopzegdatum (c.cnt_contract_key), + NULL + --NULL xemail, + --NULL xmobile, + --NULL fac_srtnotificatie_key, + --NULL attachments, + --NULL xsender, + --NULL prs_bedrijfadres_key + FROM cnt_v_aanwezigcontract c, prs_bedrijf b + WHERE c.cnt_contract_status = 0 + AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key + AND cnt.cnt_getrappeldatum (c.cnt_contract_key) = TRUNC (SYSDATE); + +CREATE OR REPLACE VIEW FMHN_V_RAP_CNT +( + CONTRACTSOORT, + CNT_CONTRACT_KEY, + CONTRACTNR, + BESCHR, + EXTERNNR, + MANTELNR, + OMSCHR, + --DIENST, + CONTRACTAFD, + AANSPREEKPUNT1, + ICBMEDEWERKER1, + OPMERKING, + STATUS, + INGANGSDATUM, + RAPPELDATUM, + OPZEGDATUM, + EINDDATUM, + CONTRACTANT, + --CONTACTNAAM, + --KOSTENPLAATSCODE + --KOSTENPLAATSOMSCHR, + CONTRACTBEDRAG, + --TERMIJNBEDRAG, + --UURTARIEF, + --KORTING, + --LOCATIEGEBOUW, + --VERLENGEN, + PLANON_REF, + GEMANAGED_FMH, + BEHEREND_IUC, + AANSPREEKPUNT2, + ICBMEDEWERKER2, + ICB_SENIOR, + ACTIEDATUM_BEHEER, + ACTIEDATUM, + EINDDAT_SPEND, + EUROPESE_AANBEST, + VERLENGING_LT1, + VERLENGING_LT2, + MAX_EINDDATUM, + WERKGEBIED +) +AS + SELECT x.contractsoort, + x.cnt_contract_key, + x.cnt_contract_nummer_intern || DECODE (x.cnt_contract_versie, NULL, '', '.' || cnt_contract_versie) contractnr, + x.cnt_contract_omschrijving beschrijving, + x.cnt_contract_nummer externnr, + x.mantelnr, + x.cnt_contract_document omschrijving, + --x.dienst, + x.eigenaar_afd, + x.eigenaar, + x.beheerder, + x.cnt_contract_opmerking opmerking, + DECODE (x.cnt_contract_status, 1, 'Gesloten', 2, 'Nieuw', 3, 'Ter goedkeuring', 'Definitief') status, + TO_CHAR (x.cnt_contract_looptijd_van, 'dd-mm-yyyy') ingangsdat, + TO_CHAR (cnt.cnt_getRappeldatum (x.cnt_contract_key), 'dd-mm-yyyy') rappeldat, + TO_CHAR (cnt.cnt_getOpzegdatum (x.cnt_contract_key), 'dd-mm-yyyy') opzegdat, + TO_CHAR (x.cnt_contract_looptijd_tot, 'dd-mm-yyyy') einddat, + x.contractant, + --x.contactnaam, + --x.kostenplaatscode, + --x.kostenplaatsomschr, + TO_CHAR (x.cnt_contract_kosten) contractbedrag, + --TO_CHAR (x.cnt_contract_termijnkosten) termijnbedrag, + --TO_CHAR (x.cnt_contract_uurloon) uurtarief, + --TO_CHAR (x.cnt_contract_korting) korting, + --x.plaats locatiegebouw, + --TO_CHAR (x.cnt_contract_verlenging) verlengen, + pr.cnt_kenmerkcontract_waarde planon_referentie, + --pb.cnt_kenmerkcontract_waarde planon_bedrijf, + gfmh_ud.fac_usrdata_omschr gemanaged_fmh, + biuc_ud.fac_usrdata_omschr beherend_iuc, + ap2_pf.prs_perslid_naam_full aanspreekpunt2, + icbm_pf.prs_perslid_naam_full icb_medewerker, + icbs_pf.prs_perslid_naam_full icb_senior, + adcb.cnt_kenmerkcontract_waarde actiedat_beheer, + ad.cnt_kenmerkcontract_waarde actiedat, + edsp.cnt_kenmerkcontract_waarde einddat_spend, + ea_ud.fac_usrdata_omschr europese_aanbest, + vl1.cnt_kenmerkcontract_waarde verlenging_lt1, + vl2.cnt_kenmerkcontract_waarde verlenging_lt2, + med.cnt_kenmerkcontract_waarde max_einddat, + wg_ud.fac_usrdata_omschr werkgebied + FROM (SELECT c.*, + cd.ins_discipline_omschrijving contractsoort, + cm.cnt_contract_nummer_intern mantelnr, + --d.prs_dienst_omschrijving dienst, + a.prs_afdeling_naam eigenaar_afd, + eig.prs_perslid_naam_full eigenaar, + beh.prs_perslid_naam_full beheerder, + b.prs_bedrijf_naam contractant + --cp.prs_contactpersoon_naam contactnaam, + --kp.prs_kostenplaats_nr kostenplaatscode, + --kp.prs_kostenplaats_omschrijving kostenplaatsomschr, + --p.plaats + FROM cnt_v_aanwezigcontract c, + cnt_discipline cd, + cnt_v_aanwezigcontract cm, + --prs_dienst d, + prs_afdeling a, + prs_v_perslid_fullnames_all eig, + prs_v_perslid_fullnames_all beh, + prs_v_aanwezigbedrijf b + --prs_contactpersoon cp, + --prs_kostenplaats kp, + --(SELECT DISTINCT + -- cp.cnt_contract_key, + -- COALESCE (l.alg_locatie_code, g.alg_gebouw_code) plaats + -- FROM cnt_contract_plaats cp + -- LEFT JOIN alg_v_aanweziglocatie l + -- ON cp.cnt_alg_plaats_key = l.alg_locatie_key + -- AND cp.cnt_alg_plaats_code = 'L' + -- LEFT JOIN alg_v_aanweziggebouw g + -- ON cp.cnt_alg_plaats_key = g.alg_gebouw_key + -- AND cp.cnt_alg_plaats_code = 'G' + -- WHERE cp.cnt_contract_plaats_verwijder IS NULL) p + WHERE c.ins_discipline_key = cd.ins_discipline_key + AND c.cnt_contract_mantel_key = cm.cnt_contract_key(+) + --AND c.prs_dienst_key = d.prs_dienst_key(+) + AND c.prs_afdeling_key_eig = a.prs_afdeling_key + AND c.prs_perslid_key_eig = eig.prs_perslid_key(+) + AND c.prs_perslid_key_beh = beh.prs_perslid_key(+) + AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key + --AND c.prs_contactpersoon_key = cp.prs_contactpersoon_key(+) + --AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+) + --AND c.cnt_contract_key = p.cnt_contract_key(+) + ) x + LEFT JOIN cnt_kenmerkcontract pr + ON x.cnt_contract_key = pr.cnt_contract_key + AND pr.cnt_kenmerkcontract_verwijder IS NULL + AND EXISTS (SELECT 1 FROM cnt_kenmerk WHERE cnt_kenmerk_verwijder IS NULL AND cnt_srtkenmerk_key = 1 AND cnt_kenmerk_key = pr.cnt_kenmerk_key) -- Planon referentie + --LEFT JOIN cnt_kenmerkcontract pb + -- ON x.cnt_contract_key = pb.cnt_contract_key + -- AND pb.cnt_kenmerkcontract_verwijder IS NULL + -- AND EXISTS (SELECT 1 FROM cnt_kenmerk WHERE cnt_kenmerk_verwijder IS NULL AND cnt_srtkenmerk_key = 2 AND cnt_kenmerk_key = pb.cnt_kenmerk_key) -- Planon bedrijf + LEFT JOIN cnt_kenmerkcontract gfmh + ON x.cnt_contract_key = gfmh.cnt_contract_key + AND gfmh.cnt_kenmerkcontract_verwijder IS NULL + AND EXISTS (SELECT 1 FROM cnt_kenmerk WHERE cnt_kenmerk_verwijder IS NULL AND cnt_srtkenmerk_key = 3 AND cnt_kenmerk_key = gfmh.cnt_kenmerk_key) -- Gemanaged door FMH + LEFT JOIN fac_v_aanwezigusrdata gfmh_ud + ON fac.safe_to_number (gfmh.cnt_kenmerkcontract_waarde) = gfmh_ud.fac_usrdata_key + LEFT JOIN cnt_kenmerkcontract biuc + ON x.cnt_contract_key = biuc.cnt_contract_key + AND biuc.cnt_kenmerkcontract_verwijder IS NULL + AND EXISTS (SELECT 1 FROM cnt_kenmerk WHERE cnt_kenmerk_verwijder IS NULL AND cnt_srtkenmerk_key = 4 AND cnt_kenmerk_key = biuc.cnt_kenmerk_key) -- Beherend IUC + LEFT JOIN fac_v_aanwezigusrdata biuc_ud + ON fac.safe_to_number (biuc.cnt_kenmerkcontract_waarde) = biuc_ud.fac_usrdata_key + LEFT JOIN cnt_kenmerkcontract ap2 + ON x.cnt_contract_key = ap2.cnt_contract_key + AND ap2.cnt_kenmerkcontract_verwijder IS NULL + AND EXISTS (SELECT 1 FROM cnt_kenmerk WHERE cnt_kenmerk_verwijder IS NULL AND cnt_srtkenmerk_key = 16 AND cnt_kenmerk_key = ap2.cnt_kenmerk_key) -- 2e Aanspreekpunt + LEFT JOIN prs_v_perslid_fullnames_all ap2_pf + ON fac.safe_to_number (ap2.cnt_kenmerkcontract_waarde) = ap2_pf.prs_perslid_key + LEFT JOIN cnt_kenmerkcontract icbm + ON x.cnt_contract_key = icbm.cnt_contract_key + AND icbm.cnt_kenmerkcontract_verwijder IS NULL + AND EXISTS (SELECT 1 FROM cnt_kenmerk WHERE cnt_kenmerk_verwijder IS NULL AND cnt_srtkenmerk_key = 17 AND cnt_kenmerk_key = icbm.cnt_kenmerk_key) -- ICB Medewerker + LEFT JOIN prs_v_perslid_fullnames_all icbm_pf + ON fac.safe_to_number (icbm.cnt_kenmerkcontract_waarde) = icbm_pf.prs_perslid_key + LEFT JOIN cnt_kenmerkcontract icbs + ON x.cnt_contract_key = icbs.cnt_contract_key + AND icbs.cnt_kenmerkcontract_verwijder IS NULL + AND EXISTS (SELECT 1 FROM cnt_kenmerk WHERE cnt_kenmerk_verwijder IS NULL AND cnt_srtkenmerk_key = 18 AND cnt_kenmerk_key = icbs.cnt_kenmerk_key) -- ICB Senior + LEFT JOIN prs_v_perslid_fullnames_all icbs_pf + ON fac.safe_to_number (icbs.cnt_kenmerkcontract_waarde) = icbs_pf.prs_perslid_key + LEFT JOIN cnt_kenmerkcontract adcb + ON x.cnt_contract_key = adcb.cnt_contract_key + AND adcb.cnt_kenmerkcontract_verwijder IS NULL + AND EXISTS (SELECT 1 FROM cnt_kenmerk WHERE cnt_kenmerk_verwijder IS NULL AND cnt_srtkenmerk_key = 8 AND cnt_kenmerk_key = adcb.cnt_kenmerk_key) -- Actiedatum contractbeheer + LEFT JOIN cnt_kenmerkcontract ad + ON x.cnt_contract_key = ad.cnt_contract_key + AND ad.cnt_kenmerkcontract_verwijder IS NULL + AND EXISTS (SELECT 1 FROM cnt_kenmerk WHERE cnt_kenmerk_verwijder IS NULL AND cnt_srtkenmerk_key = 9 AND cnt_kenmerk_key = ad.cnt_kenmerk_key) -- Actiedatum + LEFT JOIN cnt_kenmerkcontract edsp + ON x.cnt_contract_key = edsp.cnt_contract_key + AND edsp.cnt_kenmerkcontract_verwijder IS NULL + AND EXISTS (SELECT 1 FROM cnt_kenmerk WHERE cnt_kenmerk_verwijder IS NULL AND cnt_srtkenmerk_key = 10 AND cnt_kenmerk_key = edsp.cnt_kenmerk_key) -- Einddatum tbv. SPEND + LEFT JOIN cnt_kenmerkcontract ea + ON x.cnt_contract_key = ea.cnt_contract_key + AND ea.cnt_kenmerkcontract_verwijder IS NULL + AND EXISTS (SELECT 1 FROM cnt_kenmerk WHERE cnt_kenmerk_verwijder IS NULL AND cnt_srtkenmerk_key = 11 AND cnt_kenmerk_key = ea.cnt_kenmerk_key) -- Europese aanbesteding + LEFT JOIN fac_v_aanwezigusrdata ea_ud + ON fac.safe_to_number (ea.cnt_kenmerkcontract_waarde) = ea_ud.fac_usrdata_key + LEFT JOIN cnt_kenmerkcontract vl1 + ON x.cnt_contract_key = vl1.cnt_contract_key + AND vl1.cnt_kenmerkcontract_verwijder IS NULL + AND EXISTS (SELECT 1 FROM cnt_kenmerk WHERE cnt_kenmerk_verwijder IS NULL AND cnt_srtkenmerk_key = 12 AND cnt_kenmerk_key = vl1.cnt_kenmerk_key) -- 1e verlenging looptijd + LEFT JOIN cnt_kenmerkcontract vl2 + ON x.cnt_contract_key = vl2.cnt_contract_key + AND vl2.cnt_kenmerkcontract_verwijder IS NULL + AND EXISTS (SELECT 1 FROM cnt_kenmerk WHERE cnt_kenmerk_verwijder IS NULL AND cnt_srtkenmerk_key = 13 AND cnt_kenmerk_key = vl2.cnt_kenmerk_key) -- 2e verlenging looptijd + LEFT JOIN cnt_kenmerkcontract med + ON x.cnt_contract_key = med.cnt_contract_key + AND med.cnt_kenmerkcontract_verwijder IS NULL + AND EXISTS (SELECT 1 FROM cnt_kenmerk WHERE cnt_kenmerk_verwijder IS NULL AND cnt_srtkenmerk_key = 14 AND cnt_kenmerk_key = med.cnt_kenmerk_key) -- Maximale einddatum + LEFT JOIN cnt_kenmerkcontract wg + ON x.cnt_contract_key = wg.cnt_contract_key + AND wg.cnt_kenmerkcontract_verwijder IS NULL + AND EXISTS (SELECT 1 FROM cnt_kenmerk WHERE cnt_kenmerk_verwijder IS NULL AND cnt_srtkenmerk_key = 15 AND cnt_kenmerk_key = wg.cnt_kenmerk_key) -- Werkgebied + LEFT JOIN fac_v_aanwezigusrdata wg_ud + ON fac.safe_to_number (wg.cnt_kenmerkcontract_waarde) = wg_ud.fac_usrdata_key; + +------ 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