DLLG#90075 tijdszone-ondersteuning voor werkplekreserveringen

svn path=/Website/branches/v2025.4/; revision=70900
This commit is contained in:
2025-11-11 16:01:15 +00:00
parent 216424c3ca
commit 6639d638e5
21 changed files with 727 additions and 336 deletions

View File

@@ -132,7 +132,7 @@ BLOCK_END();
BLOCK_START("facFM", L("lcl_operations_block"), {icon: "fa-users-cog"});
manRWFIELD("loc_volgnr", "fld", L("lcl_alg_locatie_volgnr"), loc_volgnr, {maxlength: 3});
// FCLTtimezoneselector("alg_tz", { initVal: alg_tz }); -> 2025.4
FCLTtimezoneselector("alg_tz", { initVal: alg_tz });
FCLTcalendar("vervaldatum",
{ datum: vervaldatum,
initEmpty: vervaldatum==null,

View File

@@ -109,6 +109,20 @@ if (geb_key == -1 && floor_key != -1) {
geb_key = oRs("alg_gebouw_key").value;
oRs.Close();
}
var multi_tz = Session("time_zone") != S("fac_server_timezone"); // Hebben we te maken met een gebouw, gebruiker of server in een afwijkende tijdszone?
if (!multi_tz) {
var sql = "SELECT l.alg_locatie_timezone"
+ " FROM alg_locatie l, alg_gebouw g"
+ " WHERE g.alg_gebouw_key = " + geb_key
+ " AND g.alg_locatie_key = l.alg_locatie_key";
var oRs = Oracle.Execute(sql);
var alg_tz = !oRs.EOF && oRs("alg_locatie_timezone").Value
|| S("fac_server_timezone");
oRs.Close();
multi_tz = alg_tz != Session("time_zone");
}
var hidenav = getQParamInt("hidenav", 0); // optie: toon geen floornavigator
var fac_usrrap_key = getQParamInt("fac_usrrap_key", S("fg_infobordreport_key")); // In de core is een default usrrap (res_v_rap_infobordframe) met key <12> gedefinieerd
@@ -404,7 +418,7 @@ var /*global*/ resizeTimerID=null;
Response.Write("<h2 class='floorscreen'>" + safe.html(oRs("alg_gebouw_naam").value) + "</h2>");
if (datumfilter)
{
Response.Write("<h2 class='infodatumfilter'>" + toDateString(datumfilter, false, true) + "</h2>");
Response.Write("<h2 class='infodatumfilter'>" + toDateString(datumfilter, { pretty: !multi_tz }) + "</h2>");
if (showmode == 0)
{
Response.Write("<button onclick='to2D()'>2D</button'><button onclick='to3D()'>3D</button>");

View File

@@ -325,6 +325,17 @@ function generateHeader()
<% if (Application("otap_environment") == "O") { %>
<a href='./fac_StreamFile.asp?logger=0' target='_blank'><button id='loggingshow'>Open logging</button></a>
<% } %>
<div id="tzwarning" style="background-color:#f88;padding:2px"></div>
<script>
var usertimezone = "<%=safe.jsstring(user.timezone())%>";
var browsertimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
if (usertimezone && usertimezone != browsertimezone)
{
$(function () {
$("#tzwarning").text("Let op: Windows tijdzone (" + browsertimezone + ") is anders dan Facilitor tijdzone (" + usertimezone + ")");
});
}
</script>
</div>
<%
}

View File

@@ -237,7 +237,7 @@ function fnrowClass(oRs)
var bostatuskey = oRs.Fields("bo_status_key").Value;
// visuele hint voor de actualiteit
if (lthisdate.toDateString() == lnow.toDateString())
if (lthisdate.toDateString() == lnow.toDateString()) // Dit is een rare, voor reserveringen is dit een datum in de TZ van de locatie, voor de rest de TZ van de user ..
lclass += " today";
else if (xmlnode != "melding" && xmlnode != "bestelling") // die lopen gewoon, reserveringen en afspraken zijn voorbij of toekomstig, en delen, ach.
{
@@ -295,6 +295,24 @@ function fnrowClass(oRs)
return lclass;
}
function fnDatum (oRs) {
var val = oRs("datum").Value;
if (oRs("xmlnode").Value == "reservering") { // Deze zijn al in de lokale tijdszone
return toDateTimeString(val, { isLocal: true });
} else {
return toDateTimeString(val, { pretty: true });
}
}
function fnDatumEind(oRs) {
var val = oRs("datum_eind").Value;
if (oRs("xmlnode").Value == "reservering") { // Deze zijn al in de lokale tijdszone
return toDateTimeString(val, { isLocal: true });
} else {
return toDateTimeString(val, { pretty: true, noMidnight: true });
}
}
%>
<html>
<head>
@@ -424,7 +442,7 @@ function fnrowClass(oRs)
if ((faclist_columns & 2) == 2)
rst.addColumn(new Column({caption: (outputmode == 0 ? I("fa-bell", { fastyle: "far" }) : L("lcl_mld_actiecode")), content: fnMark, align: "center", colName: "fnMark"}));
if ((faclist_mode & 1) == 1)
rst.addColumn(new Column({caption: L("lcl_myfacilities_date"), content: "datum", datatype: "datetime", prettydate: true }));
rst.addColumn(new Column({caption: L("lcl_myfacilities_date"), content: fnDatum, datatype: "datetime" }));
rst.addColumn(new Column({caption: L("lcl_faciliteit"), content: fncolType, colName: "fncolType"}));
rst.addColumn(new Column({caption: L("lcl_descr"), content: "detail"}));
if ((faclist_columns & 4) == 4)
@@ -437,7 +455,7 @@ function fnrowClass(oRs)
if (urole == "fo" || (urole == "fe" && S("fac_flags_visible_for_fe") == 1))
rst.addColumn(new Column({caption: L("lcl_fac_extra1"), content: fnExtra1, colName: "fnExtra1"}));
if ((faclist_columns & 16) == 16)
rst.addColumn(new Column({caption: L("lcl_myfacilities_enddate"), content: "datum_eind", datatype: "datetime", prettydate: true, nomidnight: true}));
rst.addColumn(new Column({caption: L("lcl_myfacilities_enddate"), content: fnDatumEind, datatype: "datetime" }));
if ((faclist_columns & 32) == 32)
rst.addColumn(new Column({caption: L("lcl_place"), content: "plaats"}));
if (S("facilities_flike_past") >= 0)

View File

@@ -218,6 +218,14 @@ function fac_list_query (params)
if (params.showreservering)
{
var S_fac_server_timezone = S("fac_server_timezone");
function toLocalDate(expr) {
return "CAST ("
+ "FROM_TZ (CAST ( " + expr + " AS TIMESTAMP), " + safe.quoted_sql(S_fac_server_timezone) + ")"
+ " AT TIME ZONE COALESCE (l.alg_locatie_timezone, " + safe.quoted_sql(S_fac_server_timezone) + ") AS DATE)";
}
// Todo; Today Session("time_zone") <> SYSDATE?
clausesArr.push(
"SELECT rr.res_rsv_ruimte_host_key prs_perslid_key" // 1 Host ruimtereservering
+ " , TO_CHAR (rr.res_reservering_key) || '/' || rr.res_rsv_ruimte_volgnr item"
@@ -228,8 +236,8 @@ function fac_list_query (params)
+ " , 'reservering' xmlnode"
+ " , " + lcl.xsql("ra.res_activiteit_omschrijving", "ra.res_activiteit_key") + " subtype"
+ " , '5' soort"
+ " , rr.res_rsv_ruimte_van datum"
+ " , rr.res_rsv_ruimte_tot datum_eind"
+ " , " + toLocalDate("rr.res_rsv_ruimte_van") + " datum"
+ " , " + toLocalDate("rr.res_rsv_ruimte_tot") + " datum_eind"
+ " , rr.res_rsv_ruimte_omschrijving detail"
+ " , COALESCE (rr.res_rsv_ruimte_omschrijving, (SELECT "+ lcl.xsql('ra.res_activiteit_omschrijving', 'ra.res_activiteit_key')
+ " FROM res_activiteit ra "
@@ -245,8 +253,20 @@ function fac_list_query (params)
+ " , ra.res_activiteit_image image"
+ sqlRecentdatum('rr.res_rsv_ruimte_key','reservering')
+ " FROM res_v_aanwezigrsv_ruimte rr"
+ " , res_activiteit ra "
+ " , res_activiteit ra "
+ " , res_ruimte_opstelling rro"
+ " , res_alg_ruimte rar"
+ " , alg_ruimte r"
+ " , alg_verdieping v"
+ " , alg_gebouw g"
+ " , alg_locatie l"
+ " WHERE ra.res_activiteit_key = rr.res_activiteit_key"
+ " AND rro.res_ruimte_key = rar.res_ruimte_key"
+ " AND rar.alg_ruimte_key = r.alg_ruimte_key"
+ " AND r.alg_verdieping_key = v.alg_verdieping_key"
+ " AND v.alg_gebouw_key = g.alg_gebouw_key"
+ " AND g.alg_locatie_key = l.alg_locatie_key"
+ " AND rr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key"
+ " AND rr.res_ruimte_opstel_key IS NOT NULL" // alleen reserveerbare ruimte
+ " AND (rr.res_rsv_ruimte_tot > SYSDATE - " + S("facilitiespast_res") + " AND rr.res_rsv_ruimte_van < SYSDATE + " + S("facilitiesfuture") + ")"
+ (params.specific_day
@@ -265,8 +285,8 @@ function fac_list_query (params)
+ " , 'reservering' xmlnode"
+ " , " + lcl.xsql("ra.res_activiteit_omschrijving", "ra.res_activiteit_key") + " subtype"
+ " , '7' soort"
+ " , rr.res_rsv_ruimte_van datum"
+ " , rr.res_rsv_ruimte_tot datum_eind"
+ " , " + toLocalDate("rr.res_rsv_ruimte_van") + " datum"
+ " , " + toLocalDate("rr.res_rsv_ruimte_tot") + " datum_eind"
+ " , rr.res_rsv_ruimte_omschrijving oms"
+ " , COALESCE (rr.res_rsv_ruimte_omschrijving, (SELECT "+ lcl.xsql('ra.res_activiteit_omschrijving', 'ra.res_activiteit_key')
+ " FROM res_activiteit ra "
@@ -282,10 +302,18 @@ function fac_list_query (params)
+ " , ra.res_activiteit_image image"
+ sqlRecentdatum('rr.res_rsv_ruimte_key','reservering')
+ " FROM res_v_aanwezigrsv_ruimte rr"
+ " , res_v_aanwezigrsv_deel dd"
+ " , res_deel rd "
+ " , res_activiteit ra "
+ " , res_v_aanwezigrsv_deel dd"
+ " , res_deel rd "
+ " , res_activiteit ra "
+ " , alg_ruimte r"
+ " , alg_verdieping v"
+ " , alg_gebouw g"
+ " , alg_locatie l"
+ " WHERE rr.res_status_bo_key IS NULL AND dd.res_rsv_ruimte_key = rr.res_rsv_ruimte_key"
+ " AND r.alg_verdieping_key = v.alg_verdieping_key"
+ " AND v.alg_gebouw_key = g.alg_gebouw_key"
+ " AND g.alg_locatie_key = l.alg_locatie_key"
+ " AND r.alg_ruimte_key = rr.alg_ruimte_key"
+ " AND rr.alg_ruimte_key IS NOT NULL" // niet in reserveerbare ruimte
+ " AND ra.res_activiteit_key = rr.res_activiteit_key"
+ " AND rd.res_deel_key = dd.res_deel_key"
@@ -303,8 +331,8 @@ function fac_list_query (params)
+ " , 'reservering' xmlnode"
+ " , " + lcl.xsql("ra.res_activiteit_omschrijving", "ra.res_activiteit_key") + " subtype"
+ " , '9' soort"
+ " , rr.res_rsv_ruimte_van datum"
+ " , rr.res_rsv_ruimte_tot datum_eind"
+ " , " + toLocalDate("rr.res_rsv_ruimte_van") + " datum"
+ " , " + toLocalDate("rr.res_rsv_ruimte_tot") + " datum_eind"
+ " , rr.res_rsv_ruimte_omschrijving oms"
+ " , COALESCE (rr.res_rsv_ruimte_omschrijving, (SELECT "+ lcl.xsql('ra.res_activiteit_omschrijving', 'ra.res_activiteit_key')
+ " FROM res_activiteit ra "
@@ -319,10 +347,18 @@ function fac_list_query (params)
+ " , (CASE WHEN res_rsv_artikel_approved = 1 THEN NULL ELSE res_rsv_artikel_approved END) mark" // 1 = alles akkoord: geen aanduiding
+ " , ra.res_activiteit_image image"
+ sqlRecentdatum('rr.res_rsv_ruimte_key','reservering')
+ " FROM res_v_aanwezigrsv_ruimte rr"
+ " FROM res_v_aanwezigrsv_ruimte rr"
+ " , res_v_aanwezigrsv_artikel dd"
+ " , res_activiteit ra "
+ " , res_activiteit ra "
+ " , alg_ruimte r"
+ " , alg_verdieping v"
+ " , alg_gebouw g"
+ " , alg_locatie l"
+ " WHERE rr.res_status_bo_key IS NULL AND dd.res_rsv_ruimte_key = rr.res_rsv_ruimte_key "
+ " AND r.alg_verdieping_key = v.alg_verdieping_key"
+ " AND v.alg_gebouw_key = g.alg_gebouw_key"
+ " AND g.alg_locatie_key = l.alg_locatie_key"
+ " AND r.alg_ruimte_key = rr.alg_ruimte_key"
+ " AND rr.alg_ruimte_key IS NOT NULL" // niet in reserveerbare ruimte
+ " AND ra.res_activiteit_key = rr.res_activiteit_key"
+ " AND (rr.res_rsv_ruimte_tot > SYSDATE - " + S("facilitiespast_res") + " AND rr.res_rsv_ruimte_van < SYSDATE + " + S("facilitiesfuture") + ")"

View File

@@ -163,8 +163,8 @@ var eindLevel;
</td>
</tr>
<% }
ROFIELDTR("datefrom", L("lcl_period_from"), toDateString(vandate, false, false, true), { suppressEmpty: true});
ROFIELDTR("dateto", L("lcl_period_to"), toDateString(totdate, false, false, true), { suppressEmpty: true});
ROFIELDTR("datefrom", L("lcl_period_from"), toDateString(vandate), { suppressEmpty: true});
ROFIELDTR("dateto", L("lcl_period_to"), toDateString(totdate), { suppressEmpty: true});
ROFIELDTR("fld", L("lcl_mes_send_date_time"), toDateTimeString(action_datum));
BLOCK_END();
BLOCK_START("msgPrs", L("lcl_msg_groep"), {icon: "fa-users"});

View File

@@ -138,9 +138,9 @@ function fac_list(days_in_the_future)
return "<div class='listbodykop'>"
+ "<div>" + I("fa-clock") + "&nbsp;"
+ (specific_day
? toTimeString(oRs.Fields("datum").Value)
: toDateTimeString(oRs.Fields("datum").Value, false, false, true))
+ "-" + toTimeString(oRs.Fields("datum_eind").Value) + "</div>"
? toTimeString(oRs.Fields("datum").Value, { isLocal: true })
: toDateTimeString(oRs.Fields("datum").Value, { isLocal: true }))
+ "-" + toTimeString(oRs.Fields("datum_eind").Value, { isLocal: true }) + "</div>"
+ (oRs.Fields("plaats").Value ? "<div>" + I("fa-map-marker") + "&nbsp;" + oRs.Fields("plaats").Value + "</div>" : "")
+ "</div>";
},

View File

@@ -55,9 +55,31 @@ if (rsv_ruimte_key > -1)
// BESTAANDE DEELRESERVERING
res.res_set_dialect(rsv_ruimte_key);
var this_res = res.func_enabled(rsv_ruimte_key); // Wat heb ik zoal aan rechten op deze specifieke reservering
var local_tz = res.getRsvTimezone(rsv_ruimte_key);
if (this_res.canChange) {
this_res.canChange = local_tz == S("fac_server_timezone");
}
user.auth_required_or_abort(this_res.canReadAny);
sql = "SELECT * FROM res_rsv_ruimte WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
sql = "SELECT res_ruimte_opstel_key"
+ " , prs_kostenplaats_key"
+ " , res_rsv_ruimte_bezoekers"
+ " , res_status_fo_key"
+ " , res_rsv_ruimte_flag"
+ " , res_activiteit_key"
+ " , res_reservering_key"
+ " , res_rsv_ruimte_volgnr"
+ " , res_rsv_ruimte_van"
+ " , res_rsv_ruimte_tot"
+ " , " + convertToLocalTimeSQL("res_rsv_ruimte_van", local_tz) + " local_van"
+ " , " + convertToLocalTimeSQL("res_rsv_ruimte_tot", local_tz) + " local_tot"
+ " , res_rsv_ruimte_omschrijving"
+ " , res_rsv_ruimte_opmerking"
+ " , res_rsv_ruimte_externnr"
+ " , res_rsv_ruimte_contact_key"
+ " , res_rsv_ruimte_host_key"
+ " , mld_opdr_key"
+ " FROM res_rsv_ruimte"
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
var oRsR = Oracle.Execute(sql);
var rsv = { opstel_key: oRsR("res_ruimte_opstel_key").Value
, account: oRsR("prs_kostenplaats_key").Value || -1
@@ -70,6 +92,8 @@ if (rsv_ruimte_key > -1)
, ruimte_volgnr: oRsR("res_rsv_ruimte_volgnr").Value
, ruimte_van: new Date(oRsR("res_rsv_ruimte_van").Value)
, ruimte_tot: new Date(oRsR("res_rsv_ruimte_tot").Value)
, local_van: new Date(oRsR("local_van").Value)
, local_tot: new Date(oRsR("local_tot").Value)
, omschrijving: oRsR("res_rsv_ruimte_omschrijving").Value
, opmerking: oRsR("res_rsv_ruimte_opmerking").Value
, extern_nr: oRsR("res_rsv_ruimte_externnr").Value
@@ -982,8 +1006,8 @@ else
if (fe_lastminute || !this_res.canChange)
{
ROFIELD("fld", L("lcl_from") , toDateTimeString(rsv.ruimte_van), { });
ROFIELD("fld", L("lcl_to") , toDateTimeString(rsv.ruimte_tot), {combine: true});
ROFIELD("fld", L("lcl_from") , toDateTimeString(rsv.local_van, { isLocal: true }), { });
ROFIELD("fld", L("lcl_to") , toDateTimeString(rsv.local_tot, { isLocal: true }), {combine: true});
}
else
{

View File

@@ -171,8 +171,11 @@ var qrc = getQParamInt("qrc", 0) != 0;
}
function fnFavWP_colSubHeader(oRs)
{
var result = oRs("alg_gebouw_naam").Value;
result += (result ? ", " : "") + oRs("alg_locatie_plaats").Value;
var result = oRs("alg_gebouw_naam").Value || "";
var alg_locatie_plaats = oRs("alg_locatie_plaats").Value || "";
if (alg_locatie_plaats) {
result += (result ? ", " : "") + alg_locatie_plaats;
}
return result;
}
@@ -202,7 +205,7 @@ var qrc = getQParamInt("qrc", 0) != 0;
}
function fnDisciplinecapaciteit(oRs)
{
return oRs("aantal").Value+" "+oRs("ins_discipline_omschrijving").Value;
return oRs("aantal").Value + " " + oRs("ins_discipline_omschrijving").Value;
}
function fnGebouwIcon(oRs)
{
@@ -256,6 +259,7 @@ var qrc = getQParamInt("qrc", 0) != 0;
var gebouwcapaciteit = aantalitems * dagcapaciteit; // in uren
sql = rdpt.dagbezetting_resdelen_in_gebouw_sql(res_disc_key_arr, geb_key, -1, dateoffset, datelimit, null); // JGL: act_key
if (werkpl_key > -1 && resdate == null)
{ // Is een eerder gekozen werkplek nog beschikbaar?
var sql = "SELECT datum"
@@ -307,7 +311,7 @@ var qrc = getQParamInt("qrc", 0) != 0;
{ // Een eerder gekozen werkplek.
var dt = new Date(oRs("datum").Value);
var v_bloktijden = res.getBloktijdenDisc(res_disc_key_arr[0], dt, geb_key);
var res_blok = rdpt.getIntervalString(werkpl_key, dt, v_bloktijden);
var res_blok = rdpt.getIntervalString(werkpl_key, dt, v_bloktijden, geb_key);
if (res_blok == "")
txt = L("lcl_niet_beschikbaar");
else
@@ -417,7 +421,7 @@ var qrc = getQParamInt("qrc", 0) != 0;
{
var bcls= "";
var sql2 = rdpt.dagbezetting_resdelen_in_gebouw_sql(res_disc_key_arr, geb_key, oRs("alg_verdieping_key").value, dateoffset, datelimit, resdate);
oRs2 = Oracle.Execute(sql2)
oRs2 = Oracle.Execute(sql2);
bcls += rdpt.bezettings_class(oRs2("gevuld").value, calc_dagcapaciteit*oRs("aantal").value, minimumbeschikbaarheid*oRs("aantal").value);
oRs2.close();
return bcls; // te duur
@@ -546,7 +550,7 @@ var qrc = getQParamInt("qrc", 0) != 0;
function fncolSubHeader(oRs)
{
var res_blok = rdpt.getIntervalString(oRs("res_deel_key").value, resdate, bloktijden);
var res_blok = rdpt.getIntervalString(oRs("res_deel_key").value, resdate, bloktijden, geb_key);
if (res_blok =="")
res_blok = "";//L("lcl_niet_beschikbaar");
else

View File

@@ -57,11 +57,6 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
var isMobile = getQParamInt("ismobile", 0); // Wordt vanuit reservering_new_by_placetime.asp (mobile weergave) op 1 gezet. Vanuit desktop weergave word thet niet gezet.
var res_noshowgrace = 5*60*1000 ; // hoeveel milliseconden na aanvang mag je een (lege) bezette ruimte afpakken?
var adhoc_threshold = S("res_adhoc_threshold"); // Hoeveel minuten voor het aflopen van de huidige reservering mag je zelf alvast reserveren?
// Gebruik de Oracle tijd als startpunt. Van een noshow is de eindtijd op de Oracle TRUNC(SYSDATE, 'MI')
// gezet en je komt anders in de de problemen als Oracle een minuut voorloopt
var oRs = Oracle.Execute("SELECT TRUNC(SYSDATE, 'MI') FROM DUAL");
var now = new Date(oRs(0).Value);
oRs.Close();
var ins_key = getQParamInt("ins_key", -1);
var res_ruimte_key = -1;
@@ -80,6 +75,9 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
res_van = new Date();
}
var server_tz = S("fac_server_timezone");
var local_tz = server_tz;
var link2res = getQParamInt("link2res", 1);
if (ins_key != -1 || res_deel_key != -1)
@@ -111,9 +109,11 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
oRs = Oracle.Execute(sql);
var alg_ruimte_key = oRs("ins_alg_ruimte_key").value;
oRs.Close();
local_tz = res.getTimezoneByRuimte(alg_ruimte_key, "ALG");
}
else if (ins_key != -1 /* <- Dit is nooit waar want dan zit je hierboven al in DeelMode */ || res_artikel_key != -1)
else if (res_artikel_key != -1)
{
// UNSUPPORTED; local_tz = ?
// ArtikelMode
ArtikelMode = true;
}
@@ -125,9 +125,11 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
if (alg_ruimte_key == -1)
{
res_ruimte_key = getQParamInt("res_ruimte_key");
local_tz = res.getTimezoneByRuimte(res_ruimte_key, "RES");
}
else
{
local_tz = res.getTimezoneByRuimte(alg_ruimte_key, "ALG");
// Dit moet nog uitgebreid worden zodat het meerdere "enkele_ruimten" in verschillende catalogi kan handelen
// voor nu MAX() om AiAi uit te voorkomen
var enkele_ruimte = "(SELECT MAX(ra.res_ruimte_key)"
@@ -159,6 +161,13 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
var submitting = getQParamInt("submit", 0) == 1;
var qrc = getQParamInt("qrc", 0) != 0;
function toLocalDate(expr) {
return convertToLocalTimeSQL(expr, local_tz);
}
function toServerDate(expr) {
return convertToServerTimeSQL(expr, local_tz);
}
var transitParam = buildTransitParam(["res_ruimte_key", "res_deel_key"]);
if (res_ruimte_key < 0 && res_deel_key < 0 && res_artikel_key < 0)
@@ -520,12 +529,16 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
if (RuimteMode) // TODO: DIT HOUDT NOG GEEN REKENING MET KOPPELZALEN!
{
// Zoek alle bestaande reserveringen op deze ruimte die nog bezig zijn of komen
var localResVanExpr = toLocalDate("rm.res_rsv_ruimte_van");
var localResTotExpr = toLocalDate("rm.res_rsv_ruimte_tot");
sql = "SELECT rm.res_reservering_key,"
+ " rm.res_rsv_ruimte_volgnr,"
+ " rm.res_rsv_ruimte_key,"
+ " rm.res_rsv_ruimte_omschrijving,"
+ " res_rsv_ruimte_van,"
+ " res_rsv_ruimte_tot,"
+ " rm.res_rsv_ruimte_van,"
+ " rm.res_rsv_ruimte_tot,"
+ " " + localResVanExpr + " AS local_van,"
+ " " + localResTotExpr + " AS local_tot,"
+ " res_disc_params_preposttime,"
+ " (SELECT prs_perslid_naam_friendly FROM prs_v_perslid_fullnames pf WHERE pf.prs_perslid_key = rm.res_rsv_ruimte_host_key) host,"
+ " rm.res_rsv_ruimte_host_key host_key,"
@@ -535,16 +548,20 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
+ " res_rsv_ruimte rm,"
+ " res_ruimte_opstelling ro,"
+ " res_ruimte r";
if (PlanMode) // wil ik alles van res_van weten
{
sql +=" WHERE res_rsv_ruimte_van < {0}".format(res_van.endToSQL())
+ " AND res_rsv_ruimte_tot > {0}".format(res_van.beginToSQL());
}
else
{
sql +=" WHERE res_rsv_ruimte_van BETWEEN TRUNC (SYSDATE) AND TRUNC (SYSDATE) + 1" // Alleen vandaag
+ " AND res_rsv_ruimte_tot BETWEEN SYSDATE AND TRUNC (SYSDATE) + 1"; // Alleen lopende en toekomstige reserveringen
}
if (PlanMode) // wil ik alles van res_van weten
{
// res_van is de lokale dag (geTRUNC'd dus)
var serverResdateRangeStart = toServerDate(res_van.toSQL());
var serverResdateRangeEnd = serverResdateRangeStart + " + 1 - (1 / 24 / 60 / 60)";
sql += " WHERE rm.res_rsv_ruimte_van < " + serverResdateRangeEnd
+ " AND rm.res_rsv_ruimte_tot > " + serverResdateRangeStart;
}
else // Ad-hoc
{
var serverResdateRangeEnd = toServerDate("TRUNC(" + toLocalDate("SYSDATE") + ") + 1 - (1 / 24 / 60 / 60)");
sql += " WHERE rm.res_rsv_ruimte_van < " + serverResdateRangeEnd
+ " AND rm.res_rsv_ruimte_tot > SYSDATE"; // Alleen vandaag en alleen lopende en toekomstige reserveringen
}
sql += " AND rm.res_ruimte_opstel_key = ro.res_ruimte_opstel_key"
+ " AND ro.res_ruimte_key = r.res_ruimte_key"
+ " AND r.res_ruimte_key = " + res_ruimte_key
@@ -552,30 +569,38 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
+ " AND rm.res_rsv_ruimte_verwijder IS NULL"
+ " AND (res_rsv_ruimte_bezoekers_shown IS NULL OR res_rsv_ruimte_bezoekers_shown > 0)" // NoShow?
+ " AND rm.res_rsv_ruimte_dirtlevel = 0"
+ " ORDER BY rm.res_rsv_ruimte_van"; // Eerste vooraan.
+ " ORDER BY res_rsv_ruimte_van"; // Eerste vooraan.
} else {
var localResVanExpr = toLocalDate("rm.res_rsv_ruimte_van");
var localResTotExpr = toLocalDate("rm.res_rsv_ruimte_tot");
sql = "SELECT rm.res_reservering_key,"
+ " rm.res_rsv_ruimte_volgnr,"
+ " rm.res_rsv_ruimte_key,"
+ " rm.res_rsv_ruimte_omschrijving,"
+ " res_rsv_ruimte_van,"
+ " res_rsv_ruimte_tot,"
+ " rm.res_rsv_ruimte_van,"
+ " rm.res_rsv_ruimte_tot,"
+ " " + localResVanExpr + " AS local_van ,"
+ " " + localResTotExpr + " AS local_tot ,"
+ " 0 res_disc_params_preposttime,"
+ " (SELECT prs_perslid_naam_friendly FROM prs_v_perslid_fullnames pf WHERE pf.prs_perslid_key = rm.res_rsv_ruimte_host_key) host,"
+ " rm.res_rsv_ruimte_host_key host_key,"
+ " rd.res_deel_key"
+ " FROM res_rsv_ruimte rm,"
+ " res_rsv_deel rd,"
+ " res_deel d"
+ " res_deel d";
if (PlanMode) // wil ik alles van res_van weten
{
sql +=" WHERE res_rsv_ruimte_van < {0}".format(res_van.endToSQL())
+ " AND res_rsv_ruimte_tot > {0}".format(res_van.beginToSQL())
// res_van is de lokale dag (geTRUNC'd dus)
var serverResdateRangeStart = toServerDate(res_van.toSQL());
var serverResdateRangeEnd = serverResdateRangeStart + " + 1 - (1 / 24 / 60 / 60)";
sql += " WHERE rm.res_rsv_ruimte_van < " + serverResdateRangeEnd
+ " AND rm.res_rsv_ruimte_tot > " + serverResdateRangeStart;
}
else
{
sql +=" WHERE res_rsv_ruimte_van BETWEEN TRUNC (SYSDATE) AND TRUNC (SYSDATE) + 1" // Alleen vandaag
+ " AND res_rsv_ruimte_tot BETWEEN SYSDATE AND TRUNC (SYSDATE) + 1" // Alleen lopende en toekomstige reserveringen
var serverResdateRangeEnd = "SYSDATE + 1 - (1 / 24 / 60 / 60)";
sql += " WHERE rm.res_rsv_ruimte_van < " + serverResdateRangeEnd
+ " AND rm.res_rsv_ruimte_tot > SYSDATE"; // Alleen vandaag en alleen lopende en toekomstige reserveringen
}
// sql for check on existing workplace reservations
var sql_pers = sql
@@ -608,6 +633,11 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
for (var i in periods) // Het zijn altijd strings
periods[i] = parseInt(periods[i]);
// Van een noshow is de eindtijd op de Oracle TRUNC(SYSDATE, 'MI') gezet en je komt anders in de de problemen als Oracle een minuut voorloopt
var oRs = Oracle.Execute("SELECT " + toLocalDate("TRUNC(SYSDATE, 'MI')") + " FROM DUAL");
var now = new Date(oRs(0).Value);
oRs.Close();
var maxTime = now.setFloatHours(reindtijd);
var minuten = now.getHours() * 60 + now.getMinutes();
var blokstart = Math.ceil(minuten / (S("res_h")*60)) * S("res_h")*60; // omhoog afgerond op period[0]
@@ -645,8 +675,10 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
var oRs = Oracle.Execute( sql );
while (!oRs.Eof)
{
var van = new Date(oRs("res_rsv_ruimte_van").Value);
var tot = new Date(oRs("res_rsv_ruimte_tot").Value);
var server_van = new Date(oRs("res_rsv_ruimte_van").Value);
var server_tot = new Date(oRs("res_rsv_ruimte_tot").Value);
var local_van = new Date(oRs("local_van").Value);
var local_tot = new Date(oRs("local_tot").Value);
// Let op: hier wordt voor elk gedefinieerd interval bekeken of deze reservering die bezet, om aan het einde te weten
// welke intervallen er dus nog helemaal vrij zijn. Afhankelijk van de gedefinieerde intervallen kan een reservering
@@ -654,17 +686,16 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
// dus niet per se iets over hoe lang je reservering duurt.
// Ik denk dat ik daarom ook de echte onderliggende van en tot nodig heb, om dat later te kunnen vertellen
// zonder weer opnieuw die reserveringen te moeten zoeken
for (var i = 0; i < bloktijden.length; i++)
{
if (van < bloktijden[i].einddatum && tot > bloktijden[i].startdatum)
if (local_van < bloktijden[i].einddatum && local_tot > bloktijden[i].startdatum)
{
bloktijden[i].bezet = oRs("host").Value;
bloktijden[i].bezet_key = oRs("host_key").Value;
bloktijden[i].res_rsv_ruimte_key = oRs("res_rsv_ruimte_key").Value;
bloktijden[i].res_reservering_nr = oRs("res_reservering_key").Value+"/"+oRs("res_rsv_ruimte_volgnr").Value;
bloktijden[i].resvan = van;
bloktijden[i].restot = tot;
bloktijden[i].resvan = local_van;
bloktijden[i].restot = local_tot;
}
}
oRs.MoveNext();
@@ -679,23 +710,25 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
var rsv_omschrijving = oRs("res_rsv_ruimte_omschrijving").Value;
var rsv_host = oRs("host").Value;
var rsv_ruimte_key = oRs("res_rsv_ruimte_key").Value;
var van = new Date(oRs("res_rsv_ruimte_van").Value);
var tot = new Date(oRs("res_rsv_ruimte_tot").Value);
var server_van = new Date(oRs("res_rsv_ruimte_van").Value);
var server_tot = new Date(oRs("res_rsv_ruimte_tot").Value);
var local_van = new Date(oRs("local_van").Value);
var local_tot = new Date(oRs("local_tot").Value);
if (RuimteMode) {
var bezoekers_expected = oRs("res_rsv_ruimte_bezoekers").Value;
var bezoekers_shown = oRs("res_rsv_ruimte_bezoekers_shown").Value;
}
var prepost = oRs("res_disc_params_preposttime").Value || 0; // in uren
var totMinusThreshold = new Date(tot).setMinutes(tot.getMinutes() - adhoc_threshold);
var totMinusThreshold = new Date(local_tot).setMinutes(local_tot.getMinutes() - adhoc_threshold);
if (totMinusThreshold <= now) { // Deze afspraak loopt nog, maar ik mag al wel vast boeken
now = new Date(tot); // Nieuwe startdatum (niet 'now', maar straks dus)
now = new Date(local_tot); // Nieuwe startdatum (niet 'now', maar straks dus)
lopendeRes = true;
oRs.moveNext(); // Kijk of de volgende afspraak niet blokkeert
continue;
}
var schoonvan = new Date(van);
var schoonvan = new Date(local_van);
schoonvan.setMinutes(schoonvan.getMinutes() - prepost * 60);
if (schoonvan < times[0] && tot > now) { // Bezig of begint binnen schoonmaaktijd
if (schoonvan < times[0] && local_tot > now) { // Bezig of begint binnen schoonmaaktijd
var nubezet = true;
}
oRs.moveNext();
@@ -833,7 +866,7 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
id: "tot_" + tm,
value: "",
checked: !timeslotAvailable,
label: L("lcl_pda_res_ruimtereserveer").format(toTimeString(times[tm])),
label: L("lcl_pda_res_ruimtereserveer").format(toTimeString(times[tm], { isLocal: true })),
data: {
van: now.getTime(),
tot: times[tm].getTime()
@@ -850,8 +883,8 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
var myres_rsv_ruimte_key = getQParamInt("res_rsv_ruimte_key", -1);
if (myres_rsv_ruimte_key > 0) { // Altijd?
sql_vt = "SELECT res_rsv_ruimte_van"
+ " , res_rsv_ruimte_tot"
sql_vt = "SELECT " + toLocalDate("res_rsv_ruimte_van") + " res_rsv_ruimte_van"
+ " , " + toLocalDate("res_rsv_ruimte_tot") + " res_rsv_ruimte_tot"
+ " , res_reservering_key"
+ " , res_rsv_ruimte_volgnr"
+ " FROM res_rsv_ruimte"
@@ -867,9 +900,9 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
if (myres) { // Als we niet zojuist hebben gereserveerd (!submitting), laat dan al je eigen reserveringen zien (if any)
Response.write("<div class='modconfirm'>"+L("lcl_res_deel_planmode_confirm").format((RuimteMode ? safe.html(res_ruimte_nr) : safe.html(res_deel_omschrijving)),
toDateString(res_van, true, false),
toTimeString(mystart),
toTimeString(myend),
toDateString(res_van, { noDay: true, isLocal: true }),
toTimeString(mystart, { isLocal: true }),
toTimeString(myend, { isLocal: true }),
myres_reservering_nrs.join(", "),
rooturl + "/?u=reservering&k=" + myres_rsv_ruimte_key) + "</div>");
}
@@ -888,8 +921,10 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
var oRs_pers = Oracle.Execute( RuimteMode ? sql : sql_pers );
while (!oRs_pers.Eof)
{
var van = new Date(oRs_pers("res_rsv_ruimte_van").Value);
var tot = new Date(oRs_pers("res_rsv_ruimte_tot").Value);
var server_van = new Date(oRs_pers("res_rsv_ruimte_van").Value);
var server_tot = new Date(oRs_pers("res_rsv_ruimte_tot").Value);
var local_van = new Date(oRs_pers("local_van").Value);
var local_tot = new Date(oRs_pers("local_tot").Value);
%>
res_pers["<%=user_key%>"].push({
bezet: "<%=safe.jsstring(oRs_pers("host").Value)%>",
@@ -897,8 +932,8 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
res_deel_key: <%=(RuimteMode ? "null" : oRs_pers("res_deel_key").Value)%>,
res_rsv_ruimte_key: <%=oRs_pers("res_rsv_ruimte_key").Value%>,
res_reservering_nr: "<%=oRs_pers("res_reservering_key").Value + "/" + oRs_pers("res_rsv_ruimte_volgnr").Value%>",
resvan: new Date(<%=van.getTime()%>),
restot: new Date(<%=tot.getTime()%>)
resvan_ms: <%=local_van.getTime()%>,
restot_ms: <%=local_tot.getTime()%>
});
<%
oRs_pers.MoveNext();
@@ -918,20 +953,16 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
data,
FcltCallbackAndThen((json) => {
res_pers[prs_key] = json.rsv;
res_pers[prs_key].resvan = new Date(res_pers[prs_key].resvan);
res_pers[prs_key].restot = new Date(res_pers[prs_key].restot);
}), "json");
}
var _from = new Date(from);
var _to = new Date(to);
var return_doubles = [];
var index = 0;
if (!(prs_key in res_pers)) {
return false;
}
for (index = 0; index < res_pers[prs_key].length; index++) {
if ((_from >= res_pers[prs_key][index].restot || _to <= res_pers[prs_key][index].resvan) == false) {
if (from < res_pers[prs_key][index].restot_ms && to > res_pers[prs_key][index].resvan_ms) {
return_doubles.push(res_pers[prs_key][index]);
}
}
@@ -953,11 +984,11 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
// Dit is eigenlijk niet relevant voor een normale gebruiker
// maar voor een eventuele noshow wel!
// KFNS#35010: ook tonen als het toch geen geheim is
if (user.checkAutorisation( "WEB_RESNOS", true) || (planbordTooltipShowing(rsv_ruimte_key) == 0)) {
if (user.checkAutorisation("WEB_RESNOS", true) || (planbordTooltipShowing(rsv_ruimte_key) == 0)) {
if (!times.length) {
Response.write("<span class='bezetinfo'>" + I("fa-ban fa-xl") + " " + L("lcl_mobile_none_beschik") + "</span>");
} else if (van) {
Response.write("<span class='bezetinfo'>"+toTimeString(van)+" - "+toTimeString(tot)+": "+ safe.html(rsv_omschrijving)+"/"+safe.html(rsv_host)+"</span>");
} else if (local_van) {
Response.write("<span class='bezetinfo'>"+toTimeString(local_van, { isLocal: true })+" - "+toTimeString(local_tot, { isLocal: true })+": "+ safe.html(rsv_omschrijving)+"/"+safe.html(rsv_host)+"</span>");
}
}
%></div><%
@@ -968,7 +999,7 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
%><div class="cvrij"><%
Response.write("<div class='vrij'>"+safe.html(RuimteMode ? res_ruimte_nr : res_deel_omschrijving)+"</div>")
%></div><%
van = null; // er is geen eerstvolgende in de weg
local_van = null; // er is geen eerstvolgende in de weg
}
}
@@ -1001,7 +1032,7 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
if (!submitting && timeslot_radios.length)
{
if (timeslotAvailable) {
Response.write("<div class='modhint text-center'>"+L("lcl_res_deel_planmode_hint" + (submitting ? "2" : "1")).format(toDateString(res_van, false, false).toLowerCase(), res_deel_opmerking||"")+"</div>");
Response.write("<div class='modhint text-center'>"+L("lcl_res_deel_planmode_hint" + (submitting ? "2" : "1")).format(toDateString(res_van, { isLocal: true }).toLowerCase(), res_deel_opmerking||"")+"</div>");
}
CONTROLGROUP_START({ id: "bloktijden" });
RADIO_GROUP("timeslots", timeslot_radios, { big: true });
@@ -1017,7 +1048,7 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
CONTROLGROUP_END();
}
if (nubezet && now - van > res_noshowgrace
if (nubezet && now - local_van > res_noshowgrace
&& res_noshowgrace > -1 /* EN minstens res_noshowgrace na aanvang */
&& !DeelMode // ondersteunen we (nog) niet
&& user.checkAutorisation( "WEB_RESNOS", true))
@@ -1119,18 +1150,18 @@ FCLTHeader.Requires({ plugins: ["kenmerk"], css: [rooturl+"/appl/res/res.css"] }
<div class="next-res-title"><%=L("lcl_mobile_rsv_next")%></div>
<div class="next-res-descr"><%=L("lcl_none")%></div>
<% } else {
var van = schoonvan || van;
var isToday = !PlanMode || new Date().midnight().getTime() === new Date(van).midnight().getTime();
var van = isToday ? toTimeString(van, false, true) : toDateTimeString(van, false, true, false, true);
var tot = isToday ? toTimeString(tot, false, true) : toDateTimeString(tot, false, true, false, true);
var local_van = schoonvan || local_van;
var isToday = !PlanMode || new Date().midnight().getTime() === new Date(local_van).midnight().getTime();
var local_van = isToday ? toTimeString(local_van, { isLocal: true }) : toDateTimeString(local_van, { noDay: true, noMidnight: true, isLocal: true });
var local_tot = isToday ? toTimeString(local_tot, { isLocal: true }) : toDateTimeString(local_tot, { noDay: true, noMidnight: true, isLocal: true });
if (nubezet || lopendeRes) {
if (lopendeRes) { %>
<div class="next-res-title"><%=I("fa-exclamation-triangle")%></div>
<% } %>
<div class="next-res-descr"><%=L("lcl_mobile_ruimtebezet").format(tot)%></div>
<div class="next-res-descr"><%=L("lcl_mobile_ruimtebezet").format(local_tot)%></div>
<% } else if (!myres) { %>
<div class="next-res-title"><%=L("lcl_mobile_rsv_next")%></div>
<div class="next-res-descr"><%=van%> tot <%=tot%></div>
<div class="next-res-descr"><%=local_van%> tot <%=local_tot%></div>
<% }
}
}

View File

@@ -376,7 +376,6 @@ if (!submitting)
FCLTselector( "wplx"
, similarWP_sql
, { label: L("lcl_workplace")
, emptyOption: L("lcl_select_werkplek")
, required: true
, mobile: true
}

View File

@@ -329,6 +329,45 @@ res = {
return alg_tz;
},
getTimezoneBy: function _getTimezoneBy(alg_key, level) {
// level ? ["R", "V", "G", "L"]
var sql;
switch (level) {
case "L":
sql = "SELECT l.alg_locatie_timezone"
+ " FROM alg_locatie l"
+ " WHERE l.alg_locatie_key = " + alg_key;
break;
case "G":
sql = "SELECT l.alg_locatie_timezone"
+ " FROM alg_locatie l, alg_gebouw g"
+ " WHERE g.alg_gebouw_key = " + alg_key
+ " AND g.alg_locatie_key = l.alg_locatie_key";
break;
case "V":
sql = "SELECT l.alg_locatie_timezone"
+ " FROM alg_locatie l, alg_gebouw g, alg_verdieping v"
+ " WHERE v.alg_verdieping_key = " + alg_key
+ " AND v.alg_gebouw_key = g.alg_gebouw_key"
+ " AND g.alg_locatie_key = l.alg_locatie_key";
break;
case "R":
return res.getTimezoneByRuimte(alg_key, "ALG");
default:
throw new Error("Invalid level: " + level);
}
var oRs = Oracle.Execute(sql);
var alg_tz = !oRs.EOF && oRs("alg_locatie_timezone").Value
|| S("fac_server_timezone");
oRs.Close();
return alg_tz;
},
res_ruimte_info: function _res_ruimte(res_ruimte_key)
{
var result = { res_ruimte_key: res_ruimte_key,
@@ -1192,6 +1231,7 @@ res = {
}
);
roRs.Close();
// earliest_expire_change en earliest_expire_cancel hebben zeker een goede waarde van de ruimte discipline (startdatum 1/1/1000 is vervangen).
rresult.earliest_expire_change = earliest_expire_change;
rresult.earliest_expire_cancel = earliest_expire_cancel;
@@ -2542,8 +2582,7 @@ res = {
getBloktijden: function(p_act_key, p_res_disc_key, p_resdate, p_geb_key)
{
var bloktijden = ((p_act_key && p_act_key > -1) ? res.getBloktijdenAct(p_act_key, p_resdate, p_geb_key) : []);
if (bloktijden.length == 0)
{
if (bloktijden.length == 0) {
bloktijden = res.getBloktijdenDisc(p_res_disc_key, p_resdate, p_geb_key);
}
return bloktijden;
@@ -2564,7 +2603,7 @@ res = {
bloktijden = JSON.parse(oRs("res_disc_params_intervals").Value);
oRs.close();
bloktijden = res.set_bloktijdenopdatum(bloktijden, p_resdate, p_geb_key)
bloktijden = res.set_bloktijdenopdatum(bloktijden, p_resdate, p_geb_key);
return bloktijden;
},

View File

@@ -194,6 +194,14 @@ function res_list (pautfunction, params)
}
}
var sql_tz = "SELECT ''"
+ " FROM alg_locatie"
+ " WHERE alg_locatie_timezone IS NOT NULL"
+ " AND alg_locatie_timezone <> " + safe.quoted_sql(S("fac_server_timezone"));
var oRs_tz = Oracle.Execute(sql_tz);
var any_tz = !oRs_tz.EOF;
oRs_tz.Close();
// Berekenen is duur en niet altijd nodig
var withprices = (groupres == 4
|| groupres == 5
@@ -771,6 +779,12 @@ function res_list (pautfunction, params)
+ ", NULL ins_discipline_key"
: " , res_geg.ins_srtdeel_uitleenbaar"
+ ", res_geg.ins_discipline_key");
if (any_tz) {
sql_select += ", DECODE(l.alg_locatie_timezone"
+ " , " + safe.quoted_sql(S("fac_server_timezone")) + ", NULL"
+ " , NULL, NULL"
+ " , l.alg_locatie_timezone) alg_locatie_timezone";
}
var sql_select_obj_restype_O = sql_select
+ ", NULL alg_district_key"

View File

@@ -757,7 +757,14 @@ if (options.length > 1) {
}
var buttons = [];
if (this_res.couldCreate)
var multi_tz = Session("time_zone") != S("fac_server_timezone"); // Hebben we te maken met een ruimte, gebruiker of server in een afwijkende tijdszone?
if (!multi_tz) {
var rsv_timezone = res.getRsvTimezone(rsv_ruimte_key);
multi_tz = rsv_timezone != Session("time_zone");
}
if (!multi_tz && this_res.couldCreate)
{
buttons.push( {id: "repeatbutton", title: L("lcl_res_add_deelres"), icon: "fa-clone", action: "makeMulti()" } );
if (restype == "R")
@@ -765,7 +772,7 @@ if (options.length > 1) {
if (restype == "CV") // en O??
buttons.push( {id: "addpartresbutton", title: L("lcl_res_add_deelresreservering"), icon: "fa-layer-plus", action: "ruimteErbij('" + restype + "')" } );
}
if (multiDeel && this_res.couldCreate)
if (!multi_tz && multiDeel && this_res.couldCreate)
{
buttons.push({ title: L("lcl_res_multiple_save"), icon: "fa-copy", action: "MultiSave()" });
buttons.push({ icon: "fa-print", title: L("lcl_print"), action: "res_print()" });

View File

@@ -127,7 +127,7 @@ var fac_usrrap_key = getQParamInt("usrrap_key", -1); // wordt
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); //
var dateoffset = getQParamInt("offset", afternoon?1:0); // TODO localized afternoon gebruiken om offset te berekenen ..
var datelimit = getQParamInt("limit", 7); // aantal te kiezen dagen tov offset
var selectmode = getQParamInt("selectmode", 0); // kiezen van het item: 0=automatisch bepalen (tekening anders lijst), 1=lijst, 2=2dtekening indien aanwezig, 3=3dtekening indien aanwezig
var fotos = getQParamInt("fotos", 1); // for selectmode 1: show photo or not
@@ -377,7 +377,7 @@ transitParam2 += "&startpage=" + startpage;
break;
case "day": titel = L("lcl_beschikbaarheid_by_day").format(safe.html(params.bld),safe.html(params.disc));
break;
case "flr": titel = L("lcl_beschikbaarheid_by_flr").format(safe.html(params.disc),safe.html(params.bld),toDateString(params.resdate).toLowerCase());
case "flr": titel = L("lcl_beschikbaarheid_by_flr").format(safe.html(params.disc),safe.html(params.bld),toDateString(params.resdate, { isLocal: true }).toLowerCase());
break;
}
Response.write("<h3><a>" + titel + "</a></h3/>");
@@ -516,15 +516,23 @@ transitParam2 += "&startpage=" + startpage;
%>
<div id='accordion'>
<%
sql = "SELECT g.alg_gebouw_werkdagen, alg_gebouw_naam "
+ " FROM alg_gebouw g"
+ " WHERE g.alg_gebouw_key = " + geb_key;
sql = "SELECT g.alg_gebouw_werkdagen, "
+ " g.alg_gebouw_naam, "
+ " l.alg_locatie_timezone "
+ " FROM alg_gebouw g "
+ " JOIN alg_locatie l ON l.alg_locatie_key = g.alg_locatie_key "
+ " WHERE g.alg_gebouw_key = " + geb_key;
oRs = Oracle.Execute(sql)
var werkdagen = oRs("alg_gebouw_werkdagen").Value;
var gebouw_naam = oRs("alg_gebouw_naam").Value; // theoretisch kunnen dit er meerdere zijn, dan nog aanpassen
var local_tz = oRs("alg_locatie_timezone").Value || S("fac_server_timezone");
oRs.close();
sql = rdpt.dagbezetting_resdelen_in_aanweziggebouw_sql(res_disc_key_arr, res_deel_key, geb_key, -1, dateoffset, datelimit, null, act_key);
var local_now = convertToLocalTime(new Date(), local_tz);
afternoon = local_now.getHours() >= daylimit;
dateoffset = getQParamInt("offset", afternoon ? 1 : 0);
sql = rdpt.dagbezetting_resdelen_in_aanweziggebouw_sql(res_disc_key_arr, res_deel_key, geb_key, dateoffset, datelimit, act_key);
var oRs = Oracle.Execute(sql)
var pos = 0;
@@ -553,7 +561,7 @@ transitParam2 += "&startpage=" + startpage;
var calc_dagcapaciteit = rdpt.dagcapaciteitCalc(new Date(oRs("datum").Value), dagcapaciteit, act_key, res_disc_key_arr, geb_key);
if (!calc_dagcapaciteit)
{
__Log("No capacity on " + toDateString(oRs("datum").Value));
__Log("No capacity on " + toDateString(oRs("datum").Value, { isLocal: true }));
oRs.MoveNext();
continue;
}
@@ -588,12 +596,12 @@ transitParam2 += "&startpage=" + startpage;
}
}
var clickaction = (reserveerbaredag && (!(res_deel_key > 0) || beschikbaarheid > 0) ? "onclick='continue_with_date_bld(new Date("+ new Date(oRs("datum").Value).getTime()+"), "+oRs("ins_discipline_key").Value+");'" : "");
var noTimezoneDifferences = Session("time_zone") == S("fac_server_timezone") && local_tz == S("fac_server_timezone");
%>
<div class='iconmenu<%=clickaction ? "" : " no-action"%>'
style='width:14%; height: 12vw;' <%=clickaction%>>
<div class="iconitem">
<div class="icondate iconimg <%=bcls%>"><%=toDateString(oRs("datum").Value, false, true) %></div>
<div class="icondate iconimg <%=bcls%>"><%=toDateString(oRs("datum").Value, { pretty: noTimezoneDifferences, isLocal: true }) %></div>
<div class="res-iconlabel"><%=licon%><%=aantalitems+" "+safe.html(oRs("ins_discipline_omschrijving").Value).toLowerCase()%>
<br><%=L("lcl_mobile_resbeschikbaar")+" " +(ischild?(beschikbaarheid+ "/" + blok_per_dag):beschikbaarheid +"%") %>
</div>
@@ -613,9 +621,20 @@ transitParam2 += "&startpage=" + startpage;
// 3. KIES VERDIEPING INDIEN GEWENST EN NOG NIET BEKEND
if (resdate && floorselect == 1 && geb_key > -1 && floor_key == -1)
{
%>
sql = "SELECT l.alg_locatie_timezone "
+ " FROM alg_gebouw g "
+ " JOIN alg_locatie l ON l.alg_locatie_key = g.alg_locatie_key "
+ " WHERE g.alg_gebouw_key = " + geb_key;
oRs = Oracle.Execute(sql);
var local_tz = oRs("alg_locatie_timezone").Value || S("fac_server_timezone");
oRs.close();
var local_now = convertToLocalTime(new Date(), local_tz);
afternoon = local_now.getHours() >= daylimit;
dateoffset = getQParamInt("offset", afternoon ? 1 : 0);
%>
<div id='accordion'>
<%
<%
var sql = rdpt.mijn_verdiepingen_met_resdelen_sql(res_disc_key_arr, geb_key, ALGwritelevel, dateoffset, resdate);
var oRs = Oracle.Execute(sql)
var pos = 0;
@@ -641,7 +660,8 @@ transitParam2 += "&startpage=" + startpage;
var flr_icon = '<div class="flooravatar">'+safe.html(oRs("alg_verdieping_code").Value)+'</div>';
var sql2 = rdpt.dagbezetting_resdelen_in_gebouw_sql(res_disc_key_arr, gebkey, flrkey, dateoffset, datelimit, resdate);
var oRs2 = Oracle.Execute(sql2)
var oRs2 = Oracle.Execute(sql2);
var beschikbaarheid = ((1 - (oRs2("gevuld").Value/(dagcapaciteit*aantalitems)))*100); // 0..100
var fcls = rdpt.bezettings_class(oRs2("gevuld").Value, dagcapaciteit*aantalitems, minimumbeschikbaarheid*aantalitems);
@@ -802,7 +822,7 @@ transitParam2 += "&startpage=" + startpage;
function fnIntervallen(oRs)
{
var res = rdpt.getIntervalString(oRs("res_deel_key").Value, resdate, bloktijden);
var res = rdpt.getIntervalString(oRs("res_deel_key").Value, resdate, bloktijden, geb_key);
if (res =="") res = L("lcl_res_intervalbezet");
return res;
}
@@ -840,7 +860,7 @@ transitParam2 += "&startpage=" + startpage;
var rst = new ResultsetTable({ keyColumn: "res_deel_key",
ID: "resdltable",
sql: sql,
title: L("lcl_resdeel_beschikbaar_op").format(gebouw_naam, toDateString(resdate)),
title: L("lcl_resdeel_beschikbaar_op").format(gebouw_naam, toDateString(resdate, { isLocal: true })),
buttons: buttons,
emptySetString: L("lcl_res_niets_beschikbaar"),
showAll: showAll,

View File

@@ -9,6 +9,7 @@
rdpt = {
// Levert de 3 meest recent geboekte werkplekken op voor de gegeven catalogi
mijn_verdiepingen_met_resdelen_hist_sql: function(p_res_disc_key_arr, p_alglevel)
{
var hsql = " SELECT l.alg_locatie_plaats"
@@ -46,8 +47,8 @@ rdpt = {
+ " AND rdis.ins_discipline_verwijder IS NULL"
+ " AND w.res_discipline_key IN (" + p_res_disc_key_arr.join(",") + ")";
if (p_alglevel > -1 )
{ // Er is een scope-beperking van kracht
if (p_alglevel > -1)
{ // Er is een scope-beperking van kracht
hsql += " AND v.alg_verdieping_key IN"
+ " (SELECT alg_verdieping_key"
+ " FROM fac_v_my_floors"
@@ -70,14 +71,13 @@ rdpt = {
+ " , rdis.ins_discipline_omschrijving"
+ " ORDER BY res_rsv_ruimte_van DESC";
return "SELECT * FROM (" + hsql + ") WHERE ROWNUM < 4";
return "SELECT * FROM (" + hsql + ") WHERE ROWNUM <= 3";
},
// Selecteer gebouwen of verdiepingen waarop res_delen van deze disciplines voorkomen, met wat gegevens
// Als gebouw_key -1 is worden gebouwen geselecteerd, als er een gebouw_key gegeven is, dan de verdiepingen
mijn_verdiepingen_met_resdelen_sql: function(p_res_disc_key_arr, p_gebouw_key, p_alglevel, p_dateoffset, p_resdate)
{
var lsql = " SELECT l.alg_locatie_plaats"
+ " , l.alg_locatie_code"
+ " , g.alg_gebouw_naam"
@@ -96,7 +96,7 @@ rdpt = {
+ " , alg_v_aanweziggebouw g"
+ " , alg_v_aanwezigverdieping v"
+ " , alg_locatie l"
+ " , alg_district di"
+ " , alg_district di"
+ " WHERE di.alg_district_key = l.alg_district_key "
+ " AND g.alg_locatie_key = l.alg_locatie_key "
+ " AND plts.alg_verdieping_key = v.alg_verdieping_key"
@@ -105,8 +105,8 @@ rdpt = {
+ " AND id.ins_alg_ruimte_key = plts.alg_onroerendgoed_keys "
+ " AND id.ins_alg_ruimte_type = plts.alg_type "
+ " AND rd.res_ins_deel_key = id.ins_deel_key "
+ " AND (rd.res_deel_vervaldatum IS NULL OR rd.res_deel_vervaldatum > "
+ (p_resdate ? p_resdate.toSQL() : "SYSDATE+"+(p_dateoffset||0) ) + ")"
+ " AND ( rd.res_deel_vervaldatum IS NULL"
+ " OR rd.res_deel_vervaldatum > " + (p_resdate ? p_resdate.toSQL() : "SYSDATE + " + (p_dateoffset || 0)) + ")"
+ " AND rd.res_discipline_key = rdis.ins_discipline_key"
+ " AND rdis.ins_discipline_verwijder IS NULL"
+ " AND rd.res_discipline_key IN (" + p_res_disc_key_arr.join(",") + ")";
@@ -114,8 +114,8 @@ rdpt = {
if (p_alglevel > -1 )
{ // Er is een scope-beperking van kracht
lsql += " AND v.alg_verdieping_key IN (SELECT alg_verdieping_key FROM fac_v_my_floors "
+ " WHERE prs_perslid_key = " + user_key
+ " AND niveau = " + p_alglevel + ")";
+ " WHERE prs_perslid_key = " + user_key
+ " AND niveau = " + p_alglevel + ")";
}
lsql += " GROUP BY l.alg_locatie_plaats"
+ " , l.alg_locatie_code"
@@ -128,7 +128,7 @@ rdpt = {
+ " , v.alg_verdieping_code"
+ " , rdis.ins_discipline_key"
+ " , rdis.ins_discipline_omschrijving"
+ " ORDER BY alg_locatie_plaats, alg_gebouw_naam, ins_discipline_omschrijving, alg_verdieping_volgnr, alg_verdieping_code" ;
+ " ORDER BY alg_locatie_plaats, alg_gebouw_naam, ins_discipline_omschrijving, alg_verdieping_volgnr, alg_verdieping_code";
if (p_gebouw_key == -1)
{
@@ -155,20 +155,17 @@ rdpt = {
},
// telt het aantal reserveerbare delen van de discipline in het gebouw of de verdieping
aantal_resdelen_in_gebouw_sql: function(p_res_disc_key_arr, p_geb_key, p_flr_key, p_resdate)
aantal_resdelen_in_gebouw_sql: function(p_res_disc_key_arr, p_geb_key)
{
// Bepaal het aantal items in dit gebouw
var lsql = "SELECT COUNT (*) aantal "
+ " FROM res_v_aanwezigdeel rd, ins_v_aanwezigdeel id, alg_v_allonroerendgoed plts "
+ " WHERE id.ins_alg_ruimte_key = plts.alg_onroerendgoed_keys "
+ " AND id.ins_alg_ruimte_type = plts.alg_type "
+ " AND rd.res_ins_deel_key = id.ins_deel_key "
+ (p_flr_key > -1 ? " AND plts.alg_verdieping_key = " + p_flr_key
: " AND plts.alg_gebouw_key = " + p_geb_key
)
+ " AND rd.res_discipline_key IN (" + p_res_disc_key_arr.join(",") + ")"
+ " AND (rd.res_deel_vervaldatum IS NULL OR rd.res_deel_vervaldatum > "
+ (p_resdate ? p_resdate.toSQL() : "SYSDATE") + ")";
+ " FROM res_v_aanwezigdeel rd, ins_v_aanwezigdeel id, alg_v_allonroerendgoed plts "
+ " WHERE id.ins_alg_ruimte_key = plts.alg_onroerendgoed_keys "
+ " AND id.ins_alg_ruimte_type = plts.alg_type "
+ " AND rd.res_ins_deel_key = id.ins_deel_key "
+ " AND plts.alg_gebouw_key = " + p_geb_key
+ " AND rd.res_discipline_key IN (" + p_res_disc_key_arr.join(",") + ")"
+ " AND (rd.res_deel_vervaldatum IS NULL OR rd.res_deel_vervaldatum > SYSDATE)";
return lsql;
},
@@ -176,56 +173,83 @@ rdpt = {
// Als p_resdate is gegeven, dan wordt uiteindelijk alleen het record voor die dag daaruit geselecteerd.
// Als p_act_key is meegegeven en het is een child-activiteit dan worden alleen dagen meegenomen waar
// de master een reservering heeft
dagbezetting_resdelen_in_gebouw_sql: function (p_res_disc_key_arr, p_geb_key, p_flr_key, p_dateoffset, p_datelimit, p_resdate, p_act_key)
dagbezetting_resdelen_in_gebouw_sql: function (p_res_disc_key_arr, p_geb_key, p_flr_key, p_dateoffset, p_datelimit, p_local_resdate, p_act_key)
{
var lsql = "SELECT datum, SUM (gevuld) gevuld, MAX (aantal) aantal, MAX (vrijedag) vrijedag, MAX (weekdag) weekdag "
+ "FROM ("
+ " SELECT TRUNC (rrd.res_rsv_deel_van) datum,"
+ " SUM(rrd.res_rsv_deel_tot-rrd.res_rsv_deel_van)*24 gevuld,"
+ " vrij.mld_vrije_dagen_key vrijedag, " // >0 is vrijedag
+ " fac.getweekdaynum (res_rsv_deel_van) weekdag, " // 7 en 1 zijn weekend
+ " COUNT (*) aantal "
+ " FROM res_v_aanwezigrsv_deel rrd, "
+ " res_v_aanwezigdeel rd, "
+ " ins_v_aanwezigdeel id, "
+ " alg_v_allonroerendgoed plts, "
+ " alg_gebouw g,"
+ " mld_vrije_dagen vrij "
+ " WHERE rrd.res_deel_key = rd.res_deel_key "
+ " AND id.ins_alg_ruimte_key = plts.alg_onroerendgoed_keys "
+ " AND id.ins_alg_ruimte_type = plts.alg_type "
+ " AND vrij.mld_vrije_dagen_datum(+) = TRUNC (rrd.res_rsv_deel_van) "
+ " AND rd.res_ins_deel_key = id.ins_deel_key "
+ " AND rrd.res_rsv_deel_dirtlevel = 0" // nodig?
+ (p_flr_key > -1 ? " AND plts.alg_verdieping_key = " + p_flr_key
: " AND plts.alg_gebouw_key = " + p_geb_key)
+ " AND g.alg_gebouw_key = plts.alg_gebouw_key"
+ " AND vrij.mld_vrije_dagen_id(+) = COALESCE(g.mld_vrije_dagen_id, 'Default')"
+ " AND rd.res_discipline_key IN (" + p_res_disc_key_arr.join(",") + ")"
+ (p_resdate ? " AND TRUNC (rrd.res_rsv_deel_van) = " + p_resdate.toSQL()
: " AND TRUNC (rrd.res_rsv_deel_van) BETWEEN TRUNC (SYSDATE +"+(p_dateoffset||0)+") AND TRUNC (SYSDATE-1+"+(p_dateoffset||0)+"+"+p_datelimit+") "
)
+ " GROUP BY vrij.mld_vrije_dagen_key, TRUNC (rrd.res_rsv_deel_van), res_rsv_deel_van "
+ " UNION ALL" // de dagen zonder reserveringen
+ " SELECT TRUNC (SYSDATE + "+p_dateoffset+"+ (LEVEL - 1)) dag, 0, 0, fac.getweekdaynum (SYSDATE + "+p_dateoffset+"+(LEVEL - 1)), 0 "
+ " FROM DUAL"
+ " CONNECT BY LEVEL <= "+p_datelimit
+ " UNION ALL" // de vrije dagen daarvan
+ " SELECT mld_vrije_dagen_datum, 0, 1, 0, 0 "
+ " FROM mld_vrije_dagen vrij"
+ " , alg_gebouw g"
+ (p_flr_key > -1 ? " , alg_verdieping v" : "")
+ " WHERE vrij.mld_vrije_dagen_datum BETWEEN TRUNC (SYSDATE +"+(p_dateoffset||0)+") AND TRUNC (SYSDATE-1+"+(p_dateoffset||0)+"+"+p_datelimit+") "
+ (p_flr_key > -1 ? " AND v.alg_verdieping_key = " + p_flr_key
+ " AND v.alg_gebouw_key = g.alg_gebouw_key"
: " AND g.alg_gebouw_key = " + p_geb_key)
+ " AND vrij.mld_vrije_dagen_id = COALESCE(g.mld_vrije_dagen_id, 'Default')"
+ ")"
+ "GROUP BY datum ";
var local_tz;
if (p_flr_key > -1) {
local_tz = res.getTimezoneBy(p_flr_key, "V");
} else {
local_tz = res.getTimezoneBy(p_geb_key, "G");
}
if (p_resdate)
{
lsql = "SELECT * FROM (" + lsql + ") WHERE datum = " + p_resdate.toSQL();
function toLocalDate(expr) {
return convertToLocalTimeSQL(expr, local_tz);
}
var offsetExpr = (p_dateoffset || 0);
var localRsvDate = toLocalDate("rrd.res_rsv_deel_van");
var localResWeekday = "fac.getweekdaynum(" + localRsvDate + ")";
var localToday = "TRUNC(" + toLocalDate("SYSDATE") + ")";
var localRangeStart = localToday + " + " + offsetExpr;
var localRangeEnd = localToday + " + " + (offsetExpr + p_datelimit - 1);
var localResdateFilter, localVrijeDagFilter;
if (p_local_resdate) {
localResdateFilter = " AND TRUNC(" + localRsvDate + ") = " + p_local_resdate.toSQL();
localVrijeDagFilter = " vrij.mld_vrije_dagen_datum = " + p_local_resdate.toSQL();
} else {
localResdateFilter = " AND TRUNC(" + localRsvDate + ") BETWEEN " + localRangeStart + " AND " + localRangeEnd;
localVrijeDagFilter = " vrij.mld_vrije_dagen_datum BETWEEN " + localRangeStart + " AND " + localRangeEnd;
}
var localDayByLevel = localRangeStart + " + (LEVEL - 1)";
var lsql = "SELECT datum, SUM (gevuld) gevuld, MAX (aantal) aantal, MAX (vrijedag) vrijedag, MAX (weekdag) weekdag "
+ " FROM ("
+ " SELECT TRUNC(" + localRsvDate + ") datum,"
+ " SUM(rrd.res_rsv_deel_tot-rrd.res_rsv_deel_van)*24 gevuld,"
+ " vrij.mld_vrije_dagen_key vrijedag, "
+ " " + localResWeekday + " weekdag, "
+ " COUNT (*) aantal "
+ " FROM res_v_aanwezigrsv_deel rrd, "
+ " res_v_aanwezigdeel rd, "
+ " ins_v_aanwezigdeel id, "
+ " alg_v_allonroerendgoed plts, "
+ " alg_gebouw g,"
+ " mld_vrije_dagen vrij "
+ " WHERE rrd.res_deel_key = rd.res_deel_key "
+ " AND id.ins_alg_ruimte_key = plts.alg_onroerendgoed_keys "
+ " AND id.ins_alg_ruimte_type = plts.alg_type "
+ " AND vrij.mld_vrije_dagen_datum(+) = TRUNC(" + localRsvDate + ")"
+ " AND rd.res_ins_deel_key = id.ins_deel_key "
+ " AND rrd.res_rsv_deel_dirtlevel = 0"
+ (p_flr_key > -1 ? " AND plts.alg_verdieping_key = " + p_flr_key
: " AND plts.alg_gebouw_key = " + p_geb_key)
+ " AND g.alg_gebouw_key = plts.alg_gebouw_key"
+ " AND vrij.mld_vrije_dagen_id(+) = COALESCE(g.mld_vrije_dagen_id, 'Default')"
+ " AND rd.res_discipline_key IN (" + p_res_disc_key_arr.join(",") + ")"
+ localResdateFilter
+ " GROUP BY vrij.mld_vrije_dagen_key, TRUNC(" + localRsvDate + "), res_rsv_deel_van "
+ " UNION ALL"
+ " SELECT TRUNC(" + localDayByLevel + ") dag, 0, 0, fac.getweekdaynum(" + localDayByLevel + "), 0 "
+ " FROM DUAL"
+ " CONNECT BY LEVEL <= " + p_datelimit
+ " UNION ALL"
+ " SELECT vrij.mld_vrije_dagen_datum, 0, 1, 0, 0 "
+ " FROM mld_vrije_dagen vrij"
+ " , alg_gebouw g"
+ (p_flr_key > -1 ? " , alg_verdieping v" : "")
+ " WHERE " + localVrijeDagFilter
+ (p_flr_key > -1 ? " AND v.alg_verdieping_key = " + p_flr_key
+ " AND v.alg_gebouw_key = g.alg_gebouw_key"
: " AND g.alg_gebouw_key = " + p_geb_key)
+ " AND vrij.mld_vrije_dagen_id = COALESCE(g.mld_vrije_dagen_id, 'Default')"
+ ")"
+ " GROUP BY datum ";
if (p_local_resdate) {
lsql = "SELECT * FROM (" + lsql + ") WHERE datum = " + p_local_resdate.toSQL(); // Deze is al TRUNC'ed
}
if (p_act_key > 0)
@@ -248,13 +272,39 @@ rdpt = {
+ " )";
}
}
lsql = lsql + "ORDER BY 1";
lsql = lsql + " ORDER BY 1";
return lsql;
},
dagbezetting_resdelen_in_aanweziggebouw_sql: function (p_res_disc_key_arr, p_res_deel_key, p_geb_key, p_flr_key, p_dateoffset, p_datelimit, p_resdate, p_act_key)
dagbezetting_resdelen_in_aanweziggebouw_sql: function (p_res_disc_key_arr, p_res_deel_key, p_geb_key, p_dateoffset, p_datelimit, p_act_key)
{
var server_tz = S("fac_server_timezone");
var local_tz = res.getTimezoneBy(p_geb_key, "G") || server_tz;
function toServerDate(expr) {
return convertToServerTimeSQL(expr, local_tz);
}
function toLocalDate(expr) {
return convertToLocalTimeSQL(expr, local_tz);
}
// Deze functie converteert de gegeven expressie naar locale tijd, trunct die dan op locale dag, en converteert die naar server-tijd
function localizedTrunc(expr) {
return toServerDate("TRUNC(" + toLocalDate(expr) + ")");
}
var offsetExpr = (p_dateoffset || 0);
var localRsvDate = toLocalDate("rrd.res_rsv_deel_van");
var localRsvDateTrunced = "TRUNC(" + localRsvDate + ")";
var localResWeekday = "fac.getweekdaynum(" + toLocalDate("rrd.res_rsv_deel_van") + ")";
var localVervalDate = "TRUNC(" + toLocalDate("rd.res_deel_vervaldatum") + ")";
var serverFromLocalRangeStart = localizedTrunc("SYSDATE") + " + " + offsetExpr;
var serverFromLocalRangeEnd = localizedTrunc("SYSDATE") + " - 1 + " + offsetExpr + " + " + p_datelimit;
var serverDateFilter = " AND rrd.res_rsv_deel_van BETWEEN " + serverFromLocalRangeStart + " AND " + serverFromLocalRangeEnd;
var lsql = "SELECT datum"
+ " , ins_discipline_key"
+ " , ins_discipline_omschrijving"
@@ -265,13 +315,13 @@ rdpt = {
+ " , MAX(weekdag) weekdag"
+ " , MAX(aantal_delen) delen"
+ " FROM ("
+ " SELECT TRUNC(rrd.res_rsv_deel_van) datum"
+ " SELECT " + localRsvDateTrunced + " datum"
+ " , rdis.ins_discipline_key"
+ " , " + lcl.xsqla("rdis.ins_discipline_omschrijving", "rdis.ins_discipline_key")
+ " , rdis.ins_discipline_image"
+ " , SUM(rrd.res_rsv_deel_tot-rrd.res_rsv_deel_van)*24 gevuld"
+ " , vrij.mld_vrije_dagen_key vrijedag" // >0 is vrijedag
+ " , fac.getweekdaynum(res_rsv_deel_van) weekdag" // 7 en 1 zijn weekend
+ " , vrij.mld_vrije_dagen_key vrijedag"
+ " , " + localResWeekday + " weekdag"
+ " , COUNT(*) aantal"
+ " , 0 aantal_delen"
+ " FROM res_v_aanwezigrsv_deel rrd"
@@ -285,46 +335,44 @@ rdpt = {
+ (p_res_deel_key > -1 ? " AND rd.res_deel_key = " + p_res_deel_key : "")
+ " AND id.ins_alg_ruimte_key = plts.alg_onroerendgoed_keys"
+ " AND id.ins_alg_ruimte_type = plts.alg_type"
+ " AND vrij.mld_vrije_dagen_datum(+) = TRUNC (rrd.res_rsv_deel_van)"
+ " AND vrij.mld_vrije_dagen_datum(+) = " + localRsvDateTrunced
+ " AND rd.res_ins_deel_key = id.ins_deel_key"
+ " AND rrd.res_rsv_deel_dirtlevel = 0" // nodig?
+ " AND rrd.res_rsv_deel_dirtlevel = 0"
+ " AND rd.res_discipline_key = rdis.ins_discipline_key"
+ " AND rd.res_discipline_key IN (" + p_res_disc_key_arr.join(",") + ")"
+ (p_flr_key > -1 ? " AND plts.alg_verdieping_key = " + p_flr_key
: " AND plts.alg_gebouw_key = " + p_geb_key)
+ " AND plts.alg_gebouw_key = " + p_geb_key
+ " AND g.alg_gebouw_key = plts.alg_gebouw_key"
+ " AND vrij.mld_vrije_dagen_id(+) = COALESCE(g.mld_vrije_dagen_id, 'Default')"
+ (p_resdate ? " AND TRUNC(rrd.res_rsv_deel_van) = " + p_resdate.toSQL()
: " AND TRUNC(rrd.res_rsv_deel_van) BETWEEN TRUNC(SYSDATE +"+(p_dateoffset||0)+") AND TRUNC(SYSDATE-1+"+(p_dateoffset||0)+"+"+p_datelimit+")"
)
+ serverDateFilter
+ " AND ( rd.res_deel_vervaldatum IS NULL"
+ " OR rd.res_deel_vervaldatum > TRUNC(rrd.res_rsv_deel_van)"
+ " OR rd.res_deel_vervaldatum > rrd.res_rsv_deel_van"
+ " )"
+ " GROUP BY vrij.mld_vrije_dagen_key"
+ " , TRUNC(rrd.res_rsv_deel_van)"
+ " , " + localRsvDateTrunced
+ " , res_rsv_deel_van"
+ " , rdis.ins_discipline_key"
+ " , ins_discipline_omschrijving"
+ " , ins_discipline_image"
+ " UNION ALL" // de dagen zonder reserveringen + aantal reserveerbare eenheden
+ " UNION ALL"
+ " SELECT d.dag"
+ " , rdis.ins_discipline_key"
+ " , " + lcl.xsqla("rdis.ins_discipline_omschrijving", "rdis.ins_discipline_key")
+ " , rdis.ins_discipline_image"
+ " , 0"
+ " , 0"
+ " , d.dagnr"
+ " , fac.getweekdaynum(d.dag) dagnr"
+ " , 0"
+ " , COUNT(*)"
+ " FROM res_v_aanwezigdeel rd"
+ " , res_discipline rdis"
+ " , ins_v_aanwezigdeel id"
+ " , alg_v_allonroerendgoed plts"
+ ", (SELECT TRUNC(SYSDATE + " + p_dateoffset + "+ (LEVEL - 1)) dag"
+ " , fac.getweekdaynum(SYSDATE + "+p_dateoffset+"+(LEVEL - 1)) dagnr"
+ " FROM DUAL"
+ " CONNECT BY LEVEL <= " + p_datelimit
+ " ) d"
+ " , alg_gebouw g"
+ " , (SELECT TRUNC(" + toLocalDate("SYSDATE + " + p_dateoffset + " + (LEVEL - 1)") + ") dag"
+ " , fac.getweekdaynum(" + toLocalDate("SYSDATE + " + p_dateoffset + " + (LEVEL - 1)") + ") dagnr"
+ " FROM DUAL"
+ " CONNECT BY LEVEL <= " + p_datelimit
+ " ) d"
+ " WHERE id.ins_alg_ruimte_key = plts.alg_onroerendgoed_keys "
+ " AND id.ins_alg_ruimte_type = plts.alg_type"
+ " AND rd.res_ins_deel_key = id.ins_deel_key"
@@ -333,19 +381,17 @@ rdpt = {
)
+ " AND rd.res_discipline_key = rdis.ins_discipline_key"
+ " AND rd.res_discipline_key IN (" + p_res_disc_key_arr.join(",") +")"
+ (p_flr_key > -1 ? " AND plts.alg_verdieping_key = " + p_flr_key
: " AND plts.alg_gebouw_key = " + p_geb_key
)
+ " AND plts.alg_gebouw_key = " + p_geb_key
+ " AND g.alg_gebouw_key = plts.alg_gebouw_key"
+ " AND ( rd.res_deel_vervaldatum IS NULL"
+ " OR rd.res_deel_vervaldatum > d.dag"
+ " OR " + localVervalDate + " > d.dag"
+ " )"
+ " GROUP BY d.dag"
+ " , d.dagnr"
+ " , rdis.ins_discipline_key"
+ " , ins_discipline_omschrijving"
+ " , ins_discipline_image"
+ " UNION ALL" // de vrije dagen daarvan
+ " SELECT mld_vrije_dagen_datum"
+ " UNION ALL"
+ " SELECT vrij.mld_vrije_dagen_datum"
+ " , rdis.ins_discipline_key"
+ " , " + lcl.xsqla("rdis.ins_discipline_omschrijving", "rdis.ins_discipline_key")
+ " , rdis.ins_discipline_image"
@@ -357,17 +403,13 @@ rdpt = {
+ " FROM mld_vrije_dagen vrij"
+ " , res_discipline rdis"
+ " , alg_gebouw g"
+ (p_flr_key > -1 ? " , alg_verdieping v" : "")
+ " WHERE vrij.mld_vrije_dagen_datum BETWEEN TRUNC(SYSDATE +"+(p_dateoffset||0)+") AND TRUNC(SYSDATE-1+"+(p_dateoffset||0)+"+"+p_datelimit+")"
+ " AND rdis.ins_discipline_key IN (" + p_res_disc_key_arr.join(",") +")" // voor elke discipline die meedoet
+ (p_flr_key > -1 ? " AND v.alg_verdieping_key = " + p_flr_key
+ " AND v.alg_gebouw_key = g.alg_gebouw_key"
: " AND g.alg_gebouw_key = " + p_geb_key)
+ " WHERE vrij.mld_vrije_dagen_datum BETWEEN " + serverFromLocalRangeStart + " AND " + serverFromLocalRangeEnd
+ " AND rdis.ins_discipline_key IN (" + p_res_disc_key_arr.join(",") +")"
+ " AND g.alg_gebouw_key = " + p_geb_key
+ " AND vrij.mld_vrije_dagen_id = COALESCE(g.mld_vrije_dagen_id, 'Default')"
+ ")"
+ " GROUP BY ins_discipline_key, ins_discipline_omschrijving, ins_discipline_image, datum";
if (p_act_key > 0)
{
var sql = "SELECT res_activiteit_master_key"
@@ -381,23 +423,18 @@ rdpt = {
res_activiteit_duur = oRs("res_activiteit_duur").Value;
}
oRs.close();
if (master_act_key > 0)
{
if (master_act_key > 0) {
lsql = "SELECT * FROM (" + lsql + ")"
+ " WHERE EXISTS (SELECT 1 FROM res_rsv_ruimte"
+ " WHERE res_rsv_ruimte_verwijder IS NULL"
+ " AND res_activiteit_key = " + master_act_key
+ " AND TRUNC(res_rsv_ruimte_van) = datum"
+ " AND TRUNC(" + toLocalDate("res_rsv_ruimte_van") + ") = datum"
+ " )";
}
}
if (p_resdate)
{
lsql = "SELECT * FROM (" + lsql + ") WHERE datum = " + p_resdate.toSQL();
}
lsql += " ORDER BY ins_discipline_omschrijving, datum";
return lsql;
},
@@ -406,7 +443,26 @@ rdpt = {
// Zo kun je dus bezette plekken uitsluiten
res_deel_bezetting_op_dag_sql: function (p_res_disc_key_arr, p_geb_key, p_flr_key, p_resdate, p_maxbezet)
{
var lsql = "SELECT plaan.alg_plaatsaanduiding plaats, "
var server_tz = S("fac_server_timezone");
var local_tz = server_tz;
if (p_flr_key > -1) {
local_tz = res.getTimezoneBy(p_flr_key, "V");
} else {
local_tz = res.getTimezoneBy(p_geb_key, "G");
}
function toLocalDate(expr) {
return convertToLocalTimeSQL(expr, local_tz);
}
var localRsvDate = toLocalDate("rrd.res_rsv_deel_van");
var localRsvDateTrunced = "TRUNC(" + localRsvDate + ")";
// p_resdate is hier al de juiste (lokale) dag, TRUNC'ed
var localVervalDate = toLocalDate("rd.res_deel_vervaldatum");
var lsql = "SELECT plaan.alg_plaatsaanduiding plaats, "
+ lcl.xsql("rd.res_deel_omschrijving", "rd.res_deel_key") + " res_deel_omschrijving, "
+ " COALESCE(SUM (rrd.res_rsv_deel_tot - rrd.res_rsv_deel_van) * 24, 0) bezet, "
+ " rd.res_deel_key, "
@@ -428,13 +484,13 @@ rdpt = {
+ " AND plts.alg_onroerendgoed_keys = plaan.alg_onroerendgoed_keys "
+ " AND plts.alg_type = plaan.alg_type "
+ " AND rd.res_ins_deel_key = id.ins_deel_key "
+ " AND (rd.res_deel_vervaldatum IS NULL OR rd.res_deel_vervaldatum > "+p_resdate.toSQL()+")"
+ " AND (rd.res_deel_vervaldatum IS NULL OR " + localVervalDate + " > " + p_resdate.toSQL() + ")"
+ (p_flr_key>-1 ? " AND plts.alg_verdieping_key = " + p_flr_key
: " AND plts.alg_gebouw_key = " + p_geb_key
)
)
+ " AND rd.res_discipline_key = rdis.ins_discipline_key"
+ " AND rd.res_discipline_key IN (" + p_res_disc_key_arr.join(",") + ")"
+ " AND TRUNC (rrd.res_rsv_deel_van) = " + p_resdate.toSQL()
+ " AND " + localRsvDateTrunced + " = " + p_resdate.toSQL()
+ " GROUP BY plaan.alg_plaatsaanduiding, "
+ " rd.res_deel_omschrijving, "
+ " rd.res_deel_key, "
@@ -468,16 +524,16 @@ rdpt = {
+ " AND plts.alg_type = plaan.alg_type "
+ " AND rd.res_ins_deel_key = id.ins_deel_key "
+ " AND rd.res_discipline_key = rdis.ins_discipline_key"
+ " AND (rd.res_deel_vervaldatum IS NULL OR rd.res_deel_vervaldatum > "+p_resdate.toSQL()+")"
+ " AND (rd.res_deel_vervaldatum IS NULL OR " + localVervalDate + " > " + p_resdate.toSQL() + ")"
+ (p_flr_key>-1 ? " AND plts.alg_verdieping_key = " + p_flr_key
: " AND plts.alg_gebouw_key = " + p_geb_key
)
)
+ " AND rd.res_discipline_key IN (" + p_res_disc_key_arr.join(",") + ")"
+ " AND NOT EXISTS "
+ " (SELECT '' "
+ " FROM res_v_aanwezigrsv_deel rrd "
+ " WHERE rrd.res_deel_key = rd.res_deel_key "
+ " AND TRUNC (rrd.res_rsv_deel_van) = " + p_resdate.toSQL() +") "
+ " AND " + localRsvDateTrunced + " = " + p_resdate.toSQL() + ") "
+ " GROUP BY plaan.alg_plaatsaanduiding, "
+ " rd.res_deel_omschrijving, "
+ " rd.res_deel_key, "
@@ -488,7 +544,7 @@ rdpt = {
+ " ins_discipline_image, "
+ " rdis.ins_discipline_key, "
+ " ins_discipline_omschrijving "
+ " ORDER BY alg_verdieping_code,1,2 " ;
+ " ORDER BY alg_verdieping_code,1,2 ";
return lsql;
},
@@ -509,59 +565,92 @@ rdpt = {
// Geef de beschikbare intervallen uit p_bloktijden op p_resdate van p_res_deel_key, "" indien onbeschikbaar
getIntervalString: function (p_res_deel_key, p_resdate, p_bloktijden)
{
var lres="";
var server_tz = S("fac_server_timezone") || "";
var local_tz = server_tz;
if (p_res_deel_key > 0) {
var tzSql = "SELECT MIN(l.alg_locatie_timezone) alg_tz"
+ " FROM res_v_aanwezigdeel rd"
+ " , ins_v_aanwezigdeel id"
+ " , alg_v_allonroerendgoed plts"
+ " , alg_gebouw g"
+ " , alg_locatie l"
+ " WHERE rd.res_ins_deel_key = id.ins_deel_key"
+ " AND id.ins_alg_ruimte_key = plts.alg_onroerendgoed_keys"
+ " AND id.ins_alg_ruimte_type = plts.alg_type"
+ " AND plts.alg_gebouw_key = g.alg_gebouw_key"
+ " AND g.alg_locatie_key = l.alg_locatie_key"
+ " AND rd.res_deel_key = " + p_res_deel_key;
var tzRs = Oracle.Execute(tzSql);
var alg_tz = tzRs("alg_tz").Value;
tzRs.Close();
if (alg_tz) {
local_tz = alg_tz;
}
}
function toLocalDate(expr) {
return convertToLocalTimeSQL(expr, local_tz);
}
function toServerDate(expr) {
return convertToServerTimeSQL(expr, local_tz);
}
var lres = "";
var l_bloktijden = p_bloktijden.slice(0);
// bloktijden eerst resetten (snap niet waarom, ik heb toch een kopie?) JGL?
for (var i = 0; i < l_bloktijden.length; i++)
{
for (var i = 0; i < l_bloktijden.length; i++) {
l_bloktijden[i].bezet = false;
}
var localResVanExpr = toLocalDate("rm.res_rsv_ruimte_van");
var localResTotExpr = toLocalDate("rm.res_rsv_ruimte_tot");
// p_resdate is de lokale _dag_ (ge-TRUNCed dus)
var serverResdateRangeStart = toServerDate(p_resdate.toSQL());
var serverResdateRangeEnd = serverResdateRangeStart + " + 1";
var lsql = "SELECT rm.res_reservering_key,"
+ " rm.res_rsv_ruimte_volgnr,"
+ " rm.res_rsv_ruimte_key,"
+ " rm.res_rsv_ruimte_omschrijving,"
+ " res_rsv_ruimte_van,"
+ " res_rsv_ruimte_tot,"
+ " " + localResVanExpr + " AS res_rsv_ruimte_van,"
+ " " + localResTotExpr + " AS res_rsv_ruimte_tot,"
+ " 0 res_disc_params_preposttime"
+ " FROM res_rsv_ruimte rm,"
+ " res_rsv_deel rd"
+ " WHERE res_rsv_ruimte_van < {0}".format(p_resdate.endToSQL())
+ " AND res_rsv_ruimte_tot > {0}".format(p_resdate.beginToSQL())
+ " WHERE res_rsv_ruimte_van < " + serverResdateRangeEnd
+ " AND res_rsv_ruimte_tot > " + serverResdateRangeStart
+ " AND rd.res_rsv_ruimte_key = rm.res_rsv_ruimte_key"
+ " AND rd.res_deel_key = " + p_res_deel_key
+ " AND rm.res_rsv_ruimte_verwijder IS NULL"
+ " AND rd.res_rsv_deel_verwijder IS NULL"
+ " AND rd.res_rsv_deel_dirtlevel = 0"
+ " ORDER BY rm.res_rsv_ruimte_van"; // Eerste vooraan.
+ " ORDER BY res_rsv_ruimte_van";
// Bekijk voor dit object voor deze dag welke van de intervallen al bezet zijn
// en welke dus nog niet
var loRs = Oracle.Execute( lsql );
while (!loRs.Eof)
{
var loRs = Oracle.Execute(lsql);
while (!loRs.Eof) {
var van = new Date(loRs("res_rsv_ruimte_van").Value);
var tot = new Date(loRs("res_rsv_ruimte_tot").Value);
for (var i = 0; i < l_bloktijden.length; i++)
{
if (van < l_bloktijden[i].einddatum && tot > l_bloktijden[i].startdatum)
{
l_bloktijden[i].bezet = true;
for (var j = 0; j < l_bloktijden.length; j++) {
if (van < l_bloktijden[j].einddatum && tot > l_bloktijden[j].startdatum) {
l_bloktijden[j].bezet = true;
}
}
loRs.MoveNext();
}
loRs.Close();
for (var i = 0; i < l_bloktijden.length; i++)
{
if (!l_bloktijden[i].bezet)
lres += l_bloktijden[i].name +" | ";
for (var k = 0; k < l_bloktijden.length; k++) {
if (!l_bloktijden[k].bezet) {
lres += l_bloktijden[k].name + " | ";
}
}
if (lres.substr(lres.length-3, 3) == " | ")
lres = lres.substr(0, lres.length-3);
else
if (lres.substr(lres.length - 3, 3) === " | ") {
lres = lres.substr(0, lres.length - 3);
} else {
lres = "";
}
return lres;
},
@@ -574,6 +663,10 @@ rdpt = {
{
var begintijd = new Date(0, 0, 0, 23, 59, 0);
var eindtijd = new Date(0, 0, 0, 0, 0, 0);
// var begintijd = new Date();
// begintijd.setHours(23, 59);
// var eindtijd = new Date();
// eindtijd.setHours(0, 0);
var btBegintijd;
var btEindtijd;
var btArr;
@@ -586,13 +679,15 @@ rdpt = {
for (index = 0; index < bt.length; index++)
{
btArr = bt[index].begin.split(":");
btBegintijd = new Date(0, 0, 0, btArr[0], btArr[1], 0);
btBegintijd = new Date();
btBegintijd.setHours(btArr[0], btArr[1]);
if (btBegintijd.getTime() < begintijd.getTime())
{
begintijd = btBegintijd;
}
btArr = bt[index].end.split(":");
btEindtijd = new Date(0, 0, 0, btArr[0], btArr[1], 0);
btEindtijd = new Date();
btEindtijd.setHours(btArr[0], btArr[1]);
if (btEindtijd.getTime() > eindtijd.getTime())
{
eindtijd = btEindtijd;

View File

@@ -110,14 +110,19 @@ var sql = "SELECT sa.res_srtactiviteit_prefix"
+ " AND rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key (+)"
+ " AND rrr.res_rsv_ruimte_key = " + rsv_ruimte_key;
var oRs = Oracle.Execute(sql);
var res_van = new Date(oRs("res_rsv_ruimte_van").Value);
var res_tot = new Date(oRs("res_rsv_ruimte_tot").Value);
var server_res_van = new Date(oRs("res_rsv_ruimte_van").Value);
var server_res_tot = new Date(oRs("res_rsv_ruimte_tot").Value);
var res_ruimte_key = oRs("res_ruimte_key").Value;
var resnrtxt = oRs("resnrtxt").Value;
var hasFiat = oRs("res_rsv_ruimte_cat_appr").Value == 1;
var isCV = oRs("res_srtactiviteit_soort").Value == 1;
oRs.Close();
var local_tz = res.getRsvTimezone(rsv_ruimte_key);
function toLocalDate(expr) {
return convertToLocalTimeSQL(expr, local_tz);
}
%>
<html>
<head>
@@ -198,7 +203,8 @@ oRs.Close();
<body class="listmode">
<% var buttons = [];
if (this_res.canChangeCV)
var multi_tz = local_tz != S("fac_server_timezone") || local_tz != Session("time_zone"); // Hebben we te maken met een ruimte, gebruiker of server in een afwijkende tijdszone?
if (!multi_tz && this_res.canChangeCV)
buttons.push( { title: (this_res.hasCV ? L("lcl_change") : L("lcl_add")), icon: (this_res.hasCV ? "fa-fclt-edit" : "fa-plus"), action: "res_change()"});
if (this_res.canFiatteren)
buttons.push( {title: L("lcl_approve"), icon: "fa-check", action: "res_fiatteren()"});
@@ -273,20 +279,32 @@ oRs.Close();
function fnVantijd(oRs)
{
// Als Van en Tot verschillen tonen we de datum erbij, anders alleen de tijd
var vanDateString = (new Date(oRs("res_rsv_deel_tot").value).midnight().getTime() != new Date(oRs("res_rsv_deel_van").value).midnight().getTime() ? toDateTimeString(new Date(oRs("res_rsv_deel_van").value)) : toTimeString(new Date(oRs("res_rsv_deel_van").value)))
if (oRs("vanbinnentijd").value == 0)
var res_rsv_deel_van = oRs("local_res_rsv_deel_van").Value;
var res_rsv_deel_tot = oRs("local_res_rsv_deel_tot").Value;
// Als Van en Tot verschillen tonen we de datum erbij, anders alleen de tijd
var vanDateString = (new Date(res_rsv_deel_tot).midnight().getTime() != new Date(res_rsv_deel_van).midnight().getTime()
? toDateTimeString(res_rsv_deel_van, undefined, undefined, undefined, undefined, true)
: toTimeString(res_rsv_deel_van, undefined, true));
if (oRs("vanbinnentijd").value == 0) {
vanDateString = "<span class='outofbounds'>" + vanDateString + "</span>";
return vanDateString;
}
return vanDateString;
}
function fnTottijd(oRs)
{
// Als Van en Tot verschillen tonen we de datum erbij, anders alleen de tijd
var totDateString = (new Date(oRs("res_rsv_deel_tot").value).midnight().getTime() != new Date(oRs("res_rsv_deel_van").value).midnight().getTime() ? toDateTimeString(new Date(oRs("res_rsv_deel_tot").value)) : toTimeString(new Date(oRs("res_rsv_deel_tot").value)))
if (oRs("totbinnentijd").value == 0)
var res_rsv_deel_van = oRs("local_res_rsv_deel_van").Value;
var res_rsv_deel_tot = oRs("local_res_rsv_deel_tot").Value;
// Als Van en Tot verschillen tonen we de datum erbij, anders alleen de tijd
var totDateString = (new Date(res_rsv_deel_tot).midnight().getTime() != new Date(res_rsv_deel_van).midnight().getTime()
? toDateTimeString(res_rsv_deel_tot, undefined, undefined, undefined, undefined, true)
: toTimeString(res_rsv_deel_tot, undefined, true));
if (oRs("totbinnentijd").value == 0) {
totDateString = "<span class='outofbounds'>" + totDateString + "</span>";
return totDateString;
}
return totDateString;
}
function fnTijd(oRs)
@@ -375,6 +393,8 @@ var nonBulkFields = lcl.xsqla('rd.res_deel_omschrijving', 'rd.res_deel_key')
+ " , res.getdeelprijs(rrd.res_rsv_deel_key) res_rsv_deel_prijs" // zou je achterwege kunnen laten als !anydeelprijs
+ " , rrd.res_rsv_deel_van"
+ " , rrd.res_rsv_deel_tot"
+ " , " + toLocalDate("rrd.res_rsv_deel_van") + " local_res_rsv_deel_van"
+ " , " + toLocalDate("rrd.res_rsv_deel_tot") + " local_res_rsv_deel_tot"
+ " , rrd.res_rsv_deel_dirtlevel"
+ " , CASE WHEN k.km900 > 0 THEN 1 ELSE 0 END bewerkbaar"
+ " , rrd.res_rsv_deel_verwijder ddVerwijder"
@@ -426,6 +446,8 @@ var bulkFields = " distinct "
+ " , sel.selected * res.getdeelprijs(rrd.res_rsv_deel_key) res_rsv_deel_prijs" // zou je achterwege kunnen laten als !anydeelprijs
+ " , rrd.res_rsv_deel_van"
+ " , rrd.res_rsv_deel_tot"
+ " , " + toLocalDate("rrd.res_rsv_deel_van") + " local_res_rsv_deel_van"
+ " , " + toLocalDate("rrd.res_rsv_deel_tot") + " local_res_rsv_deel_tot"
+ " , rrd.res_rsv_deel_dirtlevel"
+ " , CASE WHEN k.km900 > 0 THEN 1 ELSE 0 END bewerkbaar"
+ " , rrd.res_rsv_deel_verwijder ddVerwijder"
@@ -527,10 +549,10 @@ var bulkFields = " distinct "
+ " AND r1.res_deel_key NOT IN ("
+ " SELECT distinct rrd.res_deel_key"
+ " FROM res_rsv_ruimte rrr, res_rsv_deel rrd, res_deel rd"
+ " WHERE ( rrr.RES_RSV_RUIMTE_VAN BETWEEN TO_DATE (" + res_van.toSQL(true) + ")"
+ " AND TO_DATE (" + res_tot.toSQL(true) + ")"
+ " OR rrr.RES_RSV_RUIMTE_TOT BETWEEN TO_DATE (" + res_van.toSQL(true) + ")"
+ " AND TO_DATE (" + res_tot.toSQL(true) + "))"
+ " WHERE ( rrr.res_rsv_ruimte_van BETWEEN TO_DATE (" + server_res_van.toSQL(true) + ")"
+ " AND TO_DATE (" + server_res_tot.toSQL(true) + ")"
+ " OR rrr.res_rsv_ruimte_tot BETWEEN TO_DATE (" + server_res_van.toSQL(true) + ")"
+ " AND TO_DATE (" + server_res_tot.toSQL(true) + "))"
+ " AND rrr.res_rsv_ruimte_key <> " + rsv_ruimte_key
+ " AND rrd.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key"
+ " AND rrd.res_deel_key = rd.res_deel_key"
@@ -731,6 +753,7 @@ var bulkFields = " distinct "
+ " , ra.res_rsv_artikel_levering"
+ " , ra.res_rsv_artikel_afhalen"
+ " , rr.res_rsv_ruimte_tot"
+ " , " + toLocalDate("rr.res_rsv_ruimte_tot") + " local_res_rsv_ruimte_tot"
+ " , ra.res_rsv_artikel_verwijder ddVerwijder"
+ " , CASE "
+ " WHEN (ra.res_rsv_artikel_levering BETWEEN res_rsv_ruimte_van "
@@ -799,7 +822,7 @@ var bulkFields = " distinct "
rst2.addColumn(new Column({caption: L("lcl_time"), content: fnTijd, datatype: "time", align:"center"}));
rst2.addColumn(new Column({caption: L("lcl_res_ophalen"), content: fnAfhaaltijd, datatype: "time", align:"center"}));
if (this_res.res_has_visitors)
rst2.addColumn(new Column({caption: L("lcl_to"), content: "res_rsv_ruimte_tot", datatype: "time", align:"center"}));
rst2.addColumn(new Column({caption: L("lcl_to"), content: "local_res_rsv_ruimte_tot", datatype: "time", align:"center"}));
if (anyartikelprijs)
rst2.addColumn(new Column({caption: L("lcl_r_price7"), content: "res_rsv_artikel_prijs", datatype: "currency"}));
if (resdeleted)

View File

@@ -209,6 +209,7 @@ FCLTHeader.Requires({plugins: ["jQuery"]})
}
else if (restype == "O") // zal rrr.mld_opdr_key gevuld zijn
{
// UNSUPPORTED; local_tz = ?
}
else
{ // CV
@@ -243,10 +244,9 @@ FCLTHeader.Requires({plugins: ["jQuery"]})
oRs.Close();
}
if (local_tz != S("fac_server_timezone")) {
rrr.rsv_ruimte_van = convertToLocalTime(rrr.rsv_ruimte_van, local_tz);
rrr.rsv_ruimte_tot = convertToLocalTime(rrr.rsv_ruimte_tot, local_tz);
}
// Local, zonder prefix, want we hebben de server-tijd niet nodig in dit bestand
rrr.rsv_ruimte_van = convertToLocalTime(rrr.rsv_ruimte_van, local_tz);
rrr.rsv_ruimte_tot = convertToLocalTime(rrr.rsv_ruimte_tot, local_tz);
}
%>
<script type="text/javascript">
@@ -426,8 +426,8 @@ FCLTHeader.Requires({plugins: ["jQuery"]})
var buttons = [];
if (rrr.rsv_ruimte_verwijder == null) // Anders mag je niets meer
{
if (this_res.canChange || this_res.canChangeFEExtended)
var multi_tz = local_tz != S("fac_server_timezone") || local_tz != Session("time_zone"); // Hebben we te maken met een ruimte, gebruiker of server in een afwijkende tijdszone?
if (!multi_tz && (this_res.canChange || this_res.canChangeFEExtended))
buttons.push( {title: L("lcl_change"), icon: "fa-fclt-edit", action: "res_change()"});
else if (this_res.canWriteNoShow)
buttons.push({action: "resNoShow()", title: L("lcl_res_no_show"), icon: "fa-frown"});
@@ -507,14 +507,14 @@ FCLTHeader.Requires({plugins: ["jQuery"]})
}
if (rrr.rsv_ruimte_tot.midnight().getTime() == rrr.rsv_ruimte_van.midnight().getTime())
{
ROFIELDTR("fldDateTime", L("lcl_date"), toDateString(rrr.rsv_ruimte_van, undefined, undefined, true), params);
var v_tot = (rrr.met_eindtijd ? " "+ L("lcl_tot") + " " + toTimeString(rrr.rsv_ruimte_tot, undefined, true) : "");
ROFIELDTR("fldDateTime", L("lcl_time"), toTimeString(rrr.rsv_ruimte_van, undefined, true) + v_tot, params);
ROFIELDTR("fldDateTime", L("lcl_date"), toDateString(rrr.rsv_ruimte_van, { isLocal: true }), params);
var v_tot = (rrr.met_eindtijd ? " "+ L("lcl_tot") + " " + toTimeString(rrr.rsv_ruimte_tot, { isLocal: true }) : "");
ROFIELDTR("fldDateTime", L("lcl_time"), toTimeString(rrr.rsv_ruimte_van, { isLocal: true }) + v_tot, params);
}
else // meerdaags
{
ROFIELDTR("fldDateTime", L("lcl_date"), toDateTimeString(rrr.rsv_ruimte_van, undefined, undefined, undefined, true), params);
ROFIELDTR("fldDateTime", L("lcl_res_endtime"), toDateTimeString(rrr.rsv_ruimte_tot, undefined, undefined, undefined, true), params);
ROFIELDTR("fldDateTime", L("lcl_date"), toDateTimeString(rrr.rsv_ruimte_van, { noMidnight: true, isLocal: true }), params);
ROFIELDTR("fldDateTime", L("lcl_res_endtime"), toDateTimeString(rrr.rsv_ruimte_tot, { noMidnight: true, isLocal: true }), params);
}
// if this_res.canReadNoShow??

View File

@@ -1033,8 +1033,9 @@ function _get_ParamDate(pColl, pName, defVal)
return val;
}
var val = _get_ParamInt(pColl, pName, -1);
if (val>0 && val<=8640000000000000)
if (val>0 && val<=8640000000000000) {
return new Date(val);
}
if (defVal instanceof Date)
return defVal;
@@ -1434,47 +1435,74 @@ function getUserHour(h)
// User time-zone = Session("time_zone")
// Server time-zone = S("fac_server_timezone")
// Lever de SQL op die de Datetime omzet naar de server tijdszone
function convertToServerTimeSQL(userDateTimeExpr, localTimezone) {
return convertToServerTime(userDateTimeExpr, localTimezone, true);
}
// Lever de SQL op die de Datetime omzet naar de localized tijdszone
function convertToLocalTimeSQL(serverDateTimeExpr, localTimezone) {
return convertToLocalTime(serverDateTimeExpr, localTimezone, true);
}
// Datetime van alg_locatie of user-tijdszone omzetten naar de server tijdszone
function convertToServerTime(userDateTime, localTimezone) {
function convertToServerTime(userDateTime, localTimezone, sqlOnly) {
if (!localTimezone) {
localTimezone = Session("time_zone"); // 'Local' = user timezone by default (= indien leeg)
}
return convertTimeZone(userDateTime, localTimezone, S("fac_server_timezone"));
return convertTimeZone(userDateTime, localTimezone, S("fac_server_timezone"), sqlOnly);
}
// Datetime van server tijdszone omzetten naar de alg_locatie of user-tijdszone
function convertToLocalTime(serverDateTime, localTimezone) {
function convertToLocalTime(serverDateTime, localTimezone, sqlOnly) {
if (!localTimezone) {
localTimezone = Session("time_zone"); // 'Local' = user timezone by default (= indien leeg)
}
return convertTimeZone(serverDateTime, S("fac_server_timezone"), localTimezone);
return convertTimeZone(serverDateTime, S("fac_server_timezone"), localTimezone, sqlOnly);
}
function convertTimeZone(thisDate, fromTZ, toTZ)
function convertTimeZone(thisDate, fromTZ, toTZ, sqlOnly)
{
if (!fromTZ || !toTZ || fromTZ.toUpperCase() == toTZ.toUpperCase())
return thisDate;
var sql = "SELECT CAST ("
+ "FROM_TZ (CAST ( "+thisDate.toSQL(true)+" AS TIMESTAMP), "+safe.quoted_sql(fromTZ)+")"
+ " AT TIME ZONE "+safe.quoted_sql(toTZ)+" AS DATE)"
var dateSQL = sqlOnly ? thisDate : thisDate.toSQL(true); // Bij sqlOnly wordt hier een veilige expressie verwacht
var sql = "CAST ("
+ "FROM_TZ (CAST ( " + dateSQL + " AS TIMESTAMP), " + safe.quoted_sql(fromTZ) + ")"
+ " AT TIME ZONE " + safe.quoted_sql(toTZ) + " AS DATE)";
if (sqlOnly) {
return sql;
} else {
sql = "SELECT " + sql
+ " AS newDate"
+ " FROM DUAL";
}
var oRs = Oracle.Execute(sql);
thisDate = new Date(oRs("newDate").value);
oRs.close();
return thisDate;
}
// This function should only be used to format display,
// <20> never as part of a computation.
// Als de jsDate van de user(client) afkomstig is, hoeft er geen conversie naar de user-time-zone plaats te vinden
function toTimeString(jsDate, bWithSeconds, isLocalTime)
function toTimeString(jsDate, arg2 /* bWithSeconds */, arg3 /* isLocal */)
{
var params = {};
if (arg2 && typeof arg2 === "object") {
// New style: toTimeString(jsDate, params)
params = arg2;
} else {
// Old style: toTimeString(jsDate, bWithSeconds, isLocal)
params = {
withSeconds: arg2,
isLocal: arg3
};
}
if (jsDate == null)
return "";
@@ -1495,16 +1523,29 @@ function toTimeString(jsDate, bWithSeconds, isLocalTime)
if (!jsDate)
return "";
if (!isLocalTime)
if (!params.isLocal)
jsDate = convertToLocalTime(jsDate);
ret = padout(jsDate.getHours()) + ":" + padout(jsDate.getMinutes());
if (bWithSeconds) ret += ":" + padout(jsDate.getSeconds());
if (params.withSeconds) ret += ":" + padout(jsDate.getSeconds());
return ret;
}
// Als de jsDate van de user(client) afkomstig is, hoeft er geen conversie naar de user-time-zone plaats te vinden
function toDateString(jsDate, noDay, pretty, isLocalDate)
function toDateString(jsDate, arg2 /* noDay */, arg3 /* pretty */, arg4 /* isLocal */)
{
var params = {};
if (arg2 && typeof arg2 === "object") {
// New style: toDateString(jsDate, params)
params = arg2;
} else {
// Old style: toDateString(jsDate, noDay, pretty, isLocal)
params = {
noDay: arg2,
pretty: arg3,
isLocal: arg4
};
}
var resstr = "";
var today = new Date().midnight();
var yesterday = (new Date(today))
@@ -1524,27 +1565,42 @@ function toDateString(jsDate, noDay, pretty, isLocalDate)
if (!jsDate)
return "";
if (!isLocalDate)
if (!params.isLocal)
jsDate = convertToLocalTime(jsDate);
// Ik wil graag, alleen als parameter friendly?, voor de datums gisteren, vandaag en morgen de tekst Gisteren, Vandaag en Morgen opleveren
// Voor lijsten/sortering is dat vaak niet handig, maar soms is het veel begrijpelijker. Als de mogelijkheid er is, kunnen we
// geleidelijk de toepassing uitbreiden. In Lopende zaken op de portal om mee te beginnen.
if (pretty && jsDate.midnight().getTime() == today.getTime())
if (params.pretty && jsDate.midnight().getTime() == today.getTime())
resstr = L("lcl_date_today");
else if (pretty && jsDate.midnight().getTime() == yesterday.getTime())
else if (params.pretty && jsDate.midnight().getTime() == yesterday.getTime())
resstr = L("lcl_date_yesterday");
else if (pretty && jsDate.midnight().getTime() == tomorrow.getTime())
else if (params.pretty && jsDate.midnight().getTime() == tomorrow.getTime())
resstr = L("lcl_date_tomorrow");
else
resstr = (noDay?"":calendar_names.daysMin[jsDate.getDay()] + " ") +
resstr = (params.noDay?"":calendar_names.daysMin[jsDate.getDay()] + " ") +
padout(jsDate.getDate()) + "-" + padout(jsDate.getMonth() + 1) + "-" + padout(jsDate.getFullYear());
return resstr;
}
function toDateTimeString(jsDate, bWithSeconds, noDay, prettyday, noMidnight, isLocalDate)
function toDateTimeString(jsDate, arg2 /* bWithSeconds */, arg3 /* noDay */, arg4 /* prettyday */, arg5 /* noMidnight */, arg6 /* isLocalDate */)
{
var params = {};
if (arg2 && typeof arg2 === "object") {
// New style: toDateTimeString(jsDate, params)
params = arg2;
} else {
// Old style: toDateTimeString(jsDate, bWithSeconds, noDay, prettyday, noMidnight, isLocalDate)
params = {
withSeconds: arg2,
noDay: arg3,
prettyday: arg4,
noMidnight: arg5,
isLocal: arg6
};
}
if (jsDate == null)
return "";
@@ -1554,14 +1610,15 @@ function toDateTimeString(jsDate, bWithSeconds, noDay, prettyday, noMidnight, is
if (typeof jsDate == "date") // een oRs("datum").value
jsDate = new Date(jsDate);
if (!isLocalDate) {
if (!params.isLocal) {
jsDate = convertToLocalTime(jsDate);
params.isLocal = true; // Nu wel
}
if (noMidnight && jsDate.getTime() == jsDate.midnight().getTime())
return toDateString(jsDate, noDay, prettyday, true)
if (params.noMidnight && jsDate.getTime() == jsDate.midnight().getTime())
return toDateString(jsDate, params)
else
return toDateString(jsDate, noDay, prettyday, true) + " " + toTimeString(jsDate, bWithSeconds, true)
return toDateString(jsDate, params) + " " + toTimeString(jsDate, params)
}
function defaultDate(code)

View File

@@ -155,18 +155,18 @@ function _FCLTcalendar (fieldID, params)
if (params.initTimeEmpty == 1)
var iniTime = "";
else
var iniTime = toTimeString(initDate, false, params.noConvert);
var iniTime = toTimeString(initDate, { isLocal: params.noConvert });
}
else
{
var iniTextDate = toDateString(initDate, false, false, params.noConvert);
var iniTextDate = toDateString(initDate, { isLocal: params.noConvert });
// Input type=date verwacht het formaat [YYYY-MM-DD]
var iniDateDate = new Date(initDate.getTime()-(initDate.getTimezoneOffset()*60000)).toISOString().substr(0,10);
var iniDateVal = initDate.valueOf();
if (params.initTimeEmpty == 1)
var iniTime = "";
else
var iniTime = toTimeString(initDate, false, params.noConvert);
var iniTime = toTimeString(initDate, { isLocal: params.noConvert });
}
var hiddentag = params.hidden? " style='display:none'" : ""; // Alleen op de calender, niet de tijd
if (params.readonly)

View File

@@ -19,25 +19,24 @@ function FCLTtimezoneselector(fieldName, params)
if (typeof params == "undefined") params = {};
// Wat we opslaan is een IANA string. Door readonly hier te ondersteunen regelen we de presentatie centraal
var sql = "SELECT DISTINCT tzname,"
var sql = "SELECT tzname,"
+ " '(UTC ' || RTRIM(TZ_OFFSET(tzname), CHR(0)) || ') ' || tzname AS label"
+ " FROM V$TIMEZONE_NAMES"
+ ((params.readonly && params.initVal != "") // als die NULL is, levert dit -terecht- ook niks op, gewenst sideeffect
? " WHERE tzname = " + safe.quoted_sql(params.initVal) // alleen de initVal tonen, dit is geen key
: " WHERE tzname LIKE '%/%'" // alleen continent/stad-format
+ " AND NOT tzname LIKE '%GMT%'" // filter aliassen
+ "AND ("
+ " tzname LIKE 'Europe/%' OR"
+ " tzname LIKE 'America/%' OR"
+ " tzname LIKE 'Asia/%' OR"
+ " tzname LIKE 'Australia/%' OR"
+ " tzname LIKE 'Africa/%' OR"
+ " tzname LIKE 'Pacific/%'"
+ ")"
+ "GROUP BY tzname, TZ_OFFSET(tzname)"
+ "ORDER BY TO_NUMBER(SUBSTR(TZ_OFFSET(tzname), 1, 3)"
+ " || SUBSTR(TZ_OFFSET(tzname), 5, 2)) ASC,"
+ " tzname"
: " WHERE NOT tzname LIKE '%GMT%'" // filter aliassen
+ " AND ("
+ " tzname LIKE 'Europe/%' OR"
+ " tzname LIKE 'America/%' OR"
+ " tzname LIKE 'Asia/%' OR"
+ " tzname LIKE 'Australia/%' OR"
+ " tzname LIKE 'Africa/%' OR"
+ " tzname LIKE 'Pacific/%'"
+ " )"
+ " GROUP BY tzname, TZ_OFFSET(tzname)"
+ " ORDER BY TO_NUMBER(SUBSTR(TZ_OFFSET(tzname), 1, 3)"
+ " || SUBSTR(TZ_OFFSET(tzname), 5, 2)) ASC,"
+ " tzname"
);
// de FCLTselector doet het niet lekker met initVal, readonly en suppressEmpty