AAIT#67042 -- Factuurverwerking via Mareonplatform - Aanpassingen Factuur-import

svn path=/Customer/trunk/; revision=53509
This commit is contained in:
Jos Migo
2021-10-27 20:16:58 +00:00
parent a925776621
commit ebb6948d60

View File

@@ -11859,18 +11859,46 @@ 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.
CURSOR ccorrectie
--- 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 inkoopinterface in gaat.
--- 4. Orderreferentie-opschoning: Vanuit scanning komt de orderreferentie soms mee inclusief 'extra tekst'. Bijv CO284INT of CO534.7HEERLEN. Voor goede verwerking gaan we de tekst achteraan de orderreferentie weghalen.
CURSOR ccor_1
IS
SELECT fin_factuur_key, 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
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)
;
AND LENGTH(SUBSTR(ordernr,1,(INSTR(ordernr,'/')-1))) IN (6,7) ;
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' ;
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;
CURSOR ccor_4
IS
SELECT factuurnr, ordernr
FROM fac_imp_factuur
WHERE fac_import_key = p_import_key
AND REGEXP_INSTR(REVERSE(ordernr), '\d') > 1 ;
CURSOR cfactuur
IS
SELECT i.fin_factuur_key, i.kenmerk1, 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
SELECT i.fin_factuur_key, i.kenmerk1, i.kenmerk2, 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
@@ -11897,28 +11925,51 @@ IS
v_bestelsoort VARCHAR2 (200);
v_klantnummer_key NUMBER(10);
v_klantnummer VARCHAR2 (200);
v_contract_versies NUMBER(10);
c_kenmerk_key_controle 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);
-- Verdeelperiode voor de contracten gaan bepalen
v_cnt_jaar_start NUMBER(10);
v_cnt_jaar_eind NUMBER(10);
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_verdeelperiode_1 VARCHAR(2) := '01'; -- Hoogste boekmaand waarop is geboekt
v_verdeelperiode_2 VARCHAR(2); -- Boekmaand waarop de mareon-factuur geboekt moet worden
v_count_verdeelperiode_1 NUMBER(10);
v_fin_factuur_boekmaand VARCHAR(7); -- De nieuwe boekmaand op de geimporteerde Mareon-factuur
c_kenmerk_key_boekmaand NUMBER(10);
v_cnt_termijn_type VARCHAR(1);
v_cnt_termijn_aantal NUMBER(3);
BEGIN
-- Hier voor de update eerst nog een prefix "O" voor de opdrachtreferentie zetten indien kolom ORDERNR is 6- of 7 cijferig en dan '/' en dan numeriek 1 t/m 3 posities.
---- WANT in FUNCTION try_getopdracht_id gaat Facilitor alleen maar opdrachten matchen als er 1,2 of 3 letters voorstaan...
---- Voorbeeld: Bijv: 104370/2 vanuit BCT wordt O104370/2
FOR rec IN ccorrectie
-- Voor draaien standaard factuur-update gaan we eerst op fac_imp_factuur een aantal correcties doorvoeren
FOR rec IN ccor_1
LOOP
BEGIN
-- check of je er een 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"
IF rec.melding_key IS NOT NULL and rec.opdracht_volgnr IS NOT NULL THEN
-- 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;
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
@@ -11933,6 +11984,56 @@ BEGIN
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 = SUBSTR(ordernr,1,LENGTH(ordernr)-(REGEXP_INSTR(REVERSE(ordernr), '\d')-1))
WHERE fac_import_key = p_import_key ;
END;
END LOOP;
-- Nu kunnne we de standaard FCLT verwerk import facturen draaien
fac_update_factuur (p_import_key);
@@ -11942,14 +12043,58 @@ BEGIN
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_kenmerktype = c_kenmerk_key_soort
AND fin_kenmerk_verwijder IS NULL;
-- Klantnummer - Kenmerk_key ophalen
-- 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 DEZE TIJDELIJK EVEN IN EEN KENMERKVELD VULLEN - ALS DIT GOED GAAT, DAN DIRECT DE FACTUUR UPDATEN
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: 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
FOR rec IN cfactuur
LOOP
@@ -11989,7 +12134,7 @@ BEGIN
END IF;
-- Als er een ref-key gekoppeld is, dan gaan we de waarde van deze verplichting ophalen
-- Als er een ref-key gekoppeld is, dan gaan we o.a. de waarde van deze verplichting ophalen
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;
@@ -12000,8 +12145,8 @@ BEGIN
-- Voor Opdracht..
IF rec.mld_opdr_key IS NOT NULL
THEN
SELECT o.mld_opdr_kosten, ot.mld_typeopdr_omschrijving, o.mld_uitvoerende_keys
INTO v_bedrag_totaal, v_ordersoort, v_prs_bedrijf_key
SELECT o.mld_opdr_kosten, 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;
@@ -12009,7 +12154,8 @@ BEGIN
SELECT count(*)
INTO v_count_gefactureerd
FROM fin_factuur
WHERE mld_opdr_key = rec.mld_opdr_key;
WHERE mld_opdr_key = rec.mld_opdr_key
AND fin_factuur_verwijder IS NULL;
IF v_count_gefactureerd > 1
THEN
@@ -12017,29 +12163,56 @@ BEGIN
INTO v_bedrag_gefactureerd
FROM fin_factuur f
WHERE f.mld_opdr_key = rec.mld_opdr_key
-- AND NOT EXISTS
-- (SELECT 1
-- FROM fin_factuur ff
-- WHERE ff.fin_factuur_key = rec.fin_factuur_key) ;
AND f.fin_factuur_key NOT IN (rec.fin_factuur_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 := 'Deze factuur is ingeboekt terwijl de Opdracht al op VERWERKT staat. Controleer of dit klopt' ;
v_controle := 1 ;
fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle);
END IF;
-- Als de 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 := 'Dit zelfde factuur-nummer is al eerder geregistreerd op deze Opdracht. Controleer of dit klopt' ;
v_controle := 1 ;
fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle);
END IF;
END IF;
-- Voor Bestelopdracht..
IF rec.bes_bestelopdr_key IS NOT NULL
THEN
SELECT SUM (br.bes_bestelopdr_item_aantal * br.bes_bestelopdr_item_prijs) bedrag_totaal, b.prs_bedrijf_key -- LETOP! Bedragen & BTW - check inclusief of Exclusief bij AAIT (via bes_bestelling_item)!!!
SELECT SUM (br.bes_bestelopdr_item_aantal * br.bes_bestelopdr_item_prijs) 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.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;
WHERE bes_bestelopdr_key = rec.bes_bestelopdr_key
AND fin_factuur_verwijder IS NULL;
IF v_count_gefactureerd > 1
THEN
@@ -12047,7 +12220,26 @@ BEGIN
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_key NOT IN (rec.fin_factuur_key)
AND f.fin_factuur_verwijder IS NULL ;
END IF;
-- Als de 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 := 'Dit zelfde factuur-nummer is al eerder geregistreerd op deze Opdracht. Controleer of dit klopt' ;
v_controle := 1 ;
fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle);
END IF;
END IF;
@@ -12064,7 +12256,8 @@ BEGIN
SELECT count(*)
INTO v_count_gefactureerd
FROM fin_factuur
WHERE cnt_contract_key = rec.cnt_contract_key;
WHERE cnt_contract_key = rec.cnt_contract_key
AND fin_factuur_verwijder IS NULL;
IF v_count_gefactureerd > 1
THEN
@@ -12072,17 +12265,30 @@ BEGIN
INTO v_bedrag_gefactureerd
FROM fin_factuur f
WHERE f.cnt_contract_key = rec.cnt_contract_key
-- AND NOT EXISTS
-- (SELECT 1
-- FROM fin_factuur ff
-- WHERE ff.fin_factuur_key = rec.fin_factuur_key) ;
AND f.fin_factuur_key NOT IN (rec.fin_factuur_key) ;
AND f.fin_factuur_key NOT IN (rec.fin_factuur_key)
AND f.fin_factuur_verwijder IS NULL ;
END IF;
-- Als de 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 := 'Dit zelfde factuur-nummer is al eerder geregistreerd op deze Opdracht. Controleer of dit klopt' ;
v_controle := 1 ;
fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle);
END IF;
END IF;
-- Bepalen of kenmerk LaatsteFactuur op JA(1) of op NEE(2) moet
---- LET OP! Nog inpassen Opdrachttype = "Voor alle ordersoorten eindfactuur standaard JA, behalve voor projecten (PR + M), dan standaard op NEE"
IF v_bedrag_totaal <= rec.fin_factuur_totaal + v_bedrag_gefactureerd
@@ -12090,16 +12296,101 @@ BEGIN
-- Zet kenmerk laatste factuur op Ja
v_errormsg := '(0x143d)'; -- WEL of NIET errormsg goed inpassen...
INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde)
VALUES (rec.fin_factuur_key, 2, DECODE(aaxx_get_user, 'SABIC', 24, 1));
VALUES (rec.fin_factuur_key, 2, v_fac_usrdata_key_ja);
ELSE
-- Zet kenmerk laatste factuur op Nee
v_errormsg := '(0x143d)';
INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde)
VALUES (rec.fin_factuur_key, 2, DECODE(aaxx_get_user, 'SABIC', 25, 2));
VALUES (rec.fin_factuur_key, 2, v_fac_usrdata_key_nee);
END IF;
-- Verdeelperiode voor de contracten bepalen - Daarvoor eerst nog diverse parameters te vullen
IF rec.cnt_contract_key IS NOT NULL
THEN
SELECT 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_tot, 'yyyy'))) cnt_jaar_start,
fac.safe_to_number((TO_CHAR (c.cnt_contract_looptijd_van, 'yyyy'))) cnt_jaar_eind,
t.cnt_termijn_type, t.cnt_termijn_aantal
INTO v_cnt_looptijd_mnd, v_cnt_jaar_start, v_cnt_jaar_eind, v_cnt_termijn_type, v_cnt_termijn_aantal
FROM cnt_contract c, cnt_termijn t
WHERE c.cnt_contract_key = rec.cnt_contract_key
AND c.cnt_contract_termijntermijn = t.cnt_termijn_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
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_verdeelperiode_2 := TO_CHAR(FLOOR(v_cnt_deel_betaald_2)) ;
-- 9 moet 09 worden
IF LENGTH (v_verdeelperiode_2) = 1 THEN v_verdeelperiode_2 := '0' || v_verdeelperiode_2 ; END IF;
-- De huidige hoogste boekmaand ophalen
SELECT count(*)
INTO v_count_verdeelperiode_1
FROM fin_factuur
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) ;
IF v_count_verdeelperiode_1 > 0
THEN
SELECT TO_CHAR(MAX(fac.safe_to_number(SUBSTR(f.fin_factuur_boekmaand, 6))))
INTO v_verdeelperiode_1
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) ;
END IF;
-- boekmaand nieuwe factuur bepalen
---- Deze moet groter of gelijk zijn aan de maximale verdeelperiode EN is kleiner of gelijk aan v_cnt_looptijd_mnd
IF fac.safe_to_number(v_verdeelperiode_2) >= fac.safe_to_number(v_verdeelperiode_1) AND fac.safe_to_number(v_verdeelperiode_2) <= v_cnt_looptijd_mnd
THEN
-- Credit altijd in laatste boekmaand opnemen
IF rec.fin_factuur_totaal < 0 THEN v_fin_factuur_boekmaand := v_cnt_jaar_start || '-' || v_verdeelperiode_1; END IF;
IF rec.fin_factuur_totaal > 0 THEN v_fin_factuur_boekmaand := v_cnt_jaar_start || '-' || v_verdeelperiode_2; END IF;
-- wegschrijven in een kenmerkveld
INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde)
VALUES (rec.fin_factuur_key, c_kenmerk_key_boekmaand, v_fin_factuur_boekmaand);
-- anders klopt het niet..
ELSE
v_aanduiding_controle := 'Verdeelperiode voor Contract kan niet goed bepaald worden. Controleer deze' ;
v_controle := 1 ;
fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle);
END IF;
-- gebroken boekjaar = 1
ELSE
-- NOG UITWERKEN - Voorbeeld:
--- Contractperiode: 2020 - oktober t/m 2021 - maart = 6 maanden
--- Verdeelperiodes zijn: 2020-1, 2020-2, 2020-3, 2021-1, 2021-2, 2021-3
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 ;
END IF;
END IF;
-- Veld debiteurnummer nog vullen indien gevuld bij relatie
IF v_klantnummer_key IS NOT NULL
@@ -12121,8 +12412,30 @@ BEGIN
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 := 'Contract is op factuur zonder versie-nummer weergegeven. Hoogste versienr is gekoppeld. Controleer of dit klopt' ;
v_controle := 1 ;
fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding_controle);
END IF;
-- tot slot controle-vinkje zetten indien nodig
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);
END IF;
-- tot slot nog nette logging
v_aanduiding := 'Mareon-factuurimport: Voor deze verplichting de ' || TO_CHAR(v_count_gefactureerd) || 'e factuur.' ;
fac.trackaction ('FINUPD', rec.fin_factuur_key, 4, NULL, v_aanduiding);
@@ -19446,6 +19759,10 @@ AS
v_result NUMBER;
v_factuur_key fin_factuur.fin_factuur_key%TYPE;
v_kenmerk_key fin_kenmerk.fin_kenmerk_key%TYPE;
v_fac_usrdata_key_ja NUMBER(10);
v_fac_usrdata_key_nee NUMBER(10);
BEGIN
errormsg := '(0x143)';
@@ -19514,9 +19831,22 @@ BEGIN
INTO v_factuur_key;
-- Zet kenmerk laatste factuur op Ja
-- Ophalen key-waarde Ja 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
errormsg := '(0x143d)';
INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde)
VALUES (v_factuur_key, 2, DECODE(aaxx_get_user, 'SABIC', 24, 1));
VALUES (v_factuur_key, 2, v_fac_usrdata_key_ja);
-- Bepaal de key van de bijlages
errormsg := '(0x143e)';