diff --git a/onces/AA/AAXX/AAXX#74729.sql b/onces/AA/AAXX/AAXX#74729.sql new file mode 100644 index 000000000..1c3c1777b --- /dev/null +++ b/onces/AA/AAXX/AAXX#74729.sql @@ -0,0 +1,1154 @@ +-- +-- $Id$ +-- +-- ONCESCRIPT om aanpassing in Mareon-factuurscanning alvast vooruit te leveren +---- Betreft: Controle Verdeelperiodebepaling voor SMKA/RWE in Mareon-factuurscan uitsluiten + +DEFINE thisfile = 'AAXX#74729.SQL' +DEFINE dbuser = 'AAXX' + +SET ECHO ON +SET DEFINE ON +COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT; +COLUMN fcltcusterr NEW_VALUE fcltcusterr NOPRINT; +WHENEVER SQLERROR CONTINUE; +SELECT adm.getscriptspoolfile('&thisfile') AS fcltlogfile FROM DUAL; +SPOOL &fcltlogfile +WHENEVER SQLERROR EXIT; +SELECT adm.checkscriptcust('&dbuser') AS fcltcusterr FROM DUAL; +WHENEVER SQLERROR CONTINUE; +PROMPT &fcltcusterr +SET DEFINE OFF + +------ payload begin ------ + +CREATE OR REPLACE PROCEDURE aaxx_update_fin_factuur_marx (p_import_key IN NUMBER) +AS + +-- Voor Correctie ORDERNR om standaard update-procedure goed te laten lopen. +--- 0. Bug - Als uit Mareo/Scanning geen order-referentie meekomt en er zijn meerdere factuurregels, dan wordt er vanuit fac_update_factuur niet 1 maar meerdere factuurnr's aangemaakt. Oplossing: Ordernr vullen. +--- 0.1 Verzamelfactuur-indicatie (2022-maart actief): Vanuit Mareon wordt deze met een "(*)" achter de referentie meegegeven, bijvoorbeeld C5602.5(*). +--- 0.2 Orderreferentie-opschoning: Vanuit scanning komt de orderreferentie soms mee inclusief 'extra tekst'. Bijv CO284IN’T of CO534.7HEERLEN. Voor goede verwerking gaan we de tekst achteraan de orderreferentie weghalen. +--- 1. Ordernr 101132/1 wordt niet als Opdracht herkend. In FUNCTION try_getopdracht_id gaat Facilitor alleen maar opdrachten matchen als er 1,2 of 3 letters voorstaan... Daarom gaan we er in import-tabel een 'O' voorzetten (dus: 'O101132/1') +--- Ps. BCT-regel: Indien geen prefix, en kolom ORDERNR is 6- of 7 cijferig en met een '/' en dan numeriek 1 t/m 3 posities. Voorbeeld: Bijv: 104370/2 vanuit BCT moet worden O104370/2 +--- 2. Ordernr beginnende met "CO" wordt niet als Contract herkend. Daarom gaan we er in import-tabel een "C" van maken. +--- 3. Als ordernr is C (= contract) echter zonder versienummer - Dan wordt in standaard update altijd automatisch het hoogste versienummer gepakt. +--- Ivm overlap 'jaarovergangen' is dat niet altijd juist en moet de vanuit Mareon geimporteerde factuur nog status 'te controleren' meekrijgen voordat deze automatisch de financiele-interface in gaat. +--- 4. Ordernr beginnende met "BE" of "B" wordt niet als Bestelling herkend. Daarom gaan we deze prefix in de import-tabel weghalen. + +CURSOR ccor_0 +IS + SELECT ordernr + FROM fac_imp_factuur + WHERE fac_import_key = p_import_key + AND ordernr IS NULL + GROUP BY ordernr ; + +CURSOR ccor_0_1 +IS + SELECT factuurnr, ordernr + FROM fac_imp_factuur + WHERE fac_import_key = p_import_key + AND INSTR(ordernr,'(*)') > 1 + GROUP BY factuurnr, ordernr ; + +CURSOR ccor_0_2 +IS + SELECT factuurnr, ordernr + FROM fac_imp_factuur + WHERE fac_import_key = p_import_key + AND REGEXP_INSTR(REVERSE(ordernr), '\d') > 1 + GROUP BY factuurnr, ordernr ; + +CURSOR ccor_1 +IS + SELECT factuurnr, ordernr, fac.safe_to_number(SUBSTR(ordernr,1,(INSTR(ordernr,'/')-1))) as melding_key, fac.safe_to_number(SUBSTR(ordernr,(INSTR(ordernr,'/')+1),LENGTH(ordernr))) opdracht_volgnr, fac.safe_to_number(TO_CHAR(fac.safe_to_date (factuurdatum, 'yyyy-mm-dd'), 'yyyy')) factuurdatum_jaar + FROM fac_imp_factuur + WHERE fac_import_key = p_import_key + AND INSTR(ordernr,'/') >0 + AND LENGTH(SUBSTR(ordernr,1,(INSTR(ordernr,'/')-1))) IN (6,7) + GROUP BY factuurnr, ordernr, factuurdatum ; + +CURSOR ccor_2 +IS + SELECT factuurnr, ordernr + FROM fac_imp_factuur + WHERE fac_import_key = p_import_key + AND LENGTH(ordernr) >= 2 + AND (SUBSTR(UPPER(ordernr),1,2) = 'CO' OR SUBSTR(UPPER(ordernr),1,2) = 'CC') + GROUP BY factuurnr, ordernr ; + +CURSOR ccor_3 +IS + SELECT factuurnr, ordernr, SUBSTR(ordernr,2) cnt_contract_nummer_intern + FROM fac_imp_factuur + WHERE fac_import_key = p_import_key + AND SUBSTR(UPPER(ordernr),1,1) = 'C' + AND INSTR(ordernr,'.')=0 + GROUP BY factuurnr, ordernr ; + +CURSOR ccor_4 +IS + SELECT factuurnr, ordernr + FROM fac_imp_factuur + WHERE fac_import_key = p_import_key + AND ( SUBSTR (ordernr, 1, 1) = 'B' + AND fac.safe_to_number (SUBSTR (ordernr, 2, 1)) IS NOT NULL) + OR (SUBSTR (ordernr, 1, 2) = 'BE') + GROUP BY factuurnr, ordernr ; + +CURSOR cfactuur +IS + SELECT i.fin_factuur_key, i.kenmerk1, i.kenmerk2, i.kenmerk3, i.factuurnr, i.fac_imp_file_index, f.fin_factuur_totaal, f.fin_factuur_totaal_btw, f.mld_opdr_key, f.cnt_contract_key, f.bes_bestelopdr_key + FROM fac_imp_factuur i, fin_factuur f + WHERE i.fin_factuur_key IS NOT NULL + AND i.fac_import_key = p_import_key + AND f.fin_factuur_key = i.fin_factuur_key + AND kenmerk1 IS NOT NULL -- Incl bijlage + ; + + + v_aanduiding VARCHAR2 (1000); + v_errorhint VARCHAR2 (1000); + v_errormsg VARCHAR2 (1000); + oracle_err_num NUMBER; + oracle_err_mes VARCHAR2 (200); + + c_kenmerk_key_bijlage NUMBER(10); + c_kenmerk_key_soort VARCHAR(1) := 'F'; -- fin_kenmerk_kenmerktype = M(foldermap) of F(enkelvoudig bestand) + c_huidig_jaar NUMBER(4) := fac.safe_to_number((TO_CHAR (SYSDATE, 'yyyy'))); + v_disk_directory VARCHAR2 (200); + v_bedrag_totaal NUMBER(10); + v_bedrag_gefactureerd NUMBER(10); + v_count_gefactureerd NUMBER(10); + v_bedrag_termijn NUMBER(10); + v_ordersoort VARCHAR2 (200); + v_contractsoort VARCHAR2 (200); + v_bestelsoort VARCHAR2 (200); + v_klantnummer_key NUMBER(10); + v_klantnummer VARCHAR2 (200); + v_contract_versies NUMBER(10); + c_kenmerk_key_controle NUMBER(10); + c_kenmerk_key_verzamel NUMBER(10); + v_prs_bedrijf_key NUMBER(10); + v_opdracht_key NUMBER(10); + v_controle NUMBER(1) := 0 ; -- 1 = controlevinkje op inkoopfactuur zetten + v_aanduiding_controle VARCHAR2 (1000); -- Voor logging op bijbehorende controle zodat men weet wat men moet controleren + v_fac_usrdata_key_ja NUMBER(10); + v_fac_usrdata_key_nee NUMBER(10); + v_mld_statusopdr_key NUMBER(10); + v_count_gefactureerd_nr NUMBER(10); + v_opdracht_0_reden VARCHAR2 (1000); + v_fin_factuur_key NUMBER(10); + v_sabic_genk VARCHAR2 (200); + + -- Verdeelperiode voor de contracten gaan bepalen + v_cnt_jaar_start NUMBER(10); + v_cnt_jaar_eind NUMBER(10); + v_cnt_maand_start NUMBER(10); + v_cnt_maand_eind NUMBER(10); + v_cnt_maand_eind_tekst VARCHAR(2); + v_cnt_eind VARCHAR(7); -- Einde contract in format tekst "jaar-mnd" (2022-05) + v_factuur_boekmaand VARCHAR(7); -- Ingelezen factuur in format tekst "jaar-mnd" (2022-05) + v_gebroken_boekjaar NUMBER(1) := 0 ; + v_cnt_looptijd_mnd NUMBER(10); + v_cnt_deel_betaald_1 NUMBER(10); -- Deel van contract wat reeds betaald is + v_cnt_deel_betaald_2 NUMBER(10); -- Deel van contract wat betaald is als de mareon-factuur ook verwerkt is + v_cnt_deel_betaald_tekst VARCHAR2 (200); -- Tekst voor in tijdelijke kenmerveld om te kijken of bepaling boekmaand correct is + -- v_cnt_deel_betaald NUMBER(10); -- METHODE 1: Deel van contract betaald met deze factuur + -- v_fin_factuur_boekmaand VARCHAR(7); -- METHODE 1: De nieuwe boekmaand op de geimporteerde Mareon-factuur + v_fin_factuur_boekmaand_2 VARCHAR(7); -- De nieuwe boekmaand op de geimporteerde Mareon-factuur - METHODE 2 + v_fin_factuur_boekmaand_tekst VARCHAR2 (1000); -- Tekst voor in tijdelijke kenmerkveld om te kijken of bepaling boekmaand correct is + c_kenmerk_key_boekmaand NUMBER(10); + v_cnt_termijn_type VARCHAR(1); + v_cnt_termijn_aantal NUMBER(3); + v_cnt_soort VARCHAR2 (200); + v_factuur_datum_boekmaand NUMBER(10); + v_factuur_datum_boekmaand_jr NUMBER(10); + v_factuur_datum_boekmaand_prev VARCHAR(2); + v_factuur_datum_boekmaand_nu VARCHAR(2); + v_fin_factuur_boekmaand_laatst VARCHAR(7); + + v_cnt_maandbedrag NUMBER(10); + v_gefactureerd_vorige_maand NUMBER(10); + + + +BEGIN + + -- Voor draaien standaard factuur-update gaan we eerst op fac_imp_factuur een aantal correcties doorvoeren + FOR rec IN ccor_0 + LOOP + BEGIN + + UPDATE fac_imp_factuur + SET ordernr = '00000' -- Geen ordernr vanuit scanning + WHERE fac_import_key = p_import_key ; + + END; + END LOOP; + + FOR rec IN ccor_0_1 + LOOP + BEGIN + + UPDATE fac_imp_factuur + SET kenmerk3 = 'verzamelfactuur' + WHERE fac_import_key = p_import_key ; + + END; + END LOOP; + + FOR rec IN ccor_0_2 + LOOP + BEGIN + + UPDATE fac_imp_factuur + SET ordernr = SUBSTR(ordernr,1,LENGTH(ordernr)-(REGEXP_INSTR(REVERSE(ordernr), '\d')-1)) + WHERE fac_import_key = p_import_key ; + + END; + END LOOP; + + FOR rec IN ccor_1 + LOOP + BEGIN + + -- check of je er een ACTUELE opdracht_key voor kunt vinden. zo ja dan gaan we er vanuit dat het idd opdracht is en vullen we ordernr aan met een prefix "O" + --- Actueel = Nog niet verwerkte opdracht + Jaar(opdrachtdatum) gelijk aan Jaar(factuurdatum) of Jaar(factuurdatum)-1 + IF rec.melding_key IS NOT NULL and rec.opdracht_volgnr IS NOT NULL and rec.factuurdatum_jaar IS NOT NULL THEN + + SELECT min(mld_opdr_key) + INTO v_opdracht_key + FROM mld_opdr + WHERE mld_melding_key = rec.melding_key AND mld_opdr_bedrijfopdr_volgnr = rec.opdracht_volgnr + AND fac.safe_to_number((TO_CHAR (mld_opdr_datumbegin, 'yyyy'))) BETWEEN (rec.factuurdatum_jaar - 1) AND rec.factuurdatum_jaar + AND mld_statusopdr_key NOT IN (1,7) ; -- verwerkt of afgewezen + + IF v_opdracht_key IS NOT NULL THEN + + UPDATE fac_imp_factuur + SET ordernr = 'O' || ordernr + WHERE fac_import_key = p_import_key ; + + END IF; + + END IF; + + END; + END LOOP; + + FOR rec IN ccor_2 + LOOP + BEGIN + + UPDATE fac_imp_factuur + SET ordernr = 'C' || SUBSTR(ordernr,3,LENGTH(ordernr)) + WHERE fac_import_key = p_import_key ; + + END; + END LOOP; + + FOR rec IN ccor_3 + LOOP + BEGIN + + IF fac.safe_to_number(rec.cnt_contract_nummer_intern) IS NOT NULL THEN + + SELECT count(*) + INTO v_contract_versies + FROM cnt_contract + WHERE cnt_contract_verwijder IS NULL AND cnt_contract_status = 0 + AND cnt_contract_nummer_intern = rec.cnt_contract_nummer_intern ; + + -- Als er meer dan 1 versie is, dan moet factuur ter controle. We gaan hiervoor een kenmerkveld vullen... + IF v_contract_versies > 1 THEN + + UPDATE fac_imp_factuur + SET kenmerk2 = 'ter controle' + WHERE fac_import_key = p_import_key ; + + END IF; + + END IF; + + END; + END LOOP; + + FOR rec IN ccor_4 + LOOP + BEGIN + + UPDATE fac_imp_factuur + SET ordernr = REPLACE(ordernr,'BE','') + WHERE fac_import_key = p_import_key ; + + UPDATE fac_imp_factuur + SET ordernr = REPLACE(ordernr,'B','') + WHERE fac_import_key = p_import_key ; + + END; + END LOOP; + + + -- Nu kunnen we de standaard FCLT verwerk import facturen draaien + fac_update_factuur (p_import_key); + + -- CUST: post processing voor verwerking van het PDF document + SELECT MIN (fin_kenmerk_key) + INTO c_kenmerk_key_bijlage + FROM fin_kenmerk + WHERE fin_kenmerk_type = 'F' -- niveau kenmerk op Factuurniveau en niet op R-regel + AND fin_kenmerk_kenmerktype = c_kenmerk_key_soort + AND fin_kenmerk_verwijder IS NULL; + + -- CUST: Voor vullen Klantnummer het kenmerk_key ophalen + SELECT MIN (prs_kenmerk_key) + INTO v_klantnummer_key + FROM prs_kenmerk + WHERE prs_kenmerk_niveau = 'B' AND prs_kenmerk_upper = 'KLANTNUMMER' AND prs_kenmerk_verwijder IS NULL; + + -- CUST: Voor verwerking Contracten die qua versienr nog gecontroleerd moeten worden het kenmerk_key ophalen + SELECT MIN (fin_kenmerk_key) + INTO c_kenmerk_key_controle + FROM fin_kenmerk + WHERE fin_kenmerk_type = 'F' -- niveau kenmerk op Factuurniveau en niet op R-regel + AND fin_kenmerk_kenmerktype = 'V' + AND fin_kenmerk_upper = 'EXTRA CONTROLE?' + AND fin_kenmerk_verwijder IS NULL; + + -- CUST: Voor verwerking Contracten en Verdeelperiode goed doorvoeren (= fin_factuur_boekmaand) + ----- We gaan dit in een kenmerveld vullen en indien goed te bepalen dan wordt dit ook in procedure straks in het factuur-boekmaand veld weggeschreven + SELECT MIN (fin_kenmerk_key) + INTO c_kenmerk_key_boekmaand + FROM fin_kenmerk + WHERE fin_kenmerk_type = 'F' -- niveau kenmerk op Factuurniveau en niet op R-regel + AND fin_kenmerk_kenmerktype = 'C' + AND fin_kenmerk_upper = 'MAREON_CNT_BOEKMAAND' + AND fin_kenmerk_verwijder IS NULL; + + -- CUST: Voor verwerking Verzamelfactuur-indicatie het kenmerk_key ophalen + SELECT MIN (fin_kenmerk_key) + INTO c_kenmerk_key_verzamel + FROM fin_kenmerk + WHERE fin_kenmerk_type = 'F' -- niveau kenmerk op Factuurniveau en niet op R-regel + AND fin_kenmerk_kenmerktype = 'V' + AND fin_kenmerk_upper = 'VERZAMELFACTUUR?' + AND fin_kenmerk_verwijder IS NULL; + + -- CUST: Ophalen key-waarde Ja en Nee van kenmerkveld Laatste Factuur + SELECT ud.fac_usrdata_key + INTO v_fac_usrdata_key_ja + FROM fin_kenmerk k, + fac_kenmerkdomein kd, + fac_usrtab ut, + fac_usrdata ud + WHERE fin_kenmerk_key = 2 + AND k.fac_kenmerkdomein_key = kd.fac_kenmerkdomein_key + AND kd.fac_usrtab_key = ut.fac_usrtab_key + AND ut.fac_usrtab_key = ud.fac_usrtab_key + AND fac.safe_to_number (ud.fac_usrdata_code) = 1; -- Waarde is Ja + + SELECT ud.fac_usrdata_key + INTO v_fac_usrdata_key_nee + FROM fin_kenmerk k, + fac_kenmerkdomein kd, + fac_usrtab ut, + fac_usrdata ud + WHERE fin_kenmerk_key = 2 + AND k.fac_kenmerkdomein_key = kd.fac_kenmerkdomein_key + AND kd.fac_usrtab_key = ut.fac_usrtab_key + AND ut.fac_usrtab_key = ud.fac_usrtab_key + AND fac.safe_to_number (ud.fac_usrdata_code) = 2; -- Waarde is Nee + + + -- We gaan nu beginnen met het verder verwerken van de factuur.. + FOR rec IN cfactuur + LOOP + BEGIN + + -- Als er een bijlage-flexprop en een bijlage is, dan gaan we deze PDF hier inzetten.... + IF c_kenmerk_key_bijlage IS NOT NULL AND rec.kenmerk1 IS NOT NULL + THEN + + BEGIN + INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde) + VALUES('IMPORT:' || TO_CHAR (p_import_key), + 'flexcode', + 'FIN:' + || TO_CHAR (rec.fin_factuur_key) -- We kunnen niet meerdere imports tegelijk aan! + || ':' || c_kenmerk_key_bijlage || ':' -- De kenmerk key + || c_kenmerk_key_soort -- 'F of M' + ); + + -- FSN#33363: Zelf de insert in fin_kenmerkfactuur doen van het bestandskenmerk (FSN#33105 verzorgt dit niet namelijk) + -- Aanvulling JM: Voor F-enkelvoudig bestand wel nodig om kenmerk aan te maken, voor M-folder hoeft/moet dit niet + IF c_kenmerk_key_soort = 'F' + THEN + INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde) + VALUES (rec.fin_factuur_key, c_kenmerk_key_bijlage, rec.kenmerk1); + END IF; + + EXCEPTION + WHEN OTHERS + THEN + fac.imp_writelog (p_import_key, + 'W', + 'Van factuur met key ' || rec.fin_factuur_key || ' is de bestandsnaam niet bewaard (regel ' || rec.fac_imp_file_index || ')', + 'Factuurnr:' || rec.factuurnr || ' / Bestandsnaam: ' || rec.kenmerk1 + ); + END; + + COMMIT; + + END IF; + + -- Als er een ref-key gekoppeld is, dan gaan we o.a. de waarde van deze verplichting ophalen en verschillende controles doen + IF (rec.mld_opdr_key IS NOT NULL OR rec.cnt_contract_key IS NOT NULL OR rec.bes_bestelopdr_key IS NOT NULL) + THEN + v_bedrag_totaal := 0; + v_count_gefactureerd := 0; + v_bedrag_gefactureerd := 0; + v_ordersoort := ''; + + -- Voor Opdracht.. + IF rec.mld_opdr_key IS NOT NULL + THEN + SELECT COALESCE(o.mld_opdr_kosten, 0), ot.mld_typeopdr_omschrijving, o.mld_uitvoerende_keys, mld_statusopdr_key + INTO v_bedrag_totaal, v_ordersoort, v_prs_bedrijf_key, v_mld_statusopdr_key + FROM mld_opdr o, mld_typeopdr ot + WHERE o.mld_opdr_key = rec.mld_opdr_key + AND o.mld_typeopdr_key = ot.mld_typeopdr_key; + + SELECT count(*) + INTO v_count_gefactureerd + FROM fin_factuur + WHERE mld_opdr_key = rec.mld_opdr_key + AND fin_factuur_verwijder IS NULL; + + IF v_count_gefactureerd > 1 + THEN + SELECT sum(fin_factuur_totaal) + INTO v_bedrag_gefactureerd + FROM fin_factuur f + WHERE f.mld_opdr_key = rec.mld_opdr_key + AND f.fin_factuur_key NOT IN (rec.fin_factuur_key) + AND f.fin_factuur_verwijder IS NULL; + END IF; + + -- Als de Opdracht waar deze factuur op is gekomen al verwerkt is, dan moet deze factuur ter controle + IF v_mld_statusopdr_key IN (1,7) -- verwerkt of afgewezen + THEN + + v_aanduiding_controle := 'CONTROLE - Deze factuur is ingeboekt terwijl de Opdracht al op VERWERKT staat' ; + v_controle := 1 ; + + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle); + + END IF; + + -- Als hetzelfde factuurnummer al vaker op deze opdracht is geregistreerd, dan moet deze factuur ter controle + SELECT count(*) + INTO v_count_gefactureerd_nr + FROM fin_factuur + WHERE mld_opdr_key = rec.mld_opdr_key + AND fin_factuur_key NOT IN (rec.fin_factuur_key) + AND fin_factuur_nr = rec.factuurnr + AND fin_factuur_verwijder IS NULL ; + + IF v_count_gefactureerd_nr > 0 + THEN + + v_aanduiding_controle := 'CONTROLE - Hetzelfde factuur-nummer is al eerder geregistreerd op deze Opdracht' ; + v_controle := 1 ; + + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle); + + END IF; + + -- Voor opdrachten met 0-waarde zetten we de Controle, mits er op de Opdracht een REDEN is vermeld + IF v_bedrag_totaal = 0 + THEN + -- Eerst dus kijken of er bij opdracht een reden is vermeld + BEGIN + + SELECT MIN(ko.mld_kenmerkopdr_waarde) + INTO v_opdracht_0_reden + FROM mld_kenmerkopdr ko, mld_kenmerk k, mld_srtkenmerk sk + WHERE ko.mld_kenmerk_key = k.mld_kenmerk_key + AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key + AND sk.mld_srtkenmerk_upper = 'REDEN 0 ORDER' + AND k.mld_kenmerk_verwijder IS NULL AND sk.mld_srtkenmerk_verwijder IS NULL + AND ko.mld_opdr_key = rec.mld_opdr_key + AND ko.mld_kenmerkopdr_waarde IS NOT NULL + AND ko.mld_kenmerkopdr_verwijder IS NULL ; + EXCEPTION + WHEN NO_DATA_FOUND + THEN + v_opdracht_0_reden := NULL; + END; + + -- Zo ja, dan zetten we de controle + IF v_opdracht_0_reden IS NOT NULL + THEN + v_aanduiding_controle := 'CONTROLE – Bedrag van gekoppelde verplichting is 0,- euro en er is een REDEN ingevuld' ; + v_controle := 1 ; + + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle); + END IF; + + END IF; + + -- Specifiek voor SABIC-GENK - Altijd op controle omdat ze nog een PDF moeten opslaan + IF aaxx_get_user = 'SABIC' + THEN + + BEGIN + + SELECT d.alg_district_omschrijving + INTO v_sabic_genk + FROM mld_opdr o, mld_melding m, alg_locatie l, alg_district d + WHERE o.mld_melding_key = m.mld_melding_key + AND m.mld_alg_locatie_key = l.alg_locatie_key + AND l.alg_district_key = d.alg_district_key + AND d.alg_district_key = 61 -- SABIC-GENK + AND o.mld_opdr_key = rec.mld_opdr_key ; + EXCEPTION + WHEN NO_DATA_FOUND + THEN + v_sabic_genk := NULL; + END; + + IF v_sabic_genk IS NOT NULL + THEN + v_aanduiding_controle := 'CONTROLE - PDF opslaan voor SABIC GENK' ; + v_controle := 1 ; + + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle); + END IF; + + END IF; + + + END IF; + + -- Voor Bestelopdracht.. + IF rec.bes_bestelopdr_key IS NOT NULL + THEN + SELECT COALESCE(SUM (br.bes_bestelopdr_item_aantal * br.bes_bestelopdr_item_prijs), 0) bedrag_totaal, b.prs_bedrijf_key -- LETOP! Bedragen en BTW - check inclusief of Exclusief bij AAIT (via bes_bestelling_item)!!! + INTO v_bedrag_totaal, v_prs_bedrijf_key + FROM bes_bestelopdr b, bes_bestelopdr_item br + WHERE b.bes_bestelopdr_key = br.bes_bestelopdr_key + AND b.bes_bestelopdr_key = rec.bes_bestelopdr_key + GROUP BY b.prs_bedrijf_key; + + SELECT count(*) + INTO v_count_gefactureerd + FROM fin_factuur + WHERE bes_bestelopdr_key = rec.bes_bestelopdr_key + AND fin_factuur_verwijder IS NULL; + + IF v_count_gefactureerd > 1 + THEN + SELECT sum(fin_factuur_totaal) + INTO v_bedrag_gefactureerd + FROM fin_factuur f + WHERE f.bes_bestelopdr_key = rec.bes_bestelopdr_key + AND f.fin_factuur_key NOT IN (rec.fin_factuur_key) + AND f.fin_factuur_verwijder IS NULL ; + END IF; + + -- Als hetzelfde factuurnummer al vaker op deze opdracht is geregistreerd, dan moet deze factuur ter controle + SELECT count(*) + INTO v_count_gefactureerd_nr + FROM fin_factuur + WHERE bes_bestelopdr_key = rec.bes_bestelopdr_key + AND fin_factuur_key NOT IN (rec.fin_factuur_key) + AND fin_factuur_nr = rec.factuurnr + AND fin_factuur_verwijder IS NULL ; + + IF v_count_gefactureerd_nr > 0 + THEN + + v_aanduiding_controle := 'CONTROLE - Hetzelfde factuur-nummer is al eerder geregistreerd op deze Opdracht' ; + v_controle := 1 ; + + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle); + + END IF; + + -- Voor Bestelopdrachten met 0-waarde zetten we Controle + IF v_bedrag_totaal = 0 + THEN + + v_aanduiding_controle := 'CONTROLE - Bedrag van gekoppelde verplichting is 0,- euro' ; + v_controle := 1 ; + + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle); + + END IF; + + -- Specifiek voor SABIC-GENK - Altijd op controle omdat ze nog een PDF moeten opslaan + IF aaxx_get_user = 'SABIC' + THEN + + BEGIN + + SELECT d.alg_district_omschrijving + INTO v_sabic_genk + FROM bes_bestelopdr bo, mld_adres a, alg_locatie l, alg_district d + WHERE bo.mld_adres_key_lev = a.mld_adres_key + AND a.alg_locatie_key = l.alg_locatie_key + AND l.alg_district_key = d.alg_district_key + AND d.alg_district_key = 61 -- SABIC-GENK + AND bo.bes_bestelopdr_key = rec.bes_bestelopdr_key ; + EXCEPTION + WHEN NO_DATA_FOUND + THEN + v_sabic_genk := NULL; + END; + + IF v_sabic_genk IS NOT NULL + THEN + v_aanduiding_controle := 'CONTROLE - PDF opslaan voor SABIC GENK' ; + v_controle := 1 ; + + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle); + END IF; + + END IF; + + + END IF; + + -- Voor Contract.. + IF rec.cnt_contract_key IS NOT NULL + THEN + SELECT COALESCE(c.cnt_contract_kosten, 0), c.cnt_contract_termijnkosten, cs.ins_discipline_omschrijving, c.cnt_prs_bedrijf_key + INTO v_bedrag_totaal, v_bedrag_termijn, v_contractsoort, v_prs_bedrijf_key + FROM cnt_contract c, ins_tab_discipline cs + WHERE c.cnt_contract_key = rec.cnt_contract_key + AND c.ins_discipline_key = cs.ins_discipline_key AND cs.ins_discipline_module = 'CNT'; + + SELECT count(*) + INTO v_count_gefactureerd + FROM fin_factuur + WHERE cnt_contract_key = rec.cnt_contract_key + AND fin_factuur_verwijder IS NULL; + + IF v_count_gefactureerd > 1 + THEN + SELECT sum(fin_factuur_totaal) + INTO v_bedrag_gefactureerd + FROM fin_factuur f + WHERE f.cnt_contract_key = rec.cnt_contract_key + AND f.fin_factuur_key NOT IN (rec.fin_factuur_key) + AND f.fin_factuur_verwijder IS NULL ; + END IF; + + -- Als hetzelfde factuurnummer al vaker op deze opdracht is geregistreerd, dan moet deze factuur ter controle + SELECT count(*) + INTO v_count_gefactureerd_nr + FROM fin_factuur + WHERE cnt_contract_key = rec.cnt_contract_key + AND fin_factuur_key NOT IN (rec.fin_factuur_key) + AND fin_factuur_nr = rec.factuurnr + AND fin_factuur_verwijder IS NULL ; + + IF v_count_gefactureerd_nr > 0 + THEN + + v_aanduiding_controle := 'CONTROLE - Hetzelfde factuur-nummer is al eerder geregistreerd op deze Opdracht' ; + v_controle := 1 ; + + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle); + + END IF; + + -- Voor Contracten met 0-waarde zetten we Controle + IF v_bedrag_totaal = 0 + THEN + + v_aanduiding_controle := 'CONTROLE - Bedrag van gekoppelde verplichting is 0,- euro' ; + v_controle := 1 ; + + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle); + + END IF; + + -- Specifiek voor SABIC-GENK - Altijd op controle omdat ze nog een PDF moeten opslaan + IF aaxx_get_user = 'SABIC' + THEN + + BEGIN + + SELECT d.alg_district_omschrijving + INTO v_sabic_genk + FROM cnt_contract c, + (SELECT cl.cnt_contract_key, MAX(cl.alg_locatie_key) alg_locatie_key + FROM (SELECT cp.cnt_contract_key, cnt_alg_plaats_key alg_locatie_key + FROM cnt_contract_plaats cp + WHERE cnt_alg_plaats_code = 'L' + UNION + SELECT cp.cnt_contract_key, g.alg_locatie_key + FROM cnt_contract_plaats cp, alg_gebouw g + WHERE cnt_alg_plaats_code = 'G' + AND cp.cnt_alg_plaats_key = g.alg_gebouw_key + ) cl + GROUP BY cl.cnt_contract_key + ) cp, + alg_locatie l, alg_district d + WHERE c.cnt_contract_key = cp.cnt_contract_key + AND cp.alg_locatie_key = l.alg_locatie_key + AND l.alg_district_key = d.alg_district_key + AND d.alg_district_key = 61 -- SABIC-GENK + AND c.cnt_contract_key = rec.cnt_contract_key ; + EXCEPTION + WHEN NO_DATA_FOUND + THEN + v_sabic_genk := NULL; + END; + + IF v_sabic_genk IS NOT NULL + THEN + v_aanduiding_controle := 'CONTROLE - PDF opslaan voor SABIC GENK' ; + v_controle := 1 ; + + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle); + END IF; + END IF; + + + END IF; + + -- Bepalen of kenmerk LaatsteFactuur op JA(1) of op NEE(2) moet. Afgesproken methodiek: + -- Voor alle opdrachtsoorten Workorder/Opdrachten en Bestelopdrachten ALTIJD op laatste factuur JA (m.u.v. RABO), ook bij opdrachtwaarde 0,- + -- Voor alle andere andere opdrachtsoorten (en contract-facturen) en voor account RABO, volgende mechanisme: + --- Als procentuele afwijking tussen opdrachtwaarde en totaal_gefactureerd kleiner/gelijk aan 1% dan mag die op JA + --- Als opdrachtwaarde van het PROJECT is 0 dan laatste factuur op NEE + --- Als het een verzamelfactuur-indicatie heeft, dan ook op NEE + ---- Voor RABO geldt nog dat Workorders met opdrachtwaarde 0 ook op JA moeten komen + + IF (UPPER(v_ordersoort) IN ('WORKORDER', 'OPDRACHT') OR rec.bes_bestelopdr_key IS NOT NULL ) + AND aaxx_get_user NOT IN ('RABO') + THEN + + -- Zet kenmerk laatste factuur op Ja + INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde) + VALUES (rec.fin_factuur_key, 2, v_fac_usrdata_key_ja); + + ELSE + + -- Geen verzamelfactuur - check 1% regel + IF rec.kenmerk3 IS NULL + THEN + + IF v_bedrag_totaal <> 0 + THEN + + IF ((v_bedrag_totaal - (rec.fin_factuur_totaal + v_bedrag_gefactureerd))/ v_bedrag_totaal) * 100 <= 1 + THEN + -- Zet kenmerk laatste factuur op Ja + INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde) + VALUES (rec.fin_factuur_key, 2, v_fac_usrdata_key_ja); + + ELSE + -- Zet kenmerk laatste factuur op Nee + INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde) + VALUES (rec.fin_factuur_key, 2, v_fac_usrdata_key_nee); + + END IF; + END IF; + + IF v_bedrag_totaal = 0 AND INSTR(UPPER(v_ordersoort),'PROJECT')>0 + THEN + + INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde) + VALUES (rec.fin_factuur_key, 2, v_fac_usrdata_key_nee); + END IF; + + IF v_bedrag_totaal = 0 AND UPPER(v_ordersoort) IN ('WORKORDER', 'OPDRACHT') AND aaxx_get_user IN ('RABO') + THEN + + INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde) + VALUES (rec.fin_factuur_key, 2, v_fac_usrdata_key_ja); + END IF; + + + END IF; + + -- Wel verzamelfactuur -altijd op ja + IF rec.kenmerk3 IS NOT NULL + THEN + + INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde) + VALUES (rec.fin_factuur_key, 2, v_fac_usrdata_key_nee); + END IF; + + END IF; + + -- CREDITS - Deze moeten altijd op controle JA + -- Voor Contracten is dat hieronder bij Verdeelperiode-bepaling al ingeregeld. Voor Opdrachten/Bestellingen doen we dat hier + IF rec.fin_factuur_totaal < 0 AND (rec.bes_bestelopdr_key IS NOT NULL OR rec.mld_opdr_key IS NOT NULL) + THEN + + v_aanduiding_controle := 'CONTROLE - Credit geboekt op Opdracht/Bestelling' ; + v_controle := 1 ; + + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle); + + END IF; + + + -- Verdeelperiode voor de contracten bepalen - Daarvoor eerst nog diverse parameters te vullen + --- METHODE 1 - OUD : Op basis van het deel dat al op contract gefactureerd is, wordt de verdeelperiode op de factuur bepaald. + --- METHODE 2 - NIEUW : Op basis contractsoort CF en in voorgaande periode mits daarin minder dan 90% gefactureerd (herziening mei-2022 in opdracht van Siert Jan Bolt) + IF rec.cnt_contract_key IS NOT NULL + THEN + + SELECT SUBSTR(d.ins_discipline_omschrijving,1,2) cnt_soort, ROUND((c.cnt_contract_looptijd_tot - c.cnt_contract_looptijd_van)/30) cnt_looptijd_mnd, + fac.safe_to_number((TO_CHAR (c.cnt_contract_looptijd_van, 'yyyy'))) cnt_jaar_start, + fac.safe_to_number((TO_CHAR (c.cnt_contract_looptijd_tot, 'yyyy'))) cnt_jaar_eind, + fac.safe_to_number((TO_CHAR (c.cnt_contract_looptijd_van, 'mm'))) cnt_maand_start, + fac.safe_to_number((TO_CHAR (c.cnt_contract_looptijd_tot, 'mm'))) cnt_maand_eind, + t.cnt_termijn_type, t.cnt_termijn_aantal, + TO_NUMBER (TO_CHAR (SYSDATE, 'mm')) factuur_datum_boekmaand, + TO_NUMBER (TO_CHAR (SYSDATE, 'yyyy')) factuur_datum_boekmaand_jr + INTO v_cnt_soort, v_cnt_looptijd_mnd, v_cnt_jaar_start, v_cnt_jaar_eind, v_cnt_maand_start, v_cnt_maand_eind, v_cnt_termijn_type, v_cnt_termijn_aantal, v_factuur_datum_boekmaand, v_factuur_datum_boekmaand_jr + FROM cnt_contract c, cnt_termijn t, cnt_discipline d + WHERE c.cnt_contract_key = rec.cnt_contract_key + AND c.cnt_contract_termijntermijn = t.cnt_termijn_key (+) + AND c.ins_discipline_key = d.ins_discipline_key; + + + -- Bepalen of het een gebroken boekjaar is... + IF v_cnt_jaar_start <> v_cnt_jaar_eind + THEN + + v_gebroken_boekjaar := 1 ; + + END IF; + + -- Indien geen gebroken boekjaar, dan kunnen we als volgt verdeelperiode bepalen + IF v_gebroken_boekjaar = 0 + THEN + + -- METHODE 1: bepalen verdeelperiode adhv deel wat met de ingeboekte factuur op het gehele contract dan betaald is + IF v_bedrag_totaal >0 AND v_cnt_looptijd_mnd > 0 + THEN + v_cnt_deel_betaald_1 := (v_bedrag_gefactureerd / v_bedrag_totaal) * v_cnt_looptijd_mnd ; + v_cnt_deel_betaald_2 := ((v_bedrag_gefactureerd + rec.fin_factuur_totaal) / v_bedrag_totaal) * v_cnt_looptijd_mnd ; + + v_cnt_deel_betaald_tekst := TO_CHAR(ROUND((v_cnt_deel_betaald_2/v_cnt_looptijd_mnd)*100,2)) || '%' ; + + END IF; + + -- METHODE 2 + -- Nieuwe setting in 2022.1 (fin_defaultboekmaand_cnt) waarmee je met instelling 2 kunt afdwingen dat invoice-datum wordt gehanteerd voor bepaling boek-periode + -- Deze setting dient default op 2 te staan voor HEYDAY en daarmee worden in onderstaande uitwerking alle CF-contractn indien nodig aangepast en komen de CV's automatisch goed te staan. + -- 1. Facturen die na contractperiode worden geboekt moeten altijd op de laatste periode uit contract + -- 2. Facturen op CF-contracten die in de contractperiode geboekt worden, moeten op voorgaande verdeelperiode komen, mits daar nog niet meer dan 90% qua facturatie op voldaan is. + -- 3. Credit-facturen moeten altijd op de laatste geboekt verdeelperiode komen, inclusief controle + -- 4. Alle overige contract-facturen komen met de fin_defaultboekmaand_cnt op 2 dus altijd op verdeelperiode die overeenkomt met de factuurdatum (dit is voor CV's de HEYDAY-regel) + + -- default + v_fin_factuur_boekmaand_2 := 'nvt' ; + + -- Wat is de laatst gehanteerde fin_factuur_boekmaand? + SELECT MAX(f.fin_factuur_boekmaand) + INTO v_fin_factuur_boekmaand_laatst + FROM fin_factuur f + WHERE cnt_contract_key = rec.cnt_contract_key AND fin_factuur_boekmaand IS NOT NULL AND fin_factuur_key NOT IN (rec.fin_factuur_key) AND fin_factuur_verwijder IS NULL ; + + IF v_fin_factuur_boekmaand_laatst IS NULL THEN v_fin_factuur_boekmaand_laatst := 'geen'; END IF ; + + -- Voor zowel CF en CV: Factuur in 2022-januari op contract met einddatum 2021-dec moet op laatste boekmaand van contract, dus 2021-12 + --- NOG NETJES 100% INPASSEN!!! - Moet ook werken voor contract die op 2022-04 afloopt en op 2022-06 nog factuur volgt! + --- Daarvoor de PERIODES omzetten naar tekst-string format "jaar-mnd" + v_cnt_maand_eind_tekst := TO_CHAR(v_cnt_maand_eind) ; + v_factuur_datum_boekmaand_nu := TO_CHAR(v_factuur_datum_boekmaand); + -- 9 moet 09 worden + IF LENGTH (v_cnt_maand_eind_tekst) = 1 THEN v_cnt_maand_eind_tekst := '0' || v_cnt_maand_eind_tekst ; END IF; + IF LENGTH (v_factuur_datum_boekmaand_nu) = 1 THEN v_factuur_datum_boekmaand_nu := '0' || v_factuur_datum_boekmaand_nu ; END IF; + -- + v_cnt_eind := TO_CHAR(v_cnt_jaar_eind) || '-' || v_cnt_maand_eind_tekst ; + v_factuur_boekmaand := TO_CHAR(v_factuur_datum_boekmaand_jr) || '-' || v_factuur_datum_boekmaand_nu ; + + IF v_factuur_boekmaand > v_cnt_eind --v_factuur_datum_boekmaand_jr > v_cnt_jaar_eind + THEN + v_fin_factuur_boekmaand_2 := v_cnt_jaar_eind || '-' || v_cnt_maand_eind_tekst ; + + -- wegschrijven in fin_factuur_boekmaand + UPDATE fin_factuur + SET fin_factuur_boekmaand = v_fin_factuur_boekmaand_2 + WHERE fin_factuur_key = rec.fin_factuur_key ; + + END IF; + + IF v_cnt_looptijd_mnd > 0 + THEN + v_cnt_maandbedrag := ROUND(v_bedrag_totaal / v_cnt_looptijd_mnd,2) ; + END IF; + + -- Voor DEBET-facturen - CF die qua inlees-datum binnen contract valt, moet op voorgaande boekmaand gezet worden, mits daarop minder dan 90% al op is gefactureerd + IF v_cnt_soort = 'CF' + -- AND (v_factuur_datum_boekmaand_jr >= v_cnt_jaar_start AND v_factuur_datum_boekmaand_jr <= v_cnt_jaar_eind) + AND v_factuur_boekmaand <= v_cnt_eind + AND v_factuur_datum_boekmaand > 1 AND v_bedrag_totaal >0 AND v_cnt_looptijd_mnd > 0 AND rec.fin_factuur_totaal > 0 + THEN + + v_cnt_maandbedrag := ROUND(v_bedrag_totaal / v_cnt_looptijd_mnd,2) ; + v_factuur_datum_boekmaand_prev := TO_CHAR(v_factuur_datum_boekmaand -1) ; + + -- 9 moet 09 worden + IF LENGTH (v_factuur_datum_boekmaand_prev) = 1 THEN v_factuur_datum_boekmaand_prev := '0' || v_factuur_datum_boekmaand_prev ; END IF; + v_factuur_datum_boekmaand_nu := TO_CHAR(v_factuur_datum_boekmaand); + IF LENGTH (v_factuur_datum_boekmaand_nu) = 1 THEN v_factuur_datum_boekmaand_nu := '0' || v_factuur_datum_boekmaand_nu ; END IF; + + -- Bepalen bedrag in vorige periode al gefactureerd + SELECT COALESCE(sum(f.fin_factuur_totaal),0) + INTO v_gefactureerd_vorige_maand + FROM fin_factuur f + WHERE cnt_contract_key = rec.cnt_contract_key + AND fin_factuur_boekmaand IS NOT NULL + AND fin_factuur_key NOT IN (rec.fin_factuur_key) + AND fin_factuur_verwijder IS NULL + AND fin_factuur_boekmaand = TO_CHAR(v_factuur_datum_boekmaand_jr) || '-' || v_factuur_datum_boekmaand_prev ; + + -- Dus als inleesactie op 2022-4 EN totaal gefactureerd voor 2022-3 is al >90% , dan de factuur niet op 2022-3 maar op 2022-4 zetten incl controle + IF (ROUND(v_gefactureerd_vorige_maand/v_cnt_maandbedrag,2)*100) > 90 + THEN + v_fin_factuur_boekmaand_2 := TO_CHAR(v_factuur_datum_boekmaand_jr) || '-' || v_factuur_datum_boekmaand_nu; + + -- incl controle (voor paar omgevingen niet nodig + v_aanduiding_controle := 'CONTROLE - Contract CF en 90% al gefactureerd in voorgaande periode' ; + + IF aaxx_get_user NOT IN ('SMKA', 'ESSENT') + THEN + v_controle := 1 ; + + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle); + END IF; + + ELSE + v_fin_factuur_boekmaand_2 := TO_CHAR(v_factuur_datum_boekmaand_jr) || '-' || v_factuur_datum_boekmaand_prev; + + END IF; + + -- wegschrijven van de hierboven bepaalde boekmaand + IF v_fin_factuur_boekmaand_2 <> 'nvt' + THEN + + UPDATE fin_factuur + SET fin_factuur_boekmaand = v_fin_factuur_boekmaand_2 + WHERE fin_factuur_key = rec.fin_factuur_key ; + END IF; + + END IF; + + -- Voor CREDITS altijd op controle JA + kijken of het op de laatste boekmaand geboekt kan worden + IF rec.fin_factuur_totaal < 0 + THEN + + v_aanduiding_controle := 'CONTROLE - Credit geboekt op Contract in voorgaande periode' ; + v_controle := 1 ; + + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle); + + -- kijken of we de boekmaand op de laatste gehanteerde boekmaand kunnen zetten (hierboven reeds bepaald) + IF v_fin_factuur_boekmaand_laatst <> 'geen' + THEN + + UPDATE fin_factuur + SET fin_factuur_boekmaand = v_fin_factuur_boekmaand_laatst + WHERE fin_factuur_key = rec.fin_factuur_key ; + + END IF; + END IF; + + -- wegschrijven van de uitleg tav de bepaling van de boekmaand in een kenmerkveld + v_fin_factuur_boekmaand_tekst := 'Type: ' || v_cnt_soort || '. Contractduur: ' || TO_CHAR(v_cnt_looptijd_mnd) || ' mnd. Contractbedrag: ' || TO_CHAR(v_bedrag_totaal) || ' Hoogste boekmnd: ' || v_fin_factuur_boekmaand_laatst || chr(10) || chr(13) + || 'Deel nu betaald: ' || v_cnt_deel_betaald_tekst || ' (correspondeert met verdeelperiode ' || TO_CHAR(ROUND(v_cnt_deel_betaald_2,2)) || ')' || chr(10) || chr(13) + || 'BEPALING HEYDAY CF: ' || 'Maandbedrag: ' || TO_CHAR(v_cnt_maandbedrag) || ' Gefactureerd vorige maand ' || TO_CHAR(v_gefactureerd_vorige_maand) || ' (' || TO_CHAR(ROUND(v_gefactureerd_vorige_maand/v_cnt_maandbedrag,2)*100) || '%)' || ' Verdeelperiode bepaald:' || v_fin_factuur_boekmaand_2 ; + INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde) + VALUES (rec.fin_factuur_key, c_kenmerk_key_boekmaand, SUBSTR(v_fin_factuur_boekmaand_tekst,1,1000)); + + + -- gebroken boekjaar = 1 + ELSE + -- Gebroken boekjaren zouden bij HEYDAY niet (veel) voorkomen, bij uitzondering. + -- De bepaling van verdeelperiode hebben we bij aanvang factuurscanning 2021-okt dan ook niet uitgewerkt. + -- Indien wel relevant dan hieronder dan dus nog verder UITWERKEN. + -- Voor nu zetten we facturen op contracten met gebroken boekjaar altijd op CONTROLE + ---- Voorbeeld GEBROKEN BOEKJAAR en verdeelperiodes: + ---- Contractperiode: 2020 - oktober t/m 2021 - maart = 6 maanden + ---- Verdeelperiodes zijn: 2020-1, 2020-2, 2020-3, 2021-1, 2021-2, 2021-3 + + -- wegschrijven van de bepaling in een kenmerkveld en controle zetten + v_fin_factuur_boekmaand_tekst := 'Gebroken boekjaar - (nog) geen automatische bepaling verdeelperiode' ; + INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde) + VALUES (rec.fin_factuur_key, c_kenmerk_key_boekmaand, SUBSTR(v_fin_factuur_boekmaand_tekst,1,1000)); + + v_aanduiding_controle := 'CONTROLE - Contract met gebroken boekjaar en dus (nog) geen automatische bepaling verdeelperiode' ; + v_controle := 1 ; + + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle); + + + END IF; + + -- Tot slot nog voor facturen op CO's van vorig boekjaar ook nog op CONTROLE zetten + IF v_cnt_jaar_eind < c_huidig_jaar + THEN + + v_aanduiding_controle := 'CONTROLE - Betreft factuur op Contract uit vorig boekjaar' ; + v_controle := 1 ; + + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle); + + END IF; + + END IF; + + + -- Veld debiteurnummer nog vullen indien gevuld bij relatie + IF v_klantnummer_key IS NOT NULL + THEN + + -- Waarde ophalen met v_prs_bedrijf_key en vullen in v_klantnummer + SELECT MAX(prs_kenmerklink_waarde) + INTO v_klantnummer + FROM prs_kenmerklink + WHERE prs_kenmerk_key = v_klantnummer_key AND prs_link_key = v_prs_bedrijf_key AND prs_kenmerklink_verwijder IS NULL; + + -- Indien waarde dan vullen in inkoopfactuur veld debiteurnummer + IF v_klantnummer IS NOT NULL + THEN + + UPDATE fin_factuur + SET fin_factuur_debiteur_nr = v_klantnummer + WHERE fin_factuur_key = rec.fin_factuur_key ; + + END IF; + END IF; + + -- Voor Contracten geldt dat ze nog ter controle moeten als er automatisch een hoogste contractversie-nummer gekoppeld wordt + IF rec.kenmerk2 = 'ter controle' + THEN + + v_aanduiding_controle := 'CONTROLE - Contract is op factuur zonder versie-nummer weergegeven; hoogste versienr is gekoppeld' ; + v_controle := 1 ; + + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle); + + END IF; + + -- Als het de verzamelfactuurinidcatie "(*)" heeft dan het daarvoor bestemd kenmerk vullen + controle zetten + IF rec.kenmerk3 = 'verzamelfactuur' + THEN + + INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde) + VALUES (rec.fin_factuur_key, c_kenmerk_key_verzamel, 1); + + v_aanduiding_controle := 'CONTROLE - Dit betreft een verzamelfactuur' ; + v_controle := 1 ; + + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle); + + END IF; + + -- Tot slot controle-vinkje zetten indien nodig + -- 9-2-2022 - aanpassing/verzoek HEYDAY om de facturen die op controle moeten komen ook de factuurstatus incomplete. + --- Reden is om op die manier er voor te zorgen dat de goedkeuringsflow (fiatteur) niet parallel loopt met de Administratieve controle. + IF v_controle = 1 + THEN + + INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde) + VALUES (rec.fin_factuur_key, c_kenmerk_key_controle, 1); + + UPDATE fin_factuur + SET fin_factuur_statuses_key = 3, + fin_factuur_opmerking = 'Correct verwerkt, maar op Administratieve controle - zie logging voor detailinfo' + WHERE fin_factuur_key = rec.fin_factuur_key ; + + + END IF; + + END IF; + + -- Incomplete facturen, zonder orderreferentie, gaan we ook op controle zetten + IF (rec.mld_opdr_key IS NULL AND rec.cnt_contract_key IS NULL AND rec.bes_bestelopdr_key IS NULL) + THEN + + v_aanduiding_controle := 'CONTROLE - Factuur incompleet i.v.m. ontbrekende orderreferentie (vanuit scanning)' ; + v_controle := 1 ; + + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle); + + + INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde) + VALUES (rec.fin_factuur_key, c_kenmerk_key_controle, 1); + + END IF; + + -- tot slot nog nette logging + v_aanduiding := 'Factuur geimporteerd vanuit Mareon' ; + fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding); + + END; + END LOOP; + +EXCEPTION + WHEN OTHERS + THEN + -- ROLLBACK; + oracle_err_num := SQLCODE; + oracle_err_mes := SUBSTR (SQLERRM, 1, 100); + + v_errormsg := + 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; + + SELECT MAX(i.fin_factuur_key) fin_factuur_key, 'Betreft factuur_key ' || TO_CHAR(i.fin_factuur_key) ||' - Factuurnr ' || i.factuurnr + INTO v_fin_factuur_key, v_errorhint + FROM fac_imp_factuur i, fin_factuur f + WHERE i.fac_import_key = p_import_key + AND i.fin_factuur_key = f.fin_factuur_key (+) + GROUP BY i.fin_factuur_key, 'Betreft factuur_key ' || TO_CHAR(i.fin_factuur_key) ||' - Factuurnr ' || i.factuurnr ; + + IF v_fin_factuur_key IS NOT NULL + THEN + + UPDATE fin_factuur + SET fin_factuur_statuses_key = 3, + fin_factuur_opmerking = SUBSTR('Bij factuurimport is volgende Errormessage gemeld: ' || v_errormsg || CHR (13) || CHR (10) || + 'Actie 1: Informeren Facilitor' || CHR (13) || CHR (10) || + 'Actie 2: Factuur gewoon oppakken: Aanvullen, doorzetten, etc', 1, 250) + WHERE fin_factuur_key = v_fin_factuur_key ; + + v_aanduiding := 'Factuur geimporteerd vanuit Mareon' ; + fac.trackaction ('FINUPD', v_fin_factuur_key, 4, NULL, v_aanduiding); + + END IF; + + fac.imp_writelog (p_import_key, + 'E', + v_errormsg, + v_errorhint || ' - ' || v_aanduiding); + COMMIT; + + +END; +/ + + +------ payload end ------ + +SET DEFINE OFF +BEGIN adm.systrackscriptId ('$Id$', 1); END; +/ + +COMMIT; +SET ECHO OFF +SPOOL OFF +SET DEFINE ON +PROMPT Logfile of this upgrade is: &fcltlogfile \ No newline at end of file