FCLT#54891 AiAi bij toevoegen catering via API2

svn path=/Website/branches/v2018.1/; revision=39400
This commit is contained in:
Erik Groener
2018-10-15 13:52:37 +00:00
parent 15c47aa1fb
commit f10b4290c9
2 changed files with 366 additions and 302 deletions

View File

@@ -22,36 +22,72 @@ function status_bo(json)
return status_bo;
}
model_reservationconsumables =
function model_reservationconsumables()
{
table: "res_rsv_artikel",
primary: "res_rsv_artikel_key",
records_name: "reservationconsumables",
record_name: "reservationconsumable",
this.table = "res_rsv_artikel";
this.primary = "res_rsv_artikel_key";
this.records_name = "reservationconsumables";
this.record_name = "reservationconsumable";
fields: { "id" : { dbs: "res_rsv_artikel_key", typ: "key", filter: "exact" },
"reservation": { dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact", foreign: "res_rsv_ruimte" },
"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: "key", filter: "exact", foreign: status_bo },
"from" : { dbs: "res_rsv_artikel_levering", typ: "time", filter: "exact" },
//: "to" { dbs: "res_rsv_artikel_tot", typ: "date" },
"price" : { dbs: "res_rsv_artikel_prijs", typ: "float", "iscurrency": true },
"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" }
},
list: { columns: [ "id", "from", "amount", "consumable", "price" ] },
this.fields = {
"id" : { dbs: "res_rsv_artikel_key", typ: "key", filter: "exact" , seq:"res_s_res_rsv_artikel_key"},
"reservation": { dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact", foreign: "res_rsv_ruimte" },
"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: "key", filter: "exact", foreign: status_bo },
"from" : { dbs: "res_rsv_artikel_levering", typ: "datetime",filter: "exact" },
//"to" : { dbs: "res_rsv_artikel_tot", typ: "date" },
"price" : { dbs: "res_rsv_artikel_prijs", typ: "float", "iscurrency": true },
"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)
this.list = {
columns: [
"id",
"from",
"amount",
"consumable",
"price"
]
};
this._validate_fields = function (dbfields, params, jsondata)
{
var scope = params.filter.scope || "fe";
this.autfunction = { fe : "WEB_RESUSE", fo : "WEB_RESFOF", bo : "WEB_RESBOF", mi : "WEB_RESBAC" } [scope];
params.authparams = user.checkAutorisation(this.autfunction, null, null, true); // pessimistisch
}
this.REST_GET = function _GET(params)
{
this._validate_fields({}, params, {});
var query = api2.sqlfields(params, this);
if (params.filter.id > 0)
{
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
var this_res = {canReadAny: false};
var sql = "SELECT res_rsv_ruimte_key"
+ " FROM res_rsv_artikel"
+ " WHERE res_rsv_artikel_key = " + params.filter.id;
var oRs = Oracle.Execute(sql);
if (!oRs.eof)
{
var rsv_ruimte_key = oRs("res_rsv_ruimte_key").Value;
var this_res = res.func_enabled(rsv_ruimte_key);
}
oRs.Close();
user.auth_required_or_abort(this_res.canReadAny);
// TODO: Add authorization
var query = api2.sqlfields(params, model_reservationconsumables);
query.wheres.push("res_rsv_artikel_key = " + params.filter.id);
}
if (params.filter.api2 && params.filter.api2 != this.records_name)
{
query.wheres.push("res_rsv_artikel_verwijder IS NULL");
query.tables.push("res_rsv_ruimte");
@@ -59,24 +95,35 @@ model_reservationconsumables =
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_reservationconsumables);
var wheres = api2.sqlfilter(params, this);
query.wheres = query.wheres.concat(wheres);
}
var sql = "SELECT " + query.selects.join(", ")
+ " FROM " + query.tables.join(", ")
+ (query.wheres.length ? " WHERE " + query.wheres.join(" AND " ) : "")
+ " ORDER BY res_rsv_artikel_key";
var sql = "SELECT " + query.selects.join(", ")
+ " FROM " + query.tables.join(", ")
+ " WHERE " + query.wheres.join(" AND " )
+ " ORDER BY res_rsv_artikel_key";
var json = api2.sql2json (params, sql, model_reservationconsumables);
return json;
},
PUT: function (params) /* update reservable consumables */
var json = api2.sql2json (params, sql, this);
return json;
};
this.REST_POST = function (params, jsondata) /* new reservable consumable */
{
},
POST: function (params) /* new reservable object */
this._validate_fields({}, params, jsondata);
return generic_REST_POST(this)(params, jsondata);
}
this.REST_PUT = function (params, jsondata, the_key) /* update reservable consumables */
{
},
DELETE: function (params) /* delete reservable object */
this._validate_fields({}, params, jsondata);
return generic_REST_PUT(this)(params, jsondata, the_key);
}
this.REST_DELETE = function (params, the_key) /* delete reservable consumable */
{
this._validate_fields({}, params, {});
return generic_REST_DELETE(this)(params, the_key);
}
}
%>

View File

@@ -48,26 +48,26 @@ function model_reservations(rsv_key, params)
this.records_name = "reservations";
this.record_name = "reservation";
this.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", label: L("lcl_descr"), track: true },
"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", label: L("lcl_remark"), track: true},
"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 },
"flag" : { dbs: "res_rsv_ruimte_flag", typ: "number", LOV: ""},
"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" },
"approved" : { dbs: "res_rsv_ruimte_afgerond", typ: "number", label: L("lcl_res_resappr"), track: true },
"warning" : { dbs: "res_rsv_ruimte_dirtlevel", typ: "number", foreign: fndirtwarn, readonly: true },
"reservation" : { dbs: "res_reservering_key", typ: "key", label: L("lcl_reservation") },
"extern_id" : { dbs: "res_rsv_ruimte_externnr", typ: "varchar", label: L("lcl_extrn_nr") }
};
this.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", label: L("lcl_descr"), track: true },
"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", label: L("lcl_remark"), track: true},
"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 },
"flag" : { dbs: "res_rsv_ruimte_flag", typ: "number", LOV: ""},
"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" },
"approved" : { dbs: "res_rsv_ruimte_afgerond", typ: "number", label: L("lcl_res_resappr"), track: true },
"warning" : { dbs: "res_rsv_ruimte_dirtlevel", typ: "number", foreign: fndirtwarn, readonly: true },
"reservation" : { dbs: "res_reservering_key", typ: "key", label: L("lcl_reservation") },
"extern_id" : { dbs: "res_rsv_ruimte_externnr", typ: "varchar", label: L("lcl_extrn_nr") }
};
// Mogelijke waarden voor res_rsv_ruimte_flag is afhankelijk van het aantal toegestane flags.
if (S("res_reservering_flags") > 0)
@@ -82,115 +82,126 @@ function model_reservations(rsv_key, params)
}
this.list = { columns: ["id", "name", "from", "to"] };
this.includes =
{"reservationequipment": { model: model_reservationequipment,
joinfield: "reservation",
enable_update: true
},
"reservationconsumables": { model: model_reservationconsumables,
joinfield: "reservation",
enable_update: true
},
"tracking": {
model: new model_tracking(['reservering', 'xreservering']),
joinfield: "trackingrefkey"
},
"custom_fields" : { model: new model_custom_fields(this, new model_res_kenmerk({ internal: true }), { readman: true, readuse: true }),
joinfield: "flexparentkey"
}
};
this.list = {
columns: [
"id",
"name",
"from",
"to"
]
};
this.includes = {
"reservationequipment": {
model: model_reservationequipment,
joinfield: "reservation",
enable_update: true
},
"reservationconsumables": {
model: new model_reservationconsumables(),
joinfield: "reservation",
enable_update: true
},
"tracking": {
model: new model_tracking(['reservering', 'xreservering']),
joinfield: "trackingrefkey"
},
"custom_fields" : {
model: new model_custom_fields(this, new model_res_kenmerk({ internal: true }), { readman: true, readuse: true }),
joinfield: "flexparentkey"
}
};
this.impersonate_auth = "WEB_RESFOF";
this.REST_GET = function _GET(params)
{
var query = api2.sqlfields(params, this );
if (params.filter.id > 0)
{
var query = api2.sqlfields(params, this );
var this_res = res.func_enabled(params.filter.id);
user.auth_required_or_abort(this_res.canReadAny);
}
else // lijst
{
var scope = params.filter.scope || "fe";
var autfunction = { fe : "WEB_RESUSE", fo : "WEB_RESFOF", bo : "WEB_RESBOF", mi : "WEB_RESBAC" } [scope];
params.authparams = user.checkAutorisation(autfunction, null, null, true); // pessimistisch
if (params.filter.id > 0)
if (scope == "fe")
{
var this_res = res.func_enabled(params.filter.id);
user.auth_required_or_abort(this_res.canReadAny);
query.wheres.push(user_key + " IN (res_rsv_ruimte_host_key, res_rsv_ruimte_contact_key)");
query.wheres.push("res_rsv_ruimte_van BETWEEN SYSDATE - " + S("facilitiespast_res") + " AND SYSDATE + " + S("facilitiesfuture_res"));
}
else // lijst
else
{
var scope = params.filter.scope || "fe";
var autfunction = { fe : "WEB_RESUSE", fo : "WEB_RESFOF", bo : "WEB_RESBOF", mi : "WEB_RESBAC" } [scope];
params.authparams = user.checkAutorisation(autfunction, null, null, true); // pessimistisch
if (scope == "fe")
{
query.wheres.push(user_key + " IN (res_rsv_ruimte_host_key, res_rsv_ruimte_contact_key)");
query.wheres.push("res_rsv_ruimte_van BETWEEN SYSDATE - " + S("facilitiespast_res") + " AND SYSDATE + " + S("facilitiesfuture_res"));
}
else
{
if (!params.filter.start_from && !params.filter.end_from && !params.filter.start_to && !params.filter.end_to)
query.wheres.push("res_rsv_ruimte_van >= TRUNC(SYSDATE)"); // reserveringen van vandaag en komende dagen!
}
if (!params.filter.start_from && !params.filter.end_from && !params.filter.start_to && !params.filter.end_to)
query.wheres.push("res_rsv_ruimte_van >= TRUNC(SYSDATE)"); // reserveringen van vandaag en komende dagen!
}
}
query.tables.push("res_ruimte_opstelling");
query.tables.push("res_ruimte rr");
query.tables.push("res_alg_ruimte ra");
query.tables.push("alg_v_ruimte_gegevens_all rg");
query.tables.push("alg_district di");
query.tables.push("prs_perslid p");
query.tables.push("res_ruimte_opstelling");
query.tables.push("res_ruimte rr");
query.tables.push("res_alg_ruimte ra");
query.tables.push("alg_v_ruimte_gegevens_all rg");
query.tables.push("alg_district di");
query.tables.push("prs_perslid p");
var add_prs_restrict = prshasrestrict(autfunction);
if (add_prs_restrict)
query.tables.push("prs_v_afdeling_boom boom");
var add_prs_restrict = prshasrestrict(autfunction);
if (add_prs_restrict)
query.tables.push("prs_v_afdeling_boom boom");
query.wheres.push("res_rsv_ruimte.res_ruimte_opstel_key = res_ruimte_opstelling.res_ruimte_opstel_key(+)");
query.wheres.push("rr.res_ruimte_key(+) = ra.res_ruimte_key");
query.wheres.push("ra.res_ruimte_key(+) = res_ruimte_opstelling.res_ruimte_key");
query.wheres.push("rg.alg_ruimte_key = COALESCE(res_rsv_ruimte.alg_ruimte_key, ra.alg_ruimte_key)");
query.wheres.push("rg.alg_district_key = di.alg_district_key");
query.wheres.push("res_rsv_ruimte.res_rsv_ruimte_contact_key = p.prs_perslid_key");
if (add_prs_restrict)
query.wheres.push("boom.prs_afdeling_key = p.prs_afdeling_key");
query.wheres.push("res_rsv_ruimte.res_ruimte_opstel_key = res_ruimte_opstelling.res_ruimte_opstel_key(+)");
query.wheres.push("rr.res_ruimte_key(+) = ra.res_ruimte_key");
query.wheres.push("ra.res_ruimte_key(+) = res_ruimte_opstelling.res_ruimte_key");
query.wheres.push("rg.alg_ruimte_key = COALESCE(res_rsv_ruimte.alg_ruimte_key, ra.alg_ruimte_key)");
query.wheres.push("rg.alg_district_key = di.alg_district_key");
query.wheres.push("res_rsv_ruimte.res_rsv_ruimte_contact_key = p.prs_perslid_key");
if (add_prs_restrict)
query.wheres.push("boom.prs_afdeling_key = p.prs_afdeling_key");
var wheres = api2.sqlfilter(params, this);
query.wheres = query.wheres.concat(wheres);
var wheres = api2.sqlfilter(params, this);
query.wheres = query.wheres.concat(wheres);
query.wheres.push("res_rsv_ruimte_verwijder IS NULL");
query.wheres.push("res_rsv_ruimte_verwijder IS NULL");
var sql = "SELECT " + query.selects.join(", ")
+ " FROM " + query.tables.join(", ")
+ " WHERE " + query.wheres.join(" AND " );
var sql = "SELECT " + query.selects.join(", ")
+ " FROM " + query.tables.join(", ")
+ " WHERE " + query.wheres.join(" AND " );
if (!(params.filter.id > 0))
{
// Over het resultaat moet nog de 3D rasp, altijd
sql = discx3d (sql,
"rr.res_discipline_key",
"di.alg_regio_key",
"rg.alg_district_key",
"rg.alg_locatie_key",
"rg.alg_gebouw_key",
"rg.alg_verdieping_key",
"rg.alg_ruimte_key",
"boom.prs_bedrijf_key",
"boom.prs_afdeling_key",
autfunction,
"",
2,null,3
);
}
if (!(params.filter.id > 0))
{
// Over het resultaat moet nog de 3D rasp, altijd
sql = discx3d (sql,
"rr.res_discipline_key",
"di.alg_regio_key",
"rg.alg_district_key",
"rg.alg_locatie_key",
"rg.alg_gebouw_key",
"rg.alg_verdieping_key",
"rg.alg_ruimte_key",
"boom.prs_bedrijf_key",
"boom.prs_afdeling_key",
autfunction,
"",
2,null,3
);
}
sql += " ORDER BY res_rsv_ruimte.res_rsv_ruimte_key"; // Order by nodig voor includes
if (query.orderbys.length)
sql += ", " + query.orderbys.join(", ");
sql += " ORDER BY res_rsv_ruimte.res_rsv_ruimte_key"; // Order by nodig voor includes
if (query.orderbys.length)
sql += ", " + query.orderbys.join(", ");
var json = api2.sql2json (params, sql, this );
var json = api2.sql2json (params, sql, this );
return json;
};
return json;
};
function _analyze_fields(dbfields, params, jsondata) /* analyseer inkomende data, common voor PUT en POST */
/* res_ruimte+config wordt bijvoorbeeld omgezet in res_ruimte_opstel_key */
{
if ("resroom" in jsondata)
if ("resroom" in jsondata && jsondata.resroom)
{
var res_ruimte_key = parseInt(jsondata.resroom);
var res_opstel_key = -1;
@@ -220,8 +231,14 @@ function model_reservations(rsv_key, params)
}
else // moet er een alg_ruimte zijn
{
var sql = "SELECT alg_ruimte_key"
+ " FROM res_rsv_ruimte"
+ " WHERE res_rsv_ruimte_key = " + jsondata.id;
var oRs = Oracle.Execute(sql);
dbfields["room"] = { dbs: "alg_ruimte_key", typ: "key", val: oRs("alg_ruimte_key").Value };
oRs.Close();
// TODO
api2.error(500, "Missing room in input");
//api2.error(500, "Missing room in input");
// var res_disc_key = ...
// var soort = 1; // algemene ruimtes
}
@@ -256,178 +273,178 @@ function model_reservations(rsv_key, params)
};
this.REST_PUT = function (params, jsondata, the_key) /* update reservation */
{
var rsv_ruimte_key = the_key;
var this_res = res.func_enabled(rsv_ruimte_key);
user.auth_required_or_abort(this_res.canChange);
{
var rsv_ruimte_key = the_key;
var this_res = res.func_enabled(rsv_ruimte_key);
user.auth_required_or_abort(this_res.canChange);
var dbfields = api2.update_fields(params, this, jsondata); // Build updater
_analyze_fields(dbfields, params, jsondata);
_validate_fields(dbfields, params, jsondata);
var dbfields = api2.update_fields(params, this, jsondata); // Build updater
_analyze_fields(dbfields, params, jsondata);
_validate_fields(dbfields, params, jsondata);
var wheres = [" res_rsv_ruimte_key = " + rsv_ruimte_key];
var wheres = [" res_rsv_ruimte_key = " + rsv_ruimte_key];
// ons eigen tijdstip/zaal is mogelijk gewijzigd waardoor andere *dirty* reserveringen
// clean wordt. Even onze oude datum onthouden zodat we niet *alles* hoeven te controleren
// Ook even noshow onthouden
oRs = Oracle.Execute("SELECT res_reservering_key"
+ " , res_rsv_ruimte_van"
+ " , res_rsv_ruimte_tot"
+ " , res_rsv_ruimte_noshow"
+ " , res_rsv_ruimte_volgnr"
+ " FROM res_rsv_ruimte"
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key);
var reservering_key = oRs("res_reservering_key").Value;
var oldvan = new Date(oRs("res_rsv_ruimte_van").Value);
var oldtot = new Date(oRs("res_rsv_ruimte_tot").Value);
var oldnoshow = oRs("res_rsv_ruimte_noshow").Value == 1;
var volgnr = oRs("res_rsv_ruimte_volgnr").Value;
// ons eigen tijdstip/zaal is mogelijk gewijzigd waardoor andere *dirty* reserveringen
// clean wordt. Even onze oude datum onthouden zodat we niet *alles* hoeven te controleren
// Ook even noshow onthouden
oRs = Oracle.Execute("SELECT res_reservering_key"
+ " , res_rsv_ruimte_van"
+ " , res_rsv_ruimte_tot"
+ " , res_rsv_ruimte_noshow"
+ " , res_rsv_ruimte_volgnr"
+ " FROM res_rsv_ruimte"
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key);
var reservering_key = oRs("res_reservering_key").Value;
var oldvan = new Date(oRs("res_rsv_ruimte_van").Value);
var oldtot = new Date(oRs("res_rsv_ruimte_tot").Value);
var oldnoshow = oRs("res_rsv_ruimte_noshow").Value == 1;
var volgnr = oRs("res_rsv_ruimte_volgnr").Value;
var resUpd = buildTrackingUpdate("res_rsv_ruimte", 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_ruimte_dirty (" + rsv_ruimte_key + "); " // Zelf dirty geworden?
+ " res.set_ruimtes_clean (" + oldvan.toSQL() + "); " // Anderen 'clean' geworden
+ " res.follow_artikel (" + rsv_ruimte_key + ", " + oldvan.toSQL(true) + ", " + oldtot.toSQL(true) + "); " // catering mee verplaatsen
+ " res.follow_deel (" + rsv_ruimte_key + ", " + oldvan.toSQL(true) + ", " + oldtot.toSQL(true) + "); " // objecten mee verplaatsen
+ " res.follow_afspraak (" + rsv_ruimte_key + ", " + S("res_copy_to_bez") + "); " // bezoekers mee verplaatsen
+ check_fail_sql
+ "END;";
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
var restrack = api2.process_includes(params, this, jsondata, the_key);
// TODO: Tracking
// TODO: Bezoekers
// TODO: Flex
var flextrack = [];
//var result = saveBezoekers(afspr_key, -1, { urole: urole, loctimechanged: changed });
//if (result.beztrack && result.beztrack.length > 0)
//bezUpd.trackarray.push(result.beztrack.join("\n"));
res.trackreserveringupdate(rsv_ruimte_key, resUpd.trackarray.length || flextrack.length? L("lcl_res_is_resupdtrack").format(reservering_key + "/" + volgnr) + "\n" + resUpd.trackarray.concat(flextrack).join("\n") : null);
return { key: rsv_ruimte_key };
};
this.REST_POST = function (params, jsondata) /* new reservation */
{
params.isNew = true;
var dbfields = api2.update_fields(params, this, jsondata); // Build updater
_analyze_fields(dbfields, params, jsondata);
_validate_fields(dbfields, params, jsondata);
// Eerst een nieuw res_reservering record aanmaken
var resfields = { "id": { dbs: "res_reservering_key", typ: "key", seq: "res_s_res_reservering_key" },
"created": { dbs: "res_reservering_aanmaak", typ: "datetime", val: new Date() }
};
var resIns = buildInsert("res_reservering", resfields, { noValidateToken: true });
var reservering_key = resIns.sequences["res_reservering_key"];
var volgnr = 1;
Oracle.Execute(resIns.sql);
var host_key = user_key;
var contact_key = user_key;
if (user.has("WEB_RESFOF"))
{
if ("host" in jsondata)
host_key = jsondata.host;
if ("contact" in jsondata)
contact_key = jsondata.contact;
}
// Nu aan de slag met een res_rsv_ruimte record
dbfields["id"] = { dbs: "res_rsv_ruimte_key", typ: "key", seq: "res_s_res_rsv_ruimte_key" };
dbfields["reskey"] = { dbs: "res_reservering_key", typ: "key", val: reservering_key };
dbfields["sequence"] = { dbs: "res_rsv_ruimte_volgnr", typ: "number", val: volgnr };
dbfields["host"] = { dbs: "res_rsv_ruimte_host_key", typ: "key", val: host_key };
dbfields["contact"] = { dbs: "res_rsv_ruimte_contact_key", typ: "key", val: contact_key };
if (!jsondata.status)
dbfields["status"] = { dbs: "res_status_fo_key", typ: "key", val: S("res_default_fe_status_key") };
var resIns = buildInsert("res_rsv_ruimte", dbfields, { noValidateToken: true });
var rsv_ruimte_key = resIns.sequences["res_rsv_ruimte_key"];
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 "
+ resIns.sql + ";"
//+ deel_sql
+ " res.set_ruimte_dirty (" + rsv_ruimte_key + "); " // Zelf dirty geworden?
// set_ruimtes_clean hoeft niet: wij zijn nieuw en kunnen daarmee nooit een ander clean maken
+ check_fail_sql
+ "END;";
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
var restrack = api2.process_includes(params, this, jsondata, rsv_ruimte_key);
shared.trackaction("RESNEW", rsv_ruimte_key);
return { key: rsv_ruimte_key };
};
this.REST_DELETE = function (params, the_key) /* delete reservation */
{
// Sterk afgekeken van res_delete_save.asp. Die moet op termijn deze functie gaan
// gebruiken maar dan moet de auth_required_or_abort mogelijk weer iets 'zachter'
var cost_recharge = false; // TODO?
var rsv_ruimte_key = the_key;
var this_res = res.func_enabled(rsv_ruimte_key); // Wat mag ik op deze deelreservering
user.auth_required_or_abort(this_res.canDelete);
DeleteResAfspraak(rsv_ruimte_key);
// update ruimte
// equipment en articles are deleted automatically if the RES_RSV_RUIMTE is deleted
// Deze velden altijd opslaan
var dbfields = [ { dbs: "res_rsv_ruimte_opmerking", typ: "varchar", frm: "opmerk" },
{ dbs: "res_status_fo_key", typ: "key", val: (cost_recharge? 4 : 1) }, // status 1=optie, 4=vervallen
{ dbs: "res_rsv_ruimte_verwijder", typ: "sql", val: "SYSDATE" }
];
var sql = buildUpdate("res_rsv_ruimte", dbfields, { noValidateToken: true })
+ " res_rsv_ruimte_key = " + rsv_ruimte_key;
// ons eigen tijdstip/zaal is mogelijk gewijzigd waardoor andere *dirty* reserveringen
// clean wordt. Even onze oude datum onthouden zodat we niet *alles* hoeven te controleren
var oRs = Oracle.Execute("select res_rsv_ruimte_van,"
+ " res_rsv_ruimte_tot"
+ " from res_rsv_ruimte"
+ " where res_rsv_ruimte_key = " + rsv_ruimte_key);
var oldvan = new Date(oRs("res_rsv_ruimte_van").value);
var oldtot = new Date(oRs("res_rsv_ruimte_tot").value);
oRs.Close();
// Nu de echte update.
// Daarbij ook diverse controles/ updates uitvoeren op 'andere zaken'
sql = "BEGIN "
+ sql + ";"
var resUpd = buildTrackingUpdate("res_rsv_ruimte", 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_ruimte_dirty (" + rsv_ruimte_key + "); " // Zelf dirty geworden?
+ " res.set_ruimtes_clean (" + oldvan.toSQL() + "); " // Anderen 'clean' geworden
+ " res.follow_artikel (" + rsv_ruimte_key + ", " + oldvan.toSQL(true) + ", " + oldtot.toSQL(true) + "); " // catering mee verplaatsen
+ " res.follow_deel (" + rsv_ruimte_key + ", " + oldvan.toSQL(true) + ", " + oldtot.toSQL(true) + "); " // objecten mee verplaatsen
+ " res.follow_afspraak (" + rsv_ruimte_key + ", " + S("res_copy_to_bez") + "); " // bezoekers mee verplaatsen
+ check_fail_sql
+ "END;";
Oracle.Execute( sql );
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
shared.trackaction("RESDEL", rsv_ruimte_key);
var restrack = api2.process_includes(params, this, jsondata, the_key);
// En tenslotte eventueel de reservering zelf nog
sql = "UPDATE res_reservering "
+ " SET res_reservering_verwijder=SYSDATE"
+ " WHERE res_reservering_key="+this_res.res_reservering_key
+ " AND NOT EXISTS (SELECT *"
+ " FROM res_v_aanwezigrsv_ruimte"
+ " WHERE res_reservering_key=" + this_res.res_reservering_key + ")"
// TODO: Tracking
// TODO: Bezoekers
// TODO: Flex
var flextrack = [];
//var result = saveBezoekers(afspr_key, -1, { urole: urole, loctimechanged: changed });
//if (result.beztrack && result.beztrack.length > 0)
//bezUpd.trackarray.push(result.beztrack.join("\n"));
res.trackreserveringupdate(rsv_ruimte_key, resUpd.trackarray.length || flextrack.length? L("lcl_res_is_resupdtrack").format(reservering_key + "/" + volgnr) + "\n" + resUpd.trackarray.concat(flextrack).join("\n") : null);
Oracle.Execute( sql );
return { key: rsv_ruimte_key };
};
this.REST_POST = function (params, jsondata) /* new reservation */
{
params.isNew = true;
var dbfields = api2.update_fields(params, this, jsondata); // Build updater
_analyze_fields(dbfields, params, jsondata);
_validate_fields(dbfields, params, jsondata);
// Eerst een nieuw res_reservering record aanmaken
var resfields = { "id": { dbs: "res_reservering_key", typ: "key", seq: "res_s_res_reservering_key" },
"created": { dbs: "res_reservering_aanmaak", typ: "datetime", val: new Date() }
};
var resIns = buildInsert("res_reservering", resfields, { noValidateToken: true });
var reservering_key = resIns.sequences["res_reservering_key"];
var volgnr = 1;
Oracle.Execute(resIns.sql);
var host_key = user_key;
var contact_key = user_key;
if (user.has("WEB_RESFOF"))
{
if ("host" in jsondata)
host_key = jsondata.host;
if ("contact" in jsondata)
contact_key = jsondata.contact;
}
// Nu aan de slag met een res_rsv_ruimte record
dbfields["id"] = { dbs: "res_rsv_ruimte_key", typ: "key", seq: "res_s_res_rsv_ruimte_key" };
dbfields["reskey"] = { dbs: "res_reservering_key", typ: "key", val: reservering_key };
dbfields["sequence"] = { dbs: "res_rsv_ruimte_volgnr", typ: "number", val: volgnr };
dbfields["host"] = { dbs: "res_rsv_ruimte_host_key", typ: "key", val: host_key };
dbfields["contact"] = { dbs: "res_rsv_ruimte_contact_key", typ: "key", val: contact_key };
if (!jsondata.status)
dbfields["status"] = { dbs: "res_status_fo_key", typ: "key", val: S("res_default_fe_status_key") };
var resIns = buildInsert("res_rsv_ruimte", dbfields, { noValidateToken: true });
var rsv_ruimte_key = resIns.sequences["res_rsv_ruimte_key"];
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 "
+ resIns.sql + ";"
//+ deel_sql
+ " res.set_ruimte_dirty (" + rsv_ruimte_key + "); " // Zelf dirty geworden?
// set_ruimtes_clean hoeft niet: wij zijn nieuw en kunnen daarmee nooit een ander clean maken
+ check_fail_sql
+ "END;";
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
var restrack = api2.process_includes(params, this, jsondata, rsv_ruimte_key);
shared.trackaction("RESNEW", rsv_ruimte_key);
return { key: rsv_ruimte_key };
};
this.REST_DELETE = function (params, the_key) /* delete reservation */
{
// Sterk afgekeken van res_delete_save.asp. Die moet op termijn deze functie gaan
// gebruiken maar dan moet de auth_required_or_abort mogelijk weer iets 'zachter'
var cost_recharge = false; // TODO?
var rsv_ruimte_key = the_key;
var this_res = res.func_enabled(rsv_ruimte_key); // Wat mag ik op deze deelreservering
user.auth_required_or_abort(this_res.canDelete);
DeleteResAfspraak(rsv_ruimte_key);
// update ruimte
// equipment en articles are deleted automatically if the RES_RSV_RUIMTE is deleted
// Deze velden altijd opslaan
var dbfields = [ { dbs: "res_rsv_ruimte_opmerking", typ: "varchar", frm: "opmerk" },
{ dbs: "res_status_fo_key", typ: "key", val: (cost_recharge? 4 : 1) }, // status 1=optie, 4=vervallen
{ dbs: "res_rsv_ruimte_verwijder", typ: "sql", val: "SYSDATE" }
];
var sql = buildUpdate("res_rsv_ruimte", dbfields, { noValidateToken: true })
+ " res_rsv_ruimte_key = " + rsv_ruimte_key;
// ons eigen tijdstip/zaal is mogelijk gewijzigd waardoor andere *dirty* reserveringen
// clean wordt. Even onze oude datum onthouden zodat we niet *alles* hoeven te controleren
var oRs = Oracle.Execute("select res_rsv_ruimte_van,"
+ " res_rsv_ruimte_tot"
+ " from res_rsv_ruimte"
+ " where res_rsv_ruimte_key = " + rsv_ruimte_key);
var oldvan = new Date(oRs("res_rsv_ruimte_van").value);
var oldtot = new Date(oRs("res_rsv_ruimte_tot").value);
oRs.Close();
// Nu de echte update.
// Daarbij ook diverse controles/ updates uitvoeren op 'andere zaken'
sql = "BEGIN "
+ sql + ";"
+ " res.set_ruimte_dirty (" + rsv_ruimte_key + "); " // Zelf dirty geworden?
+ " res.set_ruimtes_clean (" + oldvan.toSQL() + "); " // Anderen 'clean' geworden
+ " res.follow_artikel (" + rsv_ruimte_key + ", " + oldvan.toSQL(true) + ", " + oldtot.toSQL(true) + "); " // catering mee verplaatsen
+ " res.follow_deel (" + rsv_ruimte_key + ", " + oldvan.toSQL(true) + ", " + oldtot.toSQL(true) + "); " // objecten mee verplaatsen
+ "END;";
Oracle.Execute( sql );
shared.trackaction("RESDEL", rsv_ruimte_key);
// En tenslotte eventueel de reservering zelf nog
sql = "UPDATE res_reservering "
+ " SET res_reservering_verwijder=SYSDATE"
+ " WHERE res_reservering_key="+this_res.res_reservering_key
+ " AND NOT EXISTS (SELECT *"
+ " FROM res_v_aanwezigrsv_ruimte"
+ " WHERE res_reservering_key=" + this_res.res_reservering_key + ")"
Oracle.Execute( sql );
}
if (rsv_key > 0)
{
params.filter = params.filter || {};