<%@language = "javascript" %>
<% /*
     $Revision$
     $Id$

     File:           bgt_search_list.asp
     Description:    Presents an interactive overview of budgets and spents
     Parameters:

     Context:

*/ %>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/resultset_table_v2.inc" -->

<%
FCLTHeader.Requires({plugins: ["jQuery"]});



// FORM parameters: de waarde indien aanwezig, anders null
// Vaak is een lege selectie ook een -1, dus dan is-ie wel aanwezig, maar hoeft niet
// als filter te worden toegepast. Dan is null dus gelijk aan -1, qua betekenis,
// Vandaar dat een default van -1 ipv null ook mag
// In eerste instantie identificeren we elk veld gewoon 1-op-1.
var outputmode = getQParamInt("outputmode", 0); //  0 = screen, 1 = print, 2 = excel etc
var print = (outputmode == 1 || outputmode == 5);
var excel = (outputmode == 2 || outputmode == 6);


var bgtdisc_key = getQParamInt("dis_key"); // bgt discipline is echt vereist
var bgtproj_key_arr = getQParamIntArray("bgtproj_key", []);
var bgtrubr_key = getQParamInt("budgetcostcategory", -1);
var bgtgrp_key = getQParamInt("costtypegroup", -1);
if (bgtdisc_key > 0)
    lcl.set_dialect(bgtdisc_key, "INS_TAB_DISCIPLINE_KEY");   // TBD. Nodig?

var bgt_inclbtw = getQParam("bgt_inclbtw", "off") == "on";
var date_from = getQParamDate("date_from", null);
var date_to = getQParamDate("date_to", null);

var groupby = getQParamInt("groupby", 5); // Default groepering op kostenrubriek bij multiselect deelproject.
// -1. niks
//  1. facturen
//  2. opdrachten
//  3. kostensoort
//  4. kostensoortgrp
//  5. kostenrubriek
//  6. (deel)project
//
// IK DENK DAT IK HIER TOCH OOK NOG DE PLATTERE GROEPERINGEN WIL: alle opdrachten met SUM(facturen) en zelfs alle facturen
// Dan ben je eigenlijk in 1 scherm klaar!
// Kun je dan zelf een individuele opdracht/factuur in een popup editen? Hoe voeg je dan leuk toe?
// Ik sluit een bgt-variant van mld_opdr.asp resp fin_factuur.asp niet geheel uit. Wel met de bestaande _save.asp's

var params = { groupby: groupby, disc_key: bgtdisc_key};
var transitParam = buildTransitParam([]);

%>
  <html>
    <head>

<%
        FCLTHeader.Generate({ outputmode: outputmode });

        if (outputmode == 0)
        {
%>
        <script>
            function naarbudget(discipline_key, project_key, rubriek_key, groep_key, soort_key, deze)
            {
                <% if (groupby > 2) { %>
                    var url = "appl/bgt/bgt_budget.asp?parent=search"; // + (discipline_key ? "&budgetdiscipline="+discipline_key : "");

                    <% if (groupby==6) { %>
                        url += "&budgetproject="+project_key;
                    <% } %>
                    <% if (groupby==5) { %>
                        url += (rubriek_key ? "&budgetcostcategory="+rubriek_key : "&budgetdiscipline="+discipline_key);
                    <% } %>
                    <% if (groupby==4) { %>
                        url += "&budgetcostcategory="+rubriek_key + "&costtypegroup="+groep_key;
                    <% } %>
                    <% if (groupby==3) { %>
                        url += "&budgetcostcategory="+rubriek_key + "&costtypegroup="+groep_key + "&costtype="+soort_key;
                    <% } %>
                    FcltMgr.openDetail(url);
                <% } %>
            }

            function naaropdracht(d_key, p_key, r_key, g_key, s_key, deze)
            {
                <% if (groupby > 1) { %>
                    var url = "appl/bgt/mld_opdr.asp?parent=search";

                    <% if (groupby==6) { %>
                        url += "&budgetproject="+p_key;
                    <% } %>
                    <% if (groupby==5) { %>
                        url += (r_key ? "&budgetcostcategory="+r_key : "&budgetdiscipline="+d_key);
                    <% } %>
                    <% if (groupby==4) { %>
                        url += "&costtypegroup="+g_key;
                    <% } %>
                    <% if (groupby==3) { %>
                        url += "&costtype="+s_key;
                    <% } %>
                    <% if (groupby==2) { %>
                        if (!p_key && !r_key && !g_key && s_key)
                            url = "appl/bgt/mld_opdr.asp?id="+s_key;
                        else
                            url += "&budgetdiscipline="+d_key;
                    <% } %>
                    FcltMgr.openDetail(url, $(deze).text());
                <% } %>
            }

            function naarfacturen(ks_key, o_key, f_key, deze)
            {
                <% if (groupby>=1 && groupby<=3) { %>
                    var url = "appl/bgt/fin_factuur.asp?parent=search";

                    <% if (groupby==3) { %>
                        url += "&costtype="+ks_key;
                    <% } %>
                    <% if (groupby==2) { %>
                        url += "&order="+o_key;
                    <% } %>
                    <% if (groupby==1) { %>
                        url = "appl/bgt/fin_factuur.asp?id="+f_key;
                    <% } %>
                    FcltMgr.openDetail(url, $(deze).text());
                <% } %>
            }
<%
            var bgt_edit  = "";
            switch (groupby)
            {
                case 1: bgt_edit = "bgt/fin_factuur.asp?id="; break;
                case 2: bgt_edit = "bgt/mld_opdr.asp?id="; break;
                case 3: bgt_edit = "mgt/prs_kostensoort.asp?id="; break;
                case 4: bgt_edit = "mgt/prs_kostensoortgrp.asp?id="; break;
                case 5: bgt_edit = "bgt/bgt_kostenrubriek.asp?id="; break;
                case 6: bgt_edit = "bgt/bgt_project.asp?id="; break;
            }
%>
            function bgtEdit(row)
            {
                $(row).addClass('dirty');
                var bgt_key = row.getAttribute("ROWKEY");
                var url = "appl/<%=bgt_edit%>" + bgt_key;
                FcltMgr.openDetail(url, { reuse: true });
            }
        </script>
<%      }  // outputmode=0
%>

    </head>
    <body id="listbody">
<%
    // zoiets moet het dan gaan worden. Vast nog wat verfijnder. UNIONs met reserve e.d. nodig?
    v_sysdate = new Date();  // hiervan wordt later einde deze dag (23:59) van gemaakt.
    if (groupby == 1) // facturen
    {
        // hier heeft elke factuur precies 1 regel
        var sql = "SELECT kr.bgt_kostenrubriek_oms rubriek,"
                + "       ksg.prs_kostensoortgrp_oms groep,"
                + "       ks.prs_kostensoort_oms onderdeel,"
                + "       ks.prs_kostensoort_altcode rcode,"
                + "       ks.prs_kostensoort_altcode sortcode,"
                + "       o.prs_kostensoort_key,"
                + "       b.prs_bedrijf_naam uitvoerder,"
                + "       o.mld_opdr_id opdrachtnr,"
                + "       f.fin_factuur_nr factuur,"
                + "       f.fin_factuur_key,"
                + "       f.fin_factuur_datum factuurdatum,"
                + "       f.fin_factuur_totaal gefactureerd,"
                + "       f.fin_factuur_totaal_btw gefactureerd_btw,"
                + "       f.fin_factuur_advies adviesdatum,"
                + "       bgt_project_omschrijving deelproject,"
                + "       ins_discipline_omschrijving project"
                + "  FROM mld_opdr           o,"
                + "       prs_kostensoort    ks,"
                + "       prs_bedrijf        b,"
                + "       prs_kostensoortgrp ksg,"
                + "       bgt_kostenrubriek  kr,"
                + "       bgt_budget         bud,"
                + "       bgt_project        pr,"
                + "       ins_tab_discipline id,"
                + "       fin_factuur        f"
                + " WHERE ks.prs_kostensoort_key = o.prs_kostensoort_key"  // outer niet nodig toch
                + "   AND ksg.bgt_kostenrubriek_key = kr.bgt_kostenrubriek_key"
                + "   AND ks.prs_kostensoort_key(+) = bud.prs_kostensoort_key"
                + "   AND pr.bgt_project_key = kr.bgt_project_key"
                + "   AND ksg.prs_kostensoortgrp_key(+) = ks.prs_kostensoortgrp_key"
                + "   AND b.prs_bedrijf_key = o.mld_uitvoerende_keys"
                + "   AND f.mld_opdr_key = o.mld_opdr_key"
                + "   AND id.ins_discipline_key = pr.ins_discipline_key"
                + (date_from ? " AND f.fin_factuur_advies >= "+ date_from.beginToSQL() : "")
                + (date_to   ? " AND f.fin_factuur_advies < " + date_to.endToSQL() : "")
                + (bgtproj_key_arr.length > 0 ? " AND pr.bgt_project_key IN (" +  bgtproj_key_arr.join(",") + ")" : "")
                + (bgtrubr_key > 0 ? " AND kr.bgt_kostenrubriek_key = " + bgtrubr_key : "")
                + (bgtgrp_key > 0 ? " AND ksg.prs_kostensoortgrp_key = " + bgtgrp_key : "")
                + "   AND pr.bgt_project_verwijder IS NULL"
                + "   AND pr.ins_discipline_key =" + bgtdisc_key;

        sql += " ORDER BY bgt_project_omschrijving"
                     + ", ks.prs_kostensoort_oms"
                     + ", b.prs_bedrijf_naam"
                     + ", f.fin_factuur_datum";
    }
    else if (groupby ==2) // opdrachten
    {
        // hier heeft elke opdracht precies 1 regel
        var sql = "SELECT kr.bgt_kostenrubriek_oms rubriek,"
                + "       ksg.prs_kostensoortgrp_oms groep,"
                + "       ks.prs_kostensoort_oms onderdeel,"
                + "       ks.prs_kostensoort_altcode rcode,"
                + "       ks.prs_kostensoort_altcode sortcode,"
                + "       b.prs_bedrijf_naam uitvoerder,"
                + "       o.mld_opdr_key,"
                + "       o.mld_opdr_id opdrachtnr,"
                + "       o.mld_opdr_datumbegin opdrachtdatum,"
                + "       o.prs_kostensoort_key,"
                + "       o.mld_opdr_kosten gecontracteerd,"
                + "       MAX(COALESCE(bud.bgt_budget_bedrag, 0)) - COALESCE(o.mld_opdr_kosten, 0) tecontracteren,"
                + "       SUM (f.fin_factuur_totaal) gefactureerd,"
                + "       COALESCE(o.mld_opdr_kosten,0) - SUM (COALESCE(f.fin_factuur_totaal,0)) tefactureren,"
                + "       bgt_project_omschrijving deelproject,"
                + "       ins_discipline_omschrijving project"
                + "  FROM mld_opdr           o,"
                + "       prs_kostensoort    ks,"
                + "       prs_bedrijf        b,"
                + "       prs_kostensoortgrp ksg,"
                + "       bgt_kostenrubriek  kr,"
                + "       bgt_budget         bud,"
                + "       bgt_project        pr,"
                + "       ins_tab_discipline id,"
                + "       fin_factuur        f"
                + " WHERE ks.prs_kostensoort_key = o.prs_kostensoort_key"
                + "   AND ksg.bgt_kostenrubriek_key = kr.bgt_kostenrubriek_key"
                + "   AND ks.prs_kostensoort_key(+) = bud.prs_kostensoort_key"
                + "   AND pr.bgt_project_key = kr.bgt_project_key"
                + "   AND ksg.prs_kostensoortgrp_key = ks.prs_kostensoortgrp_key"
                + "   AND b.prs_bedrijf_key = o.mld_uitvoerende_keys"
                + "   AND f.mld_opdr_key(+) = o.mld_opdr_key"
                + "   AND id.ins_discipline_key = pr.ins_discipline_key"
                + (date_from ? " AND o.mld_opdr_datumbegin >= "+ date_from.beginToSQL() : "")
                + (date_to   ? " AND o.mld_opdr_datumbegin < " + date_to.endToSQL() : "")
                + (bgtproj_key_arr.length > 0 ? " AND pr.bgt_project_key IN (" +  bgtproj_key_arr.join(",") + ")" : "")
                + (bgtrubr_key > 0 ? " AND kr.bgt_kostenrubriek_key = " + bgtrubr_key : "")
                + (bgtgrp_key > 0 ? " AND ksg.prs_kostensoortgrp_key = " + bgtgrp_key : "")
                + "   AND pr.bgt_project_verwijder IS NULL"
                + "   AND pr.ins_discipline_key =" + bgtdisc_key;

        sql += " GROUP BY kr.bgt_kostenrubriek_oms,"
                      + " ksg.prs_kostensoortgrp_oms,"
                      + " ks.prs_kostensoort_oms,"
                      + " ks.prs_kostensoort_altcode,"
                      + " bgt_budget_bedrag,"
                      + " prs_bedrijf_naam,"
                      + " mld_opdr_kosten,"
                      + " mld_opdr_id,"
                      + " o.mld_opdr_key,"
                      + " o.prs_kostensoort_key,"
                      + " mld_opdr_datumbegin,"
                      + " bgt_project_omschrijving ,"
                      + " ins_discipline_omschrijving";

        sql += " ORDER BY bgt_project_omschrijving"
                     + ", ks.prs_kostensoort_oms";
    }
    else  // de rest
    {
        // Hierbij gaat het juist wél om de consolidatie, bgt_budget is de centrale tabel hier (is it?)
        //  3. kostensoort
        //  4. kostensoortgrp
        //  5. kostenrubriek
        //  6. deelproject

        // Moet in 2x: eerst de budgetten (van meerdere levels) bepalen, straks de uitnutting (op 1 level)
        // Budgetten kunnen aan rubriek, groep of onderdeel (prs_kostensoort) gekoppeld zijn
        // Uitnutting kan alleen op onderdeel (prs_kostensoort). Dan wordt het best ingewikkeld, vandaar.

        // We maken gebruik van dat bij een budget op een bepaald niveau ook de bovenliggende keys gevuld zijn

        // Om het leesbaar te houden toch maar 4 x uitschrijven.

        if (groupby == 3) //  3. kostensoort
        {
            // hier komt elke kostensoort *met een budget*, waarbij 0 of meer opdrachten kunnen bestaan
            // Let op: er kunnen budgetten op kostensoortgroep en rubriek zijn gedefinieerd, die zijn dus niet van de kostensoort
            // en daar zijn dus ook niet direct opdrachten en facturen bij.
            // Die worden afzonderlijk bijgevoegd (UNION) om wel het totaal te krijgen qua budget

            // Eerst de budgetten direct bij kostensoort
            var sql1 = "SELECT pb.project        project"
                     + "     , pb.subproject     deelproject"
                     + "     , pb.kostenrubriek  rubriek"
                     + "     , pb.kostengroep    groep"
                     + "     , pb.bgt_project_key"
                     + "     , pb.bgt_kostenrubriek_key"
                     + "     , pb.prs_kostensoortgrp_key"
                     + "     , pb.prs_kostensoort_key"
                     + "     , pb.kostensoort onderdeel"
                     + "     , pb.scode rcode"
                     + "     , pb.scode sortcode"
                     + "     , MAX(BGT.getBudgetOpDatum(pb.bgt_budget_key, "+ (bgt_inclbtw ? 2 : 0) + ", NULL))                          budget_origineel"
                     + "     , MAX(BGT.getBudgetOpDatum(pb.bgt_budget_key, "+ (bgt_inclbtw ? 2 : 0) + ", " + v_sysdate.endToSQL() + "))  budget_actueel"
                     + "     , MAX(BGT.getBudgetSoortMutatie(pb.bgt_kostenrubriek_key, pb.prs_kostensoortgrp_key, pb.prs_kostensoort_key, "+ (bgt_inclbtw ? 2 : 0) + ", 'ARW', NULL)) budget_reserve"
                     + "     , MAX(BGT.getBudgetSoortMutatie(pb.bgt_kostenrubriek_key, pb.prs_kostensoortgrp_key, pb.prs_kostensoort_key, "+ (bgt_inclbtw ? 2 : 0) + ", 'EM',  NULL)) budget_mutatie"
                     + "  FROM (SELECT pr.*"
                             + "     , (SELECT b.bgt_budget_key"
                             + "          FROM bgt_budget b"
                             + "         WHERE ((pr.rcode <> 'R') AND (b.prs_kostensoort_key   = pr.prs_kostensoort_key))"
                             + "            OR ((pr.rcode =  'R') AND (b.bgt_kostenrubriek_key = pr.bgt_kostenrubriek_key))"
                             + "       ) bgt_budget_key"
                             + "  FROM bgt_v_project_full pr"
                             + "     , prs_kostensoortgrp kg"
                             + "     , prs_kostensoort ks"
                             + " WHERE pr.bgt_project_verwijder IS NULL"
                             + "   AND pr.prs_kostensoortgrp_key = kg.prs_kostensoortgrp_key(+)"
                             + "   AND pr.prs_kostensoort_key = ks.prs_kostensoort_key(+)"
                             + "   AND ks.prs_kostensoort_verwijder IS NULL"
                             + "   AND kg.prs_kostensoortgrp_verwijder IS NULL"
                             + (bgtproj_key_arr.length > 0 ? " AND pr.bgt_project_key IN (" +  bgtproj_key_arr.join(",") + ")" : "")
                             + (bgtrubr_key > 0 ? "AND pr.bgt_kostenrubriek_key = " + bgtrubr_key : "")
                             + (bgtgrp_key > 0 ? " AND pr.prs_kostensoortgrp_key = " + bgtgrp_key : "")
                             + "   AND pr.ins_discipline_key = " + bgtdisc_key
                     + "       ) pb"
            sql1 += " GROUP BY pb.kostengroep"
                          + ", pb.prs_kostensoort_key"
                          + ", pb.scode"
                          + ", pb.kostensoort"
                          + ", pb.scode"
                          + ", pb.prs_kostensoortgrp_key"
                          + ", pb.kostenrubriek"
                          + ", pb.bgt_kostenrubriek_key"
                          + ", pb.bgt_project_key"
                          + ", pb.subproject"
                          + ", pb.project";
        }

        if (groupby == 4) //  4. kostensoortgrp
        {
            var sql1 = "SELECT pr.project"
                     + "     , pr.subproject     deelproject"
                     + "     , pr.kostenrubriek  rubriek"
                     + "     , pr.gcode          rcode"
                     + "     , pr.gcode          sortcode"
                     + "     , pr.kostengroep    groep"
                     + "     , pr.ins_discipline_key"
                     + "     , pr.bgt_project_key"
                     + "     , pr.bgt_kostenrubriek_key"
                     + "     , pr.prs_kostensoortgrp_key"
                     + "     , bd.budget_origineel"
                     + "     , bd.budget_actueel"
                     + "     , bd.budget_reserve"
                     + "     , bd.budget_mutatie"
                     + "  FROM bgt_v_project_full pr"
                     + "     , prs_kostensoortgrp kg"
                     + "     , prs_kostensoort ks"
                     + "     , (SELECT sb.prs_kostensoortgrp_key"
                          + "        , SUM(BGT.getBudgetOpDatum (sb.bgt_budget_key, "+ (bgt_inclbtw ? 2 : 0) + ", NULL))                          budget_origineel"
                          + "        , SUM(BGT.getBudgetOpDatum (sb.bgt_budget_key, "+ (bgt_inclbtw ? 2 : 0) + ", " + v_sysdate.endToSQL() + "))  budget_actueel"
                          + "        , MAX(BGT.getBudgetSoortMutatie(NULL, sb.prs_kostensoortgrp_key, -1, "+ (bgt_inclbtw ? 2 : 0) + ", 'ARW', NULL)) budget_reserve"
                          + "        , MAX(BGT.getBudgetSoortMutatie(NULL, sb.prs_kostensoortgrp_key, -1, "+ (bgt_inclbtw ? 2 : 0) + ", 'EM',  NULL)) budget_mutatie"
                          + "     FROM bgt_budget sb"
                          + "    WHERE sb.prs_kostensoortgrp_key IS NOT NULL"
                          + "      AND sb.ins_discipline_key = " + bgtdisc_key
                          + (bgtproj_key_arr.length > 0 ? " AND sb.bgt_project_key IN (" +  bgtproj_key_arr.join(",") + ")" : "")
                          + (bgtrubr_key > 0 ? " AND sb.bgt_kostenrubriek_key = " + bgtrubr_key : "")
                          + "    GROUP BY sb.prs_kostensoortgrp_key"
                          + "  ) bd"
                     + " WHERE pr.prs_kostensoortgrp_key = bd.prs_kostensoortgrp_key"
                     + "   AND pr.prs_kostensoortgrp_key = kg.prs_kostensoortgrp_key(+)"
                     + "   AND pr.prs_kostensoort_key = ks.prs_kostensoort_key(+)"
                     + "   AND kg.prs_kostensoortgrp_verwijder IS NULL"
                     + "   AND ks.prs_kostensoort_verwijder IS NULL"
                     + "   AND pr.bgt_project_verwijder IS NULL"
                     + " UNION "
                     + "SELECT pr.project"
                     + "     , pr.subproject     deelproject"
                     + "     , pr.kostenrubriek  rubriek"
                     + "     , pr.rcode||'.R'    rcode"
                     + "     , pr.rcode||'.Z'    sortcode"
                     + "     , pr.kostenrubriek||' Reserve'  groep"
                     + "     , pr.ins_discipline_key"
                     + "     , pr.bgt_project_key"
                     + "     , pr.bgt_kostenrubriek_key"
                     + "     , pr.prs_kostensoortgrp_key"
                     + "     , bd.budget_origineel"
                     + "     , bd.budget_actueel"
                     + "     , bd.budget_reserve"
                     + "     , bd.budget_mutatie"
                     + "  FROM bgt_v_project_full pr"
                     + "     , prs_kostensoortgrp kg"
                     + "     , prs_kostensoort ks"
                     + "     , (SELECT sb.bgt_kostenrubriek_key"
                          + "        , SUM(BGT.getBudgetOpDatum (sb.bgt_budget_key, "+ (bgt_inclbtw ? 2 : 0) + ", NULL))                         budget_origineel"
                          + "        , SUM(BGT.getBudgetOpDatum (sb.bgt_budget_key, "+ (bgt_inclbtw ? 2 : 0) + ", " + v_sysdate.endToSQL() + ")) budget_actueel"
                          + "        , MAX(BGT.getBudgetSoortMutatie(sb.bgt_kostenrubriek_key, NULL, NULL, "+ (bgt_inclbtw ? 2 : 0) + ", 'ARW', NULL)) budget_reserve"
                          + "        , MAX(BGT.getBudgetSoortMutatie(sb.bgt_kostenrubriek_key, NULL, NULL, "+ (bgt_inclbtw ? 2 : 0) + ", 'EM',  NULL)) budget_mutatie"
                          + "     FROM bgt_budget sb"
                          + "    WHERE sb.prs_kostensoortgrp_key IS NULL "
                          + "      AND sb.prs_kostensoort_key IS NULL"
                          + "      AND sb.ins_discipline_key = " + bgtdisc_key
                          + (bgtproj_key_arr.length > 0 ? " AND sb.bgt_project_key IN (" +  bgtproj_key_arr.join(",") + ")" : "")
                          + (bgtrubr_key > 0 ? " AND sb.bgt_kostenrubriek_key = " + bgtrubr_key : "")
                          + "    GROUP BY sb.bgt_kostenrubriek_key"
                          + "  ) bd"
                     + " WHERE pr.bgt_kostenrubriek_key = bd.bgt_kostenrubriek_key"
                     + "   AND pr.prs_kostensoortgrp_key = kg.prs_kostensoortgrp_key(+)"
                     + "   AND pr.prs_kostensoort_key = ks.prs_kostensoort_key(+)"
                     + "   AND kg.prs_kostensoortgrp_verwijder IS NULL"
                     + "   AND ks.prs_kostensoort_verwijder IS NULL"                     
                     + "   AND pr.bgt_project_verwijder IS NULL"
                     + "   AND pr.prs_kostensoortgrp_key IS NULL"
                     + "   AND (bd.budget_actueel <> 0 OR bd.budget_reserve <> 0 OR bd.budget_mutatie <> 0)";
        }

        if (groupby == 5)  //  5. kostenrubriek
        {
            var sql1 = "SELECT DISTINCT"
                     + "       pr.project        project"
                     + "     , pr.subproject     deelproject"
                     + "     , pr.kostenrubriek  rubriek"
                     + "     , pr.rcode          rcode"
                     + "     , CASE WHEN pr.rcode = 'R' THEN '91' ELSE pr.rcode END sortcode"
                     + "     , pr.ins_discipline_key"
                     + "     , pr.bgt_project_key"
                     + "     , pr.bgt_kostenrubriek_key"
                     + "     , bd.budget_origineel"
                     + "     , bd.budget_actueel"
                     + "     , bd.budget_reserve"
                     + "     , bd.budget_mutatie"
                     + "  FROM bgt_v_project_full pr"
                     + "     , prs_kostensoortgrp kg"
                     + "     , prs_kostensoort ks"
                     + "     , (SELECT sb.bgt_project_key"
                          + "        , sb.bgt_kostenrubriek_key"
                          + "        , SUM(BGT.getBudgetOpDatum (sb.bgt_budget_key, 0, NULL))                          budget_origineel"
                          + "        , SUM(BGT.getBudgetOpDatum (sb.bgt_budget_key, 0, " + v_sysdate.endToSQL() + "))  budget_actueel"
                          + "        , MAX(BGT.getBudgetSoortMutatie(sb.bgt_kostenrubriek_key, -1, -1, 0, 'ARW', NULL)) budget_reserve"
                          + "        , MAX(BGT.getBudgetSoortMutatie(sb.bgt_kostenrubriek_key, -1, -1, 0, 'EM', NULL)) budget_mutatie"
                          + "     FROM bgt_budget sb"
                          + "    WHERE sb.bgt_kostenrubriek_key IS NOT NULL"
                          + "      AND sb.ins_discipline_key = " + bgtdisc_key
                          + (bgtproj_key_arr.length > 0 ? " AND sb.bgt_project_key IN (" +  bgtproj_key_arr.join(",") + ")" : "")
                          + "    GROUP BY sb.bgt_project_key"
                          + "           , sb.bgt_kostenrubriek_key"
                          + "  ) bd"
                     + " WHERE pr.bgt_project_key = bd.bgt_project_key"
                     + "   AND pr.prs_kostensoortgrp_key = kg.prs_kostensoortgrp_key(+)"
                     + "   AND pr.prs_kostensoort_key = ks.prs_kostensoort_key(+)"
                     + "   AND ks.prs_kostensoort_verwijder IS NULL"
                     + "   AND pr.bgt_project_verwijder IS NULL"
                     + "   AND pr.bgt_kostenrubriek_key = bd.bgt_kostenrubriek_key";

            if (bgt_inclbtw)
            {
                //BTW
                sql1 += " UNION "
                         + "SELECT DISTINCT"
                         + "       pr.project        project"
                         + "     , pr.subproject     deelproject"
                         + "     , 'BTW'             rubriek"
                         + "     , 'B'               rcode"
                         + "     , '92'              sortcode"
                         + "     , pr.ins_discipline_key"
                         + "     , pr.bgt_project_key"
                         + "     , -3   bgt_kostenrubriek_key"
                         + "     , SUM(bd.budget_origineel) budget_origineel"
                         + "     , SUM(bd.budget_actueel)   budget_actueel"
                         + "     , MAX(bd.budget_reserve)   budget_reserve"
                         + "     , SUM(bd.budget_mutatie)   budget_mutatie"
                         + "  FROM bgt_v_project_full pr"
                         + "     , prs_kostensoortgrp kg"
                         + "     , prs_kostensoort ks"
                         + "     , (SELECT sb.bgt_project_key"
                              + "        , sb.bgt_kostenrubriek_key"
                              + "        , SUM(BGT.getBudgetOpDatum (sb.bgt_budget_key, 1, NULL))                          budget_origineel"
                              + "        , SUM(BGT.getBudgetOpDatum (sb.bgt_budget_key, 1, " + v_sysdate.endToSQL() + "))  budget_actueel"
                              + "        , MAX(BGT.getBudgetSoortMutatie(sb.bgt_kostenrubriek_key, -1, -1, 1, '',  NULL))  budget_reserve"
                              + "        , MAX(BGT.getBudgetSoortMutatie(sb.bgt_kostenrubriek_key, -1, -1, 1, 'EM', NULL)) budget_mutatie"
                              + "     FROM bgt_budget sb"
                              + "    WHERE sb.bgt_kostenrubriek_key IS NOT NULL"
                              + "      AND sb.ins_discipline_key = " + bgtdisc_key
                              + (bgtproj_key_arr.length > 0 ? " AND sb.bgt_project_key IN (" +  bgtproj_key_arr.join(",") + ")" : "")
                              + "    GROUP BY sb.bgt_project_key"
                              + "           , sb.bgt_kostenrubriek_key"
                              + "  ) bd"
                         + " WHERE pr.bgt_kostenrubriek_key = bd.bgt_kostenrubriek_key"
                         + "   AND pr.prs_kostensoortgrp_key = kg.prs_kostensoortgrp_key(+)"
                         + "   AND pr.prs_kostensoort_key = ks.prs_kostensoort_key(+)"
                         + "   AND ks.prs_kostensoort_verwijder IS NULL"
                         + "   AND pr.bgt_project_verwijder IS NULL"
                         + "   AND pr.gcode IS NULL"
                         + "   AND pr.scode IS NULL"
                         + " GROUP BY pr.project"
                         + "        , pr.subproject"
                         + "        , pr.ins_discipline_key"
                         + "        , pr.bgt_project_key";
            }
        }

        if (groupby == 6) //  6. deelproject
        {
            var sql1 = "SELECT db.project"
                     + "     , db.subproject deelproject"
                     + "     , sb.bgt_project_key"
                     + "     , SUM(BGT.getBudgetOpDatum (sb.bgt_budget_key, "+ (bgt_inclbtw ? 2 : 0) +", NULL))                         budget_origineel"
                     + "     , SUM(BGT.getBudgetOpDatum (sb.bgt_budget_key, "+ (bgt_inclbtw ? 2 : 0) +", " + v_sysdate.endToSQL() + ")) budget_actueel"
                     + "     , MAX(mb.budget_reserve) budget_reserve"
                     + "     , MAX(mb.budget_mutatie) budget_mutatie"
                     + "  FROM bgt_budget sb"
                     + "     , ( SELECT b.bgt_project_key"
                           + "        , SUM(BGT.getBudgetSoortMutatie(b.bgt_kostenrubriek_key, -1, -1, "+ (bgt_inclbtw ? 2 : 0) +", 'AR', NULL)) budget_reserve"
                           + "        , SUM(BGT.getBudgetSoortMutatie(b.bgt_kostenrubriek_key, -1, -1, "+ (bgt_inclbtw ? 2 : 0) +", 'EM', NULL)) budget_mutatie"
                           + "     FROM bgt_budget b"
                           + "    WHERE b.ins_discipline_key = " + bgtdisc_key
                           + (bgtproj_key_arr.length > 0 ? " AND b.bgt_project_key IN (" +  bgtproj_key_arr.join(",") + ")" : "")
                           + "      AND b.bgt_kostenrubriek_key IS NOT NULL"
                           + "      AND b.prs_kostensoortgrp_key IS NULL"
                           + "      AND b.prs_kostensoort_key IS NULL"
                           + "    GROUP BY bgt_project_key"
                           + " ) mb"
                     + "     , (SELECT DISTINCT"
                           + "         ins_discipline_key"
                           + "       , bgt_project_key"
                           + "       , project"
                           + "       , subproject"
                           + "    FROM bgt_v_project_full tp"
                           + "       , prs_kostensoortgrp kg"
                           + "       , prs_kostensoort ks"
                           + "   WHERE tp.ins_discipline_key = " + bgtdisc_key
                           + "     AND tp.prs_kostensoortgrp_key = kg.prs_kostensoortgrp_key(+)"
                           + "     AND tp.prs_kostensoort_key = ks.prs_kostensoort_key(+)"
                           + "     AND ks.prs_kostensoort_verwijder IS NULL"
                           + "     AND tp.bgt_project_verwijder IS NULL"
                           + (bgtproj_key_arr.length > 0 ? " AND tp.bgt_project_key IN (" +  bgtproj_key_arr.join(",") + ")" : "")
                           + " ) db"
                     + " WHERE sb.bgt_project_key = db.bgt_project_key"
                     + "   AND sb.bgt_project_key = mb.bgt_project_key"
                     + "   AND sb.ins_discipline_key = " + bgtdisc_key
                     + (bgtproj_key_arr.length > 0 ? " AND sb.bgt_project_key IN (" +  bgtproj_key_arr.join(",") + ")" : "")
                     + " GROUP BY sb.bgt_project_key"
                     + "        , db.project"
                     + "        , db.subproject";
        }

        // Deel 1 klaar: hierboven zijn de budgetten bepaald. Nu de besteding
        // MERK OP: hier zouden in het algemeen ook andere verplichtingen bij moeten (bestellingen, contracten, reserveringen)
        // zoals die via de kostensoort kunnen worden bijgevonden. Dat is voor een latere versie.

        // TODO: de besteding van de BTW (bgt_inclbtw) moet er op een of andere manier bijgejoined worden.
        // Dat moet dan op de aparte BTW-regel (rubriek -3) gepresenteerd worden, dus niet in de reguliere besteding
        // Opdrachten: BTW obv ??? Die weten we nog niet!
        // Facturen: BTW obv fin_factuur_totaal_btw

        // Eerst maar de OPDRACHTEN PER KOSTENSOORT
        var sql2a = "SELECT id.ins_discipline_key"
                  + "     , pr.bgt_project_key"
                  + "     , kr.bgt_kostenrubriek_key"
                  + "     , ksg.prs_kostensoortgrp_key"
                  + "     , ks.prs_kostensoort_key"
                  + "     , SUM(COALESCE(o.mld_opdr_kosten, 0))" + (bgt_inclbtw && groupby != 5 ? " + SUM(COALESCE(o.mld_opdr_kosten_btw, 0))" : "") + " gecontracteerd"
                  + "  FROM mld_opdr           o" /* zonder de facturen, anders wordt verdubbeld */
                  + "     , prs_kostensoort    ks"
                  + "     , prs_kostensoortgrp ksg"
                  + "     , bgt_kostenrubriek  kr"
                  + "     , bgt_project        pr"
                  + "     , ins_tab_discipline id"
                  + " WHERE ks.prs_kostensoort_key = o.prs_kostensoort_key(+)"
                  + "   AND ksg.bgt_kostenrubriek_key = kr.bgt_kostenrubriek_key"
                  + "   AND ksg.prs_kostensoortgrp_key = ks.prs_kostensoortgrp_key"
                  + "   AND ksg.prs_kostensoortgrp_verwijder IS NULL"
                  + "   AND pr.bgt_project_key = kr.bgt_project_key"
                  + "   AND id.ins_discipline_key = pr.ins_discipline_key"
                  + "   AND o.mld_statusopdr_key <> 10"  // ter goedkeuring (=raming) hier niet in meenemen!
                  + (date_from ? " AND o.mld_opdr_datumbegin >= "+ date_from.beginToSQL() : "")
                  + (date_to   ? " AND o.mld_opdr_datumbegin <  "+ date_to.endToSQL() : "")
                  + (bgtproj_key_arr.length > 0 ? " AND pr.bgt_project_key IN (" +  bgtproj_key_arr.join(",") + ")" : "")
                  + "   AND pr.bgt_project_verwijder IS NULL"
                  + "   AND pr.ins_discipline_key = " + bgtdisc_key
                  + " GROUP BY id.ins_discipline_key"
                  + "        , pr.bgt_project_key"
                  + "        , kr.bgt_kostenrubriek_key"
                  + "        , ksg.prs_kostensoortgrp_key"
                  + "        , ks.prs_kostensoort_key";
        if (bgt_inclbtw && groupby == 5)  // btw-regel bij groeperen op kostenrubriek
        {
            sql2a += " UNION "
                   + "SELECT ins_discipline_key"
                   + "     , MAX(bgt_project_key)"
                   + "     , MAX(bgt_kostenrubriek_key)"
                   + "     , MAX(prs_kostensoortgrp_key)"
                   + "     , MAX(prs_kostensoort_key)"
                   + "     , SUM(gecontracteerd) gecontracteerd"
                   + "  FROM ("
                         + "SELECT id.ins_discipline_key"
                         + "     , pr.bgt_project_key"
                         + "     , -3 bgt_kostenrubriek_key"
                         + "     , -3 prs_kostensoortgrp_key"
                         + "     , -3 prs_kostensoort_key"
                         + "     , SUM(COALESCE (o.mld_opdr_kosten_btw, 0)) gecontracteerd"
                         + "  FROM mld_opdr           o"
                         + "     , prs_kostensoort    ks"
                         + "     , prs_kostensoortgrp ksg"
                         + "     , bgt_kostenrubriek  kr"
                         + "     , bgt_project        pr"
                         + "     , ins_tab_discipline id"
                         + " WHERE ks.prs_kostensoort_key = o.prs_kostensoort_key(+)"
                         + "   AND ksg.bgt_kostenrubriek_key = kr.bgt_kostenrubriek_key"
                         + "   AND ksg.prs_kostensoortgrp_key = ks.prs_kostensoortgrp_key"
                         + "   AND pr.bgt_project_key = kr.bgt_project_key"
                         + "   AND id.ins_discipline_key = pr.ins_discipline_key"
                         + "   AND o.mld_statusopdr_key <> 10"  // ter goedkeuring (=raming) hier niet in meenemen!
                         + (date_from ? " AND o.mld_opdr_datumbegin >= "+ date_from.beginToSQL() : "")
                         + (date_to   ? " AND o.mld_opdr_datumbegin <  "+ date_to.endToSQL() : "")
                         + (bgtproj_key_arr.length > 0 ? " AND pr.bgt_project_key IN (" +  bgtproj_key_arr.join(",") + ")" : "")
                         + "   AND pr.bgt_project_verwijder IS NULL"
                         + "   AND pr.ins_discipline_key = " + bgtdisc_key
                         + " GROUP BY id.ins_discipline_key"
                         + "        , pr.bgt_project_key"
                   + "        )"
                   + " GROUP BY ins_discipline_key";
        }

        // Vervolgens de FACTURATIE PER KOSTENSOORT
        var sql2b = "SELECT id.ins_discipline_key"
                  + "     , pr.bgt_project_key"
                  + "     , kr.bgt_kostenrubriek_key"
                  + "     , ksg.prs_kostensoortgrp_key"
                  + "     , ks.prs_kostensoort_key"
                  + "     , SUM(COALESCE(f.fin_factuur_totaal, 0))" + (bgt_inclbtw && groupby != 5 ? " + SUM(COALESCE(f.fin_factuur_totaal_btw, 0))" : "") + " gefactureerd"
                  + "  FROM fin_factuur        f"
                  + "     , mld_opdr           o"
                  + "     , prs_kostensoort    ks"
                  + "     , prs_kostensoortgrp ksg"
                  + "     , bgt_kostenrubriek  kr"
                  + "     , bgt_project        pr"
                  + "     , ins_tab_discipline id"
                  + " WHERE f.mld_opdr_key(+) = o.mld_opdr_key"
                  + "   AND ks.prs_kostensoort_key = o.prs_kostensoort_key(+)"
                  + "   AND ksg.bgt_kostenrubriek_key = kr.bgt_kostenrubriek_key"
                  + "   AND ksg.prs_kostensoortgrp_key = ks.prs_kostensoortgrp_key"
                  + "   AND pr.bgt_project_key = kr.bgt_project_key"
                  + "   AND id.ins_discipline_key = pr.ins_discipline_key"
                  + (date_from ? " AND f.fin_factuur_advies >= "+ date_from.beginToSQL() : "")
                  + (date_to   ? " AND f.fin_factuur_advies <  "+ date_to.endToSQL() : "")
                  + (bgtproj_key_arr.length > 0 ? " AND pr.bgt_project_key IN (" +  bgtproj_key_arr.join(",") + ")" : "")
                  + "   AND pr.bgt_project_verwijder IS NULL"
                  + "   AND pr.ins_discipline_key = " + bgtdisc_key
                  + " GROUP BY id.ins_discipline_key"
                  + "        , pr.bgt_project_key"
                  + "        , kr.bgt_kostenrubriek_key"
                  + "        , ksg.prs_kostensoortgrp_key"
                  + "        , ks.prs_kostensoort_key";
        if (bgt_inclbtw && groupby == 5)  // btw-regel bij groeperen op kostenrubriek
        {

            sql2b += " UNION "
                   + "SELECT ins_discipline_key"
                   + "     , MAX(bgt_project_key)"
                   + "     , MAX(bgt_kostenrubriek_key)"
                   + "     , MAX(prs_kostensoortgrp_key)"
                   + "     , MAX(prs_kostensoort_key)"
                   + "     , SUM(gefactureerd) gefactureerd"
                   + "  FROM ("
                         + "SELECT id.ins_discipline_key"
                         + "     , pr.bgt_project_key"
                         + "     , -3 bgt_kostenrubriek_key"
                         + "     , -3 prs_kostensoortgrp_key"
                         + "     , -3 prs_kostensoort_key"
                         + "     , SUM(COALESCE(f.fin_factuur_totaal_btw, 0)) gefactureerd"
                         + "  FROM fin_factuur        f"
                         + "     , mld_opdr           o"
                         + "     , prs_kostensoort    ks"
                         + "     , prs_kostensoortgrp ksg"
                         + "     , bgt_kostenrubriek  kr"
                         + "     , bgt_project        pr"
                         + "     , ins_tab_discipline id"
                         + " WHERE o.mld_opdr_key = f.mld_opdr_key(+)"
                         + "   AND ks.prs_kostensoort_key = o.prs_kostensoort_key(+)"
                         + "   AND ksg.bgt_kostenrubriek_key = kr.bgt_kostenrubriek_key"
                         + "   AND ksg.prs_kostensoortgrp_key = ks.prs_kostensoortgrp_key"
                         + "   AND pr.bgt_project_key = kr.bgt_project_key"
                         + "   AND id.ins_discipline_key = pr.ins_discipline_key"
                         + (date_from ? " AND f.fin_factuur_advies >= "+ date_from.beginToSQL() : "")
                         + (date_to   ? " AND f.fin_factuur_advies <  "+ date_to.endToSQL() : "")
                         + (bgtproj_key_arr.length > 0 ? " AND pr.bgt_project_key IN (" +  bgtproj_key_arr.join(",") + ")" : "")
                         + "   AND pr.bgt_project_verwijder IS NULL"
                         + "   AND pr.ins_discipline_key = " + bgtdisc_key
                         + " GROUP BY id.ins_discipline_key"
                         + "        , pr.bgt_project_key"
                   + "        )"
                   + " GROUP BY ins_discipline_key";
         }

        // BESTEDING nu bepaald uit combinatie van bovenstaande opdrachten en facturen
        var sql2 = "SELECT opdr.ins_discipline_key"
                 + "     , opdr.bgt_project_key"
                 + "     , opdr.bgt_kostenrubriek_key"
                 + "     , opdr.prs_kostensoortgrp_key"
                 + "     , opdr.prs_kostensoort_key prs_kostensoort_key"
                 + "     , SUM(opdr.gecontracteerd) gecontracteerd"
                 + "     , SUM(fact.gefactureerd) gefactureerd"
                 + "     , SUM(COALESCE(opdr.gecontracteerd, 0)) - SUM(COALESCE(fact.gefactureerd, 0)) tefactureren"
                 + "  FROM (" + sql2a + ") opdr"
                 + "     , (" + sql2b + ") fact"
                 + " WHERE opdr.prs_kostensoort_key = fact.prs_kostensoort_key(+)"
                 + " GROUP BY opdr.ins_discipline_key"
                 + "        , opdr.bgt_project_key"
                 + "        , opdr.bgt_kostenrubriek_key"
                 + "        , opdr.prs_kostensoortgrp_key"
                 + "        , opdr.prs_kostensoort_key";

        //
        // Hier komen ze bij elkaar: de budgetten en de besteding, met de respectievelijke groeperingen
        // sql1 heeft de benamingen en de budgetten met kostensoort_key (die NULL kan zijn!), sql2 de kostensoort_key en de bestedingen
        //
        var som_rubriek = (groupby == 5 && bgtproj_key_arr.length != 1);
        var sql_columns5 = "  project"
                         + ", sortcode"
                         + ", rubriek"
                         + ", rcode"
                         + ", SUM(budget_reserve) budget_reserve"
                         + ", SUM(budget_mutatie) budget_mutatie"
                         + ", SUM(budget_origineel) budget_origineel"
                         + ", SUM(budget_actueel) budget_actueel"
                         + ", SUM(gecontracteerd) gecontracteerd"
                         + ", SUM(tecontracteren) tecontracteren"
                         + ", SUM(gefactureerd) gefactureerd"
                         + ", SUM(tefactureren) tefactureren";

        var sql = "SELECT" + (som_rubriek ? sql_columns5 : " *")
                + "  FROM (SELECT bud.project project,"
                + "               bud.deelproject deelproject,"
                + "               bud.bgt_project_key,"
                + (groupby <= 5 ? " bud.sortcode, bud.rubriek rubriek, bud.rcode rcode, bud.bgt_kostenrubriek_key," : "")
                + (groupby <= 4 ? " bud.groep groep, bud.prs_kostensoortgrp_key," : "")
                + (groupby <= 3 ? " bud.onderdeel onderdeel, bud.prs_kostensoort_key," : "")
                + "               MAX(bud.budget_reserve) budget_reserve,"
                + "               MAX(bud.budget_actueel)  budget_actueel, "
                + "               MAX(bud.budget_origineel) budget_origineel,"
                + "               MAX(bud.budget_mutatie) budget_mutatie,"
                + "               SUM(besteding.gecontracteerd) gecontracteerd,"
                + "               MAX(COALESCE(bud.budget_actueel, 0)) - SUM(COALESCE(besteding.gecontracteerd, 0)) tecontracteren,"
                + "               SUM(besteding.gefactureerd) gefactureerd,"
                + "               SUM(besteding.tefactureren) tefactureren"
                + "          FROM (" + sql1 + ") bud,"
                + "               (" + sql2 + ") besteding"
                + (groupby == 3 ? " WHERE bud.prs_kostensoort_key = besteding.prs_kostensoort_key(+) " : "")
                + (groupby == 4 ? " WHERE bud.prs_kostensoortgrp_key = besteding.prs_kostensoortgrp_key(+) " : "")
                + (groupby == 5 ? " WHERE bud.bgt_kostenrubriek_key = besteding.bgt_kostenrubriek_key(+) and bud.bgt_project_key = besteding.bgt_project_key(+) " : "")  // de reserve en BTW hebben geen echte rubriek_key
                + (groupby == 6 ? " WHERE bud.bgt_project_key = besteding.bgt_project_key " : "")
                + "         GROUP BY bud.project"
                + "                , bud.deelproject"
                + "                , bud.bgt_project_key"
                + (groupby <= 5 ? " ,bud.rubriek, bud.rcode, bud.sortcode, bud.bgt_kostenrubriek_key" : "")
                + (groupby <= 5 ? " ,bud.rubriek, bud.rcode, bud.sortcode" : "")
                + (groupby <= 4 ? " ,bud.groep, bud.prs_kostensoortgrp_key" : "")
                + (groupby <= 3 ? " ,bud.onderdeel, bud.prs_kostensoort_key" : "")
                + "       )";
        if (som_rubriek)
        {
            sql += " GROUP BY project"
                 + "        , sortcode"
                 + "        , rubriek"
                 + "        , rcode"
                 + " ORDER BY project"
                 + "        , sortcode"
                 + "        , rubriek";
        }
        else
        {
            sql += " ORDER BY project, deelproject"
                + (groupby < 6 ? ", sortcode, rubriek" : "")
                + (groupby < 5 ? ", groep"             : "")
                + (groupby < 4 ? ", onderdeel"         : "");
        }
    }

    var buttons = [];
    buttons.push({ icon: "fa-fclt-refresh", title: L("lcl_refresh"), action: "FcltMgr.reload()" });

    // KOLOM BUDGET
    function budgetReserveAmount(oRs)
    {
        var v = budget_Amount(oRs, "budget_reserve");
        return v;
    }
    function budgetActueelAmount(oRs)
    {
        var v = budget_Amount(oRs, "budget_actueel");
        return v;
    }
    function budgetOrigineelAmount(oRs)
    {
        var v = budget_Amount(oRs, "budget_origineel");
        return v;
    }
    function budgetMutatieAmount(oRs)
    {
        var v = budget_Amount(oRs, "budget_mutatie");
        return v;
    }
    function budget_Amount(oRs, budget_naam)
    {
          var v = Math.round(oRs(budget_naam).Value);
          return v;
    }

    function budgetReserveShow(oRs)
    {
        v = budget_Show(oRs, "budget_reserve");
        return v;
    }
    function budgetActueelShow(oRs)
    {
        v = budget_Show(oRs, "budget_actueel");
        return v;
    }
    function budgetOrigineelShow(oRs)
    {
        v = budget_Show(oRs, "budget_origineel");
        return v;
    }
    function budgetMutatieShow(oRs)
    {
        v = budget_Show(oRs, "budget_mutatie");
        return v;
    }

    function budget_Show(oRs, v)
    {
        var v = safe.curr(Math.round(oRs(v).Value), true);
        if (outputmode != 3)
        {
            if (groupby > 2)
            {
                v = "<span class='details"+ (v<0 ? " negative" : "") +"' onclick='FcltMgr.stopPropagation(event); naarbudget({0},{1},{2},{3},{4},this)'>" + v +"</span>";
                if (groupby == 6)
                    v = (v).format(bgtdisc_key, oRs("bgt_project_key").Value, null, null, null);
                else if (groupby == 5)
                {
                    if (bgtproj_key_arr.length == 1)
                        v = (v).format(bgtdisc_key, oRs("bgt_project_key").Value, oRs("bgt_kostenrubriek_key").Value, null, null);
                    else
                        v = (v).format(bgtdisc_key, null, null, null, null);
                }
                else if (groupby == 4)
                    v = (v).format(bgtdisc_key, oRs("bgt_project_key").Value, oRs("bgt_kostenrubriek_key").Value, oRs("prs_kostensoortgrp_key").Value, null);
                else if (groupby == 3)
                    v = (v).format(bgtdisc_key, oRs("bgt_project_key").Value, oRs("bgt_kostenrubriek_key").Value, oRs("prs_kostensoortgrp_key").Value, oRs("prs_kostensoort_key").Value);
            }
            else
            {
                v = ("<span class='details"+ (v<0 ? " negative" : "") +"'>" + v +"</span>");
            }
        }
        return v;
    }


    // KOLOM GECONTRACTEERD
    function ordersShow(oRs)
    {
        // Alleen als er opdrachten (kunnen) zijn laten we wat zien
        var v = safe.curr(Math.round(oRs("gecontracteerd").Value), true);
        var show_empty = true; // anders mis je de link naar de opdrachten
        if (show_empty || v != 0)
        {
            if (outputmode != 3)
            {
                v = "<span class='details' onclick='FcltMgr.stopPropagation(event); naaropdracht({0},{1},{2},{3},{4}, this)'>" + v +"</span>";
                if (groupby==6)  /* het totale opdrachtenoverzicht */
                    v = (v).format(bgtdisc_key, oRs("bgt_project_key").Value, null, null, null);
                else if (groupby==5) /* opdrachten binnen de rubriek */
                {
                    if (bgtproj_key_arr.length == 1)
                        v = (v).format(bgtdisc_key, oRs("bgt_project_key").Value, oRs("bgt_kostenrubriek_key").Value, null, null);
                    else
                        v = (v).format(bgtdisc_key, null, null, null, null);
                }
                else if (groupby==4) /* opdrachten binnen de groep */
                    v = (v).format(bgtdisc_key, oRs("bgt_project_key").Value, oRs("bgt_kostenrubriek_key").Value, oRs("prs_kostensoortgrp_key").Value, null);
                else if (groupby==3) /* opdrachten binnen de kostensoort */
                    v = (v).format(bgtdisc_key, oRs("bgt_project_key").Value, oRs("bgt_kostenrubriek_key").Value, oRs("prs_kostensoortgrp_key").Value, oRs("prs_kostensoort_key").Value);
                else if (groupby==2) /* de opdracht */
                    v = (v).format(null, null, null, null, oRs("mld_opdr_key").Value);
            }
            return v;
        }
    }
    function ordersAmount(oRs)
    {
          var v = Math.round(oRs("gecontracteerd").Value);
          return v;
    }

    // KOLOM TE CONTRACTEREN
    function orderstogoShow(oRs)
    {
        var v = safe.curr(Math.round(oRs("tecontracteren").Value), true);
        if (outputmode != 3)
        {
            if (v < 0) v = "<span class='negative'>" + v +"</span>";
            // en een onclick met params afh. van groupby
        }
        var show_empty = false;
        if (show_empty || v != 0)
            return v;
    }
    function orderstogoAmount(oRs)
    {
          var v = Math.round(oRs("tecontracteren").Value);
          return v;
    }

    // KOLOM GEFACTUREERD
    function invoiceLink(p_outputmode, p_groupby, p_oRs, p_val)
    {
        var v = p_val;
        if (p_outputmode != 3)
        {
            if (p_groupby < 4 && p_oRs("prs_kostensoort_key").Value)
            {
                v = "<span class='details' onclick='FcltMgr.stopPropagation(event); naarfacturen({0}, {1}, {2}, this)'>" + v +"</span>";
                if (p_groupby==3)
                    v = (v).format(p_oRs("prs_kostensoort_key").Value, null, null);
                if (p_groupby==2)
                    v = (v).format(null, p_oRs("mld_opdr_key").Value, null);
                if (p_groupby==1)
                    v = (v).format(null, null, p_oRs("fin_factuur_key").Value);
            }
        }
        return v;
    }

    function invoicesShow(oRs)
    {
        var v = safe.curr(Math.round(oRs("gefactureerd").Value), true);
        // Alleen als er opdrachten (kunnen) zijn laten we wat zien
        var show_empty = false;
        if (show_empty || v != 0)
        {
            v = invoiceLink(outputmode, groupby, oRs, v);
            return v;
        }
    }
    function invoicesAmount(oRs)
    {
        var v = Math.round(oRs("gefactureerd").Value);
        return v;
    }

    // KOLOM GEFACTUREERD BTW
    function invoicesVatShow(oRs)
    {
        var v = safe.curr(Math.round(oRs("gefactureerd_btw").Value), true);
        var show_empty = false;
        if (show_empty || v != 0)
        {
            v = invoiceLink(outputmode, groupby, oRs, v);
            return v;
        }
    }
    function invoicesVatAmount(oRs)
    {
        var v = Math.round(oRs("gefactureerd_btw").Value);
        return v;
    }
    function invoicesIncShow(oRs)
    {
        var v = safe.curr(Math.round(oRs("gefactureerd").Value + oRs("gefactureerd_btw").Value), true);
        var show_empty = false;
        if (show_empty || v != 0)
        {
            v = invoiceLink(outputmode, groupby, oRs, v);
            return v;
        }
    }
    function invoicesIncAmount(oRs)
    {
        var v = Math.round(oRs("gefactureerd").Value + oRs("gefactureerd_btw").Value);
        return v;
    }
    // KOLOM TE FACTUREREN
    function invoicestogoShow(oRs)
    {
        var v = safe.curr(Math.round(oRs("tefactureren").Value), true);
        if (outputmode != 3)
        {
            if (v < 0) v = "<span class='negative'>" + v +"</span>";
            // en een onclick
        }
        var show_empty = false;
        if (show_empty || v != 0)
            return v;
    }
    function invoicestogoAmount(oRs)
    {
          var v = Math.round(oRs("tefactureren").Value);
          return v;
    }

    function totalShow(column, rowNum)
    {
      return safe.curr(column.totalsum, true);
    }

    function fnkeyFunction(oRs)
    {
       switch (groupby)
       {
         case 1: bgt_key = oRs("fin_factuur_key").Value; break;
         case 2: bgt_key = oRs("mld_opdr_key").Value; break;
         case 3: bgt_key = oRs("prs_kostensoort_key").Value; break;
         case 4: bgt_key = oRs("prs_kostensoortgrp_key").Value; break;
         case 5: bgt_key = null; break; //oRs("bgt_kostenrubriek_key").Value; break;
         case 6: bgt_key = oRs("bgt_project_key").Value; break;
       }
       return bgt_key;
    }

    function rs_budget_org(oRs)
    {
        return Math.round(oRs("budget_origineel").Value) || 0;
    }
    function rs_budget_mut(oRs)
    {
        return Math.round(oRs("budget_mutatie").Value) || 0;
    }
    function rs_budget_act(oRs)
    {
        return Math.round(oRs("budget_actueel").Value) || 0;
    }
    function rs_contracten(oRs)
    {
        return Math.round(oRs("gecontracteerd").Value) || 0;
    }
    function rs_contracteren(oRs)
    {
        return Math.round(oRs("tecontracteren").Value) || 0;
    }
    function rs_facturen(oRs)
    {
        return Math.round(oRs("gefactureerd").Value) || 0;
    }
    function rs_factureren(oRs)
    {
        return Math.round(oRs("tefactureren").Value) || 0;
    }

    var rs_id = "";
    switch (groupby)
    {
        case 1: rs_id = "overzicht_facturen"; break;
        case 2: rs_id = "overzicht_contracten"; break;
        case 3: rs_id = "overzicht_kostensoorten"; break;
        case 4: rs_id = "overzicht_kostengroepen"; break;
        case 5: rs_id = "overzicht_kostenrubrieken"; break;
        case 6: rs_id = "overzicht_projecten"; break;
    }

    var rst = new ResultsetTable({ keyColumn: fnkeyFunction,
                                   sql: sql,
                                   ID: rs_id,
                                   totalShow: totalShow,
                                   outputmode: outputmode,
                                   filterParams: params,
                                   title: L("bgt_totaaloverzicht"),
                                   showAll: true
                                 });


    rst.addColumn(new Column({caption: L("bgt_discipline_omschrijving"), content: "project", purpose: (bgtdisc_key>-1 ? PRINTING_ONLY : PRINT_AND_VIEW)}));

    if (groupby != 5)
        rst.addColumn(new Column({caption: L("bgt_project"), content: "deelproject", purpose: (bgtproj_key_arr.length > 0 ? PRINTING_ONLY : PRINT_AND_VIEW)}));
    if (groupby <= 5)
        rst.addColumn(new Column({caption: L("bgt_kostenrubriek"), content: "rubriek"}));
    if (groupby <= 4)
        rst.addColumn(new Column({caption: L("prs_kostensoortgrp"), content: "groep"}));
    if (groupby <= 3)
        rst.addColumn(new Column({caption: L("prs_kostensoort"), content: "onderdeel"}));
    if (groupby > 2)  // denk ik
    {
        rst.addColumn(new Column({caption: L("bgt_budget_origineel"), content: budgetOrigineelShow, fnAmount: budgetOrigineelAmount, datatype: "currency", total: true}));
        rst.addColumn(new Column({caption: L("bgt_budget_mutaties"),  content: budgetMutatieShow,   fnAmount: budgetMutatieAmount,   datatype: "currency", total: true}));
        rst.addColumn(new Column({caption: L("bgt_budget_vnreserve"), content: budgetReserveShow,   fnAmount: budgetReserveAmount,   datatype: "currency", total: true}));
        rst.addColumn(new Column({caption: L("bgt_budget_bedrag"),    content: budgetActueelShow,   fnAmount: budgetActueelAmount,   datatype: "currency", total: true}));
    }
    if (groupby <= 2)
    {
        rst.addColumn(new Column({caption: L("lcl_ord_company_uit"), content: "uitvoerder"}));
    }
    if (groupby == 2)
    {
        rst.addColumn(new Column({caption: L("lcl_ord_order_num"), content: "opdrachtnr"}));
        rst.addColumn(new Column({caption: L("lcl_orderdate"), content: "opdrachtdatum"}));
    }
    if (groupby == 1)
    {
        rst.addColumn(new Column({caption: L("lcl_fin_invoice"), content: "factuur"}));
        rst.addColumn(new Column({caption: L("lcl_fin_findate"), content: "factuurdatum"}));
    }
    if (groupby != 1)
    {
        rst.addColumn(new Column({caption: L("bgt_opdrachten"), content: ordersShow, fnAmount: ordersAmount, datatype: "currency", total: true }));
    }
    if (groupby > 2)
    {
        rst.addColumn(new Column({caption: L("bgt_opdrachtentogo"), content: orderstogoShow, fnAmount: orderstogoAmount, datatype: "currency", total: true }));
    }
    rst.addColumn(new Column({caption: L("bgt_facturen"), content: invoicesShow, fnAmount: invoicesAmount, datatype: "currency", total: true }));
    if (groupby == 1)
    {
        rst.addColumn(new Column({caption: L("lcl_fin_btwsum"),      content: invoicesVatShow, fnAmount: invoicesVatAmount, datatype: "currency", total: true }));
        rst.addColumn(new Column({caption: L("lcl_fin_total_sum"),   content: invoicesIncShow, fnAmount: invoicesIncAmount, datatype: "currency", total: true }));
        rst.addColumn(new Column({caption: L("lcl_fin_adviesdatum"), content: "adviesdatum"}));
    }
    if (groupby != 1)
        rst.addColumn(new Column({caption: L("bgt_facturentogo"), content: invoicestogoShow, fnAmount: invoicestogoAmount, datatype: "currency", total: true }));

    // Data voor gebruik in cust.xsl
    if (outputmode == 3)
    {
        rst.addColumn(new Column({caption: L("bgt_discipline_omschrijving"), content: "project"}));
        rst.addColumn(new Column({caption: L("bgt_project"), content: "deelproject"}));
        rst.addColumn(new Column({caption: "rubriekcode", content: "rcode"}));
        if (groupby <= 5)
            rst.addColumn(new Column({caption: L("bgt_kostenrubriek"),   content: "rubriek"}));
        if (groupby <= 4)
            rst.addColumn(new Column({caption: L("prs_kostensoortgrp"),  content: "groep"}));
        if (groupby <= 3)
            rst.addColumn(new Column({caption: L("prs_kostensoort"),     content: "onderdeel"}));
        if (groupby <= 2)
            rst.addColumn(new Column({caption: L("lcl_ord_company_uit"), content: "uitvoerder"}));
        if (groupby == 2)
        {
            rst.addColumn(new Column({caption: L("lcl_ord_order_num"), content: "opdrachtnr"}));
            rst.addColumn(new Column({caption: L("lcl_orderdate"),     content: "opdrachtdatum"}));
        }
        if (groupby == 1)
        {
            rst.addColumn(new Column({caption: L("lcl_fin_invoice"), content: "factuur"}));
            rst.addColumn(new Column({caption: L("lcl_fin_findate"), content: "factuurdatum"}));
        }
        if (groupby > 2)  // denk ik
        {
            rst.addColumn(new Column({caption: L("bgt_budget_origineel"), content: rs_budget_org}));
            rst.addColumn(new Column({caption: L("bgt_budget_mutaties"),  content: rs_budget_mut}));
            rst.addColumn(new Column({caption: L("bgt_budget_bedrag"),    content: rs_budget_act}));
            rst.addColumn(new Column({caption: L("bgt_opdrachtentogo"),   content: rs_contracteren}));
            rst.addColumn(new Column({caption: L("bgt_facturentogo"),     content: rs_factureren}));
        }
        //
        rst.addColumn(new Column({caption: L("bgt_facturen"), content: rs_facturen}));
        if (groupby != 1)  // denk ik
        {
            rst.addColumn(new Column({caption: L("bgt_opdrachten"),     content: rs_contracten}));
        }
    }

    rst.addAction({action: "bgtEdit", caption: L("lcl_edit"), isDefault: true});

    var count = rst.processResultset();

%>
    </body>
  </html>
<% ASPPAGE_END(); %>
