FSN#31698 Rapportgenerator savepoint
svn path=/Website/trunk/; revision=24322
This commit is contained in:
@@ -57,7 +57,7 @@ api2 = {
|
||||
IMPERS = getQParam("SWITCHUSER", "");
|
||||
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
|
||||
if (IMPERS) // && S("fac_api_allow_impersonate")
|
||||
if (IMPERS && S("fac_api_allow_impersonate"))
|
||||
{
|
||||
var sql = "SELECT prs_perslid_key, prs_perslid_naam"
|
||||
+ " FROM prs_perslid"
|
||||
@@ -165,12 +165,12 @@ api2 = {
|
||||
if ("REST_DELETE" in model)
|
||||
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
|
||||
if (model.fields[i].filter)
|
||||
result.filters.push({ id: model.fields[i].name,
|
||||
filter: model.fields[i].filter,
|
||||
type: model.fields[i].typ
|
||||
if (model.fields[fld].filter)
|
||||
result.filters.push({ id: fld,
|
||||
filter: model.fields[fld].filter,
|
||||
type: model.fields[fld].typ
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -239,23 +239,12 @@ api2 = {
|
||||
labels: function _labels(model)
|
||||
{
|
||||
var result = {};
|
||||
for (var i in model.fields)
|
||||
for (var fld in model.fields)
|
||||
{
|
||||
if (model.fields[i].label)
|
||||
result[model.fields[i].name] = model.fields[i].label;
|
||||
else if (typeof model.fields[i].track == 'string')
|
||||
result[model.fields[i].name] = model.fields[i].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];
|
||||
if (model.fields[fld].label)
|
||||
result[fld] = model.fields[fld].label;
|
||||
else if (typeof model.fields[fld].track == 'string')
|
||||
result[fld] = model.fields[fld].track;
|
||||
}
|
||||
return result;
|
||||
|
||||
@@ -264,12 +253,24 @@ api2 = {
|
||||
We begonnen ooit met fields als een array van { name: "xxx", dbs: "yyyy", .... }
|
||||
Maar later bleek het handiger een hash van "xxx": { dbs: "yyyy", .... }
|
||||
Voor oude modellen herschrijven we versie 1 naar versie 2
|
||||
|
||||
TODO: Dit moet er nog uit!!
|
||||
*/
|
||||
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
|
||||
{
|
||||
api2.normalize(model);
|
||||
var jsondata = {};
|
||||
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.
|
||||
var val;
|
||||
var hasFrm = true;
|
||||
if (formfields[i].frm)
|
||||
{
|
||||
// Haal waarde uit de formparameters.
|
||||
if (Request.Form(formfields[i].frm).count > 0)
|
||||
val = Request.Form(formfields[i].frm)(1);
|
||||
else
|
||||
hasFrm = false;
|
||||
if (Request.Form(formfields[i].frm).count == 0)
|
||||
continue; // niet aanwezig
|
||||
val = Request.Form(formfields[i].frm)(1);
|
||||
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
|
||||
val = formfields[i].val;
|
||||
//
|
||||
if (hasFrm)
|
||||
{
|
||||
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();
|
||||
}
|
||||
jsondata[model.record_name][formfields[i].name] = val;
|
||||
}
|
||||
return jsondata;
|
||||
},
|
||||
@@ -320,6 +324,10 @@ api2 = {
|
||||
var wheres = [];
|
||||
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)
|
||||
{
|
||||
var field = model.fields[fld];
|
||||
@@ -328,28 +336,29 @@ api2 = {
|
||||
continue;
|
||||
|
||||
// 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
|
||||
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
|
||||
// meerdere filters voor 1 veld dus wellicht
|
||||
if (filter == "range") {
|
||||
filterval1 = params.filter["start_"+field.name];
|
||||
filterval2 = params.filter["end_"+field.name];
|
||||
//__Log(">>filterval1>>"+filterval1);
|
||||
//__Log(">>filterval2>>"+filterval2);
|
||||
filterval1 = params.filter["start_" + fld];
|
||||
filterval2 = params.filter["end_" + fld];
|
||||
}
|
||||
// Nu is ook voor ranges alles weer normaal
|
||||
//__Log(">>field>>"+field.name);
|
||||
//__Log(">>filter>>"+filter);
|
||||
//__Log(">>filterval>>"+filterval);
|
||||
var clause;
|
||||
var operand = " = ";
|
||||
switch (field.typ)
|
||||
{
|
||||
case "key":
|
||||
if (!filterval)
|
||||
continue;
|
||||
if (filterval instanceof Array)
|
||||
{
|
||||
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
|
||||
// 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 ";
|
||||
}
|
||||
else
|
||||
@@ -498,14 +507,16 @@ api2 = {
|
||||
},
|
||||
|
||||
// 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
|
||||
sqlfields: function _sqlfields(params, model)
|
||||
{
|
||||
api2.normalize(model);
|
||||
model.aliasprefix = model.aliasprefix || "";
|
||||
var selects = [];
|
||||
var tables = [ model.table ];
|
||||
@@ -514,15 +525,14 @@ api2 = {
|
||||
var name_cnt = 0;
|
||||
for (var fld in model.fields)
|
||||
{
|
||||
var field = model.fields[fld];
|
||||
if (!field.name)
|
||||
if (fld.substring(0,1) == "_")
|
||||
continue;
|
||||
|
||||
var field = model.fields[fld];
|
||||
var dbs = field.dbs;
|
||||
if (field.sql)
|
||||
{
|
||||
if (model.aliasprefix)
|
||||
dbs = model.aliasprefix + field.name;
|
||||
dbs = model.aliasprefix + fld;
|
||||
selects.push(field.sql + " AS " + dbs);
|
||||
}
|
||||
else if (dbs)
|
||||
@@ -532,7 +542,7 @@ api2 = {
|
||||
{
|
||||
dbs = model.table + "." + dbs;
|
||||
if (model.aliasprefix)
|
||||
dbs += " AS " + api2.sqlfield_alias(model, field);
|
||||
dbs += " AS " + api2.sqlfield_alias(model, fld);
|
||||
}
|
||||
selects.push(dbs);
|
||||
}
|
||||
@@ -622,7 +632,6 @@ api2 = {
|
||||
// TODO the_key *moet* bestaan. Andere filtervelden negeren we
|
||||
update_fields: function _update_fields(params, model, jsondata)
|
||||
{
|
||||
//__DoLogj(jsondata)
|
||||
if (jsondata[model.record_name])
|
||||
jsondata = jsondata[model.record_name]; // dereference
|
||||
|
||||
@@ -631,11 +640,11 @@ api2 = {
|
||||
{
|
||||
var field = model.fields[fld];
|
||||
// De key halen we uit de url, die in de JSON negeren we
|
||||
if (field.name == "id")
|
||||
if (fld == "id")
|
||||
continue;
|
||||
if ("sql" in field)
|
||||
continue;
|
||||
if (!(field.name in jsondata) && !field.fnval)
|
||||
if (!(fld in jsondata) && !field.fnval)
|
||||
continue;
|
||||
if (field.readonly)
|
||||
continue;
|
||||
@@ -643,7 +652,7 @@ api2 = {
|
||||
if (field.fnval)
|
||||
var newval = field.fnval(jsondata);
|
||||
else // simpel
|
||||
var newval = jsondata[field.name];
|
||||
var newval = jsondata[fld];
|
||||
|
||||
switch (field.typ)
|
||||
{
|
||||
@@ -651,25 +660,28 @@ api2 = {
|
||||
if (newval && typeof newval == "object" && "id" in newval)
|
||||
{ // dereference
|
||||
newval = newval.id;
|
||||
jsondata[field.name] = newval;
|
||||
jsondata[fld] = newval;
|
||||
}
|
||||
break;
|
||||
case "date":
|
||||
case "datetime":
|
||||
if (newval === "")
|
||||
newval = null;
|
||||
// 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?
|
||||
if (newval !== null && typeof newval == "object" && !(newval instanceof Date))
|
||||
newval = new Date(newval);
|
||||
|
||||
__DoLog(newval)
|
||||
__DoLogj(typeof newval)
|
||||
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;
|
||||
case "float":
|
||||
case "number":
|
||||
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;
|
||||
}
|
||||
if (field.dbs.indexOf(".") >= 0) // complexe foreign key
|
||||
@@ -677,8 +689,9 @@ api2 = {
|
||||
//__Log("newval="+newval);
|
||||
var newfield = { dbs: field.dbs,
|
||||
typ: field.typ,
|
||||
track: field.track,
|
||||
val: newval
|
||||
track: field.track && field.label?field.label:field.track,
|
||||
val: newval,
|
||||
len: field.len
|
||||
};
|
||||
fields.push(newfield);
|
||||
}
|
||||
@@ -701,6 +714,7 @@ api2 = {
|
||||
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
|
||||
params.include = params.include || [];
|
||||
params.include.push(incname);
|
||||
|
||||
var incmodel = inc.model;
|
||||
@@ -713,7 +727,6 @@ api2 = {
|
||||
var oRs = Oracle.Execute(sql);
|
||||
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
|
||||
oRs.MoveNext();
|
||||
}
|
||||
@@ -751,13 +764,14 @@ api2 = {
|
||||
}
|
||||
},
|
||||
// Geeft de GET terug
|
||||
sql2jsonval: function(oRs, field, model)
|
||||
sql2jsonval: function(oRs, fld, model)
|
||||
{
|
||||
var field = model.fields[fld];
|
||||
if (field.val instanceof Function)
|
||||
var val = field.val(oRs, field, model);
|
||||
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;
|
||||
}
|
||||
else
|
||||
@@ -787,21 +801,51 @@ api2 = {
|
||||
val = { id: val };
|
||||
val.name = name;
|
||||
}
|
||||
if (val !== null && (field.LOV))
|
||||
{
|
||||
var spl = api2.splitLOV(field.LOV);
|
||||
val = { id: val, name: spl[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)
|
||||
{
|
||||
var record = {};
|
||||
for (var fld in model.fields)
|
||||
{
|
||||
var field = model.fields[fld];
|
||||
if (!field.name)
|
||||
if (fld.substring(0,1) == "_")
|
||||
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)
|
||||
continue;
|
||||
record[field.name] = val;
|
||||
record[fld] = val;
|
||||
}
|
||||
return record;
|
||||
},
|
||||
@@ -815,17 +859,21 @@ api2 = {
|
||||
|
||||
var data = [];
|
||||
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
|
||||
// omdat de includes er bij zijn gejoind
|
||||
while (!oRs.Eof)
|
||||
{
|
||||
var key = oRs(model.primary).Value;
|
||||
if (key != lastkey)
|
||||
if (model.primary)
|
||||
{
|
||||
if (lastkey > 0 && "id" in record) // Record was er mogelijk uit gefilterd
|
||||
data.push(record);
|
||||
var record = {};
|
||||
var key = oRs(model.primary).Value;
|
||||
if (key != lastkey)
|
||||
{
|
||||
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
|
||||
@@ -842,13 +890,13 @@ api2 = {
|
||||
var fld;
|
||||
for (fld in model.fields)
|
||||
{
|
||||
var field = model.fields[fld];
|
||||
if (!field.name)
|
||||
if (fld.substring(0,1) == "_")
|
||||
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)
|
||||
continue;
|
||||
record[field.name] = val;
|
||||
record[fld] = val;
|
||||
}
|
||||
if (params.include && model.includes)
|
||||
{
|
||||
@@ -899,9 +947,14 @@ api2 = {
|
||||
}
|
||||
|
||||
lastkey = key;
|
||||
if (!model.primary)
|
||||
{
|
||||
data.push(record);
|
||||
record = {};
|
||||
}
|
||||
oRs.MoveNext();
|
||||
}
|
||||
if (lastkey > 0)
|
||||
if (lastkey)
|
||||
data.push(record);
|
||||
return data;
|
||||
},
|
||||
@@ -955,7 +1008,7 @@ api2 = {
|
||||
break;
|
||||
case "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?
|
||||
if (getQParam("pretty","0")=="1")
|
||||
{
|
||||
@@ -996,8 +1049,10 @@ api2 = {
|
||||
|
||||
// TODO: Wanneer attributes gebruiken en wanneer (sub)-elements?
|
||||
// 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");
|
||||
xmlDoc.appendChild(xmlDoc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\""));
|
||||
|
||||
@@ -1014,14 +1069,20 @@ api2 = {
|
||||
}
|
||||
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++)
|
||||
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
|
||||
{ // misschien && "id" in record[fld]
|
||||
else if (record[fld] && typeof record[fld] == "object") // Veronderstelt dat dit foreign met name/key is
|
||||
{
|
||||
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);
|
||||
}
|
||||
else
|
||||
@@ -1184,17 +1245,6 @@ api2 = {
|
||||
}
|
||||
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)
|
||||
{
|
||||
var index = api2.find_fieldindex_by_dbsname(array, dbsname);
|
||||
@@ -1217,7 +1267,7 @@ api2 = {
|
||||
var newfield = {};
|
||||
newfield.dbs = model[newindex].dbs;
|
||||
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;
|
||||
__Logj(newfield);
|
||||
array.push(newfield);
|
||||
|
||||
29
APPL/API2/api_reports.asp
Normal file
29
APPL/API2/api_reports.asp
Normal 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);
|
||||
%>
|
||||
@@ -36,17 +36,19 @@ model_appointments =
|
||||
primary: "bez_afspraak_key",
|
||||
records_name: "appointments",
|
||||
record_name: "appointment",
|
||||
fields: [{ name: "id", dbs: "bez_afspraak_key", typ: "key", filter: "exact" },
|
||||
{ name: "from", dbs: "bez_afspraak_datum", typ: "datetime", track: L("lcl_vis_start_date")},
|
||||
{ name: "to", dbs: "bez_afspraak_eind", typ: "datetime", track: L("lcl_vis_end_date") },
|
||||
{ name: "description", dbs: "bez_afspraak_opmerking", typ: "varchar"},
|
||||
{ name: "action", dbs: "bez_actie_key", typ: "key", foreign: "bez_actie"},
|
||||
{ name: "location", dbs: "alg_locatie_key", typ: "key", foreign: "alg_locatie"},
|
||||
{ name: "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" },
|
||||
{ name: "room", dbs: "alg_v_allonroerendgoed.alg_ruimte_key", typ: "key", foreign: "alg_ruimte" },
|
||||
{ dbs: "alg_onrgoed_keys", typ: "key", fnval: afs_alg_onrgoed_keys }
|
||||
],
|
||||
fields: {"id" : { dbs: "bez_afspraak_key", typ: "key", label: L("lcl_vis_appointment"), filter: "exact" },
|
||||
"from" : { dbs: "bez_afspraak_datum", typ: "datetime", label: L("lcl_vis_start_date"), track: true},
|
||||
"to" : { dbs: "bez_afspraak_eind", typ: "datetime", label: L("lcl_vis_end_date"), track: true },
|
||||
"description": { dbs: "bez_afspraak_opmerking", typ: "varchar", label: L("lcl_remark")},
|
||||
"action" : { dbs: "bez_actie_key", typ: "key", foreign: "bez_actie", label: L("lcl_action"), track: true},
|
||||
"location" : { dbs: "alg_locatie_key", typ: "key", foreign: "alg_locatie"},
|
||||
"building" : { dbs: "alg_v_allonroerendgoed.alg_gebouw_key", typ: "key", foreign: "alg_gebouw" },
|
||||
"floor" : { dbs: "alg_v_allonroerendgoed.alg_verdieping_key", typ: "key", foreign: "alg_verdieping" },
|
||||
"room" : { dbs: "alg_v_allonroerendgoed.alg_ruimte_key", typ: "key", foreign: "alg_ruimte" },
|
||||
"_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,
|
||||
joinfield: "bez_afspraak_key"
|
||||
}
|
||||
@@ -136,10 +138,6 @@ model_appointments =
|
||||
},
|
||||
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
|
||||
|
||||
var fields = api2.update_fields(params, model_appointments, jsondata); // Build updater
|
||||
|
||||
236
APPL/API2/model_generic.inc
Normal file
236
APPL/API2/model_generic.inc
Normal 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;
|
||||
}
|
||||
%>
|
||||
82
APPL/API2/model_reportcolumns.inc
Normal file
82
APPL/API2/model_reportcolumns.inc
Normal 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
148
APPL/API2/model_reports.inc
Normal 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;
|
||||
}
|
||||
%>
|
||||
@@ -4,8 +4,8 @@
|
||||
|
||||
File: model_reportsx.inc
|
||||
|
||||
Description: rapport model voor het *bewerken* van rapporten.
|
||||
Zal rapporten niet uitvoeren dus. Daar maken we ooit model_reports voor
|
||||
Description: rapport model voor het *definieren* van rapporten.
|
||||
Zal rapporten niet uitvoeren dus. Daar is model_reports voor
|
||||
Parameters:
|
||||
Context:
|
||||
|
||||
@@ -13,66 +13,22 @@
|
||||
*/
|
||||
%>
|
||||
<!-- #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 =
|
||||
{
|
||||
table: "fac_usrrap",
|
||||
primary: "fac_usrrap_key",
|
||||
records_name: "reports",
|
||||
record_name: "report",
|
||||
fields: [{ name: "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: "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")},
|
||||
],
|
||||
fields: { "id" : { dbs: "fac_usrrap_key", typ: "key", label: "Key", filter: "exact" },
|
||||
"name" : { dbs: "fac_usrrap_omschrijving", typ: "varchar", label: L("lcl_usrrap_report"), filter: "like", len : 60},
|
||||
"description" : { dbs: "fac_usrrap_info", typ: "varchar", label: L("lcl_usrrap_info")},
|
||||
"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,
|
||||
joinfield: "fac_usrrap_key"
|
||||
}
|
||||
@@ -89,8 +45,8 @@ return; // TODO?
|
||||
case "GET":
|
||||
if (params.filter.id)
|
||||
{
|
||||
var room_key = params.filter.id;
|
||||
var this_alg = alg.func_enabled(room_key, model_reportsx.defaults.onrgoedlvl);
|
||||
var rap_key = params.filter.id;
|
||||
var this_alg = alg.func_enabled(rap_key, model_reportsx.defaults.onrgoedlvl);
|
||||
user.auth_required_or_abort(this_alg.readman || this_alg.readuse);
|
||||
}
|
||||
break;
|
||||
@@ -99,14 +55,14 @@ return; // TODO?
|
||||
var authParams = user.checkAutorisation(autfunction);
|
||||
// en verder met de autorisatie van PUT...
|
||||
case "PUT":
|
||||
var room_key = params.filter.id;
|
||||
var this_alg = alg.func_enabled(room_key, model_reportsx.defaults.onrgoedlvl);
|
||||
var rap_key = params.filter.id;
|
||||
var this_alg = alg.func_enabled(rap_key, model_reportsx.defaults.onrgoedlvl);
|
||||
user.auth_required_or_abort(this_alg.writeman || this_alg.writeuse);
|
||||
params.isNew = false;
|
||||
break;
|
||||
case "POST":
|
||||
var room_key = -1;
|
||||
var this_alg = alg.func_enabled(room_key, model_reportsx.defaults.onrgoedlvl);
|
||||
var rap_key = -1;
|
||||
var this_alg = alg.func_enabled(rap_key, model_reportsx.defaults.onrgoedlvl);
|
||||
user.auth_required_or_abort(this_alg.writeman);
|
||||
params.isNew = true;
|
||||
break;
|
||||
@@ -127,17 +83,20 @@ return; // TODO?
|
||||
var wheres = api2.sqlfilter(params, model_reportsx);
|
||||
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(", ")
|
||||
+ " FROM " + query.tables.join(", ")
|
||||
+ (query.wheres.length ? " WHERE " + query.wheres.join(" AND " ) : "")
|
||||
+ " ORDER BY fac_usrrap_key";
|
||||
|
||||
if (params.authparams.ALGreadlevel > -1)
|
||||
{ // Er is een scope-beperking van kracht
|
||||
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 + ")";
|
||||
}
|
||||
if (params.include && params.include.length)
|
||||
sql += ", fac_usrrap_cols_volgnr";
|
||||
|
||||
var json = api2.sql2json (params, sql, model_reportsx);
|
||||
|
||||
@@ -147,19 +106,19 @@ return; // TODO?
|
||||
{
|
||||
model_reportsx._check_authorization(params, "PUT");
|
||||
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
|
||||
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 err = Oracle.Execute(roomUpd.sql, true);
|
||||
if (err.friendlyMsg)
|
||||
abort_with_warning(err.friendlyMsg);
|
||||
|
||||
return { key: room_key, warning: "" };
|
||||
return { key: rap_key, warning: "" };
|
||||
},
|
||||
REST_POST: function (params, jsondata) /* new room */
|
||||
{
|
||||
@@ -167,29 +126,31 @@ return; // TODO?
|
||||
|
||||
var fields = api2.update_fields(params, model_reportsx, jsondata); // Build updater
|
||||
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 room_key = roomIns.sequences["fac_usrrap_key"];
|
||||
var rap_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: "" };
|
||||
var beztrack = api2.process_includes(params, model_reportsx, jsondata, rap_key);
|
||||
|
||||
return { key: rap_key, warning: "" };
|
||||
},
|
||||
REST_DELETE: function (params, the_key) /* delete room */
|
||||
{
|
||||
model_reportsx._check_authorization(params, "DELETE");
|
||||
var room_key = params.filter.id;
|
||||
var rap_key = params.filter.id;
|
||||
var sql = "UPDATE fac_usrrap"
|
||||
+ " SET fac_usrrap_verwijder = SYSDATE"
|
||||
+ " WHERE fac_usrrap_key = " + room_key;
|
||||
+ " WHERE fac_usrrap_key = " + rap_key;
|
||||
|
||||
var err = Oracle.Execute(sql, true);
|
||||
if (err.friendlyMsg)
|
||||
abort_with_warning(err.friendlyMsg);
|
||||
|
||||
return { key: room_key, warning: "" };
|
||||
return { key: rap_key, warning: "" };
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -29,19 +29,21 @@ model_reservationconsumables =
|
||||
primary: "res_rsv_artikel_key",
|
||||
records_name: "reservationconsumables",
|
||||
record_name: "reservationconsumable",
|
||||
fields: [ { name: "id", dbs: "res_rsv_artikel_key", typ: "key", filter: "exact" },
|
||||
{ name: "consumable", dbs: "res_artikel_key", typ: "key", filter: "exact", foreign: "res_artikel" },
|
||||
{ name: "amount", dbs: "res_rsv_artikel_aantal", typ: "number"},
|
||||
{ name: "status", dbs: "res_status_bo_key", typ: "number", filter: "exact", foreign: status_bo },
|
||||
{ name: "reservation", dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact", foreign: "res_rsv_ruimte" },
|
||||
{ name: "from", dbs: "res_rsv_artikel_levering", typ: "date", filter: "exact" },
|
||||
//{ name: "to", dbs: "res_rsv_artikel_tot", typ: "date" },
|
||||
{ name: "price", dbs: "res_rsv_artikel_prijs", typ: "float" },
|
||||
{ name: "processed", dbs: "res_rsv_artikel_verwerkt", typ: "datetime" },
|
||||
{ name: "closed", dbs: "res_rsv_artikel_afgemeld", typ: "datetime" },
|
||||
{ name: "changed", dbs: "res_rsv_artikel_mutatie", typ: "datetime" },
|
||||
{ name: "dirtlevel", dbs: "res_rsv_artikel_dirtlevel", typ: "number", filter: "exact" }
|
||||
],
|
||||
parent_key: "res_rsv_ruimte_key",
|
||||
|
||||
fields: { "id" : { dbs: "res_rsv_artikel_key", typ: "key", filter: "exact" },
|
||||
"consumable" : { dbs: "res_artikel_key", typ: "key", filter: "exact", foreign: "res_artikel" },
|
||||
"amount" : { dbs: "res_rsv_artikel_aantal", typ: "number"},
|
||||
"status" : { dbs: "res_status_bo_key", typ: "number", filter: "exact", foreign: status_bo },
|
||||
"reservation": { dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact", foreign: "res_rsv_ruimte" },
|
||||
"from" : { dbs: "res_rsv_artikel_levering", typ: "date", filter: "exact" },
|
||||
//: "to" { dbs: "res_rsv_artikel_tot", typ: "date" },
|
||||
"price" : { dbs: "res_rsv_artikel_prijs", typ: "float" },
|
||||
"processed" : { dbs: "res_rsv_artikel_verwerkt", typ: "datetime" },
|
||||
"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)
|
||||
{
|
||||
|
||||
@@ -33,19 +33,21 @@ model_reservationequipment =
|
||||
primary: "res_rsv_deel_key",
|
||||
records_name: "reservationequipment",
|
||||
record_name: "reservationequipment",
|
||||
fields: [ { name: "id", dbs: "res_rsv_deel_key", typ: "key", filter: "exact" },
|
||||
{ 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 },
|
||||
{ name: "from", dbs: "res_rsv_deel_van", typ: "datetime", filter: "exact" },
|
||||
{ name: "to", dbs: "res_rsv_deel_tot", typ: "datetime" },
|
||||
{ name: "price", dbs: "res_rsv_deel_prijs", typ: "float" },
|
||||
{ name: "processed", dbs: "res_rsv_deel_verwerkt", typ: "datetime" },
|
||||
{ name: "closed", dbs: "res_rsv_deel_afgemeld", typ: "datetime" },
|
||||
{ name: "changed", dbs: "res_rsv_deel_mutatie", typ: "datetime" },
|
||||
{ name: "dirtlevel", dbs: "res_rsv_deel_dirtlevel", typ: "number", filter: "exact" }
|
||||
parent_key: "res_rsv_ruimte_key",
|
||||
|
||||
fields: {"id" : { dbs: "res_rsv_deel_key", typ: "key", filter: "exact" },
|
||||
"equipment" : { dbs: "res_deel_key", typ: "key", filter: "exact", foreign: "res_deel" },
|
||||
"status" : { dbs: "res_status_bo_key", typ: "key", filter: "exact", foreign: res.getbostatustext },
|
||||
"from" : { dbs: "res_rsv_deel_van", typ: "datetime", filter: "exact" },
|
||||
"to" : { dbs: "res_rsv_deel_tot", typ: "datetime" },
|
||||
"price" : { dbs: "res_rsv_deel_prijs", typ: "float" },
|
||||
"processed" : { dbs: "res_rsv_deel_verwerkt", typ: "datetime" },
|
||||
"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" }
|
||||
// niet terug linken { name: "reservation", dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact", foreign: "res_rsv_ruimte" }
|
||||
],
|
||||
},
|
||||
|
||||
REST_GET: function _GET(params)
|
||||
{
|
||||
|
||||
@@ -46,25 +46,26 @@ model_reservations =
|
||||
records_name: "reservations",
|
||||
record_name: "reservation",
|
||||
|
||||
fields: [{ name: "id", dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact" },
|
||||
{ name: "name", dbs: "res_reservering_id", sql: "res_reservering_key||'/'||res_rsv_ruimte_volgnr", typ: "varchar"},
|
||||
{ name: "from", dbs: "res_rsv_ruimte_van", typ: "datetime", filter: "range", track: L("lcl_res_starttime")}, // TODO: Andere lcl voor catering
|
||||
{ name: "to", dbs: "res_rsv_ruimte_tot", typ: "datetime", filter: "range", track: L("lcl_res_endtime")},
|
||||
{ name: "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") },
|
||||
{ name: "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")},
|
||||
{ name: "contact", dbs: "res_rsv_ruimte_contact_key", typ: "key", foreign: "prs_perslid", track: L("lcl_name")},
|
||||
{ name: "visitorscount", dbs: "res_rsv_ruimte_bezoekers", typ: "number", track: L("lcl_visitors") },
|
||||
{ name: "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" },
|
||||
{ name: "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 },
|
||||
],
|
||||
fields: {"id" : { dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact", label: L("lcl_reservation") },
|
||||
"name" : { dbs: "res_reservering_id", sql: "res_reservering_key||'/'||res_rsv_ruimte_volgnr", typ: "varchar", label: L("lcl_reservation")},
|
||||
"from" : { dbs: "res_rsv_ruimte_van", typ: "datetime", filter: "range", label: L("lcl_res_starttime"), track: true}, // TODO: Andere lcl voor catering
|
||||
"to" : { dbs: "res_rsv_ruimte_tot", typ: "datetime", filter: "range", label: L("lcl_res_endtime"), track: true},
|
||||
"description" : { dbs: "res_rsv_ruimte_omschrijving", typ: "varchar", track: L("lcl_descr")},
|
||||
"activity" : { dbs: "res_activiteit_key", typ: "key", filter: "exact", foreign: "res_activiteit", label: L("lcl_activity"), track: true },
|
||||
"remark" : { dbs: "res_rsv_ruimte_opmerking", typ: "varchar", track: L("lcl_remark")},
|
||||
"host" : { dbs: "res_rsv_ruimte_host_key", typ: "key", foreign: "prs_perslid", label: L("lcl_host"), track: true},
|
||||
"contact" : { dbs: "res_rsv_ruimte_contact_key", typ: "key", foreign: "prs_perslid", label: L("lcl_name"), track: true},
|
||||
"visitorscount" : { dbs: "res_rsv_ruimte_bezoekers", typ: "number", label: L("lcl_visitors"), track: true },
|
||||
"status" : { dbs: "res_status_fo_key", typ: "key", foreign: res.getfostatustext },
|
||||
"resroom" : { dbs: "res_ruimte_opstelling.res_ruimte_key", typ: "key", filter: "exact", label: L("lcl_room"), foreign: "res_ruimte" },
|
||||
"configuration" : { dbs: "res_ruimte_opstelling.res_opstelling_key", typ: "key", foreign: "res_opstelling" },
|
||||
"warning" : { dbs: "res_rsv_ruimte_dirtlevel", typ: "number", foreign: fndirtwarn, readonly: true }
|
||||
},
|
||||
list: { columns: ["id", "name", "from", "to"] },
|
||||
includes: {"reservationequipment": { model: model_reservationequipment,
|
||||
joinfield: "res_rsv_ruimte_key"
|
||||
},
|
||||
"reservationconsumables": { model: model_reservationconsumables,
|
||||
"reservationconsumables": { model: model_reservationconsumables,
|
||||
joinfield: "res_rsv_ruimte_key"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -23,22 +23,22 @@ model_rooms =
|
||||
primary: "alg_ruimte_key",
|
||||
records_name: "rooms",
|
||||
record_name: "room",
|
||||
fields: [{ name: "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: "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") },
|
||||
{ name: "servicelevel", dbs: "mld_dienstniveau_key", typ: "key", foreign: "mld_dienstniveau", track: L("lcl_mld_dienst_niveau") },
|
||||
{ name: "description", dbs: "alg_ruimte_omschrijving", typ: "varchar", filter: "like", track: L("lcl_estate_ruimte_man_descr") },
|
||||
{ name: "grossarea", dbs: "alg_ruimte_bruto_vloeropp", typ: "float", track: L("lcl_estate_ruimte_bruto_vloeropp") },
|
||||
{ name: "area1", dbs: "alg_ruimte_opp_alt1", typ: "float", track: L("lcl_estate_ruimte_opp_alt1") },
|
||||
{ name: "area2", dbs: "alg_ruimte_opp_alt2", typ: "float", track: L("lcl_estate_ruimte_opp_alt2") },
|
||||
{ name: "perimeter", dbs: "alg_ruimte_omtrek", typ: "float", track: L("lcl_estate_ruimte_man_omtrek") },
|
||||
{ name: "volume", dbs: "alg_ruimte_inhoud", typ: "float", track: L("lcl_estate_ruimte_man_inhoud") },
|
||||
{ name: "remark", dbs: "alg_ruimte_opmerking", typ: "varchar", track: L("lcl_estate_ruimte_man_opmerk") },
|
||||
{ name: "openfrom", dbs: "alg_ruimte_beginuur", typ: "float", track: L("lcl_estate_gebouw_beginuur") },
|
||||
{ name: "opento", dbs: "alg_ruimte_einduur", typ: "float", track: L("lcl_estate_gebouw_einduur") },
|
||||
{ name: "workdays", dbs: "alg_ruimte_werkdagen", typ: "number" },
|
||||
{ name: "deleted", dbs: "alg_ruimte_verwijder", typ: "datetime" },
|
||||
fields: {"id" : { dbs: "alg_ruimte_key", typ: "key", filter: "exact" },
|
||||
"name" : { dbs: "alg_ruimte_nr", typ: "varchar", filter: "like", track: true, label: L("lcl_estate_ruimte_man_nr") },
|
||||
"floor" : { dbs: "alg_verdieping_key", typ: "key", foreign: "alg_verdieping", filter: "exact" },
|
||||
"roomtype" : { dbs: "alg_srtruimte_key", typ: "key", foreign: "alg_srtruimte", track: true, label: L("lcl_estate_ruimte_man_sort") },
|
||||
"servicelevel": { dbs: "mld_dienstniveau_key", typ: "key", foreign: "mld_dienstniveau", track: true, label: L("lcl_mld_dienst_niveau") },
|
||||
"description" : { dbs: "alg_ruimte_omschrijving", typ: "varchar", filter: "like", track: true, label: L("lcl_estate_ruimte_man_descr") },
|
||||
"grossarea" : { dbs: "alg_ruimte_bruto_vloeropp", typ: "float", track: true, label: L("lcl_estate_ruimte_bruto_vloeropp") },
|
||||
"area1" : { dbs: "alg_ruimte_opp_alt1", typ: "float", track: true, label: L("lcl_estate_ruimte_opp_alt1") },
|
||||
"area2" : { dbs: "alg_ruimte_opp_alt2", typ: "float", track: true, label: L("lcl_estate_ruimte_opp_alt2") },
|
||||
"perimeter" : { dbs: "alg_ruimte_omtrek", typ: "float", track: true, label: L("lcl_estate_ruimte_man_omtrek") },
|
||||
"volume" : { dbs: "alg_ruimte_inhoud", typ: "float", track: true, label: L("lcl_estate_ruimte_man_inhoud") },
|
||||
"remark" : { dbs: "alg_ruimte_opmerking", typ: "varchar", track: true, label: L("lcl_estate_ruimte_man_opmerk") },
|
||||
"openfrom" : { dbs: "alg_ruimte_beginuur", typ: "float", track: true, label: L("lcl_estate_gebouw_beginuur") },
|
||||
"opento" : { dbs: "alg_ruimte_einduur", typ: "float", track: true, label: L("lcl_estate_gebouw_einduur") },
|
||||
"workdays" : { dbs: "alg_ruimte_werkdagen", typ: "number" },
|
||||
"deleted" : { dbs: "alg_ruimte_verwijder", typ: "datetime" }
|
||||
/* niet gebruikt:
|
||||
{ dbs: "_ALG_RUIMTE_VLOER_OMSCHRIJVING", typ: "varchar", frm: "room_flrom" },
|
||||
{ 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_GETEKEND", typ: "date", frm: "room_tek" },
|
||||
*/
|
||||
],
|
||||
},
|
||||
controls: [ {name: "scope", type: "varchar" },
|
||||
{name: "show_deleted", type: "boolean" }
|
||||
],
|
||||
|
||||
@@ -21,14 +21,17 @@ model_visitors =
|
||||
primary: "bez_bezoekers_key",
|
||||
records_name: "visitors",
|
||||
record_name: "visitor",
|
||||
fields: [{ name: "id", dbs: "bez_bezoekers_key", typ: "key", filter: "exact" },
|
||||
{ name: "name", dbs: "bez_afspraak_naam", typ: "varchar"},
|
||||
{ name: "company", dbs: "bez_afspraak_bedrijf", typ: "varchar"},
|
||||
{ name: "badge", dbs: "bez_bezoekers_pasnr", typ: "varchar"},
|
||||
{ name: "in", dbs: "bez_bezoekers_done", typ: "datetime"},
|
||||
{ name: "out", dbs: "bez_bezoekers_out", typ: "datetime"}
|
||||
parent_key: "bez_afspraak_key",
|
||||
|
||||
fields: {"id" : { dbs: "bez_bezoekers_key", typ: "key", filter: "exact" },
|
||||
"name" : { dbs: "bez_afspraak_naam", typ: "varchar", label: L("lcl_vis_name")},
|
||||
"company": { dbs: "bez_afspraak_bedrijf", typ: "varchar", label: L("lcl_vis_company")},
|
||||
"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"}
|
||||
],
|
||||
},
|
||||
list: { columns: ["name", "company", "in", "out"] },
|
||||
|
||||
REST_GET: function _GET(params)
|
||||
{
|
||||
|
||||
@@ -23,7 +23,7 @@ FCLTHeader.Requires({ plugins:["jQuery"] });
|
||||
var authparamsPRSSYS = user.checkAutorisation("WEB_PRSSYS", true);
|
||||
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");
|
||||
|
||||
// rooturl moet er af
|
||||
|
||||
@@ -36,7 +36,7 @@ var rap_array = model_reportsx.REST_GET(rap_params);
|
||||
if (!rap_array.length)
|
||||
shared.record_not_found();
|
||||
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>
|
||||
|
||||
@@ -29,7 +29,7 @@ var col_key = getQParamInt("col_key");
|
||||
|
||||
var col_params = { filter: { id: col_key } };
|
||||
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
75
APPL/SCF/scaffolding.inc
Normal 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;
|
||||
}
|
||||
}
|
||||
%>
|
||||
135
APPL/SCF/scaffolding_edit.inc
Normal file
135
APPL/SCF/scaffolding_edit.inc
Normal 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>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
103
APPL/SCF/scaffolding_list.inc
Normal file
103
APPL/SCF/scaffolding_list.inc
Normal 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>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
59
APPL/SCF/scaffolding_save.inc
Normal file
59
APPL/SCF/scaffolding_save.inc
Normal 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));
|
||||
}
|
||||
%>
|
||||
151
APPL/SCF/scaffolding_search.inc
Normal file
151
APPL/SCF/scaffolding_search.inc
Normal 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>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
139
APPL/SCF/scaffolding_show.inc
Normal file
139
APPL/SCF/scaffolding_show.inc
Normal 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>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
90
APPL/SCF/scaffolding_wrap.inc
Normal file
90
APPL/SCF/scaffolding_wrap.inc
Normal 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>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
@@ -743,7 +743,7 @@ function abort_with_warning(warning, code)
|
||||
else
|
||||
{
|
||||
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.End;
|
||||
@@ -1034,6 +1034,13 @@ Date.prototype.midnight = function midnight()
|
||||
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)
|
||||
// Na afloop is de globale variabele customerId gezet en opgeslagen in Session("customerId")
|
||||
|
||||
@@ -2210,6 +2210,7 @@ body#mod_resmulti { width: 660px }
|
||||
body#mod_resmulti div#show_date_from { height: 230px }
|
||||
#mod_respool {width:600px;}
|
||||
#mod_bes_kenmerk {width:500px;}
|
||||
.modal.scaffolding {width:500px;}
|
||||
|
||||
#mod_mldobj #obj_info {height:62px; padding: 4px; border: 1px solid #ccc;}
|
||||
#mod_mldobj .label {
|
||||
|
||||
@@ -1539,6 +1539,10 @@ ResultsetTable.formatValue = function (val, params) //datatype, decimals)
|
||||
else
|
||||
return " ";
|
||||
}
|
||||
// Vanuit API2 model
|
||||
if (typeof val == "object" && "name" in val)
|
||||
val = val["name"];
|
||||
|
||||
// Eerst de geforceerde datatypes
|
||||
switch (params.datatype)
|
||||
{
|
||||
|
||||
@@ -90,7 +90,8 @@ function foreignKeyTable(field)
|
||||
"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_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()];
|
||||
|
||||
Reference in New Issue
Block a user