403 lines
17 KiB
Plaintext
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 + " " + 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 + " " + 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>
|