diff --git a/sql/Onces/marx17d.sql b/sql/Onces/marx17d.sql index cec1abb..a07b56e 100644 --- a/sql/Onces/marx17d.sql +++ b/sql/Onces/marx17d.sql @@ -29,7 +29,8 @@ CREATE TABLE mar_imp_action_key ( fac_import_key NUMBER(10), action_code VARCHAR2(255), - ref_key NUMBER(10) + ref_key NUMBER(10), + extra_omschr VARCHAR2(4000) ); INSERT INTO fac_import_app (fac_import_app_code, fac_import_app_oms, fac_import_app_xsl, fac_functie_key, fac_import_app_charset, fac_import_app_prefix) @@ -43,6 +44,11 @@ FROM fac_import_app WHERE fac_import_app_code = 'ACTION_REF_KEY'; +-- MARX#59862: Tobias 365 - Mareon +-- Nieuwe soort notificatie in geval van factuurfout... +INSERT INTO fac_srtnotificatie (fac_srtnotificatie_code, fac_srtnotificatie_mode, fac_srtnotificatie_oms, fac_srtnotificatie_xmlnode, fac_srtnotificatie_url, fac_srtnotificatie_groep) +VALUES ('CUST04',2, 'Factuur is niet goed bij opdrachtgever verwerkt', 'factuur', 'fin/fin_factuur.asp?fin_key=', 0); +--- diff --git a/sql/mareon.sql b/sql/mareon.sql index 48b657a..daf58c0 100644 --- a/sql/mareon.sql +++ b/sql/mareon.sql @@ -2387,7 +2387,8 @@ IS -- De importvelden: v_action_code VARCHAR2 (256); - v_ref_key VARCHAR2 (256); + v_ref_key VARCHAR2 (256); + v_extra_omschr VARCHAR2 (4000); CURSOR c1 @@ -2415,8 +2416,12 @@ BEGIN fac.imp_getfield_nr (v_newline, c_fielddelimitor, 1, v_action_code); -- 02 - MLD_OPDR_KEY fac.imp_getfield_nr (v_newline, c_fielddelimitor, 2, v_ref_key); + -- 03 - EXTRA OMSCHRIJVING + fac.imp_getfield_nr (v_newline, c_fielddelimitor, 3, v_extra_omschr); + v_action_code := TRIM (v_action_code); v_ref_key := TRIM (v_ref_key); + v_extra_omschr := TRIM(v_extra_omschr); -- v_aanduiding := @@ -2439,8 +2444,8 @@ BEGIN -- v_errorhint := 'Ongeldige ACTION_CODE (max. 255 tekens) of MLD_OPDR_KEY, moet positieve integer zijn'; - INSERT INTO mar_imp_action_key (fac_import_key, action_code, ref_key) - VALUES(p_import_key, v_action_code, v_ref_key); + INSERT INTO mar_imp_action_key (fac_import_key, action_code, ref_key, extra_omschr) + VALUES(p_import_key, v_action_code, v_ref_key, v_extra_omschr); END IF; END; END LOOP; @@ -2500,6 +2505,7 @@ IS v_result VARCHAR2(1024); v_action_code VARCHAR2 (256); v_ref_key NUMBER(10); + v_extra_omschr VARCHAR2 (4000); v_prs_perslid_key NUMBER(10); @@ -2523,6 +2529,7 @@ BEGIN v_count_tot := v_count_tot + 1; v_action_code := rec_ax.action_code; v_ref_key := rec_ax.ref_key; + v_extra_omschr := rec_ax.extra_omschr; v_errorhint := 'Error in mar_update_action_ref_key, import-key: ' || p_import_key || '[' || 'Action:' || v_action_code || ' - Ref-key:' || v_ref_key || '] '; @@ -2535,8 +2542,10 @@ BEGIN IF (v_action_code IS NOT NULL AND v_ref_key IS NOT NULL) THEN - CASE + CASE WHEN UPPER(v_action_code) = 'OPDR_POST_BIJLAGE' THEN v_result := mar_post_action_bijlages (v_ref_key, v_prs_perslid_key); + WHEN UPPER(v_action_code) = 'FIN_FACTUUR_POST_SUCCESS' THEN v_result := mar_post_factuur_verwerking (v_prs_perslid_key, v_ref_key, 1, ''); + WHEN UPPER(v_action_code) = 'FIN_FACTUUR_POST_FAIL' THEN v_result := mar_post_factuur_verwerking (v_prs_perslid_key, v_ref_key, 0, v_extra_omschr); ELSE v_result := 'Onbekende action_code'; END CASE; END IF; @@ -7257,13 +7266,21 @@ SELECT DISTINCT AND f.prs_kostensoort_key = ks.prs_kostensoort_key(+) AND fr.prs_kostensoort_key = ks_regel.prs_kostensoort_key(+) AND t.fac_tracking_refkey = f.fin_factuur_key - AND t.fac_tracking_key > (SELECT sync_trackkey_lasttime FROM mar_v_sync_ax s WHERE s.prs_perslid_key = woco.prs_perslid_key) - AND t.fac_tracking_key <= (SELECT sync_trackkey_now FROM mar_v_sync_ax s WHERE s.prs_perslid_key = woco.prs_perslid_key) + AND ( + ( + (t.fac_tracking_key > (SELECT sync_trackkey_lasttime FROM mar_v_sync_ax s WHERE s.prs_perslid_key = woco.prs_perslid_key)) + AND + (t.fac_tracking_key <= (SELECT sync_trackkey_now FROM mar_v_sync_ax s WHERE s.prs_perslid_key = woco.prs_perslid_key)) + ) + OR + (sn.fac_srtnotificatie_code = 'CUST04') + ) AND sn.fac_srtnotificatie_key = t.fac_srtnotificatie_key AND sn.fac_srtnotificatie_xmlnode = 'factuur' AND versturen_okee.fin_factuur_key = f.fin_factuur_key AND versturen_okee.fin_kenmerk_key = 9 - AND versturen_okee.fin_kenmerkfactuur_waarde = 1; + AND versturen_okee.fin_kenmerkfactuur_waarde = 1 + AND fin_factuur_statuses_key IN (2,6); CREATE OR REPLACE VIEW mar_v_cnt_factuur_ax ( prs_perslid_key, @@ -7456,13 +7473,21 @@ AS AND f.prs_kostensoort_key = ks.prs_kostensoort_key(+) AND fr.prs_kostensoort_key = ks_regel.prs_kostensoort_key(+) AND t.fac_tracking_refkey = f.fin_factuur_key - AND t.fac_tracking_key > (SELECT sync_trackkey_lasttime FROM mar_v_sync_ax s WHERE s.prs_perslid_key = COALESCE(woco3.prs_perslid_key, woco2.prs_perslid_key)) - AND t.fac_tracking_key <= (SELECT sync_trackkey_now FROM mar_v_sync_ax s WHERE s.prs_perslid_key = COALESCE(woco3.prs_perslid_key, woco2.prs_perslid_key)) + AND ( + ( + (t.fac_tracking_key > (SELECT sync_trackkey_lasttime FROM mar_v_sync_ax s WHERE s.prs_perslid_key = COALESCE(woco3.prs_perslid_key, woco2.prs_perslid_key))) + AND + (t.fac_tracking_key <= (SELECT sync_trackkey_now FROM mar_v_sync_ax s WHERE s.prs_perslid_key = COALESCE(woco3.prs_perslid_key, woco2.prs_perslid_key))) + ) + OR + (sn.fac_srtnotificatie_code = 'CUST04') + ) AND sn.fac_srtnotificatie_key = t.fac_srtnotificatie_key AND sn.fac_srtnotificatie_xmlnode = 'factuur' AND versturen_okee.fin_factuur_key = f.fin_factuur_key AND versturen_okee.fin_kenmerk_key = 9 - AND versturen_okee.fin_kenmerkfactuur_waarde = 1; + AND versturen_okee.fin_kenmerkfactuur_waarde = 1 + AND fin_factuur_statuses_key IN (2,6); CREATE OR REPLACE VIEW mar_v_bes_factuur_ax ( prs_perslid_key, @@ -7656,13 +7681,21 @@ SELECT DISTINCT AND f.prs_kostensoort_key = ks.prs_kostensoort_key(+) AND fr.prs_kostensoort_key = ks_regel.prs_kostensoort_key(+) AND t.fac_tracking_refkey = f.fin_factuur_key - AND t.fac_tracking_key > (SELECT sync_trackkey_lasttime FROM mar_v_sync_ax s WHERE s.prs_perslid_key = COALESCE(woco.prs_perslid_key,woco2.prs_perslid_key)) - AND t.fac_tracking_key <= (SELECT sync_trackkey_now FROM mar_v_sync_ax s WHERE s.prs_perslid_key = COALESCE(woco.prs_perslid_key,woco2.prs_perslid_key)) + AND ( + ( + (t.fac_tracking_key > (SELECT sync_trackkey_lasttime FROM mar_v_sync_ax s WHERE s.prs_perslid_key = COALESCE(woco.prs_perslid_key,woco2.prs_perslid_key))) + AND + (t.fac_tracking_key <= (SELECT sync_trackkey_now FROM mar_v_sync_ax s WHERE s.prs_perslid_key = COALESCE(woco.prs_perslid_key,woco2.prs_perslid_key))) + ) + OR + (sn.fac_srtnotificatie_code = 'CUST04') + ) AND sn.fac_srtnotificatie_key = t.fac_srtnotificatie_key AND sn.fac_srtnotificatie_xmlnode = 'factuur' AND versturen_okee.fin_factuur_key = f.fin_factuur_key AND versturen_okee.fin_kenmerk_key = 9 - AND versturen_okee.fin_kenmerkfactuur_waarde = 1; + AND versturen_okee.fin_kenmerkfactuur_waarde = 1 + AND fin_factuur_statuses_key IN (2,6); CREATE OR REPLACE VIEW mar_v_factuur_ax AS @@ -7680,16 +7713,9 @@ SELECT * from mar_v_bes_factuur_ax; -- Als extra (niet standaard) optie, dus voor uitzonderingsgevallen waarin je wilt dat fout geimporteerde facturen toch AX in gaan), is het mogelijk -- om de facturen met fin_factuur_statuses_key = 3 ook te exporteren (standaard status 2 en 6) --- MARX#40934: Performance verbetering MARX CREATE OR REPLACE VIEW mar_v_factuur_ax_export AS -SELECT * from mar_v_factuur_ax -WHERE fin_factuur_statuses_key IN (2,6); - --(SELECT fac.safe_to_number(fac_usrdata_omschr) - --FROM fac_usrdata ud - --WHERE ud.fac_usrtab_key = 1 - --AND ud.fac_usrdata_code like '$FIN_FACTUUR_STATUSES_KEY%' - --AND ud.fac_usrdata_verwijder IS NULL); +SELECT * from mar_v_factuur_ax; CREATE OR REPLACE VIEW mar_v_factuur_tobias_export AS @@ -7701,6 +7727,75 @@ SELECT * from mar_v_factuur_ax WHERE fin_factuur_statuses_key = 6; +-- MARX#59862: Tobias 365 - Mareon +-- Nieuwe functie omdat deze code vanuit verschillende plekken aangeroepen kan worden.... +-- mbmb +CREATE OR REPLACE FUNCTION mar_post_factuur_verwerking (p_perslid_key IN NUMBER, p_fin_factuur_key IN NUMBER, p_fin_factuur_succes_verwerkt IN NUMBER, p_extra_omschr IN VARCHAR2) +RETURN VARCHAR2 +IS + v_result VARCHAR2(1000); + v_prs_woco_close_opdracht NUMBER(10); + v_mld_opdr_key NUMBER(10); + + l_omschr VARCHAR2(4000); +BEGIN + BEGIN + v_result := NULL; + IF (p_fin_factuur_succes_verwerkt = 1) + THEN + -- Factuur is door ERP opdrachtgever goed verwerkt + v_result := 'UPDATE factuur met status 7 is mislukt'; + UPDATE fin_factuur + SET fin_factuur_statuses_key = 7 + WHERE fin_factuur_key = p_fin_factuur_key; + + v_result := 'INSERT into tracking FINVER mislukt'; + + fac.trackaction ('#FINVER', p_fin_factuur_key, p_perslid_key, NULL, 'Factuur is verwerkt'); + + v_result := 'SELECT v_prs_woco_close_opdracht mislukt'; + + SELECT COALESCE(MAX((SELECT prs_bedrijf_close_opdracht FROM mar_v_bedrijf_kenmerken bc WHERE bc.prs_bedrijf_key = woco.prs_bedrijf_key)), 0), MAX(o.mld_opdr_key) + INTO v_prs_woco_close_opdracht, v_mld_opdr_key + FROM fin_factuur f, mld_opdr o, mld_melding m, mar_v_woco_perslid woco + WHERE f.fin_factuur_key = p_fin_factuur_key + AND f.mld_opdr_key = o.mld_opdr_key + AND o.mld_melding_key = m.mld_melding_key + AND m.prs_perslid_key = woco.prs_perslid_key; + + + IF v_prs_woco_close_opdracht = 1 + THEN + IF v_mld_opdr_key IS NOT NULL + THEN + -- Eerst afmelden, daarna op verwerkt. + -- Als die al afgemeld was, dan is deze call een dummy call en gebeurt verder niets. + v_result := 'mld setopdrachtstatus met 6 mislukt'; + mld.setopdrachtstatus (v_mld_opdr_key, 6, p_perslid_key); + -- Als die al verwerkt was, dan is deze call een dummy call en gebeurt verder niets. + v_result := 'mld setopdrachtstatus met 7 mislukt'; + mld.setopdrachtstatus (v_mld_opdr_key, 7, p_perslid_key); + END IF; + END IF; + ELSE + -- Factuur is door ERP opdrachtgever NIET (goed) verwerkt + IF fac.gettrackingdate('CUST04', p_fin_factuur_key) IS NULL + THEN + -- Alleen eenmalig een CUST04 toevoegen is voldoende, we willen de tracking niet onnodig volbouwen) + l_omschr := SUBSTR('Factuur kan NIET verwerkt worden: ' || p_extra_omschr, 1, 2048); + fac.trackaction ('#CUST04', p_fin_factuur_key, p_perslid_key, NULL, l_omschr); + END IF; + END IF; + COMMIT; + RETURN NULL; + EXCEPTION + WHEN OTHERS + THEN + RETURN v_result; + END; +END; +/ + -- Algemeen: sync status... CREATE OR REPLACE PROCEDURE mar_import_ax_sync ( p_import_key IN NUMBER @@ -7876,6 +7971,11 @@ BEGIN IF (v_count_tot = 0) THEN v_count_tot := v_count_tot + 1; + -- MARX#59862: Tobias 365 - Mareon: Bij Tobias AX365 wordt sync-mode = 2 gestuurd (AX365) + -- v_ax_sync_mode heeft de volgende mogelijke waarden: + -- 0 = start van de sync + -- 1 = einde van de sync (AX2009/2012/REMS/Facilitor) + -- 2 = einde van de sync (AX365) v_ax_sync_mode := rec_ax.sync_mode; IF (v_ax_sync_mode IS NOT NULL) THEN @@ -7903,60 +8003,44 @@ BEGIN AND fac_usrdata_verwijder IS NULL; END IF; + + -- EINDE SYNC IF (v_ax_sync_mode = '1') THEN - -- Einde sync + + -- MARX#59862: Tobias 365 - Mareon: Bij Tobias AX365 wordt sync-mode = 2 gestuurd (AX365) + -- voor de ERP's (AX2009/2012/REMS/Facilitor) die sync-mode met 1 aanroepen, worden alle facturen conform cursor c_exporteerde_facturen onvoorwaardelijk op verwerkt gezet.... + -- voor de ERP's (AX365) die sync mode met 2 aanroepen, wordt deze stap niet hier gedaan, maar in de Mareon sync zelf geregeld, omdat dit afhankelijk is gemaakt van de response uit AX365. -- In cursor c_exporteerde_facturen zitten ook eventueel de records van andere woco's... FOR rec_fac IN c_exporteerde_facturen(v_prs_perslid_key) LOOP BEGIN - - v_errorhint := 'UPDATE factuur met status 7 mislukt'; - UPDATE fin_factuur - SET fin_factuur_statuses_key = 7 - WHERE fin_factuur_key = rec_fac.fin_factuur_key; - - v_errorhint := 'INSERT into tracking FINVER mislukt'; - -- Verplaatsen van INSERT hierboven die in 1x een insert van alle regels doet, ivm table MARX.FAC_TRACKING is mutating, trigger/function may not see it - INSERT INTO fac_tracking (fac_tracking_refkey, fac_srtnotificatie_key, prs_perslid_key) - SELECT rec_fac.fin_factuur_key, (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_code = 'FINVER'), v_prs_perslid_key - FROM dual; - - IF rec_fac.prs_woco_close_opdracht = 1 - THEN - IF rec_fac.mld_opdr_key IS NOT NULL - THEN - -- Eerst afmelden, daarna op verwerkt. - -- Als die al afgemeld was, dan is deze call een dummy call en gebeurt verder niets. - v_errorhint := 'mld setopdrachtstatus met 6 mislukt'; - mld.setopdrachtstatus (rec_fac.mld_opdr_key, 6, v_prs_perslid_key); - -- Als die al verwerkt was, dan is deze call een dummy call en gebeurt verder niets. - v_errorhint := 'mld setopdrachtstatus met 7 mislukt'; - mld.setopdrachtstatus (rec_fac.mld_opdr_key, 7, v_prs_perslid_key); - END IF; - END IF; - - EXCEPTION - WHEN OTHERS - THEN - oracle_err_num := SQLCODE; - oracle_err_mes := SUBSTR (SQLERRM, 1, 200); - v_errormsg := - 'OTHERS (error ' - || oracle_err_num - || '/' - || oracle_err_mes - || ')'; - fac.imp_writelog (p_import_key, - 'E', - v_aanduiding || v_errormsg, - v_errorhint - ); - COMMIT; - END; - END LOOP; - + v_errorhint := mar_post_factuur_verwerking (v_prs_perslid_key, rec_fac.fin_factuur_key, 1, ''); + EXCEPTION + WHEN OTHERS + THEN + oracle_err_num := SQLCODE; + oracle_err_mes := SUBSTR (SQLERRM, 1, 200); + v_errormsg := + 'OTHERS (error ' + || oracle_err_num + || '/' + || oracle_err_mes + || ')'; + fac.imp_writelog (p_import_key, + 'E', + v_aanduiding || v_errormsg, + v_errorhint + ); + COMMIT; + END; + END LOOP; + END IF; + -- MARX#59862: Tobias 365 - Mareon: Bij Tobias AX365 wordt sync-mode = 2 gestuurd (AX365). + -- Voor alle ERP's (mode =1 of mode = 2) moet onderstaande volgen... + IF ((v_ax_sync_mode = '1') OR (v_ax_sync_mode = '2')) + THEN v_errorhint := 'SYNC DATE LASTTIME mislukt'; UPDATE fac_usrdata ud1 SET ud1.fac_usrdata_omschr = (SELECT to_char(sync_date_now,'DD-MM-YYYY HH24:MI:SS') FROM mar_v_sync_ax s WHERE s.prs_perslid_key = v_prs_perslid_key) @@ -12292,7 +12376,7 @@ AND l_prs_bedrijf_key = flex2.prs_bedrijf_key; ----------------------------------------------- -BEGIN fac.registercustversion('MARX', 16); END; +BEGIN fac.registercustversion('MARX', 17); END; / ------ payload end ------