211 lines
8.8 KiB
Plaintext
211 lines
8.8 KiB
Plaintext
<%@ language = "JavaScript" %>
|
|
<% /*
|
|
$Revision$
|
|
$Id$
|
|
|
|
File: res_update_room.asp
|
|
Description: update een deel-reservering na wijziging via planbord
|
|
Parameters:
|
|
rsv_ruimte_key RES_RSV_RUIMTE to update
|
|
rsv_van nieuwe begintijd in uren
|
|
rsv_tot nieuwe eindtijd in uren
|
|
Context: Ajax call vanuit res_table.asp
|
|
Note:
|
|
*/
|
|
var JSON_Result = true;
|
|
%>
|
|
<!--#include file="../Shared/common.inc"-->
|
|
<!--#include file="../shared/save2db.inc" -->
|
|
<!--#include file="res.inc"-->
|
|
<%
|
|
FCLTHeader.Requires({plugins: ["jQuery"],
|
|
js: []})
|
|
|
|
var rsv_ruimte_key = getFParamInt("rsv_ruimte_key");
|
|
res.res_set_dialect(rsv_ruimte_key);
|
|
// delta's in S("res_h") eenheden
|
|
var dvan = getFParamInt("dvan")*S("res_h");
|
|
var dwidth = getFParamInt("dwidth")*S("res_h");
|
|
|
|
sql = "SELECT rsv.res_rsv_ruimte_van,"
|
|
+ " rsv.res_rsv_ruimte_tot,"
|
|
+ " rsv.res_rsv_ruimte_volgnr,"
|
|
+ " rsv.res_reservering_key,"
|
|
+ " rsv.res_activiteit_key,"
|
|
+ " rsv.res_rsv_ruimte_externnr,"
|
|
+ " rsv.res_rsv_ruimte_externnr2,"
|
|
+ " rr.res_discipline_key,"
|
|
+ " rr.res_ruimte_min_duur,"
|
|
+ " rr.res_ruimte_begintijdblok,"
|
|
+ " rr.res_ruimte_eindtijdblok,"
|
|
+ " rr.res_ruimte_extern_id"
|
|
+ " FROM res_rsv_ruimte rsv"
|
|
+ " , res_ruimte_opstelling rro"
|
|
+ " , res_ruimte rr"
|
|
+ " WHERE rro.res_ruimte_key = rr.res_ruimte_key"
|
|
+ " AND rro.res_ruimte_opstel_key = rsv.res_ruimte_opstel_key"
|
|
+ " AND rsv.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 new_van = (new Date(old_van)).setFloatHours(old_van.getFloatHours() + dvan, S("res_h"));
|
|
var new_tot = (new Date(old_tot)).setFloatHours(old_tot.getFloatHours() + dvan + dwidth, S("res_h"));
|
|
var restxt = oRs("res_reservering_key").Value + "/" + oRs("res_rsv_ruimte_volgnr").Value;
|
|
var act_key = oRs("res_activiteit_key").Value;
|
|
var disc_key = oRs("res_discipline_key").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;
|
|
var extern_id = oRs("res_ruimte_extern_id").Value;
|
|
var rsv_ruimte_externnr = oRs("res_rsv_ruimte_externnr").Value;
|
|
var rsv_ruimte_externnr2 = oRs("res_rsv_ruimte_externnr2").Value;
|
|
oRs.Close();
|
|
|
|
var durationHours = (new_tot - new_van) / 1000/60/60;
|
|
var badmsg = null;
|
|
var this_res = res.func_enabled(rsv_ruimte_key); // Wat heb ik zoal aan rechten op deze specifieke reservering
|
|
if (!this_res.canChange)
|
|
badmsg = this_res.readoReason;
|
|
else if (this_res.canChangeFEOnly)
|
|
{ // Bij wijzigen tijdstip ruimte (naar voren) schuiven voorzieningen mogelijk mee.
|
|
if (new_van < this_res.earliest_expire_change)
|
|
badmsg = L("lcl_res_lastmin"); // te laat
|
|
}
|
|
|
|
if (!badmsg)
|
|
{
|
|
// Is voldaan aan de minimale reserveringsduur.
|
|
if (durationHours < min_duur)
|
|
badmsg = L("lcl_res_room_min_duration").format(min_duur);
|
|
}
|
|
if (!badmsg)
|
|
{
|
|
// Mag deze activiteit voor deze catalogus (discipline) wel
|
|
var max_duration_err = res.max_duration_r(act_key, disc_key, durationHours);
|
|
if (max_duration_err.err)
|
|
badmsg = max_duration_err.message;
|
|
}
|
|
if (!badmsg)
|
|
{
|
|
// "CV" ook altijd controleren
|
|
var max_duration_err = res.max_duration_cv(rsv_ruimte_key, durationHours);
|
|
if (max_duration_err.err)
|
|
badmsg = max_duration_err.message;
|
|
}
|
|
|
|
if (badmsg)
|
|
{
|
|
result = { message: badmsg }; // Ongeldige aanroep
|
|
}
|
|
else
|
|
{
|
|
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)
|
|
{
|
|
result = {
|
|
success: false,
|
|
message: L("lcl_res_mid_block")
|
|
};
|
|
}
|
|
else
|
|
{
|
|
var fields = [ { dbs: "res_rsv_ruimte_van", typ: "time", val: new_van },
|
|
{ dbs: "res_rsv_ruimte_tot", typ: "time", 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 || extern_id) // Ook Externe reserveringen mogen niet dirty worden
|
|
{
|
|
check_fail_sql = " if res.dirty_level_all(" + rsv_ruimte_key + ") <> 0 then"
|
|
+ " raise_application_error (-20001, "+safe.quoted_sql(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);
|
|
if (err.friendlyMsg)
|
|
{
|
|
error = err.friendlyMsg;
|
|
result = {
|
|
success: false,
|
|
info: err.friendlyMsg,
|
|
message: err.friendlyMsg
|
|
};
|
|
}
|
|
else
|
|
{
|
|
shared.trackaction("RESUPD", rsv_ruimte_key, L("lcl_res_track_room_time_shifted_from")
|
|
+ toDateTimeString(old_van) + "-" + toTimeString(old_tot)
|
|
+ L("lcl_res_track_room_time_shifted_to")
|
|
+ toDateTimeString(new_van) + "-" + toTimeString(new_tot)
|
|
);
|
|
var sql = "SELECT res_rsv_ruimte_dirtlevel"
|
|
+ " FROM res_rsv_ruimte"
|
|
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
|
|
oRs = Oracle.Execute(sql);
|
|
var addClass = "";
|
|
var message = "";
|
|
if (oRs("res_rsv_ruimte_dirtlevel").Value & res.dirtlevel.ruimte.notavailable)
|
|
{
|
|
message = L("lcl_res_dirtyroom");
|
|
addClass += " res_fatal";
|
|
}
|
|
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").Value & res.dirtlevel.deel.notavailable)
|
|
{
|
|
message = L("lcl_res_dirtyobject");
|
|
addClass += " res_fatal";
|
|
}
|
|
}
|
|
|
|
if (extern_id && (S("msgraph_sync_level") & 6) && this_res.canWriteExtern) {
|
|
var DEZE = this;
|
|
var hook = hookfunc.gethook("utils/exchange/res_to_graph.wsc");
|
|
var newExternal = rsv_ruimte_externnr == null && rsv_ruimte_externnr2 == null; // Nooit verzonden, wel een externe ruimte
|
|
hook.initialize({
|
|
DEZE: DEZE,
|
|
custabspath: Server.MapPath(custpath)
|
|
});
|
|
hook.resToGraph(rsv_ruimte_key, (newExternal ? "C" : "U"));
|
|
hook = null;
|
|
}
|
|
|
|
result = { success: true,
|
|
info: L("lcl_res_track_room_shifted_info") + restxt + ": " + toDateTimeString(new_van) + "-" + toTimeString(new_tot),
|
|
removeClass: "res_fatal",
|
|
message: message,
|
|
addClass: addClass,
|
|
new_van: new_van.getFloatHours(),
|
|
new_tot: new_tot.getFloatHours()
|
|
};
|
|
}
|
|
}
|
|
}
|
|
Response.Write(JSON.stringify(result));
|
|
%>
|
|
<% ASPPAGE_END(); %>
|