Files
Facilitor/APPL/BGT/bgt_search_list.asp
Peter Feij 8a7f9cbcee FSN#39054 Budgetcontrole uitbreiding: BGT module - fix
svn path=/Website/trunk/; revision=34308
2017-06-16 06:57:39 +00:00

847 lines
44 KiB
Plaintext
Raw Blame History

<%@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" -->
<!-- #include file="../Shared/json2.js" -->
<%
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");
// -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 = { };
var transitParam = buildTransitParam([]);
%>
<html>
<head>
<%
FCLTHeader.Generate({ outputmode: outputmode });
if (outputmode == 0)
{
%>
<script type="text/javascript">
function naarbudget(project_key, rubriek_key, groep_key, soort_key, deze)
{
<% if (groupby==6) { %>
var url = "appl/bgt/bgt_budget.asp?budgetproject="+project_key;
<% } %>
<% if (groupby==5) { %>
var url = "appl/bgt/bgt_budget.asp?budgetcostcategory="+rubriek_key + "&budgetproject="+project_key ; // kan dit ook met maar 1 key?
<% } %>
<% if (groupby==4) { %>
var url = "appl/bgt/bgt_budget.asp?budgetcostcategory="+rubriek_key + "&costtypegroup="+groep_key;
<% } %>
<% if (groupby==3) { %>
var url = "appl/bgt/bgt_budget.asp?budgetcostcategory="+rubriek_key + "&costtypegroup="+groep_key + "&costtype="+soort_key;
<% } %>
FcltMgr.openDetail(url);
}
function naaropdracht(p_key, r_key, g_key, s_key, deze)
{
<% if (groupby==6) { %>
var url = "appl/bgt/mld_opdr.asp?budgetproject="+p_key;
<% } %>
<% if (groupby==5) { %>
var url = "appl/bgt/mld_opdr.asp?budgetcostcategory="+r_key;
<% } %>
<% if (groupby==4) { %>
var url = "appl/bgt/mld_opdr.asp?costtypegroup="+g_key;
<% } %>
<% if (groupby==3) { %>
var url = "appl/bgt/mld_opdr.asp?costtype="+s_key;
<% } %>
<% if (groupby==2) { %>
if (!p_key && !r_key && !g_key && s_key)
var url = "appl/bgt/mld_opdr.asp?id="+s_key;
<% } %>
FcltMgr.openDetail(url, $(deze).text());
}
function naarfacturen(ks_key, o_key, f_key, deze)
{
<% if (groupby==3) { %>
var url = "appl/bgt/fin_factuur.asp?costtype="+ks_key;
<% } %>
<% if (groupby==2) { %>
var url = "appl/bgt/fin_factuur.asp?order="+o_key;
<% } %>
<% if (groupby==1) { %>
var 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 });
}
<% } // outputmode=0 %>
</script>
</head>
<body id="listbody">
<%
var mutatie_sql = " (SELECT mutatie.bgt_budget_key"
+ " , SUM(mutatie.bedrag_van) bedrag_van"
+ " , SUM(mutatie.bedrag_naar) bedrag_naar"
+ " FROM (SELECT m1.bgt_budget_key_van bgt_budget_key"
+ " , SUM(COALESCE(m1.bgt_budget_bedrag_van,0)) bedrag_van"
+ " , 0 bedrag_naar"
+ " FROM bgt_budgetmutatie m1"
+ " GROUP BY m1.bgt_budget_key_van"
+ " UNION"
+ " SELECT m2.bgt_budget_key_naar bgt_budget_key"
+ " , 0 bedrag_van"
+ " , SUM(COALESCE(m2.bgt_budget_bedrag_naar,0)) bedrag_naar"
+ " FROM bgt_budgetmutatie m2"
+ " GROUP BY m2.bgt_budget_key_naar"
+ ") mutatie"
+ " GROUP BY mutatie.bgt_budget_key"
+ " ) mut";
// zoiets moet het dan gaan worden. Vast nog wat verfijnder. UNIONs met reserve e.d. nodig?
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,"
+ " 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_datum >= "+ date_from.beginToSQL() : "")
+ (date_to ? " AND f.fin_factuur_datum < " + 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.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,"
+ " 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.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 ins_discipline_omschrijving project,"
+ " bgt_project_omschrijving deelproject,"
+ " kr.bgt_kostenrubriek_oms rubriek,"
+ " ksg.prs_kostensoortgrp_oms groep,"
+ " bud.prs_kostensoortgrp_key,"
+ " bud.bgt_kostenrubriek_key,"
+ " ks.prs_kostensoort_key,"
+ " ks.prs_kostensoort_oms onderdeel,"
+ " ks.prs_kostensoort_altcode rcode,"
+ " ks.prs_kostensoort_altcode sortcode,"
+ " 0 budget_reserve,"
+ " SUM(COALESCE(bud.bgt_budget_bedrag, 0)) budget_actueel,"
+ " SUM(COALESCE(mut.bedrag_naar, 0) + COALESCE(mut.bedrag_van, 0)) budget_mutatie"
+ " FROM prs_kostensoort ks,"
+ " prs_kostensoortgrp ksg,"
+ " bgt_kostenrubriek kr,"
+ " bgt_budget bud,"
+ " bgt_project pr,"
+ " ins_tab_discipline id,"
+ mutatie_sql
+ " WHERE 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 id.ins_discipline_key = pr.ins_discipline_key"
+ " AND mut.bgt_budget_key(+) = bud.bgt_budget_key"
+ (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.ins_discipline_key =" + bgtdisc_key;
sql1 += " GROUP BY ksg.prs_kostensoortgrp_oms,"
+ " ks.prs_kostensoort_key,"
+ " ks.prs_kostensoort_opmerking ,"
+ " ks.prs_kostensoort_oms,"
+ " ks.prs_kostensoort_altcode,"
+ " bud.prs_kostensoortgrp_key,"
+ " kr.bgt_kostenrubriek_oms,"
+ " bud.bgt_kostenrubriek_key,"
+ " pr.bgt_project_key,"
+ " bgt_project_omschrijving ,"
+ " ins_discipline_omschrijving";
}
if (groupby == 4) // 4. kostensoortgrp
{
var sql1 = "SELECT ins_discipline_omschrijving project,"
+ " bgt_project_omschrijving deelproject,"
+ " kr.bgt_kostenrubriek_oms rubriek,"
+ " ksg.prs_kostensoortgrp_altcode rcode,"
+ " ksg.prs_kostensoortgrp_altcode sortcode,"
+ " ksg.prs_kostensoortgrp_oms groep,"
+ " bud.prs_kostensoortgrp_key,"
+ " bud.bgt_kostenrubriek_key,"
+ " 0 budget_reserve,"
+ " SUM(COALESCE(bud.bgt_budget_bedrag, 0)) budget_actueel,"
+ " SUM(COALESCE(mut.bedrag_naar, 0) + COALESCE(mut.bedrag_van, 0)) budget_mutatie"
+ " FROM prs_kostensoortgrp ksg,"
+ " bgt_kostenrubriek kr,"
+ " bgt_budget bud,"
+ " bgt_project pr,"
+ " ins_tab_discipline id,"
+ mutatie_sql
+ " WHERE ksg.bgt_kostenrubriek_key = kr.bgt_kostenrubriek_key"
+ " AND bud.prs_kostensoortgrp_key = ksg.prs_kostensoortgrp_key"
+ " AND pr.bgt_project_key = kr.bgt_project_key"
+ " AND id.ins_discipline_key = pr.ins_discipline_key"
+ " AND mut.bgt_budget_key(+) = bud.bgt_budget_key"
+ " AND bud.bgt_budget_isreserve = 0" // reserve afzonderlijk
+ (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 : "")
+ " AND pr.ins_discipline_key =" + bgtdisc_key;
sql1 += " GROUP BY kr.bgt_kostenrubriek_oms,"
+ " ksg.prs_kostensoortgrp_altcode,"
+ " ksg.prs_kostensoortgrp_oms,"
+ " bud.prs_kostensoortgrp_key,"
+ " bud.bgt_kostenrubriek_key,"
+ " pr.bgt_project_key,"
+ " bgt_project_omschrijving ,"
+ " ins_discipline_omschrijving";
}
if (groupby == 5) // 5. kostenrubriek
{
var sql1 = "SELECT ins_discipline_omschrijving project,"
+ " bgt_project_omschrijving deelproject,"
+ " kr.bgt_kostenrubriek_oms rubriek,"
+ " kr.bgt_kostenrubriek_code rcode,"
+ " kr.bgt_kostenrubriek_code sortcode,"
+ " kr.bgt_kostenrubriek_key,"
+ " 0 budget_reserve,"
+ " SUM(COALESCE(bud.bgt_budget_bedrag, 0)) budget_actueel,"
+ " SUM(COALESCE(mut.bedrag_naar, 0) + COALESCE(mut.bedrag_van, 0)) budget_mutatie"
+ " FROM bgt_kostenrubriek kr,"
+ " bgt_budget bud,"
+ " bgt_project pr,"
+ " ins_tab_discipline id,"
+ mutatie_sql
+ " WHERE bud.bgt_kostenrubriek_key = kr.bgt_kostenrubriek_key"
+ " AND pr.bgt_project_key = kr.bgt_project_key"
+ " AND id.ins_discipline_key = pr.ins_discipline_key"
+ " AND mut.bgt_budget_key(+) = bud.bgt_budget_key"
+ (bgtproj_key_arr.length > 0 ? " AND pr.bgt_project_key IN (" + bgtproj_key_arr.join(",") + ")" : "")
+ " AND pr.ins_discipline_key =" + bgtdisc_key
+ " GROUP BY kr.bgt_kostenrubriek_oms,"
+ " kr.bgt_kostenrubriek_key,"
+ " bgt_project_omschrijving ,"
+ " bgt_kostenrubriek_code ,"
+ " ins_discipline_omschrijving";
if (bgt_inclbtw)
{
//BTW
sql1 += " UNION SELECT ins_discipline_omschrijving project,"
+ " bgt_project_omschrijving deelproject,"
+ " 'BTW' rubriek,"
+ " 'B' rcode,"
+ " '92' sortcode,"
+ " -3 bgt_kostenrubriek_key,"
+ " 0 budget_reserve,"
+ " SUM(COALESCE(bud.bgt_budget_btwbedrag, 0)) budget_actueel,"
+ " SUM(COALESCE(mut.bedrag_naar, 0) + COALESCE(mut.bedrag_van, 0)) budget_mutatie"
+ " FROM bgt_budget bud,"
+ " bgt_project pr,"
+ " ins_tab_discipline id,"
+ mutatie_sql
+ " WHERE pr.bgt_project_key = bud.bgt_project_key"
+ " AND id.ins_discipline_key = pr.ins_discipline_key"
+ " AND mut.bgt_budget_key(+) = bud.bgt_budget_key"
+ (bgtproj_key_arr.length > 0 ? " AND pr.bgt_project_key IN (" + bgtproj_key_arr.join(",") + ")" : "")
+ " AND pr.ins_discipline_key =" + bgtdisc_key
+ " GROUP BY bgt_project_omschrijving ,"
+ " ins_discipline_omschrijving";
}
}
if (groupby == 6) // 6. deelproject
{
var sql1 = "SELECT ins_discipline_omschrijving project,"
+ " bgt_project_omschrijving deelproject,"
+ " pr.bgt_project_key,"
+ " 0 budget_reserve,"
+ " SUM(COALESCE(bud.bgt_budget_bedrag, 0)"
+ (bgt_inclbtw ? " + COALESCE(bud.bgt_budget_btwbedrag, 0)" : "")
+ ") budget_actueel,"
+ " SUM(COALESCE(mut.bedrag_naar, 0) + COALESCE(mut.bedrag_van,0)) budget_mutatie"
+ " FROM bgt_budget bud,"
+ " bgt_project pr,"
+ " ins_tab_discipline id,"
+ mutatie_sql
+ " WHERE bud.bgt_project_key = pr.bgt_project_key"
+ " AND id.ins_discipline_key = pr.ins_discipline_key"
+ " AND mut.bgt_budget_key(+) = bud.bgt_budget_key"
+ (bgtproj_key_arr.length > 0 ? " AND pr.bgt_project_key IN (" + bgtproj_key_arr.join(",") + ")" : "")
+ " AND pr.ins_discipline_key =" + bgtdisc_key;
sql1 += " GROUP BY pr.bgt_project_key,"
+ " bgt_project_omschrijving ,"
+ " ins_discipline_omschrijving";
}
// 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)) gecontracteerd,"
+ " SUM(COALESCE(o.mld_opdr_kosten, 0) *0.21) gecontracteerdbtw" // TODO!
+ " 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 pr.bgt_project_key = kr.bgt_project_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(",") + ")" : "")
+ " AND pr.ins_discipline_key =" + bgtdisc_key;
sql2a += " GROUP BY id.ins_discipline_key,"
+ " pr.bgt_project_key,"
+ " kr.bgt_kostenrubriek_key,"
+ " ksg.prs_kostensoortgrp_key,"
+ " ks.prs_kostensoort_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)) gefactureerd,"
+ " SUM(COALESCE(f.fin_factuur_totaal_btw, 0)) gefactureerdbtw"
+ " 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_datum >= "+ date_from.beginToSQL() : "")
+ (date_to ? " AND f.fin_factuur_datum < "+ date_to.endToSQL() : "")
+ (bgtproj_key_arr.length > 0 ? " AND pr.bgt_project_key IN (" + bgtproj_key_arr.join(",") + ")" : "")
+ " AND pr.ins_discipline_key =" + bgtdisc_key;
sql2b += " GROUP BY id.ins_discipline_key,"
+ " pr.bgt_project_key,"
+ " kr.bgt_kostenrubriek_key,"
+ " ksg.prs_kostensoortgrp_key,"
+ " ks.prs_kostensoort_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(opdr.gecontracteerdbtw) gecontracteerdbtw,"
+ " SUM (fact.gefactureerd) gefactureerd,"
+ " SUM (fact.gefactureerdbtw) gefactureerdbtw,"
+ " 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 sql = "SELECT *"
+ " FROM (SELECT bud.project project,"
+ " bud.deelproject deelproject,"
+ " besteding.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, besteding.prs_kostensoort_key," : "")
+ " MAX(bud.budget_reserve) budget_reserve,"
+ " MAX(bud.budget_actueel) budget_actueel,"
+ " MAX(bud.budget_actueel - bud.budget_mutatie + bud.budget_reserve) 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(+) " : "") // de reserve en BTW hebben geen echte rubriek_key
+ (groupby == 6 ? " WHERE bud.bgt_project_key = besteding.bgt_project_key " : "")
+ " AND COALESCE(besteding.bgt_kostenrubriek_key, 99) <> -3"
+ " GROUP BY bud.project"
+ " , bud.deelproject"
+ " , besteding.bgt_project_key"
+ (groupby <= 5 ? " ,bud.rubriek, bud.rcode, bud.sortcode, bud.bgt_kostenrubriek_key" : "")
+ (groupby <= 4 ? " ,bud.groep, bud.prs_kostensoortgrp_key" : "")
+ (groupby <= 3 ? " ,bud.onderdeel, besteding.prs_kostensoort_key" : "");
if (false && bgt_inclbtw && groupby==5) // In rubriekoverzicht eventueel een BTW-regel
{
sql += " UNION"
+ " SELECT bud.project project,"
+ " bud.deelproject deelproject,"
+ " besteding.bgt_project_key,"
+ " bud.sortcode,"
+ " bud.rubriek rubriek, bud.rcode rcode, bud.bgt_kostenrubriek_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.gecontracteerdbtw) gecontracteerd,"
+ " MAX(COALESCE(bud.budget_actueel, 0)) - SUM(COALESCE(besteding.gecontracteerdbtw, 0)) tecontracteren,"
+ " SUM(besteding.gefactureerdbtw) gefactureerd,"
+ " SUM(besteding.tefactureren) tefactureren"
+ " FROM (" + sql1 + ") bud,"
+ " (" + sql2 + ") besteding"
+ " WHERE bud.bgt_kostenrubriek_key = -3"
+ " GROUP BY bud.project"
+ " , bud.deelproject"
+ " , besteding.bgt_project_key"
+ " , bud.rubriek"
+ " , bud.rcode"
+ " , bud.sortcode"
+ " , bud.bgt_kostenrubriek_key";
}
sql += " )"
+ " ORDER BY project"
+ (groupby < 6 ? ",sortcode, rubriek" : "")
+ (groupby < 5 ? ",groep" : "")
+ (groupby < 4 ? ",onderdeel" : "");
}
var buttons = [];
buttons.push({ icon: "page_refresh.png", 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 (groupby > 2)
{
v = "<span class='details"+ (v<0 ? " negative" : "") +"' onclick='FcltMgr.stopPropagation(event); naarbudget({0},{1},{2},{3},this)'>" + v +"</span>";
if (groupby == 6)
v = (v).format(oRs("bgt_project_key").Value, null, null, null);
else if (groupby == 5)
v = (v).format(oRs("bgt_project_key").Value, oRs("bgt_kostenrubriek_key").Value, null, null);
else if (groupby == 4)
v = (v).format(oRs("bgt_project_key").Value, oRs("bgt_kostenrubriek_key").Value, oRs("prs_kostensoortgrp_key").Value, null);
else if (groupby == 3)
v = (v).format(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);
v = "<span class='details' onclick='FcltMgr.stopPropagation(event); naaropdracht({0},{1},{2},{3}, this)'>" + v +"</span>";
if (groupby==6) /* het totale opdrachtenoverzicht */
v = (v).format(oRs("bgt_project_key").Value);
else if (groupby==5) /* opdrachten binnen de rubriek */
v = (v).format(oRs("bgt_project_key").Value, oRs("bgt_kostenrubriek_key").Value, null, null);
else if (groupby==4) /* opdrachten binnen de groep */
v = (v).format(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(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, 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 (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 invoicesShow(oRs)
{
var v = safe.curr(Math.round(oRs("gefactureerd").Value), true);
// Alleen als er opdrachten (kunnen) zijn laten we wat zien
if (groupby < 4 && oRs("prs_kostensoort_key").Value)
{
v = "<span class='details' onclick='FcltMgr.stopPropagation(event); naarfacturen({0}, {1}, {2}, this)'>" + v +"</span>";
if (groupby==3)
v = (v).format(oRs("prs_kostensoort_key").Value, null, null);
if (groupby==2)
v = (v).format(null, oRs("mld_opdr_key").Value, null);
if (groupby==1)
v = (v).format(null, null, oRs("fin_factuur_key").Value);
}
return v;
}
function invoicesAmount(oRs)
{
var v = Math.round(oRs("gefactureerd").Value);
return v;
}
// KOLOM TE FACTUREREN
function invoicestogoShow(oRs)
{
var v = safe.curr(Math.round(oRs("tefactureren").Value), true);
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 = oRs("bgt_kostenrubriek_key").Value; break;
case 6: bgt_key = oRs("bgt_project_key").Value; break;
}
return bgt_key;
}
var rst = new ResultsetTable({ keyColumn: fnkeyFunction,
sql: sql,
ID: "bgttable",
totalShow: totalShow,
outputmode: outputmode,
title: L("bgt_totaaloverzicht"),
showAll: true,
buttons: buttons
});
rst.addColumn(new Column({caption: L("bgt_discipline_omschrijving"), content: "project", purpose: (bgtdisc_key>-1 ? PRINTING_ONLY : PRINT_AND_VIEW)}));
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_code"), content: "rcode"}));
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: "Origineel", content: budgetOrigineelShow, fnAmount: budgetOrigineelAmount, datatype: "currency", total: true}));
// if (groupby == 5)
// rst.addColumn(new Column({caption: "Reserve", content: budgetReserveShow, fnAmount: budgetReserveAmount, datatype: "currency", total: true}));
rst.addColumn(new Column({caption: "Mutatie", content: budgetMutatieShow, fnAmount: budgetMutatieAmount, 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) // denk ik
rst.addColumn(new Column({caption: L("bgt_opdrachten"), content: ordersShow, fnAmount: ordersAmount, datatype: "currency", total: true }));
if (groupby > 2) // denk ik
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 > 2) // denk ik
rst.addColumn(new Column({caption: L("bgt_facturentogo"), content: invoicestogoShow, fnAmount: invoicestogoAmount, datatype: "currency", total: true }));
rst.addAction({action: "bgtEdit", caption: L("lcl_edit"), isDefault: true});
var count = rst.processResultset();
%>
</body>
</html>