VLKC#39450 factuurmatching voor C en O ook indien incl BTW

svn path=/Database/trunk/; revision=34860
This commit is contained in:
Peter Feij
2017-08-08 17:14:02 +00:00
parent 4dfb5d38dc
commit 9f0ec9a0c8

View File

@@ -289,30 +289,31 @@ AS
-- -1 factuur niet (automatisch) goed
-- 0 niks van te zeggen of reeds goed-/afgekeurd/verwerkt
-- 1 factuur okay
ftype VARCHAR2 (1);
c_key fin_factuur.cnt_contract_key%TYPE;
b_key fin_factuur.bes_bestelopdr_key%TYPE;
o_key fin_factuur.mld_opdr_key%TYPE;
factuurstatus fin_factuur.fin_factuur_statuses_key%TYPE;
factuurdatum fin_factuur.fin_factuur_datum%TYPE;
factuurboekmaand fin_factuur.fin_factuur_boekmaand%TYPE;
discipline ins_tab_discipline.ins_discipline_key%TYPE;
factmatchmode mld_disc_params.mld_disc_params_factmatchmode%TYPE;
korting bes_bestelopdr.bes_bestelopdr_korting%TYPE;
levkosten bes_bestelopdr.bes_bestelopdr_levkosten%TYPE;
contracttermijnkosten cnt_contract.cnt_contract_termijnkosten%TYPE;
factuurschemabedrag cnt_factuurschema.cnt_factuurschema_bedrag%TYPE;
contractkosten cnt_contract.cnt_contract_kosten%TYPE;
opdrachtkosten mld_opdr.mld_opdr_kosten%TYPE;
matchtype mld_typeopdr.mld_typeopdr_matchtype%TYPE;
factuurbedrag NUMBER (12, 2);
bestelbedrag NUMBER (12, 2); -- van de opdracht waar deze factuur over gaat
totaalgefactureerd NUMBER (12, 2); -- met deze factuur erbij eerder gefactureerd van dezelfde B(R)OC
totaaltermijngefactureerd NUMBER (12, 2); -- met deze factuur erbij eerder gefactureerd van dezelfde C igv factuurschema-gebruik
totaalgefactureerdbtw NUMBER (12, 2);
opdrstatus mld_opdr.mld_statusopdr_key%TYPE;
retval NUMBER := 0;
inclbtw NUMBER := 0;
ftype VARCHAR2 (1);
c_key fin_factuur.cnt_contract_key%TYPE;
b_key fin_factuur.bes_bestelopdr_key%TYPE;
o_key fin_factuur.mld_opdr_key%TYPE;
factuurstatus fin_factuur.fin_factuur_statuses_key%TYPE;
factuurdatum fin_factuur.fin_factuur_datum%TYPE;
factuurboekmaand fin_factuur.fin_factuur_boekmaand%TYPE;
discipline ins_tab_discipline.ins_discipline_key%TYPE;
factmatchmode mld_disc_params.mld_disc_params_factmatchmode%TYPE;
korting bes_bestelopdr.bes_bestelopdr_korting%TYPE;
levkosten bes_bestelopdr.bes_bestelopdr_levkosten%TYPE;
contracttermijnkosten cnt_contract.cnt_contract_termijnkosten%TYPE;
factuurschemabedrag cnt_factuurschema.cnt_factuurschema_bedrag%TYPE;
contractkosten cnt_contract.cnt_contract_kosten%TYPE;
opdrachtkosten mld_opdr.mld_opdr_kosten%TYPE;
matchtype mld_typeopdr.mld_typeopdr_matchtype%TYPE;
factuurbedrag NUMBER (12, 2);
bestelbedrag NUMBER (12, 2); -- van de opdracht waar deze factuur over gaat
totaalgefactureerd NUMBER (12, 2); -- met deze factuur erbij eerder gefactureerd van dezelfde B(R)OC
totaaltermijngefactureerd NUMBER (12, 2); -- met deze factuur erbij eerder gefactureerd van dezelfde C igv factuurschema-gebruik
totaaltermijngefactureerdbtw NUMBER (12, 2); -- met deze factuur erbij eerder gefactureerd van dezelfde C igv factuurschema-gebruik
totaalgefactureerdbtw NUMBER (12, 2);
opdrstatus mld_opdr.mld_statusopdr_key%TYPE;
retval NUMBER := 0;
inclbtw NUMBER := 0;
-- Bepaal te tolerantie van de vakgroep
-- waarschijnlijk in procenten of zo?
-- of geven we de factuurwaarde mee en leveren we true/false op?
@@ -331,24 +332,24 @@ AS
DBMS_OUTPUT.put_line ('\nfactuurkey: ' || pfactuur_key);
SELECT mld_opdr_key,
cnt_contract_key,
bes_bestelopdr_key,
fin_factuur_totaal,
fin_factuur_statuses_key,
fin_factuur_datum,
fin_factuur_boekmaand
INTO o_key,
c_key,
b_key,
factuurbedrag,
factuurstatus,
factuurdatum,
factuurboekmaand
FROM fin_factuur
WHERE fin_factuur_key = pfactuur_key;
SELECT mld_opdr_key,
cnt_contract_key,
bes_bestelopdr_key,
fin_factuur_totaal,
fin_factuur_statuses_key,
fin_factuur_datum,
fin_factuur_boekmaand
INTO o_key,
c_key,
b_key,
factuurbedrag,
factuurstatus,
factuurdatum,
factuurboekmaand
FROM fin_factuur
WHERE fin_factuur_key = pfactuur_key;
IF factuurstatus <> 2 -- is al verwerkt, matching zinloos
IF factuurstatus <> 2 -- is al verwerkt, matching zinloos
THEN
DBMS_OUTPUT.put_line ('STOP, factuurstatus: ' || factuurstatus);
RETURN 0;
@@ -370,25 +371,28 @@ AS
-- en het totaal met de eerder bestellingfacturen ook,
-- waarbij afhankelijk van 2-weg/3-weg wordt geteld.
-- Dat moeten we dus eerst bepalen
SELECT MAX (isg.ins_discipline_key)
INTO discipline
FROM bes_bestelopdr_item boi, bes_bestelling_item bbi, bes_srtdeel isd, bes_srtgroep isg
WHERE isd.bes_srtgroep_key = isg.bes_srtgroep_key
AND bbi.bes_srtdeel_key = isd.bes_srtdeel_key
AND boi.bes_bestelopdr_item_key = bbi.bes_bestelopdr_item_key
AND boi.bes_bestelopdr_key = b_key;
SELECT MAX (isg.ins_discipline_key)
INTO discipline
FROM bes_bestelopdr_item boi,
bes_bestelling_item bbi,
bes_srtdeel isd,
bes_srtgroep isg
WHERE isd.bes_srtgroep_key = isg.bes_srtgroep_key
AND bbi.bes_srtdeel_key = isd.bes_srtdeel_key
AND boi.bes_bestelopdr_item_key = bbi.bes_bestelopdr_item_key
AND boi.bes_bestelopdr_key = b_key;
factmatchmode := fin.getfactmatchmode (discipline, 'B');
-- Zijn de bestelbedragen incl. of excl. BTW.
SELECT MAX((SELECT ks.prs_kostensoort_btw
FROM prs_kostensoort ks
WHERE ks.prs_kostensoort_key = COALESCE(bsg.prs_kostensoort_key, bd.prs_kostensoort_key)))
SELECT MAX( (SELECT ks.prs_kostensoort_btw
FROM prs_kostensoort ks
WHERE ks.prs_kostensoort_key =
COALESCE (bsg.prs_kostensoort_key, bd.prs_kostensoort_key)))
INTO inclbtw
FROM bes_discipline bd,
bes_srtgroep bsg
FROM bes_discipline bd, bes_srtgroep bsg
WHERE bd.ins_discipline_key = bsg.ins_discipline_key
AND bd.ins_discipline_key = discipline;
AND bd.ins_discipline_key = discipline;
-- Bereken dan nu de voor de matching relevante bedragen
-- Voor bestellingen nemen we de INKOOPPRIJS (het is immers een factuur die wij ontvangen)
@@ -397,44 +401,52 @@ AS
CASE
WHEN factmatchmode = 2
THEN
SELECT SUM(boi.bes_bestelopdr_item_aantal * COALESCE (boi.bes_bestelopdr_item_inkprijs, boi.bes_bestelopdr_item_prijs)),
MAX(COALESCE (bo.bes_bestelopdr_korting, 0)),
MAX(COALESCE (bo.bes_bestelopdr_levkosten, 0))
SELECT SUM(boi.bes_bestelopdr_item_aantal
* COALESCE (boi.bes_bestelopdr_item_inkprijs,
boi.bes_bestelopdr_item_prijs)),
MAX (COALESCE (bo.bes_bestelopdr_korting, 0)),
MAX (COALESCE (bo.bes_bestelopdr_levkosten, 0))
INTO bestelbedrag, korting, levkosten
FROM bes_bestelopdr_item boi, bes_bestelling_item bbi, bes_bestelopdr bo
WHERE boi.bes_bestelopdr_item_key = bbi.bes_bestelopdr_item_key
WHERE boi.bes_bestelopdr_item_key = bbi.bes_bestelopdr_item_key
AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key
AND bo.bes_bestelopdr_status NOT IN (1, 3, 8) -- als die maar niet afgewezen/geannuleerd is
AND boi.bes_bestelopdr_key = b_key;
WHEN factmatchmode = 3
THEN
SELECT SUM(boi.bes_bestelopdr_item_aantal * COALESCE (boi.bes_bestelopdr_item_inkprijs, boi.bes_bestelopdr_item_prijs)),
MAX(COALESCE (bo.bes_bestelopdr_korting, 0)),
MAX(COALESCE (bo.bes_bestelopdr_levkosten, 0))
SELECT SUM(boi.bes_bestelopdr_item_aantal
* COALESCE (boi.bes_bestelopdr_item_inkprijs,
boi.bes_bestelopdr_item_prijs)),
MAX (COALESCE (bo.bes_bestelopdr_korting, 0)),
MAX (COALESCE (bo.bes_bestelopdr_levkosten, 0))
INTO bestelbedrag, korting, levkosten
FROM bes_bestelopdr_item boi, bes_bestelling_item bbi, bes_bestelopdr bo
WHERE boi.bes_bestelopdr_item_key = bbi.bes_bestelopdr_item_key
WHERE boi.bes_bestelopdr_item_key = bbi.bes_bestelopdr_item_key
AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key
AND boi.bes_bestelopdr_item_status IN (6, 7) -- alleen de geleverde regels meetellen
AND boi.bes_bestelopdr_key = b_key;
END CASE;
bestelbedrag := bestelbedrag - korting + levkosten; -- Bedragen zijn excl. BTW?
bestelbedrag := bestelbedrag - korting + levkosten; -- Bedragen zijn excl. BTW?
SELECT SUM (fin_factuur_totaal), SUM(fin_factuur_totaal_btw)
INTO totaalgefactureerd, totaalgefactureerdbtw
FROM fin_factuur
WHERE bes_bestelopdr_key = b_key
AND fin_factuur_statuses_key <> 1
AND fin_factuur_verwijder IS NULL
AND fin_factuur_datum <= factuurdatum;
SELECT SUM (fin_factuur_totaal), SUM (fin_factuur_totaal_btw)
INTO totaalgefactureerd, totaalgefactureerdbtw
FROM fin_factuur
WHERE bes_bestelopdr_key = b_key
AND fin_factuur_statuses_key <> 1
AND fin_factuur_verwijder IS NULL
AND fin_factuur_datum <= factuurdatum;
IF inclbtw = 1 -- Artikelen zijn al inclusief, dan ook maar factuur inclusief matchen
IF inclbtw = 1 -- Artikelen zijn al inclusief, dan ook maar factuur inclusief matchen
THEN
totaalgefactureerd := totaalgefactureerd + totaalgefactureerdbtw;
DBMS_OUTPUT.put_line ('Inclusief BTW');
totaalgefactureerd := totaalgefactureerd + totaalgefactureerdbtw;
END IF;
IF fin.tolerantiematch (discipline, ftype, totaalgefactureerd, bestelbedrag) = 1
IF fin.tolerantiematch (discipline,
ftype,
totaalgefactureerd,
bestelbedrag) = 1
THEN
retval := 1;
ELSE
@@ -448,6 +460,15 @@ AS
-- om te beginnen zit deze factuur per definitie in deze termijn (welke dan ook)
totaaltermijngefactureerd := factuurbedrag;
-- Zijn deze contractbedragen incl. of excl. BTW.
SELECT MAX( (SELECT ks.prs_kostensoort_btw
FROM prs_kostensoort ks
WHERE ks.prs_kostensoort_key =
COALESCE (c.prs_kostensoort_key, cd.prs_kostensoort_key)))
INTO inclbtw
FROM cnt_discipline cd, cnt_contract c
WHERE cd.ins_discipline_key = c.ins_discipline_key AND c.cnt_contract_key = c_key;
-- Controle op termijn bedrag en totaal, je kunt discussieren of _verwijder moet worden gecontroleerd.
BEGIN
SELECT c.cnt_contract_termijnkosten, c.cnt_contract_kosten, c.ins_discipline_key
@@ -469,19 +490,7 @@ AS
FROM cnt_factuurschema s
WHERE s.cnt_factuurschema_boekmaand = factuurboekmaand
AND s.cnt_contract_key = c_key;
-- Ok, er is dus een factuurschema-bedrag voor deze periode: dan controleren:
-- waren er niet al facturen voor dezelfde periode en komt het totaal er met deze dan niet overheen?
SELECT SUM (fin_factuur_totaal) -- Excl. BTW
INTO totaaltermijngefactureerd
FROM fin_factuur
WHERE cnt_contract_key = c_key
AND fin_factuur_statuses_key <> 1
AND fin_factuur_verwijder IS NULL
AND fin_factuur_datum <= factuurdatum
AND fin_factuur_boekmaand = factuurboekmaand;
-- totaaltermijngefactureerd is dus voor deze periode inclusief deze nieuwe, dus
-- dus mogelijk hoger dan deze ene factuur
-- Ok, er is dus een factuurschema-bedrag voor deze periode: dan controleren:
EXCEPTION
WHEN NO_DATA_FOUND
THEN
@@ -492,16 +501,42 @@ AS
-- factuurschemabedrag is nu null
END;
-- LET OP: contractbedragen worden altijd excl. BTW. verondersteld
-- Zou hier horen, maar we doen er toch niks mee: factmatchmode := fin.getfactmatchmode (discipline, 'C');
SELECT SUM (fin_factuur_totaal) -- Excl. BTW
INTO totaalgefactureerd
-- waren er niet al facturen voor dezelfde periode en komt het totaal er met deze dan niet overheen?
SELECT SUM (fin_factuur_totaal), SUM (fin_factuur_totaal_btw)
INTO totaaltermijngefactureerd, totaaltermijngefactureerdbtw
FROM fin_factuur
WHERE cnt_contract_key = c_key
AND fin_factuur_statuses_key <> 1
AND fin_factuur_verwijder IS NULL
AND fin_factuur_datum <= factuurdatum
AND fin_factuur_boekmaand = factuurboekmaand;
-- totaaltermijngefactureerd(btw) is dus voor deze periode inclusief deze nieuwe, dus
-- dus mogelijk hoger dan deze ene factuur
-- We doen er toch niks mee: factmatchmode := fin.getfactmatchmode (discipline, 'C');
-- hoeveel is er met deze factuur erbij totaal voor dit contract gefactureerd
SELECT SUM (fin_factuur_totaal), SUM (fin_factuur_totaal_btw)
INTO totaalgefactureerd, totaalgefactureerdbtw
FROM fin_factuur
WHERE cnt_contract_key = c_key
AND fin_factuur_statuses_key <> 1
AND fin_factuur_verwijder IS NULL
AND fin_factuur_datum <= factuurdatum;
DBMS_OUTPUT.put_line ('Totaal gefactureerd: ' || totaalgefactureerd);
DBMS_OUTPUT.put_line ('Totaal gefactureerd periode: ' || totaaltermijngefactureerd);
IF inclbtw = 1 -- Contractbedragen zijn al inclusief, dan ook factuur inclusief matchen
THEN
DBMS_OUTPUT.put_line ('Inclusief BTW');
totaalgefactureerd := totaalgefactureerd + totaalgefactureerdbtw; -- inclusief BTW
totaaltermijngefactureerd := totaaltermijngefactureerd + totaaltermijngefactureerdbtw; -- deze periode(maand) incl. BTW
DBMS_OUTPUT.put_line ('Totaal gefactureerd: ' || totaalgefactureerd);
DBMS_OUTPUT.put_line ('Totaal gefactureerd periode: ' || totaaltermijngefactureerd);
END IF;
IF totaalgefactureerd <=
contractkosten + fac.safe_to_number (fac.getsetting ('cnt_factuur_totaalmarge'))
AND fin.tolerantiematch (discipline,
@@ -520,25 +555,52 @@ AS
THEN
-- controleer op basis van typeopdr.matchtype
BEGIN
SELECT o.mld_opdr_kosten, sm.mld_ins_discipline_key, top.mld_typeopdr_matchtype, o.mld_statusopdr_key
INTO opdrachtkosten, discipline, matchtype, opdrstatus
FROM mld_opdr o, mld_melding m, mld_typeopdr top, mld_stdmelding sm
WHERE o.mld_melding_key = m.mld_melding_key
AND m.mld_stdmelding_key = sm.mld_stdmelding_key
AND o.mld_typeopdr_key = top.mld_typeopdr_key
AND top.mld_typeopdr_kosten = 1 -- daar mag een factuur bij
AND mld_statusopdr_key NOT IN (1, 2, 3, 10) -- dat zijn (nog) ongeldige opdrachten
AND mld_opdr_key = o_key;
SELECT o.mld_opdr_kosten,
sm.mld_ins_discipline_key,
top.mld_typeopdr_matchtype,
o.mld_statusopdr_key
INTO opdrachtkosten,
discipline,
matchtype,
opdrstatus
FROM mld_opdr o,
mld_melding m,
mld_typeopdr top,
mld_stdmelding sm
WHERE o.mld_melding_key = m.mld_melding_key
AND m.mld_stdmelding_key = sm.mld_stdmelding_key
AND o.mld_typeopdr_key = top.mld_typeopdr_key
AND top.mld_typeopdr_kosten = 1 -- daar mag een factuur bij
AND mld_statusopdr_key NOT IN (1, 2, 3, 10) -- dat zijn (nog) ongeldige opdrachten
AND mld_opdr_key = o_key;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
DBMS_OUTPUT.put_line ('Bijbehorende opdracht(status/kosten?) is ongeldig: ' || o_key);
DBMS_OUTPUT.put_line (
'Bijbehorende opdracht(status/kosten?) is ongeldig: ' || o_key);
RETURN -1;
END;
DBMS_OUTPUT.put_line ('opdrachtkosten: ' || opdrachtkosten);
DBMS_OUTPUT.put_line ('matchtype: ' || matchtype);
DBMS_OUTPUT.put_line ('opdrstatus: ' || opdrstatus);
SELECT MAX( (SELECT ks.prs_kostensoort_btw
FROM prs_kostensoort ks
WHERE ks.prs_kostensoort_key =
COALESCE (o.prs_kostensoort_key,
stdm.prs_kostensoort_key,
md.prs_kostensoort_key)))
INTO inclbtw
FROM mld_discipline md,
mld_opdr o,
mld_stdmelding stdm,
mld_melding m
WHERE md.ins_discipline_key = stdm.mld_ins_discipline_key
AND o.mld_melding_key = m.mld_melding_key
AND m.mld_stdmelding_key = stdm.mld_stdmelding_key
AND mld_opdr_key = o_key;
factmatchmode := fin.getfactmatchmode (discipline, 'O');
-- Een opdracht is maar 1 ding, dus die status bepaalt al veel bij 3-weg
@@ -554,17 +616,24 @@ AS
RETURN 0;
END IF;
-- LET OP: opdrachtbedragen worden altijd excl. BTW. verondersteld
SELECT SUM (fin_factuur_totaal), SUM (fin_factuur_totaal_btw)
INTO totaalgefactureerd, totaalgefactureerdbtw
FROM fin_factuur
WHERE mld_opdr_key = o_key
AND fin_factuur_statuses_key <> 1
AND fin_factuur_verwijder IS NULL
AND fin_factuur_datum <= factuurdatum;
SELECT SUM (fin_factuur_totaal) -- Excl. BTW
INTO totaalgefactureerd
FROM fin_factuur
WHERE mld_opdr_key = o_key
AND fin_factuur_statuses_key <> 1
AND fin_factuur_verwijder IS NULL
AND fin_factuur_datum <= factuurdatum;
IF inclbtw = 1 -- Opdrachtbedragen zijn dus inclusief, dan ook factuur inclusief matchen
THEN
DBMS_OUTPUT.put_line ('Inclusief BTW');
totaalgefactureerd := totaalgefactureerd + totaalgefactureerdbtw;
END IF;
IF fin.tolerantiematch (discipline, ftype, totaalgefactureerd, opdrachtkosten) = 1
IF fin.tolerantiematch (discipline,
ftype,
totaalgefactureerd,
opdrachtkosten) = 1
THEN
retval := 1;
ELSE