213 lines
11 KiB
PHP
213 lines
11 KiB
PHP
<% /*
|
||
$Revision$
|
||
$Id$
|
||
|
||
File: model_reservableequipment.inc
|
||
|
||
Description: reserveerbare delen model.
|
||
Parameters:
|
||
Context: Om vrije reserveerbare objecten te *zoeken*
|
||
Het beheren doe je via model_res_deel
|
||
|
||
Notes:
|
||
*/
|
||
|
||
%>
|
||
<!-- #include file="../Shared/discxalg3d.inc"-->
|
||
<%
|
||
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", 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" },
|
||
"object" : { dbs: "res_ins_deel_key", typ: "key", foreign: "ins_deel" },
|
||
"person" : { dbs: "res_prs_perslid_key", typ: "key", foreign: "prs_perslid" },
|
||
"catalog" : { dbs: "res_discipline_key", typ: "key", foreign: "res_discipline" },
|
||
"scope" : { dbs: "res_deel_alg_level", typ: "key", foreign: alg_level },
|
||
"expires" : { dbs: "res_deel_vervaldatum", typ: "date" },
|
||
"externnr": { dbs: "res_deel_externnr", typ: "varchar", readonly: !(user.has("WEB_FACTAB") || user.has("WEB_FACXNR")) },
|
||
"externsyncdate": { dbs: "res_deel_externsyncdate", typ: "datetime", readonly: !(user.has("WEB_FACTAB") || user.has("WEB_FACXNR")) }
|
||
},
|
||
// 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 <20><>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
|
||
}
|
||
}
|
||
%>
|