Files
Facilitor/APPL/API2/model_objects.inc
Jos Groot Lipman 7eb594f16c Bij objects ook de gekoppelde meldingen kunnen includen
svn path=/Website/trunk/; revision=36790
2018-01-31 12:33:12 +00:00

145 lines
7.5 KiB
PHP

<% /*
$Revision$
$Id$
File: model_objects.inc
Description: Object model. Still quite incomplete (or "under construction" if you like)
Parameters:
Context:
Notes: We ondersteunen vooralsnog uitsluitend ruimtegebonden objecten
*/
%>
<!-- #include file="../Shared/discxalg3d.inc"-->
<!-- #include file="./model_custom_fields.inc"-->
<!-- #include file="./model_fac_tracking.inc"-->
<!-- #include file="./model_ins_kenmerk.inc"-->
<!-- #include file="model_issueobjects.inc"-->
<%
model_objects =
{
table: "ins_deel",
primary: "ins_deel_key",
records_name: "objects",
record_name: "object",
multi_update: true,
fields: {"id" : { dbs: "ins_deel_key", typ: "key", filter: "exact" },
"name" : { dbs: "ins_deel_omschrijving", typ: "varchar", filter: "like"},
"description" : { dbs: "ins_deel_opmerking", typ: "varchar", filter: "like"},
"type" : { dbs: "ins_srtdeel_key", typ: "key", filter: "exact", foreign: "ins_srtdeel"},
"state" : { dbs: "ins_deel_state", typ: "varchar" },
"statedate": { dbs: "ins_deel_statedate", typ: "datetime" },
"expiration":{ dbs: "ins_deel_vervaldatum", typ: "date" },
"manager" : { dbs: "prs_perslid_key_beh", typ: "key", foreign: "prs_perslid", track: true, label: L("lcl_ins_manager"), sfilter: "exact" },
"score1" : { dbs: "ins_deel_mjb_score1", typ: "varchar", filter: "exact", track: true, label: L("lcl_ins_deel_mjb_score1")},
"score2" : { dbs: "ins_deel_mjb_score2", typ: "varchar", filter: "exact", track: true, label: L("lcl_ins_deel_mjb_score2")},
"location" : { dbs: "ins_v_deel_gegevens.alg_locatie_key", typ: "key", foreign: "alg_locatie"},
"building" : { dbs: "ins_v_deel_gegevens.alg_gebouw_key", typ: "key", foreign: "alg_gebouw" },
"floor" : { dbs: "ins_v_deel_gegevens.alg_verdieping_key", typ: "key", foreign: "alg_verdieping" },
"room" : { dbs: "ins_v_deel_gegevens.alg_ruimte_key", typ: "key", foreign: "alg_ruimte" },
"owner" : { dbs: "ins_v_deel_gegevens.prs_perslid_key", typ: "key", foreign: "prs_perslid" }
},
// een include van model_ins_deel_state_history lijkt voor de hand te liggen
// maar gaf (vast oplosbare) problemen met een dubbele ins_deel in de query
// Bovendien wil je in de praktijk altijd een datumfilter op de statedatum hebben
// wat niet kan op een include. Doe daarom maar /api2/statehistory?object=16506&start_statedate=2017-11-01T12:20:16Z&fields=state,statedate
includes: { "tracking": {
model: new model_tracking(['deel']),
joinfield: "trackingrefkey"
},
"custom_fields" : {
"model": new model_custom_fields(this, new model_ins_kenmerk("D", { internal: true }), { readman: true, readuse: true }),
"joinfield": "flexparentkey",
"enable_update": true
},
"issueobjects": {
model: new model_issueobjects(),
joinfield: "object"
}
},
REST_GET: function _GET(params)
{
var urole = "fe"; // TODO: Moet echt niet ter zake doen
var autfunction = urole == "fe"? "WEB_INSUSE" : "WEB_INSMAN";
params.authparams = user.checkAutorisation(autfunction, null, null, true); // pessimistisch
var query = api2.sqlfields(params, model_objects);
query.wheres.push("ins_deel_verwijder IS NULL");
// Toon standaard alleen de niet vervallen objecten, behalve als specifiek op object identificatie wordt gezocht.
if (!params.filter.expired && !params.filter.name)
query.wheres.push(" (ins_deel.ins_deel_vervaldatum IS NULL OR ins_deel.ins_deel_vervaldatum > TRUNC(SYSDATE))");
// Als Uitgegeven of Beschikbaar is meegegeven dan overzicht uitleenmodule.
if (params.filter.lentout || params.filter.avail)
{
query.tables.push("ins_srtdeel");
query.wheres.push("ins_deel.ins_srtdeel_key = ins_srtdeel.ins_srtdeel_key");
query.wheres.push("ins_srtdeel_uitleenbaar = 1");
if (params.filter.lentout && !params.filter.avail)
query.wheres.push("ins_alg_ruimte_key_org IS NOT NULL");
if (!params.filter.lentout && params.filter.avail)
query.wheres.push("ins_alg_ruimte_key_org IS NULL");
}
// TODO: Add 3D authorization
// Alleen nog maar simpele 1D autorisatie
query.wheres.push(" ins_deel.ins_discipline_key IN"
+ " (SELECT ins_discipline_key"
+ " FROM fac_v_webgebruiker"
+ " WHERE fac_functie_key = " + params.authparams.autfunctionkey
+ " AND prs_perslid_key = " + user_key
+ " AND fac_gebruiker_prs_level_read < 9"
+ " AND fac_gebruiker_alg_level_read < 9)");
// TODO: We ondersteunen uitsluitend ruimte- werkplek- en persoonsgebonden objecten
query.tables.push("ins_v_deel_gegevens");
query.wheres.push("ins_deel.ins_alg_ruimte_type IN ('R', 'W', 'P') ");
query.wheres.push("ins_v_deel_gegevens.ins_deel_key = ins_deel.ins_deel_key");
var wheres = api2.sqlfilter(params, model_objects)
query.wheres = query.wheres.concat(wheres);
var sql = "SELECT " + query.selects.join(", ")
+ " FROM " + query.tables.join(", ")
+ " WHERE " + query.wheres.join(" AND " )
+ " ORDER BY ins_deel_omschrijving";
if (query.orderbys.length)
sql += ", " + query.orderbys.join(", ");
var json = api2.sql2json (params, sql, model_objects);
return json;
},
REST_PUT: function (params, jsondata, the_key) /* update object */
{
if (params.custom_fields_only)
{
var insUpd = { trackarray: [] };
}
else
{
var dbfields = api2.update_fields(params, model_objects, jsondata); // Build updater
//model_objects._validate_fields(dbfields, params, jsondata);
// TODO: Autorization
var wheres = [" ins_deel_key = " + the_key];
var insUpd = buildTrackingUpdate("ins_deel", wheres.join(" AND " ), dbfields, { noValidateToken: true });
Oracle.Execute(insUpd.sql);
}
var instrack = api2.process_includes(params, model_objects, jsondata, the_key);
return { key: the_key };
},
xxx_POST: function (params) /* new object */
{
// Nog niet ondersteund
},
xxx_DELETE: function (params) /* delete object */
{
// Nog niet ondersteund
}
}
%>