YASK#88710 Initiële versie van de importfunctie.

svn path=/Customer/trunk/; revision=68941
This commit is contained in:
Arthur Egberink
2025-05-08 08:29:57 +00:00
parent 42a48309e9
commit 84bd7a6976

View File

@@ -6391,6 +6391,461 @@ EXCEPTION
END;
/
--
-- Import van RB facturen mbt gladheidsbestrijding
--
-- Opbouw van het bestand is:
--Bijlage voor facturatie;;;;;;
--;;;;;;
--Februari 2025 Week 6 t/m 9;;;Week 6;Week 7;Week 8;Totaal
--;;;;;;Totaal
--PRP nummer;Plaats;Straat;;;;
--PRP-000375;Alkmaar;Robonsbosweg 5; <EFBFBD> 385,00 ; <EFBFBD> 1.155,00 ; <EFBFBD> 770,00 ; <EFBFBD> 2.310,00
--PRP-000974;Almelo;De Werf 5; <EFBFBD> 660,00 ; <EFBFBD> 990,00 ; <EFBFBD> 660,00 ; <EFBFBD> 2.310,00
--
-- Belangrijk om te weten is dat de kolom totaal niet altijd op dezelfde plek staat.
CREATE OR REPLACE VIEW yask_v_rabo_imp_gladheid
AS
SELECT fac_import_key,
fac_imp_csv_key,
fac_imp_csv_index,
(SELECT TO_DATE (SUBSTR (fac_imp_csv_col01, 1, INSTR (fac_imp_csv_col01, ' ') - 1), 'Month')
FROM fac_imp_csv im
WHERE im.fac_import_key = i.fac_import_key AND fac_imp_csv_index = 3) maand,
REPLACE (
REPLACE (
REPLACE (
REPLACE (CASE
WHEN (SELECT fac_imp_csv_col07
FROM fac_imp_csv i7
WHERE i7.fac_import_key = i.fac_import_key AND fac_imp_csv_index = 3) = 'Totaal'
THEN
i.fac_imp_csv_col07
WHEN (SELECT fac_imp_csv_col08
FROM fac_imp_csv i8
WHERE i8.fac_import_key = i.fac_import_key AND fac_imp_csv_index = 3) = 'Totaal'
THEN
i.fac_imp_csv_col08
WHEN (SELECT fac_imp_csv_col09
FROM fac_imp_csv i9
WHERE i9.fac_import_key = i.fac_import_key AND fac_imp_csv_index = 3) = 'Totaal'
THEN
i.fac_imp_csv_col09
WHEN (SELECT fac_imp_csv_col10
FROM fac_imp_csv i10
WHERE i10.fac_import_key = i.fac_import_key AND fac_imp_csv_index = 3) = 'Totaal'
THEN
i.fac_imp_csv_col10
ELSE
'Onbekend'
END,
'<EFBFBD>') -- Euroteken vervangen
,
' ') -- Er komen spaties voor tussen een min-teken en het bedrag.
,
'.') -- Duizendtal scheidingsteken vervangen
,
',',
'.') -- Komma omzetten naar punten als decimaal scheidingsteken.
totaal,
fac_imp_csv_col01 prp,
fac_imp_csv_col02 plaats,
fac_imp_csv_col03 adres,
fac_imp_csv_col20 alg_locatie_key,
fac_imp_csv_col21 alg_gebouw_key
FROM fac_imp_csv i
WHERE i.fac_imp_csv_col01 LIKE 'PRP-%';
CREATE OR REPLACE PROCEDURE yask_import_rabo_gladheid (p_import_key IN NUMBER)
AS
CURSOR c_cursor IS
SELECT *
FROM yask_v_rabo_imp_gladheid
WHERE fac_import_key = p_import_key
ORDER BY fac_imp_csv_index;
v_errormsg VARCHAR (200);
v_errorhint VARCHAR (200);
v_errorcount NUMBER;
v_aanduiding VARCHAR (200);
v_ongeldig BOOLEAN;
v_count NUMBER;
v_totaal NUMBER;
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
-- De importvelden
v_locatie_key NUMBER (10);
v_gebouw_key NUMBER (10);
BEGIN
-- Init
v_totaal := 0;
-- Controle of de import al gedaan is voor de vorige maand
FOR rec IN c_cursor
LOOP
BEGIN
v_locatie_key := NULL;
v_gebouw_key := NULL;
v_ongeldig := FALSE;
v_aanduiding := rec.prp || '|' || rec.plaats || '|' || rec.adres || '|' || rec.totaal;
v_errorhint := 'Zoek het juiste gebouw op';
BEGIN
SELECT l.alg_locatie_key, g.alg_gebouw_key
INTO v_locatie_key, v_gebouw_key
FROM alg_gebouw g, alg_locatie l, alg_district d
WHERE g.alg_gebouw_verwijder IS NULL
AND g.alg_locatie_key = l.alg_locatie_key
AND alg_locatie_verwijder IS NULL
AND l.alg_district_key = d.alg_district_key
AND d.alg_regio_key = 121 -- RABOBANK.
AND UPPER (alg_gebouw_code) = UPPER (TRIM (rec.prp));
EXCEPTION
WHEN NO_DATA_FOUND THEN
fac.imp_writelog (p_import_key, 'E', 'Gebouw kan niet gevonden worden.', v_aanduiding);
v_ongeldig := TRUE;
WHEN TOO_MANY_ROWS
THEN
fac.imp_writelog (p_import_key, 'E', 'Meerdere gebouwen gevonden.', v_aanduiding);
v_ongeldig := TRUE;
END;
IF FAC.safe_to_number(rec.totaal) IS NULL
THEN
fac.imp_writelog (p_import_key, 'W', 'Bedrag is geen nummer', v_aanduiding || '(' || rec.totaal || ')');
v_ongeldig := TRUE;
END IF;
v_errorhint := 'Vul de csv import tabel aan met locatie en gebouw key';
IF v_ongeldig = FALSE
THEN
UPDATE fac_imp_csv SET fac_imp_csv_col20 = v_locatie_key,
fac_imp_csv_col21 = v_gebouw_key
WHERE fac_imp_csv_key = rec.fac_imp_csv_key;
v_totaal := v_totaal + COALESCE(FAC.safe_to_number(rec.totaal), 0);
END IF;
END;
END LOOP;
fac.imp_writelog (p_import_key, 'S', 'Totaal ingelezen bedrag: ' || v_totaal, NULL);
END;
/
CREATE OR REPLACE PROCEDURE yask_update_rabo_gladheid (p_import_key IN NUMBER)
AS
CURSOR c_cursor IS
SELECT *
FROM yask_v_rabo_imp_gladheid
WHERE fac_import_key = p_import_key
AND FAC.safe_to_number(totaal) IS NOT NULL
ORDER BY fac_imp_csv_index;
CURSOR c_mld (c_stdmelding_key IN NUMBER)
IS
SELECT mld_melding_key, mld_melding_status
FROM mld_melding
WHERE mld_stdmelding_key = c_stdmelding_key -- Verzamelmelding Catering
AND mld_melding_status IN (0, 2, 3, 99, 4, 7) -- FrontOffice, Nieuw, Te accepteren, Niet opgelost, In behandeling, Uitgegeven
AND TRUNC(SYSDATE, 'MM') -1 > mld_melding_einddatum;
v_aanduiding VARCHAR2 (1000); -- Import line
v_errormsg VARCHAR (200);
v_errorhint VARCHAR (200);
v_errorcount NUMBER;
v_ongeldig BOOLEAN;
v_count NUMBER;
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
-- De importvelden
v_stdmelding_key NUMBER (10);
v_typeopdr_key NUMBER (10);
v_perslid_key NUMBER (10);
v_kostenplaats_key NUMBER (10);
v_melding_key NUMBER (10);
v_melding_status NUMBER (1);
v_bedrijf_key NUMBER (10);
v_contact_key NUMBER (10);
v_opdr_key NUMBER (10);
v_gebouw_key_prev NUMBER(10);
v_mld_opdr_bedrijfopdr_volgnr NUMBER;
v_rb_goedgekeurd_kenmerk_key NUMBER (10);
v_typefactuur_kenmerk_key NUMBER (10);
v_usrdata_key NUMBER (10);
v_opdr_kosten mld_opdr.mld_opdr_kosten%TYPE;
v_stdmelding_t_uitvoertijd mld_stdmelding.mld_stdmelding_t_uitvoertijd%TYPE;
v_stdmelding_t_accepttijd mld_stdmelding.mld_stdmelding_t_accepttijd%TYPE;
v_stdmelding_code mld_stdmelding.mld_stdmelding_code%TYPE;
v_melding_datum DATE;
v_melding_einddatum DATE;
v_opdr_datumbegin DATE;
v_opdr_einddatum DATE;
PROCEDURE add_kenmerk_btw_bedrag (p_opdr_key IN NUMBER, p_typeopdr_key IN NUMBER, p_btw IN NUMBER, p_bedrag IN NUMBER)
AS
v_btw_bedrag_kenmerk_key NUMBER;
v_kenmerk_code VARCHAR2(20);
BEGIN
CASE p_btw
WHEN 21 THEN v_kenmerk_code := 'BEDRAGHOOG';
WHEN 9 THEN v_kenmerk_code := 'BEDRAGLAAG';
WHEN 0 THEN v_kenmerk_code := 'BEDRAGNUL';
ELSE RETURN;
END CASE;
-- zoek het kenmerk op.
SELECT mld_kenmerk_key
INTO v_btw_bedrag_kenmerk_key
FROM mld_kenmerk k, mld_srtkenmerk sk
WHERE k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
AND sk.mld_srtkenmerk_code = v_kenmerk_code
AND k.mld_typeopdr_key = p_typeopdr_key;
FLX.setflex('OPD', v_btw_bedrag_kenmerk_key, p_opdr_key, p_bedrag);
END;
BEGIN
-- initialisatie
v_gebouw_key_prev := -1;
v_opdr_kosten := 0;
v_errormsg := 'Opdrachttype opzoeken om de opdracht onder aan te maken';
SELECT mld_typeopdr_key
INTO v_typeopdr_key
FROM mld_typeopdr ot
WHERE ot.mld_typeopdr_code = 'REVERSEDBILLING'; -- ReversedBilling
v_errormsg := 'Opzoeken van de user waaronder we de meldingen en opdrachten gaan aanmaken';
SELECT prs_perslid_key, prs_kostenplaats_key
INTO v_perslid_key, v_kostenplaats_key
FROM prs_perslid
WHERE prs_perslid_oslogin = '_RABO_GLADHEIDSBESTRIJDING';
FOR rec IN c_cursor
LOOP
IF v_gebouw_key_prev <> rec.alg_gebouw_key AND rec.alg_gebouw_key IS NOT NULL
THEN
-- Bij vervolregels met een ander btw tarief gaan we geen meldingen en opdrachten aanmaken.
IF v_stdmelding_key IS NULL
THEN
v_stdmelding_code := 'RB_RABO_GLADHEIDSBESTRIJDING';
-- zoek de standaardmelding
v_errormsg := 'Standaard melding met code RB_RABO_GLADHEIDSBESTRIJDING opzoeken';
SELECT mld_stdmelding_key,
mld_stdmelding_t_uitvoertijd,
mld_stdmelding_t_accepttijd
INTO v_stdmelding_key,
v_stdmelding_t_uitvoertijd,
v_stdmelding_t_accepttijd
FROM mld_stdmelding
WHERE mld_stdmelding_code = v_stdmelding_code;
-- Dan zijn de grensdata ook nog niet geinitialiseerd.
v_errormsg := 'Initialiseren grensdata: ' || rec.maand;
v_melding_datum := TRUNC(rec.maand,'yyyy');
v_melding_einddatum := ADD_MONTHS(v_melding_datum, 12) -1;
v_opdr_datumbegin := rec.maand;
v_opdr_einddatum := ADD_MONTHS(v_opdr_datumbegin, 1) -1;
END IF;
BEGIN
-- controleer of er een openstaande melding is voor dit gebouw
v_errormsg := 'Kunnen we een melding vinden onder gebouw: ' || rec.alg_gebouw_key;
SELECT mld_melding_key, mld_melding_status
INTO v_melding_key, v_melding_status
FROM mld_melding
WHERE mld_stdmelding_key = v_stdmelding_key -- Verzamelmelding Catering
AND mld_melding_status IN (0, 2, 3, 99, 4, 7) -- FrontOffice, Nieuw, Te accepteren, Niet opgelost, In behandeling, Uitgegeven
AND mld_alg_onroerendgoed_keys = rec.alg_gebouw_key
AND v_opdr_datumbegin BETWEEN mld_melding_datum AND mld_melding_einddatum;
IF v_melding_status = 0 OR v_melding_status = 2
THEN
mld.setmeldingstatus (v_melding_key, 4, v_perslid_key);
END IF;
EXCEPTION WHEN NO_DATA_FOUND
THEN
-- dan gaan we een nieuwe melding aanmaken
v_errormsg := 'We gaan een nieuwe melding aanmaken onder gebouw: ' || rec.alg_gebouw_key;
INSERT INTO mld_melding (mld_melding_omschrijving,
prs_perslid_key,
prs_kostenplaats_key,
mld_stdmelding_key,
mld_alg_locatie_key,
mld_alg_onroerendgoed_keys,
mld_melding_einddatum,
mld_melding_datum,
mld_melding_t_uitvoertijd,
mld_melding_t_accepttijd,
mld_meldbron_key,
mld_melding_module,
mld_melding_spoed)
VALUES ('Gladheid ReversedBilling boekingen',
v_perslid_key, -- API catering rabobank
v_kostenplaats_key, -- Rabobank (kostenplaats van bovenstaande user)
v_stdmelding_key,
rec.alg_locatie_key,
rec.alg_gebouw_key,
v_melding_einddatum,
v_melding_datum,
v_stdmelding_t_uitvoertijd,
v_stdmelding_t_accepttijd,
5,
'MLD',
3)
RETURNING mld_melding_key
INTO v_melding_key;
mld.setmeldingstatus (v_melding_key, 2, v_perslid_key);
mld.setmeldingstatus (v_melding_key, 4, v_perslid_key);
END;
-- maak een opdracht aan voor dit gebouw en deze periode
BEGIN
-- Zoek het bedrijf waaronder de opdracht aangemaakt moet worden. Dit is het bedrijf waarvan
-- de user, onder wie we de melding en opdracht aanmaken, de contactpersoon is.
v_errormsg := 'Het bedrijf opzoeken om de opdracht aan te koppelen. ' || v_perslid_key;
SELECT prs_bedrijf_key
INTO v_bedrijf_key
FROM prs_contactpersoon cp
WHERE cp.prs_perslid_key = v_perslid_key;
-- Nu op zoek naar het ReversedBilling contract
v_errormsg := 'Contract opzoeken om aan de opdracht te koppelen (bedrijf:' || v_bedrijf_key || ')';
SELECT cnt_contract_key
INTO v_contact_key
FROM cnt_contract c, cnt_discipline d
WHERE c.ins_discipline_key = d.ins_discipline_key
AND UPPER(d.ins_discipline_omschrijving) LIKE 'REVERSED%'
AND c.cnt_prs_bedrijf_key = v_bedrijf_key
AND v_opdr_datumbegin BETWEEN c.cnt_contract_looptijd_van AND c.cnt_contract_looptijd_tot;
-- Controleer of er al een opdracht bestaat.
v_errormsg := 'Controleer of RB opdracht al bestaat. ' || rec.prp || ' | ' || rec.plaats || ' | ' || rec.maand || '-' || rec.totaal;
SELECT count(*)
INTO v_count
FROM mld_opdr o, mld_melding m
WHERE o.mld_melding_key = m.mld_melding_key
AND m.mld_alg_onroerendgoed_keys = rec.alg_gebouw_key
AND m.mld_stdmelding_key = v_stdmelding_key
AND o.mld_opdr_datumbegin = v_opdr_datumbegin
AND o.mld_opdr_einddatum = v_opdr_einddatum;
IF v_count = 0
THEN
v_mld_opdr_bedrijfopdr_volgnr := mld.bepaalopdrmeldingvolgnr (v_melding_key);
v_errormsg := 'Maak opdracht aan';
-- maak opdracht aan om cateringfactuur van leverancier te matchen
INSERT INTO mld_opdr (mld_melding_key,
prs_kostenplaats_key,
mld_statusopdr_key,
mld_typeopdr_key,
prs_perslid_key,
cnt_contract_key,
mld_uitvoerende_keys,
mld_opdr_datumbegin,
mld_opdr_einddatum,
mld_opdr_module,
mld_opdr_omschrijving,
mld_opdr_bedrijfopdr_volgnr)
VALUES ( v_melding_key,
v_kostenplaats_key, -- Rabobank kostenplaats
5, -- uitgegeven
v_typeopdr_key,
v_perslid_key, -- Maas import user
v_contact_key,
v_bedrijf_key,
v_opdr_datumbegin,
v_opdr_einddatum,
'MLD',
'Gladheid ReversedBilling boekingen' || ' ' || TO_CHAR (v_opdr_datumbegin, 'MON-YYYY'),
v_mld_opdr_bedrijfopdr_volgnr)
RETURNING mld_opdr_key INTO v_opdr_key;
v_errormsg := 'Update opdracht status';
-- meld de opdracht af
MLD.setopdrachtstatus (v_opdr_key, 6, v_perslid_key);
MLD.updatemeldingstatus (v_melding_key, 0, v_perslid_key); -- Facilitor
-- antedateren van de tracking omdat de reversedbilling alleen meegenomen wordt als de opdracht in de vorige maand is afgerond.
UPDATE fac_tracking SET fac_tracking_datum = v_opdr_einddatum
WHERE fac_tracking_refkey = v_opdr_key
AND fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_code = 'ORDAFM');
-- en zet hem nog op afgerond
MLD.setopdrachtstatus (v_opdr_key, 9, v_perslid_key);
UPDATE fac_tracking SET fac_tracking_datum = v_opdr_einddatum
WHERE fac_tracking_refkey = v_opdr_key
AND fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_code = 'ORDAFR');
v_errormsg := 'Opvragen van het opdrachtkenmerk: RB_GOEDGEKEURD';
SELECT mld_kenmerk_key
INTO v_rb_goedgekeurd_kenmerk_key
FROM mld_kenmerk k, mld_srtkenmerk sk
WHERE k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
AND sk.mld_srtkenmerk_code = 'RB_GOEDGEKEURD' -- Dispuut
AND k.mld_typeopdr_key = v_typeopdr_key;
v_errormsg := 'Kenmerk RB_GOEDGEKEURD op 1 zetten';
FLX.setflex('OPD', v_rb_goedgekeurd_kenmerk_key, v_opdr_key, '1');
v_errormsg := 'Opvragen van het opdrachtkenmerk: TYPEFACTUUR';
SELECT k.mld_kenmerk_key, k.mld_kenmerk_default
INTO v_typefactuur_kenmerk_key, v_usrdata_key
FROM mld_kenmerk k, mld_srtkenmerk sk
WHERE k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
AND sk.mld_srtkenmerk_code = 'TYPEFACTUUR'
AND k.mld_typeopdr_key = v_typeopdr_key;
v_errormsg := 'Kenmerk TYPEFACTUUR op B zetten: ' || v_typefactuur_kenmerk_key || '-' || v_opdr_key || '-' || v_usrdata_key;
-- Dit is de default van het kenmerk
FLX.setflex('OPD', v_typefactuur_kenmerk_key, v_opdr_key, v_usrdata_key);
VBXX.set_opslag_perc (v_opdr_key);
v_errormsg := 'Einde Loop ';
ELSE
fac.imp_writelog (p_import_key, 'E', 'RB opdracht bestaat al', 'Gladheid' || ' | ' || rec.prp || ' | ' || rec.plaats || ' | ' || rec.maand || '-' || rec.totaal);
v_opdr_key := NULL; -- Als de opdracht al bestaat gaan we er niets meer op aanpassen.
END IF;
END;
v_gebouw_key_prev := rec.alg_gebouw_key;
v_opdr_kosten := 0;
END IF;
-- Aanpassen van het kenmerk per btw tarief en het totaalbedrag invullen. Dit doen we alleen als de opdracht niet al bestond.
IF v_opdr_key IS NOT NULL AND rec.alg_gebouw_key IS NOT NULL
THEN
v_errormsg := 'Voeg het kenmerk met het btw bedrag toe aan de opdracht ' || rec.totaal;
-- Voeg het kenmerk met het bedrag toe en tel het totaal voor de opdracht op.
add_kenmerk_btw_bedrag (v_opdr_key, v_typeopdr_key, 21, rec.totaal);
v_opdr_kosten := v_opdr_kosten + rec.totaal;
UPDATE mld_opdr SET mld_opdr_kosten = v_opdr_kosten, mld_opdr_materiaal = v_opdr_kosten WHERE mld_opdr_key = v_opdr_key;
VBXX.set_verkoopprijs (v_opdr_key);
END IF;
END LOOP;
-- afmelden oude meldingen
FOR rec_mld IN c_mld (v_stdmelding_key)
LOOP
v_errormsg := 'Afmelden oude melding ' || rec_mld.mld_melding_key;
mld.setmeldingstatus (rec_mld.mld_melding_key, 5, NULL);
END LOOP;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
v_errorhint := v_errormsg;
v_errormsg := 'Fout bij aanmaken gladheid RB opdracht' || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
END;
/
CREATE OR REPLACE PROCEDURE yask_daily
AS
BEGIN