Files
Customer/KFST/kfst.sql
Arthur Egberink 4212540ce0 KFST#52897 -- Koppeling met Exact
svn path=/Customer/trunk/; revision=37782
2018-04-26 11:18:20 +00:00

1136 lines
43 KiB
SQL
Raw Blame History

--
-- $Id$
--
-- Script containing customer specific configuration sql statements for kfst: Kien Facility Management Strijp-S
DEFINE thisfile = 'KFST.SQL'
DEFINE dbuser = '^KFST'
SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
WHENEVER SQLERROR EXIT;
SELECT adm.scriptspoolfile('&dbuser', '&thisfile') AS fcltlogfile FROM DUAL;
WHENEVER SQLERROR CONTINUE;
SPOOL &fcltlogfile
SET DEFINE OFF
------ payload begin ------
CREATE OR REPLACE PACKAGE KFST
AS
PROCEDURE add_xml_row (p_bestand IN VARCHAR2,
p_regel IN VARCHAR2);
PROCEDURE add_xml_element (p_bestand IN VARCHAR2,
p_tag IN VARCHAR2,
p_value IN VARCHAR2);
PROCEDURE set_kenmerk(p_module IN VARCHAR2,
p_kenmerk_key IN NUMBER,
p_link_key IN NUMBER,
p_kenmerk_waarde IN VARCHAR2,
p_history IN NUMBER);
END;
/
CREATE OR REPLACE PACKAGE BODY KFST
AS
PROCEDURE add_xml_row (
p_bestand IN VARCHAR2,
p_regel IN VARCHAR2)
AS
v_index NUMBER;
BEGIN
SELECT COALESCE( MAX(fac_rapport_volgnr), 0) + 1
INTO v_index
FROM fac_rapport
WHERE fac_rapport_node = p_bestand;
INSERT INTO fac_rapport (
fac_rapport_node,
fac_rapport_volgnr,
fac_rapport_regel)
VALUES (p_bestand,
v_index,
p_regel);
END;
PROCEDURE add_xml_element (
p_bestand IN VARCHAR2,
p_tag IN VARCHAR2,
p_value IN VARCHAR2)
AS
BEGIN
kfst.add_xml_row(p_bestand,
'<' || p_tag || '>'
|| xml.char_to_html(p_value)
|| '</' || p_tag || '>');
END;
PROCEDURE set_kenmerk(p_module IN VARCHAR2,
p_kenmerk_key IN NUMBER,
p_link_key IN NUMBER,
p_kenmerk_waarde IN VARCHAR2,
p_history IN NUMBER)
AS
v_count NUMBER;
v_niveau VARCHAR2 (1);
BEGIN
CASE p_module
WHEN 'PRS'
THEN
-- niveau van prs_kenmerk ophalen, omdat deze ook in prs_kenmerklink wordt
-- opgeslagen (da's dus redundant..?)
SELECT prs_kenmerk_niveau
INTO v_niveau
FROM prs_kenmerk
WHERE prs_kenmerk_key = p_kenmerk_key;
SELECT COUNT ( * )
INTO v_count
FROM prs_kenmerklink
WHERE prs_link_key = p_link_key
AND prs_kenmerk_key = p_kenmerk_key
AND prs_kenmerklink_verwijder IS NULL;
IF v_count = 1
THEN
IF p_kenmerk_waarde IS NULL
THEN
DELETE prs_kenmerklink
WHERE prs_link_key = p_link_key
AND prs_kenmerk_key = p_kenmerk_key
AND prs_kenmerklink_verwijder IS NULL;
ELSE
UPDATE prs_kenmerklink
SET prs_kenmerklink_waarde = p_kenmerk_waarde
WHERE prs_link_key = p_link_key
AND prs_kenmerk_key = p_kenmerk_key
AND prs_kenmerklink_verwijder IS NULL;
END IF;
ELSE
IF p_kenmerk_key IS NOT NULL AND p_kenmerk_waarde IS NOT NULL
THEN
INSERT INTO prs_kenmerklink (prs_kenmerk_key,
prs_link_key,
prs_kenmerklink_niveau,
prs_kenmerklink_waarde)
VALUES (p_kenmerk_key,
p_link_key,
v_niveau,
p_kenmerk_waarde);
END IF;
END IF;
WHEN 'ALG'
THEN
-- niveau van prs_kenmerk ophalen, omdat deze ook in prs_kenmerklink wordt
-- opgeslagen (da's dus redundant..?)
SELECT alg_kenmerk_niveau
INTO v_niveau
FROM alg_kenmerk
WHERE alg_kenmerk_key = p_kenmerk_key;
SELECT COUNT ( * )
INTO v_count
FROM alg_onrgoedkenmerk
WHERE alg_onrgoed_key = p_link_key
AND alg_kenmerk_key = p_kenmerk_key
AND alg_onrgoedkenmerk_verwijder IS NULL;
IF v_count = 1
THEN
IF p_kenmerk_waarde IS NULL
THEN
DELETE alg_onrgoedkenmerk
WHERE alg_onrgoed_key = p_link_key
AND alg_kenmerk_key = p_kenmerk_key
AND alg_onrgoedkenmerk_verwijder IS NULL;
ELSE
UPDATE alg_onrgoedkenmerk
SET alg_onrgoedkenmerk_waarde = p_kenmerk_waarde
WHERE alg_onrgoed_key = p_link_key
AND alg_kenmerk_key = p_kenmerk_key
AND alg_onrgoedkenmerk_verwijder IS NULL;
END IF;
ELSE
IF p_kenmerk_key IS NOT NULL AND p_kenmerk_waarde IS NOT NULL
THEN
INSERT INTO alg_onrgoedkenmerk (alg_kenmerk_key,
alg_onrgoed_key,
alg_onrgoed_niveau,
alg_onrgoedkenmerk_waarde)
VALUES (p_kenmerk_key,
p_link_key,
v_niveau,
p_kenmerk_waarde);
END IF;
END IF;
WHEN 'MLD'
THEN
-- melding- of opdrachtkenmerk?
SELECT mld_kenmerk_niveau
INTO v_niveau
FROM mld_kenmerk
WHERE mld_kenmerk_key = p_kenmerk_key;
CASE v_niveau
WHEN 'O'
THEN
SELECT COUNT ( * )
INTO v_count
FROM mld_kenmerkopdr
WHERE mld_opdr_key = p_link_key
AND mld_kenmerk_key = p_kenmerk_key
AND mld_kenmerkopdr_verwijder IS NULL;
IF v_count = 1
THEN
IF p_kenmerk_waarde IS NULL
THEN
DELETE mld_kenmerkopdr
WHERE mld_opdr_key = p_link_key
AND mld_kenmerk_key = p_kenmerk_key
AND mld_kenmerkopdr_verwijder IS NULL;
ELSE
UPDATE mld_kenmerkopdr
SET mld_kenmerkopdr_waarde = p_kenmerk_waarde
WHERE mld_opdr_key = p_link_key
AND mld_kenmerk_key = p_kenmerk_key
AND mld_kenmerkopdr_verwijder IS NULL;
END IF;
ELSE
IF p_kenmerk_key IS NOT NULL AND p_kenmerk_waarde IS NOT NULL
THEN
INSERT INTO mld_kenmerkopdr (mld_kenmerk_key,
mld_opdr_key,
mld_kenmerkopdr_waarde)
VALUES (p_kenmerk_key,
p_link_key,
p_kenmerk_waarde);
END IF;
END IF;
WHEN 'S'
THEN
SELECT COUNT ( * )
INTO v_count
FROM mld_kenmerkmelding
WHERE mld_melding_key = p_link_key
AND mld_kenmerk_key = p_kenmerk_key
AND mld_kenmerkmelding_verwijder IS NULL;
IF v_count = 1
THEN
IF p_kenmerk_waarde IS NULL
THEN
DELETE mld_kenmerkmelding
WHERE mld_melding_key = p_link_key
AND mld_kenmerk_key = p_kenmerk_key
AND mld_kenmerkmelding_verwijder IS NULL;
ELSE
UPDATE mld_kenmerkmelding
SET mld_kenmerkmelding_waarde = p_kenmerk_waarde
WHERE mld_melding_key = p_link_key
AND mld_kenmerk_key = p_kenmerk_key
AND mld_kenmerkmelding_verwijder IS NULL;
END IF;
ELSE
IF p_kenmerk_key IS NOT NULL AND p_kenmerk_waarde IS NOT NULL
THEN
INSERT INTO mld_kenmerkmelding (mld_kenmerk_key,
mld_melding_key,
mld_kenmerkmelding_waarde)
VALUES (p_kenmerk_key,
p_link_key,
p_kenmerk_waarde);
END IF;
END IF;
END CASE;
WHEN 'FIN'
THEN
-- niveau van prs_kenmerk ophalen, omdat deze ook in prs_kenmerklink wordt
-- opgeslagen (da's dus redundant..?)
SELECT fin_kenmerk_type
INTO v_niveau
FROM fin_kenmerk
WHERE fin_kenmerk_key = p_kenmerk_key;
IF v_niveau = 'F'
THEN
SELECT COUNT ( * )
INTO v_count
FROM fin_kenmerkfactuur
WHERE fin_factuur_key = p_link_key
AND fin_kenmerk_key = p_kenmerk_key
AND fin_kenmerkfactuur_verwijder IS NULL;
IF v_count = 1
THEN
IF p_kenmerk_waarde IS NULL
THEN
DELETE fin_kenmerkfactuur
WHERE fin_factuur_key = p_link_key
AND fin_kenmerk_key = p_kenmerk_key
AND fin_kenmerkfactuur_verwijder IS NULL;
ELSE
UPDATE fin_kenmerkfactuur
SET fin_kenmerkfactuur_waarde = p_kenmerk_waarde
WHERE fin_factuur_key = p_link_key
AND fin_kenmerk_key = p_kenmerk_key
AND fin_kenmerkfactuur_verwijder IS NULL;
END IF;
ELSE
IF p_kenmerk_key IS NOT NULL AND p_kenmerk_waarde IS NOT NULL
THEN
INSERT INTO fin_kenmerkfactuur (fin_kenmerk_key,
fin_factuur_key,
fin_kenmerkfactuur_waarde)
VALUES (p_kenmerk_key,
p_link_key,
p_kenmerk_waarde);
END IF;
END IF;
ELSE
-- Kenmerk bij factuurregel
SELECT COUNT ( * )
INTO v_count
FROM fin_kenmerkfactregel
WHERE fin_factuurregel_key = p_link_key
AND fin_kenmerk_key = p_kenmerk_key
AND fin_kenmerkfactregel_verwijder IS NULL;
IF v_count = 1
THEN
IF p_kenmerk_waarde IS NULL
THEN
DELETE fin_kenmerkfactregel
WHERE fin_factuurregel_key = p_link_key
AND fin_kenmerk_key = p_kenmerk_key
AND fin_kenmerkfactregel_verwijder IS NULL;
ELSE
UPDATE fin_kenmerkfactregel
SET fin_kenmerkfactregel_waarde = p_kenmerk_waarde
WHERE fin_factuurregel_key = p_link_key
AND fin_kenmerk_key = p_kenmerk_key
AND fin_kenmerkfactregel_verwijder IS NULL;
END IF;
ELSE
IF p_kenmerk_key IS NOT NULL AND p_kenmerk_waarde IS NOT NULL
THEN
INSERT INTO fin_kenmerkfactregel (fin_kenmerk_key,
fin_factuurregel_key,
fin_kenmerkfactregel_waarde)
VALUES (p_kenmerk_key,
p_link_key,
p_kenmerk_waarde);
END IF;
END IF;
END IF;
END CASE;
END;
END;
/
CREATE OR REPLACE PROCEDURE kfst_import_kostenstructuur (
p_import_key IN NUMBER
)
AS
CURSOR c_cursor
IS
SELECT *
FROM fac_imp_file
WHERE fac_import_key = p_import_key
ORDER BY fac_imp_file_index;
v_newline VARCHAR2 (1000);
v_aanduiding VARCHAR2 (1000); -- Import line
v_field VARCHAR2 (100); -- Import field
v_fielddelimitor VARCHAR2 (1); -- Field seperator
v_errormsg VARCHAR (200);
v_errorhint VARCHAR (200);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_skipfield VARCHAR2 (100);
-- De importvelden
v_GrootboekNummer VARCHAR2(100);
v_GrootboekOms VARCHAR2(100);
v_HoofdstukNummer VARCHAR2(100);
v_HoofdstukOms VARCHAR2(100);
v_AccountNummer VARCHAR2(100);
v_AccountOms VARCHAR2(100);
header_found BOOLEAN;
BEGIN
-- Init
header_found := FALSE;
v_fielddelimitor := ';';
-- Clear my previous imported rows
DELETE FROM kfst_imp_kostenstructuur;
FOR rec1 IN c_cursor
LOOP
BEGIN
v_newline := rec1.fac_imp_file_line;
v_aanduiding := v_newline;
IF SUBSTR (v_newline, 1, 3) = '?'
THEN
-- EF BB BF aangetroffen
fac.imp_writelog (p_import_key,
'W',
'Byte Order Mark aangetroffen',
'Bestand heeft onbehandeld UTF-8 formaat.'
);
v_newline := SUBSTR (v_newline, 4);
END IF;
fac.imp_getfield (v_newline, v_fielddelimitor, v_GrootboekNummer);
fac.imp_getfield (v_newline, v_fielddelimitor, v_GrootboekOms);
fac.imp_getfield (v_newline, v_fielddelimitor, v_HoofdstukNummer);
fac.imp_getfield (v_newline, v_fielddelimitor, v_HoofdstukOms);
fac.imp_getfield (v_newline, v_fielddelimitor, v_AccountNummer);
fac.imp_getfield (v_newline, v_fielddelimitor, v_AccountOms);
-- Skip until a valid header is found
IF UPPER(v_GrootboekNummer) = 'CODE'
AND UPPER(v_GrootboekOms) = 'OMSCHRIJVING GROOTBOEKREKENING'
AND UPPER(v_HoofdstukNummer) = 'HOOFDSTUKNUMMER'
AND UPPER(v_HoofdstukOms) = 'HOOFDSTUKNAAM'
AND UPPER(v_AccountNummer) = 'ACCOUNTNUMMER'
AND UPPER(v_AccountOms) = 'ACCOUNTOMSCHRIJVING'
THEN
-- Sla de kopregel over.
header_found := TRUE;
ELSIF (header_found AND v_GrootboekNummer IS NOT NULL)
THEN
INSERT INTO kfst_imp_kostenstructuur
(GrootboekNummer,
GrootboekOms,
HoofdstukNummer,
HoofdstukOms,
AccountNummer,
AccountOms)
VALUES (v_GrootboekNummer,
v_GrootboekOms,
v_HoofdstukNummer,
v_HoofdstukOms,
v_AccountNummer,
v_AccountOms);
END IF;
COMMIT;
END;
END LOOP;
IF NOT header_found
THEN
fac.imp_writelog (p_import_key,
'E',
'Geen geldige header aangetroffen',
'Bestand is geen geldig kostensoort importbestand.'
);
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
fac.imp_writelog (p_import_key, 'E', SUBSTR (v_errormsg, 1, 1000), v_aanduiding);
-- maak de importtabel leeg om te voorkomen dat er halve bestanden ingelezen worden.
DELETE FROM kfst_imp_kostenstructuur;
END;
/
-- Importfunctie om de kostensoort structuur in de eigentabellen te plaatsen. De structuur
-- is opgedeeld in 3 niveaus. Eerst het hoofdstuk dan het account en vervolgens het grootboek.
-- Uiteindelijk wordt het grootboeknummer gekoppeld aan de factuur via de kostensoort.
-- Eigen tabel waardes: 181 Hoofdstuk
-- 182 Account
-- 107 Grootboek / Kostencode
CREATE OR REPLACE PROCEDURE kfst_update_kostenstructuur (p_import_key IN NUMBER)
AS
CURSOR c
IS
SELECT *
FROM kfst_imp_kostenstructuur;
v_oldcount NUMBER;
v_newcount NUMBER;
v_hoofdstuk_key NUMBER;
v_account_key NUMBER;
v_grootboek_key NUMBER;
v_kostensoort_key NUMBER;
v_kostensoortgrp_key NUMBER;
v_errormsg VARCHAR (1000);
v_error_hint VARCHAR (1000);
oracle_err_mes VARCHAR2 (150);
oracle_err_num VARCHAR2 (150);
BEGIN
SELECT COUNT (*)
INTO v_newcount
FROM kfst_imp_kostenstructuur;
IF v_newcount = 0 THEN
fac.imp_writelog (p_import_key,
'E',
'KFST kostenstructuur import bevat geen records',
'$Revision$'
);
RETURN;
END IF;
-- How many active records are now present?
SELECT COUNT (*)
INTO v_oldcount
FROM fac_usrdata
WHERE fac_usrtab_key = 107; -- grootboekrecords
FOR rec IN c
LOOP
BEGIN
BEGIN
-- Bestaat het hoofstuk al
SELECT fac_usrdata_key
INTO v_hoofdstuk_key
FROM fac_usrdata
WHERE fac_usrtab_key = 181 -- hoofdstuk
AND fac_usrdata_code = rec.HoofdstukNummer;
-- Zo ja, dan is misschien de omschrijving aangepast.
UPDATE fac_usrdata
SET fac_usrdata_omschr = rec.HoofdstukNummer || ' ' || rec.HoofdstukOms,
fac_usrdata_vervaldatum = NULL
WHERE fac_usrdata_key = v_hoofdstuk_key;
EXCEPTION WHEN NO_DATA_FOUND
THEN
INSERT INTO fac_usrdata (fac_usrdata_code, fac_usrdata_omschr, fac_usrtab_key)
VALUES (rec.HoofdstukNummer, rec.HoofdstukNummer || ' ' || rec.HoofdstukOms, 181)
RETURNING fac_usrdata_key INTO v_hoofdstuk_key;
END;
BEGIN
-- Bestaat het account al
SELECT fac_usrdata_key
INTO v_account_key
FROM fac_usrdata
WHERE fac_usrtab_key = 182 -- account
AND fac_usrdata_code = rec.AccountNummer;
-- Zo ja, dan is misschien de omschrijving aangepast.
UPDATE fac_usrdata
SET fac_usrdata_omschr = rec.AccountNummer || ' ' || rec.AccountOms,
fac_usrdata_parentkey = v_hoofdstuk_key,
fac_usrdata_vervaldatum = NULL
WHERE fac_usrdata_key = v_account_key;
EXCEPTION WHEN NO_DATA_FOUND
THEN
INSERT INTO fac_usrdata (fac_usrdata_code, fac_usrdata_omschr, fac_usrtab_key, fac_usrdata_parentkey)
VALUES (rec.AccountNummer, rec.AccountNummer || ' ' || rec.AccountOms, 182, v_hoofdstuk_key)
RETURNING fac_usrdata_key INTO v_account_key;
END;
BEGIN
-- Bestaat het grootboek al
SELECT fac_usrdata_key
INTO v_grootboek_key
FROM fac_usrdata
WHERE fac_usrtab_key = 107 -- grootboek
AND fac_usrdata_code = rec.GrootboekNummer;
-- Zo ja, dan is misschien de omschrijving aangepast.
UPDATE fac_usrdata
SET fac_usrdata_omschr = rec.GrootboekNummer || ' ' || rec.GrootboekOms,
fac_usrdata_parentkey = v_account_key,
fac_usrdata_vervaldatum = NULL
WHERE fac_usrdata_key = v_GrootBoek_key;
EXCEPTION WHEN NO_DATA_FOUND
THEN
INSERT INTO fac_usrdata (fac_usrdata_code, fac_usrdata_omschr, fac_usrtab_key, fac_usrdata_parentkey)
VALUES (rec.GrootboekNummer, rec.GrootboekNummer || ' ' || rec.GrootboekOms, 107, v_account_key)
RETURNING fac_usrdata_key INTO v_grootboek_key;
END;
BEGIN
-- Bestaat het account al in de kostensoortgrp tabel
SELECT prs_kostensoortgrp_key
INTO v_kostensoortgrp_key
FROM prs_kostensoortgrp
WHERE prs_kostensoortgrp_altcode = rec.AccountNummer;
-- Zo ja, dan is misschien de omschrijving aangepast.
UPDATE prs_kostensoortgrp
SET prs_kostensoortgrp_oms = rec.AccountOms
WHERE prs_kostensoortgrp_key = v_kostensoortgrp_key;
EXCEPTION WHEN NO_DATA_FOUND
THEN
INSERT INTO prs_kostensoortgrp (prs_kostensoortgrp_altcode, prs_kostensoortgrp_oms)
VALUES (rec.AccountNummer, rec.AccountOms)
RETURNING prs_kostensoortgrp_key INTO v_kostensoortgrp_key;
END;
BEGIN
-- Bestaat het grootboek al in de kostensoort tabel
SELECT prs_kostensoort_key
INTO v_kostensoort_key
FROM prs_kostensoort
WHERE prs_kostensoort_refcode = rec.GrootboekNummer;
-- Zo ja, dan is misschien de omschrijving aangepast.
UPDATE prs_kostensoort
SET prs_kostensoort_oms = rec.GrootboekNummer || ' ' || rec.GrootboekOms,
prs_kostensoortgrp_key = v_kostensoortgrp_key
WHERE prs_kostensoort_key = v_kostensoort_key;
EXCEPTION WHEN NO_DATA_FOUND
THEN
INSERT INTO prs_kostensoort (prs_kostensoort_refcode, prs_kostensoort_oms, prs_kostensoortgrp_key)
VALUES (rec.GrootboekNummer, rec.GrootboekNummer || ' ' || rec.GrootboekOms, v_kostensoortgrp_key)
RETURNING prs_kostensoort_key INTO v_kostensoort_key;
END;
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
v_error_hint := v_errormsg;
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg :=
v_errormsg
|| 'ORACLE (error '
|| oracle_err_num
|| '/'
|| oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key,
'E',
v_errormsg,
v_error_hint
);
COMMIT; -- tbv logging
END;
END LOOP;
-- Verwijder vervallen grootboekrekeningen
UPDATE fac_usrdata ud
SET fac_usrdata_vervaldatum = SYSDATE
WHERE fac_usrtab_key = 107
AND NOT EXISTS (SELECT GrootboekNummer
FROM kfst_imp_kostenstructuur k
WHERE k.GrootboekNummer = ud.fac_usrdata_code);
-- Verwijder vervallen accounts
UPDATE fac_usrdata ud
SET fac_usrdata_vervaldatum = SYSDATE
WHERE fac_usrtab_key = 182
AND NOT EXISTS (SELECT AccountNummer
FROM kfst_imp_kostenstructuur k
WHERE k.AccountNummer = ud.fac_usrdata_code);
-- Verwijder vervallen hoofdstukken
UPDATE fac_usrdata ud
SET fac_usrdata_vervaldatum = SYSDATE
WHERE fac_usrtab_key = 181
AND NOT EXISTS (SELECT HoofdstukNummer
FROM kfst_imp_kostenstructuur k
WHERE k.HoofdstukNummer = ud.fac_usrdata_code);
SELECT COUNT (*)
INTO v_newcount
FROM fac_usrdata
WHERE fac_usrtab_key = 107; -- grootboekrecords
fac.imp_writelog (p_import_key,
'S',
'Aantal ruimte soorten vooraf: ' || TO_CHAR (v_oldcount) || ' nu: ' || TO_CHAR (v_newcount),
''
);
EXCEPTION
WHEN OTHERS
THEN
v_error_hint := v_errormsg;
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg :=
v_errormsg
|| 'ORACLE (error '
|| oracle_err_num
|| '/'
|| oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key,
'E',
v_errormsg,
v_error_hint
);
COMMIT; -- tbv logging
END;
/
CREATE OR REPLACE VIEW kfst_v_factuur_gegevens
(
fin_factuur_key,
opdracht_id,
fin_factuur_datum,
fin_factuur_nr,
prs_bedrijf_key,
fin_factuurregel_totaal,
fin_factuurregel_btw,
fin_btwtabelwaarde_code,
fin_btwtabelwaarde_key,
fin_factuurregel_nr,
fin_factuur_debiteur_nr,
fin_factuur_opmerking,
fin_factuur_boekmaand,
opdr_datum,
prs_kostenplaats_key,
mld_opdr_key,
cnt_contract_key,
bes_bestelopdr_key,
fin_factuur_statuses_key,
lev_kpn,
kpcode,
kdcode
)
AS
SELECT f.fin_factuur_key,
DECODE (
c.cnt_contract_key,
NULL, DECODE (
bo.bes_bestelopdr_key,
NULL, (SELECT sd.ins_srtdiscipline_prefix
|| m.mld_melding_key
|| '/'
|| o.mld_opdr_bedrijfopdr_volgnr
FROM mld_melding m,
mld_stdmelding std,
ins_tab_discipline d,
ins_srtdiscipline sd
WHERE m.mld_melding_key =
o.mld_melding_key
AND m.mld_stdmelding_key =
std.mld_stdmelding_key
AND std.mld_ins_discipline_key =
d.ins_discipline_key
AND d.ins_srtdiscipline_key =
sd.ins_srtdiscipline_key),
bo.bes_bestelopdr_id),
'C'
|| TO_CHAR (cnt_contract_nummer_intern)
|| DECODE (cnt_contract_versie,
NULL, NULL,
'.' || cnt_contract_versie))
opdracht_id,
f.fin_factuur_datum,
f.fin_factuur_nr,
COALESCE (b_c.prs_bedrijf_key,
COALESCE (b_o.prs_bedrijf_key, b_b.prs_bedrijf_key))
prs_bedrijf_key,
fr.fin_factuurregel_totaal,
ROUND (
fr.fin_factuurregel_totaal
* DECODE (btw.fin_btwtabelwaarde_verlegd,
1, 0,
btw.fin_btwtabelwaarde_perc / 100),
2)
fin_factuurregel_btw,
btw.fin_btwtabelwaarde_code,
btw.fin_btwtabelwaarde_key,
fr.fin_factuurregel_nr,
f.fin_factuur_debiteur_nr,
f.fin_factuur_opmerking,
f.fin_factuur_boekmaand,
COALESCE (
o.mld_opdr_datumbegin,
COALESCE (c.cnt_contract_looptijd_tot,
bo.bes_bestelopdr_datum)),
COALESCE (
o.prs_kostenplaats_key,
COALESCE (
c.prs_kostenplaats_key,
(SELECT DISTINCT b.prs_kostenplaats_key
FROM bes_bestelling b,
bes_bestelopdr_item boi,
bes_bestelling_item bi
WHERE bo.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))),
o.mld_opdr_key,
c.cnt_contract_key,
bo.bes_bestelopdr_key,
( -- status van de factuur is ingevoerd als er facturen van dezelfde leverancier en nummer zijn
-- met status ingevoerd, afgewezen of incompleet
SELECT DECODE (COUNT (*), 0, f.fin_factuur_statuses_key, 2)
FROM fin_factuur f_t,
cnt_contract c_t,
bes_bestelopdr b_t,
mld_opdr o_t
WHERE f_t.fin_factuur_verwijder IS NULL
AND f_t.mld_opdr_key = o_t.mld_opdr_key(+)
AND f_t.cnt_contract_key = c_t.cnt_contract_key(+)
AND f_t.bes_bestelopdr_key = b_t.bes_bestelopdr_key(+)
AND COALESCE (
o_t.mld_uitvoerende_keys,
COALESCE (b_t.prs_bedrijf_key,
c_t.cnt_prs_bedrijf_key)) =
COALESCE (
o.mld_uitvoerende_keys,
COALESCE (bo.prs_bedrijf_key,
c.cnt_prs_bedrijf_key))
AND f.fin_factuur_nr = f_t.fin_factuur_nr
AND f_t.fin_factuur_statuses_key IN (1, 2, 3)
AND f.fin_factuur_statuses_key = 6)
fin_factuur_statuses_key,
lk.prs_kostenplaats_nr
lev_kpn,
(SELECT alg_gebouw_code
FROM alg_v_allonrgoed_gegevens g, mld_melding m
WHERE o.mld_melding_key = m.mld_melding_key
AND m.mld_alg_onroerendgoed_keys =
g.alg_onroerendgoed_keys),
(SELECT SUBSTR (alg_plaatsaanduiding, 5, 100)
FROM alg_v_allonrgoed_gegevens g, mld_melding m
WHERE o.mld_melding_key = m.mld_melding_key
AND m.mld_alg_onroerendgoed_keys =
g.alg_onroerendgoed_keys)
FROM fin_factuur f,
fin_factuurregel fr,
fin_btwtabelwaarde btw,
mld_opdr o,
mld_typeopdr ot,
cnt_contract c,
bes_bestelopdr bo,
prs_bedrijf b_o,
prs_bedrijf b_c,
prs_bedrijf b_b,
prs_kostensoort k,
prs_kostensoortgrp kg,
prs_kostenplaats lk
WHERE f.fin_factuur_key = fr.fin_factuur_key
AND fr.fin_btwtabelwaarde_key = btw.fin_btwtabelwaarde_key
AND f.mld_opdr_key = o.mld_opdr_key(+)
AND o.mld_typeopdr_key = ot.mld_typeopdr_key(+)
AND f.cnt_contract_key = c.cnt_contract_key(+)
AND f.bes_bestelopdr_key = bo.bes_bestelopdr_key(+)
AND bo.prs_bedrijf_key = b_b.prs_bedrijf_key(+)
AND o.mld_uitvoerende_keys = b_o.prs_bedrijf_key(+)
AND c.cnt_prs_bedrijf_key = b_c.prs_bedrijf_key(+)
AND f.prs_kostensoort_key = k.prs_kostensoort_key(+)
AND k.prs_kostenplaats_key = lk.prs_kostenplaats_key(+)
AND k.prs_kostensoortgrp_key = kg.prs_kostensoortgrp_key(+)
AND f.fin_factuur_verwijder IS NULL;
CREATE OR REPLACE VIEW kfst_v_bron_export_exact_xml
(
fin_factuur_key,
oms25,
opdracht_id,
factuur_nr,
datum,
crdnr,
bedrag_txt,
bedrag,
bedrag_incl,
betaalref,
itemcode,
reknr,
kstplcode,
kstdrcode,
btw_code,
lev_kpn
)
AS
SELECT fin_factuur_key,
fin_factuur_nr
|| ' - '
|| REPLACE (SUBSTR (fin_factuur_opmerking, 1, 30), ',', '')
oms25,
opdracht_id,
fin_factuur_nr,
TO_CHAR (fin_factuur_datum, 'yyyy-mm-dd') datum,
(SELECT prs_leverancier_nr
FROM prs_bedrijf b
WHERE b.prs_bedrijf_key = fg.prs_bedrijf_key)
crdnr,
REPLACE (TO_CHAR (bedrag), ',', '.') bedrag_txt,
bedrag,
bedrag_incl,
fin_factuur_nr || '/' || fin_factuur_debiteur_nr betaalref,
fac_usrdata_omschr itemcode,
fac_usrdata_code reknr,
kpcode kstplcode,
kdcode kstdrcode,
fin_btwtabelwaarde_code btw_code,
lev_kpn
FROM ( SELECT g.fin_factuur_key,
opdracht_id,
fin_factuur_datum,
fin_factuur_nr,
prs_bedrijf_key,
fin_factuur_debiteur_nr,
fin_factuur_opmerking,
SUM (fin_factuurregel_totaal) bedrag,
SUM (fin_factuurregel_totaal + fin_factuurregel_btw) bedrag_incl,
fin_btwtabelwaarde_code,
mld_opdr_key,
cnt_contract_key,
prs_kostenplaats_key,
lev_kpn,
kpcode,
kdcode
FROM kfst_v_factuur_gegevens g, kfst_exp_factuur e
WHERE fin_factuur_statuses_key = 6
AND g.fin_factuur_key = e.fin_factuur_key
GROUP BY g.fin_factuur_key,
opdracht_id,
fin_factuur_datum,
fin_factuur_nr,
prs_bedrijf_key,
fin_factuur_debiteur_nr,
fin_factuur_opmerking,
fin_btwtabelwaarde_code,
mld_opdr_key,
cnt_contract_key,
prs_kostenplaats_key,
lev_kpn,
kpcode,
kdcode) fg,
mld_kenmerk k,
mld_kenmerkopdr ko,
fac_usrdata ud
WHERE fg.mld_opdr_key = ko.mld_opdr_key
AND ko.mld_kenmerk_key = k.mld_kenmerk_key
AND k.mld_srtkenmerk_key = 81
AND fac.safe_to_number(ko.mld_kenmerkopdr_waarde) = ud.fac_usrdata_key;
CREATE OR REPLACE VIEW kfst_v_export_exact (
result,
result_order
)
AS
SELECT fac_rapport_regel, fac_rapport_volgnr
FROM fac_rapport
WHERE fac_rapport_node = 'EXACT';
CREATE OR REPLACE PROCEDURE kfst_select_exact (p_applname IN VARCHAR2,
p_applrun IN VARCHAR2
)
AS
CURSOR c
IS
SELECT crdnr, factuur_nr, MAX(datum) datum
FROM kfst_v_bron_export_exact_xml
GROUP BY crdnr, factuur_nr;
CURSOR c_sub (c_crdnr VARCHAR2, c_factuur_nr VARCHAR2)
IS
SELECT *
FROM kfst_v_bron_export_exact_xml
WHERE COALESCE(crdnr, 'CrdNr') = COALESCE(c_crdnr, 'CrdNr')
AND factuur_nr = c_factuur_nr;
v_order_count NUMBER;
v_amount_sum NUMBER(10,2);
v_amount_sum_incl NUMBER(10,2);
v_count NUMBER;
v_sub_count NUMBER;
v_bestand VARCHAR2(12);
v_boekstuknummer NUMBER;
v_crdnr PRS_BEDRIJF.PRS_LEVERANCIER_NR%TYPE;
v_factuur_nr FIN_FACTUUR.FIN_FACTUUR_NR%TYPE;
BEGIN
v_order_count := 0;
v_amount_sum := 0;
v_amount_sum_incl := 0;
v_count := 0;
v_bestand := SUBSTR(p_applname, 1, 12);
v_crdnr := 'Q';
v_factuur_nr := 'Q';
-- Eerst opruiming
DELETE FROM imp_log
WHERE imp_log_applicatie = p_applname;
DELETE fac_rapport
WHERE fac_rapport_node = v_bestand;
DELETE fin_kenmerkfactuur kf
WHERE fin_kenmerk_key = 1
AND fin_factuur_key IN (SELECT fin_factuur_key
FROM fin_factuur
WHERE fin_factuur_statuses_key <> 7);
-- Bewaar de factuur keys in een tijdelijke tabel zodat bij het verwerken (nieuwe export)
-- deze keys gebruikt kunnen worden.
DELETE kfst_exp_factuur;
INSERT INTO kfst_exp_factuur (fin_factuur_key)
( SELECT DISTINCT fin_factuur_key
FROM kfst_v_factuur_gegevens
WHERE fin_factuur_statuses_key = 6
AND fin_factuur_datum > SYSDATE - (5 * 365) -- Check op geldige factuurdatum:
AND fin_factuur_datum < SYSDATE + 365 -- facturen mogen niet ouder zijn dan 5 jaar of meer dan <20><>n jaar in de toekomst.
);
-- Bepaal het boekstuknummer (key 1) met het hoogste nummer van dit jaar
-- ## AAIT#36589
SELECT MAX(fin_kenmerkfactuur_waarde)
INTO v_boekstuknummer
FROM fin_kenmerkfactuur
WHERE fin_kenmerk_key = 1
AND SUBSTR(fin_kenmerkfactuur_waarde,1,2) = TO_CHAR(SYSDATE, 'YY');
IF v_boekstuknummer IS NULL
THEN
v_boekstuknummer := FAC.safe_to_number(TO_CHAR(SYSDATE, 'YY') || '600000');
END IF;
-- header
kfst.add_xml_row (v_bestand, '<?xml version="1.0" encoding="windows-1252"?>');
kfst.add_xml_row (v_bestand, '<eExact>');
kfst.add_xml_row (v_bestand, '<GLEntries>');
FOR rec IN c
LOOP
BEGIN
-- Als we een nieuwe leverancier/factuurnummer tegenkomen gaan we het boekstuknummer ophogen.
IF rec.crdnr <> v_crdnr OR rec.factuur_nr <> v_factuur_nr
THEN
v_boekstuknummer := v_boekstuknummer + 1;
v_crdnr := rec.crdnr;
v_factuur_nr := rec.factuur_nr;
END IF;
kfst.add_xml_row (v_bestand, '<GLEntry status="E" entry="' || xml.char_to_html(v_boekstuknummer) || '">');
kfst.add_xml_element (v_bestand, 'Description', rec.factuur_nr);
kfst.add_xml_element (v_bestand, 'Date', rec.datum);
kfst.add_xml_element (v_bestand, 'DocumentDate', TO_CHAR(SYSDATE, 'YYYY-MM-DD') );
kfst.add_xml_row (v_bestand, '<Journal type="I" code="60"/>');
v_sub_count := 1;
FOR rec1 IN c_sub (v_crdnr, v_factuur_nr)
LOOP
BEGIN
-- Eerst maar even een kenmerk voor het boestuknummer aanmaken
kfst.set_kenmerk('FIN', 1, rec1.fin_factuur_key, v_boekstuknummer, 0);
kfst.add_xml_row (v_bestand, '<FinEntryLine number="' || v_sub_count || '" subtype="T" type="N">');
kfst.add_xml_element (v_bestand, 'Date', rec1.datum);
kfst.add_xml_row (v_bestand, '<GLAccount code="' || xml.char_to_html(rec1.reknr) || '"/>');
kfst.add_xml_element (v_bestand, 'Description', rec1.oms25);
kfst.add_xml_row (v_bestand, '<Costcenter code="' || xml.char_to_html(rec1.kstplcode) || '"/>');
kfst.add_xml_row (v_bestand, '<Costunit code="' || xml.char_to_html(rec1.kstdrcode) || '"/>');
kfst.add_xml_row (v_bestand, '<Creditor number="' || xml.char_to_html(rec1.crdnr) || '"/>');
kfst.add_xml_row (v_bestand, '<Item code="' || xml.char_to_html(rec1.itemcode) || '"/>');
kfst.add_xml_row (v_bestand, '<Amount>');
kfst.add_xml_element (v_bestand, 'Debit', rec1.bedrag_txt);
kfst.add_xml_row (v_bestand, '<VAT code="' || xml.char_to_html(rec1.btw_code) || '"/>');
kfst.add_xml_row (v_bestand, '</Amount>');
kfst.add_xml_row (v_bestand, '<Payment>');
kfst.add_xml_element (v_bestand, 'Reference', rec1.betaalref);
kfst.add_xml_element (v_bestand, 'InvoiceNumber', rec1.fin_factuur_key);
kfst.add_xml_row (v_bestand, '</Payment>');
kfst.add_xml_row (v_bestand, '<FinReferences>');
kfst.add_xml_element (v_bestand, 'YourRef', rec1.betaalref);
kfst.add_xml_element (v_bestand, 'DocumentDate', TO_CHAR(SYSDATE, 'YYYY-MM-DD') );
kfst.add_xml_row (v_bestand, '</FinReferences>');
kfst.add_xml_row (v_bestand, '<FreeFields>');
kfst.add_xml_row (v_bestand, '<FreeTexts>');
kfst.add_xml_row (v_bestand, '<FreeText number="3">' || rec1.opdracht_id || '</FreeText>');
kfst.add_xml_row (v_bestand, '</FreeTexts>');
kfst.add_xml_row (v_bestand, '</FreeFields>');
kfst.add_xml_row (v_bestand, '</FinEntryLine>');
v_sub_count := v_sub_count + 1;
v_amount_sum := v_amount_sum + rec1.bedrag;
v_amount_sum_incl := v_amount_sum_incl + rec1.bedrag_incl;
END;
END LOOP;
IF v_sub_count = 1
THEN
fac.writelog (p_applname, 'E', 'Fout tijdens Exact export. Factuurnummer: ' || v_factuur_nr || ' Crdnr: ' || v_crdnr,'');
END IF;
kfst.add_xml_row (v_bestand, '</GLEntry>');
v_order_count := v_order_count + 1;
END;
END LOOP;
kfst.add_xml_row (v_bestand, '</GLEntries>');
kfst.add_xml_row (v_bestand, '</eExact>');
fac.writelog (p_applname, 'S', 'Exact export uitgevoerd. Aantal regels: ' || v_order_count || ' Totaal bedrag: ' || v_amount_sum || ' Totaal bedrag (incl): ' || v_amount_sum_incl, '');
END;
/
-- Procedure om alle geexporteerde facturen naar status verwerkt te zetten.
CREATE OR REPLACE PROCEDURE kfst_export_verwerk_exact (
p_applname IN VARCHAR2,
p_applrun IN VARCHAR2,
p_filedir IN VARCHAR2,
p_filename IN VARCHAR2
)
AS
CURSOR c_fact
IS
SELECT f.fin_factuur_key
FROM kfst_exp_factuur f
, kfst_v_factuur_gegevens fg
WHERE f.fin_factuur_key = fg.fin_factuur_key
AND fg.fin_factuur_statuses_key = 6;
v_errormsg VARCHAR (200);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_aanvrager NUMBER;
v_bestelling_key NUMBER;
v_logdate DATE;
BEGIN
v_errormsg := 'Geen akties';
-- Facilitor user
v_aanvrager := 4;
v_logdate := SYSDATE;
FOR rec1 IN c_fact
LOOP
BEGIN
UPDATE fin_factuur f
SET fin_factuur_statuses_key = 7
WHERE f.fin_factuur_key = rec1.fin_factuur_key;
fac.trackaction ('FINVER', rec1.fin_factuur_key, v_aanvrager, NULL, NULL);
END;
END LOOP;
DELETE kfst_exp_factuur;
END;
/
------ payload end ------
SET DEFINE OFF
BEGIN adm.systrackscriptId ('$Id$', 0); END;
/
COMMIT;
SET ECHO OFF
SPOOL OFF
SET DEFINE ON
PROMPT Logfile of this upgrade is: &fcltlogfile