Files
Facilitor/APPL/PDA/reservering_new.asp
Jos Groot Lipman 7d2b547596 Merge 2015.1 Gold B patches
svn path=/Website/trunk/; revision=25229
2015-05-19 11:36:23 +00:00

557 lines
22 KiB
Plaintext

<%@language = "javascript" %>
<% /*
$Revision$
$Id$
File: pda/reservering_new.asp
Description: Add reservering (Mobile version)
Parameters: rsv_ruimte_key voor bestaande deelreservering
rsv_ruimte_key=-1 voor nieuwe (deel)reservering
Note:
*/ %>
<% REGISTERMENU_Disable = true; %>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/calendar.inc" -->
<!-- #include file="../Shared/selector.inc" -->
<!-- #include file="../Shared/Suggest/plaatsFilter.inc" -->
<!-- #include file="../Shared/discxalg3d.inc" -->
<!-- #include file="../RES/res.inc" -->
<!-- #include file="../RES/res_plan_room.inc" -->
<!-- #include file="./mobile.inc" -->
<!-- #include file="./iface.inc" -->
<!-- #include file="../shared/data_recordset.inc" -->
<!-- #include file="./resultset_table.inc" -->
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="../shared/rater.inc" -->
<%
FCLTHeader.Requires({ js: ["./modernizr.custom.06495.js"] });
FCLTHeader.Requires({ js: ["jquery.timepicker-table.js"],
css: ["timePicker-table.css"] });
var urole = "fe";
var rsv_ruimte_key = getQParamInt("rsv_ruimte_key", -1);
var date_from = getQParamDate("date_from", null);
var date_to = getQParamDate("date_to", null);
var act_key = getQParamInt("act_key", -1);
var bez_cnt = getQParamInt("bez_cnt", null);
var loc_key = getQParamInt("loc_key", -1);
var res_ruimte_key = getQParamInt("res_ruimte_key",-1);
var qrc = getQParamInt("qrc", 0) != 0;
autfunction = ("WEB_RESUSE");
var authparams = user.checkAutorisation(autfunction);
var transitParam = buildTransitParam(["act_key", "date_from", "date_to", "bez_cnt", "loc_key", "loc_plaats", "res_ruimte_key"]);
var transitParamExtern = buildTransitParam(["date_from", "date_to", "bez_cnt", "loc_plaats"]);
var sql = "SELECT COALESCE(MIN(fac_gebruiker_alg_level_write), 9) writelevel"
+ " 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.prs_perslid_key = " + user_key;
var oRs = Oracle.Execute(sql);
var autlevel = oRs("writelevel").Value; // Pas op: kan ook '0' zijn (regio)
oRs.Close();
var subject = L("lcl_mobile_newreservering");
var curPage = 0;
if (rsv_ruimte_key == -1)
{
if (!date_from && res_ruimte_key==-1)
{
curPage = 1;
// geen parameters aanwezig.
var srtact = getQParamInt("srtact", 1); // Vooralsnog alleen ruimte reserveringen.
var sql = "SELECT res_srtactiviteit_metaantal"
+ " FROM res_srtactiviteit"
+ " WHERE res_srtactiviteit_key = " + srtact;
var oRs = Oracle.Execute(sql);
var toonBez = oRs("res_srtactiviteit_metaantal").value;
oRs.Close();
// default begin en eindtijd
var res_van = new Date().setFloatHours(S("res_t1") + 24, S("res_h")); // default morgen
var res_tot = res_van.addFloatHours(S("res_dur"), S("res_h"));
// Activiteiten
var sql_a = "SELECT a.res_activiteit_key"
+ " , " + "CASE WHEN sa.res_srtactiviteit_prefix IS NULL"
+ " THEN ''"
+ " ELSE sa.res_srtactiviteit_prefix || '-'"
+ " END"
+ " || "+ lcl.xsqla("a.res_activiteit_omschrijving", "a.res_activiteit_key")
+ " , a.res_activiteit_duur"
+ " , a.res_activiteit_omsverplicht"
+ " , a.res_activiteit_aantalverplicht"
+ " FROM res_activiteit a"
+ " , res_srtactiviteit sa"
+ " WHERE res_activiteit_verwijder IS NULL"
+ " AND a.res_srtactiviteit_key = sa.res_srtactiviteit_key"
+ " AND sa.res_srtactiviteit_key = " + srtact
+ " AND sa.res_srtactiviteit_soort = 0" // restype = "R"
+ " AND EXISTS (SELECT res_activiteit_key"
+ " FROM res_activiteitdiscipline rad,"
+ " ins_tab_discipline disc"
+ " , fac_v_my_disciplines md"
+ " WHERE rad.res_discipline_key = md.ins_discipline_key"
+ " AND md.prs_perslid_key = " + user_key
+ " AND md.fac_functie_code = " + safe.quoted_sql(autfunction)
+ " AND fac_gebruiker_alg_level_write < 9"
+ " AND fac_gebruiker_prs_level_write < 9"
+ " AND rad.res_discipline_key = disc.ins_discipline_key"
+ " AND rad.res_activiteit_key = a.res_activiteit_key"
+ " AND ins_discipline_verwijder IS NULL"
+ " AND ins_discipline_min_level = 3" // 1; Reserveerbaar object; 2; Verbruiksartikel; 3; Ruimte
+ " )"
+ " ORDER BY res_activiteit_volgnr"
+ " , sa.res_srtactiviteit_prefix"
+ " , UPPER(" + lcl.xsql('a.res_activiteit_omschrijving', 'a.res_activiteit_key') +")";
// Locaties (waar reserveerbare ruimten zijn binnen de scope van de user)
var filtClause = getFiltClauseLocatie("RES");
var sql_l = "SELECT l.alg_locatie_key"
+ ", " + S("alg_loc_string") + " naam"
+ ", alg_locatie_plaats"
+ " FROM alg_v_aanweziglocatie l"
+ filtClause.from
+ " WHERE 1=1"
+ filtClause.where
+ " ORDER BY 2";
};
if (date_from && res_ruimte_key==-1)
{
curPage = 2;
// verplicht: date_from: begin van reservering
// act_key: activiteit
// optioneel: bez_cnt: aantal bezoekers
// loc_key: locatie key
// res_tot: einde van reservering (niet meerdaags)
var params = { loc: loc_key,
loc_plaats: getQParam("loc_plaats", ""),
forSelectRoom: true,
res_van: date_from,
res_tot: date_to,
vis: bez_cnt,
activiteit_key: act_key,
with_satisfaction: true,
authparams: user.checkAutorisation("WEB_RESUSE", null, null, true), // urole == "fe" en pessimistisch.
ruimtecat: []
};
};
};
// Ik wil een reservering maken. Ik zie het volgende voor me:
//
// 1. Vraag een DATUM. Een datum is de minimale vereiste om te weten
// 2. Optioneel kunnen er nog waarden opgegeven worden die van invloed zijn op de mogelijkheden. Deze zijn:
// - capaciteit (hoeveel mensen moet er passen)
// - locatie/regio (waar precies/ongeveer)
// - begintijdstip (omstreeks)
//
// > Met die datum + filters vragen we kandidaatruimtes op aan de database (of via API)
//
// 3. De kandidaatruimtes worden getoond met voldoende info om een keuze te maken. Bijvoorbeeld
// - gegroepeerd per locaties (indien meer dan 1/niet opgegeven)
// - dan per ruimte een (1) vermelding rond het genoemde tijdstip
// - met vermelding Beschikbaar van X to Y
// ** indien Share&Meet: optie om het verzoek aan externe FACILITORs te vragen.
// 4. Met een keuze uit deze opties is veel bepaald:
// - ruimte
// - datum (was al)
// - aantal mensen (was al capaciteit, anders obv de default opstelling)
// en kan nog aangefpast worden:
// - tijd (de hele beschikbare periode)
// en is nog nodig en in te vullen:
// - een omschrijving en evt opmerking
// - [later?] flexkenmerken
// 5. Deze gegevens worden gesubmit tot een nieuwe reservering (via service)
%>
<html>
<head>
<% FCLTMHeader.Generate({title: subject }); %>
<script type="text/javascript">
function fn_res_next1()
{
if (!validateForm("res_new_1"))
return false;
var datum = $("#date_from").val();
var activiteit = $("#act_key").val();
var bezoekers = $("#bez_cnt").val();
var locatie = $("#loc_key").val();
var loc_plaats = $("#loc_plaats").val();
var purl = "?rsv_ruimte_key=-1"
+ "&date_from=" + datum
+ "&date_to=" + $("#date_to").val()
+ "&act_key=" + activiteit
+ (locatie > 0 ? "&loc_key=" + locatie : "")
+ (loc_plaats ? "&loc_plaats=" + escape(loc_plaats) : "")
+ (bezoekers ? "&bez_cnt=" + bezoekers : "")
+ "<%=safe.jsstring(transitParam)%>";
window.location.href = "reservering_new.asp" + purl;
}
function autosetEindtijd()
{
var opt = $("#act_key").find("option:selected");
// De extraParamValue is opgeslagen als text. De res_activiteit_duur is een float met mogelijk een komma i.p.v. een punt als decemaal scheidingsteken.
var res_duur = parseFloat((String(opt[0].getAttribute("res_activiteit_duur"))).replace(',','.'));
if (res_duur)
{
var startDate = new Date(parseInt($('#date_from').val()));
var endDate = new Date(parseInt($('#date_to').val()));
var estEndDate = startDate.addFloatHours(res_duur, <%=safe.jsfloat(S("res_h"))%>);
if (!isNaN(startDate) && endDate.getTime() != estEndDate.getTime())
{
$("#show_date_to").datepicker('setDate',new Date(estEndDate));
$("#date_to").val(estEndDate.getTime());
$("#time_from_date_to").val(toTimeString(estEndDate)).css("color", "red");
}
}
}
function checkVeldenVerplicht()
{
// Afhankelijk van de geselecteerde waarde voor activiteit
// moet het veld aantalbezoekers verplicht worden gemaakt.
var opt = $("#act_key").find("option:selected");
var bez_verplicht = opt[0].getAttribute("res_activiteit_aantalverplicht");
$("#bez_cnt").toggleClass("required", bez_verplicht == 1);
}
function OnChangeActivity()
{
checkVeldenVerplicht();
autosetEindtijd();
}
function changeLoc(elm)
{
var loc_key = $(elm).val();
if (loc_key > 0)
$('#loc_plaats').val($(elm).find('option:selected').attr('alg_locatie_plaats')).textinput('disable');
else
$('#loc_plaats').textinput('enable');
}
</script>
</head>
<body>
<div>
<%
if (curPage == 0)
{
PAGE_START({id: "page-0-"+rsv_ruimte_key});
HEADER({title: L("lcl_mobile_selectdatum"), back:!qrc, datatheme: (urole=='fe' ? jQFrontEndTheme : null) });
CONTENT_START();
ROFIELD("fld", "AjAi", "Verkeerde pagina");
CONTENT_END();
FOOTER();
PAGE_END();
}
if (curPage == 1)
{
PAGE_START({id: "page-1-"+rsv_ruimte_key});
HEADER({title: subject, back:!qrc, datatheme: (urole=='fe' ? jQFrontEndTheme : null) });
CONTENT_START();
%>
<form name="res_new_1" id="res_new_1">
<%
FCLTselector( "act_key",
sql_a,
{ label: L("lcl_activity"),
emptyOption: L("lcl_res_select_activity"),
extraParamValue: "res_activiteit_duur,res_activiteit_aantalverplicht",
required: true,
mobile: true,
onChange: "OnChangeActivity()"
}
);
FCLTcalendar("date_from",
{ label : L("lcl_from"),
datum: res_van,
maxPast: 0,
maxFuture: (S("res_fe_reservering_limiet") > 0? S("res_fe_reservering_limiet") : S("res_reservering_limiet")),
timeField: true,
timeStep: S("res_h") * 60,
startTime: S("res_t1"),
endTime: S("res_t2"),
res_dur: S("res_dur"),
required: true,
volgnr: 1,
mobile: true,
onChange : "autosetEindtijd()"
}
);
FCLTcalendar("date_to",
{ label : L("lcl_to"),
datum: res_tot,
maxFuture: (S("res_fe_reservering_limiet") > 0? S("res_fe_reservering_limiet") : S("res_reservering_limiet")),
timeField: true,
timeStep: S("res_h") * 60,
startTime: S("res_t1"),
endTime: S("res_t2"),
hidden: true, // Meerdaags ruimte ondersteunen we nog niet echt
required: true,
volgnr: 2,
mobile: true
}
);
if (toonBez)
RWFIELD("bez_cnt", L("lcl_visitors") , bez_cnt, {datatype: "number", required: false});
var loc_key = user.alg_locatie_key( { withcurrent:true });
var plaats = "";
if (loc_key > 0)
plaats = new Locatie(loc_key).alg_locatie_plaats();
var anyremote = res.anyremotes();
FCLTselector( "loc_key",
sql_l,
{ initKey: loc_key,
emptyOption: anyremote?L("lcl_shared_other"):null,
label: L("lcl_location"),
initEmpty: true,
mobile:true,
extraParamValue: "alg_locatie_plaats",
onChange: "changeLoc(this)"
}
);
if (anyremote)
RWFIELD("loc_plaats", "" , plaats, { html: 'disabled=1' });
CONTROLGROUP_START();
BUTTON(L("lcl_next"), {click: "fn_res_next1()", dataicon: "arrow-r", dataajax: "false"});
CONTROLGROUP_END();
%>
</form>
<%
CONTENT_END();
FOOTER();
PAGE_END();
}
if (curPage == 2) // Lijst met geschikte ruimtes
{
PAGE_START({id: "page-2-"+rsv_ruimte_key});
HEADER({title: subject, back:!qrc, datatheme: (urole=='fe' ? jQFrontEndTheme : null) });
CONTENT_START();
function fnDataFilter(oRs)
{
return oRs.Fields("will_fit").Value;
}
function fncolIcon(oRs)
{
var icon = "../Pictures/house_p.png";
if (oRs.Fields("image_url").Value != null)
{
icon = oRs.Fields("image_url").Value;
//if (!icon.match(/^http/))
// icon = S("res_image_path") + icon;
}
return icon;
}
function fncol1Link(oRs, processParams)
{
if (processParams && processParams.disc_key)
{
var deepurl = oRs.Fields("deepurl").Value;
deepurl += "&res_ruimte_key=" + oRs.Fields("res_ruimte_key").Value
+ "&bez_omschr=" + "Vanuit+extern+systeem" // TODO
//+ "&flex_defaults=" + escape(extern_flex);
var orghome = HTTP.urlzelf() + "/appl/pda/facilitor.asp";
var nurl = "../res/res_goto_extern.asp?res_disc_key=" + processParams.disc_key
+ "&deepurl=" + escape(deepurl + transitParamExtern + "&orghome=" + orghome); // extern kan niets met onze act_key
}
else
{
var nurl = "reservering.asp?rsv_ruimte_key=-1"
+ "&res_ruimte_key=" + oRs.Fields("res_ruimte_key").Value
+ transitParam;
}
return nurl;
};
function fnDetail(oRs)
{
// return toTimeString(dataregel.begintijd);
}
function fnHeader(oRs)
{
var txt = safe.html(oRs.Fields("res_ruimte_nr").Value);
if (oRs.Fields("satisfaction").Value)
{
var likesymbol = rater(oRs.Fields("satisfaction").Value, { readonly: true } );
txt += "<br>" + likesymbol;
}
return txt;
}
function fnSubheader(oRs)
{
// Toon extra gegevens over deze ruimte.
var bMin = oRs.Fields("bMin").Value;
var bMax = oRs.Fields("bMax").Value;
var capc_txt = String(bMin) + ((bMin!=bMax)?"-"+bMax:"") + " pers.";
if (oRs.Fields("prijs").Value)
capc_txt += ", " + S("currency_pref") + safe.curr(oRs.Fields("prijs").Value)
var txt = "<div class='listbodytext'>" + safe.html(capc_txt) + "</div>";
txt += "<div class='listbodytext'>" + safe.html(oRs.Fields("omschrijving").Value) + "</div>";
return txt;
/* // Voorlopig nog niet de beschikbare tijden laten zien.
var vrij = "";
var res_arr = dataregel.existing_res;
if (res_arr != null)
{
res_arr.sort(dynamicSort({col: "res_van", desc: false}));
var t1 = new Date(dataregel.begintijd);
var t2 = t1;
for (var ci=0; res_arr != null && ci < res_arr.length; ci++)
{
t2 = res_arr[ci].res_van;
if (ci==0)
{
t1 = new Date(t2.getTime());
t1.setHours(dataregel.begintijd,0,0,0);
}
if (t1 < t2)
{
vrij += toTimeString(t1) + " - " + toTimeString(t2) + "<br>";
t1 = res_arr[ci].res_tot;
}
}
t2 = new Date(t1.getTime());
t2.setHours(dataregel.eindtijd,0,0,0);
if (t1 < t2)
{
vrij += toTimeString(t1) + " - " + toTimeString(t2);
}
}
else
{
vrij = toTimeString(dataregel.begintijd) + " - " + toTimeString(dataregel.eindtijd);
}
return vrij;
*/
}
function dynamicSort(params)
{
params = params || {};
var sortOrder = (params.desc ? -1 : 1);
return function (a,b)
{
var result = (a[params.col] < b[params.col]) ? -1 : (a[params.col] > b[params.col]) ? 1 : 0;
return result * sortOrder;
}
}
var plan_rooms_info = res.plan_rooms_info(params);
var plan_bezet_info = res.plan_bezet_info(params);
set_will_fit(plan_rooms_info, plan_bezet_info, params)
var rst = new ResultsetTable({ dataset: plan_rooms_info
, fnDataFilter: fnDataFilter
, keyColumn: "res_ruimte_key"
, iconColumn: fncolIcon
, linkColumn: fncol1Link
, headerColumn: fnHeader
//, detailColumn: fnDetail
, subheaderColumn: fnSubheader
, dividerColumn: (loc_key == -1 ? "locatie" : "")
, ID: "restable"
, showAll: true
, noSearch: true
, emptySetString: L("lcl_empty")
});
var cnt = rst.processResultset();
// En nu de externen
var autfunction = "WEB_RESUSE"; // TODO
// Overzicht externe ruimtes
var sql = res.getremotes_sql(autfunction);
var oRs = Oracle.Execute(sql);
while( !oRs.eof )
{
var disc_key = oRs.Fields("ins_discipline_key").Value;
%>
<div class="resprodextern">
<%= L("lcl_res_extern_prefix") + Server.HTMLencode(oRs.Fields("ins_discipline_omschrijving").Value)%>
</div>
<%
var url = oRs.Fields("res_disc_params_remoteurl").Value + "&API=RESINFO";
var resparams = {
res_van: params.res_van,
res_tot: params.res_tot,
reg: -1,
dist: -1,
loc: -1,
bld: -1,
ver: -1,
rui: -1,
ruimtecat: []
};
resparams.alg_locatie_plaats = params.loc_plaats;// Aan de andere kant kennen we onze key niet, daarom via plaats.
resparams.request = "plan_rooms_info";
resparams.mobile = true;
/*global*/ plan_rooms_info = HTTP.getJSON(url, { data: resparams }).plan_rooms_info;
if (plan_rooms_info.length)
{
resparams.request = "plan_bezet_info";
/*global*/ plan_bezet_info = HTTP.getJSON(url, { data: resparams }).plan_bezet_info;
}
else
plan_bezet_info = {};
set_will_fit(plan_rooms_info, plan_bezet_info, resparams)
__Log("plan_rooms_info:")
__Log(plan_rooms_info)
rst.dataset = plan_rooms_info;
rst.sql = null;
rst.ID = "prodtable2";
var histogram = rst.processResultset({ disc_key: disc_key });
var allEmpty = allEmpty && (histogram == -1);
oRs.MoveNext();
}
oRs.close();
CONTENT_END();
FOOTER();
PAGE_END();
}
%>
</div>
</body>
</html>