Files
Facilitor/APPL/RES/res_update_room_drag.asp
Erik Groener 213c8c5b37 VENR#37077 Instellen reserveringen per uur niet mogelijk alleen per dag(deel)
svn path=/Website/trunk/; revision=32149
2016-12-23 13:14:30 +00:00

356 lines
15 KiB
Plaintext

<%@ language = "JavaScript" %>
<% /*
$Revision$
$Id$
File: res_update_room_drop.asp
Description: update een deel-reservering na drag en drop wijziging via planbord
Parameters:
rsv_ruimte_key RES_RSV_RUIMTE to update
res_ruimte_key Nieuwe ruimte
rsv_van nieuwe begintijd in uren
rsv_tot nieuwe eindtijd in uren
Context: Modal dialoog vanuit ruimten planbord
Note: We zien alleen ruimte reserveringen
- R-reservering (met rsv_ruimte_key==>res_opstel_key)
Verticaal: We staan toe dat een andere ruimte (res_ruimte) gekozen wordt
Horizontaal: Een ander tijdstip staan we niet toe
De begin en eindtijd aanpassen in het planbord kan met de resizable functionaliteit (met <-> aan eind van de balkjes slepen)
*/
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="../shared/iface.inc" -->
<!-- #include file="../shared/save2db.inc" -->
<!-- #include file="../Shared/selector.inc" -->
<!-- #include file="res.inc" -->
<%
FCLTHeader.Requires({plugins: ["jQuery"],
js: []})
var rsv_ruimte_key = getQParamInt("rsv_ruimte_key");
var new_ruimte_key = getQParamInt("res_ruimte_key");
var transitParam = buildTransitParam(["rsv_ruimte_key", "res_ruimte_key", "fres_van", "frsv_tot"]);
var submitting = getQParamInt("submit", 0) == 1;
var this_res = res.func_enabled(rsv_ruimte_key); // Wat heb ik zoal aan rechten op deze specifieke reservering
res.res_set_dialect(rsv_ruimte_key);
sql = "SELECT rrr.res_rsv_ruimte_van"
+ " , rrr.res_rsv_ruimte_tot"
+ " , rrr.res_rsv_ruimte_volgnr"
+ " , rrr.res_reservering_key"
+ " , rr.res_ruimte_key"
+ " , " + lcl.xsqla('rr.res_ruimte_nr', 'rr.res_ruimte_key')
+ " , rrr.res_activiteit_key"
+ " , rdp.res_disc_params_preposttime"
+ " FROM res_rsv_ruimte rrr"
+ " , res_ruimte_opstelling rro"
+ " , res_ruimte rr"
+ " , res_disc_params rdp"
+ " WHERE rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key"
+ " AND rro.res_ruimte_key = rr.res_ruimte_key"
+ " AND rr.res_discipline_key = rdp.res_ins_discipline_key"
+ " AND rrr.res_rsv_ruimte_key = " + rsv_ruimte_key;
var oRs = Oracle.Execute(sql);
var old_van = new Date(oRs("res_rsv_ruimte_van").value);
var old_tot = new Date(oRs("res_rsv_ruimte_tot").value);
var restxt = oRs("res_reservering_key").value + "/" + oRs("res_rsv_ruimte_volgnr").value;
var old_ruimte_key = oRs("res_ruimte_key").value;
var old_ruimte_oms = oRs("res_ruimte_nr").value;
var act_key = oRs("res_activiteit_key").value;
var prepost_time = oRs("res_disc_params_preposttime").value;
// LET OP: De begintijd van het verschoven blokje is met of zonder schoonmaaktijd. En schoonmaaktijd wordt in het planbord niet goed bepaald en is altijd 1 blokje
if (prepost_time > 0)
{
// De begintijd van het verschoven blokje (fres_van) is met schoonmaaktijd. Nu tijd van 1 blokje er bij op tellen
var new_van = old_van.setFloatHours(parseFloat(getQParam("fres_van")) + S("res_h"), S("res_h"));
}
else
{
// De begintijd van het verschoven blokje (fres_van) is zonder schoonmaaktijd. Geen tijd bij optellen
var new_van = old_van.setFloatHours(parseFloat(getQParam("fres_van")), S("res_h"));
}
var hours_new_van = new_van.getHours() + new_van.getMinutes()/60 + new_van.getSeconds()/60/60
var hours_new_tot = old_tot.getHours() + old_tot.getMinutes()/60 + old_tot.getSeconds()/60/60 + (new_van.getTime() - old_van.getTime())/1000/60/60
var new_tot = (old_tot).setFloatHours(parseFloat(hours_new_tot), S("res_h"));
sql = "SELECT " + lcl.xsqla('rr.res_ruimte_nr', 'rr.res_ruimte_key')
+ " , rdp.res_disc_params_maxduur"
+ " , rr.res_ruimte_min_duur"
+ " , rr.res_ruimte_begintijdblok"
+ " , rr.res_ruimte_eindtijdblok"
+ " FROM res_ruimte rr"
+ " , res_disc_params rdp"
+ " WHERE rr.res_discipline_key = rdp.res_ins_discipline_key"
+ " AND rr.res_ruimte_key = " + new_ruimte_key;
var oRs = Oracle.Execute(sql);
var new_ruimte_oms = oRs("res_ruimte_nr").value;
var max_hours = oRs("res_disc_params_maxduur").value;
var min_duur = oRs("res_ruimte_min_duur").Value || 0;
var res_blok_van = oRs("res_ruimte_begintijdblok").Value;
var res_blok_tot = oRs("res_ruimte_eindtijdblok").Value;
oRs.Close();
sql = "SELECT f.fac_functie_key"
+ " FROM fac_functie f "
+ " WHERE f.fac_functie_code IN ('WEB_RESFOF', 'WEB_RESBOF')";
var oRs = Oracle.Execute(sql);
var fac_functie_key_arr = [];
while (!oRs.eof)
{
fac_functie_key_arr.push(oRs("fac_functie_key").value);
oRs.moveNext();
}
oRs.Close();
// Ik kan deze nieuwe ruimte reserveren als aan de volgende voorwaarden zijn voldaan:
// 1) Ik heb enige schrijfrechten voor 'WEB_RESUSE', 'WEB_RESFOF', 'WEB_RESBOF' of 'WEB_RESBAC'
// 2) De ruimte kan voor de gekozen activiteit gekozen worden
// 3) Er moet een ruimte opstelling gedefinieerd zijn voor de ruimte.
sql = "SELECT DISTINCT rr.res_ruimte_key"
+ " FROM (SELECT res_ruimte_key"
+ " FROM res_ruimte_opstelling"
+ " GROUP BY res_ruimte_key) opstel_bez"
+ " , res_ruimte rr"
+ " , fac_v_webgebruiker md"
+ " WHERE rr.res_ruimte_key = opstel_bez.res_ruimte_key"
+ " AND rr.res_discipline_key = md.ins_discipline_key"
+ " AND md.prs_perslid_key = " + user_key
+ " AND md.fac_functie_key IN (" + fac_functie_key_arr.join(",") + ")"
+ " AND md.fac_gebruiker_alg_level_write < 9"
+ " AND md.fac_gebruiker_prs_level_write < 9"
+ " AND rr.res_ruimte_key = " + new_ruimte_key
+ " AND EXISTS (SELECT res_activiteit_key"
+ " FROM res_activiteitdiscipline rad"
+ " WHERE rad.res_discipline_key = rr.res_discipline_key"
+ " AND rad.res_activiteit_key = " + act_key + ")";
//ORDER BY rg.res_ruimte_nr
var oRs = Oracle.Execute(sql);
var can_reserve_newroom = !oRs.eof;
var badmsg = "";
if (old_ruimte_key != new_ruimte_key)
{ // Kon onbedoeld nog gebeuren als de reservering niet exact op de S("res_h") blokjes viel
var bTimeChanged = false;
}
else
{
var bTimeChanged = old_van.getHours() != new_van.getHours() || old_van.getMinutes() != new_van.getMinutes();
}
if (!this_res.canChange)
badmsg = L("lcl_res_no_auth_change"); // "Geen autorisatie voor het wijzigen van de ruimte";
else if (!can_reserve_newroom)
badmsg = L("lcl_res_select_diff_room"); // "Er moet wel een andere ruimte gekozen worden dan de huidige waarde";
else if (hours_new_van < S("res_t1") || hours_new_tot > S("res_t2"))
badmsg = L("lcl_res_time_out_limit"); // "De gekozen tijd valt buiten de grenzen";
else if (!bTimeChanged && old_ruimte_key == new_ruimte_key)
badmsg = L("lcl_res_no_changes"); // "Geen aanpassingen";
var duration_hours = (new_tot - new_van) / 1000/60/60;
if (!badmsg)
{
// Controle op maximale tijdsduur reservering.
if ((max_hours > 0) && (max_hours < duration_hours))
{
badmsg = L("lcl_res_bad_maxperiod").format(max_hours);
}
}
if (!badmsg)
{
// Is voldaan aan de minimale reserveringsduur.
if (duration_hours < min_duur)
badmsg = L("lcl_res_room_min_duration").format(min_duur);
}
if (!badmsg)
{
// "CV" ook altijd controleren
var max_duration_err = res.max_duration_cv(rsv_ruimte_key, duration_hours);
if (max_duration_err.err)
badmsg = max_duration_err.message;
}
//user.auth_required_or_abort(this_res.canChange && can_reserve_newroom); // Je krijgt al de melding lcl_res_no_auth_change via badmsg en je mag de gegevens gewoon zien (leesrechten heb je al). Met deze regel hier krijg je een lelijke niet leesbare foutmelding in modal scherm.
%>
<html>
<head>
<% FCLTHeader.Generate()
var blok_van = new Date();
var blok_tot = new Date();
var middag_blok = false;
if (res_blok_van && res_blok_tot) // middag blokkade aanwezig
{
blok_van.setTime(new_van.midnight().getTime()+ res_blok_van*3600*1000);
blok_tot.setTime(new_tot.midnight().getTime()+ res_blok_tot*3600*1000);
var middag_blok = !(new_tot < blok_van || new_van > blok_tot);
}
if (middag_blok)
{
err = { friendlyMsg: L("lcl_res_mid_block") };
%> <script>
FcltMgr.alert("<%=safe.jsstring(err.friendlyMsg)%>");
FcltMgr.closeDetail(window, { refresh: true });
</script>
<% Response.End;
}
if (submitting)
{
var opstel = getFParamInt("opstel");
user.auth_required_or_abort(this_res.canChange && can_reserve_newroom);
if (badmsg == "")
{
var fields = [ {dbs: "res_ruimte_opstel_key", typ: "key", frm: "opstel"} ];
if (bTimeChanged)
{ // Gewijzigde tijd ook opslaan
fields.push( {dbs: "res_rsv_ruimte_van", typ: "datetime", val: new_van} );
fields.push( {dbs: "res_rsv_ruimte_tot", typ: "datetime", val: new_tot} );
}
sql = buildUpdate("res_rsv_ruimte", fields) + " res_rsv_ruimte_key = " + rsv_ruimte_key;
var check_fail_sql = "";
if (S("res_fe_allow_dirty") != 1 && this_res.canChangeFEOnly)
{
check_fail_sql = " if res.dirty_level_all(" + rsv_ruimte_key + ") <> 0 then"
+ " raise_application_error (-20000, 'res_m999 "+L("lcl_res_fe_no_dirty")+"');"
+ " end if;"
}
// Nu de echte update.
// Daarbij ook diverse controles/ updates uitvoeren op 'andere zaken'
sql = "BEGIN "
+ sql + ";"
+ " res.set_ruimte_dirty (" + rsv_ruimte_key + "); " // Zelf dirty geworden?
+ " res.set_ruimtes_clean (" + old_van.toSQL() + "); " // Anderen 'clean' geworden
+ " res.follow_artikel (" + rsv_ruimte_key + ", " + old_van.toSQL(true) + ", " + old_tot.toSQL(true) + "); " // catering mee verplaatsen
+ " res.follow_deel (" + rsv_ruimte_key + ", " + old_van.toSQL(true) + ", " + old_tot.toSQL(true) + "); " // objecten mee verplaatsen
+ " res.follow_afspraak (" + rsv_ruimte_key + ", " + S("res_copy_to_bez") + "); " // bezoekers mee verplaatsen
+ check_fail_sql
+ "END;";
var err = Oracle.Execute(sql, true);
}
else
err = { friendlyMsg: badmsg }
if (err.friendlyMsg)
{
%> <script>
FcltMgr.alert("<%=safe.jsstring(err.friendlyMsg)%>");
</script>
<% }
else
{
shared.trackaction("RESUPD", rsv_ruimte_key, L("lcl_res_track_room_shifted_from")
+ old_ruimte_oms
+ L("lcl_res_track_room_shifted_to")
+ new_ruimte_oms
);
var sql = "SELECT res_rsv_ruimte_dirtlevel"
+ " FROM res_rsv_ruimte"
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
oRs = Oracle.Execute(sql);
var message = "";
if (oRs("res_rsv_ruimte_dirtlevel") & res.dirtlevel.ruimte.notavailable)
{
message = L("lcl_res_dirtyroom");
}
else
{ // Als ruimte al dirty is hoeft deel niet meer gecontroleerd te worden.
var sql = "SELECT MAX(res_rsv_deel_dirtlevel) deel_dirtlevel"
+ " FROM res_rsv_deel"
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
oRs = Oracle.Execute(sql);
if (oRs("deel_dirtlevel") & res.dirtlevel.deel.notavailable)
{
message = L("lcl_res_dirtyobject");
}
}
if (message)
{
%> <script>
FcltMgr.alert("<%=safe.jsstring(message)%>");
</script>
<% }
}
%> <script type="text/javascript">
FcltMgr.closeDetail(window, { refresh: true });
</script>
<% Response.End;
}
%>
<script type="text/javascript">
function res_submit()
{
if (!validateForm("u2"))
return false;
document.u2.submit();
}
</script>
</head>
<body class="modal" id="mod_resupdateroom">
<form name="u2"
action="res_update_room_drag.asp?submit=1<%=transitParam%>"
target="hidFrameSubmit"
method="post">
<% BLOCK_START("", L("lcl_res_frame_ruimte"));
sql = "SELECT rr.res_rsv_ruimte_key"
+ " , rr.res_rsv_ruimte_omschrijving"
+ " , rr.res_rsv_ruimte_van"
+ " , rr.res_rsv_ruimte_tot"
+ " , rr.res_reservering_key"
+ " , rr.res_rsv_ruimte_volgnr"
+ " , rr.res_ruimte_opstel_key"
+ " FROM res_rsv_ruimte rr"
+ " WHERE rr.res_rsv_ruimte_key = " + rsv_ruimte_key;
var oRs = Oracle.Execute(sql);
ROFIELDTR("fldresnum", L("lcl_reservation"), oRs("res_reservering_key") + "/" + oRs("res_rsv_ruimte_volgnr"));
ROFIELDTR("flddatechange", L("lcl_from"), toDateTimeString(oRs("res_rsv_ruimte_van").value) + (bTimeChanged? " ==> " + toDateTimeString(new_van) : ""));
ROFIELDTR("flddatechange", L("lcl_to"), toDateTimeString(oRs("res_rsv_ruimte_tot").value) + (bTimeChanged? " ==> " + toDateTimeString(new_tot) : ""));
ROFIELDTR("fldresdesc", L("lcl_descr"), oRs("res_rsv_ruimte_omschrijving").value || "-");
ROFIELDTR("fldresroomchange", L("lcl_room"), old_ruimte_oms + (old_ruimte_key != new_ruimte_key? "\n==> " + new_ruimte_oms : ""));
oRs.Close();
sql = "SELECT rro.res_ruimte_opstel_key"
+ " , ro.res_opstelling_omschrijving"
+ " , COALESCE (rro.res_ruimte_opstel_default, 0)"
+ " , ro.res_opstelling_volgnr"
+ " FROM res_ruimte_opstelling rro"
+ " , res_opstelling ro"
+ " WHERE rro.res_opstelling_key = ro.res_opstelling_key"
+ " AND rro.res_ruimte_key = " + new_ruimte_key
+ " ORDER BY COALESCE (rro.res_ruimte_opstel_default, 0)"
+ " , res_opstelling_volgnr";
oRs = Oracle.Execute(sql);
ROFIELDTR("fldopstel", L("lcl_config"), oRs("res_opstelling_omschrijving").value);
%> <input type="hidden" id="opstel" name="opstel" value="<%=oRs('res_ruimte_opstel_key').value%>"> <%
BLOCK_END();
IFACE.FORM_END();
%>
</form>
<iframe src="../Shared/empty.html"
onload="iface.button.enable('btn_res_submit')";
name="hidFrameSubmit"
style="display:none"></iframe>
<%
if (badmsg != "") { %>
<br><font color=red><%=badmsg%></font>
<% }
var buttons = [];
if (badmsg == "")
buttons.push({ title: L("lcl_submit"), action: "res_submit()", singlepress: true, id:"btn_res_submit" });
buttons.push({ title: L("lcl_cancel"), action: "FcltMgr.closeDetail(window, { cancel: true } )"});
CreateButtons(buttons);
%>
</body>
</html>