Files
Database/BGT/BGT_PAC.SRC
Erik Groener 815e3ef7fd TWYN#53415 verwerking budget reserve
svn path=/Database/trunk/; revision=38007
2018-05-30 14:00:58 +00:00

453 lines
21 KiB
Plaintext

#ifdef BGT
/*
* $Revision$
* $Id$
*/
CREATE OR REPLACE PACKAGE bgt
AS
FUNCTION getMutatieOpBudget( p_budget_key IN NUMBER
, p_mutatie_key IN NUMBER
, p_btw IN NUMBER
) RETURN NUMBER;
FUNCTION getBudgetMutaties ( p_budget_key IN NUMBER
, p_btw IN NUMBER
, p_datum_van DATE DEFAULT NULL
, p_datum_tot DATE DEFAULT NULL
) RETURN NUMBER;
FUNCTION getBudgetOpDatum ( p_budget_key IN NUMBER
, p_btw IN NUMBER
, p_datum DATE DEFAULT NULL
) RETURN NUMBER;
FUNCTION getBudgetSoortMutatie ( p_kostenrubriek_key IN NUMBER
, p_kostensoortgrp_key IN NUMBER
, p_kostensoort_key IN NUMBER
, p_btw IN NUMBER
, p_soortmutatie IN VARCHAR2
, p_datum IN DATE DEFAULT NULL
) RETURN NUMBER;
FUNCTION getSoortMutatie ( p_mutatie_key IN NUMBER
) RETURN VARCHAR2;
FUNCTION getContractwaarde( p_srtkey IN VARCHAR2
, p_key IN NUMBER
, p_btw IN NUMBER
, p_status NUMBER DEFAULT 3
, p_datum_van DATE DEFAULT NULL
, p_datum_tot DATE DEFAULT NULL
) RETURN NUMBER;
FUNCTION getRaming ( p_mld_opdr_key IN NUMBER
, p_btw IN NUMBER
, p_datum_van DATE DEFAULT NULL
, p_datum_tot DATE DEFAULT NULL
) RETURN NUMBER;
FUNCTION getGecontracteerd ( p_mld_opdr_key IN NUMBER
, p_btw IN NUMBER
, p_datum_van DATE DEFAULT NULL
, p_datum_tot DATE DEFAULT NULL
) RETURN NUMBER;
FUNCTION getGefactureerdSoort( p_kostensoort_key IN NUMBER
, p_btw IN NUMBER
) RETURN NUMBER;
FUNCTION getGefactureerd ( p_mld_opdr_key IN NUMBER
, p_btw IN NUMBER
, p_datum_van DATE DEFAULT NULL
, p_datum_tot DATE DEFAULT NULL
) RETURN NUMBER;
FUNCTION getTefactureren ( p_mld_opdr_key IN NUMBER
, p_btw IN NUMBER
, p_datum_van DATE DEFAULT NULL
, p_datum_tot DATE DEFAULT NULL
) RETURN NUMBER;
END bgt;
/
CREATE OR REPLACE PACKAGE BODY bgt
AS
FUNCTION getMutatieOpBudget( p_budget_key IN NUMBER
, p_mutatie_key IN NUMBER
, p_btw IN NUMBER
) RETURN NUMBER
IS
v_bedrag_mut NUMBER;
BEGIN
-- p_btw: 0=excl.btw, 1=btw, 2=incl.btw.
BEGIN
SELECT SUM(bedrag_mutatie)
INTO v_bedrag_mut
FROM (SELECT bgt_budgetmutatie_key
, bgt_budget_key_van budget_key
, CASE WHEN p_btw=0 THEN COALESCE(bgt_budget_bedrag_van, 0)
WHEN p_btw=1 THEN COALESCE(bgt_budget_btwbedrag_van, 0)
WHEN p_btw=2 THEN COALESCE(bgt_budget_bedrag_van, 0) + COALESCE(bgt_budget_btwbedrag_van, 0)
END bedrag_mutatie
FROM bgt_budgetmutatie
UNION
SELECT bgt_budgetmutatie_key
, bgt_budget_key_naar budget_key
, CASE WHEN p_btw=0 THEN COALESCE(bgt_budget_bedrag_naar, 0)
WHEN p_btw=1 THEN COALESCE(bgt_budget_btwbedrag_naar, 0)
WHEN p_btw=2 THEN COALESCE(bgt_budget_bedrag_naar, 0) + COALESCE(bgt_budget_btwbedrag_naar, 0)
END bedrag_mutatie
FROM bgt_budgetmutatie
) mut
WHERE mut.budget_key = p_budget_key
AND mut.bgt_budgetmutatie_key = DECODE(p_mutatie_key , NULL, mut.bgt_budgetmutatie_key, p_mutatie_key);
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_bedrag_mut := NULL;
END;
RETURN v_bedrag_mut;
END getMutatieOpBudget;
FUNCTION getBudgetMutaties ( p_budget_key IN NUMBER
, p_btw IN NUMBER
, p_datum_van DATE DEFAULT NULL
, p_datum_tot DATE DEFAULT NULL
) RETURN NUMBER
IS
v_bedrag_mut NUMBER;
BEGIN
-- p_btw: 0=excl.btw, 1=btw, 2=incl.btw.
-- NB: dit zijn zowel onderlinge mutaties als van-naar reserve mutaties!!
BEGIN
SELECT COALESCE(SUM(mut.bedrag_mutaties), 0)
INTO v_bedrag_mut
FROM (SELECT CASE WHEN p_btw=0 THEN SUM(bgt_budget_bedrag_van)
WHEN p_btw=1 THEN SUM(bgt_budget_btwbedrag_van)
WHEN p_btw=2 THEN SUM(bgt_budget_bedrag_van) + SUM(bgt_budget_btwbedrag_van)
END bedrag_mutaties
FROM bgt_budgetmutatie
WHERE bgt_budget_key_van = p_budget_key
AND ((p_datum_van IS NOT NULL AND bgt_budgetmutatie_datum >= p_datum_van) OR p_datum_van IS NULL)
AND ((p_datum_tot IS NOT NULL AND bgt_budgetmutatie_datum < p_datum_tot) OR p_datum_tot IS NULL)
UNION
SELECT CASE WHEN p_btw=0 THEN SUM(bgt_budget_bedrag_naar)
WHEN p_btw=1 THEN SUM(bgt_budget_btwbedrag_naar)
WHEN p_btw=2 THEN SUM(bgt_budget_bedrag_naar) + SUM(bgt_budget_btwbedrag_naar)
END bedrag_mutaties
FROM bgt_budgetmutatie
WHERE bgt_budget_key_naar = p_budget_key
AND ((p_datum_van IS NOT NULL AND bgt_budgetmutatie_datum >= p_datum_van) OR p_datum_van IS NULL)
AND ((p_datum_tot IS NOT NULL AND bgt_budgetmutatie_datum < p_datum_tot) OR p_datum_tot IS NULL)
) mut;
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_bedrag_mut := NULL;
END;
RETURN v_bedrag_mut;
END getBudgetMutaties;
FUNCTION getBudgetOpDatum ( p_budget_key IN NUMBER
, p_btw IN NUMBER
, p_datum DATE DEFAULT NULL
) RETURN NUMBER
IS
v_huidig_budget NUMBER;
v_mutatie NUMBER;
v_datum_budget NUMBER;
BEGIN
-- p_btw: 0=excl.btw, 1=btw, 2=incl.btw.
BEGIN
SELECT CASE WHEN p_btw=0 THEN COALESCE(bgt_budget_bedrag, 0)
WHEN p_btw=1 THEN COALESCE(bgt_budget_btwbedrag, 0)
WHEN p_btw=2 THEN COALESCE(bgt_budget_bedrag, 0) + COALESCE(bgt_budget_btwbedrag, 0)
END huidig_budget
, CASE WHEN p_btw=0 THEN BGT.getBudgetMutaties(bgt_budget_key, 0, p_datum+1, NULL)
WHEN p_btw=1 THEN BGT.getBudgetMutaties(bgt_budget_key, 1, p_datum+1, NULL)
WHEN p_btw=2 THEN BGT.getBudgetMutaties(bgt_budget_key, 0, p_datum+1, NULL) + BGT.getBudgetMutaties(bgt_budget_key, 1, p_datum+1, NULL)
END mutaties
INTO v_huidig_budget
, v_mutatie
FROM bgt_budget
WHERE bgt_budget_key = p_budget_key;
--
v_datum_budget := v_huidig_budget - v_mutatie;
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_datum_budget := NULL;
END;
RETURN v_datum_budget;
END getBudgetOpDatum;
FUNCTION getBudgetSoortMutatie ( p_kostenrubriek_key IN NUMBER
, p_kostensoortgrp_key IN NUMBER
, p_kostensoort_key IN NUMBER
, p_btw IN NUMBER
, p_soortmutatie IN VARCHAR2
, p_datum IN DATE DEFAULT NULL
) RETURN NUMBER
IS
v_bedrag NUMBER;
BEGIN
-- p_btw: 0=excl.btw, 1=btw, 2=incl.btw.
BEGIN
SELECT SUM(bgt_mutatie_bedrag) bgt_mutatie_bedrag
INTO v_bedrag
FROM ( SELECT b.bgt_kostenrubriek_key
, b.prs_kostensoortgrp_key
, b.prs_kostensoort_key
, b.bgt_budget_isreserve
, m.bgt_budgetmutatie_datum
, CASE WHEN p_btw=0 THEN COALESCE(m.bgt_budget_bedrag_van, 0)
WHEN p_btw=1 THEN COALESCE(m.bgt_budget_btwbedrag_van, 0)
WHEN p_btw=2 THEN COALESCE(m.bgt_budget_bedrag_van, 0) + COALESCE(m.bgt_budget_btwbedrag_van, 0)
END bgt_mutatie_bedrag
, BGT.getSoortMutatie (m.bgt_budgetmutatie_key) bgt_mutatie_soort
FROM bgt_budget b
, bgt_budgetmutatie m
WHERE b.bgt_budget_key = m.bgt_budget_key_van
UNION ALL
SELECT b.bgt_kostenrubriek_key
, b.prs_kostensoortgrp_key
, b.prs_kostensoort_key
, b.bgt_budget_isreserve
, m.bgt_budgetmutatie_datum
, CASE WHEN p_btw=0 THEN COALESCE(m.bgt_budget_bedrag_naar, 0)
WHEN p_btw=1 THEN COALESCE(m.bgt_budget_btwbedrag_naar, 0)
WHEN p_btw=2 THEN COALESCE(m.bgt_budget_bedrag_naar, 0) + COALESCE(m.bgt_budget_btwbedrag_naar, 0)
END bgt_mutatie_bedrag
, BGT.getSoortMutatie (m.bgt_budgetmutatie_key) bgt_mutatie_soort
FROM bgt_budget b
, bgt_budgetmutatie m
WHERE b.bgt_budget_key = m.bgt_budget_key_naar
) single_mutatie
WHERE INSTR(p_soortmutatie, bgt_mutatie_soort) > 0
AND ( (p_kostenrubriek_key IS NOT NULL AND p_kostensoortgrp_key = -1 AND p_kostensoort_key = -1 AND bgt_kostenrubriek_key = p_kostenrubriek_key)
OR (p_kostenrubriek_key IS NOT NULL AND p_kostensoortgrp_key IS NULL AND p_kostensoort_key IS NULL AND bgt_kostenrubriek_key = p_kostenrubriek_key AND prs_kostensoortgrp_key IS NULL AND prs_kostensoort_key IS NULL)
OR (p_kostenrubriek_key IS NOT NULL AND p_kostensoortgrp_key IS NOT NULL AND p_kostensoort_key IS NOT NULL AND prs_kostensoort_key = p_kostensoort_key)
OR (p_kostenrubriek_key IS NULL AND p_kostensoortgrp_key IS NOT NULL AND p_kostensoort_key = -1 AND prs_kostensoortgrp_key = p_kostensoortgrp_key)
OR (p_kostenrubriek_key IS NULL AND p_kostensoortgrp_key IS NOT NULL AND p_kostensoort_key IS NULL AND prs_kostensoortgrp_key = p_kostensoortgrp_key AND prs_kostensoort_key IS NULL)
OR (p_kostenrubriek_key IS NULL AND p_kostensoortgrp_key IS NULL AND p_kostensoort_key IS NOT NULL AND prs_kostensoort_key = p_kostensoort_key)
)
AND (bgt_budgetmutatie_datum < p_datum OR p_datum IS NULL);
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_bedrag := NULL;
END;
RETURN v_bedrag;
END getBudgetSoortMutatie;
FUNCTION getSoortMutatie( p_mutatie_key IN NUMBER
) RETURN VARCHAR2
IS
v_budget_van bgt_budgetmutatie.bgt_budget_key_van%TYPE;
v_budget_naar bgt_budgetmutatie.bgt_budget_key_naar%TYPE;
v_mutatie_omschrijving bgt_budgetmutatie.bgt_budgetmutatie_omschrijving%TYPE;
v_mutatie_reserve bgt_budgetmutatie.bgt_budgetmutatie_reserve%TYPE;
v_mutatie_level_van VARCHAR2(1);
v_mutatie_level_naar VARCHAR2(1);
v_soort_mutatie VARCHAR2(1);
v_budget_isreserve bgt_budget.bgt_budget_isreserve%TYPE;
BEGIN
BEGIN
SELECT m.bgt_budget_key_van
, m.bgt_budget_key_naar
, m.bgt_budgetmutatie_omschrijving
, m.bgt_budgetmutatie_reserve
, CASE WHEN bv.prs_kostensoort_key IS NOT NULL
THEN 'S'
ELSE CASE WHEN bv.prs_kostensoortgrp_key IS NOT NULL
THEN 'G'
ELSE CASE WHEN bv.bgt_kostenrubriek_key IS NOT NULL
THEN 'R'
ELSE 'P'
END
END
END mutatie_level_van
, CASE WHEN bn.prs_kostensoort_key IS NOT NULL
THEN 'S'
ELSE CASE WHEN bn.prs_kostensoortgrp_key IS NOT NULL
THEN 'G'
ELSE CASE WHEN bn.bgt_kostenrubriek_key IS NOT NULL
THEN 'R'
ELSE 'P'
END
END
END mutatie_level_naar
, bv.bgt_budget_isreserve
INTO v_budget_van
, v_budget_naar
, v_mutatie_omschrijving
, v_mutatie_reserve
, v_mutatie_level_van
, v_mutatie_level_naar
, v_budget_isreserve
FROM bgt_budget bv
, bgt_budget bn
, bgt_budgetmutatie m
WHERE m.bgt_budget_key_van = bv.bgt_budget_key(+)
AND m.bgt_budget_key_naar = bn.bgt_budget_key(+)
AND m.bgt_budgetmutatie_key = p_mutatie_key;
--
-- Mutatie van-naar reserve (tussen algemeenreserve en kostensoort of kostenrubriek en kostensoort)
-- (Is dus allebei tussen kostenrubriek en kostensoort).
-- Maak nog onderscheid tussen automatische overboeking A (correctie van budget tgv meer gecontracteerd dan budget)
-- en een gewone mutatie van/naar reserve.
IF ( (v_mutatie_level_van = 'R')
OR (v_mutatie_level_naar = 'R')
) THEN
IF (v_mutatie_reserve = 1) THEN -- 'AO Automatische overboeking'
v_soort_mutatie := 'A';
ELSE
v_soort_mutatie := 'R';
END IF;
END IF;
--
-- Mutatie extra budget (er wordt geld aan algemeenreserve, kostenrubriek of kostensoort toegevoegd OF onttrokken.
IF ((v_budget_van = v_budget_naar) OR (v_budget_van IS NULL) OR (v_budget_naar IS NULL) ) THEN
v_soort_mutatie := 'E';
END IF;
--
-- Onderlinge mutatie (mutaties tussen kostensoorten)
IF ( (v_budget_van <> v_budget_naar)
AND (v_mutatie_level_van = 'S')
AND (v_mutatie_level_naar = 'S')
) THEN
v_soort_mutatie := 'M';
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_soort_mutatie := NULL;
END;
--
RETURN v_soort_mutatie;
END getSoortMutatie;
FUNCTION getContractwaarde( p_srtkey IN VARCHAR2
, p_key IN NUMBER
, p_btw IN NUMBER
, p_status NUMBER DEFAULT 3
, p_datum_van DATE DEFAULT NULL
, p_datum_tot DATE DEFAULT NULL
) RETURN NUMBER
IS
v_bedrag NUMBER;
BEGIN
-- p_srtkey: SRT=prs_kostensoort_key, OPDR=mld_opdr_key.
-- p_btw: 0=excl.btw, 1=btw, 2=incl.btw.
-- p_status: 1=raming, 2=gecontracteerd, 3=alles.
BEGIN
SELECT CASE WHEN p_btw=0 THEN SUM(COALESCE(mld_opdr_kosten, 0))
WHEN p_btw=1 THEN SUM(COALESCE(mld_opdr_kosten_btw, 0))
WHEN p_btw=2 THEN SUM(COALESCE(mld_opdr_kosten, 0)) + SUM(COALESCE(mld_opdr_kosten_btw, 0))
END contracten
INTO v_bedrag
FROM mld_opdr
WHERE p_key = DECODE(p_srtkey, 'SRT', prs_kostensoort_key, 'OPDR', mld_opdr_key)
AND ( (p_status = 1 AND mld_statusopdr_key = 10)
OR (p_status = 2 AND mld_statusopdr_key <> 10)
OR (p_status = 3 AND mld_statusopdr_key = mld_statusopdr_key)
)
AND ((p_datum_van IS NOT NULL AND mld_opdr_datumbegin >= p_datum_van) OR p_datum_van IS NULL)
AND ((p_datum_tot IS NOT NULL AND mld_opdr_datumbegin < p_datum_tot) OR p_datum_tot IS NULL);
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_bedrag := NULL;
END;
RETURN v_bedrag;
END getContractwaarde;
FUNCTION getRaming( p_mld_opdr_key IN NUMBER
, p_btw IN NUMBER
, p_datum_van DATE DEFAULT NULL
, p_datum_tot DATE DEFAULT NULL
) RETURN NUMBER
IS
v_bedrag NUMBER;
BEGIN
v_bedrag := BGT.getContractwaarde('OPDR', p_mld_opdr_key, p_btw, 1, p_datum_van, p_datum_tot);
RETURN v_bedrag;
END getRaming;
FUNCTION getGecontracteerd( p_mld_opdr_key IN NUMBER
, p_btw IN NUMBER
, p_datum_van DATE DEFAULT NULL
, p_datum_tot DATE DEFAULT NULL
) RETURN NUMBER
IS
v_bedrag NUMBER;
BEGIN
v_bedrag := BGT.getContractwaarde('OPDR', p_mld_opdr_key, p_btw, 2, p_datum_van, p_datum_tot);
RETURN v_bedrag;
END getGecontracteerd;
FUNCTION getGefactureerdSoort( p_kostensoort_key IN NUMBER
, p_btw IN NUMBER
) RETURN NUMBER
IS
v_bedrag NUMBER;
BEGIN
BEGIN
SELECT SUM(BGT.getGefactureerd(mld_opdr_key, p_btw, NULL, NULL))
INTO v_bedrag
FROM mld_opdr
WHERE prs_kostensoort_key = p_kostensoort_key;
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_bedrag := NULL;
END;
RETURN v_bedrag;
END getGefactureerdSoort;
FUNCTION getGefactureerd ( p_mld_opdr_key IN NUMBER
, p_btw IN NUMBER
, p_datum_van DATE DEFAULT NULL
, p_datum_tot DATE DEFAULT NULL
) RETURN NUMBER
IS
v_bedrag NUMBER;
BEGIN
-- p_btw: 0=excl.btw, 1=btw, 2=incl.btw.
v_bedrag := 0;
BEGIN
SELECT CASE WHEN p_btw=0 THEN SUM(COALESCE(fin_factuur_totaal, 0))
WHEN p_btw=1 THEN SUM(COALESCE(fin_factuur_totaal_btw, 0))
WHEN p_btw=2 THEN SUM(COALESCE(fin_factuur_totaal, 0)) + SUM(COALESCE(fin_factuur_totaal_btw, 0))
END facturen
INTO v_bedrag
FROM fin_factuur
WHERE ((p_datum_van IS NOT NULL AND fin_factuur_datum >= p_datum_van) OR p_datum_van IS NULL)
AND ((p_datum_tot IS NOT NULL AND fin_factuur_datum < p_datum_tot) OR p_datum_tot IS NULL)
AND mld_opdr_key = p_mld_opdr_key;
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_bedrag := 0;
END;
RETURN v_bedrag;
END getGefactureerd;
FUNCTION getTefactureren ( p_mld_opdr_key IN NUMBER
, p_btw IN NUMBER
, p_datum_van DATE DEFAULT NULL
, p_datum_tot DATE DEFAULT NULL
) RETURN NUMBER
IS
v_statusopdr NUMBER;
v_cont NUMBER;
v_fact NUMBER;
v_bedrag NUMBER;
BEGIN
-- p_btw: 0=excl.btw, 1=btw, 2=incl.btw.
v_bedrag := 0;
BEGIN
SELECT NVL(mld_statusopdr_key, 0)
INTO v_statusopdr
FROM mld_opdr
WHERE mld_opdr_key = p_mld_opdr_key;
--
IF (v_statusopdr <> 10) THEN
v_cont := getGecontracteerd(p_mld_opdr_key, p_btw, p_datum_van, p_datum_tot);
v_fact := getGefactureerd(p_mld_opdr_key, p_btw, p_datum_van, p_datum_tot);
v_bedrag := COALESCE(v_cont, 0) - COALESCE(v_fact, 0);
END IF;
END;
RETURN v_bedrag;
END getTefactureren;
END bgt;
/
REGISTERRUN('$Id$')
#endif // BGT