Files
Facilitor/APPL/RES/res_multi_create_save.asp
Erik Groener 469f83f337 VNOG#84055 Reserveringen van een week kunnen niet herhaald worden
svn path=/Website/trunk/; revision=68264
2025-03-03 13:01:55 +00:00

324 lines
13 KiB
Plaintext

<%@ language = "JavaScript" %>
<% /*
$Revision$
$Id$
File: res_multi_create_save.asp
Description: save-script van res_multi_create
Parameters:
rsv_ruimte_key bron-deelreservering
urole
newDates
Context:
Note:
*/
var JSON_Result = true;
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../shared/save2db.inc" -->
<!-- #include file="./res.inc" -->
<!-- #include file="../bez/bez.inc" -->
<%
protectRequest.validateToken();
var urole = getQParamSafe("urole");
var rsv_ruimte_key = getQParamInt("rsv_ruimte_key");
var isnewres = (getFParamInt("has_isnewres", 0) == 1 ? getFParam("isnewres", "") == "on" : false); // De 'kopieer buiten reeks' functie
var isallres = (getFParamInt("has_withdeelres", 0) == 1 ? getFParam("withdeelres", "") == "on" : false); // De 'kopieer ook alle deelreserveringen' functie
res.res_set_dialect(rsv_ruimte_key);
if (urole == "xx") // In case you enter via search
{
var authparamsRESFOF = user.checkAutorisation("WEB_RESFOF");
urole = (authparamsRESFOF ? "fo" : "fe");
}
var this_res = res.func_enabled(rsv_ruimte_key); // wat mocht ik zoal op deze reservering
user.auth_required_or_abort(this_res.couldCreate);
// =========================================
// Eerst wat info ophalen
var sql = "SELECT rr.res_reservering_key"
+ " , rr.res_reservering_ispool"
+ " , r.res_ruimte_startdatum"
+ " , r.res_ruimte_vervaldatum"
+ " , TRUNC(rrr.res_rsv_ruimte_van) rsv_ruimte_datum"
+ " , r.res_ruimte_extern_id"
+ " FROM res_reservering rr"
+ " , res_rsv_ruimte rrr"
+ " , res_ruimte_opstelling ro"
+ " , res_ruimte r"
+ " WHERE rr.res_reservering_key = rrr.res_reservering_key"
+ " AND rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key(+)"
+ " AND ro.res_ruimte_key = r.res_ruimte_key(+)"
+ " AND res_rsv_ruimte_key = " + rsv_ruimte_key;
var oRs = Oracle.Execute(sql);
var reservering_key = oRs("res_reservering_key").Value;
var extern_id = oRs("res_ruimte_extern_id").Value;
var ispool = (oRs("res_reservering_ispool").Value) == 1;
var rsv_ruimte_datum = new Date(oRs("rsv_ruimte_datum").Value);
var ruimte_startdatum = oRs("res_ruimte_startdatum").Value;
var ruimte_vervaldatum = oRs("res_ruimte_vervaldatum").Value;
if (ruimte_startdatum != null)
ruimte_startdatum = new Date(ruimte_startdatum);
if (ruimte_vervaldatum != null)
ruimte_vervaldatum = new Date(ruimte_vervaldatum);
oRs.Close();
var nrPAF = 0;
if (!ispool) // Dan gaan bezoekers toch niet mee
{
var sql = "SELECT bez_afspraak_key"
+ " FROM bez_afspraak ba"
+ " WHERE ba.res_rsv_ruimte_key = " + rsv_ruimte_key;
var oRs = Oracle.Execute(sql);
if (!oRs.Eof)
{
var this_bez = bez.func_enabled_afspraak(oRs("bez_afspraak_key").Value);
nrPAF = this_bez.nrPAF;
}
oRs.Close();
}
var newres_keys = [];
// Maak een nieuwe reservering en return de reservering_key
var createAndUseNewResKey = function _createAndUseNewResKey() {
var resfields = [ { dbs: "res_reservering_key", typ: "key", seq: "res_s_res_reservering_key" },
{ dbs: "res_reservering_ispool", typ: "number", val: ispool ? 1 : 0 }
];
var resIns = buildInsert("res_reservering", resfields);
var newres_key = resIns.sequences["res_reservering_key"];
newres_keys.push(newres_key);
Oracle.Execute(resIns.sql);
return newres_key;
}
// Maak 1 nieuwe reservering en return die key,
// elke vervolg-aanroep maakt dus geen nieuwe reservering maar returned alleen de key
var reuseNewResKey = function _reuseNewResKey() {
if (newres_keys.length) {
return newres_keys[0];
} else {
return createAndUseNewResKey();
}
}
var sql = "SELECT MAX (rr.res_rsv_ruimte_volgnr) last_volg"
+ " FROM res_rsv_ruimte rr"
+ " WHERE rr.res_reservering_key = " + this_res.res_reservering_key;
var oRs = Oracle.Execute(sql)
var last_volg = oRs("last_volg").Value;
oRs.Close();
var form_dates = Request.Form("newDates");
if (isallres)
{
// reservering_key: oude reservering key
// rsv_ruimte_datum: datum van te kopieren ruimtereservering
var new_date = getFParamDate("date_from0", null);
var time_between = new_date - rsv_ruimte_datum;
// Niet via een achterdeur een herhaalde reservering opnieuw aanmaken.
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();
}
if (!zelfdedag)
abort_with_warning(L("lcl_res_copied").format("0"));
var sql_ins = "DECLARE"
+ " new_key NUMBER;"
+ "\nBEGIN"
var sql = "SELECT rrr.res_rsv_ruimte_key"
+ " , rrr.res_rsv_ruimte_van"
+ " , rrr.res_rsv_ruimte_volgnr"
+ " , r.res_ruimte_startdatum"
+ " , r.res_ruimte_vervaldatum"
+ " FROM res_rsv_ruimte rrr"
+ " , res_ruimte r"
+ " , res_ruimte_opstelling ro"
+ " WHERE rrr.res_reservering_key = " + reservering_key
+ " AND rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key(+)"
+ " AND ro.res_ruimte_key = r.res_ruimte_key(+)"
+ " AND rrr.res_rsv_ruimte_verwijder IS NULL"
+ " ORDER BY rrr.res_rsv_ruimte_volgnr";
var oRs = Oracle.Execute(sql);
while (!oRs.eof)
{
var rsv_key = oRs("res_rsv_ruimte_key").Value;
var rsv_volgnr = oRs("res_rsv_ruimte_volgnr").Value;
var rsv_datum = new Date(oRs("res_rsv_ruimte_van").Value + time_between);
var ruimte_startdatum = oRs("res_ruimte_startdatum").Value;
var ruimte_vervaldatum = oRs("res_ruimte_vervaldatum").Value;
if (ruimte_startdatum != null)
ruimte_startdatum = new Date(ruimte_startdatum);
if (ruimte_vervaldatum != null)
ruimte_vervaldatum = new Date(ruimte_vervaldatum);
if (ruimte_startdatum != null && ruimte_startdatum >= rsv_datum)
{
abort_with_warning(L("lcl_res_room_notavailable").format(toDateString(ruimte_startdatum)));
}
if (ruimte_vervaldatum != null && ruimte_vervaldatum < rsv_datum)
{
abort_with_warning(L("lcl_res_room_expired").format(toDateString(ruimte_vervaldatum)));
}
//
sql_ins += "\n new_key := res.res_copy_deelres(" + rsv_key + "," + rsv_datum.toSQL() + "," + user_key + ",0," + reuseNewResKey() + "," + rsv_volgnr + ");";
// Als FO en scopeless dan de eventueel gezette dirtlevel er weer afhalen. (10 bits: 1023 - 256 = 767)
if (S("res_fo_catering_scopeless") == 1 && urole == "fo" )
{
sql_ins += "\n UPDATE res_rsv_artikel SET res_rsv_artikel_dirtlevel = BITAND(res_rsv_artikel_dirtlevel,767) WHERE res_rsv_ruimte_key = new_key;";
}
if (S("res_fe_allow_dirty") != 1 && urole == 'fe')
{
sql_ins += " IF res.dirty_level_all(new_key) <> 0 THEN"
+ " raise_application_error (-20001, " + safe.quoted_sql(L("lcl_res_fe_no_dirty_date").format(toDateString(rsv_datum))) + ");"
+ " END IF;"
}
sql_ins += " UPDATE res_rsv_artikel SET res_rsv_artikel_prijs = NULL WHERE res_rsv_ruimte_key = new_key;"
// Er moet aangegeven worden of de artikelregels gefiatteerd dienen te worden of direct goedgekeurd kunnen worden.
// Dit moet nadat de rsv_artikel prijs is aangepast. De functie set_catalogus_approve kan dus niet aan het einde van de functie res_copy_deelres.
+ " res.set_catalogus_approve(new_key, " + user_key + ");";
oRs.MoveNext();
}
oRs.Close();
sql_ins += "\n END;"
//
var err = Oracle.Execute(sql_ins, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
}
else
{
var sql = "DECLARE"
+ " new_key NUMBER;"
+ "\nBEGIN";
for (var i = 1; i <= form_dates.Count; i++)
{
var datum = new Date(parseInt(form_dates(i),10));
if (ruimte_startdatum != null && ruimte_startdatum >= datum)
{
abort_with_warning(L("lcl_res_room_notavailable").format(toDateString(ruimte_startdatum)));
}
if (ruimte_vervaldatum != null && ruimte_vervaldatum < datum)
{
abort_with_warning(L("lcl_res_room_expired").format(toDateString(ruimte_vervaldatum)));
}
if (ispool) // Hele reservering
{
sql += "\n new_key := res.res_copy_res(" + reservering_key + "," + datum.toSQL() + "," + user_key + ", 0, " + createAndUseNewResKey() + ");";
}
else // Gewone
{
sql += "\n new_key := res.res_copy_deelres(" + rsv_ruimte_key + "," + datum.toSQL() + "," + user_key + (isnewres?",0,"+reuseNewResKey()+","+i:"") + ");";
// Als FO en scopeless dan de eventueel gezette dirtlevel er weer afhalen. (10 bits: 1023 - 256 = 767)
if (S("res_fo_catering_scopeless") == 1 && urole == "fo" )
{
sql += "\n UPDATE res_rsv_artikel SET res_rsv_artikel_dirtlevel = BITAND(res_rsv_artikel_dirtlevel,767) WHERE res_rsv_ruimte_key = new_key;";
}
if (S("res_fe_allow_dirty") != 1 && urole == 'fe')
{
sql += " IF res.dirty_level_all(new_key) <> 0 THEN"
+ " raise_application_error (-20001, " + safe.quoted_sql(L("lcl_res_fe_no_dirty_date").format(toDateString(datum))) + ");"
+ " END IF;"
}
sql += " UPDATE res_rsv_artikel SET res_rsv_artikel_prijs = NULL WHERE res_rsv_ruimte_key = new_key;"
// Er moet aangegeven worden of de artikelregels gefiatteerd dienen te worden of direct goedgekeurd kunnen worden.
+ " res.set_catalogus_approve(new_key, " + user_key + ");";
}
}
sql += " END;"
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
}
shared.trackaction("RESCPY", rsv_ruimte_key);
if (extern_id && (S("msgraph_sync_level") & 6)) { // Uitgaande outlook koppeling op deze res_ruimte
Server.ScriptTimeout = 1200; // 20m, dit kan (potentieel) even duren
var sql = "SELECT res_rsv_ruimte_key FROM res_rsv_ruimte";
if (newres_keys.length > 0) {
sql += " WHERE res_reservering_key IN (" + newres_keys.join(", ") + ")";
} else {
sql += " WHERE res_reservering_key = " + reservering_key
+ " AND res_rsv_ruimte_volgnr > " + last_volg
}
var oRs = Oracle.Execute(sql);
var DEZE = this;
var hook = hookfunc.gethook("utils/exchange/res_to_graph.wsc");
hook.initialize({
DEZE: DEZE,
custabspath: Server.MapPath(custpath)
});
rsv_ruimte_key_arr = [];
while (!oRs.EoF) {
rsv_ruimte_key_arr.push(oRs("res_rsv_ruimte_key").Value);
oRs.moveNext();
}
oRs.Close();
var result = hook.batchToGraph("C", { "res_rsv_ruimte_key_arr": rsv_ruimte_key_arr });
hook = null;
}
var msg = [];
if (isnewres)
{
msg.push(L("lcl_res_copied_new").format(form_dates.Count, newres_keys[0]));
var sql = "SELECT MIN(res_rsv_ruimte_key)"
+ " FROM res_rsv_ruimte "
+ " WHERE res_reservering_key=" + newres_keys[0];
var oRs = Oracle.Execute(sql);
var new_rsv_ruimte_key = oRs(0).Value;
oRs.Close();
}
else
{
// Klantspecifieke check functie (hookfunction) voor de bezoekers
var sql = "SELECT bez_bezoekers_key"
+ " FROM res_rsv_ruimte rr"
+ " , bez_bezoekers bb"
+ " , bez_afspraak ba"
+ " WHERE rr.res_reservering_key = " + this_res.res_reservering_key
+ " AND rr.res_rsv_ruimte_volgnr > " + last_volg // Die is net aangemaakt
+ " AND ba.res_rsv_ruimte_key = rr.res_rsv_ruimte_key"
+ " AND bb.bez_afspraak_key = ba.bez_afspraak_key";
var oRs = Oracle.Execute(sql);
while (!oRs.EOF)
{
var pResult = new HookResult();
if (!custfunc.bez_postsave(oRs("bez_bezoekers_key").Value, pResult))
{
abort_with_warning(pResult.errmsg);
}
oRs.MoveNext()
}
oRs.Close()
msg.push(L("lcl_res_copied").format(form_dates.Count));
}
if (nrPAF > 0)
{
msg.push(L("lcl_bez_paf_not_copied").format(nrPAF));
}
var result = { toaster: msg.join('\n'), success: true, refresh: true, new_rsv_ruimte_key: new_rsv_ruimte_key };
Response.Write(JSON.stringify(result));
%><% ASPPAGE_END(); %>