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

     File:          res_close.asp
     Description:   Afmelden reserveringen.
     Parameters:    partres_key
                    part_type
                    group           // Dan is partres_key een res_rsv_ruimte_key en moet de hele deelreservering

     Note:          We ondersteunen vier varianten
                    part_type group
                    "V"       0     partres_key zal een enkele res_rsv_deel_key zijn die we gaan afmelden
                    "C"       0     partres_key zal een enkele res_rsv_artikel_key zijn die we gaan afmelden
                    "R"       0     partres_key zal een enkele res_rsv_ruimte_key zijn: alleen de ruimte wordt afgemeld.
                    "R"/"CV"  1     partres_key zal een enkele res_rsv_ruimte_key zijn: de hele deelreservering wordt afgemeld
                                        (althans: alle delen waar we rechten op hebben).
                    We leveren al success: true op als *iets* afgemeld mocht worden
*/ %>

<%
var JSON_Result = true;
%>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="./res.inc" -->

<%
protectRequest.validateToken();
var autfunction = "WEB_RESBOF";
// De functie checkAutorisation(autfunction) geeft een Response.End indien er geen autorisatie voor autfunction wordt gevonden
var authparams = user.checkAutorisation(autfunction);

var partres_key_arr = getFParamIntArray("partres_key"); // rsv_ruimte_key, rsv_deel_key of rsv_artikel_key
var part_type_arr   = getFParamArray("part_type"); // reserveringstype ('C', 'V', 'R' of 'CV')
var group           = getFParamInt("group", -1);

// Close één ruimte
function close_ruimte(rsv_ruimte_key)
{ // Get res_rsv_ruimte_prijs
  var sql = "SELECT res.getruimteprijs(" + rsv_ruimte_key + ") ruimteprijs FROM DUAL";
  var oRs = Oracle.Execute(sql);
  var price = oRs("ruimteprijs").Value;
  oRs.Close();

  // Change the status of the room
  // And set res_rsv_ruimte_prijs
  sql = "UPDATE res_rsv_ruimte"
      + "   SET res_status_bo_key = 5,"
      + "       res_rsv_ruimte_prijs = " + price
      + " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key
      + "   AND res_status_bo_key <> 6";
  Oracle.Execute(sql);
  shared.trackaction("RESAFM", rsv_ruimte_key);
}

// Close één artikel
function close_artikel(rsv_ruimte_key, rsv_artikel_key)
{ // Moet de prijs worden geupdate?
  var sql = "SELECT a.res_artikel_prijs_vast"
          + "     , ra.res_rsv_artikel_prijs"
          + "     , a.res_artikel_key"
          + "  FROM res_rsv_artikel ra,"
          + "       res_artikel a"
          + " WHERE ra.res_artikel_key = a.res_artikel_key"
          + "   AND ra.res_rsv_artikel_key = " + rsv_artikel_key;
  var oRs = Oracle.Execute(sql);
  var must_update = (oRs("res_artikel_prijs_vast").Value == 1 || oRs("res_rsv_artikel_prijs").Value == null);
  var res_artikel_key = oRs("res_artikel_key").Value;
  oRs.Close();

  sql = " SELECT res.getartikelprijs(" + rsv_artikel_key + ") artikelprijs FROM DUAL";
  oRs = Oracle.Execute(sql);
  var price = oRs("artikelprijs").Value;
  oRs.Close();

  // Change the status of the object
  sql = "UPDATE res_rsv_artikel"
      + " SET res_status_bo_key = 5"
        + (must_update ? ", res_rsv_artikel_prijs = " + price : "")
        + ", res_rsv_artikel_inkoopprijs = (SELECT res_artikel_inkoopprijs FROM res_artikel WHERE res_artikel_key = " + res_artikel_key + ")"
        + ", res_rsv_artikel_btw = (SELECT res_artikel_btw FROM res_artikel WHERE res_artikel_key = " + res_artikel_key + ")"
      + " WHERE res_rsv_artikel_key =" + rsv_artikel_key
      + "   AND res_status_bo_key <> 6";
  Oracle.Execute(sql);
  shared.trackaction("RESAFM", rsv_ruimte_key, L("lcl_res_track_c_is_resupd_afm"));
}

// Close één deel
function close_deel(rsv_ruimte_key, rsv_deel_key)
{ // get res_rsv_deel_prijs
  var sql = " SELECT res.getdeelprijs(" + rsv_deel_key + ") deelprijs FROM DUAL";
  var oRs = Oracle.Execute(sql);
  var price = oRs("deelprijs").Value;
  oRs.Close();

  // Change the status of the object
  sql = "UPDATE res_rsv_deel"
      + " SET res_status_bo_key = 5"
      + ",    res_rsv_deel_prijs = " + price
      + " WHERE res_rsv_deel_key =" + rsv_deel_key
      + "   AND res_status_bo_key <> 6";
  Oracle.Execute(sql);
  shared.trackaction("RESAFM", rsv_ruimte_key, L("lcl_res_track_v_is_resupd_afm"));
}

// Bepaal eerst de reserveringen in de selectie die
// ook echt afgemeld kunnen of mogen worden.
var tobeclosed = 0;
var ingesloten = [];
var negatieftotaal = false;
for (var i = 0; i < partres_key_arr.length; i++)
{
  var partreskey = partres_key_arr[i];
  var parttype = part_type_arr[i];
  var sql;
  if (group == 1)
  {   // parttype zal altijd "R" of "CV" zijn
      var rsv_ruimte_key = partreskey;
      var this_res = res.func_enabled(rsv_ruimte_key);
  }
  else
  {   // Geen groepering, uitsluitend enkele ruimte, catering of voorziening regel
      // Bepaal rsv_ruimte_key
      if (parttype == "R")
      {
        sql = "SELECT rrr.res_rsv_ruimte_key"
            + "     , rrr.res_status_bo_key"
            + "     , rr.res_discipline_key"
            + "  FROM res_v_aanwezigrsv_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 = " + partreskey
            + "   AND rrr.res_status_bo_key < " + S("res_bo_status_key")
            + " GROUP BY rrr.res_rsv_ruimte_key"
            + "        , rrr.res_status_bo_key"
            + "        , res_discipline_key";
      }
      if (parttype == "V")
      {
        sql = "SELECT rr.res_rsv_ruimte_key"
            + "     , rd.res_status_bo_key"
            + "     , d.res_discipline_key"
            + " FROM res_v_aanwezigrsv_ruimte rr"
            + "    , res_v_aanwezigrsv_deel rd"
            + "    , res_deel d"
            + " WHERE rr.res_rsv_ruimte_key = rd.res_rsv_ruimte_key"
            + "   AND rd.res_deel_key = d.res_deel_key"
            + "   AND rd.res_status_bo_key < " + S("res_bo_status_key")
            + "   AND rd.res_rsv_deel_key = " + partreskey;
      }
      if (parttype == "C")
      {
        var sql = "SELECT rr.res_rsv_ruimte_key"
                + "     , ra.res_status_bo_key"
                + "     , a.res_discipline_key"
                + " FROM res_v_aanwezigrsv_ruimte rr"
                + "    , res_v_aanwezigrsv_artikel ra"
                + "    , res_artikel a"
                + " WHERE rr.res_rsv_ruimte_key = ra.res_rsv_ruimte_key"
                + "   AND ra.res_artikel_key = a.res_artikel_key"
                + "   AND ra.res_status_bo_key < " + S("res_bo_status_key")
                + "   AND ra.res_rsv_artikel_key = " + partreskey;
      }
      //
      var oRs = Oracle.Execute(sql);
      if (oRs.Eof)
      {
        oRs.Close();
        continue; // waarschijnlijk net in een ander tabje verwijderd. Niet al te moeilijk over doen.
      }

      var rsv_ruimte_key = oRs("res_rsv_ruimte_key").Value;
      var status_bo = oRs("res_status_bo_key").Value;
      var res_discipline_key = oRs("res_discipline_key").Value;
      oRs.Close();
      var this_res = res.func_enabled(rsv_ruimte_key, res_discipline_key);
  }
  res.res_set_dialect(rsv_ruimte_key);

  sql = "SELECT res.getdeelresprijs(" + rsv_ruimte_key + ") prijs FROM DUAL"
  oRs = Oracle.Execute(sql)
  var deelres_prijs = oRs("prijs").Value;
  var negatieftotaal = deelres_prijs < 0;
  if (!negatieftotaal && this_res.canClose)
  {
    ingesloten.push({rsv_ruimte_key: rsv_ruimte_key, partkey: partreskey, parttype: parttype});
    tobeclosed++;
  }
  oRs.Close();
}

if (partres_key_arr.length == 1 && negatieftotaal)
  shared.simpel_page(L("lcl_res_costs_negative"));

user.anything_todo_or_abort(tobeclosed > 0); // We klagen niet over enkele wel en enkele niet

// Nu echt de reserveringen afmelden die ook afgemeld kunnen of mogen worden
for (var i = 0; i < ingesloten.length; i++)
{ // Set status on "verwerkt"
  var parttype = ingesloten[i].parttype;
  // ----- Roomreservations : parttype == 'R', partreskey == res_rsv_ruimte_key -----
  if (parttype == 'R' || parttype == 'CV')
  { // eerst de ruimte eventueel zelf. (bij CV hoeft de ruimte zelf niet)
    close_ruimte(ingesloten[i].rsv_ruimte_key);

    // Bij groupering doen we ook de C en V waar we rechten op hebben.
    if (group == 1)
    {
      sql_objects = "SELECT rd.res_rsv_deel_key"
                  + "  FROM res_rsv_deel rd"
                  + " WHERE res_status_bo_key <> 5"
                  + "   AND rd.res_rsv_ruimte_key = " + ingesloten[i].rsv_ruimte_key;
      oRs = Oracle.Execute(sql_objects);
      while (!oRs.eof)
      {
        close_deel(ingesloten[i].rsv_ruimte_key, oRs("res_rsv_deel_key").Value);
        oRs.MoveNext();
      }
      oRs.Close();

      // First find all the consumable articles for this reservationpart not already closed.
      sql_cons_art = "SELECT ra.res_rsv_artikel_key"
                   + "  FROM res_rsv_artikel ra"
                   + " WHERE res_status_bo_key <> 5"
                   + "   AND ra.res_rsv_ruimte_key = " + ingesloten[i].rsv_ruimte_key;
      oRs = Oracle.Execute(sql_cons_art);
      while (!oRs.eof)
      {
        close_artikel(ingesloten[i].rsv_ruimte_key, oRs("res_rsv_artikel_key").Value);
        oRs.MoveNext();
      }
      oRs.Close();
    }
  }
  else if (parttype == 'V') // ----- Objectreservations: parttype == 'V' -----
  {
    close_deel(ingesloten[i].rsv_ruimte_key, ingesloten[i].partkey);
  }
  // ----- Consumable article reservations : parttype == 'C' -----
  else if (parttype == 'C')
  {
    close_artikel(ingesloten[i].rsv_ruimte_key, ingesloten[i].partkey);
  }
}

  var result = { success: true, message: "" };

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