Files
Facilitor/APPL/API2/model_objects.inc
Koen Reefman 619fb9a78e Merge 2024.1 Gold patches
svn path=/Website/trunk/; revision=63886
2024-03-12 10:01:16 +00:00

442 lines
21 KiB
C++

<% /*
$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"-->
<!-- #include file="../ins/ins.inc"-->
<%
function model_objects(ins_key, params)
{
params = params || {};
this.table = "ins_deel";
this.primary = "ins_deel_key";
this.records_name = "objects";
this.record_name = "object";
this.multi_update = true;
this.fields = {
"id": { dbs: "ins_deel_key", typ: "key" },
"name": { dbs: "ins_deel_omschrijving", typ: "varchar", filter: "like", label: L("lcl_obj_identification"), track: true},
"description": { dbs: "ins_deel_opmerking", typ: "varchar", filter: "like", label: L("lcl_ins_opmerking"), track: true},
"objectdiscipline": { dbs: "ins_discipline_key", typ: "key", foreign: "ins_discipline", label: L("lcl_discipline")},
"group": { dbs: "ins_srtdeel.ins_srtgroep_key", typ: "key", foreign: "ins_srtgroep", label: L("lcl_obj_group")},
"type": { dbs: "ins_srtdeel_key", typ: "key", foreign: "ins_srtdeel", label: L("lcl_obj_sort")},
"placeholdertype": { dbs: "ins_alg_ruimte_type", typ: "varchar", track: true },
"placeholderkey": { dbs: "ins_alg_ruimte_key", typ: "number", track: true},
"placeholderloc": { dbs: "ins_alg_locatie_key", typ: "key", foreign: "alg_locatie", label: L("lcl_location")},
"location": { dbs: "ins_v_deel_gegevens.alg_locatie_key", typ: "key", foreign: "alg_locatie", label: L("lcl_location")},
"terrain": { dbs: "ins_v_deel_gegevens.alg_terreinsector_key", typ: "key", foreign: "alg_terreinsector", label: L("lcl_obj_bind_t")},
"building": { dbs: "ins_v_deel_gegevens.alg_gebouw_key", typ: "key", foreign: "alg_gebouw", label: L("lcl_building")},
"floor": { dbs: "ins_v_deel_gegevens.alg_verdieping_key", typ: "key", foreign: "alg_verdieping", label: L("lcl_floor")},
"room": { dbs: "ins_v_deel_gegevens.alg_ruimte_key", typ: "key", foreign: "alg_ruimte", label: L("lcl_room")},
"workplace": { dbs: "ins_v_deel_gegevens.prs_werkplek_key", typ: "key", foreign: "prs_werkplek", label: L("lcl_obj_bind_w")},
"owner": { dbs: "ins_v_deel_gegevens.prs_perslid_key", typ: "key", foreign: "prs_perslid", label: L("lcl_obj_bind_p")},
"department": { dbs: "ins_v_deel_gegevens.prs_afdeling_key", typ: "key", foreign: "prs_afdeling", label: L("lcl_obj_bind_a")},
"state": { dbs: "ins_deel_state", typ: "varchar", label: L("lcl_deel_state")},
"statedate": { dbs: "ins_deel_statedate", typ: "datetime", label: L("lcl_deel_statedate")},
"expiration": { dbs: "ins_deel_vervaldatum", typ: "date", label: L("lcl_ins_vervaldatum"), track: true},
"active": { dbs: "ins_deel_actief", typ: "check0", label: L("lcl_ins_active"), track: true},
"manager": { dbs: "prs_perslid_key_beh", typ: "key", foreign: "prs_perslid", label: L("lcl_ins_manager"), track: true},
// TODO if MJB
"score1": { dbs: "ins_deel_mjb_score1", typ: "varchar", track: true, label: L("lcl_ins_deel_mjb_score1")},
"score2": { dbs: "ins_deel_mjb_score2", typ: "varchar", track: true, label: L("lcl_ins_deel_mjb_score2")},
"dwgx": { dbs: "ins_deel_dwgx", typ: "float", label: L("lcl_ins_deel_dwgx"), track: true},
"dwgy": { dbs: "ins_deel_dwgy", typ: "float", label: L("lcl_ins_deel_dwgy"), track: true},
"dwgz": { dbs: "ins_deel_dwgz", typ: "float", label: L("lcl_ins_deel_dwgz"), track: true},
"dwgrotation": { dbs: "ins_deel_dwgrotatie", typ: "float", label: L("lcl_ins_deel_dwg_rotatie"), track: true},
"dwgscale": { dbs: "ins_deel_dwgschaal", typ: "float", label: L("lcl_ins_deel_dwg_schaal"), track: true},
"externnr": { dbs: "ins_deel_externnr", typ: "varchar", label: L("extern_nr"), readonly: !(user.has("WEB_FACTAB") || user.has("WEB_FACXNR"))},
"externsyncdate": { dbs: "ins_deel_externsyncdate", typ: "datetime", label: L("extern_syncdate"), readonly: !(user.has("WEB_FACTAB") || user.has("WEB_FACXNR"))},
"flag": { dbs: "ins_deel_flag", typ: "number", track: true, LOV:"", label: L("lcl_ins_flags")}
};
if (S("ins_deel_flags") > 0)
{
var flag_array = [];
for (var i=0; i<S("ins_deel_flags"); i++)
{
flag_array.push(i);
flag_array.push(L("lcl_ins_flag"+i));
}
this.fields.flag.LOV = flag_array.join(";");
}
else
{
delete this.fields.flag;
}
// 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
this.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"
}
};
function _check_authorization(params, method)
{
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
params.message = "";
params.filter.scope = params.filter.scope || "fe";
var module = "INS";
var ins_key = params.filter.id || -1;
var srtdeel_key = -1;
var srtgroep_key = -1;
var autfunction = ( params.filter.scope == "fe"
? "WEB_INSUSE"
: ( params.filter.scope == "fo"
? "WEB_INSFOF"
: "WEB_INSMAN"
));
// Voor sleutels/cilinders:
if ( (ins_key > 0 && ins.isSleCil(ins_key))
|| (srtdeel_key > 0 && ins.isSleCil(srtdeel_key, "S"))
|| (srtgroep_key > 0 && ins.isSleCil(srtgroep_key, "G"))
)
{
autfunction = "WEB_SLEBOF";
module = "SLE";
}
if (ins_key > 0)
{
var this_ins = ins.func_enabled_deel(ins_key, {urole: params.filter.scope});
user.auth_required_or_abort(this_ins.canChange || this_ins.canChangeOwn); // dat is toch wel het minste
params.authparams = this_ins.authparams(autfunction);
}
else
{
params.authparams = user.checkAutorisation(autfunction); // , null, null, true); // pessimistisch
var this_ins = { canChangeAlg: true };
}
params.func_enabled = this_ins || {};
};
function _pre_analyze_fields(params, jsondata, method)
{
var ins_key = params.filter.id || -1;
var status = true;
// POST:
if (method == "POST")
{
if (!jsondata.name || !jsondata.type) // || !jsondata.objectdiscipline)
{
params.message = "Missing required fields";
status = false;
}
if (status)
{
params.message = setPlaceholder(ins_key, jsondata);
status = (params.message == "");
}
}
//PUT:
if (method == "PUT")
{
// Discipline en objectsoort mogen niet gewijzigd worden.
delete jsondata.objectdiscipline;
delete jsondata.type;
//
if (jsondata.department || jsondata.owner || jsondata.terrain || jsondata.room || jsondata.workplace )
{
params.message = setPlaceholder(ins_key, jsondata);
status = (params.message == "");
}
}
if (!status)
{
abort_with_warning(params.message);
}
};
function setPlaceholder(ins_key, jsondata)
{
// Bepaal met binding of het juiste veld voor plaats/eigenaar zijn ingevuld.
var msg = "";
var placeholder = { status: false
, ruimte_type: null
, ruimte_key: null
, bind_msg: []
};
var srtdeel_key = jsondata.type;
if (ins_key > 0)
{ // srtdeel_key mag niet gewijzigd worden dus lees deze uit het bestaande record.
var sql = "SELECT ins_srtdeel_key"
+ " FROM ins_deel"
+ " WHERE ins_deel_key = " + ins_key;
var oRs = Oracle.Execute(sql);
srtdeel_key = oRs("ins_srtdeel_key").Value;
oRs.Close();
}
var sql = "SELECT sd.ins_srtdeel_binding"
+ " , sg.ins_srtgroep_key"
+ " , sg.ins_discipline_key"
+ " FROM ins_srtdeel sd"
+ " , ins_srtgroep sg"
+ " WHERE sd.ins_srtgroep_key = sg.ins_srtgroep_key"
+ " AND sd.ins_srtdeel_key = " + srtdeel_key;
var oRs = Oracle.Execute(sql);
if (!oRs.eof)
{
var bindingBits = oRs("ins_srtdeel_binding").Value;
if (bindingBits & BIND_AFDELI)
{
if (jsondata.department && jsondata.department > 0)
{
placeholder.status = true;
placeholder.ruimte_type = "A";
placeholder.ruimte_key = jsondata.department;
}
else
placeholder.bind_msg.push(L("lcl_obj_bind_a"));
}
if (bindingBits & BIND_PERSOO)
{
if (jsondata.owner && jsondata.owner > 0)
{
placeholder.status = true;
placeholder.ruimte_type = "P";
placeholder.ruimte_key = jsondata.owner;
}
else
placeholder.bind_msg.push(L("lcl_obj_bind_p"));
}
if (bindingBits & BIND_TERREI)
{
if (jsondata.terrain && jsondata.terrain > 0)
{
placeholder.status = true;
placeholder.ruimte_type = "T";
placeholder.ruimte_key = jsondata.terrain;
}
else
placeholder.bind_msg.push(L("lcl_obj_bind_t"));
}
if (bindingBits & BIND_RUIMTE)
{
if(jsondata.room && jsondata.room > 0 )
{
placeholder.status = true;
placeholder.ruimte_type = "R";
placeholder.ruimte_key = jsondata.room;
}
else
placeholder.bind_msg.push(L("lcl_obj_bind_r"));
}
if ((bindingBits & BIND_WERKPL) && f.werkplekkey)
{
if (jsondata.workplace && jsondata.workplace > 0)
{
placeholder.status = true;
placeholder.ruimte_type = "W";
placeholder.ruimte_key = jsondata.workplace;
}
else
placeholder.bind_msg.push(L("lcl_obj_bind_w"));
}
if (placeholder.status)
{
// Haal de locatie op als ruimtetype W, R of T is.
var sql = "SELECT alg_locatie_key"
+ " FROM (SELECT a.alg_onroerendgoed_keys, null, null prs_werkplek_key, a.alg_ruimte_key, a.alg_verdieping_key, a.alg_gebouw_key, a.alg_terreinsector_key, g.alg_locatie_key, alg_type"
+ " FROM alg_v_onroerendgoed a"
+ " , alg_gebouw g"
+ " WHERE g.alg_gebouw_key = a.alg_gebouw_key and a.alg_type in ('R','V','G')"
+ " UNION "
+ "SELECT a.alg_onroerendgoed_keys, null, null prs_werkplek_key, a.alg_ruimte_key, a.alg_verdieping_key, a.alg_gebouw_key, a.alg_terreinsector_key, t.alg_locatie_key, alg_type"
+ " FROM alg_v_onroerendgoed a"
+ " , alg_terreinsector t"
+ " WHERE t.alg_terreinsector_key = a.alg_terreinsector_key and a.alg_type in ('T')"
+ " UNION "
+ "SELECT prs_werkplek_key, null, prs_werkplek_key, alg_ruimte_key, alg_verdieping_key, alg_gebouw_key, null, alg_locatie_key, 'W'"
+ " FROM prs_v_werkplek_gegevens"
+ " UNION "
// Doe geen moeite om locatie bij persoon te bepalen. De trigger ins_t_ins_deel_b_iu maakt hem dan alsnog leeg.
+ "SELECT prs_perslid_key, prs_perslid_key, null, null, null, null, null, -1, 'P'"
+ " FROM prs_perslid"
+ " WHERE prs_perslid_verwijder IS NULL"
+ ") plts"
+ " WHERE plts.alg_type = " + safe.quoted_sql(placeholder.ruimte_type)
+ " AND plts.alg_onroerendgoed_keys = " + placeholder.ruimte_key;
var oRs_l = Oracle.Execute(sql);
if (!oRs_l.eof)
{ // Zet de (nieuwe) plaats/eigenaar gegevens.
jsondata.placeholdertype = placeholder.ruimte_type;
jsondata.placeholderkey = placeholder.ruimte_key;
jsondata.placeholderloc = oRs_l("alg_locatie_key").Value;
}
else
{
msg = "Unknown placeholder " + placeholder.ruimte_type + ":" + placeholder.ruimte_key;
}
oRs_l.Close();
}
else
{ // Verkeerde/geen binding gebruikt.
msg = L("lcl_obj_bind_mandatory") +" "+ placeholder.bind_msg.join(" of ");
}
}
else
msg = "No objectbinding found";
oRs.Close();
return msg;
}
this.REST_GET = function _GET(params)
{
_check_authorization(params, "GET");
var query = api2.sqlfields(params, this);
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))");
}
query.tables.push("ins_srtdeel");
query.wheres.push("ins_deel.ins_srtdeel_key = ins_srtdeel.ins_srtdeel_key");
// Als Uitgegeven of Beschikbaar is meegegeven dan overzicht uitleenmodule.
if (params.filter.lentout || params.filter.avail)
{
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, this)
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, this);
return json;
};
this.REST_PUT = function (params, jsondata, the_key) /* update object */
{
_check_authorization(params, "PUT");
_pre_analyze_fields(params, jsondata, "PUT");
if (params.custom_fields_only)
{
var insUpd = { trackarray: [] };
}
else
{
var dbfields = api2.update_fields(params, this, jsondata); // Build updater
var wheres = [" ins_deel_key = " + the_key];
var insUpd = buildTrackingUpdate("ins_deel", wheres.join(" AND " ), dbfields, { noValidateToken: true });
Oracle.Execute(insUpd.sql);
}
params.delayTracking = true;
var instrack = api2.process_includes(params, this, jsondata, the_key);
var all_track = (insUpd && insUpd.trackarray ? insUpd.trackarray : []);
all_track = all_track.concat(instrack);
if (all_track.length)
{
var update_string = L("lcl_ins_is_insupd") + "\n" + all_track.join("\n");
shared.trackaction("INSUPD", the_key, update_string);
}
return { key: the_key };
};
this.REST_POST = function (params, jsondata) /* new object */
{
params.isNew = true;
_check_authorization(params, "POST");
_pre_analyze_fields(params, jsondata, "POST");
var dbfields = api2.update_fields(params, this, jsondata); // Build updater
dbfields["id"] = {dbs: "ins_deel_key", typ: "key", seq: "ins_s_ins_inst_keys" };
var insIns = buildInsert("ins_deel", dbfields, { noValidateToken: true });
var ins_key = insIns.sequences["ins_deel_key"];
var err = Oracle.Execute(insIns.sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
var instrack = api2.process_includes(params, this, jsondata, ins_key);
shared.trackaction("INSNEW", ins_key);
return { key: ins_key, warning: params.message };
};
this.xxx_DELETE = function (params) /* delete object */
{
// Nog niet ondersteund
};
}
%>