853 lines
36 KiB
Plaintext
853 lines
36 KiB
Plaintext
<%@ language = "JavaScript" %>
|
|
<% /*
|
|
$Revision$
|
|
$Id$
|
|
|
|
File: res_multi.asp
|
|
Description: Maak een dialoog om gegevens van een deelreservering
|
|
repeterend te maken
|
|
Parameters:
|
|
rsv_ruimte_key bron-deelreservering
|
|
Context:
|
|
Note:
|
|
*/
|
|
%>
|
|
<!--#include file="../Shared/common.inc"-->
|
|
<!--#include file="../Shared/iface.inc"-->
|
|
<!--#include file="../Shared/selector.inc"-->
|
|
<!--#include file="../Shared/calendar.inc"-->
|
|
<!--#include file="./res.inc"-->
|
|
<%
|
|
FCLTHeader.Requires({plugins: ["jQuery"],
|
|
js: ["date.js"]})
|
|
|
|
|
|
var urole = getQParamSafe("urole");
|
|
var frontend = urole == "fe";
|
|
var rsv_ruimte_key = getQParamInt("rsv_ruimte_key");
|
|
res.res_set_dialect(rsv_ruimte_key);
|
|
|
|
var this_res = res.func_enabled(rsv_ruimte_key); // wat mocht ik zoal op deze reservering
|
|
if (urole == "fe")
|
|
{
|
|
var rDisc; // Nodig als parameter, zonder waarde.
|
|
var this_res_optimistic = res.func_enabled(rsv_ruimte_key, rDisc, {checkOptimistic: true});
|
|
// Veelgevraagd: autoswitch naar fo als geen fe-schrijfrechten
|
|
if (!this_res_optimistic.canWrite("WEB_RESUSE") && this_res_optimistic.canWrite("WEB_RESFOF"))
|
|
urole = "fo";
|
|
}
|
|
user.auth_required_or_abort(this_res.couldCreate);
|
|
|
|
%>
|
|
<html>
|
|
<head>
|
|
<% FCLTHeader.Generate() %>
|
|
<%
|
|
// Is dit een reservering met meerder deelreserveringen in een korte periode
|
|
// (opbouw, evenement, opruimen) ?
|
|
var zelfdedag = false;
|
|
if (urole == "fo")
|
|
{
|
|
var sql_ev = "SELECT MAX((res_rsv_ruimte_tot)) - MIN((res_rsv_ruimte_van)) tijdspad"
|
|
+ " FROM res_rsv_ruimte"
|
|
+ " WHERE res_reservering_key = "
|
|
+ "(SELECT res_reservering_key"
|
|
+ " FROM res_rsv_ruimte"
|
|
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key
|
|
+ ")"
|
|
+ " HAVING COUNT(res_rsv_ruimte_key) > 1";
|
|
var oRs_ev = Oracle.Execute(sql_ev);
|
|
if (!oRs_ev.eof)
|
|
zelfdedag = (oRs_ev("tijdspad").Value < S("res_copy_all_time_frame"));
|
|
oRs_ev.Close();
|
|
}
|
|
|
|
// =========================================
|
|
// Eerst wat info ophalen
|
|
sql = "SELECT rr.res_reservering_key"
|
|
+ " , rr.res_reservering_ispool"
|
|
+ " , rrr.res_rsv_ruimte_van"
|
|
+ " , rrr.res_rsv_ruimte_tot"
|
|
+ " , TRUNC(rrr.res_rsv_ruimte_tot) - TRUNC(rrr.res_rsv_ruimte_van) + 1 res_rsv_ruimte_len"
|
|
+ " , rrr.res_activiteit_key"
|
|
+ " , COALESCE( LEAST( COALESCE(r.res_ruimte_limiet, a.res_activiteit_limiet)"
|
|
+ " , COALESCE(a.res_activiteit_limiet, r.res_ruimte_limiet)"
|
|
+ " )"
|
|
+ " , " + S("res_reservering_limiet")
|
|
+ " ) act_limiet"
|
|
+ " , COALESCE( LEAST( COALESCE(r.res_ruimte_limiet, a.res_activiteit_limiet_fe)"
|
|
+ " , COALESCE(a.res_activiteit_limiet_fe, r.res_ruimte_limiet)"
|
|
+ " )"
|
|
+ " , " + S("res_fe_reservering_limiet")
|
|
+ " ) act_limiet_fe"
|
|
+ " , rrr.res_rsv_ruimte_volgnr"
|
|
+ " , r.res_ruimte_startdatum"
|
|
+ " , r.res_ruimte_vervaldatum"
|
|
+ " , r.res_discipline_key"
|
|
+ " , COALESCE(rrg.alg_gebouw_key, alg.alg_gebouw_key) alg_gebouw_key"
|
|
+ " FROM res_reservering rr"
|
|
+ " , res_rsv_ruimte rrr"
|
|
+ " , res_ruimte_opstelling ro"
|
|
+ " , res_ruimte r"
|
|
+ " , alg_v_allonroerendgoed alg"
|
|
+ " , res_activiteit a"
|
|
+ " , res_v_res_ruimte_gegevens_all rrg"
|
|
+ " WHERE rr.res_reservering_key = rrr.res_reservering_key"
|
|
+ " AND rrr.res_activiteit_key = a.res_activiteit_key"
|
|
+ " AND rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key(+)"
|
|
+ " AND ro.res_ruimte_key = r.res_ruimte_key(+)"
|
|
+ " AND ro.res_ruimte_key = rrg.res_ruimte_key(+)" // restype = R
|
|
+ " AND rrr.alg_ruimte_key = alg.alg_ruimte_key(+)" // restype = CV
|
|
+ " AND res_rsv_ruimte_key = " + rsv_ruimte_key;
|
|
oRs = Oracle.Execute(sql);
|
|
// Als de ruimte al vervallen is kun je direct wel stoppen.
|
|
var ruimte_startdatum = oRs("res_ruimte_startdatum").Value;
|
|
var ruimte_vervaldatum = oRs("res_ruimte_vervaldatum").Value;
|
|
|
|
// Get vrije_dagen for specific building
|
|
var gebouw_key = oRs("alg_gebouw_key").Value;
|
|
var vrije_dagen_alt = [];
|
|
if (gebouw_key !== null) { // restype = [O]pdr geeft nog steeds gebouw_key === null
|
|
var sqlVrijeDagen = "SELECT ag.mld_vrije_dagen_id"
|
|
+ " , mv.mld_vrije_dagen_datum"
|
|
+ " FROM alg_gebouw ag"
|
|
+ " , mld_vrije_dagen mv"
|
|
+ " WHERE ag.mld_vrije_dagen_id = mv.mld_vrije_dagen_id"
|
|
+ " AND ag.alg_gebouw_key = " + gebouw_key;
|
|
var oRs2 = Oracle.Execute(sqlVrijeDagen);
|
|
while (!oRs2.eof)
|
|
{
|
|
if(oRs2("mld_vrije_dagen_id").Value != "Default") {
|
|
vrije_dagen_alt.push((new Date(oRs2("mld_vrije_dagen_datum").Value)).getTime());
|
|
}
|
|
oRs2.MoveNext();
|
|
}
|
|
oRs2.Close();
|
|
}
|
|
|
|
var daysToExpire = null;
|
|
if (ruimte_startdatum != null)
|
|
{
|
|
ruimte_startdatum = new Date(ruimte_startdatum);
|
|
}
|
|
if (ruimte_vervaldatum != null)
|
|
{
|
|
ruimte_vervaldatum = new Date(ruimte_vervaldatum);
|
|
daysToExpire = (ruimte_vervaldatum.midnight().getTime() - new Date().midnight().getTime())/(24*3600*1000);
|
|
if (daysToExpire <= 0)
|
|
abort_with_warning(L("lcl_res_room_expired").format(toDateString(ruimte_vervaldatum)));
|
|
}
|
|
|
|
// Maak een lijst met alle dagen van de huidige reservering.
|
|
var gereserveerde_dagen = [];
|
|
var res_dag_van = (new Date(oRs("res_rsv_ruimte_van").Value));
|
|
var res_dag_tot = (new Date(oRs("res_rsv_ruimte_tot").Value));
|
|
res_dag_van.setHours(0, 0, 0, 0);
|
|
res_dag_tot.setHours(0, 0, 0, 0);
|
|
var res_dag = new Date(res_dag_van);
|
|
while (res_dag <= res_dag_tot)
|
|
{
|
|
gereserveerde_dagen.push(res_dag.getTime());
|
|
res_dag.setDate(res_dag.getDate() + 1);
|
|
}
|
|
|
|
var rrr = { rsv_ruimte_key : rsv_ruimte_key,
|
|
reservering_key : oRs("res_reservering_key").Value,
|
|
reservering_ispool: oRs("res_reservering_ispool").Value == 1,
|
|
rsv_ruimte_van : new Date(oRs("res_rsv_ruimte_van").Value),
|
|
rsv_ruimte_tot : new Date(oRs("res_rsv_ruimte_tot").Value),
|
|
rsv_ruimte_len : oRs("res_rsv_ruimte_len").Value,
|
|
rsv_ruimte_volgnr : oRs("res_rsv_ruimte_volgnr").Value,
|
|
ruimte_startdatum : ruimte_startdatum,
|
|
ruimte_vervaldatum: ruimte_vervaldatum,
|
|
act_key : oRs("res_activiteit_key").Value,
|
|
act_eff_limiet : oRs("act_limiet").Value,
|
|
act_eff_limiet_fe : oRs("act_limiet_fe").Value,
|
|
disc_key : oRs("res_discipline_key").Value
|
|
}
|
|
var disc_expire = (rrr.disc_key
|
|
? res.discipline_expire(rrr.disc_key, (S("res_247organisation")==1?2:0))
|
|
: this_res.earliest_expire_change
|
|
);
|
|
oRs.Close();
|
|
var res_aantal_dagen = rrr.rsv_ruimte_van - rrr.rsv_ruimte_tot;
|
|
|
|
var sql_min = "SELECT TRUNC(SYSDATE) - TRUNC(MIN(res_rsv_ruimte_van)) minDays"
|
|
+ " FROM res_rsv_ruimte"
|
|
+ " WHERE res_reservering_key = " + rrr.reservering_key
|
|
+ " AND res_rsv_ruimte_verwijder IS NULL";
|
|
var oRs_min = Oracle.Execute(sql_min);
|
|
var minDays = Math.max(0, oRs_min("minDays").Value);
|
|
oRs_min.Close();
|
|
var maxPast = ((urole=="fe") ? 0 : (S("res_reservering_maxpast") >= 0 ? S("res_reservering_maxpast") : rrr.eff_act_limiet));
|
|
maxPast = ((urole=="fe") ? 0 : (typeof maxPast !== "undefined" ? Math.min(maxPast, minDays) : minDays));
|
|
%>
|
|
<script type="text/javascript">
|
|
// 24/7 organisation
|
|
// 0 = Weekends are holidays (Reservations allowed)
|
|
// 1 = Weekends are working days
|
|
// 2 = Weekends are strict holidays (No reservations allowed)
|
|
var res247orgType = (<%=S("res_247organisation")%>);
|
|
var earliest_expire_change = new Date(<%=disc_expire.getTime()%>);
|
|
var frontend = <%=frontend? 1 : 0%> == 1;
|
|
var gereserveerde_dagen = [<%=gereserveerde_dagen%>];
|
|
var mld_vrije_dagen_alt = [<%=vrije_dagen_alt%>];
|
|
if (mld_vrije_dagen_alt.length > 0)
|
|
mld_vrije_dagen = mld_vrije_dagen_alt;
|
|
|
|
var res_org_date_tot = new Date(<%=rrr.rsv_ruimte_tot.getTime()%>);
|
|
var new_dates_arr = [];
|
|
var res_aantal_dagen = <%=rrr.rsv_ruimte_len%>; // Reserveringen langer dan een maand kunnen niet herhaald worden.
|
|
// Maximale herhaalperiode is een maand dus als de reservering zelf
|
|
// langer dan een maand is overlapt het zichzelf!
|
|
|
|
<%
|
|
// ============================================
|
|
// Maak lijst met bestaande reserveringen
|
|
// ============================================
|
|
var sql = "SELECT rm.res_rsv_ruimte_key"
|
|
+ " , rm.res_rsv_ruimte_van"
|
|
+ " , rm.res_rsv_ruimte_tot"
|
|
+ " , rm.res_rsv_ruimte_volgnr"
|
|
+ " , rm.res_rsv_ruimte_dirtlevel"
|
|
+ " , (SELECT COUNT(*)"
|
|
+ " FROM res_rsv_artikel ra"
|
|
+ " WHERE ra.res_rsv_artikel_verwijder IS NULL"
|
|
+ " AND ra.res_rsv_ruimte_key = rm.res_rsv_ruimte_key"
|
|
+ " ) aantal_catering"
|
|
+ " FROM res_rsv_ruimte rm"
|
|
+ " WHERE rm.res_reservering_key = " + rrr.reservering_key
|
|
+ " AND rm.res_rsv_ruimte_verwijder IS NULL"
|
|
+ " ORDER BY rm.res_rsv_ruimte_van"
|
|
+ " , rm.res_rsv_ruimte_key";
|
|
|
|
%>
|
|
var res_existing_dates = [0
|
|
<%
|
|
var oRs = Oracle.Execute(sql);
|
|
var multidate = false;
|
|
var hasCatering = false;
|
|
while (!oRs.Eof)
|
|
{
|
|
var vandate = new Date(oRs("res_rsv_ruimte_van").Value).midnight();
|
|
var totdate = new Date(oRs("res_rsv_ruimte_tot").Value).midnight();
|
|
if (vandate.getTime() != totdate.getTime())
|
|
{
|
|
multidate = true;
|
|
}
|
|
if (oRs("aantal_catering").Value > 0)
|
|
{
|
|
hasCatering = true;
|
|
}
|
|
Response.Write(", " + vandate.getTime());
|
|
oRs.MoveNext;
|
|
}
|
|
oRs.Close();
|
|
%>
|
|
];
|
|
<% if (multidate && hasCatering)
|
|
{ %>
|
|
$(function () { FcltMgr.closeDetail(window, { cancel: true, warning: L("lcl_res_no_multi_multi") } ) });
|
|
</script>
|
|
<% Response.End;
|
|
// <script> syntax highlight correction
|
|
} %>
|
|
|
|
function withdeelrestoggle()
|
|
{
|
|
let checked = $("#withdeelres").prop("checked");
|
|
$("#show_date_from0").closest("tr").find("td.label").text((checked ? L("lcl_date") : L("lcl_res_repeat2")));
|
|
|
|
$("#resmakedates").toggle(!checked);
|
|
$("#isnewres").closest("tr").toggle(!checked);
|
|
$("#sel_cycle").closest("tr").toggle(!checked);
|
|
$("#date_to0").closest("tr").toggle(!checked);
|
|
$("#n_periods").closest("tr").toggle(!checked);
|
|
$("#withWeekends").closest("tr").toggle(!checked);
|
|
$("#show_date_from").closest(".block-wrapper").prev(".simple-block-wrapper").addBack().toggle(!checked); // de kalenders & de buttons "Tonen datums" en "Wissen datums"
|
|
FcltMgr.resized();
|
|
}
|
|
|
|
function eraseDates()
|
|
{
|
|
new_dates_arr = [];
|
|
window.dates = [];
|
|
$("#show_date_from").datepicker("refresh"); // undocumented maar werkt bij 1.7.3
|
|
$("#show_date_to0").html("");
|
|
$("#newDates").empty();
|
|
}
|
|
|
|
function fillDateArray(chk_lastmin)
|
|
{
|
|
var np = $("#n_periods").val();
|
|
var nextDate = new Date(parseInt($("#date_from0").val()));
|
|
nextDate.setHours(0, 0, 0, 0);
|
|
var interval = parseInt($("#sel_cycle").val());
|
|
var res_new_dates = [];
|
|
var limitDate = null;
|
|
<%
|
|
var limit = ((urole == "fe" && rrr.act_eff_limiet_fe > 0) ? rrr.act_eff_limiet_fe : rrr.act_eff_limiet);
|
|
|
|
// MGE: Als de ruimte vervallen is (daysToExpire <= 0) dan is er hierboven al een abort_with_warning geweest en kom je hier nooit.
|
|
|
|
if (daysToExpire != null && daysToExpire >= 0 && daysToExpire < limit)
|
|
limit = daysToExpire - 1; // De vervaldatum niet meerekenen.
|
|
|
|
if (limit > 0)
|
|
{
|
|
%>
|
|
limitDate = new Date();
|
|
limitDate.setDate(limitDate.getDate() + <%=limit%>);
|
|
<% } %>
|
|
var overflow = false;
|
|
var message = "";
|
|
for (var i = 0; i < np; i++)
|
|
{
|
|
nextDate.setDate(nextDate.getDate() + interval);
|
|
var date2 = new Date(nextDate); // zelfde tijdstip gebruiken als rrr.rsv_ruimte_van
|
|
date2 = date2.setFloatHours(new Date(<%=rrr.rsv_ruimte_van.getTime()%>).getFloatHours(), <%=safe.jsfloat(S("res_h"))%>);
|
|
|
|
if (chk_lastmin && frontend && earliest_expire_change && date2 < earliest_expire_change)
|
|
{
|
|
message = L("lcl_res_repeat_lastmin_n");
|
|
continue;
|
|
}
|
|
if (limitDate && nextDate > limitDate)
|
|
{
|
|
overflow = true;
|
|
break;
|
|
}
|
|
if ($("#withWeekends:checked").val() == "on" && isDateWeekendOrHoliday(nextDate, mld_vrije_dagen))
|
|
{
|
|
np++;
|
|
continue;
|
|
}
|
|
res_new_dates.push(nextDate.getTime());
|
|
}
|
|
|
|
var result = {res_new_dates: res_new_dates, message: message};
|
|
// Alleen als op de "Tonen datums" button (chk_lastmin is true) is geklikt, de melding geven en niet meer bij invoer.
|
|
// Anders moet je minstens twee keer klikken op de button om de datums te tonen.
|
|
if (chk_lastmin && overflow)
|
|
result.message += (message != ""? "<br>" : "") + L("lcl_res_date_limit_reached") + toDateString(limitDate);
|
|
return result;
|
|
}
|
|
|
|
function finishFillDates(json, textStatus)
|
|
{
|
|
if (json.message)
|
|
FcltCallback(json, textStatus); // Geef message weer
|
|
|
|
var res_new_dates = json.res_new_dates;
|
|
if (res_new_dates)
|
|
{
|
|
for (var j = 0; j < res_new_dates.length; j++)
|
|
{ // Dezelfde datums niet opnieuw toevoegen.
|
|
var exists = false;
|
|
for (var k = 0; k < window.dates.length; k++)
|
|
{
|
|
if (parseInt(window.dates[k], 10) == parseInt(res_new_dates[j], 10))
|
|
{
|
|
exists = true;
|
|
continue;
|
|
}
|
|
}
|
|
if (!exists)
|
|
{ // Alleen geldige startdatums
|
|
var v_periode = [];
|
|
for (var z = 0; z < res_aantal_dagen; z++)
|
|
{
|
|
v_periode.push(res_new_dates[j] + (z * 24*60*60*1000)); // Merge de startdatum van herhaling plus alle dagen in meerdaagse reservering.
|
|
}
|
|
new_dates_arr.push({start: res_new_dates[j], periode: v_periode});
|
|
}
|
|
}
|
|
var nextDate = new Date();
|
|
$("#newDates").empty();
|
|
for (var i = 0; i < new_dates_arr.length; i++)
|
|
{ // #newDates bevat de (start)datums van de herhaalde reserveringen.
|
|
// Bij meerdaagse reserveringen dus niet alle gereserveerde datums (: de datums die tussen start- en einddatum liggen).
|
|
nextDate.setTime(new_dates_arr[i].start);
|
|
$("#newDates").append("<option value=" + nextDate.getTime() + ">" + toDateString(nextDate) + "</option>");
|
|
// Zet in kalender alle gereserveerde dagen, dus bij meerdaagse reserveringen ook alle dagen tussen start- en einddatum.
|
|
for (var d = 0; d < new_dates_arr[i].periode.length; d++)
|
|
{
|
|
window.dates.push(new_dates_arr[i].periode[d]); // Merge de startdatum van herhaling plus alle dagen in meerdaagse reservering.
|
|
}
|
|
}
|
|
|
|
// Toon eerste startdatum herhaalde reservering op eerste kalender.
|
|
var startDate = Math.min.apply(null, window.dates);
|
|
nextDate.setTime(startDate);
|
|
$("#show_date_from").datepicker("setDate", nextDate);
|
|
$("#show_date_from").datepicker("option", "defaultDate", nextDate);
|
|
$("#show_date_from").datepicker("refresh"); // undocumented maar werkt bij 1.7.3
|
|
}
|
|
}
|
|
|
|
function fillDates(chk_lastmin, dosubmit)
|
|
{
|
|
var np = $("#n_periods").val();
|
|
if (isNaN(np) || np < 1)
|
|
{
|
|
FcltMgr.alert(L("lcl_res_period_error"))
|
|
return;
|
|
}
|
|
|
|
var interval = parseInt($("#sel_cycle").val());
|
|
if (interval == 31) // Maandelijks
|
|
{
|
|
var nextDate = new Date(parseInt($("#date_from0").val()));
|
|
nextDate.setHours(0, 0, 0, 0);
|
|
var bits = parseInt($("#dayofmonth").val(), 10) + parseInt($("#dayofweek").val(), 10);
|
|
var data = { urole: "<%=urole%>",
|
|
chk_lastmin: chk_lastmin? 1 : 0,
|
|
np: np,
|
|
nextDate: nextDate.getTime(),
|
|
bits: bits,
|
|
act_effectief_limiet: <%=((urole == "fe" && rrr.act_eff_limiet_fe > 0) ? rrr.act_eff_limiet_fe : rrr.act_eff_limiet)%>,
|
|
rsv_ruimte_van: <%=rrr.rsv_ruimte_van.getTime()%>,
|
|
ruimte_startdatum: <%=rrr.ruimte_startdatum != null? rrr.ruimte_startdatum.getTime() : -1%>,
|
|
ruimte_vervaldatum: <%=rrr.ruimte_vervaldatum != null? rrr.ruimte_vervaldatum.getTime() : -1%>,
|
|
earliest_expire_change: earliest_expire_change.getTime()
|
|
};
|
|
$.getJSON("get_res_info_ajax.asp?req_info=res_new_dates",
|
|
data,
|
|
function(data)
|
|
{
|
|
if (chk_lastmin)
|
|
{
|
|
finishFillDates(data);
|
|
if (dosubmit) multi_submit();
|
|
}
|
|
else
|
|
finishCalcEinddatum(data);
|
|
}
|
|
);
|
|
}
|
|
else
|
|
{
|
|
var data = fillDateArray(chk_lastmin); // lijst met volgende startdatums herhaalde reservering
|
|
if (chk_lastmin)
|
|
{
|
|
finishFillDates(data);
|
|
if (dosubmit) multi_submit();
|
|
}
|
|
else
|
|
finishCalcEinddatum(data);
|
|
}
|
|
}
|
|
|
|
function finishCalcEinddatum(json, textStatus)
|
|
{
|
|
if (json.message)
|
|
FcltCallback(json, textStatus); // Geef message weer
|
|
|
|
var res_new_dates = json.res_new_dates;
|
|
if (res_new_dates)
|
|
{
|
|
var nextDate = new Date();
|
|
nextDate.setTime(res_new_dates[res_new_dates.length - 1]);
|
|
$("#show_date_to0").datepicker("setDate", nextDate);
|
|
}
|
|
}
|
|
|
|
function calcEinddatum()
|
|
{
|
|
fillDates(false);
|
|
}
|
|
|
|
function finishCalcPerioden(json, textStatus)
|
|
{
|
|
var res_steps = json.res_steps;
|
|
if (res_steps >= 0)
|
|
$("#n_periods").val(res_steps);
|
|
}
|
|
|
|
function calcPerioden()
|
|
{
|
|
var periodedagen = new Array();
|
|
var interval = parseInt($("#sel_cycle").val());
|
|
var nextDate = new Date(parseInt($("#date_from0").val()));
|
|
var lastDate = new Date(parseInt($("#date_to0").val()));
|
|
nextDate.setHours(0, 0, 0, 0);
|
|
lastDate.setHours(0, 0, 0, 0);
|
|
|
|
if (interval == 31) // Maandelijks
|
|
{
|
|
if (nextDate <= lastDate)
|
|
{
|
|
var np = $("#n_periods").val();
|
|
var bits = parseInt($("#dayofmonth").val(), 10) + parseInt($("#dayofweek").val(), 10);
|
|
var data = { urole: "<%=urole%>",
|
|
np: np != ""? np : 0,
|
|
nextDate: nextDate.getTime(),
|
|
lastDate: lastDate.getTime(),
|
|
bits: bits
|
|
};
|
|
$.getJSON("get_res_info_ajax.asp?req_info=res_nr_periods",
|
|
data,
|
|
finishCalcPerioden
|
|
);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ((res247orgType != 2) && isDateWeekendOrHoliday(nextDate, mld_vrije_dagen)) {
|
|
$("#withWeekends").prop("checked", false); // een vrije/weekend dag geselecteerd, dus niet alleen werkdagen.
|
|
} else if (res247orgType == 2) {
|
|
$("#withWeekends").prop("checked", true); // Alleen werkdagen.
|
|
}
|
|
|
|
nextDate.setDate(nextDate.getDate() + interval);
|
|
|
|
while (nextDate <= lastDate) {
|
|
// No holidays
|
|
if (!($("#withWeekends:checked").val() == "on" && isDateWeekendOrHoliday(nextDate, mld_vrije_dagen))) {
|
|
periodedagen.push(nextDate);
|
|
}
|
|
nextDate.setDate(nextDate.getDate() + interval);
|
|
}
|
|
var aantaldagen = periodedagen.length;
|
|
$("#n_periods").val(aantaldagen);
|
|
}
|
|
}
|
|
|
|
function onChangePeriod(el)
|
|
{
|
|
if (el.value == 0) // niet periodiek
|
|
$("#n_periods").attr("disabled", true).val(1);
|
|
else
|
|
$("#n_periods").attr("disabled", false);
|
|
|
|
if (el.value == 31) // Maandelijks
|
|
{
|
|
$(".trweekends").hide();
|
|
$(".trdays").show();
|
|
}
|
|
else
|
|
{
|
|
$(".trweekends").show();
|
|
$(".trdays").hide();
|
|
}
|
|
calcPerioden();
|
|
}
|
|
|
|
function multi_submit_callback(json, textStatus)
|
|
{
|
|
iface.button.enable("btn_res_submit");
|
|
if (json.success)
|
|
{
|
|
FcltMgr.closeDetail(window, json); // zelf in ieder geval dicht
|
|
if (json.new_rsv_ruimte_key > 0)
|
|
FcltMgr.openDetail("appl/res/res_reservering.asp?urole=<%=urole%>&rsv_ruimte_key=" + json.new_rsv_ruimte_key);
|
|
}
|
|
}
|
|
|
|
function multi_submit()
|
|
{
|
|
if (!dates.length)
|
|
{
|
|
if ($("#withdeelres").prop("checked"))
|
|
{
|
|
$("#n_periods").val(1); // Zet aantal perioden 1 voor kopieren reservering met alle deelreserveringen
|
|
$("#isnewres").prop("checked", true); // en buiten reeks (dus nieuw reserveringsnummer).
|
|
}
|
|
|
|
fillDates(true, true); // Na het vullen van de datums wordt er opnieuw een submit gedaan. Daardoor is een alert melding niet meer nodig.
|
|
return false;
|
|
}
|
|
|
|
$("#newDates").empty();
|
|
dates.sort();
|
|
|
|
//if chosen dates have weekend or holiday
|
|
var hasHoliday = false;
|
|
for (var i = 0; i < new_dates_arr.length; i++) {
|
|
var nextDate = new_dates_arr[i].start;
|
|
// Alleen startdatum van reservering opslaan.
|
|
$("#newDates").append("<option value=" + nextDate + ">" + toDateString(new Date(nextDate)) + "</option>");
|
|
for (j = 0; j < new_dates_arr[i].periode.length; j++) {
|
|
// Bij een meerdaagse reservering wel alle dagen controleren of het een vrije dag is.
|
|
// Voor een eendaagse reservering geldt dat elke dag een startdatum is.
|
|
nextDate = new_dates_arr[i].periode[j];
|
|
if (!hasHoliday && isDateWeekendOrHoliday(new Date(nextDate), mld_vrije_dagen)) {
|
|
hasHoliday = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (hasHoliday && (res247orgType == 1 || res247orgType == 2) && frontend) { // Strict: holidays not allowed.
|
|
FcltMgr.alert(L("lcl_holiday_found_strict"));
|
|
return false;
|
|
} else { // Tolerated: Can book holidays, but warning is shown.
|
|
FcltMgr.confirm(L("lcl_holiday_found"), {
|
|
autoconfirm: !hasHoliday || res247orgType == 1,
|
|
fncancel: function() { iface.button.enable("btn_res_submit"); }
|
|
}, postRepeat);
|
|
}
|
|
}
|
|
|
|
function postRepeat() {
|
|
$("#newDates > option").prop("selected", "true");
|
|
$.post($("form[name=u2]")[0].action, $("[name=u2]").serialize(), FcltCallbackAndThenAlways(multi_submit_callback), "json");
|
|
return true; // disable submit
|
|
}
|
|
|
|
// Maintain array of dates
|
|
// Vrij naar http://stackoverflow.com/questions/1452066
|
|
var dates = new Array();
|
|
function addDate(date)
|
|
{
|
|
var date2 = new Date(date); // zelfde tijdstip gebruiken als rrr.rsv_ruimte_van
|
|
date2 = date2.setFloatHours(new Date(<%=rrr.rsv_ruimte_van.getTime()%>).getFloatHours(), <%=safe.jsfloat(S("res_h"))%>);
|
|
|
|
if (frontend && earliest_expire_change && date2 < earliest_expire_change)
|
|
{
|
|
FcltMgr.alert(L("lcl_res_repeat_lastmin"));
|
|
return;
|
|
}
|
|
if ($.inArray(date, dates) < 0) dates.push(date);
|
|
}
|
|
|
|
function removeDate(index)
|
|
{
|
|
dates.splice(index, 1);
|
|
}
|
|
|
|
// Adds a date if we don't have it yet, else remove it
|
|
function addOrRemoveDate(date)
|
|
{
|
|
var index = $.inArray(date, dates);
|
|
if (index >= 0)
|
|
{ // Verwijderen van resevering.
|
|
// Als je bij een meerdaagse reservering op een van de dagen van een deelreservering klikt
|
|
// dan moeten alle dagen van die deelreservering verwijderd worden.
|
|
var res_index = Math.floor(index / res_aantal_dagen); // index voor de startdatum van (meerdaagse) reservering in global new_dates_arr.
|
|
var startindex = res_index * res_aantal_dagen;
|
|
var eindindex = startindex + res_aantal_dagen - 1;
|
|
for (var i=eindindex; i>=startindex; i--)
|
|
{
|
|
removeDate(i);
|
|
}
|
|
new_dates_arr.splice(res_index, 1);
|
|
}
|
|
else
|
|
{ // Handmatig toevoegen van reservering.
|
|
// Bij een meerdaagse reservering moet vanaf de geklikte datum het aantal dagen voor de deelreservering worden toegevoegd.
|
|
var v_periode = [];
|
|
for (var i=0; i<res_aantal_dagen; i++)
|
|
{
|
|
var v_date = date + (i * 24*60*60*1000);
|
|
if ($.inArray(v_date, dates) >= 0)
|
|
{ // Er is overlap met andere aangegeven herhaling
|
|
// verwijder de zojuist toegevoegde datums weer uit dates.
|
|
for (var i=0; i<v_periode.length; i++)
|
|
{
|
|
var overlap_index = $.inArray(v_periode[i], dates);
|
|
removeDate(overlap_index);
|
|
}
|
|
v_periode = [];
|
|
FcltMgr.alert(L("lcl_res_repeat_overlap"));
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
v_periode.push(v_date);
|
|
addDate(v_date);
|
|
}
|
|
}
|
|
new_dates_arr.push({start: date, periode: v_periode});
|
|
new_dates_arr.sort(function(a,b){return a.start - b.start});
|
|
}
|
|
}
|
|
|
|
// Check if date is weekend (sunday or saturday)
|
|
function isDateWeekend(date) {
|
|
if(date.getDay() == 0 || date.getDay() == 6)
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
// Check if date is holiday
|
|
function isHoliday(date, vrijeDagen) {
|
|
if ($.inArray(date.getTime(), vrijeDagen) > -1 )
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
// Check if date is holiday or weekend
|
|
function isDateWeekendOrHoliday(date, vrijeDagen) {
|
|
if (isHoliday(date, vrijeDagen) || (isDateWeekend(date) && (res247orgType == 0 || res247orgType == 2)) )
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
// Check if date is reserved
|
|
function isDateReserved(date, reservedDates) {
|
|
if ($.inArray(date.getTime(), reservedDates) > -1 )
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
$(function()
|
|
{ // multi-calendar parameters.
|
|
var params = {altField: "#date_from",
|
|
minDate: "-<%=maxPast%>d",
|
|
numberOfMonths: 3,
|
|
defaultDate: new Date(),
|
|
onSelect: function(dateText, inst) // noot: het alt-veld is al bijgewerkt
|
|
{
|
|
var dt = parseInt($("#date_from").val());
|
|
addOrRemoveDate(dt);
|
|
},
|
|
beforeShowDay: function (date)
|
|
{
|
|
if ($.inArray(date.getTime(), dates) >= 0) {
|
|
// Enable date so it can be deselected. Set style to be highlighted
|
|
return [true, "calselected"];
|
|
}
|
|
|
|
if (isDateWeekendOrHoliday(date, mld_vrije_dagen) || isDateReserved(date, gereserveerde_dagen))
|
|
{
|
|
if ((res247orgType == 2 && frontend) || isDateReserved(date, gereserveerde_dagen)) // If date is a holiday or weekend (Reservations not allowed), add disabled class
|
|
return [true, "ui-state-disabled"];
|
|
else // If date is a holiday or weekend (Reservations allowed), add gray-out class
|
|
return [true, "ui-datepicker-vrije-dag"];
|
|
}
|
|
else
|
|
{
|
|
return [true, (res247orgType == 1 ? "ui-datepicker-org247" : "")];
|
|
}
|
|
|
|
}
|
|
};
|
|
<% var limit = ((urole == "fe" && rrr.act_eff_limiet_fe > 0) ? rrr.act_eff_limiet_fe : rrr.act_eff_limiet);
|
|
if (daysToExpire != null && daysToExpire >= 0 && daysToExpire < limit)
|
|
var limit = daysToExpire - 1; // De vervaldatum niet meerekenen.
|
|
if (limit > 0)
|
|
{ %>
|
|
params.maxDate = "+<%=limit%>";
|
|
<% } %>
|
|
$("#show_date_from").datepicker(params);
|
|
onChangePeriod($("#sel_cycle"));
|
|
FcltMgr.resized();
|
|
});
|
|
|
|
</script>
|
|
</head>
|
|
<body class="fclt-modal" id="mod_resmulti">
|
|
<% MODAL_START(); %>
|
|
<form name="u2"
|
|
action="res_multi_create_save.asp?urole=<%=urole%>&rsv_ruimte_key=<%=rsv_ruimte_key%>"
|
|
method="post">
|
|
<%
|
|
if (rrr.reservering_ispool)
|
|
MODAL_BLOCK_START("", L("lcl_res_repeat_pool").format(rrr.reservering_key), { icon: "fa-clone" });
|
|
else
|
|
MODAL_BLOCK_START("", L("lcl_res_repeat1") + rrr.reservering_key + "/" + rrr.rsv_ruimte_volgnr + L("lcl_res_repeat3"), { icon: "fa-clone" });
|
|
%>
|
|
<tr><td colspan="2"><div id="resmakedates"><%=L("lcl_res_makedates")%></div></td></tr>
|
|
|
|
<%
|
|
if (zelfdedag)
|
|
RWCHECKBOXTR("withdeelres", "fldcheck", L("lcl_res_repeat4"), false, { html: "onClick='withdeelrestoggle()'" });
|
|
|
|
if (!rrr.reservering_ispool)
|
|
RWCHECKBOXTR("isnewres", "fldcheck", L("lcl_res_copy_deelres"), false, {});
|
|
|
|
// ======= FIELD "Periode" =======
|
|
sql = "SELECT c.res_cyclus_periode"
|
|
+ " , " + lcl.xsqla('c.res_cyclus_naam', 'res_cyclus_key')
|
|
+ " FROM res_cyclus c"
|
|
+ " WHERE res_cyclus_periode > 0"
|
|
+ " ORDER BY res_cyclus_periode";
|
|
FCLTselector("sel_cycle",
|
|
sql,
|
|
{ label: L("lcl_period"),
|
|
onChange: "onChangePeriod(this)"
|
|
}
|
|
);
|
|
var today = new Date();
|
|
var maxFuture = ((urole == "fe" && rrr.act_eff_limiet_fe > 0) ? rrr.act_eff_limiet_fe : rrr.act_eff_limiet);
|
|
FCLTcalendar("date_from0",
|
|
{ label : L("lcl_res_repeat2"),
|
|
datum: rrr.rsv_ruimte_van.getTime() > today.getTime()? rrr.rsv_ruimte_van : today, // of today als de ruimte ouder is
|
|
maxPast : maxPast,
|
|
maxFuture: maxFuture,
|
|
timeField: false,
|
|
volgnr: 1,
|
|
onChange: "calcPerioden()"
|
|
});
|
|
|
|
FCLTcalendar("date_to0",
|
|
{ label: L("lcl_end_date"),
|
|
datum: today,
|
|
initEmpty: true,
|
|
maxPast : maxPast,
|
|
maxFuture: maxFuture,
|
|
timeField: false,
|
|
volgnr: 2,
|
|
onChange: "calcPerioden()"
|
|
});
|
|
|
|
RWFIELDTR("n_periods", "fld", L("lcl_n_of_periods"), "", { html: "onChange='calcEinddatum();'" });
|
|
RWCHECKBOXTR("withWeekends", "", L("lcl_res_skipnonworkdays"), 1, { trclass: "trweekends", html: "onClick='calcPerioden();'", hidden: (S("res_247organisation")==1) });
|
|
%>
|
|
<tr class="trdays">
|
|
<td class="label"><label for="dayofmonth"><%=L("lcl_res_day")%></label></td>
|
|
<td>
|
|
<%
|
|
sql = " SELECT 256, " + safe.qL("lcl_res_eerste") + ", 1 FROM DUAL"
|
|
+ " UNION SELECT 512, " + safe.qL("lcl_res_tweede") + ", 2 FROM DUAL"
|
|
+ " UNION SELECT 768, " + safe.qL("lcl_res_derde") + ", 3 FROM DUAL"
|
|
+ " UNION SELECT 1024, " + safe.qL("lcl_res_vierde") + ", 4 FROM DUAL"
|
|
+ " UNION SELECT 1280, " + safe.qL("lcl_res_vijfde") + ", 5 FROM DUAL"
|
|
+ " UNION SELECT 1536, " + safe.qL("lcl_res_eennalaatste") + ", 6 FROM DUAL"
|
|
+ " UNION SELECT 1792, " + safe.qL("lcl_res_laatste") + ", 7 FROM DUAL"
|
|
+ " ORDER BY 1";
|
|
FCLTselector("dayofmonth",
|
|
sql,
|
|
{ initKey: 1,
|
|
required: false,
|
|
html: " width='100px'",
|
|
onChange: "calcPerioden()"
|
|
});
|
|
sql = "";
|
|
for (var i = 0; i <= 6; i++)
|
|
{
|
|
sql += (i > 0? " UNION " : "") + "SELECT " + Math.pow(2, (i )) + ", " + safe.quoted_sql(calendar_names.days[i]) + " FROM DUAL"
|
|
}
|
|
sql += " ORDER BY 1";
|
|
FCLTselector("dayofweek",
|
|
sql,
|
|
{ initKey: 1,
|
|
required: false,
|
|
onChange: "calcPerioden()"
|
|
});
|
|
%>
|
|
<%=L("lcl_res_period_ofthemonth")%></td>
|
|
</tr>
|
|
<%MODAL_BLOCK_END();
|
|
SIMPLE_BLOCK_START();
|
|
var buttons = [{ title: L("lcl_res_showdates"), action: "fillDates(true)", icon: "fa-calendar-day" },
|
|
{ title: L("lcl_res_erasedates"), action: "eraseDates()", icon: "fa-calendar-times" }];
|
|
CreateButtons(buttons);
|
|
SIMPLE_BLOCK_END();
|
|
MODAL_BLOCK_START("multi_res_dates", "", { nopadding: true });
|
|
%>
|
|
<input type="hidden" id="date_from"/>
|
|
<% /* #show_date_from heeft harde hoogte in de css voor als je naar een maand bladert met een week meer dan de meeste maanden */ %>
|
|
<div id="show_date_from"></div>
|
|
<select style="display:none" id="newDates" name="newDates" multiple size="10"></select>
|
|
<% MODAL_BLOCK_END();
|
|
SIMPLE_BLOCK_START();
|
|
CreateButtons([ { title: L("lcl_res_duplicate"), action: "multi_submit()", icon: "fa-fclt-save", singlepress: true, id:"btn_res_submit", importance: 1 },
|
|
{ title: L("lcl_cancel"), action: "FcltMgr.closeDetail(window, { cancel: true } )", icon: "fa-fclt-cancel", importance: 3} ]);
|
|
SIMPLE_BLOCK_END();
|
|
IFACE.FORM_END(); %>
|
|
</form>
|
|
<% MODAL_END(); %>
|
|
</body>
|
|
<% ASPPAGE_END(); %>
|