235 lines
12 KiB
PHP
235 lines
12 KiB
PHP
<% /*
|
||
$Revision$
|
||
$Id$
|
||
|
||
File: model_reservablerooms.inc
|
||
|
||
Description: Reservereerbare ruimtes model.
|
||
Parameters:
|
||
Context:
|
||
|
||
Notes: let op: dit bestand wordt gebruikt om ruimtes echt te gaan reserveren.
|
||
Het bestand model_res_ruimte is om reserveerbare ruimtes te beheren. Dat is wat heel anders.
|
||
// TODO: Koppelzalen?
|
||
// TODO: getQParamISODate moet niet hier maar in api_
|
||
|
||
http://uwva.5iwork/Branch541/api2/reservablerooms.json?apikey=APIPFO&pretty=1&location=71&include=occupations&freefrom=2014-05-06T11:00:00Z&freeto=2014-05-06T13:00:00Z
|
||
*/
|
||
|
||
%>
|
||
<!-- #include file="../Shared/discxalg3d.inc"-->
|
||
<!-- #include file="../Shared/flexfiles.inc"-->
|
||
<!-- #include file="model_reservableequipment.inc"-->
|
||
<!-- #include file="model_res_ruimte_opstelling.inc"-->
|
||
|
||
<%
|
||
var sqlcap = "(SELECT MAX (res_ruimte_opstel_bezoekers) bmax"
|
||
+ " FROM res_ruimte_opstelling"
|
||
+ " WHERE res_ruimte_opstelling.res_ruimte_key = res_ruimte.res_ruimte_key)";
|
||
|
||
function fnFrom (oRs, field, model)
|
||
{
|
||
var tijd = oRs(field.dbs).Value || S("res_t1");
|
||
return toTimeString(tijd);
|
||
}
|
||
function fnTo (oRs, field, model)
|
||
{
|
||
var tijd = oRs(field.dbs).Value || S("res_t2");
|
||
return toTimeString(tijd);
|
||
}
|
||
model_reservablerooms =
|
||
{
|
||
table: "res_ruimte",
|
||
primary: "res_ruimte_key",
|
||
records_name: "reservablerooms",
|
||
record_name: "reservableroom",
|
||
fields: {"id" : { dbs: "res_ruimte_key", typ: "key", filter: "exact", seq: "res_s_res_ruimte_key"},
|
||
"name" : { dbs: "res_ruimte_nr", typ: "varchar"},
|
||
"description": { dbs: "res_ruimte_omschrijving", typ: "varchar"},
|
||
"open" : { dbs: "res_ruimte_begintijd", typ: "time", val: fnFrom },
|
||
"close" : { dbs: "res_ruimte_eindtijd", typ: "time", val: fnTo },
|
||
"location" : { dbs: "alg_v_allonroerendgoed.alg_locatie_key", typ: "key", foreign: "alg_locatie", filter: "exact"},
|
||
"capacity" : { dbs: "dummy", typ: "varchar", sql: sqlcap },
|
||
"room" : { dbs: "res_alg_ruimte.res_alg_ruimte_key", typ: "key", foreign: "alg_ruimte"},
|
||
"catalog" : { "dbs": "res_discipline_key",
|
||
"label": L("res_discipline_key"),
|
||
"typ": "key",
|
||
"foreign": {
|
||
"tbl": "(select ins_discipline_key, ins_discipline_omschrijving\nfrom ins_tab_discipline\nwhere ins_discipline_verwijder is null\nand ins_discipline_module = 'RES'\nand ins_discipline_min_level = 3)",
|
||
"key": "ins_discipline_key",
|
||
"desc": "ins_discipline_omschrijving"
|
||
},
|
||
"filter": "exact",
|
||
"LOVinit": ""
|
||
},
|
||
"image" : { dbs: "res_ruimte_image", typ: "varchar" }
|
||
},
|
||
// advanced filter
|
||
filter: { prefunc: function _prefilterfunc(params)
|
||
{
|
||
if (typeof getQParamISODate == "undefined")
|
||
return null;
|
||
//__DoLog("getQParamISODate: " + getQParamISODate("res_van"));
|
||
var res_van = getQParamISODate("freefrom", null);
|
||
var res_tot = getQParamISODate("freeto", null);
|
||
var loc_key = parseInt(params.filter.location);
|
||
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_van = getQParamISODate("freefrom", null);
|
||
var res_tot = getQParamISODate("freeto", null); // TODO: Voorkomen dat het een andere dag is
|
||
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: {"reservableequipment": // Komt waarschijnlijk te vervallen: gebruik maar filter op model_reservableequipment
|
||
{ model: model_reservableequipment,
|
||
joinfield: "res_ruimte_key",
|
||
single_only: true, // Zodat je alleen de mogelijke objecten van <20><>n ruimte kunt opvragen (performance)
|
||
joinfunction: function (params) // Alleen objecten die zijn toegestaan in deze ruimte
|
||
{
|
||
var params = { res_ruimte_key : params.filter.id, // die is er dankzij single_only
|
||
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 ( params );
|
||
return "res_deel_key IN (" + sql + ")"
|
||
}
|
||
},
|
||
"configurations": { model: new model_res_ruimte_opstelling(),
|
||
joinfield: "res_ruimte_key"
|
||
},
|
||
"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
|
||
|
||
var params = { res_van: res_van,
|
||
res_tot: res_tot,
|
||
loc: loc_key,
|
||
authparams : user.checkAutorisation("WEB_RESUSE", null, null, true),
|
||
forSelectRoom: true
|
||
}
|
||
return res.plan_bezet_info(params); // wordt meegeven aan de volgende func
|
||
},
|
||
func: function _occupations(key, params, oRs, record, prefuncdata)
|
||
{
|
||
var occupied = prefuncdata[key] ;
|
||
if (!occupied)
|
||
return null;
|
||
|
||
var bezet_info = occupied;
|
||
// formatteren naar gewenste veldnamen
|
||
var result = [];
|
||
for (var bezet in bezet_info)
|
||
{
|
||
result.push({ from: bezet_info[bezet].res_van,
|
||
to: bezet_info[bezet].res_tot,
|
||
id: bezet_info[bezet].rsv_ruimte_key
|
||
});
|
||
}
|
||
//return bezet_info;
|
||
return result;
|
||
}
|
||
}
|
||
},
|
||
|
||
search: {
|
||
autosearch: true,
|
||
filters: ["name","description","location","catalog"]
|
||
},
|
||
|
||
_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_write < 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_ALGUSE" : "WEB_ALGMAN";
|
||
params.authparams = user.checkAutorisation(autfunction, null, null, true); // pessimistisch
|
||
|
||
// TODO: Add authorization
|
||
var query = api2.sqlfields(params, model_reservablerooms );
|
||
query.wheres.push(model_reservablerooms._autorized_discs_sql("res_discipline_key"));
|
||
|
||
query.tables.push("res_alg_ruimte");
|
||
|
||
query.wheres.push("res_ruimte_verwijder IS NULL");
|
||
query.wheres.push("res_alg_ruimte_verwijder IS NULL");
|
||
|
||
//query.wheres.push("(bez_afspraak_contact_key = " + user_key // Altijd fe vooralnog
|
||
// + " OR bez_afspraak_host_key = " + user_key + ")");
|
||
query.wheres.push("res_alg_ruimte.res_ruimte_key = res_ruimte.res_ruimte_key");
|
||
//query.wheres.push("bez_afspraak_datum BETWEEN SYSDATE - " + S("facilitiespast_bez") + " AND SYSDATE + " + S("facilitiesfuture_bez"));
|
||
|
||
query.tables.push("alg_v_allonroerendgoed");
|
||
query.wheres.push("alg_v_allonroerendgoed.alg_onroerendgoed_keys = res_alg_ruimte.alg_ruimte_key");
|
||
query.wheres.push("alg_v_allonroerendgoed.alg_type = 'R'");
|
||
|
||
var wheres = api2.sqlfilter(params, model_reservablerooms);
|
||
query.wheres = query.wheres.concat(wheres);
|
||
|
||
var sql = "SELECT " + query.selects.join(", ")
|
||
+ " FROM " + query.tables.join(", ")
|
||
+ " WHERE " + query.wheres.join(" AND " )
|
||
+ " ORDER BY res_ruimte_nr";
|
||
|
||
var json = api2.sql2json (params, sql, model_reservablerooms );
|
||
|
||
return json;
|
||
},
|
||
REST_PUT: function (params, jsondata, the_key) /* update reservablerooms */
|
||
{
|
||
abort_with_warning("Nog niet ondersteund");//
|
||
},
|
||
xxxREST_POST: function (params, jsondata, parent_key) /* new reservablerooms */
|
||
{
|
||
// Nog niet ondersteund
|
||
},
|
||
xxxRES_DELETE: function (params) /* delete reservablerooms */
|
||
{
|
||
// Nog niet ondersteund
|
||
}
|
||
}
|
||
%> |