277 lines
13 KiB
C++
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
|
|
}
|
|
|
|
}
|
|
%>
|