Files
Facilitor/APPL/API2/model_reservationequipment.inc
Jos Groot Lipman 56f8b5c224 FSN#40029 Ook parkeerplaats aan bezoeker kunnen koppelen
svn path=/Website/trunk/; revision=33305
2017-03-29 11:16:22 +00:00

277 lines
13 KiB
C++

<% /*
$Revision$
$Id$
File: model_reservationequipment.inc
Description: reserveren delen model.
Parameters:
Context:
Notes:
*/
%>
<!-- #include file="../Shared/discxalg3d.inc"-->
<%
var _disc_expires = []; // expire tijd per discipline
function is_expired(disc_key, jsDate)
{
if (disc_key > 0)
{
if (!_disc_expires[disc_key])
_disc_expires[disc_key] = res.discipline_expire(disc_key);
return (jsDate < _disc_expires[disc_key]);
}
}
model_reservationequipment =
{
table: "res_rsv_deel",
primary: "res_rsv_deel_key",
records_name: "reservationequipment",
record_name: "reservationequipment",
fields: {"id" : { dbs: "res_rsv_deel_key", typ: "key", filter: "exact" },
"reservation": { dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact", foreign: "res_rsv_ruimte" },
"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", "iscurrency": true},
"processed" : { dbs: "res_rsv_deel_verwerkt", typ: "datetime" },
"closed" : { dbs: "res_rsv_deel_afgemeld", typ: "datetime" },
"changed" : { dbs: "res_rsv_deel_mutatie", typ: "datetime" },
"visitor" : { dbs: "bez_bezoekers_key", typ: "key" },
"dirtlevel" : { dbs: "res_rsv_deel_dirtlevel", typ: "number", filter: "exact" }
// altijd 1 { name: "number", dbs: "res_rsv_deel_aantal", typ: "number", filter: "exact" }
},
list: { columns: [ "id", "from", "to", "equipment", "price" ] },
REST_GET: function _GET(params)
{
var urole = "fe"; // TODO: Moet echt niet ter zake doen
var autfunction = urole == "fe"? "WEB_RESUSE" : "WEB_RESMAN";
params.authparams = user.checkAutorisation(autfunction, null, null, true); // pessimistisch
// TODO: Add authorization
var query = api2.sqlfields(params, model_reservationequipment);
query.wheres.push("res_rsv_deel_verwijder IS NULL");
query.tables.push("res_rsv_ruimte");
query.wheres.push("res_rsv_ruimte.res_rsv_ruimte_key = res_rsv_deel.res_rsv_ruimte_key");
query.wheres.push(user_key + " IN (res_rsv_ruimte_host_key, res_rsv_ruimte_contact_key)"); // Altijd fe vooralnog
query.wheres.push("res_rsv_ruimte_van BETWEEN SYSDATE - " + S("facilitiespast_res") + " AND SYSDATE + " + S("facilitiesfuture_res"));
var wheres = api2.sqlfilter(params, model_reservationequipment);
query.wheres = query.wheres.concat(wheres);
var sql = "SELECT " + query.selects.join(", ")
+ " FROM " + query.tables.join(", ")
+ " WHERE " + query.wheres.join(" AND " )
+ " ORDER BY res_rsv_deel_key";
var json = api2.sql2json (params, sql, model_reservationequipment);
return json;
},
REST_PUT: function (params, jsondata, the_key) /* update reservable equipment */
{
var rsv_deel_key = the_key;
var dbfields = api2.update_fields(params, model_reservationequipment, jsondata); // Build updater
var res_deel_key = parseInt(jsondata.equipment);
model_reservationequipment._analyze_fields(dbfields, params, jsondata);
model_reservationequipment._validate_fields(dbfields, params, jsondata);
// De voorziening kan niet buiten de reservering van de ruimte geclaimd worden
var sql = "SELECT r.res_rsv_ruimte_key"
+ " , r.res_rsv_ruimte_van"
+ " , r.res_rsv_ruimte_tot"
+ " FROM res_rsv_ruimte r"
+ " , res_rsv_deel d"
+ " WHERE r.res_rsv_ruimte_key = d.res_rsv_ruimte_key"
+ " AND d.res_rsv_deel_key = " + rsv_deel_key;
var oRs = Oracle.Execute(sql);
var rsv_ruimte_key = oRs("res_rsv_ruimte_key").value;
var res_van = new Date(oRs("res_rsv_ruimte_van").value);
var res_tot = new Date(oRs("res_rsv_ruimte_tot").value);
oRs.Close();
var wheres = [" res_rsv_deel_key = " + rsv_deel_key];
var resUpd = buildTrackingUpdate("res_rsv_deel", wheres.join(" AND " ), dbfields, { noValidateToken: true });
var check_fail_sql = " if res.dirty_level_all(" + rsv_ruimte_key + ") <> 0 then"
+ " raise_application_error (-20000, 'res_m999 " + L("lcl_res_fe_no_dirty") + "');"
+ " end if;"
var sql = "BEGIN "
+ resUpd.sql + ";"
+ " res.set_deel_dirty (" + rsv_deel_key + "); " // Zelf dirty geworden?
+ " res.set_delen_clean (" + res_deel_key + "," + res_van.toSQL() + "," + res_tot.toSQL() +"); " //Anderen clean geworden?
+ check_fail_sql
+ "END;";
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
return { key: rsv_deel_key };
},
REST_POST: function (params, jsondata, parent_key) /* new reservable object */
{
params.isNew = true;
var trackarray = [];
var rsv_ruimte_key = parent_key;
var this_res = res.func_enabled(rsv_ruimte_key); // Wat heb ik zoal aan rechten op deze specifieke reservering
var dbfields = api2.update_fields(params, model_reservationequipment, jsondata); // Build updater
model_reservationequipment._analyze_fields(dbfields, params, jsondata);
model_reservationequipment._validate_fields(dbfields, params, jsondata);
var sql = "SELECT res_reservering_key"
+ " , res_rsv_ruimte_van"
+ " , res_rsv_ruimte_tot"
+ " , res_rsv_ruimte_volgnr"
+ " FROM res_rsv_ruimte"
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
var oRs = Oracle.Execute(sql);
var res_key = oRs("res_reservering_key").value;
var res_volgnr = oRs("res_rsv_ruimte_volgnr").value;
var res_van = new Date(oRs("res_rsv_ruimte_van").value);
var res_tot = new Date(oRs("res_rsv_ruimte_tot").value);
oRs.Close();
dbfields["id"] = { dbs: "res_rsv_deel_key", typ: "key", seq: "res_s_res_rsv_deel_key" };
dbfields["reservation"] = { dbs: "res_rsv_ruimte_key", typ: "key", val: rsv_ruimte_key };
dbfields["from"] = { dbs: "res_rsv_deel_van", typ: "datetime", val: res_van };
dbfields["to"] = { dbs: "res_rsv_deel_tot", typ: "datetime", val: res_tot };
dbfields["amount"] = { dbs: "res_rsv_deel_aantal", typ: "number", val: 1 };
var resIns = buildInsert("res_rsv_deel", dbfields, { noValidateToken: true });
var rsv_deel_key = resIns.sequences["res_rsv_deel_key"];
// Tracking toevoegen.
var res_deel_key = parseInt(jsondata.equipment);
var sql = "SELECT res_deel_omschrijving"
+ " FROM res_deel"
+ " WHERE res_deel_key = " + res_deel_key;
var oRs = Oracle.Execute(sql);
var res_deel_name = oRs("res_deel_omschrijving").value;
__Log("added " + res_deel_name + " : " + res_deel_key);
var inserttrack = res.trackobject(res_deel_key, "insert");
trackarray.push(inserttrack);
// Check of er delen dirty zijn (geworden)
var check_fail_sql = "";
if (S("res_fe_allow_dirty") != 1 && this_res.canChangeFEOnly)
{
check_fail_sql = " if res.dirty_level_all(" + rsv_ruimte_key + ") <> 0 then"
+ " raise_application_error (-20000, 'res_m960 "+L("lcl_res_fe_no_dirty")+"');"
+ " end if;"
}
var sql = "BEGIN "
+ resIns.sql + ";"
+ " res.set_delen_dirty (" + rsv_deel_key + "); "
+ check_fail_sql
+ "END;";
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
else
res.trackreserveringupdate(rsv_ruimte_key, trackarray.length? L("lcl_res_is_resupdtrack").format(res_key + "/" + res_volgnr) + "\n" + trackarray.join("\n") : null);
params.isNew = false; // Voorkom dat een volgende reservationequipment ook een insert wordt.
return { key: rsv_deel_key };
},
REST_DELETE: function (params, the_key) /* delete reservable object */
{
var rsv_deel_key = the_key;
var must_warn = false; // must I warn about last-minute?
var trackarray = [];
var urole = "fe";
var sql = "SELECT rr.res_reservering_key"
+ " , rr.res_rsv_ruimte_key"
+ " , rr.res_rsv_ruimte_van"
+ " , rr.res_rsv_ruimte_tot"
+ " , rr.res_rsv_ruimte_volgnr"
+ " , d.res_deel_key"
+ " , d.res_deel_omschrijving"
+ " , d.res_discipline_key"
+ " FROM res_rsv_ruimte rr"
+ " , res_rsv_deel rd"
+ " , res_deel d"
+ " WHERE rr.res_rsv_ruimte_key = rd.res_rsv_ruimte_key"
+ " AND rd.res_deel_key = d.res_deel_key"
+ " AND rd.res_rsv_deel_key = " + rsv_deel_key;
var oRs = Oracle.Execute(sql);
var res_key = oRs("res_reservering_key").value;
var res_volgnr = oRs("res_rsv_ruimte_volgnr").value;
var res_van = new Date(oRs("res_rsv_ruimte_van").value);
var res_tot = new Date(oRs("res_rsv_ruimte_tot").value);
var rsv_ruimte_key = oRs("res_rsv_ruimte_key").value;
var res_deel_key = oRs("res_deel_key").value;
var res_deel_name = oRs("res_deel_omschrijving").value;
var res_disc_key = oRs("res_discipline_key").value;
oRs.Close();
// Expire check
must_warn = must_warn || is_expired(res_disc_key, res_van);
var resDel = "DELETE from res_rsv_deel"
+ " WHERE res_rsv_ruimte_key=" + rsv_ruimte_key
+ " AND res_deel_key = " + res_deel_key; // eventuele dubbelen ook verwijderen.
__Log("removed " + res_deel_name + " : " + res_deel_key);
// Tracking toevoegen.
var deletetrack = res.trackobject(res_deel_key, "delete");
trackarray.push(deletetrack);
var sql = "BEGIN "
+ resDel + ";"
+ " res.set_delen_clean (" + res_deel_key + "," + res_van.toSQL() + "," + res_tot.toSQL() +"); " // Anderen clean geworden?
+ "END;";
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
else
res.trackreserveringupdate(rsv_ruimte_key, trackarray.length? L("lcl_res_is_resupdtrack").format(res_key + "/" + res_volgnr) + "\n" + trackarray.join("\n") : null);
//
if (must_warn && urole != "bo")
{
warning = L("lcl_res_obj_lastminute");
}
},
_analyze_fields: function (dbfields, params, jsondata) /* analyseer inkomende data, common voor PUT en POST */
/* res_ruimte+config wordt bijvoorbeeld omgezet in res_ruimte_opstel_key */
{
if ("equipment" in jsondata)
{
// Mag/kan het deel gereserveerd worden in deze ruimte
var res_deel_key = parseInt(jsondata.equipment);
var sql = "SELECT res_ins_deel_key"
+ " FROM res_deel"
+ " WHERE res_deel_key = " + res_deel_key;
var oRs = Oracle.Execute(sql);
if (oRs.eof)
api2.error(500, "Unknown equipment in input");
oRs.Close();
}
else // moet er een res_deel zijn
{
api2.error(500, "Missing equipment in input");
}
},
_validate_fields: function (dbfields, params, jsondata) /* valideer dbfields, alle constraints die niet door de database worden afgevangen */
{
// testurl = http://uwva.5iwork/branch542/api2/reservations/3112748.json?pretty=1&logging=1&include=reservationequipment
}
}
%>