Files
Facilitor/APPL/PDA/reservering_new_by_placetime.asp
Gijs Wassink b9d225e8d2 FCLT#63600: Titel in werkplek popup bevat & ipv &
svn path=/Website/branches/v2020.1/; revision=47898
2020-08-24 11:22:20 +00:00

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}'>&nbsp;</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>&nbsp;"+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>