FSN#31698 Rapportgenerator savepoint

svn path=/Website/trunk/; revision=24322
This commit is contained in:
Jos Groot Lipman
2015-03-03 16:26:43 +00:00
parent 18e35ab9f6
commit 8b89a63a3a
26 changed files with 1548 additions and 271 deletions

View File

@@ -57,7 +57,7 @@ api2 = {
IMPERS = getQParam("SWITCHUSER", ""); IMPERS = getQParam("SWITCHUSER", "");
if (!IMPERS && Request.ServerVariables("HTTP_X_FACILITOR_SWITCH_USER").Count) if (!IMPERS && Request.ServerVariables("HTTP_X_FACILITOR_SWITCH_USER").Count)
IMPERS = String(Request.ServerVariables("HTTP_X_FACILITOR_SWITCH_USER")); // Meegegeven als X-FACILITOR-SWITCH-USER IMPERS = String(Request.ServerVariables("HTTP_X_FACILITOR_SWITCH_USER")); // Meegegeven als X-FACILITOR-SWITCH-USER
if (IMPERS) // && S("fac_api_allow_impersonate") if (IMPERS && S("fac_api_allow_impersonate"))
{ {
var sql = "SELECT prs_perslid_key, prs_perslid_naam" var sql = "SELECT prs_perslid_key, prs_perslid_naam"
+ " FROM prs_perslid" + " FROM prs_perslid"
@@ -165,12 +165,12 @@ api2 = {
if ("REST_DELETE" in model) if ("REST_DELETE" in model)
result.methods.push("DELETE"); result.methods.push("DELETE");
for (var i in model.fields) // TODO: Misschien beter via een (beknopt) field-object? for (var fld in model.fields)
{ // TODO: We missen hard-coded filters als reservableequipment/allowedinroom nu nog { // TODO: We missen hard-coded filters als reservableequipment/allowedinroom nu nog
if (model.fields[i].filter) if (model.fields[fld].filter)
result.filters.push({ id: model.fields[i].name, result.filters.push({ id: fld,
filter: model.fields[i].filter, filter: model.fields[fld].filter,
type: model.fields[i].typ type: model.fields[fld].typ
}); });
} }
} }
@@ -239,23 +239,12 @@ api2 = {
labels: function _labels(model) labels: function _labels(model)
{ {
var result = {}; var result = {};
for (var i in model.fields) for (var fld in model.fields)
{ {
if (model.fields[i].label) if (model.fields[fld].label)
result[model.fields[i].name] = model.fields[i].label; result[fld] = model.fields[fld].label;
else if (typeof model.fields[i].track == 'string') else if (typeof model.fields[fld].track == 'string')
result[model.fields[i].name] = model.fields[i].track; result[fld] = model.fields[fld].track;
}
return result;
},
assoc: function _assoc(model, fld)
{
var result = {};
for (var i in model.fields)
{
if (fld in model.fields[i])
result[model.fields[i][fld]] = model.fields[i];
} }
return result; return result;
@@ -264,12 +253,24 @@ api2 = {
We begonnen ooit met fields als een array van { name: "xxx", dbs: "yyyy", .... } We begonnen ooit met fields als een array van { name: "xxx", dbs: "yyyy", .... }
Maar later bleek het handiger een hash van "xxx": { dbs: "yyyy", .... } Maar later bleek het handiger een hash van "xxx": { dbs: "yyyy", .... }
Voor oude modellen herschrijven we versie 1 naar versie 2 Voor oude modellen herschrijven we versie 1 naar versie 2
TODO: Dit moet er nog uit!!
*/ */
normalize: function _normalize(model) normalize: function _normalize(model)
{ {
if (!model.fields.length)
return; // het is al een hash
var newfields = {};
for (var i in model.fields)
{
newfields[model.fields[i]["name"]] = model.fields[i];
//delete model.fields[i]["name"];
}
model.fields = newfields;
}, },
form2JSONdata: function _form2JSONdata(model, params, formfields) // Maak een jsondata-object voor gebruik vanuit model_xxx.inc form2JSONdata: function _form2JSONdata(model, params, formfields) // Maak een jsondata-object voor gebruik vanuit model_xxx.inc
{ {
api2.normalize(model);
var jsondata = {}; var jsondata = {};
jsondata[model.record_name] = {id: params.filter.id}; jsondata[model.record_name] = {id: params.filter.id};
@@ -278,38 +279,41 @@ api2 = {
{ {
// Voeg een nieuwe combinatie naam:waarde toe aan het jsondata object als er een frm of val bekend is. // Voeg een nieuwe combinatie naam:waarde toe aan het jsondata object als er een frm of val bekend is.
var val; var val;
var hasFrm = true;
if (formfields[i].frm) if (formfields[i].frm)
{ {
// Haal waarde uit de formparameters. // Haal waarde uit de formparameters.
if (Request.Form(formfields[i].frm).count > 0) if (Request.Form(formfields[i].frm).count == 0)
val = Request.Form(formfields[i].frm)(1); continue; // niet aanwezig
else val = Request.Form(formfields[i].frm)(1);
hasFrm = false; switch (model.fields[formfields[i].name].typ)
{
case "float":
val = getFParamFloat(formfields[i].frm, null);
break;
case "key":
case "check":
case "check0":
case "number":
val = getFParamInt(formfields[i].frm, null);
break;
case "date":
case "datetime":
val = getFParamDate(formfields[i].frm, null);
break;
case "varchar":
val = getFParam(formfields[i].frm, null);
break;
default:
{
__DoLog(model.fields[formfields[i].name].typ);
INTERN_ERROR_UNKNOWN_TYPE;
}
}
} }
else else
val = formfields[i].val; val = formfields[i].val;
// //
if (hasFrm) jsondata[model.record_name][formfields[i].name] = val;
{
var modelIndex = api2.find_fieldindex_by_attr(model.fields, "name", formfields[i].name);
switch (model.fields[modelIndex].typ)
{
case "float":
if (val === "" || val === null)
var safe_val = "";
else
{
if (typeof val == "string")
val = val.replace(/,/g,".");
var safe_val = parseFloat(val);
}
break;
default:
safe_val = val;
}
jsondata[model.record_name][formfields[i].name] = safe_val.toString();
}
} }
return jsondata; return jsondata;
}, },
@@ -320,6 +324,10 @@ api2 = {
var wheres = []; var wheres = [];
if (params.filter) if (params.filter)
{ {
if (model.parent_key in params.filter)
wheres.push(model.table + "." + model.parent_key + " = " + parseInt(params.filter[model.parent_key], 10));
else if ("pid" in params.filter)
wheres.push(model.table + "." + model.parent_key + " = " + parseInt(params.filter["pid"], 10));
for (var fld in model.fields) for (var fld in model.fields)
{ {
var field = model.fields[fld]; var field = model.fields[fld];
@@ -328,28 +336,29 @@ api2 = {
continue; continue;
// We kijken of dit model-veld in de filterparameters voorkomt. Voor ranges kunnen prefixes in gebruik zijn // We kijken of dit model-veld in de filterparameters voorkomt. Voor ranges kunnen prefixes in gebruik zijn
if (field.name in params.filter || "start_"+field.name in params.filter || "end_"+field.name in params.filter) if (fld in params.filter || "start_" + fld in params.filter || "end_" + fld in params.filter)
{ {
// filterval is de meegegeven filterwaarde voor dit veld // filterval is de meegegeven filterwaarde voor dit veld
var filterval = params.filter[field.name]; var filterval = params.filter[fld];
if (filterval === "" || filterval === null)
continue;
if (filterval < 0 && field.typ == "key")
continue;
// Voor ranges komt de naam (misschien) niet letterlijk voor, maar (mogelijk) met start_ of end_ ervoor // Voor ranges komt de naam (misschien) niet letterlijk voor, maar (mogelijk) met start_ of end_ ervoor
// meerdere filters voor 1 veld dus wellicht // meerdere filters voor 1 veld dus wellicht
if (filter == "range") { if (filter == "range") {
filterval1 = params.filter["start_"+field.name]; filterval1 = params.filter["start_" + fld];
filterval2 = params.filter["end_"+field.name]; filterval2 = params.filter["end_" + fld];
//__Log(">>filterval1>>"+filterval1);
//__Log(">>filterval2>>"+filterval2);
} }
// Nu is ook voor ranges alles weer normaal // Nu is ook voor ranges alles weer normaal
//__Log(">>field>>"+field.name);
//__Log(">>filter>>"+filter);
//__Log(">>filterval>>"+filterval);
var clause; var clause;
var operand = " = "; var operand = " = ";
switch (field.typ) switch (field.typ)
{ {
case "key": case "key":
if (!filterval)
continue;
if (filterval instanceof Array) if (filterval instanceof Array)
{ {
safe_val = "(" + filterval.join(",") + ")"; safe_val = "(" + filterval.join(",") + ")";
@@ -358,7 +367,7 @@ api2 = {
else if (String(filterval).indexOf(",") != -1) // let op: bij buildings/1234.json is id al numeriek gemaakt else if (String(filterval).indexOf(",") != -1) // let op: bij buildings/1234.json is id al numeriek gemaakt
// NB: index=-1 als het geen array is. // NB: index=-1 als het geen array is.
{ {
safe_val = "(" + getQParamIntArray(field.name).join(",") + ")"; // TODO: Niet via getQParamIntArray safe_val = "(" + getQParamIntArray(fld).join(",") + ")"; // TODO: Niet via getQParamIntArray
operand = " IN "; operand = " IN ";
} }
else else
@@ -498,14 +507,16 @@ api2 = {
}, },
// Als er voor een veldnaam een alias moet worden gebruikt, doe het dan op deze manier. // Als er voor een veldnaam een alias moet worden gebruikt, doe het dan op deze manier.
sqlfield_alias: function _sqlfield_alias(model, field) sqlfield_alias: function _sqlfield_alias(model, fld)
{ {
return model.aliasprefix + (field.dbs == model.primary ? field.dbs : field.name); var field = model.fields[fld];
return model.aliasprefix + (field.dbs == model.primary ? field.dbs : fld);
}, },
// Bepaal bij een GET welke velden op te halen // Bepaal bij een GET welke velden op te halen
sqlfields: function _sqlfields(params, model) sqlfields: function _sqlfields(params, model)
{ {
api2.normalize(model);
model.aliasprefix = model.aliasprefix || ""; model.aliasprefix = model.aliasprefix || "";
var selects = []; var selects = [];
var tables = [ model.table ]; var tables = [ model.table ];
@@ -514,15 +525,14 @@ api2 = {
var name_cnt = 0; var name_cnt = 0;
for (var fld in model.fields) for (var fld in model.fields)
{ {
var field = model.fields[fld]; if (fld.substring(0,1) == "_")
if (!field.name)
continue; continue;
var field = model.fields[fld];
var dbs = field.dbs; var dbs = field.dbs;
if (field.sql) if (field.sql)
{ {
if (model.aliasprefix) if (model.aliasprefix)
dbs = model.aliasprefix + field.name; dbs = model.aliasprefix + fld;
selects.push(field.sql + " AS " + dbs); selects.push(field.sql + " AS " + dbs);
} }
else if (dbs) else if (dbs)
@@ -532,7 +542,7 @@ api2 = {
{ {
dbs = model.table + "." + dbs; dbs = model.table + "." + dbs;
if (model.aliasprefix) if (model.aliasprefix)
dbs += " AS " + api2.sqlfield_alias(model, field); dbs += " AS " + api2.sqlfield_alias(model, fld);
} }
selects.push(dbs); selects.push(dbs);
} }
@@ -622,7 +632,6 @@ api2 = {
// TODO the_key *moet* bestaan. Andere filtervelden negeren we // TODO the_key *moet* bestaan. Andere filtervelden negeren we
update_fields: function _update_fields(params, model, jsondata) update_fields: function _update_fields(params, model, jsondata)
{ {
//__DoLogj(jsondata)
if (jsondata[model.record_name]) if (jsondata[model.record_name])
jsondata = jsondata[model.record_name]; // dereference jsondata = jsondata[model.record_name]; // dereference
@@ -631,11 +640,11 @@ api2 = {
{ {
var field = model.fields[fld]; var field = model.fields[fld];
// De key halen we uit de url, die in de JSON negeren we // De key halen we uit de url, die in de JSON negeren we
if (field.name == "id") if (fld == "id")
continue; continue;
if ("sql" in field) if ("sql" in field)
continue; continue;
if (!(field.name in jsondata) && !field.fnval) if (!(fld in jsondata) && !field.fnval)
continue; continue;
if (field.readonly) if (field.readonly)
continue; continue;
@@ -643,7 +652,7 @@ api2 = {
if (field.fnval) if (field.fnval)
var newval = field.fnval(jsondata); var newval = field.fnval(jsondata);
else // simpel else // simpel
var newval = jsondata[field.name]; var newval = jsondata[fld];
switch (field.typ) switch (field.typ)
{ {
@@ -651,25 +660,28 @@ api2 = {
if (newval && typeof newval == "object" && "id" in newval) if (newval && typeof newval == "object" && "id" in newval)
{ // dereference { // dereference
newval = newval.id; newval = newval.id;
jsondata[field.name] = newval; jsondata[fld] = newval;
} }
break; break;
case "date": case "date":
case "datetime": case "datetime":
if (newval === "")
newval = null;
// LET OP: Een (new Date) gemaakt binnen een plugin is vreemd genoeg geen (instanceof Date) // LET OP: Een (new Date) gemaakt binnen een plugin is vreemd genoeg geen (instanceof Date)
// Waarschijnlijk gebruikt een wsc een ander Date object als (ASP)JScript? // Waarschijnlijk gebruikt een wsc een ander Date object als (ASP)JScript?
if (newval !== null && typeof newval == "object" && !(newval instanceof Date)) if (newval !== null && typeof newval == "object" && !(newval instanceof Date))
newval = new Date(newval); newval = new Date(newval);
__DoLog(newval)
__DoLogj(typeof newval)
if (newval !== null && !(newval instanceof Date)) if (newval !== null && !(newval instanceof Date))
{ {
abort_with_warning("Invalid " + field.typ + " (" + model.record_name + "." + field.name + "): " + newval); abort_with_warning("Invalid " + field.typ + " (" + model.record_name + "." + fld + "): " + newval);
} }
break; break;
case "float": case "float":
case "number": case "number":
if (isNaN(newval)) if (isNaN(newval))
abort_with_warning("Invalid number (" + model.record_name + "." + field.name + "): " + newval); abort_with_warning("Invalid number (" + model.record_name + "." + fld + "): " + newval);
break; break;
} }
if (field.dbs.indexOf(".") >= 0) // complexe foreign key if (field.dbs.indexOf(".") >= 0) // complexe foreign key
@@ -677,8 +689,9 @@ api2 = {
//__Log("newval="+newval); //__Log("newval="+newval);
var newfield = { dbs: field.dbs, var newfield = { dbs: field.dbs,
typ: field.typ, typ: field.typ,
track: field.track, track: field.track && field.label?field.label:field.track,
val: newval val: newval,
len: field.len
}; };
fields.push(newfield); fields.push(newfield);
} }
@@ -701,6 +714,7 @@ api2 = {
if (inc.model) // andere includes zijn nog niet bij te werken if (inc.model) // andere includes zijn nog niet bij te werken
{ {
// Als je bij een PUT/POST een include in de BODY zet geven we heb automagisch terug // Als je bij een PUT/POST een include in de BODY zet geven we heb automagisch terug
params.include = params.include || [];
params.include.push(incname); params.include.push(incname);
var incmodel = inc.model; var incmodel = inc.model;
@@ -713,7 +727,6 @@ api2 = {
var oRs = Oracle.Execute(sql); var oRs = Oracle.Execute(sql);
while (!oRs.Eof) while (!oRs.Eof)
{ {
//__DoLog("Found in DB " + incname + " " + oRs(incmodel.primary).Value);
existing_includes[oRs(incmodel.primary).Value] = { found: false }; // vooralsnog niet in json-data gevonden existing_includes[oRs(incmodel.primary).Value] = { found: false }; // vooralsnog niet in json-data gevonden
oRs.MoveNext(); oRs.MoveNext();
} }
@@ -751,13 +764,14 @@ api2 = {
} }
}, },
// Geeft de GET terug // Geeft de GET terug
sql2jsonval: function(oRs, field, model) sql2jsonval: function(oRs, fld, model)
{ {
var field = model.fields[fld];
if (field.val instanceof Function) if (field.val instanceof Function)
var val = field.val(oRs, field, model); var val = field.val(oRs, field, model);
else if (field.dbs.indexOf(".") < 0) else if (field.dbs.indexOf(".") < 0)
{ {
var sqlfieldname = (model.aliasprefix ? api2.sqlfield_alias(model, field) : field.dbs); var sqlfieldname = (model.aliasprefix ? api2.sqlfield_alias(model, fld) : field.dbs);
var val = oRs(sqlfieldname).Value; var val = oRs(sqlfieldname).Value;
} }
else else
@@ -787,21 +801,51 @@ api2 = {
val = { id: val }; val = { id: val };
val.name = name; val.name = name;
} }
if (val !== null && (field.LOV))
{
var spl = api2.splitLOV(field.LOV);
val = { id: val, name: spl[val] };
}
return val; return val;
}, },
splitLOV: function _splitLOV(LOV)
{
var splits = LOV.split(";");
if (splits % 2)
abort_with_warning("LOV '{0}' mismatch".format(LOV));
var result = {};
for (var i=0; i < splits.length / 2; i++)
result[splits[i*2]] = splits[i*2 + 1];
return result;
},
splitLOV2sql: function _splitLOV(LOV)
{
var spl = api2.splitLOV(LOV);
var dual = [];
for (var l in spl)
dual.push("SELECT " + safe.quoted_sql(l) + ", " + safe.quoted_sql(spl[l]) + " FROM DUAL");
return dual.join(" UNION ALL ");
},
splitLOV2select: function _splitLOV(LOV, current)
{
var spl = api2.splitLOV(LOV);
var options = [];
for (var l in spl)
options.push("<option value='" + safe.htmlattr(l) + "'>" + safe.html(spl[l]) + "</option>");
return "<select>" + options.join("") + "</select>";
},
sql2jsonfields: function (oRs, model) sql2jsonfields: function (oRs, model)
{ {
var record = {}; var record = {};
for (var fld in model.fields) for (var fld in model.fields)
{ {
var field = model.fields[fld]; if (fld.substring(0,1) == "_")
if (!field.name)
continue; continue;
var field = model.fields[fld];
var val = api2.sql2jsonval(oRs, field, model); var val = api2.sql2jsonval(oRs, fld, model);
if (field.readonly && !val.id) if (field.readonly && !val.id)
continue; continue;
record[field.name] = val; record[fld] = val;
} }
return record; return record;
}, },
@@ -815,17 +859,21 @@ api2 = {
var data = []; var data = [];
var oRs = Oracle.Execute(sql); var oRs = Oracle.Execute(sql);
var lastkey = -1; var lastkey = 0;
var record = {};
// Merk op dat onze recordset meer regels kan bevatten dan je zou verwachten // Merk op dat onze recordset meer regels kan bevatten dan je zou verwachten
// omdat de includes er bij zijn gejoind // omdat de includes er bij zijn gejoind
while (!oRs.Eof) while (!oRs.Eof)
{ {
var key = oRs(model.primary).Value; if (model.primary)
if (key != lastkey)
{ {
if (lastkey > 0 && "id" in record) // Record was er mogelijk uit gefilterd var key = oRs(model.primary).Value;
data.push(record); if (key != lastkey)
var record = {}; {
if (lastkey && "id" in record) // Record was er mogelijk uit gefilterd
data.push(record);
var record = {};
}
} }
// Complexe filtering die we niet voor elkaar kregen met een WHERE-clause // Complexe filtering die we niet voor elkaar kregen met een WHERE-clause
@@ -842,13 +890,13 @@ api2 = {
var fld; var fld;
for (fld in model.fields) for (fld in model.fields)
{ {
var field = model.fields[fld]; if (fld.substring(0,1) == "_")
if (!field.name)
continue; continue;
var val = api2.sql2jsonval(oRs, field, model) var field = model.fields[fld];
var val = api2.sql2jsonval(oRs, fld, model)
if (field.readonly && !val.id) if (field.readonly && !val.id)
continue; continue;
record[field.name] = val; record[fld] = val;
} }
if (params.include && model.includes) if (params.include && model.includes)
{ {
@@ -899,9 +947,14 @@ api2 = {
} }
lastkey = key; lastkey = key;
if (!model.primary)
{
data.push(record);
record = {};
}
oRs.MoveNext(); oRs.MoveNext();
} }
if (lastkey > 0) if (lastkey)
data.push(record); data.push(record);
return data; return data;
}, },
@@ -955,7 +1008,7 @@ api2 = {
break; break;
case "xml": case "xml":
Response.ContentType = "text/xml"; Response.ContentType = "text/xml";
var xml_antwoord = api2.json2xml(data, model.records_name, model.record_name, single); var xml_antwoord = api2.json2xml(data, model, single);
// TODO: Output XSL transform ondersteunen? // TODO: Output XSL transform ondersteunen?
if (getQParam("pretty","0")=="1") if (getQParam("pretty","0")=="1")
{ {
@@ -996,8 +1049,10 @@ api2 = {
// TODO: Wanneer attributes gebruiken en wanneer (sub)-elements? // TODO: Wanneer attributes gebruiken en wanneer (sub)-elements?
// Streven: data == xml2json(json2xml(data)) // Streven: data == xml2json(json2xml(data))
json2xml: function _json2xml(data, rootname, record_name, single) json2xml: function _json2xml(data, model, single)
{ {
var rootname = model.records_name;
var record_name = model.record_name;
var xmlDoc = new ActiveXObject("MSXML2.DOMDocument.6.0"); var xmlDoc = new ActiveXObject("MSXML2.DOMDocument.6.0");
xmlDoc.appendChild(xmlDoc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\"")); xmlDoc.appendChild(xmlDoc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\""));
@@ -1014,14 +1069,20 @@ api2 = {
} }
else if (record[fld] instanceof Array) else if (record[fld] instanceof Array)
{ {
var inc_record_name;
for (var ii in model.includes)
{
if (model.includes[ii].model.records_name == fld)
inc_record_name = model.includes[ii].model.record_name;
}
for (var i = 0; i < record[fld].length; i++) for (var i = 0; i < record[fld].length; i++)
elementField.appendChild(record2json(record[fld][i], "visitor")); // TODO Hardcoded elementField.appendChild(record2json(record[fld][i], inc_record_name));
} }
else if (record[fld] && typeof record[fld] == "object") // TODO: veronderstelt nog hardcoded dat dit foreign met name/key is else if (record[fld] && typeof record[fld] == "object") // Veronderstelt dat dit foreign met name/key is
{ // misschien && "id" in record[fld] {
if ("name" in record[fld] && "id" in record[fld]) if ("name" in record[fld] && "id" in record[fld])
{ {
elementField.setAttribute("name", record[fld].name); elementField.setAttribute("name", fld);
elementField.setAttribute("id", record[fld].id); elementField.setAttribute("id", record[fld].id);
} }
else else
@@ -1184,17 +1245,6 @@ api2 = {
} }
return -1; return -1;
}, },
find_fieldindex_by_attr: function(array, attr, value)
{
for(var i = 0; i < array.length; i++)
{
if(array[i].hasOwnProperty(attr) && array[i][attr] === value)
{
return i;
}
}
return -1;
},
field_delete: function(array, dbsname) field_delete: function(array, dbsname)
{ {
var index = api2.find_fieldindex_by_dbsname(array, dbsname); var index = api2.find_fieldindex_by_dbsname(array, dbsname);
@@ -1217,7 +1267,7 @@ api2 = {
var newfield = {}; var newfield = {};
newfield.dbs = model[newindex].dbs; newfield.dbs = model[newindex].dbs;
newfield.typ = model[newindex].typ; newfield.typ = model[newindex].typ;
if (model[newindex].track) newfield.track = model[newindex].track; if (model[newindex].track) newfield.track = model[newindex].track&&model[newindex].label?model[newindex].label:model[newindex].track;
newfield.val = newval; newfield.val = newval;
__Logj(newfield); __Logj(newfield);
array.push(newfield); array.push(newfield);

29
APPL/API2/api_reports.asp Normal file
View File

@@ -0,0 +1,29 @@
<%@ language = "JavaScript" %>
<% /*
$Revision$
$Id$
File: api_reports.asp
Description: Reports API
Parameters:
Context:
Notes:
*/
DOCTYPE_Disable = true;
ANONYMOUS_Allowed = 1; // Eigenlijk niet waar. We regelen echter alles zelf
THIS_FILE = "appl/api/api_reportsx.asp";
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="./api2.inc" -->
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="./model_reports.inc" -->
<%
var usrrap_key = getQParamInt("usrrap_key");
var model = model_reports(usrrap_key);
api2.process(model);
%>

View File

@@ -36,17 +36,19 @@ model_appointments =
primary: "bez_afspraak_key", primary: "bez_afspraak_key",
records_name: "appointments", records_name: "appointments",
record_name: "appointment", record_name: "appointment",
fields: [{ name: "id", dbs: "bez_afspraak_key", typ: "key", filter: "exact" }, fields: {"id" : { dbs: "bez_afspraak_key", typ: "key", label: L("lcl_vis_appointment"), filter: "exact" },
{ name: "from", dbs: "bez_afspraak_datum", typ: "datetime", track: L("lcl_vis_start_date")}, "from" : { dbs: "bez_afspraak_datum", typ: "datetime", label: L("lcl_vis_start_date"), track: true},
{ name: "to", dbs: "bez_afspraak_eind", typ: "datetime", track: L("lcl_vis_end_date") }, "to" : { dbs: "bez_afspraak_eind", typ: "datetime", label: L("lcl_vis_end_date"), track: true },
{ name: "description", dbs: "bez_afspraak_opmerking", typ: "varchar"}, "description": { dbs: "bez_afspraak_opmerking", typ: "varchar", label: L("lcl_remark")},
{ name: "action", dbs: "bez_actie_key", typ: "key", foreign: "bez_actie"}, "action" : { dbs: "bez_actie_key", typ: "key", foreign: "bez_actie", label: L("lcl_action"), track: true},
{ name: "location", dbs: "alg_locatie_key", typ: "key", foreign: "alg_locatie"}, "location" : { dbs: "alg_locatie_key", typ: "key", foreign: "alg_locatie"},
{ name: "building", dbs: "alg_v_allonroerendgoed.alg_gebouw_key", typ: "key", foreign: "alg_gebouw" }, "building" : { dbs: "alg_v_allonroerendgoed.alg_gebouw_key", typ: "key", foreign: "alg_gebouw" },
{ name: "floor", dbs: "alg_v_allonroerendgoed.alg_verdieping_key", typ: "key", foreign: "alg_verdieping" }, "floor" : { dbs: "alg_v_allonroerendgoed.alg_verdieping_key", typ: "key", foreign: "alg_verdieping" },
{ name: "room", dbs: "alg_v_allonroerendgoed.alg_ruimte_key", typ: "key", foreign: "alg_ruimte" }, "room" : { dbs: "alg_v_allonroerendgoed.alg_ruimte_key", typ: "key", foreign: "alg_ruimte" },
{ dbs: "alg_onrgoed_keys", typ: "key", fnval: afs_alg_onrgoed_keys } "_alg_keys" : { dbs: "alg_onrgoed_keys", typ: "key", fnval: afs_alg_onrgoed_keys },
], "contact" : { dbs: "bez_afspraak_contact_key", typ: "key", foreign: "prs_perslid", label: L("lcl_vis_contactperson"), track: true}
},
list: { columns: ["id", "from", "to"] },
includes: {"visitors": { model: model_visitors, includes: {"visitors": { model: model_visitors,
joinfield: "bez_afspraak_key" joinfield: "bez_afspraak_key"
} }
@@ -136,10 +138,6 @@ model_appointments =
}, },
REST_POST: function (params, jsondata) /* new appointment */ REST_POST: function (params, jsondata) /* new appointment */
{ {
//__Logj(params);
//__Logj(jsondata);
//return { key: 3636089 };
//abort_with_warning("STOP");
params.isNew = true; // negeer eventuele bestaande keys params.isNew = true; // negeer eventuele bestaande keys
var fields = api2.update_fields(params, model_appointments, jsondata); // Build updater var fields = api2.update_fields(params, model_appointments, jsondata); // Build updater

236
APPL/API2/model_generic.inc Normal file
View File

@@ -0,0 +1,236 @@
<% /*
$Revision$
$Id$
File: model_generic.inc
Description: Generiek model voor willekeurige tabel
Parameters:
Context:
Notes:
*/
%>
<%
model_generic_template =
{
table: "<unkown>",
primary: "<unkown>",
records_name: "<unkown>s",
record_name: "<unkown>",
fields: {},
list: { columns: [] },
soft_delete: null,
_check_authorization: function(params, method)
{
params.message = "";
var autfunction = "WEB_PRSSYS";
params.authparams = user.checkAutorisation(autfunction);
},
_analyze_fields: function (fields, params, jsondata) /* analyseer inkomende data, common voor PUT en POST */
{
},
REST_GET: function _GET(params, jsondata)
{
model_generic_template._check_authorization(params, "GET");
var query = api2.sqlfields(params, model_generic_template);
var wheres = api2.sqlfilter(params, model_generic_template);
query.wheres = query.wheres.concat(wheres);
if (model_generic_template.soft_delete && params.filter.show_deleted != "on")
query.wheres.push(model_generic_template.soft_delete + " IS NULL");
var maxcnt = getQParamInt("showall", 0) == 1?S("qp_maxrows2"):S("qp_maxrows");
query.wheres.push("ROWNUM <= " + maxcnt + 1); // Eentje extra om overflow-melding te triggeren in resultsettable
var sql = "SELECT " + query.selects.join(", ")
+ " FROM " + query.tables.join(", ")
+ (query.wheres.length ? " WHERE " + query.wheres.join(" AND " ) : "")
+ " ORDER BY " + (model_generic_template.fields.name?model_generic_template.fields.name.dbs:model_generic_template.fields.id.dbs);
var json = api2.sql2json (params, sql, model_generic_template);
return json;
},
REST_PUT: function (params, jsondata, the_key) /* update room */
{
abort_with_warning("generic update not supported yet");
model_generic_template._check_authorization(params, "PUT");
if (!jsondata.room.id) jsondata.room.id = the_key;
var fields = api2.update_fields(params, model_generic_template, jsondata);
model_generic_template._analyze_fields(fields, params, jsondata);
var wheres = [model_generic_template.id.dbs + " = " + the_key];
var roomUpd = buildTrackingUpdate(model_generic_template.table, wheres.join(" AND " ), fields, { noValidateToken: true });
var err = Oracle.Execute(roomUpd.sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
return { key: room_key, warning: "" };
},
REST_POST: function (params, jsondata) /* new room */
{
abort_with_warning("generic uinsert not supported yet");
model_generic_template._check_authorization(params, "POST");
var fields = api2.update_fields(params, model_generic_template, jsondata); // Build updater
model_generic_template._analyze_fields(fields, params, jsondata);
fields.push({dbs: "fac_usrrap_key", typ: "key", seq: "alg_s_alg_onroerendgoed_keys" });
var roomIns = buildInsert(model_generic_template.table, fields, { noValidateToken: true });
var room_key = roomIns.sequences["fac_usrrap_key"];
var err = Oracle.Execute(roomIns.sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
return { key: room_key, warning: "" };
},
REST_DELETE: function (params, the_key) /* delete room */
{
abort_with_warning("generic delete not supported yet");
model_generic_template._check_authorization(params, "DELETE");
var room_key = params.filter.id;
var sql = "UPDATE fac_usrrap"
+ " SET fac_usrrap_verwijder = SYSDATE"
+ " WHERE fac_usrrap_key = " + room_key;
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
return { key: room_key, warning: "" };
}
}
function model_generic(table)
{
model_generic_template.table = table;
model_generic_template.record_name = table.substring(0,1) + table.substring(1).toLowerCase();
model_generic_template.records_name = model_generic_template.record_name + "s";
var sql = "SELECT cols.column_name, cols.position, cons.status, cons.owner"
+ " FROM all_constraints cons, all_cons_columns cols"
+ " WHERE cols.table_name = " + safe.quoted_sql(table)
+ " AND cons.constraint_type = 'P'"
+ " AND cons.constraint_name = cols.constraint_name"
+ " AND cons.owner = cols.owner"
+ " ORDER BY cols.table_name, cols.position";
var oRs = Oracle.Execute(sql);
if (oRs.Eof)
{
Session.Contents.Remove("scaffolding_table");
abort_with_warning("Unable to determine primary key for table {0}".format(table));
}
model_generic_template.primary = oRs("column_name").Value;
oRs.MoveNext();
if (!oRs.Eof)
{
Session.Contents.Remove("scaffolding_table");
abort_with_warning("Composite primary key not supported for table {0}".format(table));
}
oRs.Close();
var sql = "SELECT num_rows, last_analyzed"
+ " FROM all_tables"
+ " WHERE table_name = " + safe.quoted_sql(table);
var oRs = Oracle.Execute(sql);
model_generic_template.estimated_rows = oRs("num_rows").Value;
model_generic_template.last_analyzed = oRs("last_analyzed").Value;
oRs.Close;
var sql = "SELECT column_name"
+ " , data_type"
+ " , data_length"
+ " , data_precision"
+ " , data_scale"
+ " FROM user_tab_columns utc"
+ " WHERE utc.table_name = UPPER(" + safe.quoted_sql(table) + ")"
+ " ORDER BY column_id";
var oRs = Oracle.Execute(sql);
var hasName = false;
while (!oRs.eof)
{
var field = { dbs: oRs.Fields("column_name").Value,
label: oRs.Fields("column_name").Value,
typ: "varchar"
};
var ora_type = oRs("data_type").Value;
var ora_length = oRs("data_length").Value;
var ora_precision = oRs("data_precision").Value;
var ora_scale = oRs("data_scale").Value;
foreignKeyTable("dummy") // force generating __foreignKeyTable
switch (ora_type)
{
case 'NUMBER':
field.typ = 'integer';
if (ora_scale > 0)
{
field.datatype = 'float';
}
if (field.dbs.match(/_KEY$/))
{
field.typ = 'key';
if (field.dbs != model_generic_template.primary &&
field.dbs.replace(/_KEY$/,"") in __foreignKeyTable) // TODO ipv. de replace echt foreign-key constraint controleren
{
field.foreign = field.dbs.replace(/_KEY$/,"");
field.label = field.foreign + "(_KEY)"; // indicatie dat het foreign is
field.filter = "exact";
}
}
break;
case "DATE":
field.typ = 'datetime';
break;
case "VARCHAR":
field.typ = 'varchar';
break;
}
var fld = oRs.Fields("column_name").Value;
if (fld == table + "_VERWIJDER")
model_generic_template.soft_delete = table + "_VERWIJDER";
if (fld == model_generic_template.primary)
{
field.filter = "exact";
fld = "id";
}
if (fld.match(/_CODE$/))
{
field.filter = "like";
fld = "name";
hasName = true;
}
if (!hasName && fld.match(/(_OMSCHRIJVING|_REMARK)$/))
{
field.filter = "like";
fld = "name";
}
if (fld == model_generic_template.table + "_MODULE")
{
field.filter = "like";
}
model_generic_template.fields[fld] = field;
if (fld == "id" || fld == "name" || fld == "description" || field.filter)
model_generic_template.list.columns.push(fld);
oRs.MoveNext();
}
oRs.Close();
__Logj(model_generic_template);
return model_generic_template;
}
%>

View File

@@ -0,0 +1,82 @@
<% /*
$Revision$
$Id$
File: model_report_columns.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
model_reportcolumns =
{
table: "fac_usrrap_cols",
primary: "fac_usrrap_cols_key",
records_name: "columns",
record_name: "column",
parent_key: "fac_usrrap_key",
fields: { "id" : { dbs: "fac_usrrap_cols_key", typ: "key", filter: "exact" },
"sequence" : { dbs: "fac_usrrap_cols_volgnr", typ: "number", label: L("lcl_rap_sequence") },
"columnname": { dbs: "fac_usrrap_cols_column_name", typ: "varchar", label: L("lcl_rap_column"), insertonly: true },
"caption" : { dbs: "fac_usrrap_cols_caption", typ: "varchar", label: L("lcl_rap_caption")},
"datatype" : { dbs: "fac_usrrap_cols_datatype", typ: "varchar", label: L("lcl_rap_datatype"),
LOV: "varchar;Tekst;date;Datum;float;Float;integer;Getal"},
"filter" : { dbs: "fac_usrrap_cols_filter", typ: "varchar", label: L("lcl_rap_filter")},
"total" : { dbs: "fac_usrrap_cols_total", typ: "varchar", label: L("lcl_rap_total")}
},
list: { columns: ["id", "sequence", "columnname", "caption", "datatype"] },
REST_GET: function _GET(params)
{
var query = api2.sqlfields(params, model_reportcolumns );
var wheres = api2.sqlfilter(params, model_reportcolumns);
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, model_reportcolumns );
return json;
},
REST_PUT: function (params, jsondata, the_key) /* update columns */
{
var fields = api2.update_fields(params, model_reportcolumns, jsondata); // Build updater
var sql = buildUpdate("fac_usrrap_cols", fields) + " fac_usrrap_cols_key = " + the_key;
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
return { key: the_key };
},
// Internally used by report_clone
REST_POST: function (params, jsondata, parent_key) /* insert columns */
{
if (!params.internal)
INTERNAL_ERROR_INTERNAL_ONLY;
var fields = api2.update_fields(params, model_reportcolumns, jsondata); // Build updater
fields.push({ dbs: "fac_usrrap_cols_key", typ: "key", seq: "fac_s_fac_usrrap_cols_key" });
fields.push({ dbs: "fac_usrrap_key", typ: "key", val: parent_key });
var roomIns = buildInsert("fac_usrrap_cols", fields, { noValidateToken: true });
var col_key = roomIns.sequences["fac_usrrap_col_key"];
var err = Oracle.Execute(roomIns.sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
return { key: col_key, warning: "" };
}
// REST_DELETE: not supported
}
%>

148
APPL/API2/model_reports.inc Normal file
View File

@@ -0,0 +1,148 @@
<% /*
$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="../Shared/json2.js" -->
<!-- #include file="./model_reportsx.inc" -->
<!-- #include file="../fac/fac_usrrap.inc" -->
<%
model_reports_template =
{
table: "te bepalen",
primary: null,
records_name: "te bepalen",
record_name: "te bepalen",
fields: {/* te bepalen */},
_check_authorization: function(params, method)
{
params.message = "";
var autfunction = "WEB_PRSSYS";
params.authparams = user.checkAutorisation(autfunction);
},
REST_GET: function _GET(params, jsondata)
{
model_reports_template._check_authorization(params, "GET");
var groupbys = [];
if (params.columns && params.groupby)
{
if (params.columns.length != params.groupby.length)
INTERNAL_ERROR_GROUP_MISMATCH;
for (var fld in model_reports_template.fields)
{
if (!inArray(fld, params.columns))
delete model_reports_template.fields[fld];
}
for (var i=0; i < params.columns.length; i++)
{
var fld = params.columns[i];
var field = model_reports_template.fields[fld];
switch (params.groupby[i])
{
case "G":
groupbys.push(field.dbs);
break;
case "S":
field.sql = "SUM(" + field.dbs + ")";
field.label = "SUM(" + field.label + ")";
break;
case "C":
field.sql = "COUNT(" + field.dbs + ")";
field.label = "CNT(" + field.label + ")";
break;
case "A":
field.sql = "AVG(" + field.dbs + ")";
field.label = "AVG(" + field.label + ")";
break;
case "D":
field.sql = "TRUNC(" + field.dbs + ", 'DD')";
groupbys.push(field.sql);
field.label = "DAY(" + field.label + ")";
break;
case "W":
field.sql = "TO_CHAR(" + field.dbs + ", 'YYYY-IW')";
field.typ = "varchar";
groupbys.push(field.sql);
field.label = "WEEK(" + field.label + ")";
break;
case "M":
field.sql = "TO_CHAR(" + field.dbs + ", 'YYYY-MM')";
field.typ = "varchar";
groupbys.push(field.sql);
field.label = "MONTH(" + field.label + ")";
break;
case "Y":
field.sql = "TO_CHAR(" + field.dbs + ", 'YYYY')";
field.typ = "varchar";
groupbys.push(field.sql);
field.label = "YEAR(" + field.label + ")";
break;
}
}
}
var query = api2.sqlfields(params, model_reports_template);
var wheres = api2.sqlfilter(params, model_reports_template);
query.wheres = query.wheres.concat(wheres);
var maxcnt = getQParamInt("showall", 0) == 1?S("qp_maxrows2"):S("qp_maxrows");
query.wheres.push("ROWNUM <= " + maxcnt + 1); // Eentje extra om overflow-melding te triggeren in resultsettable
var sql = "SELECT " + query.selects.join(", ")
+ " FROM " + query.tables.join(", ")
+ (query.wheres.length ? " WHERE " + query.wheres.join(" AND " ) : "")
// TODO: 3D en FCLT_KEY filtering en zo
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 json = api2.sql2json (params, sql, model_reports_template);
return json;
},
REST_PUT: false,
REST_POST: false,
REST_DELETE: false
}
function model_reports(fac_usrrap_key)
{
var usrrap = model_reportsx.REST_GET({filter: { "id" : fac_usrrap_key}, include: ["columns"] })[0];
model_reports_template.table = usrrap.viewname;
model_reports_template.record_name = usrrap.viewname.substring(0,1) + usrrap.viewname.substring(1).toLowerCase();
model_reports_template.records_name = model_reports_template.record_name + "s";
model_reports_template.list = { columns : [] };
for (var i = 0; i < usrrap.columns.length; i++)
{
var field = { dbs: usrrap.columns[i].columnname,
label: usrrap.columns[i].caption,
typ: usrrap.columns[i].datatype.id,
filter: usrrap.columns[i].filter == "A"?"like":null
}
var fld = "COL" + String(usrrap.columns[i].id)
model_reports_template.fields[fld] = field;
model_reports_template.list.columns.push(fld);
}
__Logj(model_reports_template);
return model_reports_template;
}
%>

View File

@@ -4,8 +4,8 @@
File: model_reportsx.inc File: model_reportsx.inc
Description: rapport model voor het *bewerken* van rapporten. Description: rapport model voor het *definieren* van rapporten.
Zal rapporten niet uitvoeren dus. Daar maken we ooit model_reports voor Zal rapporten niet uitvoeren dus. Daar is model_reports voor
Parameters: Parameters:
Context: Context:
@@ -13,66 +13,22 @@
*/ */
%> %>
<!-- #include file="../Shared/json2.js" --> <!-- #include file="../Shared/json2.js" -->
<!-- #include file="./model_reportcolumns.inc" -->
<% <%
// model_reportcolumns is uitsluitend beschikbaar onder model_reports die de autorisatie dan ook doet
model_reportcolumns =
{
table: "fac_usrrap_cols",
primary: "fac_usrrap_cols_key",
records_name: "columns",
record_name: "columns",
fields: [{ name: "id", dbs: "fac_usrrap_cols_key", typ: "key", filter: "exact" },
{ name: "sequence", dbs: "fac_usrrap_cols_volgnr", typ: "number", label: L("lcl_rap_sequence") },
{ name: "columnname", dbs: "fac_usrrap_cols_column_name", typ: "varchar", label: L("lcl_rap_column")},
{ name: "caption", dbs: "fac_usrrap_cols_caption", typ: "varchar", label: L("lcl_rap_caption")},
{ name: "datatype", dbs: "fac_usrrap_cols_datatype", typ: "varchar", label: L("lcl_rap_datatype")},
{ name: "filter", dbs: "fac_usrrap_cols_filter", typ: "varchar", label: L("lcl_rap_filter")},
{ name: "total", dbs: "fac_usrrap_cols_total", typ: "check0", label: L("lcl_rap_total")},
// niet teruglinken, { name: "report", dbs: "fac_usrrap_key", typ: "key", foreign: "fac_usrrap"}
],
REST_GET: function _GET(params)
{
var query = api2.sqlfields(params, model_reportcolumns );
var wheres = api2.sqlfilter(params, model_reportcolumns);
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, model_reportcolumns );
return json;
},
REST_PUT: function (params, jsondata, the_key) /* update columns */
{
var fields = api2.update_fields(params, model_reportcolumns, jsondata); // Build updater
var sql = buildUpdate("fac_usrrap_cols", fields) + " fac_usrrap_cols_key = " + the_key;
Oracle.Execute(sql);
// var beztrack = api2.process_includes(params, model_reportcolumns, the_key, jsondata);
return { key: the_key };
}
// REST_POST: not supported
// REST_DELETE: not supported
}
model_reportsx = model_reportsx =
{ {
table: "fac_usrrap", table: "fac_usrrap",
primary: "fac_usrrap_key", primary: "fac_usrrap_key",
records_name: "reports", records_name: "reports",
record_name: "report", record_name: "report",
fields: [{ name: "id", dbs: "fac_usrrap_key", typ: "key", label: "Key", filter: "exact" }, fields: { "id" : { dbs: "fac_usrrap_key", typ: "key", label: "Key", filter: "exact" },
{ name: "name", dbs: "fac_usrrap_omschrijving", typ: "varchar", label: L("lcl_usrrap_report"), filter: "like"}, "name" : { dbs: "fac_usrrap_omschrijving", typ: "varchar", label: L("lcl_usrrap_report"), filter: "like", len : 60},
{ name: "description", dbs: "fac_usrrap_info", typ: "varchar", label: L("lcl_usrrap_info")}, "description" : { dbs: "fac_usrrap_info", typ: "varchar", label: L("lcl_usrrap_info")},
{ name: "viewname", dbs: "fac_usrrap_view_name", typ: "varchar", label: L("lcl_usrrap_viewname")}, "viewname" : { dbs: "fac_usrrap_view_name", typ: "varchar", label: L("lcl_usrrap_viewname"), filter: "like"},
], "authorisation": { dbs: "fac_functie_key", typ: "key", label: L("lcl_usrrap_functie"), foreign: "fac_functie"}
},
list: { columns: ["id", "name", "viewname", "description"] },
includes: {"columns": { model: model_reportcolumns, includes: {"columns": { model: model_reportcolumns,
joinfield: "fac_usrrap_key" joinfield: "fac_usrrap_key"
} }
@@ -89,8 +45,8 @@ return; // TODO?
case "GET": case "GET":
if (params.filter.id) if (params.filter.id)
{ {
var room_key = params.filter.id; var rap_key = params.filter.id;
var this_alg = alg.func_enabled(room_key, model_reportsx.defaults.onrgoedlvl); var this_alg = alg.func_enabled(rap_key, model_reportsx.defaults.onrgoedlvl);
user.auth_required_or_abort(this_alg.readman || this_alg.readuse); user.auth_required_or_abort(this_alg.readman || this_alg.readuse);
} }
break; break;
@@ -99,14 +55,14 @@ return; // TODO?
var authParams = user.checkAutorisation(autfunction); var authParams = user.checkAutorisation(autfunction);
// en verder met de autorisatie van PUT... // en verder met de autorisatie van PUT...
case "PUT": case "PUT":
var room_key = params.filter.id; var rap_key = params.filter.id;
var this_alg = alg.func_enabled(room_key, model_reportsx.defaults.onrgoedlvl); var this_alg = alg.func_enabled(rap_key, model_reportsx.defaults.onrgoedlvl);
user.auth_required_or_abort(this_alg.writeman || this_alg.writeuse); user.auth_required_or_abort(this_alg.writeman || this_alg.writeuse);
params.isNew = false; params.isNew = false;
break; break;
case "POST": case "POST":
var room_key = -1; var rap_key = -1;
var this_alg = alg.func_enabled(room_key, model_reportsx.defaults.onrgoedlvl); var this_alg = alg.func_enabled(rap_key, model_reportsx.defaults.onrgoedlvl);
user.auth_required_or_abort(this_alg.writeman); user.auth_required_or_abort(this_alg.writeman);
params.isNew = true; params.isNew = true;
break; break;
@@ -127,17 +83,20 @@ return; // TODO?
var wheres = api2.sqlfilter(params, model_reportsx); var wheres = api2.sqlfilter(params, model_reportsx);
query.wheres = query.wheres.concat(wheres); query.wheres = query.wheres.concat(wheres);
if (params.authparams.ALGreadlevel > -1)
{ // Er is een scope-beperking van kracht
query.wheres.push("r.fac_usrrap_key IN"
+ " (SELECT fac_usrrap_key FROM fac_v_my_rooms"
+ " WHERE prs_perslid_key = " + user_key
+ " AND niveau = " + params.authparams.ALGreadlevel + ")");
}
var sql = "SELECT " + query.selects.join(", ") var sql = "SELECT " + query.selects.join(", ")
+ " FROM " + query.tables.join(", ") + " FROM " + query.tables.join(", ")
+ (query.wheres.length ? " WHERE " + query.wheres.join(" AND " ) : "") + (query.wheres.length ? " WHERE " + query.wheres.join(" AND " ) : "")
+ " ORDER BY fac_usrrap_key";
if (params.authparams.ALGreadlevel > -1) if (params.include && params.include.length)
{ // Er is een scope-beperking van kracht sql += ", fac_usrrap_cols_volgnr";
sql += " AND r.fac_usrrap_key IN"
+ " (SELECT fac_usrrap_key FROM fac_v_my_rooms"
+ " WHERE prs_perslid_key = " + user_key
+ " AND niveau = " + params.authparams.ALGreadlevel + ")";
}
var json = api2.sql2json (params, sql, model_reportsx); var json = api2.sql2json (params, sql, model_reportsx);
@@ -147,19 +106,19 @@ return; // TODO?
{ {
model_reportsx._check_authorization(params, "PUT"); model_reportsx._check_authorization(params, "PUT");
if (!jsondata.room.id) jsondata.room.id = the_key; if (!jsondata.room.id) jsondata.room.id = the_key;
var room_key = the_key; var rap_key = the_key;
var fields = api2.update_fields(params, model_reportsx, jsondata); // Build updater var fields = api2.update_fields(params, model_reportsx, jsondata); // Build updater
model_reportsx._analyze_fields(fields, params, jsondata); model_reportsx._analyze_fields(fields, params, jsondata);
var wheres = [" fac_usrrap_key = " + room_key]; var wheres = [" fac_usrrap_key = " + rap_key];
var roomUpd = buildTrackingUpdate("fac_usrrap", wheres.join(" AND " ), fields, { noValidateToken: true }); var roomUpd = buildTrackingUpdate("fac_usrrap", wheres.join(" AND " ), fields, { noValidateToken: true });
var err = Oracle.Execute(roomUpd.sql, true); var err = Oracle.Execute(roomUpd.sql, true);
if (err.friendlyMsg) if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg); abort_with_warning(err.friendlyMsg);
return { key: room_key, warning: "" }; return { key: rap_key, warning: "" };
}, },
REST_POST: function (params, jsondata) /* new room */ REST_POST: function (params, jsondata) /* new room */
{ {
@@ -167,29 +126,31 @@ return; // TODO?
var fields = api2.update_fields(params, model_reportsx, jsondata); // Build updater var fields = api2.update_fields(params, model_reportsx, jsondata); // Build updater
model_reportsx._analyze_fields(fields, params, jsondata); model_reportsx._analyze_fields(fields, params, jsondata);
fields.push({dbs: "fac_usrrap_key", typ: "key", seq: "alg_s_alg_onroerendgoed_keys" }); fields.push({dbs: "fac_usrrap_key", typ: "key", seq: "fac_s_fac_usrrap_key" });
var roomIns = buildInsert("fac_usrrap", fields, { noValidateToken: true }); var roomIns = buildInsert("fac_usrrap", fields, { noValidateToken: true });
var room_key = roomIns.sequences["fac_usrrap_key"]; var rap_key = roomIns.sequences["fac_usrrap_key"];
var err = Oracle.Execute(roomIns.sql, true); var err = Oracle.Execute(roomIns.sql, true);
if (err.friendlyMsg) if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg); abort_with_warning(err.friendlyMsg);
return { key: room_key, warning: "" }; var beztrack = api2.process_includes(params, model_reportsx, jsondata, rap_key);
return { key: rap_key, warning: "" };
}, },
REST_DELETE: function (params, the_key) /* delete room */ REST_DELETE: function (params, the_key) /* delete room */
{ {
model_reportsx._check_authorization(params, "DELETE"); model_reportsx._check_authorization(params, "DELETE");
var room_key = params.filter.id; var rap_key = params.filter.id;
var sql = "UPDATE fac_usrrap" var sql = "UPDATE fac_usrrap"
+ " SET fac_usrrap_verwijder = SYSDATE" + " SET fac_usrrap_verwijder = SYSDATE"
+ " WHERE fac_usrrap_key = " + room_key; + " WHERE fac_usrrap_key = " + rap_key;
var err = Oracle.Execute(sql, true); var err = Oracle.Execute(sql, true);
if (err.friendlyMsg) if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg); abort_with_warning(err.friendlyMsg);
return { key: room_key, warning: "" }; return { key: rap_key, warning: "" };
} }
} }

View File

@@ -29,19 +29,21 @@ model_reservationconsumables =
primary: "res_rsv_artikel_key", primary: "res_rsv_artikel_key",
records_name: "reservationconsumables", records_name: "reservationconsumables",
record_name: "reservationconsumable", record_name: "reservationconsumable",
fields: [ { name: "id", dbs: "res_rsv_artikel_key", typ: "key", filter: "exact" }, parent_key: "res_rsv_ruimte_key",
{ name: "consumable", dbs: "res_artikel_key", typ: "key", filter: "exact", foreign: "res_artikel" },
{ name: "amount", dbs: "res_rsv_artikel_aantal", typ: "number"}, fields: { "id" : { dbs: "res_rsv_artikel_key", typ: "key", filter: "exact" },
{ name: "status", dbs: "res_status_bo_key", typ: "number", filter: "exact", foreign: status_bo }, "consumable" : { dbs: "res_artikel_key", typ: "key", filter: "exact", foreign: "res_artikel" },
{ name: "reservation", dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact", foreign: "res_rsv_ruimte" }, "amount" : { dbs: "res_rsv_artikel_aantal", typ: "number"},
{ name: "from", dbs: "res_rsv_artikel_levering", typ: "date", filter: "exact" }, "status" : { dbs: "res_status_bo_key", typ: "number", filter: "exact", foreign: status_bo },
//{ name: "to", dbs: "res_rsv_artikel_tot", typ: "date" }, "reservation": { dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact", foreign: "res_rsv_ruimte" },
{ name: "price", dbs: "res_rsv_artikel_prijs", typ: "float" }, "from" : { dbs: "res_rsv_artikel_levering", typ: "date", filter: "exact" },
{ name: "processed", dbs: "res_rsv_artikel_verwerkt", typ: "datetime" }, //: "to" { dbs: "res_rsv_artikel_tot", typ: "date" },
{ name: "closed", dbs: "res_rsv_artikel_afgemeld", typ: "datetime" }, "price" : { dbs: "res_rsv_artikel_prijs", typ: "float" },
{ name: "changed", dbs: "res_rsv_artikel_mutatie", typ: "datetime" }, "processed" : { dbs: "res_rsv_artikel_verwerkt", typ: "datetime" },
{ name: "dirtlevel", dbs: "res_rsv_artikel_dirtlevel", typ: "number", filter: "exact" } "closed" : { dbs: "res_rsv_artikel_afgemeld", typ: "datetime" },
], "changed" : { dbs: "res_rsv_artikel_mutatie", typ: "datetime" },
"dirtlevel" : { dbs: "res_rsv_artikel_dirtlevel", typ: "number", filter: "exact" }
},
REST_GET: function _GET(params) REST_GET: function _GET(params)
{ {

View File

@@ -33,19 +33,21 @@ model_reservationequipment =
primary: "res_rsv_deel_key", primary: "res_rsv_deel_key",
records_name: "reservationequipment", records_name: "reservationequipment",
record_name: "reservationequipment", record_name: "reservationequipment",
fields: [ { name: "id", dbs: "res_rsv_deel_key", typ: "key", filter: "exact" }, parent_key: "res_rsv_ruimte_key",
{ name: "equipment", dbs: "res_deel_key", typ: "key", filter: "exact", foreign: "res_deel" },
{ name: "status", dbs: "res_status_bo_key", typ: "key", filter: "exact", foreign: res.getbostatustext }, fields: {"id" : { dbs: "res_rsv_deel_key", typ: "key", filter: "exact" },
{ name: "from", dbs: "res_rsv_deel_van", typ: "datetime", filter: "exact" }, "equipment" : { dbs: "res_deel_key", typ: "key", filter: "exact", foreign: "res_deel" },
{ name: "to", dbs: "res_rsv_deel_tot", typ: "datetime" }, "status" : { dbs: "res_status_bo_key", typ: "key", filter: "exact", foreign: res.getbostatustext },
{ name: "price", dbs: "res_rsv_deel_prijs", typ: "float" }, "from" : { dbs: "res_rsv_deel_van", typ: "datetime", filter: "exact" },
{ name: "processed", dbs: "res_rsv_deel_verwerkt", typ: "datetime" }, "to" : { dbs: "res_rsv_deel_tot", typ: "datetime" },
{ name: "closed", dbs: "res_rsv_deel_afgemeld", typ: "datetime" }, "price" : { dbs: "res_rsv_deel_prijs", typ: "float" },
{ name: "changed", dbs: "res_rsv_deel_mutatie", typ: "datetime" }, "processed" : { dbs: "res_rsv_deel_verwerkt", typ: "datetime" },
{ name: "dirtlevel", dbs: "res_rsv_deel_dirtlevel", typ: "number", filter: "exact" } "closed" : { dbs: "res_rsv_deel_afgemeld", typ: "datetime" },
"changed" : { dbs: "res_rsv_deel_mutatie", typ: "datetime" },
"dirtlevel" : { dbs: "res_rsv_deel_dirtlevel", typ: "number", filter: "exact" }
// altijd 1 { name: "number", dbs: "res_rsv_deel_aantal", typ: "number", filter: "exact" } // altijd 1 { name: "number", dbs: "res_rsv_deel_aantal", typ: "number", filter: "exact" }
// niet terug linken { name: "reservation", dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact", foreign: "res_rsv_ruimte" } // niet terug linken { name: "reservation", dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact", foreign: "res_rsv_ruimte" }
], },
REST_GET: function _GET(params) REST_GET: function _GET(params)
{ {

View File

@@ -46,25 +46,26 @@ model_reservations =
records_name: "reservations", records_name: "reservations",
record_name: "reservation", record_name: "reservation",
fields: [{ name: "id", dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact" }, fields: {"id" : { dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact", label: L("lcl_reservation") },
{ name: "name", dbs: "res_reservering_id", sql: "res_reservering_key||'/'||res_rsv_ruimte_volgnr", typ: "varchar"}, "name" : { dbs: "res_reservering_id", sql: "res_reservering_key||'/'||res_rsv_ruimte_volgnr", typ: "varchar", label: L("lcl_reservation")},
{ name: "from", dbs: "res_rsv_ruimte_van", typ: "datetime", filter: "range", track: L("lcl_res_starttime")}, // TODO: Andere lcl voor catering "from" : { dbs: "res_rsv_ruimte_van", typ: "datetime", filter: "range", label: L("lcl_res_starttime"), track: true}, // TODO: Andere lcl voor catering
{ name: "to", dbs: "res_rsv_ruimte_tot", typ: "datetime", filter: "range", track: L("lcl_res_endtime")}, "to" : { dbs: "res_rsv_ruimte_tot", typ: "datetime", filter: "range", label: L("lcl_res_endtime"), track: true},
{ name: "description", dbs: "res_rsv_ruimte_omschrijving", typ: "varchar", track: L("lcl_descr")}, "description" : { dbs: "res_rsv_ruimte_omschrijving", typ: "varchar", track: L("lcl_descr")},
{ name: "activity", dbs: "res_activiteit_key", typ: "key", filter: "exact", foreign: "res_activiteit", track: L("lcl_activity") }, "activity" : { dbs: "res_activiteit_key", typ: "key", filter: "exact", foreign: "res_activiteit", label: L("lcl_activity"), track: true },
{ name: "remark", dbs: "res_rsv_ruimte_opmerking", typ: "varchar", track: L("lcl_remark")}, "remark" : { dbs: "res_rsv_ruimte_opmerking", typ: "varchar", track: L("lcl_remark")},
{ name: "host", dbs: "res_rsv_ruimte_host_key", typ: "key", foreign: "prs_perslid", track: L("lcl_host")}, "host" : { dbs: "res_rsv_ruimte_host_key", typ: "key", foreign: "prs_perslid", label: L("lcl_host"), track: true},
{ name: "contact", dbs: "res_rsv_ruimte_contact_key", typ: "key", foreign: "prs_perslid", track: L("lcl_name")}, "contact" : { dbs: "res_rsv_ruimte_contact_key", typ: "key", foreign: "prs_perslid", label: L("lcl_name"), track: true},
{ name: "visitorscount", dbs: "res_rsv_ruimte_bezoekers", typ: "number", track: L("lcl_visitors") }, "visitorscount" : { dbs: "res_rsv_ruimte_bezoekers", typ: "number", label: L("lcl_visitors"), track: true },
{ name: "status", dbs: "res_status_fo_key", typ: "key", foreign: res.getfostatustext }, "status" : { dbs: "res_status_fo_key", typ: "key", foreign: res.getfostatustext },
{ name: "resroom", dbs: "res_ruimte_opstelling.res_ruimte_key", typ: "key", filter: "exact", foreign: "res_ruimte" }, "resroom" : { dbs: "res_ruimte_opstelling.res_ruimte_key", typ: "key", filter: "exact", label: L("lcl_room"), foreign: "res_ruimte" },
{ name: "configuration", dbs: "res_ruimte_opstelling.res_opstelling_key", typ: "key", foreign: "res_opstelling" }, "configuration" : { dbs: "res_ruimte_opstelling.res_opstelling_key", typ: "key", foreign: "res_opstelling" },
{ name: "warning", dbs: "res_rsv_ruimte_dirtlevel", typ: "number", foreign: fndirtwarn, readonly: true }, "warning" : { dbs: "res_rsv_ruimte_dirtlevel", typ: "number", foreign: fndirtwarn, readonly: true }
], },
list: { columns: ["id", "name", "from", "to"] },
includes: {"reservationequipment": { model: model_reservationequipment, includes: {"reservationequipment": { model: model_reservationequipment,
joinfield: "res_rsv_ruimte_key" joinfield: "res_rsv_ruimte_key"
}, },
"reservationconsumables": { model: model_reservationconsumables, "reservationconsumables": { model: model_reservationconsumables,
joinfield: "res_rsv_ruimte_key" joinfield: "res_rsv_ruimte_key"
} }
}, },

View File

@@ -23,22 +23,22 @@ model_rooms =
primary: "alg_ruimte_key", primary: "alg_ruimte_key",
records_name: "rooms", records_name: "rooms",
record_name: "room", record_name: "room",
fields: [{ name: "id", dbs: "alg_ruimte_key", typ: "key", filter: "exact" }, fields: {"id" : { dbs: "alg_ruimte_key", typ: "key", filter: "exact" },
{ name: "name", dbs: "alg_ruimte_nr", typ: "varchar", filter: "like", track: L("lcl_estate_ruimte_man_nr") }, "name" : { dbs: "alg_ruimte_nr", typ: "varchar", filter: "like", track: true, label: L("lcl_estate_ruimte_man_nr") },
{ name: "floor", dbs: "alg_verdieping_key", typ: "key", foreign: "alg_verdieping", filter: "exact" }, "floor" : { dbs: "alg_verdieping_key", typ: "key", foreign: "alg_verdieping", filter: "exact" },
{ name: "roomtype", dbs: "alg_srtruimte_key", typ: "key", foreign: "alg_srtruimte", track: L("lcl_estate_ruimte_man_sort") }, "roomtype" : { dbs: "alg_srtruimte_key", typ: "key", foreign: "alg_srtruimte", track: true, label: L("lcl_estate_ruimte_man_sort") },
{ name: "servicelevel", dbs: "mld_dienstniveau_key", typ: "key", foreign: "mld_dienstniveau", track: L("lcl_mld_dienst_niveau") }, "servicelevel": { dbs: "mld_dienstniveau_key", typ: "key", foreign: "mld_dienstniveau", track: true, label: L("lcl_mld_dienst_niveau") },
{ name: "description", dbs: "alg_ruimte_omschrijving", typ: "varchar", filter: "like", track: L("lcl_estate_ruimte_man_descr") }, "description" : { dbs: "alg_ruimte_omschrijving", typ: "varchar", filter: "like", track: true, label: L("lcl_estate_ruimte_man_descr") },
{ name: "grossarea", dbs: "alg_ruimte_bruto_vloeropp", typ: "float", track: L("lcl_estate_ruimte_bruto_vloeropp") }, "grossarea" : { dbs: "alg_ruimte_bruto_vloeropp", typ: "float", track: true, label: L("lcl_estate_ruimte_bruto_vloeropp") },
{ name: "area1", dbs: "alg_ruimte_opp_alt1", typ: "float", track: L("lcl_estate_ruimte_opp_alt1") }, "area1" : { dbs: "alg_ruimte_opp_alt1", typ: "float", track: true, label: L("lcl_estate_ruimte_opp_alt1") },
{ name: "area2", dbs: "alg_ruimte_opp_alt2", typ: "float", track: L("lcl_estate_ruimte_opp_alt2") }, "area2" : { dbs: "alg_ruimte_opp_alt2", typ: "float", track: true, label: L("lcl_estate_ruimte_opp_alt2") },
{ name: "perimeter", dbs: "alg_ruimte_omtrek", typ: "float", track: L("lcl_estate_ruimte_man_omtrek") }, "perimeter" : { dbs: "alg_ruimte_omtrek", typ: "float", track: true, label: L("lcl_estate_ruimte_man_omtrek") },
{ name: "volume", dbs: "alg_ruimte_inhoud", typ: "float", track: L("lcl_estate_ruimte_man_inhoud") }, "volume" : { dbs: "alg_ruimte_inhoud", typ: "float", track: true, label: L("lcl_estate_ruimte_man_inhoud") },
{ name: "remark", dbs: "alg_ruimte_opmerking", typ: "varchar", track: L("lcl_estate_ruimte_man_opmerk") }, "remark" : { dbs: "alg_ruimte_opmerking", typ: "varchar", track: true, label: L("lcl_estate_ruimte_man_opmerk") },
{ name: "openfrom", dbs: "alg_ruimte_beginuur", typ: "float", track: L("lcl_estate_gebouw_beginuur") }, "openfrom" : { dbs: "alg_ruimte_beginuur", typ: "float", track: true, label: L("lcl_estate_gebouw_beginuur") },
{ name: "opento", dbs: "alg_ruimte_einduur", typ: "float", track: L("lcl_estate_gebouw_einduur") }, "opento" : { dbs: "alg_ruimte_einduur", typ: "float", track: true, label: L("lcl_estate_gebouw_einduur") },
{ name: "workdays", dbs: "alg_ruimte_werkdagen", typ: "number" }, "workdays" : { dbs: "alg_ruimte_werkdagen", typ: "number" },
{ name: "deleted", dbs: "alg_ruimte_verwijder", typ: "datetime" }, "deleted" : { dbs: "alg_ruimte_verwijder", typ: "datetime" }
/* niet gebruikt: /* niet gebruikt:
{ dbs: "_ALG_RUIMTE_VLOER_OMSCHRIJVING", typ: "varchar", frm: "room_flrom" }, { dbs: "_ALG_RUIMTE_VLOER_OMSCHRIJVING", typ: "varchar", frm: "room_flrom" },
{ dbs: "_ALG_RUIMTE_OPP_GEVELGLAS", typ: "float", frm: "room_gegl" }, { dbs: "_ALG_RUIMTE_OPP_GEVELGLAS", typ: "float", frm: "room_gegl" },
@@ -47,7 +47,7 @@ model_rooms =
{ dbs: "_ALG_RUIMTE_ACADKEY", typ: "varchar", frm: "room_ackey" }, { dbs: "_ALG_RUIMTE_ACADKEY", typ: "varchar", frm: "room_ackey" },
{ dbs: "_ALG_RUIMTE_GETEKEND", typ: "date", frm: "room_tek" }, { dbs: "_ALG_RUIMTE_GETEKEND", typ: "date", frm: "room_tek" },
*/ */
], },
controls: [ {name: "scope", type: "varchar" }, controls: [ {name: "scope", type: "varchar" },
{name: "show_deleted", type: "boolean" } {name: "show_deleted", type: "boolean" }
], ],

View File

@@ -21,14 +21,17 @@ model_visitors =
primary: "bez_bezoekers_key", primary: "bez_bezoekers_key",
records_name: "visitors", records_name: "visitors",
record_name: "visitor", record_name: "visitor",
fields: [{ name: "id", dbs: "bez_bezoekers_key", typ: "key", filter: "exact" }, parent_key: "bez_afspraak_key",
{ name: "name", dbs: "bez_afspraak_naam", typ: "varchar"},
{ name: "company", dbs: "bez_afspraak_bedrijf", typ: "varchar"}, fields: {"id" : { dbs: "bez_bezoekers_key", typ: "key", filter: "exact" },
{ name: "badge", dbs: "bez_bezoekers_pasnr", typ: "varchar"}, "name" : { dbs: "bez_afspraak_naam", typ: "varchar", label: L("lcl_vis_name")},
{ name: "in", dbs: "bez_bezoekers_done", typ: "datetime"}, "company": { dbs: "bez_afspraak_bedrijf", typ: "varchar", label: L("lcl_vis_company")},
{ name: "out", dbs: "bez_bezoekers_out", typ: "datetime"} "badge" : { dbs: "bez_bezoekers_pasnr", typ: "varchar", label: L("lcl_vis_badgenr")},
"in" : { dbs: "bez_bezoekers_done", typ: "datetime", label: L("lcl_bez_done_date")},
"out" : { dbs: "bez_bezoekers_out", typ: "datetime", label: L("lcl_bez_out_date")}
// niet teruglinken, { name: "appointment", dbs: "bez_afspraak_key", typ: "key", foreign: "bez_afspraak"} // niet teruglinken, { name: "appointment", dbs: "bez_afspraak_key", typ: "key", foreign: "bez_afspraak"}
], },
list: { columns: ["name", "company", "in", "out"] },
REST_GET: function _GET(params) REST_GET: function _GET(params)
{ {

View File

@@ -23,7 +23,7 @@ FCLTHeader.Requires({ plugins:["jQuery"] });
var authparamsPRSSYS = user.checkAutorisation("WEB_PRSSYS", true); var authparamsPRSSYS = user.checkAutorisation("WEB_PRSSYS", true);
user.auth_required_or_abort(authparamsPRSSYS.PRSwritelevel < 9 && authparamsPRSSYS.ALGwritelevel < 9); user.auth_required_or_abort(authparamsPRSSYS.PRSwritelevel < 9 && authparamsPRSSYS.ALGwritelevel < 9);
var usrrap_key = getFParam("usrrap_key", ""); var usrrap_key = getFParamInt("usrrap_key", "");
var path = getFParam("path"); var path = getFParam("path");
// rooturl moet er af // rooturl moet er af

View File

@@ -36,7 +36,7 @@ var rap_array = model_reportsx.REST_GET(rap_params);
if (!rap_array.length) if (!rap_array.length)
shared.record_not_found(); shared.record_not_found();
var rap_data = rap_array[0]; var rap_data = rap_array[0];
var mdl = api2.assoc(model_reportsx, "name"); // Handiger var mdl = model_reportsx.fields; //api2.assoc(model_reportsx, "name"); // Handiger
%> %>
<html> <html>

View File

@@ -29,7 +29,7 @@ var col_key = getQParamInt("col_key");
var col_params = { filter: { id: col_key } }; var col_params = { filter: { id: col_key } };
var col_data = model_reportcolumns.REST_GET(col_params)[0]; var col_data = model_reportcolumns.REST_GET(col_params)[0];
var mdl = api2.assoc(model_reportcolumns, "name"); var mdl = model_reportcolumns.fields; // Handiger
%> %>

75
APPL/SCF/scaffolding.inc Normal file
View File

@@ -0,0 +1,75 @@
<% /*
$Revision$
$Id$
File: scaffolding.inc
Description:
Parameters:
Context:
*/
var mode = getQParamSafe("mode", "empty");
if (mode == "save")
var JSON_Result = true;
%>
<!-- #include file="../Shared/common.inc" -->
<% if (mode != "save") { %>
<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="../Shared/calendar.inc" -->
<!-- #include file="../Shared/selector.inc" -->
<!-- #include file="../Shared/persoonselector.inc" -->
<!-- #include file="../Shared/data_recordset.inc" -->
<!-- #include file="../Shared/resultset_table_v2.inc" -->
<% } %>
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="../api2/api2.inc" -->
<!-- #include file="./scaffolding_search.inc" -->
<!-- #include file="./scaffolding_list.inc" -->
<!-- #include file="./scaffolding_wrap.inc" -->
<!-- #include file="./scaffolding_show.inc" -->
<!-- #include file="./scaffolding_edit.inc" -->
<!-- #include file="./scaffolding_save.inc" -->
<%
function scaffolding(model, scf_params)
{
scf_params = scf_params || {};
if (model && mode == 'empty')
mode = 'search';
var imodel = getQParam("model", ""); // include model
if (model.includes && imodel in model.includes)
{
model = model.includes[imodel].model;
scf_params.transit = { name: "model", val: imodel };
}
scf_params.this_fullpath = String(Request.ServerVariables("SCRIPT_NAME"));
scf_params.this_path = scf_params.this_fullpath.substring(rooturl.length + 1);
switch (mode)
{
case "empty":
break;
case "search":
scaffolding_search(model, scf_params);
break;
case "list":
scaffolding_list(model, scf_params);
break;
case "wrap":
scaffolding_wrap(model, scf_params);
break;
case "show":
scaffolding_show(model, scf_params);
break;
case "edit":
scaffolding_edit(model, scf_params);
break;
case "save":
scaffolding_save(model, scf_params);
break;
}
}
%>

View File

@@ -0,0 +1,135 @@
<% /*
$Revision$
$Id$
File: scaffolding_edit.asp
Description: show detailed information of a usrrapx
Parameters: usrxxx_key (usrrapx id)
Context:
Note:
*/ %>
<%
function scaffolding_edit(model, scf_params)
{
FCLTHeader.Requires({ plugins: ["jQuery"],
js: ["jquery-ui.js", "jquery.timepicker-table.js"],
css: ["timePicker-table.css"]})
// Autorisatie
var authparamsPRSSYS = user.checkAutorisation("WEB_PRSSYS");
var transit = "";
if ("transit" in scf_params)
transit = "&" + scf_params.transit.name + "=" + safe.url(scf_params.transit.val);
var key = getQParamInt("id", -1);
if (key > 0)
{
var xxx_params = { filter: { id: key } };
var xxx_array = model.REST_GET(xxx_params);
if (!xxx_array.length)
shared.record_not_found();
var xxx_data = xxx_array[0];
}
else
xxx_data = {};
var modal = (model.parent_key != null); // dan doen we een detailrecord altijd modal
%>
<html>
<head>
<% FCLTHeader.Generate(); %>
<script>
function scf_submit()
{
if (!validateForm("u2"))
return false;
$.post($("form[name=u2]")[0].getAttribute("action"), $("[name=u2]").serialize(), FcltCallbackClose, "json");
return true; // disable button
}
function scf_cancel()
{
FcltMgr.closeDetail(window, { cancel: true } );
}
</script>
</head>
<body id="editbody" <%=modal?"class='modal scaffolding'":""%>>
<%
var buttons = [ {title: L("lcl_submit"), action:"scf_submit()", icon: "opslaan.png", singlepress: true },
{title: L("lcl_cancel"), action:"scf_cancel()", icon: "undo.png" }];
if (!modal)
IFRAMER_HEADER(model.record_name, buttons);
%>
<div id="edit">
<form name="u2" method="post" action="<%=scf_params.this_fullpath%>?mode=save&id=<%=key%><%=transit%>" onsubmit="return false;">
<%
BLOCK_START("facInfo", xxx_data["name"] || model.record_name);
for (var fld in model.fields)
{
var field = model.fields[fld];
if ((fld == "id" || field.insertonly) && key > 0)
ROFIELDTR("fldtxt", field.label||fld, xxx_data[fld]);
else if (field.foreign)
{
var foreign = foreignKeyTable(field.foreign);
if (field.foreign.toUpperCase() == "PRS_PERSLID" || field.foreign.toUpperCase() == "ALG_RUIMTE" || !foreign)
{
ROFIELDTR("fldtxt", field.label, "TODO: suggest met " + field.foreign);
}
else
{
var sql = "SELECT " + foreign.key
+ " , " + foreign.desc
+ " FROM " + foreign.tbl + " " + (foreign.alias||"")
+ " ORDER BY 2";
FCLTselector(fld, sql, { label: field.label||fld,
initKey: xxx_data[fld]?xxx_data[fld].id:null,
emptyOption: "" // TODO: Niet bij required?
});
}
}
else if (field.LOV)
{
var sql = api2.splitLOV2sql(field.LOV);
FCLTselector(fld, sql, { label: field.label||fld,
initKey: xxx_data[fld]?xxx_data[fld].id:null,
emptyOption: "" // TODO: Niet bij required?
});
}
else if (field.typ == "check")
RWCHECKBOXTR(fld, "fldcheck", field.label||fld, xxx_data[fld]);
else if (field.typ == "date")
FCLTcalendar(fld, { label : field.label||fld,
datum : xxx_data[fld],
timeField: false,
volgnr : 1
});
else if (field.typ == "datetime")
FCLTcalendar(fld, { label : field.label||fld,
datum : xxx_data[fld],
timeField: true,
timeStep : S("res_h")*60,
startTime: S("res_t1"),
endTime : S("res_t2"),
volgnr : 1
});
else
RWFIELDTR(fld, "fldtxt", field.label||fld, xxx_data[fld]);
}
BLOCK_END();
if (modal)
CreateButtons(buttons);
IFACE.FORM_END();
%>
</form>
</div>
</body>
</html>
<%
}
%>

View File

@@ -0,0 +1,103 @@
<% /*
$Revision$
$Id$
File: scaffolding_list.asp
Description: Toont een lijst
Parameters:
Context: Vanuit scaffolding.inc
Note: model variabele is globaal beschikbaar
*/
%>
<%
function scaffolding_list(model, scf_params)
{
scf_params.list = scf_params.list || {};
scf_params.list.columns = scf_params.list.columns || [];
var transit = "";
if ("transit" in scf_params)
transit = "&" + scf_params.transit.name + "=" + safe.url(scf_params.transit.val);
var cols = getQParamArray("columns", []);
if (cols.length && cols[0])
scf_params.list.columns = cols;
var grps = getQParamArray("groups", []);
if (grps.length && grps[0])
scf_params.list.groups = grps;
if (!scf_params.list.columns.length && "list" in model)
scf_params.list.columns = model.list.columns;
var modal = (model.parent_key != null); // dan doen we een detailrecord altijd modal
FCLTHeader.Requires({js: []});
var autfunction = "WEB_PRSSYS";
var authparams = user.checkAutorisation(autfunction);
var showall = getQParamInt("showall", 0) == 1;
%>
<html>
<head>
<% FCLTHeader.Generate(); %>
<script>
function scf_show(row)
{
var key = row.getAttribute("ROWKEY");
<% if (modal) { %>
var url = "<%=scf_params.this_fullpath%>?mode=edit<%=transit%>&id=" + key;
FcltMgr.openModalDetail(url, "<%=safe.jsstring(model.record_name)%>", { callback: FcltMgr.reload });
<% } else { %>
$(row).addClass('dirty');
var url = "<%=scf_params.this_path%>?mode=wrap<%=transit%>&id=" + key;
FcltMgr.openDetail(url, "<%=safe.jsstring(model.record_name)%>");
<% } %>
}
</script>
</head>
<body id="listbody">
<%
buttons = [];
buttons.push({ icon: "page_refresh.png", title: L("lcl_refresh"), action: "FcltMgr.reload()" });
if (model["REST_POST"] && authparams.PRSwritelevel < 9 && authparams.ALGwritelevel < 9)
{
var addurl = scf_params.this_path + "?mode=edit" + transit;
buttons.push({ icon: "plus.png", title: L("lcl_add"), action: "FcltMgr.openDetail('" + addurl + "', '" + L("lcl_add") + " " + model.record_name + "')" });
}
var xxx_params = { filter : scf_params.filter || api2.qs2json(), columns: cols, groupby: grps };
var xxx_array = model.REST_GET(xxx_params);
var rst = new ResultsetTable({ dataset: xxx_array,
keyColumn: "id",
ID: model.table,
title: model.records_name,
showAll: showall,
buttons: buttons
});
for (i in scf_params.list.columns)
{
var fld = scf_params.list.columns[i];
if (!(fld in model.fields)) // Tijdens ontwikkeling vaak fout
{
__DoLogj(model.fields);
__DoLogj(scf_params.list.columns);
abort_with_warning("Field '{0}' not found in model '{1}'".format(fld, model.table));
}
var field = model.fields[fld];
rst.addColumn(new Column({ caption: field.label || fld, content: fld, datatype: field.typ }));
}
rst.addAction({ action: "scf_show", caption: L("lcl_edit"), isDefault: true } );
var cnt = rst.processResultset();
%>
</body>
</html>
<%
}
%>

View File

@@ -0,0 +1,59 @@
<% /*
$Revision$
$Id$
File: scaffolding_save.asp
Description: save information from scaffolding_edit.asp
Parameters:
Context:
Note:
*/ %>
<%
function scaffolding_save(model, scf_params)
{
protectRequest.validateToken();
var key = getQParamInt( "id" );
var scf_action = getFParam( "scf_action", key>0?"U":"I" );
var formfields = [];
for (var fld in model.fields)
{
var field = model.fields[fld];
if (fld == "id")
continue;
if (field.insertonly & scf_action != "I")
continue;
formfields.push({ name: fld, frm: fld });
}
var params = { filter: { "id": key } };
var jsondata = api2.form2JSONdata(model, params, formfields);
//jsondata[model.record_name].properties = flexkenmerken2jsondata(params.properties);
switch (scf_action)
{
case "I":
var xxx_array = model.REST_POST(params, jsondata);
key = xxx_array.key;
break;
case "U":
var xxx_array = model.REST_PUT(params, jsondata, params.filter.id);
break;
case "D":
var xxx_array = model.REST_DELETE(params, params.filter.id);
break;
default :
var xxx_array = {warning: L("lcl_cnt_Del_Fails_Auth")};
}
var warning = xxx_array.warning;
var result = { key: key,
warning: warning,
keepForm: !!warning,
success: true };
Response.Write(JSON.stringify(result));
}
%>

View File

@@ -0,0 +1,151 @@
<% /*
$Revision$
$Id$
File: scaffolding_search.asp
Description: Toont db-upgrade tracking
Parameters: ??
Context:
Note:
*/ %>
<%
function scaffolding_search(model, scf_params)
{
scf_params.search = scf_params.search || {};
scf_params.list = scf_params.list || {};
scf_params.list.columns |= [];
if (!scf_params.list.columns.length && "list" in model)
scf_params.list.columns = model.list.columns;
FCLTHeader.Requires({plugins:["jQuery"], js: []});
var autfunction = "WEB_PRSSYS";
var authparams = user.checkAutorisation(autfunction);
%>
<html>
<head>
<% FCLTHeader.Generate() %>
<script>
function pick_columns(evt, deze)
{
$("#colpicker").show();
$("#colpicker").css("left", evt.clientX - $("#colpicker").width() - 50);
}
function doSubmit()
{
$("#colpicker").hide();
var cols = [];
var groups = [];
$("#colpicker tr").each(function()
{
if (!this.id)
return;
if ($(this).find("input[type=checkbox]").prop("checked"))
{
cols.push(this.id);
groups.push($(this).find("select").val());
}
}
);
$("#columns").val(cols.join(","));
$("#groups").val(groups.join(","));
document.forms.u2.submit();
}
<% if (scf_params.search.autosubmit) { %>
$(doSubmit); // Autosubmit
<% } %>
</script>
</head>
<body id="searchbody">
<div id="search">
<form name="u2" method="get" target="workFrame">
<input type='hidden' name='mode' value='list'>
<input type='hidden' name='columns' id='columns'>
<input type='hidden' name='groups' id='groups'>
<%
if (scf_params.transit) { %>
<input type='hidden' name='<%=scf_params.transit.name%>' value='<%=safe.htmlattr(scf_params.transit.val)%>'>
<% }
var est_title = "";
if ("estimated_rows" in model)
est_title = " <em style='font-size:10px'>estimated {0} rows as of {1}</em>".format(model.estimated_rows, toDateTimeString(model.last_analyzed));
BLOCK_START("searchtable", L("lcl_filterblok") + est_title);
for (var fld in model.fields)
{
var field = model.fields[fld];
if (field.filter == 'like' || field.filter == 'exact')
{
if (field.foreign)
{
var foreign = foreignKeyTable(field.foreign);
if (field.foreign == "PRS_PERSLID" || field.foreign == "ALG_RUIMTE" || !foreign)
{
ROFIELDTR("fldtxt", field.label, "TODO: Listbox of suggest met " + field.foreign);
}
else
{
var sql = "SELECT " + foreign.key
+ " , " + foreign.desc
+ " FROM " + foreign.tbl + " " + (foreign.alias||"")
+ " ORDER BY 2";
FCLTselector(fld, sql, { label: field.label||fld,
emptyOption: ""
});
}
}
else
RWFIELDTR(fld, "fld", field.label||fld, "");
}
}
if (model.soft_delete)
RWCHECKBOXTR("show_deleted", "fldcheck", L("lcl_show_deleted"), 0);
BLOCK_END();
var buttons = [];
buttons.push({title: L("lcl_columns"), action: "pick_columns(event, this)" });
buttons.push({title: L("lcl_search"), action: "doSubmit()" });
CreateButtons(buttons, { entersubmit: true });
%>
</form>
<div id="colpicker" style='padding:10px;border:2px solid black;position:absolute;top:5px;left:500px;background-color:#f0f0f0;display:none'>
<table>
<tr><th>Show</th><th>Totals</th></tr>
<%
var grp = api2.splitLOV2select("G;Group by;S;Sum;C;Count;A;Avg");
var grpdate = api2.splitLOV2select("G;Group by;D;Group by date;W;Group by week;M;Group by month;Y;Group by year");
for (fld in model.fields)
{
var on = inArray(fld, scf_params.list.columns);
Response.Write("<tr id='" + fld + "'><td><label><input type='checkbox' " + (on?"checked='1'":"") + ">" + safe.html(model.fields[fld].label) + "</label></td>")
if (model.fields[fld].typ == "date")
Response.Write("<td>" + grpdate + "</td>")
else
Response.Write("<td>" + grp + "</td>")
Response.Write("</tr>")
}
%>
</table>
<input type='button' class='button' value='<%=L("lcl_search")%>' onclick='doSubmit()'>
<input type='button' class='button' value='<%=L("lcl_cancel")%>' onclick='$("#colpicker").hide()'>
</div>
</div> <!-- search -->
<div id="result">
<iframe width="100%" height="100%" src="../Shared/empty.asp"
name="workFrame" id="workFrame" onload='FcltMgr.iframeLoaded(this)'
frameborder="0" scrolling="no"></iframe>
</div>
</body>
</html>
<%
}
%>

View File

@@ -0,0 +1,139 @@
<% /*
$Revision$
$Id$
File: scaffolding_show.asp
Description: show detailed information of a usrrapx
Parameters: usrrap_key (usrrapx id)
Context:
Note:
*/ %>
<%
function scaffolding_show(model, scf_params)
{
scf_params.show = scf_params.show || {};
FCLTHeader.Requires({ plugins: ["jQuery"],
js: ["jquery-ui.js"]
})
if ("js" in scf_params.show)
FCLTHeader.Requires({ js: scf_params.show.js });
// Autorisatie
var authparamsPRSSYS = user.checkAutorisation("WEB_PRSSYS");
var transit = "";
if ("transit" in scf_params)
transit = "&" + scf_params.transit.name + "=" + safe.url(scf_params.transit.val);
var key = getQParam("id");
var xxx_params = { filter: { id: key } };
var xxx_array = model.REST_GET(xxx_params);
if (!xxx_array.length)
shared.record_not_found();
var xxx_data = xxx_array[0];
%>
<html>
<head>
<% FCLTHeader.Generate(); %>
<script>
<% if ("name" in xxx_data) { %>
FcltMgr.setTitle("<%=model.record_name + ' ' + safe.jsstring(xxx_data.name)%>", {hot:false});
<% } %>
function xxx_change()
{
if (FcltMgr.startEdit(window))
{
window.location.href = "<%=scf_params.this_fullpath%>?mode=edit&id=<%=key%><%=transit%>";
}
}
function xxx_delete()
{
if (confirm(L("lcl_R_U_sure")))
{
alert("Delete not supported yet");
return;
var data = { key: "<%=safe.jsstring(key)%>"};
<% protectRequest.dataToken("data"); %>
$.post("<%=scf_params.this_fullpath%>?mode=delete&id=<%=key%>",
data,
FcltCallbackClose,
"json");
}
}
function col_edit(row)
{
var col_key = row.getAttribute("ROWKEY");
var url = "../fac/fac_usrrap_col.asp?col_key=" + col_key;
FcltMgr.openModalDetail(url, L("lcl_fac_usrrap_cols"), {callback: FcltMgr.reload } );
}
</script>
</head>
<body id="showbody">
<% var buttons = [];
if (authparamsPRSSYS.PRSreadlevel < 9 && authparamsPRSSYS.ALGreadlevel < 9)
{
if (scf_params.show.buttons)
{
for (var i = 0; i < scf_params.show.buttons.length; i++)
{ // Als je een action opgeeft *zonder* haakjes voegen we automagisch de key toe
if (scf_params.show.buttons[i].action.indexOf("(") < 0)
scf_params.show.buttons[i].action += "(" + key + ")"
buttons.push(scf_params.show.buttons[i]);
}
}
buttons.push({title: L("lcl_change"), action: "xxx_change()", icon: "wijzigen.png" });
if (model["REST_DELETE"])
buttons.push({title: L("lcl_delete"), action: "xxx_delete()", icon: "delete.png" });
}
IFRAMER_HEADER(model.record_name, buttons);
%>
<div id="show">
<form name="u2" onSubmit="return false;">
<%
BLOCK_START("facInfo", model.record_name);
for (var fld in model.fields)
{
var field = model.fields[fld];
var txt = xxx_data[fld];
if (xxx_data[fld] === null)
{
if (field.typ == "check")
txt = "0";
else
continue; // Altijd suppressEmpty
}
var title = "";
if (typeof txt == "object")
{
if ("name" in txt) // Foreigns
{
title = "Key: " + txt["id"];
txt = txt["name"];
}
else
if (field.typ == "datetime")
txt = toDateTimeString(txt);
else if (typeof txt == "date" || txt instanceof Date)
txt = toDateString(txt);
}
if (field.typ == "check")
ROCHECKBOXTR("fldtxt", field.label||fld, txt, { title: title});
else
ROFIELDTR("fldtxt", field.label||fld, txt, { title: title});
}
BLOCK_END();
%>
</form>
</div>
</body>
</html>
<%
}
%>

View File

@@ -0,0 +1,90 @@
<%
/* $Revision$
$Id$
File: scaffolding_wrap.asp
Status:
Description: wrapper voor scaffolding show / edit en iframes voor de includes
Parameters: id
Context:
Note:
*/ %>
<%
function scaffolding_wrap(model, scf_params)
{
scf_params.wrap = scf_params.wrap || {};
var transit = "";
if ("transit" in scf_params)
transit = "&" + scf_params.transit.name + "=" + safe.url(scf_params.transit.val);
var key = getQParam("id", -1);
FCLTHeader.Requires({plugins:["jQuery", "suggest"], js: ["jquery-ui.js"]})
var scf_title = L("lcl_fac_usrrapx");
%>
<html>
<head>
<% FCLTHeader.Generate(); %>
<script type="text/javascript" >
<% if (key > 0)
{ %>
FcltMgr.setTitle("<%=safe.jsstring(scf_title)%>", {hot: false});
<% } %>
function scfClose(params)
{
<% if (key < 0)
{ %>
if (params.cancel)
{
FcltMgr.closeDetail(window, params);
return true;
}
if (!params.keepForm)
window.location.href = "<%=scf_params.this_fullpath%>?mode=wrap<%=transit%>&verynew=1&id=" + params.key;
<% }
else
{ /* Bestaand object bewerkt, switch naar show-mode */ %>
if (!params.keepForm && !params.deleted)
$("#scfFrame")[0].src = "<%=scf_params.this_fullpath%>?mode=show<%=transit%>&id=<%=key%>";
<% } %>
}
</script>
</head>
<body>
<% if (key < 0)
var page = scf_params.this_fullpath + "?mode=edit" + transit; // Maak een nieuw
else
var page = scf_params.this_fullpath + "?mode=show" + transit;
page += "&id=" + key;
IFRAMER("scfFrame", page, { FcltClose: "scfClose" } );
if (key > 0)
{
for (var inc in model.includes)
{
var include = model.includes[inc];
if (include.joinfield == model.fields["id"].dbs)
{
var filter = {};
filter[include.joinfield] = key;
var url = scf_params.this_fullpath + "?mode=list&model=" + inc + "&pid=" + key;
IFRAMER("xxxFrame", url, { FcltClose: "scfClose" } );
}
}
}
%>
</body>
</html>
<%
}
%>

View File

@@ -743,7 +743,7 @@ function abort_with_warning(warning, code)
else else
{ {
Response.ContentType = "application/json"; Response.ContentType = "application/json";
Response.Write(JSON.stringify(data, null, Request.QueryString("pretty")=="1"?2:0)); Response.Write(JSON.stringify(data, null, 2));
} }
Response.Status = code; Response.Status = code;
Response.End; Response.End;
@@ -1034,6 +1034,13 @@ Date.prototype.midnight = function midnight()
return midn; return midn;
} }
function inArray(needle, haystack) {
var length = haystack.length;
for(var i = 0; i < length; i++) {
if(haystack[i] == needle) return true;
}
return false;
}
// Bepaalt de customerId (en rooturl) // Bepaalt de customerId (en rooturl)
// Na afloop is de globale variabele customerId gezet en opgeslagen in Session("customerId") // Na afloop is de globale variabele customerId gezet en opgeslagen in Session("customerId")

View File

@@ -2210,6 +2210,7 @@ body#mod_resmulti { width: 660px }
body#mod_resmulti div#show_date_from { height: 230px } body#mod_resmulti div#show_date_from { height: 230px }
#mod_respool {width:600px;} #mod_respool {width:600px;}
#mod_bes_kenmerk {width:500px;} #mod_bes_kenmerk {width:500px;}
.modal.scaffolding {width:500px;}
#mod_mldobj #obj_info {height:62px; padding: 4px; border: 1px solid #ccc;} #mod_mldobj #obj_info {height:62px; padding: 4px; border: 1px solid #ccc;}
#mod_mldobj .label { #mod_mldobj .label {

View File

@@ -1539,6 +1539,10 @@ ResultsetTable.formatValue = function (val, params) //datatype, decimals)
else else
return "&nbsp;"; return "&nbsp;";
} }
// Vanuit API2 model
if (typeof val == "object" && "name" in val)
val = val["name"];
// Eerst de geforceerde datatypes // Eerst de geforceerde datatypes
switch (params.datatype) switch (params.datatype)
{ {

View File

@@ -90,7 +90,8 @@ function foreignKeyTable(field)
"RES_DISCIPLINE" : { tbl: "res_discipline", key: "ins_discipline_key", desc: "ins_discipline_omschrijving" }, "RES_DISCIPLINE" : { tbl: "res_discipline", key: "ins_discipline_key", desc: "ins_discipline_omschrijving" },
"INS_DEEL" : { tbl: "ins_deel", key: "ins_deel_key", desc: "ins_deel_omschrijving" }, "INS_DEEL" : { tbl: "ins_deel", key: "ins_deel_key", desc: "ins_deel_omschrijving" },
"INS_SRTDEEL" : { tbl: "ins_srtdeel", key: "ins_srtdeel_key", desc: "ins_srtdeel_omschrijving" }, "INS_SRTDEEL" : { tbl: "ins_srtdeel", key: "ins_srtdeel_key", desc: "ins_srtdeel_omschrijving" },
"BES_BESTELOPDR" : { tbl: "bes_bestelopdr", key: "bes_bestelopdr_key", desc: "bes_bestelopdr_id" } "BES_BESTELOPDR" : { tbl: "bes_bestelopdr", key: "bes_bestelopdr_key", desc: "bes_bestelopdr_id" },
"FAC_FUNCTIE" : { tbl: "fac_functie", key: "fac_functie_key", desc: "fac_functie_omschrijving" }
}; };
} }
return __foreignKeyTable[field.toUpperCase()]; return __foreignKeyTable[field.toUpperCase()];