Files
Facilitor/APPL/RES/res_bez_desk.asp
2016-08-16 14:53:33 +00:00

403 lines
17 KiB
Plaintext

<%@language = "javascript" %>
<% /*
$Revision$
$Id$
File: res_bez_desk.asp
Description: De pool-reserveringen interface
Parameters:
Context:
Note: LET OP: Die bestand maakt gebruik van data_recordset.
In plaats van oRs("veld_key").Value moet je
oRs.Fields("veld_key").Value doen
*/ %>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../shared/data_recordset.inc" -->
<!-- #include file="../shared/calendar.inc" -->
<!-- #include file="../Shared/resultset_table_v2.inc" -->
<%
//var res_room_key = getQParamInt("res_room_key", -1); // loket waar medewerker nu achter zit
FCLTHeader.Requires({plugins: ["jQuery"] });
var res_key = getQParamInt("key", -1);
var forDateTime = getQParamDate("forDateTime", new Date);
var datepicker = getQParamInt("datepicker", 0); // undocumented debug: show datepicker
if (datepicker)
{
FCLTHeader.Requires({ js: ["jquery.timepicker-table.js"],
css: ["timePicker-table.css"] });
}
var meekijken = false;
if (res_key > -1)
{
// Alleen meekijken als men WEB_RESMSU rechten heeft.
var resauthParams = user.checkAutorisation("WEB_RESMSU", false);
meekijken = true;
}
%>
<html>
<head>
<% FCLTHeader.Generate() %>
<script type="text/javascript">
function loket_oproepen(row)
{
$(row).addClass('dirty');
var bez_key = row.getAttribute("ROWKEY");
var data = { bez_key: bez_key };
protectRequest.dataToken(data);
$.post("res_bez_oproep.asp",
data,
FcltCallbackRefresh,
"json");
}
function loket_opnieuw_oproepen(row)
{
var bez_key = row.getAttribute("ROWKEY");
var data = { bez_key: bez_key, opnieuw: 1 };
protectRequest.dataToken(data);
$.post("res_bez_oproep.asp",
data,
FcltCallbackRefresh,
"json");
}
function next_oproepen(res_key)
{
var data = { res_key: res_key };
protectRequest.dataToken(data);
$.post("res_bez_oproep.asp",
data,
FcltCallbackRefresh,
"json");
}
function reload()
{
var url = "res_bez_desk.asp?key=<%=res_key%>";
if (<%=datepicker%> == 1)
{
url += "&datepicker=1&forDateTime=" + $("#forDateTime").val();
}
window.location.href = url;
}
setTimeout('reload()', <%=S("res_bez_desk_refresh")%> * 1000)
</script>
</head>
<body id="showbody">
<%
if (datepicker) // debugging
{
%><table><%
FCLTcalendar("forDateTime",
{ label : "TEST met specifieke datum <span onclick='reload()'><em>Reload</em></span>",
datum : forDateTime,
timeField: true,
timeStep : 15, // TODO: Is nog wel erg hard. Zie ook mld_edit_melding.js
startTime: 8,
endTime : 18
//trclass: "trenddate",
//addClass: (mld_melding.rsv_ruimte_key > 0? "mldres" : null) // Als de melding onder een reservering valt dan addClass toevoegen.
});
%></table><%
}
if (meekijken)
{
// Gebruiker met WEB_RESMSU rechten kan meekijken
var ressql = "SELECT " + res_key + " res_reservering_key"
+ " FROM DUAL";
}
else
{
// Alle ruimte reserveringen met (minstens) een deelreservering vandaag waar ik host ben
var ressql = "SELECT res_reservering_key"
+ " FROM res_v_aanwezigrsv_ruimte rrr "
+ " WHERE rrr.res_ruimte_opstel_key IS NOT NULL"
+ " AND rrr.res_rsv_ruimte_host_key = " + user_key
+ " AND res_rsv_ruimte_van BETWEEN " + forDateTime.toSQL() + " AND " + forDateTime.toSQL(true) + " + " + S("res_pool_early")/60/24
+ " AND res_rsv_ruimte_tot BETWEEN " + forDateTime.toSQL(true) + " - " + S("res_pool_late")/60/24 + " AND " + forDateTime.endToSQL();
//Oracle.Execute(sql);
}
// Alle deelreserveringen (vandaag) van bovenstaande reserveringen
// Bij een pool-reserering zullen de andere deelreserveringen voor andere contact's zijn
// We zijn vooral geintereseerd in de bezoekers
var sql = "SELECT rrr.res_reservering_key"
+ " , res_reservering_ispool"
+ " , rrr.res_rsv_ruimte_key"
+ " , rrr.res_rsv_ruimte_volgnr"
+ " , res_rsv_ruimte_van"
+ " , rrr.res_rsv_ruimte_tot"
+ " , res_rsv_ruimte_omschrijving"
+ " , " + lcl.xsqla('rr.res_ruimte_nr', 'rr.res_ruimte_key')
+ " , res_rsv_ruimte_host_key"
+ " , prs_perslid_naam_full"
+ " , bez_afspraak_naam"
+ " , bez_bezoekers_key"
+ " , bez_bezoekers_pasnr"
+ " , bez_bezoekers_done" // aangemeld bij receptie
+ " , bez_bezoekers_oproep" // opgeroepen
+ " , bez_bezoekers_out" // helemaal klaar
+ " , CASE"
+ " WHEN (rr.res_ruimte_vervaldatum IS NULL OR rr.res_ruimte_vervaldatum > rrr.res_rsv_ruimte_van)"
+ " THEN 1"
+ " ELSE 0"
+ " END verval"
+ " FROM res_ruimte rr, "
+ " res_ruimte_opstelling rro,"
+ " res_v_aanwezigrsv_ruimte rrr ,"
+ " res_reservering r ,"
+ " prs_v_perslid_fullnames p,"
+ " bez_afspraak a,"
+ " bez_actie ba,"
+ " bez_bezoekers bb"
+ " WHERE rrr.res_reservering_key = r.res_reservering_key"
+ " AND (res_reservering_ispool = 1 OR rrr.res_rsv_ruimte_host_key = " + user_key + ")"
+ " AND BITAND(COALESCE(bez_actie_flags, 1), 1) = 1" // Alleen oproepers, geen gewone reserveringen met afhaal bezoekers
+ " AND rr.res_ruimte_key = rro.res_ruimte_key"
+ " AND rro.res_ruimte_opstel_key = rrr.res_ruimte_opstel_key"
+ " AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key"
+ " AND rrr.res_rsv_ruimte_key = a.res_rsv_ruimte_key(+)" // bezoeker of afspraak hoeft niet te bestaan
+ " AND a.bez_afspraak_key = bb.bez_afspraak_key(+)"
+ " AND a.bez_actie_key = ba.bez_actie_key(+)"
+ " AND bb.bez_bezoekers_out IS NULL"
// Dit is nodig als de deelreserveringen van een POOL verschillende datums hebben. Dat kan
+ " AND res_rsv_ruimte_van BETWEEN " + forDateTime.toSQL() + " AND " + forDateTime.endToSQL()
+ " AND EXISTS (SELECT 1 FROM (" + ressql + ") res2"
+ " WHERE res2.res_reservering_key = rrr.res_reservering_key)"
+ " ORDER BY res_reservering_key, res_ruimte_nr, "
+ " bez_bezoekers_oproep DESC NULLS LAST, "
+ " bez_bezoekers_done NULLS LAST, "
+ " bez_afspraak_naam"; // Langst wachtende bezoeker bovenaan
// JGL: Bovenstaande ORDER BY werkt niet zoals ik wil: bezoekers die nog niet zijn opgeroepen
// worden nu gesorteerd per ruimte waar ze oorspronkelijk onder aangemeld zijn terwijl
// dat helemaal niet mag uitmaken. Ik kreeg het niet simpel in de order-by opgelost dus
// maar in show_freebezoekers
var oRs = Oracle.Execute(sql);
var prev_res_key = -1;
var prev_rsv_key = -1;
var prev_descr = "";
var loketten = []; // de loketten onder deze reservering (= deelreserveringen)
var freebezoekers = []; // nog niet opgeroepen bezoekers
var anyfound = false;
while (!oRs.Eof)
{
// Als het geen pool-reservering is en er zijn geen bezoekers dan heeft
// deze reservering niets te zoeken in dit scherm. Het was echter moeilijk
// in de SQL-query uit te sluiten (outer join op bezoekers als ispool, anders inner join)
if (!oRs("res_reservering_ispool").Value && !oRs("bez_bezoekers_key").Value)
{
oRs.MoveNext();
continue;
}
anyfound = true;
var res_key = oRs("res_reservering_key").Value;
var rsv_key = oRs("res_rsv_ruimte_key").Value;
var descr = L("lcl_res_desk_head").format(res_key,
oRs("res_rsv_ruimte_omschrijving").Value||"",
toTimeString(oRs("res_rsv_ruimte_van").Value),
toTimeString(oRs("res_rsv_ruimte_tot").Value));
if (prev_res_key != res_key)
{
// vorige freebezoekers afronden
if (prev_res_key > 0)
{
show_loketten(prev_res_key, prev_descr, loketten);
show_freebezoekers(prev_res_key, freebezoekers);
}
prev_res_key = res_key;
prev_descr = descr;
prev_rsv_key = -1;
freebezoekers = [];
loketten = [];
}
if (prev_rsv_key != rsv_key)
{
var data = { volgnr: oRs("res_rsv_ruimte_volgnr").Value,
ruimtenr: oRs("res_ruimte_nr").Value,
host: oRs("prs_perslid_naam_full").Value,
self: oRs("res_rsv_ruimte_host_key").Value == user_key,
oproep: oRs("bez_bezoekers_oproep").Value,
bez_key: oRs("bez_bezoekers_key").Value,
verval: oRs("verval").Value
}
// Bezoekers die binnen zijn maar nog niet opgeroepen kunnen toevallig aan
// ons loket gekoppeld zijn. Dan willen we ze nog niet tonen bij onze loket
if (oRs("bez_bezoekers_oproep").Value != null)
{
data.beznaam = oRs("bez_afspraak_naam").Value;
data.badge = oRs("bez_bezoekers_pasnr").Value;
data.aangemeld = oRs("bez_bezoekers_done").Value;
}
loketten.push(data);
prev_rsv_key = rsv_key;
}
if (oRs("bez_afspraak_naam").Value != null && oRs("bez_bezoekers_oproep").Value == null)
{
freebezoekers.push({ bez_key: oRs("bez_bezoekers_key").Value,
naam: oRs("bez_afspraak_naam").Value,
badge: oRs("bez_bezoekers_pasnr").Value,
aangemeld: oRs("bez_bezoekers_done").Value
});
}
oRs.MoveNext()
}
oRs.Close();
if (!anyfound)
{
Response.Write("<body class='simpelpage'>");
Response.Write(L("lcl_norespool"));
Response.Write("</body></html>")
Response.End;
//shared.simpel_page(L("lcl_norespool") + "<script>setTimeout('reload()', " + S("res_bez_desk_refresh")*1000 + ")</script>");
}
if (prev_res_key > 0)
{
show_loketten(prev_res_key, prev_descr, loketten);
show_freebezoekers(prev_res_key, freebezoekers);
}
function fnrowBezoekerEnabler(oRs)
{
return { eOproep: (!meekijken && oRs.Fields("aangemeld").Value != null)
}
}
function fnrowHerhaalEnabler(oRs)
{
var enableHerOproep = false;
if (oRs.Fields("self").Value)
enableHerOproep = (oRs.Fields("aangemeld").Value != null);
return { eHerOproep: enableHerOproep
}
}
function fnWacht(oRs)
{
if (oRs.Fields("oproep").Value == null)
return "";
var aangemeld = new Date(oRs.Fields("aangemeld").Value);
var oproep = new Date(oRs.Fields("oproep").Value);
var wachttijd = Math.floor((oproep - aangemeld) / 1000 / 60);
return wachttijd + "&nbsp;" + L("lcl_res_bez_minutes");
}
function fnInside(oRs)
{
if (oRs.Fields("oproep").Value == null)
return "";
var nu = new Date();
var oproep = new Date(oRs.Fields("oproep").Value);
var intijd = Math.floor((nu - oproep) / 1000 / 60);
return intijd + "&nbsp;" + L("lcl_res_bez_minutes");
}
function fnLoketRowClass (oRs)
{
if (oRs.Fields("self").Value)
return "bezPoolLoketself" + (oRs.Fields("verval").Value == 0? " res_fatal" : "");
else
return "bezPoolLoketother" + (oRs.Fields("verval").Value == 0? " res_fatal" : "");
}
function fnRuimtenr (oRs)
{
return oRs.Fields("ruimtenr").Value + (oRs.Fields("verval").Value == 0? L("lcl_inactive_data_suffix") : "");
}
function show_loketten(res_key, descr, loketten)
{
var buttons = [{ icon: "page_refresh.png", title: L("lcl_refresh"), action: "reload()" } ];
if (!meekijken) // Alleen de hosts kunnen bezoekers oproepen.
buttons.push({ icon: "sound.png", title: L("lcl_res_bez_oproepen"), action: "next_oproepen(" + res_key + ")" });
IFRAMER_HEADER(descr , buttons);
var rst = new ResultsetTable({ dataset: loketten,
keyColumn: "bez_key",
ID: "lokettable" + res_key,
rowClass: fnLoketRowClass,
rowActionEnabler: fnrowHerhaalEnabler,
noSetSummary: true,
noPrint:true,
noLoading: true // scrollbar verdwijnt anders?
});
rst.addColumn(new Column({caption:"#", content:"volgnr", align: "center" }));
rst.addColumn(new Column({caption: L("lcl_res_bez_loket"), content: fnRuimtenr }));
rst.addColumn(new Column({caption: L("lcl_host"), content:"host" }));
rst.addColumn(new Column({caption: L("lcl_res_bez_name"), content: "beznaam" }));
rst.addColumn(new Column({caption: L("lcl_res_bez_badgenr"), content: "badge" }));
rst.addColumn(new Column({caption: L("lcl_bez_done_date"), content: "aangemeld", datatype: "time" }));
rst.addColumn(new Column({caption: L("lcl_res_bez_wait"), content: fnWacht }));
rst.addColumn(new Column({caption: L("lcl_res_bez_called"), content: "oproep", hasActions: true, datatype: "time"}));
rst.addColumn(new Column({caption: L("lcl_res_bez_inside"), content: fnInside }));
rst.addAction({action: "loket_opnieuw_oproepen", caption: L("lcl_res_bez_opnieuw_oproepen"), enabler: "eHerOproep" });
rst.processResultset();
}
function fnBezRowClass (oRs)
{
if (oRs.Fields("aangemeld").Value != null)
return "bezPoolBinnen";
else
return "";
}
function show_freebezoekers(res_key, freebezoekers)
{
// Sorteren: langst wachtende bovenaan, daarbinnen op alfabet
function date_sort(dta, dtb)
{
if (dta != null) // Let op: dta is nog een OLEDB date en dan werkt if (dta) ... niet
{
if (dtb == null)
return -1;
else
return new Date(dta) - new Date(dtb)
}
else
if (dtb != null)
return 1;
}
function bez_sort(a, b)
{
if (a.aangemeld != null || b.aangemeld != null)
return date_sort(a.aangemeld, b.aangemeld);
return a.naam > b.naam?1:-1;
}
freebezoekers.sort(bez_sort);
IFRAMER_HEADER(L("lcl_res_desk_expected"), []);
var rst = new ResultsetTable({ dataset: freebezoekers,
keyColumn: "bez_key",
ID: "freebeztable" + res_key,
noSetSummary: true,
rowClass: fnBezRowClass,
rowActionEnabler: fnrowBezoekerEnabler,
noPrint:true,
noLoading: true, // scrollbar verdwijnt anders?
emptySetString: "" // Doen we zelf verderop
});
rst.addColumn(new Column({caption: L("lcl_res_bez_name"), content:"naam" }));
rst.addColumn(new Column({caption: L("lcl_bez_done_date"), content: "aangemeld", datatype: "time"}));
rst.addColumn(new Column({caption: L("lcl_res_bez_badgenr"), content:"badge", hasActions: true}));
rst.addAction({action: "loket_oproepen", caption: L("lcl_res_bez_oproepen"), enabler: "eOproep" });
rst.processResultset();
}
%>
</body>
</html>