Files
Facilitor/APPL/API2/model_reportsx.inc
Jos Groot Lipman 39aa984e73 FSN#40470 USR rapporten ook goed kunnen kopiëren.
svn path=/Website/trunk/; revision=33843
2017-05-15 10:08:01 +00:00

373 lines
17 KiB
PHP

<% /*
$Revision$
$Id$
File: model_reportsx.inc
Description: rapport model voor het *definieren* van rapporten.
Zal rapporten niet uitvoeren dus. Daar is model_reports voor
Parameters:
Context:
Notes:
*/
%>
<!-- #include file="./model_reportcolumns.inc" -->
<%
function model_reportsx(usrrap_key, rapparams)
{
rapparams = rapparams || {};
this.table = "fac_usrrap";
this.primary = "fac_usrrap_key";
this.records_name = "reports";
this.record_name = "report";
this.records_title = L("lcl_menu_fac_reports");
this.record_title = L("lcl_usrrap_report");
this.fields = { "id" : { dbs: "fac_usrrap_key",
typ: "key",
label: "Key",
filter: "exact",
required: true
},
"name" : { dbs: "fac_usrrap_omschrijving",
typ: "varchar",
label: L("lcl_usrrap_report"),
filter: "like",
translate: true,
len : 60, required: true
},
"description" : { dbs: "fac_usrrap_info",
typ: "varchar",
label: L("lcl_usrrap_info"),
filter: "like",
translate: true
},
"viewname" : { dbs: "fac_usrrap_view_name",
typ: "varchar",
label: L("lcl_usrrap_viewname"),
filter: "like",
required: true
},
"authorization": { dbs: "fac_functie_key",
typ: "key",
label: L("lcl_usrrap_functie"),
foreign: "fac_functie",
multiedit: true
},
"condition" : { dbs: "fac_usrrap_cond",
typ: "number",
label: L("lcl_usrrap_showcondition"),
required: true,
defaultvalue: 0,
LOV: L("lcl_usrrap_showconditionLOV")
},
"group" : { dbs: "fac_usrrap_groep",
typ: "varchar",
label: L("lcl_usrrap_groep"),
filter: "like",
multiedit: true },
"styling" : { dbs: "fac_usrrap_functie",
typ: "key",
label: L("lcl_usrrap_styling"),
LOV: L("lcl_usrrap_stylingLOV"), // 0;on-gestylede;1;gestylede;2;procedure;3;procedure gestyled;8;Via tabelizer;16;mobile;32;UDR Template
clone: function (xxx_data)
{
if (xxx_data.styling)
xxx_data.styling.id = xxx_data.styling.id & ~32;
return (xxx_data.styling);
}
},
"urllink" : { dbs: "fac_usrrap_urllink",
typ: "varchar",
label: L("lcl_usrrap_urllink")},
"autorefresh" : { dbs: "fac_usrrap_autorefresh",
typ: "check",
label: L("lcl_usrrap_autorefresh"),
multiedit: true
},
"count" : { dbs: "fac_usrrap_count",
typ: "number",
label: L("lcl_usrrap_showcount"),
required: true, defaultvalue: 1,
LOV: L("lcl_usrrap_showcountLOV"), // 0;Uit, verborgen;1;Uit, kiesbaar;2;Aan, verborgen;3;Aan, kiesbaar
multiedit: true
},
"ratio" : { dbs: "fac_usrrap_ratio",
typ: "number",
label: L("lcl_usrrap_showratio"),
required: true, defaultvalue: 1,
LOV: L("lcl_usrrap_showcountLOV"), // 0;Uit, verborgen;1;Uit, kiesbaar;2;Aan, verborgen;3;Aan, kiesbaar
multiedit: true
},
"pivot" : { dbs: "fac_usrrap_pivot",
typ: "number",
label: L("lcl_usrrap_showpivot"),
required: true, defaultvalue: 0,
LOV: L("lcl_usrrap_showcountLOV"),
multiedit: true
},
"graph" : { dbs: "fac_usrrap_graph",
typ: "number",
label: L("lcl_usrrap_showgraph"),
required: true, defaultvalue: 0,
LOV: L("lcl_usrrap_showcountLOV"),
multiedit: true
},
"graph_type" : { dbs: "fac_usrrap_graph_type",
typ: "number",
label: L("lcl_usrrap_graphtype"),
LOV: L("lcl_usrrap_graphtypeLOV"),
emptyoption: null,
multiedit: true
},
"lastrefresh" : { dbs: "fac_usrrap_col_refresh",
typ: "datetime",
label: "Columns last refreshed",
readonly: true
},
"graph_options": { dbs: "fac_usrrap_graph_options",
typ: "memo",
label: "Graph Options" }
};
this.list = { columns: ["id", "name", "description"] };
this.search = { autosearch: true,
filters: ["id", "name", "description"]
};
this.includes = {"columns": { model: new model_reportcolumns(usrrap_key, { internal: rapparams.internal }),
joinfield: "fac_usrrap_key",
enable_update: true
}
};
var hasFACFAC = user.has("WEB_FACFAC"); // Die mag ook tabellen doen
this.is_safe_view = function(viewname)
{
if (hasFACFAC)
return true; // die mag alles
if (rapparams.internal)
return true; // cloning
if (viewname)
{
if (viewname.substr(0, 4).toUpperCase() == customerId)
return true;
var regexp = S("fac_usrrap_safe_view_regexp"); //"^(AAXX|PCHX)"
if (regexp && new RegExp(regexp, 'i').test(viewname))
return true;
__Log("Viewname '{0}' is unsafe for {1}".format(viewname, user.oslogin()));
return false;
}
else
return true;
};
this._check_authorization = function(params, method)
{
params.message = "";
var autfunction = "WEB_UDRMAN";
params.authparams = user.checkAutorisation(autfunction); // pessimistisch
};
if (!hasFACFAC)
{
this.fields.lastrefresh.hidden_fld = true;
this.fields.authorization.foreign =
{
"tbl": "fac_functie",
"key": "fac_functie_key",
"desc": "lcl.l(fac_functie_omschrijving, 1) || ' (' || fac_functie_code || ')'",
"where": "fac_functie_code NOT IN ('WEB_FACFAC', 'WEB_FACTAB')"
}
}
this._analyze_fields = function (dbfields, params, jsondata) /* analyseer inkomende data, common voor PUT en POST */
{
// viewname zit alleen in dbfields als het een insert is. In edit-mode is dit veld readonly, dus niet in dbfields.
if ("viewname" in dbfields)
user.auth_required_or_abort(this.is_safe_view(jsondata.viewname));
};
this.hook_pre_edit = function (obj)
{
this.fields.styling.LOV = api2.filterLOV(L("lcl_usrrap_stylingLOV"), "0,1,2,3,8,16"); // De meesten mogen L(ike) niet
this.fields.graph_type.LOV = api2.filterLOV(this.fields.graph_type.LOV, "0,1,3,4"); // dashboard nu nog even niet.
if (obj.graph.id > 0)
{
this.fields.graph_type.LOV = this.fields.graph_type.LOV.substring(3);
this.fields.graph_type.LOV = api2.filterLOV(this.fields.graph_type.LOV, "1,3,4"); // dashboard nu nog even niet.
}
};
this.REST_GET = function _reportsx_GET(params, jsondata)
{
var query = api2.sqlfields(params, this);
var wheres = api2.sqlfilter(params, this);
query.wheres = query.wheres.concat(wheres);
var authparams = user.checkAutorisation("WEB_UDRMAN", true);
var whereor = ["fac_functie_key IS NULL"]
whereor.push("fac_functie_key IN"
+ " (SELECT w.fac_functie_key"
+ " FROM fac_v_webgebruiker W"
+ " WHERE w.prs_perslid_key = " + user_key + ")");
if (user.has("WEB_UDRMAN")) // Met UDRMAN hoef je er geen rechten op te hebben
{ // Uitzondeing: FACFAC en FACTAB, daar moet je altijd rechten op hebben
whereor.push("fac_functie_key NOT IN"
+ " (SELECT fac_functie_key"
+ " FROM fac_functie"
+ " WHERE fac_functie_code IN ('WEB_FACFAC', 'WEB_FACTAB'))");
}
query.wheres.push("(" + whereor.join(" OR ") +")");
if (S("fac_usrrap_mode") != 1 || rapparams.forview) // Als je niet mag clonen heb je niets aan UDR template rapporten
{
query.wheres.push("BITAND(COALESCE(fac_usrrap_functie, 0), 32) = 0");
}
var sql = "SELECT " + query.selects.join(", ")
+ " FROM " + query.tables.join(", ")
+ (query.wheres.length ? " WHERE " + query.wheres.join(" AND " ) : "")
+ " ORDER BY 2";
if (params.include && params.include.length)
sql += ", fac_usrrap_cols_volgnr";
var json = api2.sql2json (params, sql, this);
if (json.length == 1)
{
var rap_data = json[0];
if (params.include && inArray("columns", params.include))
{
this.includes["columns"].model._view2columns(params.filter.id, rap_data.lastrefresh, rap_data.columns);
var json = api2.sql2json (params, sql, this ); // En nu opnieuw ophalen
}
if ("viewname" in rap_data && !this.is_safe_view(rap_data.viewname))
this.fields["viewname"].readonly = true;
if (!params.cloning && rap_data.styling && rap_data.styling.id & 32) // UDR Template
{
this.REST_PUT = false; // Niets te updaten, alleen clonen
}
}
return json;
};
this.REST_PUT = function _reportsx_REST_PUT(params, jsondata, the_key) /* update report */
{
this._check_authorization(params, "PUT");
var sql = "SELECT fac_usrrap_view_name"
+ " FROM fac_usrrap"
+ " WHERE fac_usrrap_key = " + the_key;
var oRs = Oracle.Execute(sql);
var old_view = oRs("fac_usrrap_view_name").Value;
oRs.Close();
var dbfields = api2.update_fields(params, this, jsondata); // Build updater
this._analyze_fields(dbfields, params, jsondata);
var wheres = [" fac_usrrap_key = " + the_key];
var roomUpd = buildTrackingUpdate("fac_usrrap", wheres.join(" AND " ), dbfields, { noValidateToken: true });
var err = Oracle.Execute(roomUpd.sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
var beztrack = api2.process_includes(params, this, jsondata, the_key);
if ("viewname" in jsondata && old_view.toUpperCase() != jsondata.viewname.toUpperCase())
{ // Verwijder alle kolommen als er een nieuwe view is ingevuld, maar laat de expressies staan.
var sql = "DELETE fac_usrrap_cols"
+ " WHERE fac_usrrap_cols_expression IS NULL"
+ " AND fac_usrrap_key = " + the_key;
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
// Voeg de kolommen van de nieuwe view weer toe.
this.includes["columns"].model._view2columns(the_key, null, []);
}
return { key: the_key, warning: "" };
};
this.REST_POST = function _reportsx_REST_POST(params, jsondata) /* new report */
{
params.isNew = true; // negeer eventuele bestaande keys
this._check_authorization(params, "POST");
var dbfields = api2.update_fields(params, this, jsondata); // Build updater
this._analyze_fields(dbfields, params, jsondata);
dbfields["xxx"] = {dbs: "fac_usrrap_key", typ: "key", seq: "fac_s_fac_usrrap_key" };
var rapIns = buildInsert("fac_usrrap", dbfields, { noValidateToken: true });
var rap_key = rapIns.sequences["fac_usrrap_key"];
var err = Oracle.Execute(rapIns.sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
var beztrack = api2.process_includes(params, this, jsondata, rap_key);
return { key: rap_key, warning: "" };
};
this.REST_DELETE = function (params, the_key) /* delete report */
{
this._check_authorization(params, "DELETE");
var sql = "DELETE FROM fac_usrrap"
+ " WHERE fac_usrrap_key = " + the_key;
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
return { key: the_key, warning: "" };
};
if (!rapparams.internal)
{
if (hasFACFAC)
settings.overrule_setting("fac_usrrap_mode", 1); // _FACILITOR mag alles
else
{
// ooit iets als this.fields["viewname"].foreignsql = "SELECT object_name FROM user_objects WHERE objecttype = 'VIEW' AND <<safe>>";
// scaffolding.inc / scf_RWFIELDTR moet dan wel foreignsql gaan ondersteunen
}
if (S("fac_usrrap_mode") != 1)
{
this.fields["count"].readonly = true;
this.fields["ratio"].readonly = true; // denk ik dan
this.fields["pivot"].readonly = true;
this.fields["graph"].readonly = true;
this.fields["condition"].readonly = true;
}
if (!user.checkAutorisation("WEB_UDRMAN", true))
{ // Dit heeft betrekking op de zoekvelden van appl/fac/fac_reportx_show.asp?mode=search
// Omdat wij standaard linken naar mode=list speelt dit zelden.
for (var fld in this.fields)
{
if (fld != "id" && fld != "name" && fld != "description")
this.fields[fld].hidden = true;
}
this.list.columns = ["name", "description"];
this.fields["id"].filter = false;
}
}
if (usrrap_key > 0)
{
rapparams.filter = { "id" : usrrap_key };
this.data = this.REST_GET(rapparams)[0];
}
}
%>