YAXX#88424 Proces rond goedkeuring bij facturen aangepast.

svn path=/Customer/trunk/; revision=69627
This commit is contained in:
Arthur Egberink
2025-07-02 11:46:02 +00:00
parent d2c460207a
commit f03c60712e

View File

@@ -723,69 +723,120 @@ AS
v_regio_key alg_regio.alg_regio_key%TYPE;
v_funccodegk_kenmerk_key fin_kenmerk.fin_kenmerk_key%TYPE;
v_kenmerk_fg alg_onrgoedkenmerk.alg_onrgoedkenmerk_waarde%TYPE;
v_contract_key NUMBER(10);
v_factmatchmode mld_disc_params.mld_disc_params_factmatchmode%TYPE;
v_factuurappr mld_disc_params.mld_disc_params_factuurappr%TYPE;
v_geleverd NUMBER(1);
v_contract_mngr_key NUMBER(10);
v_factuur_match NUMBER(10);
v_funccodegk VARCHAR2(10);
v_new_funccodegk VARCHAR2(10);
v_ggk_bedrag NUMBER(12,2);
v_errormsg VARCHAR2 (1000);
v_errorhint VARCHAR2 (1000);
v_opdr_key NUMBER(10);
v_bestelopdr_key NUMBER(10);
v_contract_key NUMBER(10);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
BEGIN
-- Om foutmeldingen te voorkomen controleren we eerst of er wel een verplichting gekoppeld is.
SELECT count(*)
INTO v_count
SELECT mld_opdr_key, cnt_contract_key, bes_bestelopdr_key
INTO v_opdr_key, v_contract_key, v_bestelopdr_key
FROM fin_factuur f
WHERE f.fin_factuur_key = p_factuur_key
AND ( f.mld_opdr_key IS NOT NULL
OR f.cnt_contract_key IS NOT NULL
OR f.bes_bestelopdr_key IS NOT NULL);
WHERE f.fin_factuur_key = p_factuur_key;
IF v_count = 0
IF v_opdr_key IS NULL AND v_contract_key IS NULL AND v_bestelopdr_key IS NULL
THEN
RETURN;
END IF;
-- Nu bepalen we de locatie van de factuur. Adh daarvan kunnen we bepalen wie hier rechten op heeft.
v_errorhint := 'Bepaal locatie.';
SELECT l.alg_locatie_key, d.alg_regio_key
INTO v_locatie_key, v_regio_key
FROM ( SELECT fc.fin_factuur_key, MIN (cs.cnt_alg_plaats_key) alg_gebouw_key
FROM fin_factuur fc, cnt_contract_plaats cs
WHERE fc.cnt_contract_key = cs.cnt_contract_key
AND cnt_alg_plaats_code = 'G'
AND cnt_contract_plaats_verwijder IS NULL
GROUP BY fc.fin_factuur_key
UNION ALL
SELECT fo.fin_factuur_key, og.alg_gebouw_key
FROM fin_factuur fo,
mld_opdr o1,
mld_melding m1,
alg_v_allonroerendgoed og
WHERE fo.mld_opdr_key = o1.mld_opdr_key
AND o1.mld_melding_key = m1.mld_melding_key
AND m1.mld_alg_onroerendgoed_keys = og.alg_onroerendgoed_keys
UNION ALL
SELECT fb.fin_factuur_key, MIN (g1.alg_gebouw_key) alg_gebouw_key
FROM fin_factuur fb,
bes_bestelopdr_item boi,
bes_bestelling_item bi,
bes_bestelling b,
alg_gebouw g1
WHERE fb.bes_bestelopdr_key = boi.bes_bestelopdr_key
AND boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key
AND bi.bes_bestelling_key = b.bes_bestelling_key
AND b.mld_adres_key_lev = g1.mld_adres_key
GROUP BY fb.fin_factuur_key) fg,
alg_gebouw g,
alg_locatie l,
alg_district d
WHERE fg.alg_gebouw_key = g.alg_gebouw_key
AND g.alg_locatie_key = l.alg_locatie_key
AND l.alg_district_key = d.alg_district_key
AND fg.fin_factuur_key = p_factuur_key;
-- xxx_disc_params_factuurappr = 1 factuur automatisch fiatteren als binnen
-- xxx_disc_params_factmatchmode = 2 of 3 weg matching. Contracten kent deze optie niet dus altijd 2 weg.
IF v_contract_key IS NOT NULL
THEN
SELECT l.alg_locatie_key, d.alg_regio_key, cnt_disc_params_factuurappr, 2 cnt_disc_params_factmatchmode, 1 geleverd
INTO v_locatie_key, v_regio_key, v_factuurappr, v_factmatchmode, v_geleverd
FROM (
SELECT fc.fin_factuur_key, MIN (cs.cnt_alg_plaats_key) alg_gebouw_key, MIN(dp.cnt_disc_params_factuurappr) cnt_disc_params_factuurappr
FROM fin_factuur fc, cnt_contract_plaats cs, cnt_contract c, cnt_disc_params dp
WHERE fc.cnt_contract_key = cs.cnt_contract_key
AND fc.cnt_contract_key = c.cnt_contract_key
AND c.ins_discipline_key = dp.cnt_ins_discipline_key
AND cnt_alg_plaats_code = 'G'
AND cnt_contract_plaats_verwijder IS NULL
GROUP BY fc.fin_factuur_key
) fg,
alg_gebouw g,
alg_locatie l,
alg_district d
WHERE fg.alg_gebouw_key = g.alg_gebouw_key
AND g.alg_locatie_key = l.alg_locatie_key
AND l.alg_district_key = d.alg_district_key
AND fg.fin_factuur_key = p_factuur_key;
END IF;
IF v_bestelopdr_key IS NOT NULL
THEN
SELECT l.alg_locatie_key, d.alg_regio_key, bes_disc_params_factuurappr, bes_disc_params_factmatchmode, DECODE(bes_bestelopdr_status, 6, 1, 7, 1, 0) geleverd -- 6 Geleverd, 7 verwerkt
INTO v_locatie_key, v_regio_key, v_factuurappr, v_factmatchmode, v_geleverd
FROM (
SELECT fb.fin_factuur_key, MIN (g1.alg_gebouw_key) alg_gebouw_key, MIN(dp.bes_disc_params_factuurappr) bes_disc_params_factuurappr, bes_disc_params_factmatchmode, bes_bestelopdr_status
FROM fin_factuur fb,
bes_bestelopdr_item boi,
bes_bestelling_item bi,
bes_bestelling b,
bes_bestelopdr bo,
bes_srtdeel sd,
bes_srtgroep sg,
bes_disc_params dp,
alg_gebouw g1
WHERE fb.bes_bestelopdr_key = boi.bes_bestelopdr_key
AND fb.bes_bestelopdr_key = bo.bes_bestelopdr_key
AND boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key
AND bi.bes_bestelling_key = b.bes_bestelling_key
AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
AND sg.ins_discipline_key = dp.bes_ins_discipline_key
AND b.mld_adres_key_lev = g1.mld_adres_key
GROUP BY fb.fin_factuur_key, bo.bes_bestelopdr_status
) fg,
alg_gebouw g,
alg_locatie l,
alg_district d
WHERE fg.alg_gebouw_key = g.alg_gebouw_key
AND g.alg_locatie_key = l.alg_locatie_key
AND l.alg_district_key = d.alg_district_key
AND fg.fin_factuur_key = p_factuur_key;
END IF;
IF v_opdr_key IS NOT NULL
THEN
SELECT l.alg_locatie_key, d.alg_regio_key, mld_disc_params_factuurappr, mld_disc_params_factmatchmode, DECODE(mld_statusopdr_key, 6, 1, 7, 1, 8, 1, 0) -- 6 afgemeld, 7 verwerkt, 8 afgerond
INTO v_locatie_key, v_regio_key, v_factuurappr, v_factmatchmode, v_geleverd
FROM (
SELECT fo.fin_factuur_key, og.alg_gebouw_key, mld_disc_params_factuurappr, mld_disc_params_factmatchmode, o1.mld_statusopdr_key
FROM fin_factuur fo,
mld_opdr o1,
mld_melding m1,
mld_stdmelding std,
mld_disc_params dp,
alg_v_allonroerendgoed og
WHERE fo.mld_opdr_key = o1.mld_opdr_key
AND o1.mld_melding_key = m1.mld_melding_key
AND m1.mld_alg_onroerendgoed_keys = og.alg_onroerendgoed_keys
AND m1.mld_stdmelding_key = std.mld_stdmelding_key
AND std.mld_ins_discipline_key = dp.mld_ins_discipline_key
) fg,
alg_gebouw g,
alg_locatie l,
alg_district d
WHERE fg.alg_gebouw_key = g.alg_gebouw_key
AND g.alg_locatie_key = l.alg_locatie_key
AND l.alg_district_key = d.alg_district_key
AND fg.fin_factuur_key = p_factuur_key;
END IF;
v_errorhint := 'Bepaal de instelling of we gaan goedkeuren op deze locatie.';
BEGIN
@@ -801,20 +852,6 @@ AS
v_kenmerk_fg := 0;
END;
-- Als er een match was op de factuur hoeven we niets te doen. We laten alleen facturen goedkeuren als er een mismatch
-- in het verplichtingsbedrag is en het factuurbedrag.
IF vbxx.matchfactuur(p_factuur_key) <> -1 AND v_kenmerk_fg = 1 -- Als de factuur matched en 'Facturen zonder afwijking automatisch goedkeuren' staat aan bij de regio
THEN
UPDATE fin_factuur
SET fin_factuur_statuses_key = 5
WHERE fin_factuur_key = p_factuur_key;
-- Voeg tracking toe dat de factuur automatisch is goedgekeurd.
fac.trackaction('FINGOE', p_factuur_key, NULL, NULL, NULL);
RETURN;
END IF;
v_errorhint := 'Bepaal factuurbedrag en goedkeurder.';
-- De goedkeurder gebruiken we later om te kijken of deze de factuur al heeft goedgekeurd
SELECT f.fin_factuur_statuses_key, f.fin_factuur_totaal, f.prs_perslid_key_goedkeur, f.cnt_contract_key, c.prs_perslid_key_eig
@@ -823,6 +860,41 @@ AS
WHERE f.cnt_contract_key = c.cnt_contract_key(+)
AND fin_factuur_key = p_factuur_key;
v_factuur_match := vbxx.matchfactuur(p_factuur_key);
fac.writelog ('VBXX.fin_set_approver', 'I', 'Fact: ' || p_factuur_key || ' v_factuurappr: ' || v_factuurappr || ' v_factmatchmode: ' || v_factmatchmode || ' v_geleverd: ' || v_geleverd, NULL);
-- geen goedkeuring nodig
IF v_kenmerk_fg = 1 AND v_factuur_match <> -1 -- Als de factuur matched en 'Facturen zonder afwijking automatisch goedkeuren' staat aan bij de regio
THEN
IF v_factuurappr = 1 AND (v_factmatchmode = 2 OR (v_factmatchmode = 3 AND v_geleverd = 1))
THEN
-- geen goedkeuring nodig
UPDATE fin_factuur
SET fin_factuur_statuses_key = 6
WHERE fin_factuur_key = p_factuur_key;
-- Voeg tracking toe dat de factuur automatisch is goedgekeurd.
fac.trackaction('FINGOE', p_factuur_key, NULL, NULL, NULL);
RETURN;
ELSE
IF v_factuur_statuses_key = 5 -- Ter goedkeuring
THEN
-- factuur is gefiatteerd en er is geen goedkeuring nodig
UPDATE fin_factuur
SET fin_factuur_statuses_key = 6 -- Akkoord
WHERE fin_factuur_key = p_factuur_key;
-- Voeg tracking toe dat de factuur automatisch is goedgekeurd.
fac.trackaction('FINGOE', p_factuur_key, NULL, NULL, NULL);
RETURN;
ELSIF v_factuur_statuses_key = 6 -- Akkoord
THEN
-- als de status van de factuur al akkoord is dan hoeven we niets meer te doen aangezien we bij
-- de regio al bepaald hebben dat er geen goedkeuring hoeft plaats te vinden.
RETURN;
END IF;
END IF;
END IF;
-- Bij contracten gaat deze eerst langs de contract eigenaar.
-- Nu kijken we of deze wel rechten op FINGOE heeft. Anders kan deze niet de goedkeurder worden.
-- Dan volgen we maar het normale pad en moet de Facility manager goedkeuren.
@@ -1268,7 +1340,7 @@ AS
|| c_key
|| ' in periode '
|| factuurboekmaand);
-- factuurschemabedrag is nu null
-- factuurschemabedrag is nu NULL
END;
-- waren er niet al facturen voor dezelfde periode en komt het totaal er met deze dan niet overheen?
@@ -1714,9 +1786,9 @@ AS
NULL)
sla_respijturen,
CASE WHEN m1.mld_melding_spoed = 3 THEN std1.mld_stdmelding_t_accepttijd
WHEN m1.mld_melding_spoed = 1 then std1.mld_stdmelding_t_accept_pr1
WHEN m1.mld_melding_spoed = 1 then std1.mld_stdmelding_t_accept_pr2
WHEN m1.mld_melding_spoed = 1 then std1.mld_stdmelding_t_accept_pr4
WHEN m1.mld_melding_spoed = 1 THEN std1.mld_stdmelding_t_accept_pr1
WHEN m1.mld_melding_spoed = 1 THEN std1.mld_stdmelding_t_accept_pr2
WHEN m1.mld_melding_spoed = 1 THEN std1.mld_stdmelding_t_accept_pr4
END sla_accpt,
--m.mld_melding_datum datum,
CASE WHEN std1.mld_stdmelding_planbaar = 2
@@ -4934,7 +5006,7 @@ BEGIN
fac.trackaction ('FINVER', rec1.fin_factuur_key, v_aanvrager, NULL, NULL);
-- als opdrachtkey is not null
-- als opdrachtkey IS NOT NULL
IF rec1.mld_opdr_key IS NOT NULL
THEN
SELECT mld_statusopdr_key
@@ -5150,7 +5222,7 @@ AS
AND sk.mld_srtkenmerk_code = 'TYPEFACTUUR'
AND k.mld_kenmerk_verwijder IS NULL
AND FAC.safe_to_number (ko.mld_kenmerkopdr_waarde) = fac_usrdata_key) tf,
(SELECT ko.mld_opdr_key, null bedrag
(SELECT ko.mld_opdr_key, NULL bedrag
FROM mld_kenmerkopdr ko,
mld_kenmerk k,
mld_srtkenmerk sk,
@@ -5744,12 +5816,13 @@ IS
END;
BEGIN
v_errorhint := 'Zoek de persoon van de import: ' || p_import_key;
SELECT prs_perslid_key
INTO v_perslid_key
FROM fac_import
WHERE fac_import_key = p_import_key;
v_errorhint := 'Voorbereiding 0: ' || p_import_key;
-- Voor draaien standaard factuur-update gaan we eerst op fac_imp_factuur een aantal correcties doorvoeren
FOR rec IN ccor_0
LOOP
@@ -5762,6 +5835,7 @@ BEGIN
END;
END LOOP;
v_errorhint := 'Voorbereiding 1: ' || p_import_key;
FOR rec IN ccor_0_1
LOOP
BEGIN
@@ -5773,6 +5847,7 @@ BEGIN
END;
END LOOP;
v_errorhint := 'Voorbereiding 2: ' || p_import_key;
FOR rec IN ccor_0_2
LOOP
BEGIN
@@ -5784,6 +5859,7 @@ BEGIN
END;
END LOOP;
v_errorhint := 'Voorbereiding 3: ' || p_import_key;
FOR rec IN ccor_3
LOOP
BEGIN
@@ -5810,6 +5886,7 @@ BEGIN
END;
END LOOP;
v_errorhint := 'Voorbereiding 4: ' || p_import_key;
FOR rec IN ccor_4
LOOP
BEGIN
@@ -5825,10 +5902,11 @@ BEGIN
END;
END LOOP;
v_errorhint := 'Update factuur: ' || p_import_key;
-- Nu kunnen we de standaard FCLT verwerk import facturen draaien
fac_update_factuur (p_import_key);
v_errorhint := 'Bepalen kenmerk factuurbestand: ' || p_import_key;
-- CUST: post processing voor verwerking van het PDF document
SELECT MIN (fin_kenmerk_key)
INTO c_kenmerk_key_bijlage
@@ -5836,6 +5914,7 @@ BEGIN
WHERE fin_kenmerk_code = 'FACTUURBESTAND'
AND fin_kenmerk_verwijder IS NULL;
v_errorhint := 'Bepalen kenmerk gebouw bij factuurregel: ' || p_import_key;
-- CUST: Voor vullen van het gebouwkenmerk op factuurregelniveau
SELECT MIN (fin_kenmerk_key)
INTO c_kenmerk_key_gebouw
@@ -5844,6 +5923,7 @@ BEGIN
AND fin_kenmerk_verwijder IS NULL;
-- We gaan nu beginnen met het verder verwerken van de factuur..
v_errorhint := 'Verwerken factuurgegevens: ' || p_import_key;
FOR rec IN cfactuur
LOOP
BEGIN
@@ -5972,7 +6052,7 @@ BEGIN
IF COALESCE(UPPER(REPLACE(rec.kenmerk12, ' ')), 'QueQeLeQue') <> UPPER(REPLACE(v_bedrijf_iban, ' '))
THEN
-- dan gaan we ook de iban controleren
v_aanduiding_controle := 'ERROR: IBAN komt niet overeen!' ;
v_aanduiding_controle := 'ERROR: IBAN van de factuur: ' || UPPER(REPLACE(rec.kenmerk12, ' ')) || ' komt niet overeen met IBAN bij leverancier: ' || UPPER(REPLACE(v_bedrijf_iban, ' ')) || '!' ;
track_error (v_aanduiding_controle, POWER(2,6), rec.fin_factuur_key, v_perslid_key);
END IF;
END IF;
@@ -5998,19 +6078,19 @@ BEGIN
AND f.fin_factuur_key <> rec.fin_factuur_key;
-- Nu we er toch zijn gaan we controleren of driewegmatching aanstaat voor de vakgroep.
SELECT mld_disc_params_factmatchmode, mld_statusopdr_key
INTO v_factmatchmode, v_statusopdr_key
FROM mld_disc_params dp, mld_stdmelding std, mld_melding m, mld_opdr o
WHERE o.mld_opdr_key = rec.mld_opdr_key
AND o.mld_melding_key = m.mld_melding_key
AND m.mld_stdmelding_key = std.mld_stdmelding_key
AND std.mld_ins_discipline_key = dp.mld_ins_discipline_key;
IF v_factmatchmode = 3 AND v_statusopdr_key IN (1,2,3,4,5,8,10) -- afgewezen, niet akkoord, ter fiattering, gefiatteerd, toegekend, geaccepteerd, tergoedkeuring
THEN
v_aanduiding_controle := 'ERROR: 3 weg matching maar verplichting niet afgemeld.' ;
track_error (v_aanduiding_controle, POWER(2,1024), rec.fin_factuur_key, v_perslid_key);
END IF;
-- SELECT mld_disc_params_factmatchmode, mld_statusopdr_key
-- INTO v_factmatchmode, v_statusopdr_key
-- FROM mld_disc_params dp, mld_stdmelding std, mld_melding m, mld_opdr o
-- WHERE o.mld_opdr_key = rec.mld_opdr_key
-- AND o.mld_melding_key = m.mld_melding_key
-- AND m.mld_stdmelding_key = std.mld_stdmelding_key
-- AND std.mld_ins_discipline_key = dp.mld_ins_discipline_key;
--
-- IF v_factmatchmode = 3 AND v_statusopdr_key IN (1,2,3,4,5,8,10) -- afgewezen, niet akkoord, ter fiattering, gefiatteerd, toegekend, geaccepteerd, tergoedkeuring
-- THEN
-- v_aanduiding_controle := 'ERROR: 3 weg matching maar verplichting niet afgemeld.' ;
-- track_error (v_aanduiding_controle, POWER(2,10), rec.fin_factuur_key, v_perslid_key);
-- END IF;
END IF;
IF rec.bes_bestelopdr_key IS NOT NULL