<%@ 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(); %>
