Files
Facilitor/APPL/API2/model_reportcolumns.inc
Erik Groener 92ede63758 FCLT#88474 Niet-herstelbare wijziging numeriek veldtype UDR rapport
naar versie 2025.3

svn path=/Website/trunk/; revision=69468
2025-06-18 10:10:15 +00:00

391 lines
15 KiB
PHP

<% /*
$Revision$
$Id$
File: model_reportcolumns.inc
Description: rapport model voor de kolommen van rapporten.
Parameters:
Context:
Notes:
*/
// model_reportcolumns is uitsluitend beschikbaar onder model_reports(x) die de autorisatie dan ook doet
// TODO: neen, security lek FSN#33869
function model_reportcolumns(usrrap_key, params)
{
var rap_key = getQParamInt("fac_usrrap_key", -1); // JGL: Lelijk
params = params || {};
this.records_name = "columns";
this.record_name = "column";
this.table = "fac_usrrap_cols";
this.primary = "fac_usrrap_cols_key";
this.records_title = L("lcl_rap_columns");
this.record_title = L("lcl_rap_column");
this.autfunction = "WEB_UDRMAN", // Minstens UDRMAN rechten, met FACTAB kan ook sql-expressie zelf worden ingevuld.
this.defaultIcon = "fa-table-cells-large";
this.edit = {
modal: true,
requires: {
js: ["../fac/fac_reportx.js"]
}
};
var hasFACFAC = !!user.has("WEB_FACFAC");
var hasFACTAB = !!user.has("WEB_FACTAB");
var hasUDRMAN = !!user.has("WEB_UDRMAN");
this.fields = {
"id": {
dbs: "fac_usrrap_cols_key",
typ: "key",
label: L("lcl_key"),
seq: "fac_s_fac_usrrap_cols_key"
},
"name": {
dbs: "fac_usrrap_cols_column_name",
typ: "varchar",
label: L("lcl_rap_column"),
required: true,
insertonly: true
},
"datatype": {
dbs: "fac_usrrap_cols_datatype",
typ: "varchar",
label: L("lcl_rap_datatype"),
required: true,
LOV: L("lcl_rap_datatypeLOV") // "varchar;Tekst;date;Datum;datetime;Datumtijd;time;Tijd;float;Float;currency;Bedrag;number;Getal;check0;Checkbox;html;Html"
},
"sequence": {
dbs: "fac_usrrap_cols_volgnr",
typ: "number",
label: L("lcl_rap_sequence"),
required: true
},
"caption": {
dbs: "fac_usrrap_cols_caption",
typ: "varchar",
label: L("lcl_rap_caption"),
required: true,
translate: true
},
"sorting": {
dbs: "fac_usrrap_cols_sorting",
typ: "number",
label: L("lcl_usrrap_sorting"),
LOV: L("lcl_usrrap_sortingLOV"),
required: true,
defaultvalue: 3,
multiedit: true
},
"filter": {
dbs: "fac_usrrap_cols_filter",
typ: "varchar",
label: L("lcl_rap_filter"),
LOV: L("lcl_rap_filterLOV"), // "A;Automatisch"
multiedit: true
},
"filterdefault": {
dbs: "fac_usrrap_cols_filterdefault",
typ: "varchar",
label: L("lcl_rap_filterdefault")
},
"urllink": {
dbs: "fac_usrrap_cols_urllink",
typ: "memo",
label: L("lcl_usrrap_cols_urllink")
},
"visible": {
dbs: "fac_usrrap_cols_visible",
typ: "varchar",
label: L("lcl_rap_visible"),
required: true,
LOV: L("lcl_rap_visibleLOV"), // "V;Visible;I;Invisible;H;hidden;S;Suppress repetitions"
emptyoption: null,
multiedit: true
},
"group": {
dbs: "fac_usrrap_cols_group",
typ: "varchar",
label: L("lcl_rap_groupby"),
required: true,
LOV: L("lcl_rap_groupbyLOV"),
emptyoption: null
},
"fac_usrrap_key": {
dbs: "fac_usrrap_key",
typ: "key",
hidden_fld: true
},
"expression": {
dbs: "fac_usrrap_cols_expression",
typ: "memo",
label: L("lcl_rap_expression"),
labelaction: {
icon: "fa-wand-sparkles",
hint: L("lcl_usrrap_property_wizard"),
action: "kenmerkkolom()"
},
required: true,
readonly: true
}
};
this.fnrowClass = function _fnrowClass(oRs)
{
return "report_" + oRs.Fields("visible").Value.id;
}
this.list = {
columns: [
"sequence",
"name",
"caption",
"sorting",
"datatype",
"visible",
"filter",
"filterdefault",
"group"
],
rowClass: this.fnrowClass
};
this.hook_pre_edit = function (obj, fld)
{
function getOrgDatatype(p_usrrap_key, p_column_name)
{
var datatype = null;
var sql = "SELECT CASE WHEN REGEXP_SUBSTR(UPPER(c.column_name), '^FCLT_C_') IS NOT NULL THEN 'currency'"
+ " WHEN REGEXP_SUBSTR(UPPER(c.column_name), '^HTML_') IS NOT NULL THEN 'html'"
+ " WHEN data_type = 'NUMBER' AND data_scale > 0 THEN 'float'"
+ " WHEN data_type = 'NUMBER' THEN 'number'"
+ " WHEN data_type = 'DATE' THEN 'date'"
+ " ELSE 'varchar'"
+ " END column_datatype"
+ " FROM user_tab_columns c"
+ " , fac_usrrap r"
+ " WHERE c.table_name = UPPER(r.fac_usrrap_view_name)"
+ " AND c.column_name = " + safe.quoted_sql_upper(p_column_name)
+ " AND r.fac_usrrap_key = " + p_usrrap_key;
var oRs = Oracle.Execute(sql);
if (!oRs.eof)
datatype = oRs("column_datatype").Value;
oRs.Close();
return datatype;
}
this.fields.filter.LOV = api2.filterLOV(L("lcl_rap_filterLOV"), "A,E,R,RR,P"); // De meesten mogen L(ike) niet
if ((obj.datatype && !obj.expression))
{
var orgDatatype = getOrgDatatype(obj.fac_usrrap_key, obj.name);
var datatype_id = (obj.datatype.id == "varchar" && orgDatatype == "number" ? "number" : obj.datatype.id);
switch (datatype_id)
{
case "date":
case "datetime":
this.fields.group.LOV = api2.filterLOV(L("lcl_rap_groupbyLOV"), "G,D,W,M,Q,Y,H");
this.fields.datatype.LOV = api2.filterLOV(L("lcl_rap_datatypeLOV"), "date,datetime,time");
break;
case "time":
this.fields.group.LOV = api2.filterLOV(L("lcl_rap_groupbyLOV"), "G,H");
this.fields.datatype.LOV = api2.filterLOV(L("lcl_rap_datatypeLOV"), "date,datetime,time");
break;
case "varchar":
if (orgDatatype == "number" || orgDatatype == "float" || orgDatatype == "currency") {
this.fields.group.LOV = api2.filterLOV(L("lcl_rap_groupbyLOV"), "G,S,C,A");
this.fields.datatype.readonly = false;
this.fields.datatype.LOV = api2.filterLOV(L("lcl_rap_datatypeLOV"), "varchar,number,float,currency");
} else {
this.fields.group.LOV = api2.filterLOV(L("lcl_rap_groupbyLOV"), "G");
this.fields.datatype.readonly = true;
this.fields.filter.LOV = L("lcl_rap_filterLOV"); // die mag alle filters
}
break;
case "html":
this.fields.group.LOV = api2.filterLOV(L("lcl_rap_groupbyLOV"), "G");
this.fields.datatype.readonly = true;
this.fields.filter.LOV = L("lcl_rap_filterLOV");
break;
case "check0":
case "float":
case "number":
case "currency":
this.fields.group.LOV = api2.filterLOV(L("lcl_rap_groupbyLOV"), "G,S,C,A");
this.fields.datatype.LOV = api2.filterLOV(L("lcl_rap_datatypeLOV"), "float,currency,number,varchar");
break;
default:
this.fields.group.LOV = api2.filterLOV(L("lcl_rap_groupbyLOV"), "G");
}
}
if ((obj.filter && obj.filter.id == "P" || obj.expression || !obj.id))
{
this.fields.expression.readonly = false;
this.fields.name.insertonly = false;
if ( obj.expression || (obj.filter && obj.filter.id == "P") )
{ // Een door gebruiker toegevoegd veld mag verwijderd worden, mits UDRMAN of FACTAB rechten.
this.REST_DELETE = generic_REST_DELETE(this);
}
if (!hasFACTAB && obj.id)
{ // Een UDRMAN hoeft deze velden niet te zien bij wijzigen.
delete this.fields.name;
delete this.fields.expression;
// .. maar wel handig om te weten dat er een sql-expressie bestaat.
if (obj.expression && obj.expression.length > 0)
{
this.fields.hasexpression = {"dbs": "",
"label": L("lcl_rap_expression"),
"typ": "varchar",
"readonly": true
};
obj.hasexpression = L("lcl_inserted0").format("");
}
}
}
var x_id = getQParamInt("id", -1);
%>
<script>
var params_js = { model: "columns"
, id: <%=x_id%>
, hasfactab: (<%=(hasFACTAB?1:0)%>==1)
, hasudrman: (<%=(hasUDRMAN?1:0)%>==1)
};
</script>
<%
};
this.hook_pre_post = function (params, obj)
{
if (obj.id == -1)
this.fields.expression.readonly = false;
};
this.hook_pre_delete = function (params, columns_key)
{ // Alleen een parameter of sql-expressie mag door een gebruiker verwijderd worden.
var sql = "SELECT 1"
+ " FROM fac_usrrap_cols"
+ " WHERE ( fac_usrrap_cols_expression IS NOT NULL"
+ " OR fac_usrrap_cols_filter = 'P'"
+ " )"
+ " AND fac_usrrap_cols_key = " + columns_key;
var oRs = Oracle.Execute(sql, true);
if (oRs.eof)
abort_with_warning(L("lcl_cnt_Del_Fails_Auth"));
oRs.Close();
user.checkAutorisation(["WEB_FACTAB","WEB_UDRMAN"]);
this.REST_DELETE = generic_REST_DELETE(this);
};
// Maakt de default fac_usrrap_cols records aan aan de hand van de view of werk ze bij
this._view2columns = function (usrrap_key, lastrefresh, oldcols)
{
var sql_date = ", TO_DATE('" + toDateTimeString(lastrefresh, true, true) + "','dd-mm-yyyy hh24:mi:ss')";
var sql = "BEGIN"
+ " fac.view2columns(" + usrrap_key + (lastrefresh ? sql_date : "") + ");"
+ " END;";
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
}
this.REST_GET = function _GET(params)
{
// De modal detail popup gebruikt dit echter nog wel.
var query = api2.sqlfields(params, this );
var wheres = api2.sqlfilter(params, this);
query.wheres = query.wheres.concat(wheres);
var sql = "SELECT " + query.selects.join(", ")
+ " FROM " + query.tables.join(", ")
+ " WHERE " + query.wheres.join(" AND " )
+ " ORDER BY fac_usrrap_cols_volgnr";
var json = api2.sql2json (params, sql, this );
if (!json.length)
{
INTERNAL_ERROR_MISSING_COLUMNS;
}
return json;
}
this.REST_PUT = function (params, jsondata, the_key) /* update columns */
{
var valid_char = /^[_0-9a-zA-Z]+$/; // Alleen deze tekens zijn geldig!
if (!valid_char.test(jsondata.name))
abort_with_warning(L("lcl_rap_column_invalid"));
if (hasFACTAB && (jsondata.expression || !jsondata.id))
{
this.fields.expression.readonly = false;
this.fields.name.insertonly = false;
}
var dbfields = api2.update_fields(params, this, jsondata); // Build updater
var sql = buildUpdate("fac_usrrap_cols", dbfields, { noValidateToken: true }) + " fac_usrrap_cols_key = " + the_key;
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
return { key: the_key };
}
this._REST_PUT = this.REST_PUT; // Interne is er altijd
// Only internally used by report_clone and _view2columns
this._REST_POST = function (params, jsondata, parent_key) /* insert columns */
{
params.isNew = true;
if (hasFACTAB && !jsondata.id || params.cloning)
this.fields.expression.readonly = false;
var valid_char = /^[_0-9a-zA-Z]+$/;
if (!valid_char.test(jsondata.name))
abort_with_warning(L("lcl_rap_column_invalid"));
var dbfields = api2.update_fields(params, this, jsondata); // Build updater
dbfields["id"] = this.fields["id"];
if (parent_key && !jsondata.fac_usrrap_key)
dbfields["xxx"] = { dbs: "fac_usrrap_key", typ: "key", val: parent_key };
var rapIns = buildInsert("fac_usrrap_cols", dbfields, { noValidateToken: true });
var col_key = rapIns.sequences["fac_usrrap_col_key"];
var err = Oracle.Execute(rapIns.sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
return { key: col_key, warning: "" };
}
if (params.internal || hasFACTAB || hasUDRMAN)
{
this.REST_POST = this._REST_POST;
}
if (rap_key > 0)
{
// var rap_data = model_reportsx(rap_key); te veel recursie
var sql = "SELECT fac_usrrap_functie"
+ " FROM fac_usrrap"
+ " WHERE fac_usrrap_key = " + rap_key;
var oRs = Oracle.Execute(sql);
var functie = oRs("fac_usrrap_functie").Value || 0;
oRs.Close();
if (functie & 32) { // template
this.REST_PUT = false;
this.REST_POST = false;
}
}
}
%>