<%@ language = "JavaScript" %>
<% /*
     $Revision$
     $Id$

    File:               res_delete_save.asp
    Description:        Het echte verwijderen van een (deel)reservering
    Parameters:
        rsv_ruimte_key
    Context:            Vanuit res_delete popup of pda/reservering.asp
    Note:
*/
var JSON_Result = true;
 %>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="res.inc" -->
<%
protectRequest.validateToken();

var rsv_ruimte_key_arr = getQParamIntArray("rsv_ruimte_key");
var doCharge = getQParamIntArray("doCharge", [1]);
var amount = rsv_ruimte_key_arr.length;
var isMulti = amount > 1;
var this_res = new Array(amount);
var rrr = new Array(amount);
var canDeleteAny = false;

for(var i = 0; i < amount; i++)
{
    res.res_set_dialect(rsv_ruimte_key_arr[i]);
    this_res[i] = res.func_enabled(rsv_ruimte_key_arr[i]); // Wat heb ik zoal aan rechten op deze specifieke reservering
    canDeleteAny |= this_res[i].canDelete;

    // Altijd handig
    var sql = "SELECT res_reservering_key"
            + "     , rrr.res_rsv_ruimte_van"
            + "     , rr.res_ruimte_extern_id"
            + "  FROM res_rsv_ruimte rrr"
            + "     , res_ruimte_opstelling rro"
            + "     , res_ruimte rr"
            + " WHERE rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)"
            + "   AND rro.res_ruimte_key = rr.res_ruimte_key(+)"
            + "   AND rrr.res_rsv_ruimte_key = " + rsv_ruimte_key_arr[i];

    oRs = Oracle.Execute(sql);

    rrr[i] = { rsv_ruimte_key       : rsv_ruimte_key_arr[i],
               reservering_key      : oRs("res_reservering_key").Value,
               rsv_ruimte_van       : new Date(oRs("res_rsv_ruimte_van").Value),
               res_ruimte_extern_id : oRs("res_ruimte_extern_id").Value
             }

    oRs.Close();

}

user.auth_required_or_abort(canDeleteAny);

var cost_recharge = getFParam("cost_recharge", "off") == "on";
var deletefull = getFParamInt("deletefull", 0) == 1;
var deletefuture = getFParamInt("deletefuture", 0) == 1;
var perc_recharge = getFParamFloat("perc_recharge", 100);

var del_key_arr = [];

for(var i = 0; i < amount; i++)
{
    // Alle niet-admin ruimtes die geen admin- voorzieningen hebben
    var to_do_rsv_ruimte_key = "    res_rsv_ruimte_key IN ("
                           + " SELECT rs.res_rsv_ruimte_key"
                           + "   FROM res_v_aanwezigrsv_ruimte rs"
                           + "  WHERE rs.res_reservering_key = " + this_res[i].res_reservering_key
                           + "    AND (rs.res_status_bo_key != 6 OR rs.res_status_bo_key IS NULL)" // NULL bij CV
                           + " MINUS"
                           + "     (SELECT rd.res_rsv_ruimte_key"
                           + "       FROM res_v_aanwezigrsv_deel rd"
                           + "          , res_v_aanwezigrsv_ruimte rr"
                           + "      WHERE rd.res_rsv_ruimte_key = rr.res_rsv_ruimte_key"
                           + "        AND rr.res_reservering_key = " + this_res[i].res_reservering_key
                           + "        AND rd.res_status_bo_key = 6"
                           + "     UNION"
                           + "     SELECT ra.res_rsv_ruimte_key"
                           + "       FROM res_v_aanwezigrsv_artikel ra"
                           + "          , res_v_aanwezigrsv_ruimte rr"
                           + "      WHERE ra.res_rsv_ruimte_key = rr.res_rsv_ruimte_key"
                           + "        AND rr.res_reservering_key = " + this_res[i].res_reservering_key
                           + "        AND ra.res_status_bo_key = 6))";
    if (deletefuture)
      to_do_rsv_ruimte_key += " AND res_rsv_ruimte_van >= "+rrr[i].rsv_ruimte_van.toSQL();
    else
      if (!deletefull)
        to_do_rsv_ruimte_key += " AND res_rsv_ruimte_key = " + rsv_ruimte_key_arr[i];

    // vind de te verwijderen rsv_ruimte_keys
    sql = "SELECT res_rsv_ruimte_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;

    oRs2 = Oracle.Execute(sql);
    while (!oRs2.eof)
    {
      var one_rsv_ruimte_key = oRs2("res_rsv_ruimte_key").Value;
      var this_res2 = res.func_enabled(one_rsv_ruimte_key); // Wat mag ik op deze deelreservering
      if (!this_res2.canDelete)
      {
        oRs2.MoveNext()
        continue; // Niet al te veel zeuren
      }

      if (oRs2("res_ruimte_extern_id").Value) {
        del_key_arr.push(one_rsv_ruimte_key);
      }

      DeleteResAfspraak(one_rsv_ruimte_key);
      // update ruimte
      // objects en articles are deleted automatically if the RES_RSV_RUIMTE is deleted
      // Deze velden altijd opslaan
      var fields =  [ { dbs: "res_rsv_ruimte_opmerking",    typ: "varchar",  frm: "opmerk" },
                      { dbs: "res_status_fo_key",           typ: "key",      val: (cost_recharge? 4 : 1) }, // status 1=optie, 4=vervallen
                      { dbs: "res_rsv_ruimte_verwijder",    typ: "sql",      val: "SYSDATE" }
                    ];

      if ((!isMulti && cost_recharge) || (isMulti && doCharge[i] == 1))
      {
        if (!deletefull && !deletefuture && hasFParam("recharge"))
        {
          fields.push( {dbs: "res_rsv_ruimte_totaal", typ: "float", frm: "recharge"} );
        }
        else
        {
          var sql = "SELECT res.getruimteprijs (" + one_rsv_ruimte_key + ", 1) org_ruimteprijs"
                  + "  FROM DUAL";
          var oRs = Oracle.Execute(sql);
          var ruimteprijs = oRs("org_ruimteprijs").Value * (perc_recharge / 100);
          oRs.Close();
          fields.push( {dbs: "res_rsv_ruimte_totaal", typ: "float", val: ruimteprijs} );
        }
      }

      sql = buildUpdate("res_rsv_ruimte", fields)
          + "     res_rsv_ruimte_key = " + one_rsv_ruimte_key;

      // ons eigen tijdstip/zaal is mogelijk gewijzigd waardoor andere *dirty* reserveringen
      // clean wordt. Even onze oude datum onthouden zodat we niet *alles* hoeven te controleren
      oRs = Oracle.Execute("select res_rsv_ruimte_van,"
                         + "       res_rsv_ruimte_tot"
                         + "  from res_rsv_ruimte"
                         + " where res_rsv_ruimte_key = " + one_rsv_ruimte_key);
      var oldvan = new Date(oRs("res_rsv_ruimte_van").value);
      var oldtot = new Date(oRs("res_rsv_ruimte_tot").value);
      oRs.Close();

      // Nu de echte update.
      // Daarbij ook diverse controles/ updates uitvoeren op 'andere zaken'
      sql = "BEGIN "
          + sql + ";"
          // 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
          + "END;";
      Oracle.Execute( sql );

      shared.trackaction("RESDEL", one_rsv_ruimte_key);

      // Klantspecifieke check functie (hookfunction) voor de delete
      var pResult = new HookResult();
      if (!custfunc.res_postdelete(one_rsv_ruimte_key, pResult))
      {
        abort_with_warning(pResult.errmsg);
      }

      oRs2.MoveNext();
    }
    oRs2.Close();

    // En tenslotte eventueel de reservering zelf nog
    sql = "UPDATE res_reservering "
        + "   SET res_reservering_verwijder=SYSDATE"
        + " WHERE res_reservering_key="+this_res[i].res_reservering_key
        + "   AND NOT EXISTS (SELECT *"
        + "                     FROM res_v_aanwezigrsv_ruimte"
        + "                    WHERE res_reservering_key=" + this_res[i].res_reservering_key + ")"

    Oracle.Execute( sql );
}

/* Verwijder ook een evt. Exchange event (via MS Graph) */
if (del_key_arr.length && (S("msgraph_sync_level") & 6)) { // Er is een Write Exchange-koppeling voor deze ruimtes
    Server.ScriptTimeout = 1200; // 20m, dit kan (potentieel) even duren
    var DEZE = this;
    var hook = hookfunc.gethook("utils/exchange/res_to_graph.wsc");
    hook.initialize({
      DEZE: DEZE,
      custabspath: Server.MapPath(custpath)
    });
    hook.batchToGraph("D", { "res_rsv_ruimte_key_arr": del_key_arr });
    hook = null;
}

message = ""; /* message: "Deelreservering is verwijderd" */

var result = { message: message, success: true, refresh: true };
Response.Write(JSON.stringify(result));
%><% ASPPAGE_END(); %>
