489 lines
20 KiB
Plaintext
489 lines
20 KiB
Plaintext
<%@ language="javascript"%>
|
|
<% /*
|
|
$Revision$
|
|
$Id$
|
|
|
|
File: res_rsv_deel_by_placetime.asp MOBILE version (DELEN MOETEN NOG GESHARED WORDEN)
|
|
Description: Alternatieve interface om (eenvoudig) een resereerbaar deel en tijd te kunnen kiezen
|
|
zoals een werkplekobject (als flexplek)
|
|
Parameters: res_disc: required de res_discipline van de objecten
|
|
geb_key: optioneel voorgeselecteerd gebouw
|
|
resdate: optioneel voorgeselecteerde datum
|
|
x ins_key: optioneel voorgeselecteerd object
|
|
x res_key: optioneel voorgeselecteerd reseerveerbaar object
|
|
|
|
en verder wat sturings- en overrule-parameters zoals hieronder genoemd
|
|
Context: -
|
|
Note: -
|
|
|
|
*/%>
|
|
<!-- #include file="../Shared/common.inc" -->
|
|
<!-- #include file="../res/res.inc" -->
|
|
<!-- #include file="./mobile.inc" -->
|
|
<!-- #include file="./iface.inc" -->
|
|
<!-- #include file="./resultset_table.inc" -->
|
|
<!-- #include file="../res/res_rsv_deel_by_placetime.inc" -->
|
|
<%
|
|
FCLTHeader.Requires({ js: [rooturl+"/appl/pda/modernizr-3.3.0.custom.min.js"] });
|
|
|
|
var res_disc_key = getQParamInt("res_disc"); // required, misschien default uit Setting?
|
|
|
|
// Dit werkt alleen voor res_deel-catalogi, dat checken we maar gelijk even
|
|
var sql = "SELECT "+lcl.xsqla("rdis.ins_discipline_omschrijving", "rdis.ins_discipline_key")
|
|
+ " FROM res_discipline rdis"
|
|
+ " WHERE ins_discipline_min_level = 1 "
|
|
+ " AND ins_discipline_key = " + res_disc_key;
|
|
oRs = Oracle.Execute(sql)
|
|
if (!oRs.eof)
|
|
var catalogusnaam = oRs("ins_discipline_omschrijving").Value;
|
|
else
|
|
{
|
|
Response.Write("No, this is an inappropriate value for parameter res_disc")
|
|
Response.End;
|
|
}
|
|
oRs.close();
|
|
|
|
var authparams = user.checkAutorisation("WEB_RESUSE", false, res_disc_key);
|
|
|
|
var geb_key = getQParamInt("geb_key", -1);
|
|
var floor_key = getQParamInt("floor_key", -1);
|
|
|
|
var res_deel_key = getQParamInt("res_deel_key", -1); // unused. Zou ooit direct naar dag+intervalselectie kunnen
|
|
var thema_key = getQParamInt("thema_key", -1);
|
|
var themaI_key = getQParamInt("themaI_key", -1);
|
|
|
|
var gebouwimage_flex_key = getQParamInt("gebouwimage_flex_key", null); // tijdelijk alternatief voor alg_gebouw_image
|
|
|
|
var daylimit = getQParamInt("daylimit", 12); // na daylimit kun je voor de eerste dag niet meer reserveren, default 12:00, werkt niet icm offset
|
|
var afternoon = new Date().getHours() >= daylimit;
|
|
var dateoffset = getQParamInt("offset", afternoon?1:0); // 12:00 default morgen ipv vandaag
|
|
var datelimit = getQParamInt("limit", 7); // aantal te kiezen dagen tov offset
|
|
var floorselect = getQParamInt("floorselect", 0); // na gebouw ook de verdiepingen laten kiezen
|
|
|
|
var resdate = getQParamDate("date", null); // hoe geef je zelf een date mee?
|
|
|
|
var dagcapaciteit = getQParamInt("capaciteit", 9); // aantal uren beschikbaar per dag tbv berekening van globale vulling
|
|
var minimumbeschikbaarheid = getQParamInt("minbes", 1.1); // minder dan zoveel uur beschikbaar beschouwen we onbeschikbaar
|
|
var onlyfree = getQParamInt("onlyfree", 1); // moeten bezette werkplekken wel (0) of niet (1) (onklikbaar) getoond worden in de lijst
|
|
|
|
var transitParam = buildTransitParam(["res_disc", "geb_key", "date", "onlyfree", "floorselect", "thema_key", "themaI_key"]);
|
|
|
|
var qrc = getQParamInt("qrc", 0) != 0;
|
|
|
|
%>
|
|
<html>
|
|
<head>
|
|
<% FCLTMHeader.Generate(); %>
|
|
<style>
|
|
li.beschikb0 i.fa {
|
|
color: #E50012;
|
|
}
|
|
li.beschikb10 i.fa {
|
|
color: #FF8504;
|
|
}
|
|
.beschikb50 a img {
|
|
outline: 4px solid #A5D200;
|
|
}
|
|
li.beschikb50 i.fa{
|
|
color: #A5D200;
|
|
}
|
|
li.beschikb100 i.fa {
|
|
color: #0AAA32;
|
|
}
|
|
li.vrijweekend i.fa, li.vrijedag i.fa {
|
|
color: #eee;
|
|
}
|
|
</style>
|
|
<script>
|
|
// shows the floorplan
|
|
function plan(verdieping_key, res_disc_key, thema_key, themaI_key, res_van)
|
|
{
|
|
window.location.href = "<%=rooturl%>/appl/pda/res_plattegrond.asp?verdieping_key=" + verdieping_key + "&res_disc=" + res_disc_key + "&thema_key=" + thema_key + "&themaI_key=" + themaI_key + "&res_van=" + res_van;
|
|
}
|
|
</script>
|
|
</head>
|
|
|
|
<body><div>
|
|
<%
|
|
// geleend uit mld_fe_menu
|
|
// Zoekt een plaatje onder S("alg_image_path") met fallback naar ../Pictures
|
|
// TODO: alg_image_path bestaat pas vanaf 2020.2, kunnen we hier op een of andere manier toch een foto doen?
|
|
|
|
var fso = Server.CreateObject("Scripting.FileSystemObject");
|
|
function findImage(filename)
|
|
{
|
|
// Iets met fac_bijlagen_key die je opgehaald hebt met behulp van de kenmerk_key
|
|
// en dan iets met BijlagenStream om het plaatje op te halen
|
|
filename = safe.filename(filename);
|
|
if (fso.FileExists(Server.MapPath(S("mlds_image_path")) + "/" + filename))
|
|
return S("mlds_image_path") + filename;
|
|
if (fso.FileExists(Server.MapPath("../Pictures/") + "/" + filename))
|
|
return "../Pictures/" + filename;
|
|
return "";
|
|
}
|
|
// toont afbeelding, ondersteunt ook fontawesome icons en doet vraagtekens bij onbekend opzijnkop bij filenotfound
|
|
function showImage (img, cls)
|
|
{
|
|
if (!img)
|
|
return "<i class='fa fa-fw femenu fa-building {0}'> </i>".format(cls);
|
|
if (img.match(/^fa-/))
|
|
return "<i class='fa fa-fw femenu {0} {1}'></i>".format(cls, img);
|
|
|
|
// een echt plaatje. Merk op dat deze pas bij openklappen worden geladen, vandaar thesrc ipv src
|
|
var newimg = findImage(img);
|
|
if (!newimg)
|
|
return "<i class='fa fa-fw fa-question fa-rotate-180 {0}' title='{1}'></i>".format(cls, safe.htmlattr(img));
|
|
else
|
|
return "<img class='{0}' thesrc='{1}'>".format(cls, safe.htmlattr(newimg));
|
|
}
|
|
|
|
var buttons = [];
|
|
|
|
// KIES GEBOUW INDIEN NOG NIET BEKEND
|
|
if (geb_key == -1)
|
|
{
|
|
PAGE_START({id: "page-1", pclass: "reservering-new"});
|
|
HEADER({title: L("lcl_beschikbaarheid_by_bld").format(catalogusnaam), back:!qrc, home:!qrc});
|
|
CONTENT_START();
|
|
|
|
var sql = rdpt.mijn_verdiepingen_met_resdelen_sql(res_disc_key, -1, authparams.ALGwritelevel,dateoffset, gebouwimage_flex_key);
|
|
|
|
function fnSubmit(oRs)
|
|
{
|
|
return "?geb_key="+ oRs("alg_gebouw_key").Value + safe.jsstring(transitParam);
|
|
}
|
|
function fnGebouwIcon(oRs)
|
|
{
|
|
var icon = "fa-building";
|
|
if (oRs.Fields("alg_gebouw_image").Value != null)
|
|
{
|
|
icon = oRs.Fields("alg_gebouw_image").Value;
|
|
if (!icon.match(/^http/))
|
|
icon = safe.htmlattr(S("res_image_path") + "deel/" + icon);
|
|
//icon = S("res_image_path") + icon;
|
|
}
|
|
else if (gebouwimage_flex_key != null)
|
|
{
|
|
var sql_bld_afb = "SELECT fac_bijlagen_key"
|
|
+ " FROM fac_bijlagen"
|
|
+ " WHERE fac_bijlagen_refkey = " + oRs("alg_gebouw_key").Value
|
|
+ " AND fac_bijlagen_module = 'ALG'"
|
|
+ " AND fac_bijlagen_kenmerk_key = " + gebouwimage_flex_key
|
|
+ " AND fac_bijlagen_verwijder IS NULL";
|
|
oRs_bld_afb = Oracle.Execute(sql_bld_afb);
|
|
// take the first image
|
|
if (!oRs_bld_afb.eof)
|
|
{
|
|
var icon = protectQS.create(HTTP.urlzelf() + "/appl/shared/BijlagenStream.asp"
|
|
+ "?bijlagen_key=" + oRs_bld_afb("fac_bijlagen_key").Value + "&module=ALG");
|
|
}
|
|
oRs_bld_afb.close();
|
|
}
|
|
return icon;
|
|
}
|
|
|
|
var rst = new ResultsetTable({ sql: sql
|
|
, keyColumn: "alg_gebouw_key"
|
|
, linkColumn: fnSubmit
|
|
, singleLink: true
|
|
, headerColumn: "alg_gebouw_naam"
|
|
, subheaderColumn: "alg_locatie_plaats"
|
|
, detailColumn: "alg_locatie_plaats"
|
|
, iconColumn: fnGebouwIcon
|
|
, ID: "resgebtable"
|
|
, showAll: true
|
|
, emptySetString: L("lcl_empty")
|
|
});
|
|
|
|
var cnt = rst.processResultset();
|
|
|
|
CONTENT_END();
|
|
FOOTER();
|
|
PAGE_END();
|
|
} // geb_key
|
|
|
|
|
|
// KIES DATUM VOOR GEGEVEN GEBOUW INDIEN NOG NIET BEKEND
|
|
// dat kan natuurlijk ook met een calendar, maar we willen extra info en kleuren tonen
|
|
if (geb_key>0 && resdate == null)
|
|
{
|
|
sql = "SELECT g.alg_gebouw_werkdagen, alg_gebouw_naam "
|
|
+ " FROM alg_gebouw g"
|
|
+ " WHERE g.alg_gebouw_key = " + geb_key;
|
|
oRs = Oracle.Execute(sql)
|
|
var alleenwerkdagen = oRs("alg_gebouw_werkdagen").Value;
|
|
var gebouw_naam = oRs("alg_gebouw_naam").Value;
|
|
oRs.close();
|
|
|
|
PAGE_START({id: "page-2", pclass: "reservering00"});
|
|
HEADER({title: L("lcl_beschikbaarheid_by_day").format(gebouw_naam), back:true, home:!qrc, datatheme: jQFrontEndTheme });
|
|
CONTENT_START();
|
|
// Bepaal het aantal items in dit gebouw
|
|
var sql = rdpt.aantal_resdelen_in_gebouw_sql(res_disc_key, geb_key, -1);
|
|
var oRs = Oracle.Execute(sql)
|
|
var aantalitems = oRs("aantal").Value;
|
|
oRs.close();
|
|
var gebouwcapaciteit = aantalitems * dagcapaciteit; // in uren
|
|
|
|
sql = rdpt.dagbezetting_resdelen_in_gebouw_sql(res_disc_key, geb_key, -1, dateoffset, datelimit, null);
|
|
|
|
function fnrowClassD(oRs)
|
|
{
|
|
var bcls ="";
|
|
if (oRs("vrijedag").value > 0)
|
|
bcls += "vrijedag";
|
|
else if (alleenwerkdagen && (oRs("weekdag").value == 1 || oRs("weekdag").value == 7))
|
|
{
|
|
bcls += " vrijweekend";
|
|
}
|
|
else
|
|
{
|
|
bcls += rdpt.bezettings_class(oRs("gevuld").value, dagcapaciteit*aantalitems, minimumbeschikbaarheid*aantalitems);
|
|
}
|
|
return bcls;
|
|
}
|
|
|
|
function fnBeschikbaarheid(oRs)
|
|
{
|
|
var txt = "";
|
|
if (oRs("vrijedag").value == 0 && (!alleenwerkdagen ||(alleenwerkdagen && (oRs("weekdag").value != 1 && oRs("weekdag").value != 7))))
|
|
{
|
|
var beschikbaarheid = ((1 - (oRs("gevuld").Value/gebouwcapaciteit))*100).toFixed(0); // 0..100
|
|
txt = L("lcl_res_dagbeschikbaarpct")+" "+beschikbaarheid+"%";
|
|
}
|
|
else
|
|
{
|
|
if (oRs("vrijedag").value > 0) txt += L("mld_vrije_dagen")+" ";
|
|
if (oRs("weekdag").value == 1 || oRs("weekdag").value == 7)
|
|
{
|
|
if (alleenwerkdagen)
|
|
txt += L("lcl_res_weekend");
|
|
}
|
|
}
|
|
return txt
|
|
}
|
|
function fnDetail (oRs)
|
|
{
|
|
return "";
|
|
}
|
|
function fnDagIcon(oRs)
|
|
{
|
|
return "fa-calendar fa-2x";
|
|
}
|
|
|
|
function fncolDatum(oRs)
|
|
{
|
|
return toDateString(oRs.Fields("datum").Value);
|
|
}
|
|
function fnSubmitD(oRs)
|
|
{
|
|
if (oRs("vrijedag").value == 0 && (!alleenwerkdagen ||(alleenwerkdagen && (oRs("weekdag").value != 1 && oRs("weekdag").value != 7))))
|
|
return "?date="+ (new Date(oRs("datum").Value).getTime()) + safe.jsstring(transitParam);
|
|
else
|
|
return "";
|
|
}
|
|
|
|
var rst = new ResultsetTable({ sql: sql
|
|
, keyColumn: "datum"
|
|
, linkColumn: fnSubmitD
|
|
, singleLink: true
|
|
, headerColumn: fncolDatum
|
|
, subheaderColumn: fnBeschikbaarheid
|
|
, detailColumn: fnDetail
|
|
, iconColumn: fnDagIcon
|
|
, rowClass: fnrowClassD
|
|
, ID: "datetable"
|
|
, showAll: true
|
|
, emptySetString: L("lcl_empty")
|
|
});
|
|
|
|
var cnt = rst.processResultset();
|
|
|
|
CONTENT_END();
|
|
FOOTER();
|
|
PAGE_END();
|
|
} // resdate
|
|
|
|
|
|
// 3. KIES VERDIEPING INDIEN GEWENST EN NOG NIET BEKEND
|
|
if (resdate && floorselect == 1 && geb_key > -1 && floor_key == -1)
|
|
{
|
|
sql = "SELECT alg_gebouw_naam "
|
|
+ " FROM alg_gebouw g"
|
|
+ " WHERE g.alg_gebouw_key = " + geb_key;
|
|
oRs = Oracle.Execute(sql)
|
|
var gebouw_naam = oRs("alg_gebouw_naam").Value;
|
|
oRs.close();
|
|
|
|
|
|
PAGE_START({id: "page-2b", pclass: "reservering00"});
|
|
HEADER({title: L("lcl_beschikbaarheid_by_flr").format(catalogusnaam,gebouw_naam)+" "+toDateString(resdate), back:true, home:!qrc, datatheme: jQFrontEndTheme });
|
|
CONTENT_START();
|
|
|
|
var sql = rdpt.mijn_verdiepingen_met_resdelen_sql(res_disc_key, geb_key, authparams.ALGwritelevel,dateoffset);
|
|
|
|
function fnSubmitF(oRs)
|
|
{
|
|
return "?floor_key="+ oRs("alg_verdieping_key").Value + safe.jsstring(transitParam);
|
|
}
|
|
function fnAantal(oRs)
|
|
{
|
|
return oRs("aantal").value + " " + catalogusnaam;
|
|
}
|
|
function fnFloorIcon(oRs)
|
|
{
|
|
return "fa-list fa-2x";
|
|
}
|
|
// Onderstaande 2 functies hebben dezelfde berekening nodig, die vrij duur is, dat wil je optimaliseren
|
|
// Omdat het aantal regels beperkt is (<25, vaker minder) doe ik het toch maar zo
|
|
function fnrowClassF(oRs)
|
|
{
|
|
var bcls= "";
|
|
var sql2 = rdpt.dagbezetting_resdelen_in_gebouw_sql(res_disc_key, geb_key, oRs("alg_verdieping_key").value, dateoffset, datelimit, resdate);
|
|
oRs2 = Oracle.Execute(sql2)
|
|
bcls += rdpt.bezettings_class(oRs2("gevuld").value, dagcapaciteit*oRs("aantal").value, minimumbeschikbaarheid*oRs("aantal").value);
|
|
oRs2.close();
|
|
return bcls; // te duur
|
|
}
|
|
|
|
function fnBeschikbaarheidF(oRs)
|
|
{
|
|
var txt = "";
|
|
var vloercapaciteit = oRs("aantal").value * dagcapaciteit; // in uren
|
|
var sql2 = rdpt.dagbezetting_resdelen_in_gebouw_sql(res_disc_key, geb_key, oRs("alg_verdieping_key").value, dateoffset, datelimit, resdate);
|
|
oRs2 = Oracle.Execute(sql2)
|
|
var beschikbaarheid = ((1 - (oRs2("gevuld").Value/vloercapaciteit))*100).toFixed(0); // 0..100
|
|
oRs2.close();
|
|
txt = L("lcl_res_dagbeschikbaarpct")+" "+beschikbaarheid+"%";
|
|
return txt
|
|
}
|
|
|
|
var rst = new ResultsetTable({ sql: sql
|
|
, keyColumn: "alg_verdieping_key"
|
|
, linkColumn: fnSubmitF
|
|
, singleLink: true
|
|
, headerColumn: "alg_verdieping_omschrijving"
|
|
, detailColumn: fnAantal
|
|
, subheaderColumn: fnBeschikbaarheidF
|
|
, rowClass: fnrowClassF
|
|
, iconColumn: fnFloorIcon
|
|
, ID: "resflrtable"
|
|
, showAll: true
|
|
, emptySetString: L("lcl_empty")
|
|
});
|
|
|
|
var cnt = rst.processResultset();
|
|
|
|
CONTENT_END();
|
|
FOOTER();
|
|
PAGE_END();
|
|
|
|
|
|
} // floor_key
|
|
|
|
|
|
|
|
|
|
// ALS JE HIER BENT, WEET JE EEN GEBOUW(A) EN EEN DATUM(B)
|
|
// DAN WILLEN WE VERDER TOT EEN RES_DEEL_KEY en concrete van/tot-tijden
|
|
if (resdate && geb_key > 0)
|
|
{
|
|
sql = "SELECT alg_gebouw_naam"
|
|
+ " FROM alg_v_aanweziggebouw"
|
|
+ " WHERE alg_gebouw_key = " + geb_key;
|
|
oRs = Oracle.Execute(sql)
|
|
var gebouw_naam = oRs("alg_gebouw_naam").Value;
|
|
oRs.Close();
|
|
|
|
PAGE_START({id: "page-3", pclass: "reservering00"});
|
|
HEADER({title: catalogusnaam+" "+gebouw_naam+" "+toDateString(resdate), back:true, home:!qrc });
|
|
CONTENT_START();
|
|
if (floor_key > -1 && themaI_key > -1 && thema_key > -1)
|
|
{
|
|
var sql = "SELECT COUNT (*) tekeningen"
|
|
+ " FROM cad_tekening t, alg_v_aanwezigverdieping v "
|
|
+ " WHERE t.alg_verdieping_key = v.alg_verdieping_key "
|
|
+ " AND cad_tekening_verwijder IS NULL "
|
|
+ " AND v.alg_verdieping_key = " + floor_key;
|
|
var oRs = Oracle.Execute(sql);
|
|
var aantaltekeningen = oRs("tekeningen").Value;
|
|
oRs.Close();
|
|
if (aantaltekeningen > 0)
|
|
{
|
|
CONTROLGROUP_START();
|
|
BUTTON(L("lcl_prs_wp_fgraph"), {click: 'plan(' + floor_key + ', ' + res_disc_key + ', ' + thema_key + ', ' + themaI_key + ', ' + (new Date(resdate).getTime()) + ');', dataicon: "eye"});
|
|
CONTROLGROUP_END();
|
|
}
|
|
}
|
|
|
|
// bepaal de dicipline-afhankelijke reserveringsintervallen
|
|
bloktijden = res.getBloktijden(res_disc_key, resdate);
|
|
|
|
function fncolSubHeader(oRs)
|
|
{
|
|
var res = rdpt.getIntervalString(oRs("res_deel_key").value, resdate, bloktijden);
|
|
if (res =="")
|
|
res = "";//L("lcl_res_interval_nietbeschikbaar");
|
|
else
|
|
res = "<div class='listbodytext'><i class='fa fa-calendar'></i> "+res+"</div>";
|
|
return "<div class='listbodykop'>"+oRs("alg_verdieping_omschrijving").Value+ "</div>"+res;
|
|
}
|
|
|
|
function fnrowClassRD(oRs)
|
|
{
|
|
return rdpt.bezettings_class(oRs("bezet").value, dagcapaciteit, minimumbeschikbaarheid);
|
|
}
|
|
function fnResDeelIcon(oRs)
|
|
{
|
|
var icon = "";
|
|
if (oRs.Fields("res_deel_image").Value != null)
|
|
{
|
|
icon = oRs.Fields("res_deel_image").Value;
|
|
if (!icon.match(/^http/))
|
|
icon = safe.htmlattr(S("res_image_path") + "deel/" + icon);
|
|
}
|
|
else
|
|
{
|
|
icon = "fa-square fa-2x";
|
|
}
|
|
return icon;
|
|
}
|
|
|
|
function fnPlaats(oRs)
|
|
{
|
|
return oRs("plaats").value+" "+oRs("alg_ruimte_omschrijving").value;
|
|
}
|
|
function fnSubmitRD(oRs)
|
|
{
|
|
if (oRs("bezet").value < dagcapaciteit - minimumbeschikbaarheid)
|
|
return "../pda/reserveringen.asp?qrc="+(qrc?1:0)+"&res_deel_key=" + oRs("res_deel_key").Value + "&res_van="+(new Date(resdate).getTime())
|
|
else
|
|
return "";
|
|
}
|
|
|
|
// Per item (werkplek) in dit gebouw hoeveel er die dag bezet is
|
|
sql = rdpt.res_deel_bezetting_op_dag_sql(res_disc_key, geb_key, floor_key, resdate, (onlyfree ? dagcapaciteit - minimumbeschikbaarheid : null));
|
|
|
|
var rst = new ResultsetTable({ sql: sql
|
|
, keyColumn: "res_deel_key"
|
|
, linkColumn: fnSubmitRD
|
|
, singleLink: true
|
|
, headerColumn: "res_deel_omschrijving"
|
|
, detailColumn: fnPlaats
|
|
, subheaderColumn: fncolSubHeader
|
|
, iconColumn: fnResDeelIcon
|
|
, ID: "datetable"
|
|
, rowClass: fnrowClassRD
|
|
, showAll: true
|
|
});
|
|
|
|
var cnt = rst.processResultset();
|
|
CONTENT_END();
|
|
FOOTER();
|
|
PAGE_END();
|
|
}
|
|
%>
|
|
</div>
|
|
</body>
|
|
</html>
|