<%@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 */ %> <% //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; } %>
<% FCLTHeader.Generate() %>
<% if (datepicker) // debugging { %>

<% FCLTcalendar("forDateTime", { label : "TEST met specifieke datum Reload", 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. }); %>

<% } 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); if (oRs.Eof) { Response.Write("
"); Response.Write(L("lcl_norespool")); Response.Write("
") Response.End; //shared.simpel_page(L("lcl_norespool") + "
"); } 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 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; } 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 (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(); } %>