<% /* $Revision$ $Id$ File: model_reservableequipment.inc Description: reserveerbare delen model. Parameters: Context: Notes: */ %> <% function alg_level(json) { var alg_level_id = json; var alg_level = ""; switch (alg_level_id) { case -1: alg_level = "Alles"; break; case 0: alg_level = "Regio"; break; case 1: alg_level = "District"; break; case 2: alg_level = "Locatie"; break; case 3: alg_level = "Gebouw"; break; case 4: alg_level = "Verdieping"; break; case 5: alg_level = "Ruimte"; break; default: UNKNOWN_FORMAT_TYPE; } return alg_level; } model_reservableequipment = { table: "res_deel", primary: "res_deel_key", records_name: "reservableequipment", record_name: "reservableequipment", fields: { "id" : { dbs: "res_deel_key", typ: "key", filter: "exact", seq: "res_s_res_deel_key" }, "name" : { dbs: "res_deel_omschrijving", typ: "varchar", filter: "like" }, "remark" : { dbs: "res_deel_opmerking", typ: "varchar", filter: "like" }, "unit" : { dbs: "res_deel_eenheid", typ: "varchar", filter: "like" }, "price" : { dbs: "res_deel_prijs", typ: "float", "iscurrency": true, filter: "like" }, "fixed" : { dbs: "res_deel_prijs_vast", typ: "check0", filter: "exact" }, "object" : { dbs: "res_ins_deel_key", typ: "key", foreign: "ins_deel" }, "catalog" : { dbs: "res_discipline_key", typ: "key", foreign: "res_discipline", filter: "exact" }, "scope" : { dbs: "res_deel_alg_level", typ: "key", foreign: alg_level }, "expires" : { dbs: "res_deel_vervaldatum", typ: "date" } }, // advanced filter filter: { prefunc: function _prefilterfunc(params) { return null; //__DoLog("getQParamISODate: " + getQParamISODate("res_van")); var res_room_key = getQParamInt("allowedinroom", -1); if (res_van && res_tot) { var params = {res_van: res_van, // TODO: Welke dag? res_tot: res_tot, loc: loc_key, // 71=alkw authparams : user.checkAutorisation("WEB_RESUSE", null, null, true), forSelectRoom: true } return res.plan_bezet_info(params); // wordt meegeven aan de volgende func } else return null; }, func: function _filterfunc(oRs, params, prefuncdata) { if (!prefuncdata) return true; var res_room_key = getQParamInt("allowedinroom", -1); var key = oRs("res_ruimte_key").Value; var occupations = prefuncdata[key] prev_end = res_van.setFloatHours(S("res_t1")); // TODO: per ruimte? for (var i in occupations) { var occu = occupations[i]; if (res_van < occu.res_tot && res_tot > occu.res_van) { return false; // Overlap } prev_end = occu.res_tot; } return true; } }, includes: { "occupations": { // prefunc om alles tegelijk op te halen prefunc: function _occupations(params) { var res_van = getQParamISODate("from", new Date()); var res_tot = getQParamISODate("to", res_van); //var loc_key = parseInt(params.filter.location); // 71=alkw // JGL: Eigenlijk wil ik hier res.plan_deel_bezet_info gaan gebruiken, // Die is echter zeer sterk gericht op het werken voor één // discipline tegelijk en dat durfde ik niet met 5.4.2b overhoop te halen // TODO: Nu ondersteunen we echter nog niet dat een ins_deel voor meerdere // res_delen gebruikt wordt (is wel mogelijk namelijk als dat // verschillende catalogi zijn) var sql = "SELECT rrd.res_rsv_deel_van" + " , rrd.res_rsv_deel_tot" + " , rd.res_deel_key" + " , rrd.res_rsv_deel_key" + " FROM res_v_aanwezigrsv_ruimte rr" + " , res_v_aanwezigdeel rd" + " , res_v_aanwezigrsv_deel rrd" + " WHERE rrd.res_rsv_deel_tot >= " + res_van.beginToSQL() + " AND rrd.res_rsv_deel_van <= " + res_tot.endToSQL() + " AND rrd.res_deel_key = rd.res_deel_key" + " AND rrd.res_rsv_ruimte_key = rr.res_rsv_ruimte_key" + " AND rd.res_discipline_key <> " + S("vis_parking_key") + " AND " + model_reservableequipment._autorized_discs_sql("rd.res_discipline_key"); var existing_res = {}; var oRs = Oracle.Execute(sql); while (!oRs.Eof) { var res_deel_key = oRs("res_deel_key").value; if (!existing_res[res_deel_key]) existing_res[res_deel_key] = []; var data = { id: oRs("res_rsv_deel_key").Value, from: new Date(oRs("res_rsv_deel_van").Value), to: new Date(oRs("res_rsv_deel_tot").Value) }; existing_res[res_deel_key].push(data); oRs.MoveNext(); } oRs.Close(); //if (params.filter.allowedinresroom) // params.res_ruimte_key = params.filter.allowedinresroom; return existing_res; // wordt meegeven aan de volgende func }, func: function _occupations(key, params, oRs, record, prefuncdata) { var ins_deel_key = key; //record.object.id; // Het is al in het goede formaat return prefuncdata[ins_deel_key] ; } } }, _autorized_discs_sql: function (field) { var urole = "fe"; // TODO: Moet echt niet ter zake doen var autfunction = urole == "fe"? "WEB_RESUSE" : "WEB_RESMAN"; var sql = field + " IN (" + " SELECT g.ins_discipline_key" + " FROM fac_v_webgebruiker g, fac_functie f " + " WHERE g.fac_functie_key = f.fac_functie_key " + " AND f.fac_functie_code = " + safe.quoted_sql(autfunction) + " AND g.fac_gebruiker_alg_level_read < 9" + " AND g.prs_perslid_key = " + user_key + " AND " + field + " = g.ins_discipline_key" // deze regel is redundant maar goed voor de performance + " )"; return sql; }, 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_reservableequipment); query.wheres.push("res_deel_verwijder IS NULL"); query.wheres.push(model_reservableequipment._autorized_discs_sql("res_deel.res_discipline_key")); var wheres = api2.sqlfilter(params, model_reservableequipment); query.wheres = query.wheres.concat(wheres); if (params.filter.allowedinresroom) { var rparams = { res_ruimte_key : params.filter.allowedinresroom, select_fields : "r.res_deel_key", //sdisc : p_sdisc, // TODO? group_by : " GROUP BY r.res_deel_key", autfunction : autfunction }; var sql = get_res_deel_sql ( rparams ); query.wheres.push("res_deel_key IN (" + sql + ")"); } var sql = "SELECT " + query.selects.join(", ") + " FROM " + query.tables.join(", ") + " WHERE " + query.wheres.join(" AND " ) + " ORDER BY res_deel_omschrijving"; var json = api2.sql2json (params, sql, model_reservableequipment); return json; }, xxxREST_PUT: function (params, jsondata, the_key) /* update reservable equipment */ { // Nog niet ondersteund }, xxxREST_POST: function (params, jsondata, parent_key) /* new reservable object */ { // Nog niet ondersteund }, DELETE: function (params) /* delete reservable object */ { // Nog niet ondersteund } } %>