<%@ LANGUAGE = JavaScript %>
<% /*
     $Revision$
     $Id$

     File:        bes_delete.asp
*/ %>

<%
var JSON_Result = true;
%>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="./bes.inc" -->

<%
protectRequest.validateToken();
/***** Get webform parameters *****/
var urole = getFParam("urole");

var bes_key_arr = getFParamIntArray("bes_key");
var message = "";
var success = false;
var change = false;
/***** End get webform parameters *****/

var result = {};
var tobedeleted = 0;
var ingesloten = [];
// Bepaal de bestellingen in de selectie die
// ook echt geaccepteerd kunnen of mogen worden.
for (var i = 0; i < bes_key_arr.length; i++)
{
  var bes_bestelling = bes.bestelling_info(bes_key_arr[i]); // Globale variabele met alle bes_bestelling informatie
  var bes_disc_info = bes.disc_info(bes_bestelling.dis_key); // alle discipline informatie
  var this_bes = bes.func_enabled_bestelling(bes_bestelling);
  if (this_bes.canDelete)
  {
    ingesloten.push({ bes_key: bes_key_arr[i],
                      oldStatus: bes_bestelling.rfoStatus,
                      opdrStatus: bes_bestelling.rfoBestelOpdrStatus,
                      parent_key: bes_bestelling.parent_key,
                      disc_params_auto_order: bes_disc_info.disc_params_auto_order
                    });
    tobedeleted++;
  }
}
user.anything_todo_or_abort(tobedeleted > 0); // We klagen niet over enkele wel en enkele niet


for (var i = 0; i < ingesloten.length; i++)
{
  bestelopdr_key = -1;
  // Bepaal de status van de bestelopdracht (indien aanwezig)
  sql = "SELECT DISTINCT boi.bes_bestelopdr_key"
      + " FROM bes_bestelling_item bi"
      + ", bes_bestelopdr_item boi"
      + ", bes_bestelopdr bo"
      + " WHERE boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key"
      + " AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key"
      + " AND bes_bestelling_key = " + ingesloten[i].bes_key;
  oRs = Oracle.Execute(sql);

  if (!oRs.eof)
  { // Er is een bestelopdracht aanwezig
    bestelopdr_key = oRs("bes_bestelopdr_key").value;
  }

  // Gaat het hier om een change bestelling (embargo)
  var isChange = ingesloten[i].parent_key && ingesloten[i].parent_key > 0;

  if (isChange)
  { // Een change bestelling kan alleen gewijzigd (er wordt geen nieuwe change aangemaakt) worden indien deze status 2(=Nieuw) heeft.
    // Deze controle zit al in canDelete
    // Verwijder change bestelaanvraag. Hierdoor vindt een rollback plaats van de orginele bestelaanvraag
    message = bes.verwijderBestelling(ingesloten[i].bes_key, bestelopdr_key);
  }
  else
  { // Of de bestelaanvraag geannuleerd of verwijderd dient de worden is afhankelijk van de status;
    // 1(=Afgewezen)   : Bestelaanvraag wordt verwijderen
    // 2(=Nieuw)       : Bestelaanvraag wordt verwijderen
    // 3(=Gefiatteerd) : Bestelaanvraag wordt verwijderen
    // 4(=Geaccepteerd): Bestelaanvraag wordt verwijderen
    // 5(=Besteld)     : Insert een nieuwe (change) bestelaanvraag met status Geannuleerd(=9)
    // Voor de rest van de statussen is canDelete

    if (ingesloten[i].oldStatus < 5)
    { // Verwijder bestelaanvraag. canDelete is al gecontroleerd
      message = bes.verwijderBestelling(ingesloten[i].bes_key, bestelopdr_key);
      success = true;
    }
    else
    {
      // Insert een nieuwe (change) bestelaanvraag met de aantal op 0 stuks gezet.
      // Omdat de aantallen op nul zal komen te staan en daarmee het totaalbedrag ook, hoeft er niet gefiateerd te worden.
      // De change bestelaanvraag zal direct de status Geaccepteerd (4) of Besteld (5) krijgen. (Ongeacht vinkje: Mutaties opnieuw fiatteren [Nooit, Als nieuwe, Volgens onderstaande criterium])
      // Acties die dan uitgevoerd dienen te worden zijn:
      // 1) Originele bestelaanvraag kopieren naar de change bestelaanvraag met status 2
      // 2) Kopieren betelling kenmerken
      // 3) Kopieren regels met aantallen nul en bestelitem kenmerken
      // 4) bes.setbestellingstatus(ingesloten[i].bes_key, 4); // Geaccepteerd
      // 5) Direct opdracht aanmaken/wijzigen indien: bes_disc_info.disc_params_auto_order == "1" (Uitvoeren a) of b)
      //    a) bes.changeOrders(user_key, ingesloten[i].bes_key) indien afgewezen opdracht of
      //    b) bes.makeOrders(user_key, ingesloten[i].bes_key) voor alle andere gevallen.

      // 1) Originele bestelaanvraag kopieren naar de change bestelaanvraag met status 2
      var sql = "SELECT bes_s_bes_bestelling_key.nextval seq_key FROM DUAL";
      var oRs = Oracle.Execute(sql);
      var change_key = oRs("seq_key").value;

      shared.trackaction("BESUPD", ingesloten[i].bes_key, L("lcl_bes_annuleer_request").format(S("bes_bestelling_prefix") + change_key) );

      sql = " INSERT INTO bes_bestelling (prs_perslid_key"
          + "                           , prs_perslid_key_voor"
          + "                           , prs_kostenplaats_key"
          + "                           , bes_bestelling_ordernr"
          + "                           , bes_bestelling_kosten_klant"
          + "                           , mld_adres_key_lev"
          + "                           , bes_bestelling_leverdatum"
          + "                           , bes_bestelling_plaats"
          + "                           , bes_bestelling_module"
          + "                           , bes_bestelling_levkosten"
          + "                           , bes_bestelling_korting"
          + "                           , bes_bestelling_parentkey"
          + "                           , bes_bestelling_key"
          + "                           , fac_activiteit_key)"
          + "                      SELECT prs_perslid_key"
          + "                           , prs_perslid_key_voor"
          + "                           , prs_kostenplaats_key"
          + "                           , bes_bestelling_ordernr"
          + "                           , bes_bestelling_kosten_klant"
          + "                           , mld_adres_key_lev"
          + "                           , TRUNC (SYSDATE)" // bes_bestelling_leverdatum op vandaag zetten
          + "                           , bes_bestelling_plaats"
          + "                           , bes_bestelling_module"
          + "                           , bes_bestelling_levkosten"
          + "                           , bes_bestelling_korting"
          + "                           , " + ingesloten[i].bes_key
          + "                           , " + change_key
          + "                           , fac_activiteit_key"
          + "                        FROM bes_bestelling"
          + "                       WHERE bes_bestelling_key = " + ingesloten[i].bes_key;
      Oracle.Execute(sql);

      // 2) Kopieren betelling kenmerken
      sql = "INSERT INTO bes_kenmerkbestell (bes_bestelling_key"
          + "                              , bes_kenmerk_key"
          + "                              , bes_kenmerkbestell_waarde)"
          + "                         SELECT " + change_key
          + "                              , bes_kenmerk_key"
          + "                              , bes_kenmerkbestell_waarde"
          + "                           FROM bes_kenmerkbestell"
          + "                          WHERE bes_bestelling_key = " + ingesloten[i].bes_key;
      Oracle.Execute(sql);

      // 3) Kopieren regels met aantallen op nul gezet en bestelitem kenmerken
      sql = "SELECT bes_bestelling_item_key"
          + "  FROM bes_bestelling_item"
          + " WHERE bes_bestelling_key = " + ingesloten[i].bes_key;
      var oRs = Oracle.Execute(sql);

      while (!oRs.eof)
      {
        var sql = "SELECT bes_s_bes_bestelling_item_key.nextval seq_key FROM DUAL";
        var oRs1 = Oracle.Execute(sql);
        var item_change_key = oRs1("seq_key").value;

        sql = "INSERT INTO bes_bestelling_item (bes_bestelling_item_key"
            + "                               , bes_bestelling_key"
            + "                               , bes_srtdeel_key"
            + "                               , bes_bestelling_item_aantal"
            + "                               , bes_bestelling_item_brutoprijs"
            + "                               , bes_bestelling_item_prijs)"
            + "                          SELECT " + item_change_key
            + "                               , " + change_key
            + "                               , bes_srtdeel_key"
            + "                               , 0" // Aantallen op nul zetten
            + "                               , bes_bestelling_item_brutoprijs"
            + "                               , bes_bestelling_item_prijs"
            + "                            FROM bes_bestelling_item"
            + "                           WHERE bes_bestelling_item_key = " + oRs("bes_bestelling_item_key").value;
        Oracle.Execute(sql);

        sql = "INSERT INTO bes_kenmerkbesteli (bes_bestelling_item_key"
            + "                              , bes_kenmerk_key"
            + "                              , bes_kenmerkbesteli_waarde)"
            + "                         SELECT " + item_change_key
            + "                              , bes_kenmerk_key"
            + "                              , bes_kenmerkbesteli_waarde"
            + "                           FROM bes_kenmerkbesteli"
            + "                          WHERE bes_bestelling_item_key = " + oRs("bes_bestelling_item_key").value;
        Oracle.Execute(sql);

        oRs.MoveNext();
      }

      // 4) Status geaccepteerd zetten
      bes.setbestellingstatus(change_key, 4); // Geaccepteerd

      // 5) Direct opdracht aanmaken/wijzigen indien: bes_disc_info.disc_params_auto_order == "1" (Uitvoeren a) of b)
      //    a) bes.changeOrders(user_key, ingesloten[i].bes_key) indien afgewezen opdracht of
      //    b) bes.makeOrders(user_key, ingesloten[i].bes_key) voor alle andere gevallen.
      if (ingesloten[i].disc_params_auto_order == "1") // direct opdracht aanmaken
      {
        if (ingesloten[i].oldStatus == 5 && ingesloten[i].opdrStatus == 1) // afgewezen opdrachten vervangen we gewoon
          bes.changeOrders(user_key, change_key);
        else
          bes.makeOrders(user_key, change_key);
      }
      success = true;
      change = true;
    }
  }
}

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