--
-- $Id$
--
-- Script containing customer specific sql statements for the FACILITOR database
--
-- Met de procedure twyn_delete_deelproject() kan een deelproject in zijn geheel worden verwijderd.
--      parameters: p_deelproject_key   De key van het deelproject dat verwijderd moet worden.
--                  p_alleen_fin        Door voor deze parameter TRUE mee te geven wordt alleen de
--                                      financiele data verwijderd (bedrijven, facturen, opdrachten, mutaties, budgetten)
--                                      Het deelproject zelf blijft bestaan.
--
-- Dit script bevat ook de procedures voor de TWYN-rapportages:
--      twyn_v_detailoverzicht
--      twyn_v_contract_rubriek
--      twyn_v_contr_fact_bedrijf
--

DEFINE thisfile = 'TWYN_PAC.SQL'
DEFINE dbuser   = '^TWYN'
DEFINE custid   = 'TWYN'

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 ------

--
-- Eigen logfile voor BGT
--
CREATE OR REPLACE PROCEDURE twyn_log ( p_actie    IN VARCHAR2
                                     , p_level    IN VARCHAR2
                                     , p_msg      IN VARCHAR2
                                     , p_disc_key IN NUMBER DEFAULT NULL
                                     , p_prj_key  IN NUMBER DEFAULT NULL
                                     , p_rub_key  IN NUMBER DEFAULT NULL
                                     , p_grp_key  IN NUMBER DEFAULT NULL
                                     , p_srt_key  IN NUMBER DEFAULT NULL
                                     , p_bgt_key  IN NUMBER DEFAULT NULL
                                     , p_mut_key  IN NUMBER DEFAULT NULL
                                     , p_opdr_key IN NUMBER DEFAULT NULL
                                     , p_fact_key IN NUMBER DEFAULT NULL
                                     , p_bedr_key IN NUMBER DEFAULT NULL
                                     , p_kpls_key IN NUMBER DEFAULT NULL
                                     , p_kgrp_key IN NUMBER DEFAULT NULL
                                     )
AS
    v_volgnr  NUMBER(10);
BEGIN
    SELECT COALESCE(MAX(volgnr), 0) + 1
      INTO v_volgnr
      FROM twyn_bgtlog;
    --
    INSERT INTO twyn_bgtlog VALUES
    ( v_volgnr
    , p_actie
    , p_level
    , SYSDATE
    , p_msg
    , p_disc_key, p_prj_key, p_rub_key, p_grp_key, p_srt_key
    , p_bgt_key, p_mut_key
    , p_opdr_key, p_fact_key, p_bedr_key
    , p_kpls_key, p_kgrp_key
    );
--    COMMIT;
END twyn_log;
/

--
--
--
CREATE OR REPLACE PROCEDURE twyn_delete_deelproject ( p_deelproject_key IN NUMBER
                                                    , p_alleen_fin IN BOOLEAN DEFAULT FALSE
                                                    )
AS
    -- Verwijder het deelproject met bgt_project_key = n.
    -- Met parameter p_alleen_fin worden alleen de budget- en contractgegevens verwijderd.
    -- Default is het hele deelproject verwijderen, dus ook kostenplaatsen, kosten- rubriek, soortgrp en soort.
    v_delete_str      VARCHAR2 (100) := 'DELETE prj=' || TO_CHAR(p_deelproject_key);
    v_err_count       NUMBER;


    PROCEDURE log_info( p_code       IN VARCHAR2 DEFAULT NULL
                      , p_msg        IN VARCHAR2 DEFAULT NULL
                      , p_prj_key    IN NUMBER DEFAULT NULL
                      , p_rub_key    IN NUMBER DEFAULT NULL
                      , p_grp_key    IN NUMBER DEFAULT NULL
                      , p_srt_key    IN NUMBER DEFAULT NULL
                      , p_bgt_key    IN NUMBER DEFAULT NULL
                      , p_mut_key    IN NUMBER DEFAULT NULL
                      , p_opdr_key   IN NUMBER DEFAULT NULL
                      , p_fact_key   IN NUMBER DEFAULT NULL
                      , p_bedr_key   IN NUMBER DEFAULT NULL
                      )
    AS
        v_ora_err_num  NUMBER;
        v_ora_err_msg  VARCHAR2(200);
        v_err_msg      VARCHAR2(1000);
        v_msg          VARCHAR2(2000);
    BEGIN
        IF (p_code IN ('W', 'E')) THEN
            v_ora_err_num := SQLCODE;
            v_ora_err_msg := SUBSTR (SQLERRM, 1, 200);
            v_msg := 'ORACLE (error ' || v_ora_err_num || '/' || v_ora_err_msg || ')';
            IF (p_msg IS NOT NULL) THEN
                v_msg := v_msg || ': ' || p_msg;
            END IF;
        ELSE
            v_msg := p_msg;
        END IF;
        twyn_log (v_delete_str, p_code, v_msg, NULL, p_prj_key, p_rub_key, p_grp_key, p_srt_key, p_bgt_key, p_mut_key, p_opdr_key, p_fact_key, p_bedr_key);
    END;


    PROCEDURE delete_contracten(p_bgt_project_key IN NUMBER)
    AS
        CURSOR c_project_opdr
        IS
            SELECT s.prs_kostensoort_key
              FROM bgt_project p
                 , bgt_kostenrubriek r
                 , prs_kostensoortgrp g
                 , prs_kostensoort s
             WHERE p.bgt_project_key = r.bgt_project_key
               AND r.bgt_kostenrubriek_key = g.bgt_kostenrubriek_key
               AND g.prs_kostensoortgrp_key = s.prs_kostensoortgrp_key
               AND p.bgt_project_key = p_bgt_project_key;

        CURSOR c_opdracht(p_kostensoort_key IN NUMBER)
        IS
            SELECT o.mld_uitvoerende_keys
                 , o.mld_opdr_key
              FROM mld_opdr o
             WHERE o.prs_kostensoort_key = p_kostensoort_key;

        iprj          NUMBER;
        iopd          NUMBER;
        ibdr          NUMBER;

        PROCEDURE delete_prs_bedrijf( p_project_key   IN NUMBER
                                    , p_mld_opdr_key  IN NUMBER
                                    , p_bedrijf_key   IN NUMBER
                                    )
        AS
            i             NUMBER;
            xprj          NUMBER;
            opdr          NUMBER;
            bedr          NUMBER;
            v_aantal_projecten   NUMBER;
            v_aantal_opdrachten  NUMBER;
        BEGIN
            xprj := p_project_key;
            opdr := p_mld_opdr_key;
            bedr := p_bedrijf_key;
            SELECT COUNT(DISTINCT p.bgt_project_key) aantal_projecten
                 , COUNT(o.mld_opdr_key)             aantal_opdrachten
              INTO v_aantal_projecten
                 , v_aantal_opdrachten
              FROM bgt_project p
                 , bgt_kostenrubriek r
                 , prs_kostensoortgrp g
                 , prs_kostensoort s
                 , mld_opdr o
             WHERE p.bgt_project_key = r.bgt_project_key
               AND r.bgt_kostenrubriek_key = g.bgt_kostenrubriek_key
               AND g.prs_kostensoortgrp_key = s.prs_kostensoortgrp_key
               AND s.prs_kostensoort_key = o.prs_kostensoort_key
               AND o.mld_uitvoerende_keys = p_bedrijf_key;
            --
            -- Om een bedrijf die alleen in het project gebruikt wordt te kunnen verwijderen
            -- mogen er geen referenties meer bestaan.
            BEGIN
                --
                IF (v_aantal_projecten = 1 AND v_aantal_opdrachten = 1) THEN
                    -- bedrijf wordt alleen in het huidige project
                    -- en in de huidige contract gebruikt, dus kan verwijderd worden.
                    DELETE
                      FROM prs_bedrijf
                     WHERE prs_bedrijf_key = p_bedrijf_key;
                    --
                    log_info('I', 'Bedrijf verwijderd'
                            , xprj, NULL, NULL, NULL, NULL, NULL, opdr, NULL, bedr
                            );
                    --
                END IF;
            EXCEPTION
                WHEN OTHERS THEN log_info('W', NULL, xprj, NULL, NULL, NULL, NULL, NULL, opdr, NULL, bedr);
                --                             xmsg, xprj, xrub, xgrp, xsrt, xbgt, xmut, opdr, fact, bedr
            END;
        END;

        PROCEDURE delete_fin_factuur( p_project_key  IN NUMBER
                                    , p_mld_opdr_key IN NUMBER)
        AS
            i             NUMBER;
            xprj          NUMBER;
            opdr          NUMBER;
        BEGIN
            xprj := p_project_key;
            opdr := p_mld_opdr_key;
            BEGIN
                DELETE
                  FROM fin_factuur
                 WHERE mld_opdr_key = p_mld_opdr_key;
                --
                i := sql%rowcount;
                log_info( 'I', 'Aantal facturen verwijderd: ' || TO_CHAR(i)
                        , xprj, NULL, NULL, NULL, NULL, NULL, opdr
                        );
            EXCEPTION
                WHEN OTHERS THEN log_info('W', NULL, xprj, NULL, NULL, NULL, NULL, NULL, opdr);
                --                             xmsg, xprj, xrub, xgrp, xsrt, xbgt, xmut, opdr, fact, bedr
            END;
        END;

        PROCEDURE delete_fin_factuur_onbekend(p_project_key IN NUMBER)
        AS
            i  NUMBER;
        BEGIN
            -- Factuur verwijst naar een kostensoort binnen het te verwijderen project,
            -- maar is niet via de mld_opdr verwijderd.
            DELETE
              FROM fin_factuur
             WHERE prs_kostensoort_key IN
                  (SELECT s.prs_kostensoort_key
                     FROM prs_kostensoort s
                        , prs_kostensoortgrp g
                        , bgt_kostenrubriek r
                    WHERE s.prs_kostensoortgrp_key = g.prs_kostensoortgrp_key
                      AND g.bgt_kostenrubriek_key = r.bgt_kostenrubriek_key
                     AND r.bgt_project_key = p_project_key
                  );
            --
            i := sql%rowcount;
            log_info( 'I', 'Aantal facturen alleen aan kostensoort gebonden verwijderd: ' || TO_CHAR(i)
                    , p_project_key
                    );
        END;

        PROCEDURE delete_mld_opdr( p_project_key  IN NUMBER
                                 , p_mld_opdr_key IN NUMBER)
        AS
            xprj          NUMBER;
            opdr          NUMBER;
        BEGIN
            xprj := p_project_key;
            opdr := p_mld_opdr_key;
            BEGIN
                DELETE
                  FROM mld_opdr
                 WHERE mld_opdr_key = p_mld_opdr_key;
                --
                log_info('I', 'Opdracht verwijderd'
                        , xprj, NULL, NULL, NULL, NULL, NULL, opdr
                        );
            EXCEPTION
                WHEN OTHERS THEN log_info('W', NULL, xprj, NULL, NULL, NULL, NULL, NULL, opdr);
                --                             xmsg, xprj, xrub, xgrp, xsrt, xbgt, xmut, opdr, fact, bedr
            END;
        END;

    BEGIN -- delete_contracten
        iprj := p_bgt_project_key;
        log_info('I', 'Bedrijven, facturen en contracten:');
        BEGIN
            FOR l_prj IN c_project_opdr
            LOOP
                FOR l_opdr IN c_opdracht(l_prj.prs_kostensoort_key)
                LOOP
                    iopd := l_opdr.mld_opdr_key;
                    ibdr := l_opdr.mld_uitvoerende_keys;
                    delete_prs_bedrijf (p_bgt_project_key, l_opdr.mld_opdr_key, l_opdr.mld_uitvoerende_keys);
                    delete_fin_factuur (p_bgt_project_key, l_opdr.mld_opdr_key);
                    delete_mld_opdr    (p_bgt_project_key, l_opdr.mld_opdr_key);
                END LOOP;
            END LOOP;
            delete_fin_factuur_onbekend(p_bgt_project_key);
        EXCEPTION
            WHEN OTHERS THEN log_info('W', NULL, iprj, NULL, NULL, NULL, NULL, NULL, iopd, NULL, ibdr);
            --                             xmsg, iprj, irub, igrp, isrt, ibgt, imut, iopd, ifac, ibdr
        END;
    END;  -- delete_contracten


    PROCEDURE delete_budgetten(p_bgt_project_key IN NUMBER)
    AS
        CURSOR c_project_bud
        IS
            SELECT b.bgt_budget_key
                 , b.bgt_kostenrubriek_key
                 , b.prs_kostensoortgrp_key
                 , b.prs_kostensoort_key
              FROM bgt_budget b
             WHERE b.bgt_project_key = p_bgt_project_key;

        ibgt          NUMBER;
        iprj          NUMBER;
        irub          NUMBER;
        igrp          NUMBER;
        isrt          NUMBER;
        v_budget_key  NUMBER;
        i             NUMBER;

        PROCEDURE delete_mutaties( p_project_key IN NUMBER
                                 , p_budget_key  IN NUMBER
                                 )
        AS
            i             NUMBER;
            xprj          NUMBER;
            xbgt          NUMBER;
        BEGIN
            xprj := p_project_key;
            xbgt := p_budget_key;
            BEGIN
                DELETE
                  FROM bgt_budgetmutatie
                 WHERE bgt_budget_key_van  = p_budget_key
                    OR bgt_budget_key_naar = p_budget_key;
                --
                i := sql%rowcount;
                log_info('I', 'Aantal budgetmutaties verwijderd: ' || TO_CHAR(i)
                        , xprj, NULL, NULL, NULL, xbgt
                        );
            EXCEPTION
                WHEN OTHERS THEN log_info('W', NULL, xprj, NULL, NULL, NULL, xbgt);
                --                             xmsg, xprj, xrub, xgrp, xsrt, xbgt, xmut, opdr, fact, bedr
            END;
        END;

        PROCEDURE delete_budget( p_project_key IN NUMBER
                               , p_budget_key  IN NUMBER
                               )
        AS
            xprj          NUMBER;
            xbgt          NUMBER;
        BEGIN
            xprj := p_project_key;
            xbgt := p_budget_key;
            BEGIN
                DELETE
                  FROM bgt_budget
                 WHERE bgt_budget_key = p_budget_key;
                --
                log_info('I', 'Budget verwijderd'
                        , xprj, NULL, NULL, NULL, xbgt
                        );
            EXCEPTION
                WHEN OTHERS THEN log_info('W', NULL, xprj, NULL, NULL, NULL, xbgt);
                --                             xmsg, xprj, xrub, xgrp, xsrt, xbgt, xmut, opdr, fact, bedr
            END;
        END;

    BEGIN -- delete_budgetten
        -- Ongeldige budgetten verwijderen.
        BEGIN
            DELETE
              FROM bgt_budgetmutatie
             WHERE bgt_budget_key_van  IN (SELECT bgt_budget_key FROM bgt_budget WHERE bgt_kostenrubriek_key IS NULL)
                OR bgt_budget_key_naar IN (SELECT bgt_budget_key FROM bgt_budget WHERE bgt_kostenrubriek_key IS NULL);
            --
            DELETE
              FROM bgt_budget
             WHERE bgt_kostenrubriek_key IS NULL;
            i := sql%rowcount;
            log_info('I', 'Aantal ongeldige budgetten verwijderd: ' || TO_CHAR(i));
        EXCEPTION
            WHEN OTHERS THEN log_info('W', 'Ongeldige budgetten');
        END;
        --
        log_info('I', 'Budgetmutaties en budgetten:');
        FOR l_prj IN c_project_bud
        LOOP
            iprj := p_bgt_project_key;
            irub := l_prj.bgt_kostenrubriek_key;
            igrp := l_prj.prs_kostensoortgrp_key;
            isrt := l_prj.prs_kostensoort_key;
            ibgt := l_prj.bgt_budget_key;
            BEGIN
                delete_mutaties(iprj, ibgt);
                delete_budget  (iprj, ibgt);
            EXCEPTION
                WHEN OTHERS THEN log_info('W', NULL, iprj, irub, igrp, isrt, ibgt);
                --                             xmsg, iprj, irub, igrp, isrt, ibgt, imut, iopd, ifac, ibdr
            END;
        END LOOP;
    END;  -- delete_budgetten

    -- Voor verwijderen van deelproject is delete_kostenplaatsen niet meer van toepassing
    -- omdat een kostenplaats nu bij een project (ins_discipline) hoort.
    -- Alleen als de discipline wordt verwijderd zouden ook de bijbehorende kostenplaatsen kunnen worden verwijderd.

    PROCEDURE delete_deelproject(p_bgt_project_key IN NUMBER)
    AS
        i             NUMBER;
    BEGIN -- delete_deelproject
        log_info('I', 'Kostensoort, kostensoortgroep, kostenrubriek en project:');
        BEGIN
            DELETE
              FROM prs_kostensoort
             WHERE prs_kostensoortgrp_key IN
                  (SELECT g.prs_kostensoortgrp_key
                     FROM bgt_kostenrubriek r
                        , prs_kostensoortgrp g
                    WHERE g.bgt_kostenrubriek_key = r.bgt_kostenrubriek_key
                      AND r.bgt_project_key = p_bgt_project_key
                  );
            i := sql%rowcount;
            log_info('I', 'Aantal kostensoorten verwijderd: ' || TO_CHAR(i));
            --
            DELETE
              FROM prs_kostensoortgrp
             WHERE bgt_kostenrubriek_key IN
                  (SELECT r.bgt_kostenrubriek_key
                     FROM bgt_kostenrubriek r
                    WHERE r.bgt_project_key = p_bgt_project_key
                  );
            i := sql%rowcount;
            log_info('I', 'Aantal kostensoortgroepen verwijderd: ' || TO_CHAR(i));
            --
            DELETE
              FROM bgt_kostenrubriek
             WHERE bgt_project_key = p_bgt_project_key;
            i := sql%rowcount;
            log_info('I', 'Aantal kostenrubrieken verwijderd: ' || TO_CHAR(i));
            --
            DELETE
              FROM bgt_project
             WHERE bgt_project_key = p_bgt_project_key;
            --
            log_info('I', 'Deelproject verwijderd', p_bgt_project_key);
        EXCEPTION
            WHEN OTHERS THEN log_info('W', NULL, p_bgt_project_key);
        END;
    END;  -- delete_deelproject

BEGIN
    log_info('I', 'START');
    delete_contracten(p_deelproject_key);
    delete_budgetten(p_deelproject_key);
    IF (NOT p_alleen_fin) THEN
        delete_deelproject(p_deelproject_key);
    END IF;
    log_info('I', 'EINDE');
    SELECT COUNT(*)
      INTO v_err_count
      FROM twyn_bgtlog
     WHERE loglevel IN ('W','E')
       AND actie = 'DELETE prj=' || TO_CHAR(p_deelproject_key);
    log_info('I', 'Aantal fouten: '|| TO_CHAR(v_err_count) );
END;
/
--
--
--
CREATE OR REPLACE PACKAGE twyn
AS
   TYPE t_cursor IS REF CURSOR;

   PROCEDURE twyn_v_detailoverzicht ( user_key    IN  NUMBER
                                    , p_datum_van IN  VARCHAR2
                                    , p_datum_tot IN  VARCHAR2
                                    , p_cursor    OUT t_cursor
                                    , p_where     IN  VARCHAR2 DEFAULT NULL
                                    );
   PROCEDURE twyn_v_contract_rubriek ( user_key    IN  NUMBER
                                     , p_datum_van IN  VARCHAR2
                                     , p_datum_tot IN  VARCHAR2
                                     , p_cursor    OUT t_cursor
                                     , p_where     IN  VARCHAR2 DEFAULT NULL
                                     );
   PROCEDURE twyn_v_contr_fact_bedrijf ( user_key    IN  NUMBER
                                       , p_datum_van IN  VARCHAR2
                                       , p_datum_tot IN  VARCHAR2
                                       , p_cursor    OUT t_cursor
                                       , p_where     IN  VARCHAR2 DEFAULT NULL
                                       );
   PROCEDURE twyn_v_factuur_datum ( user_key    IN  NUMBER
                                  , p_datum_van IN  VARCHAR2
                                  , p_datum_tot IN  VARCHAR2
                                  , p_cursor    OUT t_cursor
                                  , p_where     IN  VARCHAR2 DEFAULT NULL
                                  );
END twyn;
/

CREATE OR REPLACE PACKAGE BODY twyn
AS
   PROCEDURE twyn_v_detailoverzicht ( user_key    IN  NUMBER
                                    , p_datum_van IN  VARCHAR2
                                    , p_datum_tot IN  VARCHAR2
                                    , p_cursor    OUT t_cursor
                                    , p_where     IN  VARCHAR2 DEFAULT NULL
                                    )
   AS
      v_datum_van   DATE;
      v_datum_tot   DATE;

      v_part_A  VARCHAR2(32767);
      v_part_B  VARCHAR2(32767);
      v_part_W  VARCHAR2(32767);
      v_part_T  VARCHAR2(32767);
      v_part_L  VARCHAR2(32767);
      v_where   VARCHAR2(32767);

   BEGIN
      v_datum_van := TO_DATE(p_datum_van, 'dd-mm-yyyy');
      v_datum_tot := TO_DATE(p_datum_tot, 'dd-mm-yyyy');
      v_part_W    := SUBSTR(p_where, INSTR(p_where, 'WHERE')+6);
      v_where     := CASE WHEN v_part_W IS NOT NULL THEN 'AND ' || v_part_W ELSE '' END;

      v_part_A := 'SELECT f.*'
               || '     , 0 budget_origineel_exc'
               || '     , 0 budget_origineel_btw'
               || '     , 0 budget_actueel_exc'
               || '     , 0 budget_actueel_btw'
               || '     , 0 budget_reserve_exc'
               || '     , 0 budget_reserve_btw'
               || '     , 0 budget_mutatie_exc'
               || '     , 0 budget_mutatie_btw'
               || '     , BGT.getGecontracteerd(o.mld_opdr_key, 0, null, to_date(''' || p_datum_tot || ''', ''dd-mm-yyyy'')) gecontracteerd_exc'
               || '     , BGT.getGecontracteerd(o.mld_opdr_key, 1, null, to_date(''' || p_datum_tot || ''', ''dd-mm-yyyy'')) gecontracteerd_btw'
               || '     , BGT.getGefactureerd  (o.mld_opdr_key, 0, null, to_date(''' || p_datum_tot || ''', ''dd-mm-yyyy'')) gefactureerd_exc'
               || '     , BGT.getGefactureerd  (o.mld_opdr_key, 1, null, to_date(''' || p_datum_tot || ''', ''dd-mm-yyyy'')) gefactureerd_btw'
               || '     , p.startdatum_p'
               || '     , ''' || p_datum_tot || '''  bgt_datum'
               || '     , o.mld_opdr_key'
               || '  FROM bgt_v_project_full f'
               || '     , bgt_budget b'
               || '     , twyn_v_bgt_projectdatum p'
               || '     , mld_opdr o'
               || ' WHERE (   f.prs_kostensoort_key = b.prs_kostensoort_key'
               || '       OR (   f.bgt_kostenrubriek_key = b.bgt_kostenrubriek_key'
               || '          AND b.prs_kostensoort_key IS NULL'
               || '          )'
               || '       )'
               || '   AND f.bgt_project_key = p.bgt_project_key'
               || '   AND f.prs_kostensoort_key = o.prs_kostensoort_key'
               || '   AND f.ins_discipline_verwijder IS NULL'
               || '   AND f.bgt_project_verwijder IS NULL'
               || '   '|| v_where;

      v_part_B := 'SELECT f.*'
               || '     , BGT.getBudgetOpDatum(b.bgt_budget_key, 0, null)                                budget_origineel_exc'
               || '     , BGT.getBudgetOpDatum(b.bgt_budget_key, 1, null)                                budget_origineel_btw'
               || '     , BGT.getBudgetOpDatum(b.bgt_budget_key, 0, to_date(''' || p_datum_tot || ''', ''dd-mm-yyyy'')) budget_actueel_exc'
               || '     , BGT.getBudgetOpDatum(b.bgt_budget_key, 1, to_date(''' || p_datum_tot || ''', ''dd-mm-yyyy'')) budget_actueel_btw'
               || '     , BGT.getBudgetSoortMutatie(b.bgt_kostenrubriek_key, b.prs_kostensoortgrp_key, b.prs_kostensoort_key, 0, ''ARW'', to_date(''' || p_datum_tot || ''', ''dd-mm-yyyy'')) budget_reserve_exc'
               || '     , BGT.getBudgetSoortMutatie(b.bgt_kostenrubriek_key, b.prs_kostensoortgrp_key, b.prs_kostensoort_key, 1, '''',    to_date(''' || p_datum_tot || ''', ''dd-mm-yyyy'')) budget_reserve_btw'
               || '     , BGT.getBudgetSoortMutatie(b.bgt_kostenrubriek_key, b.prs_kostensoortgrp_key, b.prs_kostensoort_key, 0, ''EM'',  to_date(''' || p_datum_tot || ''', ''dd-mm-yyyy'')) budget_mutatie_exc'
               || '     , BGT.getBudgetSoortMutatie(b.bgt_kostenrubriek_key, b.prs_kostensoortgrp_key, b.prs_kostensoort_key, 1, ''EM'',  to_date(''' || p_datum_tot || ''', ''dd-mm-yyyy'')) budget_mutatie_btw'
               || '     , 0 gecontracteerd_exc'
               || '     , 0 gecontracteerd_btw'
               || '     , 0 gefactureerd_exc'
               || '     , 0 gefactureerd_btw'
               || '     , p.startdatum_p'
               || '     , ''' || p_datum_tot || '''  bgt_datum'
               || '     , null mld_opdr_key'
               || '  FROM bgt_v_project_full f'
               || '     , bgt_budget b'
               || '     , twyn_v_bgt_projectdatum p'
               || ' WHERE (   f.prs_kostensoort_key = b.prs_kostensoort_key'
               || '       OR (   f.bgt_kostenrubriek_key = b.bgt_kostenrubriek_key'
               || '          AND b.prs_kostensoort_key IS NULL'
               || '          )'
               || '       )'
               || '   AND f.bgt_project_key = p.bgt_project_key'
               || '   AND f.ins_discipline_verwijder IS NULL'
               || '   AND f.bgt_project_verwijder IS NULL'
               || '   '|| v_where;

      v_part_T := 'SELECT opdrachtgever'
               || '     , pcode'
               || '     , project'
               || '     , projectnaam'
               || '     , dcode'
               || '     , subproject'
               || '     , subprojectnaam'
               || '     , rcode'
               || '     , kostenrubriek'
               || '     , gcode'
               || '     , kostengroep'
               || '     , scode'
               || '     , kostensoort'
               || '     , startdatum_p'
               || '     , bgt_datum'
               || '     , bgt_kostenrubriek_key'
               || '     , sum(budget_origineel_exc) org_bedrag_exc'
               || '     , sum(budget_origineel_btw) org_bedrag_btw'
               || '     , sum(budget_actueel_exc)   bgt_bedrag_exc'
               || '     , sum(budget_actueel_btw)   bgt_bedrag_btw'
               || '     , sum(budget_reserve_exc)   res_bedrag_exc'
               || '     , sum(budget_reserve_btw)   res_bedrag_btw'
               || '     , sum(budget_mutatie_exc)   mut_bedrag_exc'
               || '     , sum(budget_mutatie_btw)   mut_bedrag_btw'
               || '     , sum(gecontracteerd_exc)   cnt_bedrag_exc'
               || '     , sum(gecontracteerd_btw)   cnt_bedrag_btw'
               || '     , sum(gefactureerd_exc)     fin_bedrag_exc'
               || '     , sum(gefactureerd_btw)     fin_bedrag_btw'
               || '  FROM (' || v_part_A || ' UNION ' || v_part_B || ')'
               || ' GROUP BY opdrachtgever'
               || '        , pcode'
               || '        , project'
               || '        , projectnaam'
               || '        , dcode'
               || '        , subproject'
               || '        , subprojectnaam'
               || '        , rcode'
               || '        , kostenrubriek'
               || '        , gcode'
               || '        , kostengroep'
               || '        , scode'
               || '        , kostensoort'
               || '        , startdatum_p'
               || '        , bgt_datum'
               || '        , bgt_kostenrubriek_key'
               || ' ORDER BY rcode';

      v_part_L := 'SELECT x.*'
               || '     , CASE WHEN scode IS NOT NULL'
                       || '     AND org_bedrag_exc = 0'
                       || '     AND org_bedrag_btw = 0'
                       || '     AND bgt_bedrag_exc = 0'
                       || '     AND bgt_bedrag_btw = 0'
                       || '     AND res_bedrag_exc = 0'
                       || '     AND res_bedrag_btw = 0'
                       || '     AND mut_bedrag_exc = 0'
                       || '     AND mut_bedrag_btw = 0'
                       || '     AND cnt_bedrag_exc = 0'
                       || '     AND cnt_bedrag_btw = 0'
                       || '     AND fin_bedrag_exc = 0'
                       || '     AND fin_bedrag_btw = 0'
                       || '    THEN 1'
                       || '    ELSE 0'
               || '       END is_leeg'
               || '  FROM (' || v_part_T || ') x';

      OPEN p_cursor FOR 'SELECT * FROM '
           || '( SELECT * FROM (' || v_part_L || ')'
           || ')';
   END;

   PROCEDURE twyn_v_contract_rubriek ( user_key    IN  NUMBER
                                     , p_datum_van IN  VARCHAR2
                                     , p_datum_tot IN  VARCHAR2  -- eigenlijk: tot-en-met
                                     , p_cursor    OUT t_cursor
                                     , p_where     IN  VARCHAR2 DEFAULT NULL
                                     )
   AS
      v_datum_van  DATE;
      v_datum_tot  DATE;

      v_part_W  VARCHAR2(32767);
      v_part_T  VARCHAR2(32767);
      v_where   VARCHAR2(32767);

   BEGIN
      v_datum_van := TO_DATE(p_datum_van, 'dd-mm-yyyy');
      v_datum_tot := TO_DATE(p_datum_tot, 'dd-mm-yyyy');
      v_part_W    := SUBSTR(p_where, INSTR(p_where, 'WHERE')+6);
      v_where     := CASE WHEN v_part_W IS NOT NULL THEN 'AND ' || v_part_W ELSE '' END;

      v_part_T := 'SELECT tp.opdrachtgever'
               || '     , tp.pcode'
               || '     , tp.project'
               || '     , tp.projectnaam'
               || '     , tp.dcode'
               || '     , tp.subproject'
               || '     , tp.subprojectnaam'
               || '     , tp.rcode'
               || '     , tp.kostenrubriek'
               || '     , tp.gcode'
               || '     , tp.kostengroep'
               || '     , tp.scode'
               || '     , tp.kostensoort'
               || '     , tp.kostencode'
               || '     , tp.kostennaam'
               || '     , b.prs_leverancier_nr'
               || '     , o.mld_opdr_ordernr'
               || '     , COALESCE(o.mld_opdr_bedrijfopdr_volgnr, 0)      mld_opdr_ordervolgnr'
               || '     , o.mld_opdr_meerwerk                             mld_opdr_meerwerk'
               || '     , o.mld_opdr_id                                   kenmerk'
               || '     , o.mld_opdr_omschrijving                         mld_opdr_omschrijving'
               || '     , kp.prs_kostenplaats_nr                          accountcode'
               || '     , kp.prs_kostenplaats_omschrijving                account'
               || '     , TO_CHAR (o.mld_opdr_datumbegin, ''DD-MM-YYYY'') datum_p'
               || '     , BGT.getGecontracteerd(o.mld_opdr_key, 0, null, to_date(''' || p_datum_tot || ''', ''dd-mm-yyyy'')) kosten'
               || '     , BGT.getGecontracteerd(o.mld_opdr_key, 1, null, to_date(''' || p_datum_tot || ''', ''dd-mm-yyyy'')) btw'
               || '     , BGT.getGefactureerd  (o.mld_opdr_key, 0, null, to_date(''' || p_datum_tot || ''', ''dd-mm-yyyy'')) facturen'
               || '     , BGT.getGefactureerd  (o.mld_opdr_key, 1, null, to_date(''' || p_datum_tot || ''', ''dd-mm-yyyy'')) facturen_btw'
               || '     , p.startdatum_p'
               || '  FROM bgt_v_project_full tp'
               || '     , prs_kostenplaats   kp'
               || '     , mld_opdr           o'
               || '     , prs_bedrijf        b'
               || '     , twyn_v_bgt_projectdatum p'
               || ' WHERE o.prs_kostensoort_key  = tp.prs_kostensoort_key'
               || '   AND o.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)'
               || '   AND o.mld_uitvoerende_keys = b.prs_bedrijf_key'
               || '   AND o.mld_statusopdr_key <> 10'  -- ter goedkeuring (=raming) hier niet in meenemen
               || '   AND tp.bgt_project_key = p.bgt_project_key'
               || '   AND tp.ins_discipline_verwijder IS NULL'
               || '   AND tp.bgt_project_verwijder IS NULL'
               || '   AND (  (    mld_opdr_datumbegin <= to_date(''' || p_datum_tot || ''', ''dd-mm-yyyy'')'
               || '           AND COALESCE(BGT.getGefactureerd(o.mld_opdr_key, 0, null, to_date(''' || p_datum_tot || ''', ''dd-mm-yyyy'')), 0) = 0'
               || '          )'
               || '       OR (COALESCE(BGT.getGefactureerd(o.mld_opdr_key, 0, null, to_date(''' || p_datum_tot || ''', ''dd-mm-yyyy'')), 0) <> 0)'
               || '       )'
               || '   '|| v_where;

      OPEN p_cursor FOR 'SELECT * FROM (' || v_part_T || ')';
   END;

   PROCEDURE twyn_v_contr_fact_bedrijf ( user_key    IN  NUMBER
                                       , p_datum_van IN  VARCHAR2
                                       , p_datum_tot IN  VARCHAR2
                                       , p_cursor    OUT t_cursor
                                       , p_where     IN  VARCHAR2 DEFAULT NULL
                                       )
   AS
      v_datum_van   DATE;
      v_datum_tot   DATE;

      v_part_D  VARCHAR2(32767);
      v_part_W  VARCHAR2(32767);
      v_part_T  VARCHAR2(32767);
      v_where   VARCHAR2(32767);

   BEGIN
      v_datum_van := TO_DATE(p_datum_van, 'dd-mm-yyyy');
      v_datum_tot := TO_DATE(p_datum_tot, 'dd-mm-yyyy');
      v_part_W    := SUBSTR(p_where, INSTR(p_where, 'WHERE')+6);
      v_where     := CASE WHEN v_part_W IS NOT NULL
                          THEN 'AND ' || v_part_W
                          ELSE ''
                     END
                  || CASE WHEN p_datum_van IS NOT NULL
                          THEN ' AND o.mld_opdr_datumbegin >= TO_DATE('''|| p_datum_van ||''', ''dd-mm-yyyy'')'
                          ELSE ''
                     END
                  || CASE WHEN p_datum_tot IS NOT NULL
                          THEN ' AND o.mld_opdr_datumbegin <= TO_DATE('''|| p_datum_tot ||''', ''dd-mm-yyyy'')'
                          ELSE ''
                     END;

      v_part_D := CASE WHEN p_datum_van IS NOT NULL
                       THEN ' AND fx.fin_factuur_advies >= TO_DATE('''|| p_datum_van ||''', ''dd-mm-yyyy'')'
                       ELSE ''
                  END
               || CASE WHEN p_datum_tot IS NOT NULL
                       THEN ' AND fx.fin_factuur_advies <= TO_DATE('''|| p_datum_tot ||''', ''dd-mm-yyyy'')'
                  END;


      v_part_T := 'SELECT tp.opdrachtgever'
               || '     , tp.pcode'
               || '     , tp.project'
               || '     , tp.subproject'
               || '     , tp.rcode'
               || '     , tp.kostenrubriek'
               || '     , tp.kostengroep'
               || '     , tp.scode'
               || '     , tp.kostensoort'
               || '     , b.prs_bedrijf_naam'
               || '     , b.prs_leverancier_nr'
               || '     , o.mld_opdr_ordernr'
               || '     , COALESCE(o.mld_opdr_bedrijfopdr_volgnr, 0)                      mld_opdr_ordervolgnr'
               || '     , o.mld_opdr_id                                                   kenmerk'
               || '     , o.mld_opdr_omschrijving'
               || '     , COALESCE(kp.prs_kostenplaats_nr, '' '')                         accountcode'
               || '     , COALESCE(kp.prs_kostenplaats_omschrijving, ''zonder account'')  account'
               || '     , o.mld_opdr_kosten'
               || '     , o.mld_opdr_kosten_btw'
               || '     , o.mld_opdr_meerwerk'
               || '     , CASE WHEN fin_factuur_key IS NULL'
               || '            THEN 1'
               || '            WHEN (SELECT MIN(fc.fin_factuur_key)'
               || '                    FROM fin_factuur fc'
               || '                   WHERE fc.mld_opdr_key = f.mld_opdr_key) = f.fin_factuur_key'
               || '            THEN 1'
               || '            ELSE 0'
               || '            END                                        contractwaarde'
               || '     , f.fin_factuur_nr'
               || '     , f.fin_factuur_opmerking'
               || '     , f.fin_factuur_totaal'
               || '     , f.fin_factuur_totaal_btw'
               || '     , o.mld_opdr_datumbegin                           contractdatum'
               || '     , f.fin_factuur_datum                             factuurdatum'
               || '     , f.fin_factuur_advies                            adviesdatum'
               || '     , TO_CHAR (o.mld_opdr_datumbegin, ''DD-MM-YYYY'') contractdatum_p'
               || '     , TO_CHAR (f.fin_factuur_datum,   ''DD-MM-YYYY'') factuurdatum_p'
               || '     , TO_CHAR (f.fin_factuur_advies,  ''DD-MM-YYYY'') adviesdatum_p'
               || '     , p.startdatum_p'
               || '  FROM (SELECT *'
               || '          FROM fin_factuur fx'
               || '         WHERE (1=1)'
               || '           '|| v_part_D
               || '       )        f'
               || '     , mld_opdr           o'
               || '     , prs_bedrijf        b'
               || '     , prs_kostenplaats   kp'
               || '     , bgt_v_project_full tp'
               || '     , twyn_v_bgt_projectdatum p'
               || ' WHERE o.mld_opdr_key = f.mld_opdr_key(+)'
               || '   AND o.prs_kostensoort_key = tp.prs_kostensoort_key'
               || '   AND o.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)'
               || '   AND o.mld_uitvoerende_keys = b.prs_bedrijf_key'
               || '   AND o.mld_statusopdr_key <> 10'
               || '   AND tp.bgt_project_key = p.bgt_project_key'
               || '   AND tp.ins_discipline_verwijder IS NULL'
               || '   AND tp.bgt_project_verwijder IS NULL'
               || '   '|| v_where;

      OPEN p_cursor FOR 'SELECT * FROM (' || v_part_T || ')';
   END;

   PROCEDURE twyn_v_factuur_datum ( user_key    IN  NUMBER
                                  , p_datum_van IN  VARCHAR2
                                  , p_datum_tot IN  VARCHAR2
                                  , p_cursor    OUT t_cursor
                                  , p_where     IN  VARCHAR2 DEFAULT NULL
                                  )
   AS
   -- Dit is een voorbereiding op #53761 Dashboard budgetbewaking
   -- waarin ook een cumulatief factuurbedrag nodig is.
      v_datum_van   DATE;
      v_datum_tot   DATE;

      v_part_W  VARCHAR2(32767);
      v_part_T  VARCHAR2(32767);
      v_where   VARCHAR2(32767);

   BEGIN
      v_datum_van := TO_DATE(p_datum_van, 'dd-mm-yyyy');
      v_datum_tot := TO_DATE(p_datum_tot, 'dd-mm-yyyy');
      v_part_W    := SUBSTR(p_where, INSTR(p_where, 'WHERE')+6);
      v_where     := CASE WHEN v_part_W IS NOT NULL
                          THEN 'AND ' || v_part_W
                          ELSE ''
                     END
                  || CASE WHEN p_datum_van IS NOT NULL
                          THEN ' AND twyn_v_factuur_datum.factuur_datum >= TO_DATE('''|| p_datum_van ||''', ''dd-mm-yyyy'')'
                          ELSE ''
                     END
                  || CASE WHEN p_datum_tot IS NOT NULL
                          THEN ' AND twyn_v_factuur_datum.factuur_datum <= TO_DATE('''|| p_datum_tot ||''', ''dd-mm-yyyy'')'
                          ELSE ''
                     END;

      v_part_T := 'SELECT factuur_datum'
               || '     , factuur_inc'
               || '     , COALESCE( SUM(factuur_inc) OVER (ORDER BY factuur_datum), 0) cumulatief'
               || '  FROM (SELECT TO_CHAR(factuur_datum, ''YYYY-MM'') AS factuur_datum'
 	           || '             , SUM(factuur_inc) AS factuur_inc'
 	           || '          FROM twyn_v_factuur_datum'
               || ' 	    WHERE 1=1'
               || '   '|| v_where
 	           || '         GROUP BY TO_CHAR(factuur_datum, ''YYYY-MM'') '
 	           || '         ORDER BY 1, 2'
 	           || '       )';


      OPEN p_cursor FOR 'SELECT * FROM (' || v_part_T || ')';
   END;

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
