BLCC#77343 reserveringen van of naar externe ruimtes kunnen wijzigen

svn path=/Website/trunk/; revision=60052
This commit is contained in:
2023-04-17 14:57:59 +00:00
parent 3f02d43b67
commit afa4f2ad20
9 changed files with 93 additions and 28 deletions

View File

@@ -1843,7 +1843,10 @@ res = {
+ " , rsv_prepost.res_disc_params_preposttime"
+ " , ro.res_ruimte_opstel_key"
+ " , ro.res_ruimte_opstel_tijd"
+ " , rsv_prepost.res_ruimte_extern_id"
+ " , rv.res_rsv_ruimte_externnr"
+ " , rv.res_rsv_ruimte_externnr2"
+ " , rv.res_rsv_ruimte_externsyncdate"
+ " , " + lcl.xsqla("ra.res_activiteit_omschrijving", "ra.res_activiteit_key")
+ " , res_rsv_ruimte_bezoekers"
+ " FROM res_v_aanwezigrsv_ruimte rv"
@@ -1857,7 +1860,7 @@ res = {
+ " AND r1.res_alg_ruimte_verwijder IS NULL"
+ " AND r2.res_alg_ruimte_verwijder IS NULL"
+ " ) X"
+ " , (SELECT res_ruimte_key, res_disc_params_preposttime"
+ " , (SELECT res_ruimte_key, res_ruimte_extern_id, res_disc_params_preposttime"
+ " FROM res_disc_params, res_ruimte"
+ " WHERE res_disc_params.res_ins_discipline_key = res_ruimte.res_discipline_key) rsv_prepost"
+ " WHERE rv.res_rsv_ruimte_van between " + params.res_van.toSQL() + " AND " + params.res_tot.endToSQL()
@@ -1913,8 +1916,20 @@ res = {
data.na_koppel = 1;
if (oRs("res_rsv_ruimte_dirtlevel").Value)
data.dirtlevel = oRs("res_rsv_ruimte_dirtlevel").Value;
if (oRs("res_rsv_ruimte_externnr").Value)
var externnr = oRs("res_rsv_ruimte_externnr").Value;
var externnr2 = oRs("res_rsv_ruimte_externnr2").Value;
var externsyncdate = oRs("res_rsv_ruimte_externsyncdate").Value;
var canWriteExtern = oRs("res_ruimte_extern_id").Value != null // Deze mogen nooit
&& ((S("msgraph_sync_level") & 6) == 2 // We hebben alleen schrijfrechten op de ruimte-resource (niet op de gebruikers)
&& ( (externnr == null && externnr2 == null) // (Nog) niet gesynced
|| (externnr != null && externnr2 == null // Deze reservering is vanuit Facilitor ge-initieerd
&& externsyncdate != null)) // Vanuit Outlook is de externsyncdate niet gevuld
|| (S("msgraph_sync_level") & 4)); // We hebben schrijfrechten op alle gebruikers
if (externnr) { // Is dit geboekt vanuit een externe API die wij niet mogen wijzigen in Facilitor?
data.extern_api = true;
data.extern_readonly = !canWriteExtern;
}
data.activiteit = oRs("res_activiteit_omschrijving").Value;
data.res_key = oRs("res_reservering_key").Value;
data.res_volgnr = oRs("res_rsv_ruimte_volgnr").Value;
@@ -2916,7 +2931,7 @@ function planbordTooltipShowing(res_rsv_ruimte_key)
+ " res_ruimte rr"
+ " WHERE sa.res_srtactiviteit_key = ra.res_srtactiviteit_key"
+ " AND ra.res_activiteit_key = rrr.res_activiteit_key"
+ " AND rrr.res_rsv_ruimte_key = " + res_rsv_ruimte_key // oei, dit was een bug?!
+ " AND rrr.res_rsv_ruimte_key = " + res_rsv_ruimte_key
+ " AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)"
+ " AND rro.res_ruimte_key = rr.res_ruimte_key(+)";
var oRs = Oracle.Execute(sql);

View File

@@ -94,8 +94,13 @@ for(var i = 0; i < amount; i++)
// vind de te verwijderen rsv_ruimte_keys
sql = "SELECT res_rsv_ruimte_key"
+ " FROM res_rsv_ruimte"
+ " WHERE res_reservering_key=" + this_res[i].res_reservering_key
+ " , res_ruimte_extern_id"
+ " FROM res_rsv_ruimte rrr"
+ " , res_ruimte_opstelling rro"
+ " , res_ruimte rr"
+ " WHERE res_reservering_key = " + this_res[i].res_reservering_key
+ " AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)"
+ " AND rro.res_ruimte_key = rr.res_ruimte_key(+)"
+ " AND res_rsv_ruimte_verwijder IS NULL"
+ " AND " + to_do_rsv_ruimte_key;
@@ -110,7 +115,7 @@ for(var i = 0; i < amount; i++)
continue; // Niet al te veel zeuren
}
if (rrr[i].res_ruimte_extern_id) {
if (oRs2("res_ruimte_extern_id").Value) {
del_key_arr.push(one_rsv_ruimte_key);
}
@@ -157,7 +162,7 @@ for(var i = 0; i < amount; i++)
// Daarbij ook diverse controles/ updates uitvoeren op 'andere zaken'
sql = "BEGIN "
+ sql + ";"
+ " res.set_ruimte_dirty (" + one_rsv_ruimte_key + "); " // Zelf dirty geworden?
// set_ruimte_dirty hoeft niet: wij zijn verwijderd en kunnen daarmee nooit dirty zijn geworden
+ " res.set_ruimtes_clean (" + oldvan.toSQL() + "); " // Anderen 'clean' geworden
+ " res.follow_artikel (" + one_rsv_ruimte_key + ", " + oldvan.toSQL(true) + ", " + oldtot.toSQL(true) + "); " // catering mee verplaatsen
+ " res.follow_deel (" + one_rsv_ruimte_key + ", " + oldvan.toSQL(true) + ", " + oldtot.toSQL(true) + "); " // objecten mee verplaatsen

View File

@@ -111,6 +111,7 @@ if (what & 65536)
var msg = L("lcl_res_multi_copy").format(resnum) + changed;
var keyList = getFParamKeyArray("deelreserveringen", []);
var res_rsv_ruimte_key_arr = [];
var anyExtern = extern_id != null;
var old_extern_ids = {};
@@ -150,6 +151,7 @@ if (what != "" && keyList.length > 0)
for (i in keyList)
{
var rsv_ruimte_key_to = keyList[i];
res_rsv_ruimte_key_arr.push(keyList[i]);
if ((what & 16) > 0 || (what & 2048) > 0)
{
@@ -175,9 +177,13 @@ if (what != "" && keyList.length > 0)
+ " AND rro.res_ruimte_key = rr.res_ruimte_key(+)"
+ " AND rrr.res_rsv_ruimte_key = " + rsv_ruimte_key_to;
var oRs_ext = Oracle.Execute(sql_ext);
old_extern_ids[rsv_ruimte_key_to] = oRs_ext("res_ruimte_extern_id").Value;
if (what == 16 && extern_id == oRs_ext("res_ruimte_extern_id").Value) { // We wijzigen alleen de ruimte, en die is al hetzelfde
res_rsv_ruimte_key_arr = res_rsv_ruimte_key_arr.slice(0, -1); // Dan doen we hier niets mee in de Exchange koppeling
} else {
old_extern_ids[rsv_ruimte_key_to] = oRs_ext("res_ruimte_extern_id").Value;
anyExtern |= old_extern_ids[rsv_ruimte_key_to] != null;
}
oRs_ext.Close();
anyExtern |= old_extern_ids[rsv_ruimte_key_to] != null;
}
else
{ // Ruimte wordt niet overgenomen. Bepaal de vervaldatum van de ruimte van de reservering die gewijzigd wordt.
@@ -235,7 +241,8 @@ if (what != "" && keyList.length > 0)
}
}
if (anyExtern && (S("msgraph_sync_level") & 6) && (what & 2111)) { // 1+2+4+8+16+32+2048; voor Outlook relevante velden, sommigen alvast voor future reference
if (anyExtern && res_rsv_ruimte_key_arr.length && (S("msgraph_sync_level") & 6)
&& (what & 2111)) { // 1+2+4+8+16+32+2048; voor Outlook relevante velden, sommigen alvast voor future reference
Server.ScriptTimeout = 1200; // 20m, dit kan (potentieel) even duren
var DEZE = this;
var hook = hookfunc.gethook("utils/exchange/res_to_graph.wsc");
@@ -243,7 +250,7 @@ if (what != "" && keyList.length > 0)
DEZE: DEZE,
custabspath: Server.MapPath(custpath)
});
var params = { "res_rsv_ruimte_key_arr": keyList };
var params = { "res_rsv_ruimte_key_arr": res_rsv_ruimte_key_arr };
if (what & 16) {
params.old_extern_ids = old_extern_ids;
}

View File

@@ -673,8 +673,8 @@ FCLTHeader.Requires({ plugins: ["jQuery", "kenmerk"] });
//@@TODO dat kan toch ook mooier en direct serverside?
} // einde Bestaande reservering
var fixedExternal = rrr.rsv_ruimte_key > 0 && rrr.res_ruimte_extern;
var isExternalReadonly = fixedExternal && !this_res.canWriteExtern;
var resExternal = rrr.rsv_ruimte_key > 0 && rrr.res_ruimte_extern;
var isExternalReadonly = resExternal && !this_res.canWriteExtern;
lcl.set_dialect(rrr.srtactiviteit_key, "RES_SRTACTIVITEIT_KEY");
@@ -1864,7 +1864,7 @@ FCLTHeader.Requires({ plugins: ["jQuery", "kenmerk"] });
autlevel: authparams.PRSwritelevel,
onChange: "changeNameH",
moreinfo: urole!='fe',
readonly: authparams.PRSwritelevel==9 || ordernr_reado || fixedExternal,
readonly: authparams.PRSwritelevel==9 || ordernr_reado || resExternal,
required: true,
trclass: (S("res_allow_for_others")&&!(rrr.mld_opdr_key > 0)?"":"hidden")
});

View File

@@ -731,7 +731,7 @@ else // update
var resUpd = buildTrackingUpdate("res_rsv_ruimte", " res_rsv_ruimte_key = " + rsv_ruimte_key, fields);
var check_fail_sql = "";
if (S("res_fe_allow_dirty") != 1 && urole == 'fe')
if (S("res_fe_allow_dirty") != 1 && urole == 'fe' || 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.qL("lcl_res_fe_no_dirty") + ");"

View File

@@ -357,7 +357,7 @@ function make_plan_regel(room, ar, params, nr_days, row, hour_px)
if (ar[ci].rsv_ruimte_key && ar[ci].rsv_ruimte_key == params.rsv_ruimte_key)
statClass += " res_current";
var theClass = statClass + " gepland" + (room.extern_id != null? " extern" : "");
var theClass = statClass + " gepland";
if (ar[ci].dirtlevel & res.dirtlevel.ruimte.notavailable)
@@ -451,10 +451,12 @@ function make_plan_regel(room, ar, params, nr_days, row, hour_px)
if (!postclean)
theClass += " res_nopost";
if (ar[ci].extern_api)
if (ar[ci].extern_api) {
theClass += " res_extern click";
if (!ar[ci].na_koppel && !ar[ci].extern_api && !not_available && !params.forSelectRoom)
if (ar[ci].extern_readonly)
theClass += " extern_readonly";
}
else if (!ar[ci].na_koppel && !not_available && !params.forSelectRoom)
theClass += " click";
var div = "<div class='"+theClass+" hidden'";
@@ -940,10 +942,6 @@ __Log("start make_plan_room");
cls = " res_nofit";
}
}
if (room.extern_id != null)
{
cls += " extern";
}
%>
<div class='labelgrid hidden<%=cls%>' data-row='<%=row%>' style='grid-column: 1;grid-row: <%=row%>;<%=params.forSelectRoom ? " cursor: pointer;" : ""%>'
id='<%=room.res_ruimte_key%>'

View File

@@ -123,7 +123,7 @@ $(function() {});
var startx; // start positie van het slepen (left);
var starty; // start positie van het slepen (top);
var x, y;
var element = $('div.gepland').not('.overflowleft,.overflowright,.res_extern,.res_blok');
var element = $('div.gepland').not('.overflowleft,.overflowright,.extern_readonly,.res_blok');
element.draggable({
cursor: 'crosshair',
containment: false,
@@ -163,7 +163,7 @@ $(function() {});
iframeFix: true,
scroll: true
});
$('div.gepland:not(.res_nietvrij,.res_lunchblok,.overflowright,.overflowleft.continueright,.continueleft,.extern,.res_extern)').resizable(
$('div.gepland:not(.res_nietvrij,.res_lunchblok,.overflowright,.overflowleft.continueright,.continueleft,.extern,.extern_readonly)').resizable(
{
handles: 'e, w',
ghost: true,

View File

@@ -32,10 +32,13 @@ sql = "SELECT rsv.res_rsv_ruimte_van,"
+ " 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_eindtijdblok,"
+ " rr.res_ruimte_extern_id"
+ " FROM res_rsv_ruimte rsv"
+ " , res_ruimte_opstelling rro"
+ " , res_ruimte rr"
@@ -53,6 +56,9 @@ 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;
@@ -117,7 +123,7 @@ else
];
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)
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"))+");"
@@ -175,6 +181,19 @@ else
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",

View File

@@ -43,11 +43,14 @@ sql = "SELECT rrr.res_rsv_ruimte_van"
+ " , rrr.res_rsv_ruimte_volgnr"
+ " , rrr.res_reservering_key"
+ " , rrr.res_status_fo_key"
+ " , rrr.res_rsv_ruimte_externnr"
+ " , rrr.res_rsv_ruimte_externnr2"
+ " , rr.res_ruimte_key"
+ " , " + lcl.xsqla('rr.res_ruimte_nr', 'rr.res_ruimte_key')
+ " , rrr.res_activiteit_key"
+ " , rdp.res_disc_params_preposttime"
+ " , ra.res_activiteit_ismaster"
+ " , rr.res_ruimte_extern_id"
+ " FROM res_rsv_ruimte rrr"
+ " , res_ruimte_opstelling rro"
+ " , res_ruimte rr"
@@ -67,6 +70,9 @@ 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;
var fo_status = oRs("res_status_fo_key").value;
var old_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;
var isMaster = oRs("res_activiteit_ismaster").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 && (fo_status == 1 || fo_status == 2))
@@ -88,6 +94,7 @@ sql = "SELECT " + lcl.xsqla('rr.res_ruimte_nr', 'rr.res_ruimte_key')
+ " , rr.res_ruimte_min_duur"
+ " , rr.res_ruimte_begintijdblok"
+ " , rr.res_ruimte_eindtijdblok"
+ " , rr.res_ruimte_extern_id"
+ " FROM res_ruimte rr"
+ " , res_disc_params rdp"
+ " WHERE rr.res_discipline_key = rdp.res_ins_discipline_key"
@@ -98,6 +105,7 @@ 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;
var extern_id = oRs("res_ruimte_extern_id").Value;
oRs.Close();
sql = "SELECT f.fac_functie_key"
@@ -222,7 +230,7 @@ if (!badmsg)
}
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)
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"))+");"
@@ -257,6 +265,19 @@ if (!badmsg)
+ L("lcl_res_track_room_shifted_to")
+ new_ruimte_oms
);
if (old_extern_id != 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"), { "old_extern_id": old_extern_id });
hook = null;
}
var sql = "SELECT res_rsv_ruimte_dirtlevel"
+ " FROM res_rsv_ruimte"
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;