Ook: beter omgaan met HIDE_F_ velden Ook: groep veld bewerkbaar Ook: mobiel bit in 'styling' gebruiken Ook: eerste grafiek aanzet svn path=/Website/trunk/; revision=24510
323 lines
14 KiB
PHP
323 lines
14 KiB
PHP
<% /*
|
|
$Revision$
|
|
$Id$
|
|
|
|
File: model_reports.inc
|
|
|
|
Description: rapport model voor *de data* van een specifiek rapport.
|
|
Zal rapporten uitvoeren dus. Het *bewerken* van rapporten gaat via model_reportsx
|
|
Parameters:
|
|
Context:
|
|
|
|
Notes:
|
|
*/
|
|
%>
|
|
<!-- #include file="./model_reportsx.inc" -->
|
|
<!-- #include file="../fac/fac_usrrap.inc" -->
|
|
<%
|
|
|
|
function model_reports_template()
|
|
{
|
|
this.table = "te bepalen";
|
|
this.primary = null;
|
|
this.records_name = "te bepalen";
|
|
this.record_name = "te bepalen";
|
|
this.fields = {/* te bepalen */};
|
|
this.autfunction = null;
|
|
|
|
this.REST_GET = function _GET(params, jsondata)
|
|
{
|
|
if (this.autfunction)
|
|
var authparams = user.checkAutorisation(this.autfunction); // leesrechten is wel het minste
|
|
|
|
var groupbys = [];
|
|
if (params.columns && params.groupby)
|
|
{
|
|
if (params.columns.length != params.groupby.length)
|
|
INTERNAL_ERROR_GROUP_MISMATCH;
|
|
for (var fld in this.fields)
|
|
{
|
|
if (!inArray(fld, params.columns))
|
|
{
|
|
if (this.list && this.list.default_url && fld == "id")
|
|
groupbys.push(this.fields["id"].dbs);
|
|
else
|
|
{
|
|
if (this.fields[fld].dbs.match(/^hide_f/)) // Meenemen om te sorteren
|
|
{
|
|
this.fields[fld].hidden = false;
|
|
params.columns.splice(0, 0, fld);
|
|
params.groupby.splice(0, 0, "G");
|
|
}
|
|
else
|
|
this.fields[fld].hidden = true; // Onnodige velden niet ophalen
|
|
}
|
|
}
|
|
}
|
|
|
|
if (inArray("scf_count", params.columns))
|
|
{
|
|
this.fields["scf_count"] = { dbs: "scf_count", sql: "COUNT(*)", typ: "number", label: L("lcl_count")};
|
|
}
|
|
|
|
for (var i=0; i < params.columns.length; i++)
|
|
{
|
|
var fld = params.columns[i];
|
|
if (fld == "scf_count")
|
|
continue;
|
|
var field = this.fields[fld];
|
|
field.keepdbsforfilter = true;
|
|
switch (params.groupby[i] || "G")
|
|
{
|
|
case "G":
|
|
groupbys.push(field.dbs);
|
|
break;
|
|
case "U":
|
|
field.sql = "DISTINCT(" + field.dbs + ")";
|
|
break;
|
|
case "S":
|
|
field.sql = "SUM(" + field.dbs + ")";
|
|
field.label = L("lcl_usrrap_label_SUM").format(field.label);
|
|
field.total = true;
|
|
break;
|
|
case "C":
|
|
field.sql = "COUNT(" + field.dbs + ")";
|
|
field.label = L("lcl_usrrap_label_CNT").format(field.label);
|
|
field.newtyp = "number";
|
|
field.total = true;
|
|
break;
|
|
case "A":
|
|
field.sql = "AVG(" + field.dbs + ")";
|
|
field.label = L("lcl_usrrap_label_AVG").format(field.label);
|
|
field.newtyp = "float";
|
|
break;
|
|
case "H":
|
|
if (field.typ == "date" || field.typ == "datetime")
|
|
field.sql = "TO_CHAR(" + field.dbs + ", 'YYYY-MM-DD HH24')||':00'";
|
|
else
|
|
field.sql = "TO_CHAR(" + field.dbs + ", 'HH24')||':00'";
|
|
field.newtyp = "varchar";
|
|
groupbys.push(field.sql);
|
|
field.label = L("lcl_usrrap_label_HOUR").format(field.label);
|
|
break;
|
|
case "D":
|
|
field.sql = "TRUNC(" + field.dbs + ", 'DD')";
|
|
field.newtyp = "date";
|
|
groupbys.push(field.sql);
|
|
field.label = L("lcl_usrrap_label_DAY").format(field.label);
|
|
break;
|
|
case "W":
|
|
field.sql = "TO_CHAR(" + field.dbs + ", 'YYYY-IW')";
|
|
field.newtyp = "varchar";
|
|
groupbys.push(field.sql);
|
|
field.label = L("lcl_usrrap_label_WEEK").format(field.label);
|
|
break;
|
|
case "M":
|
|
field.sql = "TO_CHAR(" + field.dbs + ", 'YYYY-MM')";
|
|
field.newtyp = "varchar";
|
|
groupbys.push(field.sql);
|
|
field.label = L("lcl_usrrap_label_MONTH").format(field.label);
|
|
break;
|
|
case "Q":
|
|
field.sql = "TO_CHAR(" + field.dbs + ", 'YYYY-Q')";
|
|
field.newtyp = "varchar";
|
|
groupbys.push(field.sql);
|
|
field.label = L("lcl_usrrap_label_QUARTER").format(field.label);
|
|
break;
|
|
case "Y":
|
|
field.sql = "TO_CHAR(" + field.dbs + ", 'YYYY')";
|
|
field.newtyp = "varchar";
|
|
groupbys.push(field.sql);
|
|
field.label = L("lcl_usrrap_label_YEAR").format(field.label);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
for (var i=0; i < params.columns.length; i++)
|
|
{
|
|
var fld = params.columns[i];
|
|
if (this.fields[fld].dbs.match(/^hide_f/)) // Die willen we uiteindelijk niet zien
|
|
{
|
|
params.columns.splice(i, 1);
|
|
params.groupby.splice(i, 1);
|
|
}
|
|
}
|
|
|
|
var query = api2.sqlfields(params, this);
|
|
|
|
params.filter.fclt_3d_user_key = user_key; // Die is gemakkelijk
|
|
|
|
var wheres = api2.sqlfilter(params, this);
|
|
query.wheres = query.wheres.concat(wheres);
|
|
|
|
if (this.autfunction)
|
|
{
|
|
if ("fclt_3d_locatie_key" in this.fields && authparams.ALGreadlevel > -1)
|
|
{
|
|
wheres.push(" fclt_3d_locatie_key IN"
|
|
+ "(SELECT alg_locatie_key FROM fac_v_my_locations "
|
|
+ " WHERE niveau ="+authparams.ALGreadlevel
|
|
+ " AND prs_perslid_key="+user_key+")");
|
|
}
|
|
if ("fclt_3d_gebouw_key" in this.fields && authparams.ALGreadlevel > -1)
|
|
{
|
|
wheres.push(" fclt_3d_gebouw_key IN"
|
|
+ "((SELECT alg_gebouw_key FROM fac_v_my_buildings "
|
|
+ " WHERE niveau ="+authparams.ALGreadlevel
|
|
+ " AND prs_perslid_key="+user_key+"))");
|
|
}
|
|
if ("fclt_3d_afdeling_key" in this.fields && authparams.PRSreadlevel > 0)
|
|
{
|
|
wheres.push(" fclt_3d_afdeling_key IN"
|
|
+ "(SELECT prs_afdeling_key FROM prs_v_afdeling_familie a"
|
|
+ " WHERE a.prs_afdeling_elder_key IN"
|
|
+ " (SELECT aa.prs_afdeling_elder_key"
|
|
+ " FROM prs_v_afdeling_familie aa"
|
|
+ " WHERE aa.prs_afdeling_key = " + user.prs_afdeling_key()
|
|
+ " AND aa.niveau = " + authparams.PRSreadlevel + "))");
|
|
}
|
|
if ("fclt_3d_discipline_key" in this.fields)
|
|
{
|
|
var disciplines = [];
|
|
var sql = "SELECT ins_discipline_key"
|
|
+ " FROM fac_v_my_disciplines "
|
|
+ " WHERE fac_functie_code = " + safe.quoted_sql(this.autfunction)
|
|
+ " AND prs_perslid_key=" + user_key;
|
|
var oRs = Oracle.Execute(sql);
|
|
while (!oRs.Eof)
|
|
{
|
|
disciplines.push(oRs("ins_discipline_key").Value);
|
|
oRs.MoveNext();
|
|
}
|
|
oRs.Close();
|
|
if (!disciplines.length)
|
|
disciplines.push(-1);
|
|
|
|
wheres.push("fclt_3d_discipline_key IN (" + disciplines.join(",") + ")");
|
|
}
|
|
}
|
|
|
|
if ("fac_functie_key" in this.fields)
|
|
{
|
|
var authparams = user.checkAutorisation("WEB_PRSSYS", true);
|
|
if (!authparams)
|
|
{
|
|
query.wheres.push("(fac_functie_key IN"
|
|
+ " (SELECT w.fac_functie_key"
|
|
+ " FROM fac_v_webgebruiker W"
|
|
+ " WHERE w.prs_perslid_key = " + user_key
|
|
+ " ) OR fac_functie_key IS NULL)");
|
|
}
|
|
}
|
|
|
|
var sql = "SELECT " + query.selects.join(", ")
|
|
+ " FROM " + query.tables.join(", ")
|
|
+ (query.wheres.length ? " WHERE " + query.wheres.join(" AND " ) : "")
|
|
|
|
if (groupbys.length)
|
|
sql += " GROUP BY " + groupbys.join(", ");
|
|
|
|
var order = [];
|
|
for (var i=0; i < query.selects.length; i++)
|
|
order.push(i+1)
|
|
sql += " ORDER BY " + order.join(", ");
|
|
|
|
var maxcnt = params.filter.showall==1?S("qp_maxrows2"):S("qp_maxrows");
|
|
var sql = "SELECT * FROM (" + sql + ") WHERE ROWNUM <= " + (maxcnt + 1); // Eentje extra om overflow-melding te triggeren in resultsettable
|
|
|
|
for (var fld in this.fields)
|
|
{ // Overrules voor groeperingen
|
|
this.fields[fld].typ = this.fields[fld].newtyp || this.fields[fld].typ;
|
|
}
|
|
var json = api2.sql2json (params, sql, this);
|
|
|
|
return json;
|
|
};
|
|
this.REST_PUT = false;
|
|
this.REST_POST = false;
|
|
this.REST_DELETE = false;
|
|
|
|
this.search = { title: L("lcl_usrrap_report"),
|
|
filters: [] }
|
|
}
|
|
|
|
// Voltooi model_reports_template voor een bepaald rapport
|
|
function model_reports(fac_usrrap_key)
|
|
{
|
|
var reportsx = new model_reportsx(fac_usrrap_key, { include: ["columns"], internal: true });
|
|
var usrrap = reportsx.data;
|
|
user.auth_required_or_abort(usrrap);
|
|
|
|
var model = new model_reports_template();
|
|
model.table = usrrap.viewname;
|
|
|
|
if (usrrap.styling && usrrap.styling.id & 8) // Tabelized
|
|
model.table = "T_" + usrrap.viewname;
|
|
model.record_name = usrrap.viewname.substring(0,1) + usrrap.viewname.substring(1).toLowerCase();
|
|
model.records_name = model.record_name + "s";
|
|
model.records_title = usrrap.name;
|
|
model.styling = usrrap.styling;
|
|
model.list = { columns : [], canGroup: true };
|
|
|
|
var keyfield = null;
|
|
if (usrrap.urllink)
|
|
{
|
|
var mtc = usrrap.urllink.match(/(.*)\{(.*)\}/);
|
|
if (!mtc || mtc.length != 3)
|
|
shared.simpel_page("Urllink <em>{0}</em> in rapport moet formaat 'xxxx/yyy.asp?key={keyveld}' hebben.".format(usrrap.urllink));
|
|
model.list.default_url = mtc[1];
|
|
keyfield = mtc[2];
|
|
}
|
|
|
|
if (usrrap.authorisation)
|
|
{
|
|
var sql = "SELECT fac_functie_code FROM fac_functie WHERE fac_functie_key = " + usrrap.authorisation.id;
|
|
var oRs = Oracle.Execute(sql);
|
|
model.autfunction = oRs("fac_functie_code").Value;
|
|
oRs.Close();
|
|
}
|
|
|
|
for (var i = 0; i < usrrap.columns.length; i++)
|
|
{
|
|
var field = { dbs: usrrap.columns[i].name,
|
|
label: safe.html(usrrap.columns[i].caption), // (lcl) Labels worden altijd geacht html-safe te zijn
|
|
typ: usrrap.columns[i].datatype.id, // Voor overulen van gewone LCL's ligt de verantwoordelijkheid
|
|
group: usrrap.columns[i].group, // bij een beheerder maar rapportages wordt misschien wel fe
|
|
visible: usrrap.columns[i].visible.id
|
|
};
|
|
if (field.typ == "number" && field.dbs.match(/_key$/i)) // Vooral de FCLT_3D filters
|
|
field.typ = "key";
|
|
if (field.visible == 'H' && field.dbs != keyfield) // Keyfield willen we eigenlijk altijd wel indien mogelijk
|
|
field.hidden = true;
|
|
|
|
if (usrrap.columns[i].filter)
|
|
{
|
|
if (usrrap.columns[i].filter.id == "A")
|
|
{
|
|
field.filter = { "date": "range",
|
|
"datetime": "range",
|
|
"time": "range",
|
|
"varchar": "like"
|
|
}[ field.typ ] || "exact";
|
|
}
|
|
else
|
|
{
|
|
field.filter = api2.splitLOV("E;exact;L;like;R;range")[usrrap.columns[i].filter.id]
|
|
}
|
|
field.filterdefault = usrrap.columns[i].filterdefault;
|
|
}
|
|
var fld = field.dbs.toLowerCase();
|
|
|
|
if (fld == keyfield)
|
|
fld = "id";
|
|
model.fields[fld] = field;
|
|
if (usrrap.columns[i].visible.id == 'V')
|
|
model.list.columns.push(fld);
|
|
|
|
if (usrrap.columns[i].filter)
|
|
model.search.filters.push(fld);
|
|
}
|
|
__Log(model);
|
|
return model;
|
|
}
|
|
%> |