diff --git a/APPL/RES/res_list_ppi.inc b/APPL/RES/res_list_ppi.inc index b21a748123..bf7fdfdfe4 100644 --- a/APPL/RES/res_list_ppi.inc +++ b/APPL/RES/res_list_ppi.inc @@ -31,6 +31,7 @@ + <% FCLTHeader.Requires({ plugins:["jQuery"], @@ -132,6 +133,9 @@ function res_list_ppi(pautfunction, params) var ora_date2 = dateto.beginToSQL(); var ora_date3 = datefrom.beginToSQL(); var ora_date4 = dateto.endToSQL(); + var ora_date5 = toUserTimeZone(datefrom).toSQL(true); + var ora_date6 = toUserTimeZone(dateto).toSQL(true); + //date_sql = " AND beschik.res_reservering_van BETWEEN " + ora_date1 + " AND " + ora_date2; if (room_key) @@ -161,7 +165,10 @@ function forhours(fn) var res = [] // Wel met hele uren rekenen, anders geeft dat hier problemen. for (i = Math.floor(S("res_rap_t1")); i < Math.floor(S("res_rap_t2") + 0.6); i++) - res.push(fn.call(null, i)); + { + var h = getServerHour(i) + res.push(fn.call(null, h, i)); + } return res; } //__Log(forhours(function (h) { return String(h); })); @@ -181,13 +188,13 @@ function forhours(fn) + " , rarg.res_discipline_key" + (dayschedule ? (" ," + forhours(function (h) { return " SUM(n" + String(h) + ") b" + String(h); })) - : " , SUM(GREATEST(LEAST(to_number(TO_CHAR(res_rsv_ruimte_tot, 'SSSSS')) / 3600" + : " , SUM(GREATEST(LEAST(to_number(TO_CHAR(res_rsv_ruimte_tot_tz, 'SSSSS')) / 3600" + " , COALESCE(res_ruimte_eindtijd, " + S("res_t2") + ")" + " ," + S("res_rap_t2") + " )" + " ," + (rap_t1_overruled? 0 : S("res_rap_t1")) // Als res_rap_t1 overruled is (geen waarde had) dan GREATEST automatisch 1-ste waarde te laten kiezen. + " )" - + " - LEAST(GREATEST(to_number(TO_CHAR(res_rsv_ruimte_van, 'SSSSS')) / 3600" + + " - LEAST(GREATEST(to_number(TO_CHAR(res_rsv_ruimte_van_tz, 'SSSSS')) / 3600" + " , COALESCE(res_ruimte_begintijd, " + S("res_t1") + ")" + " ," + S("res_rap_t1") + " )" @@ -202,7 +209,9 @@ function forhours(fn) ? " ," + forhours(function (h) { return "r.n" + String(h); }) : "") + " , r.res_rsv_ruimte_van" + + oRaAsUserTZ('r', 'res_rsv_ruimte_van') + " , r.res_rsv_ruimte_tot" + + oRaAsUserTZ('r', 'res_rsv_ruimte_tot') + " , ra.res_alg_ruimte_aanmaak" + " , ra.res_alg_ruimte_verwijder" + " , rr.res_ruimte_begintijd" @@ -220,9 +229,9 @@ function forhours(fn) + " AND ro.res_ruimte_key = rr.res_ruimte_key" + " AND rr.res_ruimte_key = ra.res_ruimte_key) rarg" + " WHERE res_rsv_ruimte_van BETWEEN " + ora_date3 + " AND " + ora_date4 - + " AND TO_CHAR(res_rsv_ruimte_van, 'd') >= 2" // --veronderstelt NLS_TERRITORY='AMERICA', 2 is maandag - + " AND TO_CHAR(res_rsv_ruimte_van, 'd') <= 6" - + " AND TRUNC(res_rsv_ruimte_van) NOT IN (SELECT mld_vrije_dagen_datum FROM mld_vrije_dagen)" + + " AND TO_CHAR(res_rsv_ruimte_van_tz, 'd') >= 2" // --veronderstelt NLS_TERRITORY='AMERICA', 2 is maandag + + " AND TO_CHAR(res_rsv_ruimte_van_tz, 'd') <= 6" + + " AND TRUNC(res_rsv_ruimte_van_tz) NOT IN (SELECT mld_vrije_dagen_datum FROM mld_vrije_dagen)" + " AND rarg.res_alg_ruimte_aanmaak <= " + ora_date2 + " AND (rarg.res_alg_ruimte_verwijder IS NULL" + " OR rarg.res_alg_ruimte_verwijder >= " + ora_date1 + ")" @@ -230,7 +239,7 @@ function forhours(fn) + " , rarg.res_discipline_key) bez" + " , (SELECT DISTINCT rr1.res_discipline_key" + " , ra.alg_ruimte_key" - + " , ((fac.Count_Work_Days(" + ora_date1 + "-1 , " + ora_date2 + "))" + + " , ((fac.Count_Work_Days(" + ora_date5 + "-1 , " + ora_date6 + "))" + (dayschedule ? "" : " * (LEAST(COALESCE(rr1.res_ruimte_eindtijd, " + S("res_t2") + ")" @@ -276,7 +285,9 @@ function forhours(fn) ? " ," + forhours(function (h) { return "r.n" + String(h); }) : "") + " , r.res_rsv_ruimte_van" + + oRaAsUserTZ('r', 'res_rsv_ruimte_van') + " , r.res_rsv_ruimte_tot" + + oRaAsUserTZ('r', 'res_rsv_ruimte_tot') + " , ra.res_alg_ruimte_aanmaak" + " , ra.res_alg_ruimte_verwijder" + " , rr.res_ruimte_begintijd" @@ -299,15 +310,15 @@ function forhours(fn) if (groupres == 16) { // Gebruik hele maanden in het berekenen van het aantal werkdagen. sql_sel_periode = "fac.count_Work_Days" - + "( DECODE(periode, TO_CHAR(" + ora_date1 + ",'yyyymm'), " + ora_date1 + ", fac.safe_to_date(periode || '01','yymmdd')) - 1" - + ", DECODE(periode, TO_CHAR(" + ora_date2 + ",'yyyymm'), " + ora_date2 + ", last_day(fac.safe_to_date(periode || '01','yymmdd')))" + + "( DECODE(periode, TO_CHAR(" + ora_date5 + ",'yyyymm'), " + ora_date5 + ", fac.safe_to_date(periode || '01','yymmdd')) - 1" + + ", DECODE(periode, TO_CHAR(" + ora_date6 + ",'yyyymm'), " + ora_date6 + ", last_day(fac.safe_to_date(periode || '01','yymmdd')))" + ")" - sql_grp_periode = "TO_CHAR(res_rsv_ruimte_van, 'yyyymm')"; + sql_grp_periode = "TO_CHAR(" + oRaAsUserTZ('', 'res_rsv_ruimte_van', true) + ", 'yyyymm')"; } if (groupres == 18 || groupres == 19) { // Alle dagen zijn goed. //Is de huidig geselecteerde dag een werkdag. sql_sel_periode = "1"; //"fac.count_Work_Days(to_date(werkbaredagen.periode,'yyyymmdd')-1, to_date(werkbaredagen.periode,'yyyymmdd'))"; - sql_grp_periode = "TO_CHAR(res_rsv_ruimte_van, 'yyyymmdd')"; + sql_grp_periode = "TO_CHAR(" + oRaAsUserTZ('', 'res_rsv_ruimte_van', true) + ", 'yyyymmdd')"; } var sql_bezetting = "SELECT rarg.alg_ruimte_key" @@ -315,8 +326,14 @@ function forhours(fn) + " , " + sql_grp_periode + " periode" + (dayschedule ? (", " + forhours(function (h) { return " SUM(n" + String(h) + ") b" + String(h); })) - : " , SUM( LEAST(to_number(TO_CHAR(rarg.res_rsv_ruimte_tot, 'SSSSS')) / 3600, COALESCE(rarg.res_ruimte_eindtijd, " + S("res_t2") +"))" - + " - GREATEST(to_number(TO_CHAR(rarg.res_rsv_ruimte_van, 'SSSSS')) / 3600, COALESCE(rarg.res_ruimte_begintijd," + S("res_t1") +"))" + // This fails if you execute this querie from one timezone to gather data from multiple or other timezone(s) + // because: + // 1. Reservations from another timezone may extend over 2 days when converted to the user's timezone, in which case the calculation is wrong + // 2. begin and end times from which to calculate is user bound, not location bound. + // + // Note: reservations outside 'opening' hours now result in 0 hours. + : " , SUM(LEAST(GREATEST(to_number(TO_CHAR(rarg.res_rsv_ruimte_tot_tz, 'SSSSS')) / 3600, COALESCE(rarg.res_ruimte_begintijd," + S("res_t1") +")), COALESCE(rarg.res_ruimte_eindtijd, " + S("res_t2") +"))" + + " - GREATEST(LEAST(to_number(TO_CHAR(rarg.res_rsv_ruimte_van_tz, 'SSSSS')) / 3600, COALESCE(rarg.res_ruimte_eindtijd, " + S("res_t2") +")), COALESCE(rarg.res_ruimte_begintijd," + S("res_t1") +"))" + " ) bezetting") + " FROM ("+ sql_reservering + ") rarg" + " WHERE rarg.res_rsv_ruimte_van BETWEEN " + ora_date3 + " AND " + ora_date4; @@ -324,10 +341,10 @@ function forhours(fn) // Ook zaterdag en zondag meetellen voor 18:Weekdag, 19:Datum. if (groupres == 16) { - sql_bezetting += " AND TO_CHAR(rarg.res_rsv_ruimte_van, 'd') >= 2" // --veronderstelt NLS_TERRITORY='AMERICA', 2 is maandag - + " AND TO_CHAR(rarg.res_rsv_ruimte_van, 'd') <= 6"; + sql_bezetting += " AND TO_CHAR(rarg.res_rsv_ruimte_van_tz, 'd') >= 2" // --veronderstelt NLS_TERRITORY='AMERICA', 2 is maandag + + " AND TO_CHAR(rarg.res_rsv_ruimte_van_tz, 'd') <= 6"; } - sql_bezetting += " AND TO_CHAR(rarg.res_rsv_ruimte_van, 'yyyymmdd') NOT IN" + sql_bezetting += " AND TO_CHAR(rarg.res_rsv_ruimte_van_tz, 'yyyymmdd') NOT IN" + "(SELECT to_char(mld_vrije_dagen_datum, 'yyyymmdd')" + " FROM mld_vrije_dagen" + ")" @@ -395,7 +412,6 @@ function forhours(fn) + sql_floor + sql_rooms; } - sql = discxalg3d(sql, "beschik.res_discipline_key", "di.alg_regio_key", @@ -423,7 +439,7 @@ function forhours(fn) res_colums = [ [L("lcl_location"), "locatie", "string", false], [L("lcl_res_nr_of_rooms"), "aantal_ruimten", "number", true]]; - res_colums = res_colums.concat(forhours(function (h) { return [String(h) + ":00", "t" + String(h), "float", true]; })); + res_colums = res_colums.concat(forhours(function (i, h) { return [String(h) == "23" ? "23:00 - 00:00" : String(h) + ":00 - " + String(h + 1) + ":00", "t" + String(i), "float", false, true];})); select_sql = ", " + forhours(function (h) { return "(CASE WHEN SUM(beschikbaar) = 0 THEN SUM(b"+String(h)+") ELSE ROUND((SUM(b"+String(h)+") / SUM(beschikbaar)) * 100, 2) END) t"+String(h)+""; }); //order_by = "13"; @@ -475,7 +491,7 @@ function forhours(fn) if (dayschedule) { res_colums = [ [L("lcl_month"), fnrowMaand, "string", false] ]; - res_colums = res_colums.concat(forhours(function (h) { return [String(h) + ":00", "t" + String(h), "float", false, true]; })); + res_colums = res_colums.concat(forhours(function (i, h) { return [String(h) == "23" ? "23:00 - 00:00" : String(h) + ":00 - " + String(h + 1) + ":00", "t" + String(i), "float", false, true];})); sql = " SELECT periode res_keycolumn" + select_sql @@ -501,7 +517,7 @@ function forhours(fn) if (dayschedule) { res_colums = [ [L("lcl_weekday"), fnrowMaand, "string", false] ]; - res_colums = res_colums.concat(forhours(function (h) { return [String(h) == "23" ? "23:00 - 00:00" : String(h) + ":00 - " + String(h + 1) + ":00", "t" + String(h), "float", false, true]; })); + res_colums = res_colums.concat(forhours(function (i, h) { return [String(h) == "23" ? "23:00 - 00:00" : String(h) + ":00 - " + String(h + 1) + ":00", "t" + String(i), "float", false, true];})); sql = " SELECT TO_CHAR(TO_DATE(periode,'yyyymmdd'),'d') res_keycolumn" + select_sql @@ -528,7 +544,7 @@ function forhours(fn) if (dayschedule) { res_colums = [ [L("lcl_date"), fnrowMaand, "string", false] ]; - res_colums = res_colums.concat(forhours(function (h) { return [String(h) + ":00", "t" + String(h), "float", false, true]; })); + res_colums = res_colums.concat(forhours(function (i, h) { return [String(h) == "23" ? "23:00 - 00:00" : String(h) + ":00 - " + String(h + 1) + ":00", "t" + String(i), "float", false, true];})); sql = " SELECT periode res_keycolumn" + select_sql @@ -586,7 +602,7 @@ function forhours(fn) { res_colums = [ [L("lcl_room"), "ruimte", "string", false] ]; - res_colums = res_colums.concat(forhours(function (h) { return [String(h) + ":00", "t" + String(h), "float", true]; })); + res_colums = res_colums.concat(forhours(function (i, h) { return [String(h) == "23" ? "23:00 - 00:00" : String(h) + ":00 - " + String(h + 1) + ":00", "t" + String(i), "float", false, true];})); //select_sql = ", " + forhours(function (h) { return "ROUND((SUM(b"+String(h)+") / SUM(beschikbaar)) * 100, 2) t"+String(h)+""; }) sql = " SELECT rg.alg_ruimte_key res_keycolumn" @@ -732,13 +748,13 @@ function forhours(fn) if (res_rap_t1m < 10) res_rap_t1m = "0" + res_rap_t1m; var res_rap_t1s = res_rap_t1h + ":" + res_rap_t1m + var res_rap_t2h = Math.floor(S("res_rap_t2")); if (res_rap_t2h < 10) res_rap_t2h = "0" + res_rap_t2h; var res_rap_t2m = Math.floor((S("res_rap_t2") - res_rap_t2h)*60); if (res_rap_t2m < 10) res_rap_t2m = "0" + res_rap_t2m; var res_rap_t2s = res_rap_t2h + ":" + res_rap_t2m - var doTotals = (groupres != 16 && groupres != 18 && groupres != 19) var rst = new ResultsetTable({ keyColumn: "res_keycolumn", ID: "restable", diff --git a/APPL/Shared/Shared.inc b/APPL/Shared/Shared.inc index a548d5853a..472e26bae2 100644 --- a/APPL/Shared/Shared.inc +++ b/APPL/Shared/Shared.inc @@ -679,6 +679,47 @@ function transitQS() function padout(number) { return (number < 10) ? "0" + number : number; } +function oRaAsUserTZ(prefix, varName, isGroupClause) +{ + if (prefix != "") + prefix += "."; + + ///// + // Returns; + // for GROUP BY Clause: the same prefix + "." + varName + // for SELECT Clause: the same prefix + "." + varName with correct syntax and an Alias as + "_tz" + ///// + if (Session("time_zone") == "Europe/Amsterdam") + return (isGroupClause ? "" : " , ") + + prefix + varName + + (isGroupClause ? "" : " " + varName + "_tz"); + + ///// + // Returns; + // for GROUP BY Clause: syntax for converted timezone + // for SELECT Clause: syntax for converted timezone with comma for SELECT Clause, named: [varName + "_tz"] + ///// + return (isGroupClause ? "" : " , ") + + "CAST(FROM_TZ(CAST(" + prefix + varName + " AS TIMESTAMP), TO_CHAR (SYSTIMESTAMP, 'tzr')) AT TIME ZONE SESSIONTIMEZONE AS DATE)" + + (isGroupClause ? "" : " " + varName + "_tz"); +} + +function getServerHour(h) +{ + var tempDate = new Date(); + tempDate.setHours(h); + tempDate = toServerTimeZone(tempDate); + return tempDate.getHours(); +} + +function getUserHour(h) +{ + var tempDate = new Date(); + tempDate.setHours(h); + tempDate = toUserTimeZone(tempDate); + return tempDate.getHours(); +} + function toUserTimeZone(thisDate) { return convertTimeZone(thisDate, "Europe/Amsterdam", Session("time_zone")); @@ -715,7 +756,7 @@ function convertTimeZone(thisDate, fromTZ, toTZ) // – never as part of a computation. function toTimeString(jsDate, bWithSeconds, converted) { - if (jsDate===null) + if (jsDate==null) return ""; if (typeof jsDate == "object" && jsDate.type == 135/*adDBTimeStamp, oRs("datum")*/) @@ -751,7 +792,7 @@ function toDateString(jsDate, noDay, pretty, converted) var tomorrow = (new Date(today)); tomorrow.setDate(today.getDate()+1); - if (jsDate===null) + if (jsDate==null) return ""; if (typeof jsDate == "object" && jsDate.type == 135/*adDBTimeStamp, oRs("datum")*/) @@ -784,7 +825,7 @@ function toDateString(jsDate, noDay, pretty, converted) } function toDateTimeString(jsDate, bWithSeconds, noDay, prettyday) { - if (jsDate===null) + if (jsDate==null) return ""; if (typeof jsDate == "object" && jsDate.type == 135/*adDBTimeStamp, oRs("datum")*/)