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

 File:               opdr_delivery_save.asp
 Description:
 Parameters:
     bes_key         Bestelaanvraag nummer (key)
     opmerk          Opmerking
*/
var JSON_Result = true;
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../shared/save2db.inc" -->
<!-- #include file="./bes.inc" -->

<%
protectRequest.validateToken();
var ontv, oldcnt, bokey, bikey;
var max_o_i = getFParamInt( 'max_o_i', 0 );
var opdr_key_arr = getQParamIntArray("opdr_key");
var isMulti = getQParamInt("is_multi", 0);
var pakbon = getQParam("pakbon", "");
var newremark = getFParam("notsat", "");

var result = {};
var tobedelivered = 0;
var ingesloten = [];
// Bepaal de bestel opdrachten in de selectie die
// ook echt ontvangen kunnen of mogen worden.
for (var i = 0; i < opdr_key_arr.length; i++)
{
  var this_bestelopdr = bes.func_enabled_bestelopdracht(opdr_key_arr[i]);
  if (this_bestelopdr.canDeliver)
  {
    ingesloten.push(opdr_key_arr[i]);
    tobedelivered++;
  }
}
user.auth_required_or_abort(tobedelivered > 0);

for (var index = 0; index < ingesloten.length; index++)
{
    var bes_bestelopdr = bes.bestelopdracht_info(ingesloten[index]);
    var this_bestelopdr = bes.func_enabled_bestelopdracht(ingesloten[index]);
    var opdr_key = ingesloten[index];
    var sql = "SELECT bes_bestelopdr_id "
            + "  FROM bes_bestelopdr "
            + " WHERE bes_bestelopdr_key = " + opdr_key;
    oRs = Oracle.Execute(sql);
    var ordernr_id = oRs("bes_bestelopdr_id").value;
    oRs.Close();

    sql = "SELECT DISTINCT b.bes_bestelopdr_key"
        + "     , bd.prs_bedrijf_naam"
        + "     , " + lcl.xsqla("s.bes_srtdeel_omschrijving", "s.bes_srtdeel_key")
        + "     , " + lcl.xsqla("s.bes_srtdeel_eenheid", "s.bes_srtdeel_key")
        + "     , boi.bes_bestelopdr_item_prijs"
        + "     , bi.bes_bestelling_item_aantal"
        + "     , s.bes_srtdeel_key"
        + "     , bi.bes_bestelling_item_key"
        + "     , boi.bes_bestelopdr_item_aantal"
        + "     , boi.bes_bestelopdr_item_aantalontv"
        + "     , m.mld_adres_bezoek_adres || ' ' ||"
        + "         m.mld_adres_bezoek_postcode || ' ' ||"
        + "         m.mld_adres_bezoek_plaats delivery_place"
        + "     , b.bes_bestelopdr_opmerking"
        + "     , bes.prs_perslid_key"
        + "     , boi.bes_bestelopdr_item_key"
        + "     , s.bes_srtdeel_nr"
        + "     , b.bes_bestelopdr_delivery_opmerk"
        + "     , bdp.bes_disc_params_ins_mode"
        + "     , CASE"
        + "       WHEN bes.bes_bestelling_retourvan_key IS NOT NULL"
        + "       THEN 1"
        + "       ELSE 0"
        + "       END isRetour"
        + "     , s.ins_srtdeel_key"
        + "     , bes.bes_bestelling_key"
        + "     , bes.prs_perslid_key_voor"
        + "  FROM ins_tab_discipline d"
        + "     , bes_disc_params bdp"
        + "     , bes_srtgroep g"
        + "     , bes_srtdeel s"
        + "     , prs_bedrijf bd"
        + "     , bes_bestelopdr b"
        + "     , mld_adres m"
        + "     , bes_bestelling_item bi"
        + "     , bes_bestelopdr_item boi"
        + "     , bes_bestelling bes"
        + " WHERE d.ins_discipline_key = g.ins_discipline_key"
        + "   AND d.ins_discipline_key = bdp.bes_ins_discipline_key"
        + "   AND g.bes_srtgroep_key = s.bes_srtgroep_key"
        + "   AND s.bes_srtdeel_key = bi.bes_srtdeel_key"
        + "   AND bi.bes_bestelling_key = bes.bes_bestelling_key"
        + "   AND b.bes_bestelopdr_key = boi.bes_bestelopdr_key"
        + "   AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key"
        + "   AND b.prs_bedrijf_key = bd.prs_bedrijf_key"
        + "   AND m.mld_adres_key(+)= b.mld_adres_key_lev"
        + "   AND b.bes_bestelopdr_key = " + opdr_key
        + " ORDER BY bes_srtdeel_nr";

    oRs = Oracle.Execute(sql);
    var bes_key = oRs("bes_bestelling_key").Value;
    var prs_voor = oRs("prs_perslid_key_voor").Value;
    var instockArr = [], itemeenhArr = [], amtoArr = [], cntArr = [], remArr = [], bokeyArr = [], bi_keyArr = [], artikel_dataArr = [];
    var count = 0;
    while(!oRs.eof)
    {
      var fitemoms = oRs("bes_srtdeel_omschrijving").value;
      var fitemeenh = oRs("bes_srtdeel_eenheid").value || "";
      var fitemstr = oRs("bes_srtdeel_omschrijving").value + " (" + S("currency_pref") + safe.curr(oRs("bes_bestelopdr_item_prijs").value || 0)
               + S("currency_suff") + "/" + (oRs("bes_srtdeel_eenheid").value || "") + ")";
      var fitemcnt   = oRs("bes_bestelopdr_item_aantal").value;
      var fitemcnttv = oRs("bes_bestelopdr_item_aantalontv").value || 0;
      var oikey      = oRs("bes_bestelopdr_item_key").value;
      var bi_key     = oRs("bes_bestelling_item_key").value;

      var ins_mode = oRs("bes_disc_params_ins_mode").Value; // Discipline is voor elke regel hetzelfde. Dus de mode ook.
      var isRetour = oRs("isRetour").Value == 1;
      var ins_srtdeel_key = oRs("ins_srtdeel_key").Value || -1;
      if (!isRetour && ins_mode > 0 && ins_srtdeel_key > 0)
      {
        var sql_instock = bes.getMatchObjectsSql(ins_srtdeel_key, bi_key, {getcount: true, retour: isRetour}); // isRetour is false.
        var oRsI = Oracle.Execute(sql_instock);
        instockArr[count] = oRsI("aantal").Value;
        oRsI.Close();
      }

      // Zoek de gegevens van het artikel uit alle artikelgegevens van de bestelopdracht.
      var artikel_data = {};
      for (var i=0; i<bes_bestelopdr.artikel_arr.length; i++)
      {
        if (bes_bestelopdr.artikel_arr[i].bes_item_key == bi_key)
        {
          artikel_data = bes_bestelopdr.artikel_arr[i];
        }
      }
      artikel_dataArr[count] = artikel_data;
      itemeenhArr[count] = fitemeenh;
      amtoArr[count] = fitemcnttv;
      remArr[count] = fitemcnt-fitemcnttv;
      cntArr[count] = remArr[count];
      bokeyArr[count] = oikey;
      bi_keyArr[count] = bi_key;
      max_o_i = count + 1;

      oRs.MoveNext();
      count++;
    }
    oRs.Close();

    var trackarray = [];
    var besopdr_id = "";
    var bes_bestellevr_key = -1; // TODO: bes_bestellevr record aanmaken met pakbon en newremark
    for (i = 0; i < max_o_i; i++)
    {
      ontv = isMulti ? cntArr[i] : getFParamFloat("cnt" + i, 0);
      oldcnt = isMulti ? amtoArr[i] : getFParamInt("amto" + i);
      bokey = isMulti ? bokeyArr[i] : getFParamInt("bokey" + i);
      bikey = isMulti ? bi_keyArr[i] : getFParamInt("bi_key" + i);

      if ( !isNaN(ontv) && ontv != 0 && !isNaN(oldcnt))
      {
        if (!(bes_bestellevr_key > 0))
        {
            var fields =  [ { dbs: "bes_bestellevr_key",    typ: "key",     seq: "bes_s_bes_bestellevr_key" },
                            { dbs: "prs_perslid_key",       typ: "key",     val: user_key },
                            { dbs: "bes_bestellevr_opmerk", typ: "varchar", val: newremark, len: 320 },
                            { dbs: "bes_bestellevr_pakbon", typ: "varchar", frm: "pakbon", len: 50 }
                          ];
            var levrIns = buildInsert("bes_bestellevr", fields);
            Oracle.Execute(levrIns.sql);
            bes_bestellevr_key = levrIns.sequences["bes_bestellevr_key"];
        }
        sql = "INSERT INTO bes_bestellevr_item"
            + "      (     bes_bestellevr_key"
            + "      ,     bes_bestelopdr_item_key"
            + "      ,     bes_bestellevr_item_aantal"
            + "      )"
            + "      VALUES "
            + "      (" + bes_bestellevr_key
            + "      , " + bokey
            + "      , " + ontv
            + "      )";
        Oracle.Execute(sql);

        // lekje: er is hier nog geen controle dat de bes_bestelopdr_item ook daadwerkelijk
        //        bij opdracht opdr_key hoort.
        sql = "UPDATE bes_bestelopdr_item B"
            + "   SET bes_bestelopdr_item_aantalontv = "
            + "           COALESCE(bes_bestelopdr_item_aantalontv, 0) + " + ontv
            + "     , bes_bestelopdr_item_ontvangen = SYSDATE"
            + " WHERE bes_bestelopdr_item_key = " + bokey;
        Oracle.Execute(sql);

        // bes_bestelling_item_aantalontv is vrij deprecated
        sql = "UPDATE bes_bestelling_item"
            + "   SET bes_bestelling_item_aantalontv = "
            + "           COALESCE(bes_bestelling_item_aantalontv, 0) + " + ontv
            + " WHERE bes_bestelling_item_key = " + bikey;
        Oracle.Execute(sql);

        // Tracking
        sql = "SELECT boi.bes_bestelopdr_item_omschrijv"
            + "     , bo.bes_bestelopdr_id"
            + "  FROM bes_bestelopdr_item boi"
            + "     , bes_bestelopdr bo"
            + " WHERE boi.bes_bestelopdr_key = bo.bes_bestelopdr_key"
            + "   AND bes_bestelopdr_item_key = " + bokey;
        oRs = Oracle.Execute(sql);
        var item_oms = oRs("bes_bestelopdr_item_omschrijv").Value;
        var besopdr_id = oRs("bes_bestelopdr_id").Value;
        oRs.Close();

        trackarray.push(L("lcl_bes_delivery") + ": " + ontv + " " + item_oms);

        // Aanmaken (Create), koppelen (Attach) of loskoppelen (Disconnect) van objecten aan of van de bestelopdracht (per bestelopdrachtregel).
        bes.createattachdisconnectObjects(opdr_key, bokey, ontv);
      }
    }
    // Laat de gevolgen bepalen..
    bes.updatebestelopdrstatus(opdr_key);
    bes.updatebestellingstatus(bes_key);

    if (newremark != "")
    {
      var fields = [{dbs: "bes_bestelopdr_delivery_opmerk", typ: "varchar", val: newremark, len: 320 }];
      sql = buildUpdate("bes_bestelopdr", fields) + " bes_bestelopdr_key = " + opdr_key;
      Oracle.Execute(sql);
    }

    // Update nog tracken
    shared.trackaction("BES2UP",
                       opdr_key,
                       L("lcl_bes_is_bes2uptrack").format(S("bes_bestelopdr_prefix") + besopdr_id) + "\n" + trackarray.join("\n"));

    // BESOT2 Notificaties sturen naar de prs_perslid_voor.
    // This notification is now sent on behalf of the system, what might be the local FM organisation
    var sql = "SELECT l.alg_locatie_email"  // null as a string
            + " FROM mld_adres ma, alg_locatie l, bes_bestelling b"
            + " WHERE b.mld_adres_key_lev = ma.mld_adres_key"
            + " AND ma.alg_locatie_key = l.alg_locatie_key"
            + " AND b.bes_bestelling_key = " + bes_key;
    var oRs = Oracle.Execute(sql);
    if (!oRs.eof)
      var lsender = oRs(0).Value;
    else
      var lsender = null;
    oRs.Close();

    Oracle.Execute("BEGIN fac.putnotificationsrtprio(NULL, " + prs_voor + ", 'BESOT2', " + bes_key + ", NULL, NULL, NULL, NULL, NULL, 2, " + (lsender ? safe.quoted_sql(lsender) : "NULL") + "); END;");

    // Zijn er bijbehorende facturen die al zijn ingevoerd met de status "Ingevoerd(2)" die nog geapproved moeten worden?
    bes.autoapprovefactuur(opdr_key);

}

result = { close: true, success: true };

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