Files
Facilitor/APPL/RES/res_edit_objcat_save.asp
Maykel Geerdink 6b1894ee87 FMHN#86573: Reservering blokkeren bij onbeschikbaar verbruiksartikel.
svn path=/Website/trunk/; revision=67576
2025-01-13 13:11:08 +00:00

1061 lines
44 KiB
Plaintext
Raw Blame History

<%@ language = "JavaScript" %>
<% /*
$Revision$
$Id$
File: res_edit_objcat_save.asp
Description: Opslaan van de gegevens uit res_edit_objcat.asp
Note that because of many checks and constraints in the input-form
availability is almost guaranteed.
Parameters:
rsv_ruimte_key required
.... alle andere gePOSTte res_edit_objcat form u2 fields
Context: Opsla script voor res_edit_objcat.asp maar ook $.post van anderen
Note:
*/
var JSON_Result = true;
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../shared/kenmerk_common.inc" -->
<!-- #include file="res.inc"-->
<%
protectRequest.validateToken();
var urole = getQParamSafe("urole");
var rsv_ruimte_key = getQParamInt("rsv_ruimte_key");
var verynew = getQParamInt("verynew",0);
var this_res = res.func_enabled(rsv_ruimte_key); // Wat heb ik zoal aan rechten op deze specifieke reservering
user.auth_required_or_abort(this_res.canChangeCV || this_res.canChangeWP); // canChangeWP is voor Reserveringen die via de 'Reserveer Werkplek'-module gereserveerd zijn
res.res_set_dialect(rsv_ruimte_key);
// Zo snel mogelijk relevante basisinformatie opzoeken
sql = "SELECT res_reservering_key, "
+ " res_rsv_ruimte_van, res_rsv_ruimte_tot,"
+ " prs_kostenplaats_key,"
+ " res_ruimte_opstel_key,"
+ " res_rsv_ruimte_volgnr"
+ " FROM res_rsv_ruimte"
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
oRs = Oracle.Execute(sql);
var res_key = oRs("res_reservering_key").value;
var res_van = new Date(oRs("res_rsv_ruimte_van").value);
var res_tot = new Date(oRs("res_rsv_ruimte_tot").value);
var kp_key = oRs("prs_kostenplaats_key").value || -1;
var res_volgnr = oRs("res_rsv_ruimte_volgnr").Value;
if (oRs("res_ruimte_opstel_key").value != null)
restype = "R";
else
restype = "CV"; // of "O", maar dat onderscheid is hier verder niet erg relevant
oRs.Close();
var warning = null;
// Hier wordt de expire getest van de *bestaande* objcat
// Setting "res_cat_with_expired_room": Can catering be edited when room is expired {false | true}.
if ((!S("res_cat_with_expired_room") && res_van < this_res.earliest_expire_change) || (res_van < this_res.earliest_expire_changeCV))
{
if (this_res.canChangeFEOnly)
abort_with_warning(L("lcl_res_lastmin")); // te laat
//later pas..., we weten niet eens of ze iets opengeklapt hebben
//else
// if (urole != "bo")
// warning = L("lcl_res_obj_lastminute");
}
// Check of er delen dirty zijn (geworden), en of dat mag, zo niet -> raise_application_error
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 (-20001, " + safe.quoted_sql(L("lcl_res_fe_no_dirty")) + ");"
+ " end if;"
}
var art_dirty_sql = "";
if (!(S("res_fo_catering_scopeless") && (urole == "fo" || urole == "bo")))
{ // Controle of artikelen dirty zijn.
art_dirty_sql = " res.set_artikelen_dirty (" + rsv_ruimte_key + ");"
+ check_fail_sql;
}
var _disc_expires = []; // expire tijd per discipline
function is_expired(disc_key, jsDate)
{
if (disc_key > 0)
{
if (!_disc_expires[disc_key])
_disc_expires[disc_key] = res.discipline_expire(disc_key);
return (jsDate < _disc_expires[disc_key]);
}
}
// artikelen die gesubmit zijn
function resObj(res_deel, res_rsv_deel, van_h, van_m, tot_h, tot_m, i_cnt, i_price, res_oms)
{
this.res_oms = res_oms;
this.res_deel = res_deel;
this.res_rsv_deel = res_rsv_deel; // is hier de res_rsv_artikel_key
this.van_h = van_h;
this.van_m = van_m;
this.tot_h = null;
this.tot_m = null;
this.cnt = 0;
if (i_cnt)
this.cnt = i_cnt;
this.price = 0;
if (i_price)
this.price = i_price;
}
function resObj_add(insObj_arr, cur_res_art, cur_rsv_art, tot_h, tot_m)
{ // Toevoegen van afhaaltijden aan het laatste object in het array.
var curObj = insObj_arr[insObj_arr.length -1];
if (curObj.res_deel == cur_res_art && curObj.res_rsv_deel == cur_rsv_art)
{
curObj.tot_h = tot_h;
curObj.tot_m = tot_m;
}
}
function saveFlexKenmerkenArt(rsv_artikel_key, params)
{
var currentKenmerkenSQL = "SELECT ka.res_kenmerk_key"
+ " , ka.res_kenmerkartikel_waarde"
+ " , k.res_kenmerk_toonbaar"
+ " , k.fac_functie_key"
+ " FROM res_kenmerkartikel ka"
+ " , res_kenmerk k"
+ " , res_rsv_artikel ra"
+ " WHERE k.res_kenmerk_key = ka.res_kenmerk_key"
+ " AND ra.res_rsv_artikel_key = ka.res_rsv_artikel_key"
+ " AND res_kenmerkartikel_verwijder IS NULL"
+ " AND ra.res_rsv_artikel_key = " + rsv_artikel_key;
var allKenmerkenSQL = "SELECT COALESCE (" + lcl.xsql("k.res_kenmerk_omschrijving", "k.res_kenmerk_key")
+ " , " + lcl.xsql("t.res_srtkenmerk_omschrijving", "t.res_srtkenmerk_key") + ") kenmerk_omschrijving"
+ " , t.res_srtkenmerk_kenmerktype kenmerk_kenmerktype"
+ " , t.res_srtkenmerk_systeem kenmerk_systeem"
+ " , k.res_kenmerk_toonbaar kenmerk_readonly"
+ " , k.res_kenmerk_uniek kenmerk_uniek"
+ " , fac_kenmerkdomein_key"
+ " FROM res_kenmerk k"
+ " , res_srtkenmerk t"
+ " WHERE k.res_srtkenmerk_key = t.res_srtkenmerk_key"
+ " AND k.res_kenmerk_key = "; /* wordt in saveFlexkenmerken uitgebreid */
var flextrack = saveFlexKenmerken(rsv_artikel_key,
{ kenmerkTable: "res_kenmerkartikel",
kenmerkParentKey : "res_rsv_artikel_key",
kenmerkWaarde: "res_kenmerkartikel_waarde",
kenmerkKey: "res_kenmerk_key",
kenmerkToonbaar: "res_kenmerk_toonbaar",
currentKenmerkenSQL: currentKenmerkenSQL,
allKenmerkenSQL: allKenmerkenSQL,
requestQF: Request.Form,
extraserie: true,
nameprefix: params.nameprefix,
isNew: params.isNew,
flexPath: "RESA/R",
tracking: true,
module: "RES"
});
return flextrack;
}
// consumable objects
// artikelen in de database
function artinf(key, rsv_key, pricefixed, disc, quantity, lev_h, lev_m, col_h, col_m, price, bo_status, free_art, art_oms)
{
this.key = key;
this.rsv_key = rsv_key;
this.pricefixed = pricefixed;
this.disc = disc;
this.quantity = quantity;
this.lev_h = lev_h;
this.lev_m = lev_m;
this.col_h = col_h;
this.col_m = col_m;
this.price = price;
this.bo_status = bo_status;
this.free_art = (free_art == 1);
this.art_oms = art_oms;
}
var backo = this_res.canWrite("WEB_RESBOF");
var fronto = this_res.canWrite("WEB_RESFOF");
var year = res_van.getFullYear();
var month = res_van.getMonth()+1;
var day = res_van.getDate();
succes = true; // igv twijfel
// reservable objects
var aDel = new Array();
var aUpd = new Array();
var aIns = new Array();
var a_arIns = new Array();
var cur_res_free = false;
var cur_res_oms = null;
var cur_res_art = null;
var cur_rsv_art = null;
var cur_lev_h = "";
var cur_lev_m = "";
var cur_col_h = "";
var cur_col_m = "";
var cur_cnt = 0;
var cur_price = 0;
var pos, lpos, npos, upos;
var sstring = "", pstring;
var must_warn = false; // must I warn about last-minute?
//=================================================
// DEEL EEN: PARSEN VAN HET FORMULIER
//
//
// Request.Form is iets als inpb_c_216_2470136=0,inpbh1_c_216_2470136=14,inpbm1_c_216_2470136=30,inpb_c_217_2470138=0,inpbh1_c_217_2470138=14,inpbm1_c_217_2470138=30,inpeh1_c_217_2470138=15,inpem1_c_217_2470138=30,......
// waarbij 216 de res_artikel_key is en 2470136 de res_rsv_artikel_key
// in het geval van catering
for (var i = 1; i <= Request.Form.Count; i++)
{
var fname = Request.Form.key(i);
var fval = getFParam(fname, "");
var sstring = fname.substring(0,7);
__Log({fname:fname, fval:fval, sstring:sstring});
if (sstring == "inpbd_c")
{
cur_res_free = true;
}
pos = lpos = npos = upos = 0;
if (fval && fval.length)
{
switch (sstring)
{
case "inpbd_c":
{ // EGR: Parsing catering vrije artikelomschrijving
if (fname.indexOf("inpbd_c_") >= 0)
{
cur_res_oms = fval;
}
break;
}
case "inpbp_c":
{ // JGL: Parsing catering RES_ARTIKEL_KEY price
// Will only occur for backoffice
if (cur_res_art)
{
if (fname.indexOf("inpbp_c_") >= 0)
{
if (fval == "" || isNaN(parseFloat(fval.replace(/,/g, "."))))
{
cur_res_art = null;
cur_rsv_art = null;
cur_lev_h = "";
cur_lev_m = "";
cur_col_h = "";
cur_col_m = "";
cur_price = 0;
break;
}
cur_price = parseFloat(fval.replace(/,/g, "."));
}
}
break;
}
//=================================================
case "inpbh1_":
{ // JGL: Parsing catering hour
if (cur_res_art)
{
if (fname.indexOf("inpbh1_c_") >= 0)
{ // Het is een catering veld
if (fval == "" || isNaN(parseInt(fval,10)))
{
cur_res_art = null;
cur_rsv_art = null;
cur_lev_h = "";
cur_lev_m = "";
cur_col_h = "";
cur_col_m = "";
cur_price = 0;
break;
}
cur_lev_h = parseInt(fval,10);
}
}
break;
}
//=================================================
case "inpbm1_":
{ // JGL: Parsing catering minutes
if (cur_res_art)
{ // Zal alleen gezet zijn als het aantal ongelijk 0 was
if (fname.indexOf("inpbm1_c_") >= 0)
{ // Het is een catering veld
if (fval == "" || isNaN(parseInt(fval,10)))
{
cur_res_art = null;
cur_rsv_art = null;
cur_lev_h = "";
cur_lev_m = "";
cur_col_h = "";
cur_col_m = "";
cur_price = 0;
break;
}
cur_lev_m = parseInt(fval,10); // De minuten
}
if (a_arIns.length && a_arIns[a_arIns.length-1].res_rsv_deel == cur_rsv_art && a_arIns[a_arIns.length-1].res_deel == cur_res_art)
{ // CAPG#161
__DoLog("Internal error: Attempting to add " + cur_res_art + " twice", "#FF0000");
__DoLog("Request.Form: " + String(Request.Form));
}
else
{
if (!cur_res_free || (cur_res_free && cur_res_oms != null && cur_res_oms != ""))
a_arIns[a_arIns.length] = new resObj(cur_res_art, cur_rsv_art, cur_lev_h, cur_lev_m, cur_col_h, cur_col_m, cur_cnt, cur_price, cur_res_oms);
// reset waarden voor volgende regel.
cur_res_oms = null;
cur_res_free = false;
}
}
break;
}
case "inpb_c_":
{ // JGL: Parsing catering aantal en bepaal catering RES_ARTIKEL_KEY key
if (cur_res_art)
{
cur_res_art = null;
cur_rsv_art = null;
cur_lev_h = "";
cur_lev_m = "";
cur_col_h = "";
cur_col_m = "";
cur_price = 0;
}
cur_cnt = parseInt(fval, 10); // Onthouden totdat we het uur en de minuten ook hebben
if (isNaN(cur_cnt) || (this_res.canReturnCV ? cur_cnt == 0 : cur_cnt <= 0))
{ // is count corrupted or undefined
i += (backo? 4 : 2); // skip hours and minutes (and for backo also price and total price)
cur_res_free = false; // dat moeten we dan ook opnieuw bepalen
continue;
}
res_rsv_art = fname.substring(7);
cur_res_art = res_rsv_art.substring(0,res_rsv_art.indexOf("_")); // Bepaal catering RES_ARTIKEL_KEY key
cur_rsv_art = res_rsv_art.substring(res_rsv_art.indexOf("_")+1); // Bepaal catering RES_RSV_ARTIKEL_KEY key
break;
}
case "inpb_g_":
{ // Parsing catering artikel geleverd
if (cur_res_art)
{
cur_res_art = null;
cur_rsv_art = null;
cur_lev_h = "";
cur_lev_m = "";
cur_col_h = "";
cur_col_m = "";
cur_price = 0;
cur_geleverd = 0;
}
res_rsv_art = fname.substring(7);
cur_res_art = res_rsv_art.substring(0,res_rsv_art.indexOf("_")); // Bepaal catering RES_ARTIKEL_KEY key
cur_rsv_art = res_rsv_art.substring(res_rsv_art.indexOf("_")+1); // Bepaal catering RES_RSV_ARTIKEL_KEY key
// gelijk maar het veld aanpassen zonder naar de waarde van de checkbox te kijken:
var sql_geleverd = "UPDATE res_rsv_artikel"
+ " SET res_rsv_artikel_geleverd = SYSDATE"
+ " WHERE res_rsv_artikel_key = " + cur_rsv_art;
Oracle.Execute(sql_geleverd);
break;
}
//=================================================
case "inpeh1_":
{ // JGL: Parsing catering collect hour
if (cur_res_art)
{
if (fname.indexOf("inpeh1_c_") >= 0)
{ // Het is een catering veld
if (fval == "" || isNaN(parseInt(fval,10)))
{
cur_col_h = "";
cur_col_m = "";
break;
}
cur_col_h = parseInt(fval,10);
}
}
break;
}
//=================================================
case "inpem1_":
{ // JGL: Parsing catering collect minutes
if (cur_res_art)
{ // Zal alleen gezet zijn als het aantal ongelijk 0 was
if (fname.indexOf("inpem1_c_") >= 0)
{ // Het is een catering veld
if (fval == "" || isNaN(parseInt(fval,10)))
{
cur_col_h = "";
cur_col_m = "";
break;
}
cur_col_m = parseInt(fval,10); // De minuten
}
// Afhaaltijd hoeft niet aanwezig te zijn, maar indien toch dan waarden nog toevoegen.
resObj_add(a_arIns, cur_res_art, cur_rsv_art, cur_col_h, cur_col_m);
}
break;
}
}
}
}
var trackarray = [];
//=================================================
// DEEL TWEE: DE OBJECTEN BIJWERKEN
// Onze checkboxen hebben een hidden veld 'has_xxx' waaraan je kunt zien dat het object gereservereerd was
// in het voorheen.
var durationHours = (res_tot - res_van) / 1000/60/60;
var last_discipline = -1;
var curr_discipline = -1;
// refactoring add and tracking of res_deel from reservation
function addAndTrackRsvDeel(_rsv_ruimte_key, _deel_key, _name, _addCount)
{
// Hoe lang mag ik dit deel reserveren?
var sql = "SELECT p.res_disc_params_maxduur"
+ " , " + lcl.xsqla("c.ins_discipline_omschrijving", "c.ins_discipline_key")
+ " , p.res_disc_params_bonotify"
+ " , c.ins_discipline_key"
+ " FROM res_deel d"
+ " , res_disc_params p"
+ " , res_discipline c"
+ " WHERE d.res_discipline_key = p.res_ins_discipline_key"
+ " AND d.res_discipline_key = c.ins_discipline_key"
+ " AND d.res_deel_key = " + _deel_key;
var oRs = Oracle.Execute(sql);
var bonotify = oRs("res_disc_params_bonotify").Value == 1;
var maxHours = (oRs.Eof ? 0 : oRs("res_disc_params_maxduur").Value);
curr_discipline = oRs("ins_discipline_key").Value;
if ((maxHours > 0) && (maxHours < durationHours))
{
abort_with_warning( oRs("ins_discipline_omschrijving").Value + ": " + L("lcl_res_bad_maxperiod").format(maxHours));
}
oRs.Close();
var sql_insDeel = " INSERT INTO res_rsv_deel"
+ " ( res_rsv_ruimte_key"
+ " , res_deel_key"
+ " , res_rsv_deel_van"
+ " , res_rsv_deel_tot"
+ " , res_rsv_deel_aantal)"
+ " VALUES(" + _rsv_ruimte_key
+ " ," + _deel_key
+ " ," + res_van.toSQL(true) // Vooralsnog geen eigen tijdstippen
+ " ," + res_tot.toSQL(true)
+ " , 1);";
sql = "BEGIN "
+ sql_insDeel
+ " res.set_delen_dirty (" + rsv_ruimte_key + "); "
+ check_fail_sql;
if (bonotify && (curr_discipline != last_discipline)) {
sql += " RES.notifybackoffice(" + rsv_ruimte_key + ", 'RESNEW', 'V', " + deel_key + ");";
last_discipline = curr_discipline;
}
sql += "END;";
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
__Log("added " + _name + " : " + _deel_key);
// Tracking toevoegen.
if (_addCount > 0)
{ // Voor bulk maar 1 keer een regel maar dan wel het aantal vermelden.
var inserttrack = res.trackobject(_deel_key, "insert") + (_addCount > 1 ? " ("+_addCount+"x)" : "");
trackarray.push(inserttrack);
}
}
// refactoring delete and tracking of res_deel from reservation
function deleteAndTrackRsvDeel(_rsv_ruimte_key, _deel_key, _name, _delCount)
{
var _deleteAndTrackSql = "DELETE from res_rsv_deel"
+ " WHERE res_rsv_ruimte_key=" + _rsv_ruimte_key
+ " AND res_deel_key = " + _deel_key;
Oracle.Execute(_deleteAndTrackSql);
__Log("removed " + _name + " : " + _deel_key);
//+ " res.set_delen_clean(" + aDel[i].res_deel + "," + res_van.toSQL() + "); " // Anderen 'clean' geworden vandaag?
// Tracking toevoegen.
if (_delCount > 0)
{
var deletetrack = res.trackobject(_deel_key, "delete") + (_delCount > 1 ? " ("+_delCount+"x)" : "");
trackarray.push(deletetrack);
}
}
for (var i = 1; i <= Request.Form.Count; i++)
{
deel_key = -1;
var name = Request.Form.key(i);
if (name.match(/has_[0-9].*/)) // bestaand object
{
var deel_key = parseInt(name.substring(4));
var present = Request.Form("chk_" + deel_key).Count > 0;
if (!present)
{
// handle removed bulk-items
var bulk = Request.Form("amt_" + deel_key).Count > 0;
if (bulk)
{
var sqlBulk = "SELECT res_deel_key FROM res_rsv_deel" // select items
+ " WHERE res_rsv_ruimte_key=" + rsv_ruimte_key
+ " AND res_deel_key IN ( "
+ " SELECT res_deel_key FROM res_deel"
+ " WHERE res_deel_omschrijving = ( " // with the same description
+ " SELECT res_deel_omschrijving FROM res_deel" // as the de-selected bulk-item
+ " WHERE res_deel_key = " + deel_key
+ " )"
+ " )";
var oRsBulk = Oracle.Execute(sqlBulk);
while (!oRsBulk.eof)
{
deleteAndTrackRsvDeel(rsv_ruimte_key, oRsBulk("res_deel_key").Value, name);
oRsBulk.MoveNext();
}
oRsBulk.Close();
}
else
{
deleteAndTrackRsvDeel(rsv_ruimte_key, deel_key, name);
}
}
else
{
// Als we update van de tijdstipjes gaan ondersteunen komt dat hier.
//+ " res.set_deel_dirty (" + aUpd[i].res_rsv_deel + "); " // Zelf dirty geworden?
//+ " res.set_delen_clean(" + aUpd[i].res_deel + "," + res_van.toSQL() + "); " // Anderen 'clean' geworden vandaag?
}
}
else // misschien nieuw object
{
if (name.match(/chk_[0-9].*/))
{
var deel_key = parseInt(name.substring(4));
var old = Request.Form("has_" + deel_key).Count > 0;
// handle new/updated bulk-items
var bulk = Request.Form("amt_" + deel_key).Count > 0;
if (bulk)
{
var bulkAmount = Request.Form("amt_" + deel_key);
// sql for unselected items for the same bulk-group (self excluded)
var sqlUnsBulk = " SELECT"
+ " res_deel_key"
+ " FROM"
+ " res_deel rd"
+ " WHERE"
+ " rd.res_deel_bulkreserveerbaar = 1"
+ " AND rd.res_deel_omschrijving = (SELECT res_deel_omschrijving FROM res_deel WHERE res_deel_key = " + deel_key + ")"
+ " AND rd.res_deel_key NOT IN ("
+ " SELECT distinct rrd.res_deel_key"
+ " FROM res_rsv_ruimte rrr, res_rsv_deel rrd, res_deel rd"
+ " WHERE rrr.res_rsv_ruimte_van < " + res_tot.toSQL(true)
+ " AND rrr.res_rsv_ruimte_tot > " + res_van.toSQL(true)
+ " AND rrd.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key"
+ " AND rrd.res_deel_key = rd.res_deel_key"
+ " AND rd.res_deel_bulkreserveerbaar = 1"
+ " )"
+ " ORDER BY rd.res_deel_key ASC"; // low to high key
// read all selected items in reservation for the same bulk-group
var sqlSelBulk = "SELECT rd.res_deel_key"
+ " FROM res_v_aanwezigdeel rd"
+ " , res_rsv_deel rrd"
+ " WHERE rd.res_deel_bulkreserveerbaar = 1"
+ " AND rd.res_deel_key = rrd.res_deel_key"
+ " AND rrd.res_rsv_ruimte_key=" + rsv_ruimte_key
+ " AND rd.res_deel_omschrijving = (SELECT res_deel_omschrijving FROM res_deel WHERE res_deel_key = " + deel_key + ")"
+ " ORDER BY rd.res_deel_key DESC"; // last in first out order
// count number of grouped bulk-items in reservation
var oRsCntBulk = Oracle.Execute("SELECT COUNT(*) total FROM (" + sqlSelBulk + ")");
var cntBulk = oRsCntBulk("total").Value;
// remove item(s) from reservation
if (bulkAmount < cntBulk)
{
var oRsSelBulk = Oracle.Execute(sqlSelBulk);
var cntIndex;
for (cntIndex = 0; cntIndex < (cntBulk - bulkAmount); cntIndex++)
{
var delCount = (cntIndex < (cntBulk - bulkAmount -1) ? 0 : (cntBulk - bulkAmount)); // Alleen het totaal aantal tracken.
deleteAndTrackRsvDeel(rsv_ruimte_key, oRsSelBulk("res_deel_key").Value, name, delCount);
oRsSelBulk.MoveNext();
}
oRsSelBulk.Close();
}
// add item(s) to reservation
else if (bulkAmount > cntBulk)
{
var oRsUnsBulk = Oracle.Execute(sqlUnsBulk);
for (var cntIndex = 0; cntIndex < (bulkAmount - cntBulk); cntIndex++)
{
var addCount = (cntIndex < (bulkAmount - cntBulk -1) ? 0 : (bulkAmount - cntBulk)); // Alleen het totaal aantal tracken.
addAndTrackRsvDeel(rsv_ruimte_key, oRsUnsBulk("res_deel_key").Value, name, addCount);
oRsUnsBulk.MoveNext();
}
oRsUnsBulk.Close();
}
oRsCntBulk.Close();
}
else
{
if (!old)
{ // Is geen bulk, dus altijd 1 tracken.
addAndTrackRsvDeel(rsv_ruimte_key, deel_key, name, 1);
}
}
}
}
if (deel_key > 0 && !must_warn)
{
// Expire check
sql = "SELECT res_discipline_key"
+ " FROM res_deel rd"
+ " WHERE rd.res_deel_key = " + deel_key;
oRs = Oracle.Execute(sql)
must_warn = must_warn || is_expired(oRs("res_discipline_key").value, res_van);
oRs.Close();
}
}
// consumable objects
// Haal eerst de (volgens de database) reeds eerder gereserveerde objecten op
// en bewaar die in array r_a_key
// use initial (old) year, month and day when date was changed
sql = "SELECT r_disc.ins_discipline_key"
+ " , r_art.res_artikel_key"
+ " , r_r_art.res_rsv_artikel_key"
+ " , r_r_art.res_rsv_artikel_aantal"
+ " , TO_CHAR(r_r_art.res_rsv_artikel_levering,'HH24') hh"
+ " , TO_CHAR(r_r_art.res_rsv_artikel_levering,'MI') mi"
+ " , TO_CHAR(r_r_art.res_rsv_artikel_afhalen, 'HH24') eh"
+ " , TO_CHAR(r_r_art.res_rsv_artikel_afhalen, 'MI') em"
+ " , r_art.res_artikel_prijs_vast vast"
+ " , COALESCE( CASE WHEN r_art.res_artikel_prijs_vast = 0"
+ " THEN r_r_art.res_rsv_artikel_prijs/r_r_art.res_rsv_artikel_aantal"
+ " ELSE r_art.res_artikel_prijs"
+ " END"
+ " , 0"
+ " ) prijs"
+ " , r_r_art.res_status_BO_key"
+ " , r_dp.res_disc_params_threshold"
+ " , (SELECT SUM(res.getartikelprijs(rra1.res_rsv_artikel_key))"
+ " FROM res_rsv_artikel rra1"
+ " , res_artikel ra1"
+ " WHERE rra1.res_artikel_key = ra1.res_artikel_key"
+ " AND rra1.res_rsv_artikel_dirtlevel = 0"
+ " AND rra1.res_rsv_ruimte_key = " + rsv_ruimte_key
+ " AND ra1.res_discipline_key = r_disc.ins_discipline_key) sum_cat_artikelprijs"
+ " , r_art.res_artikel_vrije_omschrijving"
+ " , r_r_art.res_rsv_artikel_omschrijving"
+ " FROM res_v_aanwezigdiscipline r_disc"
+ " , res_v_aanwezigartikel r_art"
+ " , res_v_aanwezigrsv_artikel r_r_art"
+ " , res_v_aanwezigrsv_ruimte r_r_Rmt"
+ " , res_disc_params r_dp"
+ " WHERE r_r_art.res_rsv_ruimte_key = r_r_Rmt.res_rsv_ruimte_key"
+ " AND r_r_art.res_rsv_ruimte_key = " + rsv_ruimte_key
+ " AND r_r_art.res_artikel_key = r_art.res_artikel_key"
+ " AND r_art.res_discipline_key = r_disc.ins_discipline_key"
+ " AND r_disc.ins_discipline_key = r_dp.res_ins_discipline_key"
+ " ORDER BY ins_discipline_volgnr, " + lcl.xsql('ins_discipline_omschrijving', 'r_disc.ins_discipline_key') + ", res_artikel_nr";
oRs = Oracle.Execute(sql);
var r_a_key = new Array();
while ( !oRs.eof )
{
r_a_key[r_a_key.length] = new artinf(oRs("res_artikel_key").Value, oRs("res_rsv_artikel_key").Value, oRs("vast").Value,
oRs("ins_discipline_key").Value, oRs("res_rsv_artikel_aantal").Value,
oRs("hh").Value, oRs("mi").Value, oRs("eh").Value, oRs("em").Value,
oRs("prijs").Value, oRs("res_status_BO_key").Value,
oRs("res_artikel_vrije_omschrijving").Value, oRs("res_rsv_artikel_omschrijving").Value,
oRs("res_disc_params_threshold").Value, oRs("sum_cat_artikelprijs").Value
);
oRs.MoveNext();
}
oRs.Close();
var cnt;
var CV_has_changed = false;
reserved = 0;
// delete and update are based on the list of previously reserved objects
for (var i = 0; i < r_a_key.length; i++)
{
art_rsv_key = r_a_key[i].key + "_" + r_a_key[i].rsv_key;
if (Request.Form("inpb_c_" + art_rsv_key).Count)
{ // De categorie was opgeklapt-->Hij was zichtbaar
cnt = parseInt(Request.Form("inpb_c_" + art_rsv_key), 10);
if (!isNaN(cnt) && cnt == 0)
{ // delete maar gewoon echt
sql = "DELETE FROM res_rsv_artikel"
+ " WHERE res_rsv_ruimte_key=" + rsv_ruimte_key
+ " AND res_artikel_key = " + r_a_key[i].key
+ " AND res_rsv_artikel_key = " + r_a_key[i].rsv_key;
Oracle.Execute(sql);
// Tracking toevoegen.
var deletetrack = res.trackartikel(r_a_key[i].key, "delete");
trackarray.push(deletetrack);
// Artikel is verwijderd.
CV_has_changed = true;
continue;
}
cur_price = Request.Form("inpbp_c_" + art_rsv_key);
cur_price = (cur_price == "" ? "0.00" : cur_price);
cur_price = parseFloat(String(cur_price).replace(/,/g,"."));
if (!isNaN(cnt) && (this_res.canReturnCV || cnt > 0) && (!backo || !isNaN(cur_price)))
{ // update, negatieve aantallen en negatieve prijs mogelijk
var cur_omsch = getFParam("inpbd_c_" + art_rsv_key, null);
var cur_lev_h = parseInt(Request.Form("inpbh1_c_" + art_rsv_key), 10);
var cur_lev_m = parseInt(Request.Form("inpbm1_c_" + art_rsv_key), 10);
var cur_col_h = parseInt(Request.Form("inpeh1_c_" + art_rsv_key), 10);
var cur_col_m = parseInt(Request.Form("inpem1_c_" + art_rsv_key), 10);
if (isNaN(cur_lev_m) || isNaN(cur_lev_h))
{ // we do nothing when datetime is corrupted,
continue; // should report about this error?
}
if (isNaN(cur_col_m) || isNaN(cur_col_h))
{ // clear collect time
cur_col_m = null;
cur_col_h = null;
}
// Never cyclic updates
var jsDate = (cur_lev_h != null ? new Date(year, month-1, day, cur_lev_h, cur_lev_m, 0) : null);
var jsDateAfhalen = (cur_col_h != null ? new Date(year, month-1, day, cur_col_h, cur_col_m, 0) : null);
must_warn = must_warn || is_expired(r_a_key[i].disc, jsDate);
var bIsAfgemeld = (r_a_key[i].bo_status == 5 || r_a_key[i].bo_status == 6);
var oudeAantal = r_a_key[i].quantity;
var oudeOmschr = r_a_key[i].art_oms;
var oudeLevH = r_a_key[i].lev_h;
var oudeLevM = r_a_key[i].lev_m;
var oudeColH = r_a_key[i].col_h;
var oudeColM = r_a_key[i].col_m;
var oudePrijs = r_a_key[i].price;
var oudeDatum = (oudeLevH ? new Date(year, month-1, day, oudeLevH, oudeLevM, 0) : null);
var oudeAfhalen = (oudeColH ? new Date(year, month-1, day, oudeColH, oudeColM, 0) : null);
// FO kan alleen aantal en tijd aanpassen
sql = "BEGIN "
+ "UPDATE res_rsv_artikel"
+ " SET res_rsv_artikel_aantal = " + cnt
// res_rsv_artikel_prijs moet bijgewerkt worden als
// 1) bij wijzigbare vrije-prijs reserveringen. Alleen de BO kan dat.
// 2) bij afgemelde reserveringen
if (backo && r_a_key[i].pricefixed == 0)
{ // De backoffice had het bedrag in beeld dus kunnen we hier direct vermenigvuldigen.
sql += ",res_rsv_artikel_prijs = " + parseFloat((cnt * cur_price).toFixed(2))
}
else if (oudeAantal != cnt)
{ // frontoffice en frontend hebben mogelijk het aantal aangepast. De prijs konden ze niet bij
// mogelijk is res_rsv_artikel_prijs nog niet ingevuld, dat gaat hier wel goed (NULL==>NULL)
sql += " ,res_rsv_artikel_prijs = res_rsv_artikel_prijs / " + oudeAantal + " * " + cnt;
}
if (r_a_key[i].free_art && (cur_omsch != oudeOmschr))
{
sql += ", res_rsv_artikel_omschrijving = " + safe.quoted_sql(cur_omsch);
}
sql +=", res_rsv_artikel_levering = " + (jsDate ? jsDate.toSQL(true) : "null")
+ ", res_rsv_artikel_afhalen = " + (jsDateAfhalen && jsDateAfhalen < res_tot && jsDateAfhalen >= res_van ? jsDateAfhalen.toSQL(true) : "null")
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key
+ " AND res_artikel_key = " + r_a_key[i].key
+ " AND res_rsv_artikel_key = " + r_a_key[i].rsv_key + ";"
+ art_dirty_sql
+ " END;";
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
var thisCV_changed = false;
if ( (oudeAantal != cnt)
|| (oudePrijs != cur_price)
|| ((oudeOmschr != cur_omsch) && r_a_key[i].free_art)
|| (oudeDatum.getTime() != jsDate.getTime())
|| (oudeAfhalen && jsDateAfhalen && oudeAfhalen.getTime() != jsDateAfhalen.getTime())
|| (oudeAfhalen && !jsDateAfhalen)
|| (!oudeAfhalen && jsDateAfhalen)
)
{ // Artikelregel is gewijzigd. Wijziging tracken.
var updatetrack = res.trackartikel(r_a_key[i].key,
"update",
{ old_number: oudeAantal,
new_number: cnt,
old_price: oudePrijs,
new_price: cur_price,
old_date: oudeDatum,
new_date: jsDate,
old_afhaal: oudeAfhalen,
new_afhaal: jsDateAfhalen,
old_omschr: oudeOmschr,
new_omschr: cur_omsch
});
trackarray.push(updatetrack);
thisCV_changed = true;
CV_has_changed = true;
}
flextrack = saveFlexKenmerkenArt(r_a_key[i].rsv_key,
{ nameprefix: "art" + r_a_key[i].key + "_" + r_a_key[i].rsv_key + "_",
isNew: false
}); // The array r_a_key[i] is a list of previously reserved objects.
if (flextrack.length > 0)
{
if (!thisCV_changed)
{ // Alsnog naam van artikel ophalen omdat er geen wijzigingen in het artikel zelf zijn.
var sql = "SELECT " + lcl.xsql("ra.res_artikel_omschrijving", "ra.res_artikel_key") + " art_oms"
+ " FROM res_artikel ra"
+ " WHERE ra.res_artikel_key = " + r_a_key[i].key;
var oRs = Oracle.Execute(sql);
trackarray.push(L("lcl_res_artupdate").format(oRs("art_oms").Value));
oRs.Close();
}
trackarray = trackarray.concat(flextrack);
}
reserved++;
continue;
}
}
}
// insert is based on the scanned list of currently reserved objects
var last_discipline = -1;
var curr_discipline = -1;
for (var i = 0; i < a_arIns.length; i++)
{ // Catalogus artikelen.
for (var j = 0; j < r_a_key.length; j++ ) { // r_a_key bevat records die al in de database zitten
if( r_a_key[j].rsv_key == a_arIns[i].res_rsv_deel ) {
break; // Deze was al eerder gereserveerd en hebben we als het goed is al bijgewerkt
}
}
if (j == r_a_key.length)
{ // Article was not reserved yet
var jsDate = new Date(year,month-1,day,a_arIns[i].van_h, a_arIns[i].van_m);
var jsDateAfhalen = new Date(year, month-1,day, a_arIns[i].tot_h, a_arIns[i].tot_m);
sql = "SELECT ra.res_artikel_prijs_vast"
+ " , ra.res_discipline_key"
+ " , ra.res_artikel_vrije_omschrijving"
+ " , rdp.res_disc_params_bonotify"
+ " , rdp.res_disc_params_threshold"
+ " FROM res_artikel ra"
+ " , res_disc_params rdp"
+ " WHERE ra.res_discipline_key = rdp.res_ins_discipline_key"
+ " AND ra.res_artikel_key = " + a_arIns[i].res_deel;
oRs = Oracle.Execute(sql);
var free_art = oRs("res_artikel_vrije_omschrijving").Value == 1;
var prijs_vast = oRs("res_artikel_prijs_vast").Value == 1;
var disc_key = oRs("res_discipline_key").Value;
var bonotify = oRs("res_disc_params_bonotify").Value == 1;
curr_discipline = disc_key;
oRs.Close();
if (!must_warn)
must_warn = must_warn || is_expired(disc_key, jsDate);
// Niets aan de hand, toevoegen
var fields = [ { dbs: "res_artikel_key", typ: "key", val: a_arIns[i].res_deel },
{ dbs: "res_rsv_artikel_aantal", typ: "key", val: a_arIns[i].cnt },
{ dbs: "res_rsv_ruimte_key", typ: "key", val: rsv_ruimte_key },
{ dbs: "res_rsv_artikel_levering", typ: "datetime", val: jsDate }
];
if (free_art)
{
fields.push( { dbs: "res_rsv_artikel_omschrijving", typ: "varchar", val: a_arIns[i].res_oms } );
}
if (jsDateAfhalen && jsDateAfhalen != res_tot && jsDateAfhalen > res_van)
{
fields.push( { dbs: "res_rsv_artikel_afhalen", typ: "datetime", val: jsDateAfhalen } );
}
// Backo had mogelijk flexprijs in beeld. Sla die dan op
// Prijs alleen aan te passen als geen vaste prijs (flexprijs)
if (backo && !isNaN(a_arIns[i].price) && !prijs_vast) // De prijs was in beeld en wijzigbaar
{
fields.push({ dbs: "res_rsv_artikel_prijs", typ: "float", val: parseFloat((a_arIns[i].cnt * a_arIns[i].price).toFixed(2))});
}
//else // Fronto: of geen prijs in beeld (vaste prijs artikel)
fields.push({ dbs: "res_rsv_artikel_key", typ: "key", seq: "res_s_res_rsv_artikel_key" });
var resArtIns = buildInsert("res_rsv_artikel", fields);
var rsv_artikel_key = resArtIns.sequences["res_rsv_artikel_key"];
var sql_insArt = resArtIns.sql;
var sql = "BEGIN "
+ sql_insArt + "; "
+ art_dirty_sql
+ "END;";
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
// Artikel is toegevoegd.
CV_has_changed = true;
if (bonotify && (curr_discipline != last_discipline))
{
sql = "BEGIN "
+ " RES.notifybackoffice(" + rsv_ruimte_key + ", 'RESNEW', 'C', " + a_arIns[i].res_deel + ");"
+ " END;";
last_discipline = curr_discipline;
Oracle.Execute(sql);
}
// Tracking toevoegen.
var inserttrack = res.trackartikel(a_arIns[i].res_deel, "insert");
trackarray.push(inserttrack);
var res_rsv = (a_arIns[i].res_rsv_deel ? a_arIns[i].res_rsv_deel.replace("-", "_") : 1);
flextrack = saveFlexKenmerkenArt(rsv_artikel_key,
{ nameprefix: "art" + a_arIns[i].res_deel + "_" + res_rsv + "_",
isNew: true
}); // rsv_artikel_key is a currently reserved article.
// _saveFlexKenmerken() voegt geen tracking toe aan een nieuw artikel!
trackarray = trackarray.concat(flextrack);
reserved++;
}
}
if (must_warn && urole != "bo")
{
warning = L("lcl_res_obj_lastminute");
}
// ========================================
// Is er wel iets echts overgebleven bij CV
// ========================================
sql = "SELECT 1"
+ " FROM res_rsv_deel"
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key
+ " AND res_rsv_deel_verwijder IS NULL"
+ " UNION"
+ " SELECT 2"
+ " FROM res_rsv_artikel"
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key
+ " AND res_rsv_artikel_verwijder IS NULL";
oRs = Oracle.Execute(sql);
var hasAnyCV = !oRs.Eof;
oRs.Close();
var approve = false;
if (hasAnyCV && CV_has_changed)
{ // Moet de gehele catering (opnieuw) gefiatteerd worden?
// Fiatteren moet gebeuren als voor <20><>n catalogus/discipline de totaalprijs boven de drempelwaarde uitkomt.
// Dan moet alles (opnieuw) gefiatteerd worden.
// Aanpassingen indien er (opnieuw) gefiatteerd moet worden: De velden res_rsv_artikel_approved en res_rsv_ruimte_cat_appr opnieuw zetten.
var sql_f = "SELECT ra1.res_discipline_key"
+ " , rdp.res_disc_params_threshold"
+ " , SUM(res.getartikelprijs(rra1.res_rsv_artikel_key)) sum_cat_artprijs"
+ " FROM res_rsv_artikel rra1"
+ " , res_artikel ra1"
+ " , res_v_aanwezigdiscipline rd"
+ " , res_disc_params rdp"
+ " WHERE rra1.res_artikel_key = ra1.res_artikel_key"
+ " AND rra1.res_rsv_artikel_dirtlevel = 0"
+ " AND rra1.res_rsv_ruimte_key = " + rsv_ruimte_key
+ " AND ra1.res_discipline_key = rd.ins_discipline_key"
+ " AND rd.ins_discipline_key = rdp.res_ins_discipline_key"
+ " GROUP BY ra1.res_discipline_key"
+ " , rdp.res_disc_params_threshold";
oRs_f = Oracle.Execute(sql_f);
while (!oRs_f.Eof)
{
approve = approve || oRs_f("sum_cat_artprijs").Value > oRs_f("res_disc_params_threshold").Value;
oRs_f.MoveNext();
}
oRs_f.Close();
// De res_rsv_artikel_approved velden aanpassen.
// Rsv artikel setting res_rsv_artikel_approved: De artikelregel is 0=Niet gefiatteerd, 1=Goedgekeurd, 2=Afgewezen.
sql = "UPDATE res_rsv_artikel"
+ " SET res_rsv_artikel_approved = " + (approve? 0 : 1)
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
Oracle.Execute(sql);
// Het res_rsv_ruimte_cat_appr veld aanpassen.
// Er moet worden gefiatteerd als approve true is. Er zijn dan catalogussen met een totaal bestelbedrag die boven de drempelwaarde ligt.
// Catalogus setting res_rsv_ruimte_cat_appr: Artikelregels wel of niet fiatteren {0=Nee of 1=Ja}.
sql = "UPDATE res_rsv_ruimte"
+ " SET res_rsv_ruimte_cat_appr = " + (approve? 1 : 0)
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
Oracle.Execute(sql);
}
if (restype == "R")
{
if (trackarray.length > 0)
res.trackreserveringupdate(rsv_ruimte_key, trackarray.length ? L("lcl_res_is_resupdtrack").format(res_key + "/" + res_volgnr) + "\n" + trackarray.join("\n") : null);
}
else
{ // CV
sql = "UPDATE res_rsv_ruimte"
+ " SET res_rsv_ruimte_dirtlevel = " + (hasAnyCV? 0 : res.dirtlevel.ruimte.nocatering)
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
Oracle.Execute(sql);
if (hasAnyCV || CV_has_changed)
{
if (verynew == 1 && !this_res.min_bo) // misbruik this_res.min_bo: er was niets
shared.trackaction("RESNEW", rsv_ruimte_key);
else
res.trackreserveringupdate(rsv_ruimte_key, trackarray.length ? L("lcl_res_is_resupdtrack").format(res_key + "/" + res_volgnr) + "\n" + trackarray.join("\n") : null);
}
}
doneParams = { hasAnyCV: hasAnyCV,
warning: warning,
success: true,
stillnew: verynew && restype != "R" && !hasAnyCV
};
if (approve)
{
var approver_key = res.getApprover(rsv_ruimte_key);
if (approver_key > 0)
{
doneParams.warning = res.sendNeedApprovalNotification(rsv_ruimte_key, approver_key);
var sql = "SELECT prs_perslid_naam_full FROM prs_v_perslid_fullnames_all WHERE prs_perslid_key = " + approver_key;
var oRs = Oracle.Execute(sql);
var prsname = oRs("prs_perslid_naam_full").Value;
oRs.Close();
shared.trackaction("RESFIA", rsv_ruimte_key, L("lcl_res_notification_sent_to").format("RESFIA", prsname));
}
else
{ // Geen notificatie mogelijk. Melding geven dat er geen budgethouder gevonden is en dat er niet gefiatteerd kan worden.
// Kan zijn dat er geen kostenplaats is gekozen of dat er geen budgethouder bij de kostenplaats is gekozen.
doneParams.warning = L("lcl_res_no_fiatteur");
}
}
Response.Write(JSON.stringify(doneParams));
%>
<% ASPPAGE_END(); %>