<%@ 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/json2.js" -->
<!--#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,"
    + "       rr.res_discipline_key"
    + "  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;
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)
{
    // 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 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)
    {
        check_fail_sql = " if res.dirty_level_all(" + rsv_ruimte_key + ") <> 0 then"
                       + "    raise_application_error (-20000, 'res_m999 "+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") & 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") & res.dirtlevel.deel.notavailable)
          {
            message = L("lcl_res_dirtyobject");
            addClass += " res_fatal";
          }
        }
        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
                 };
    }

}
Response.Write(JSON.stringify(result));
%>
