<% /*
     $Revision$
     $Id$
     File:               bes_current_list.inc
     Description:        Show an overview of articles as a current in stock list-form,
                         which meets with the given requirements
     Parameters:
         urole           user role (fe, fo, bo, mi)
         outputmode      behave in an output mode, print to 0 = screen, 1 = printer, 2 = excel, etc.
         showall         show all orders which meets with the given requirements
     Context:            Search action from bes_voorraad_search.asp form
     Note:
*/ %>

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

<%
FCLTHeader.Requires({ plugins:["jQuery"],
                      js: ["./sel_items_tab.js", "jquery-ui.js"]
                    });

function bes_current_list (pautfunction, params)
{
  // Valid and supported parameters are:
  // params.urole         : the usuals two-letter lowercase string
  // params.outputmode    : print to 0 = screen, 1 = printer, 2 = excel, etc.
  // params.showall       : boolean (true | false)
  // params.catalogus_key : key
  // params.besgroep_key  :
  // params.item_key      :
  // params.searchtekst   :

  var authparams = user.checkAutorisation(pautfunction);

  var urole = params.urole;
  var fronto = (urole == "fo");
  var backo = (urole == "bo");
  var minfo = (urole == "mi"); // NOT APPLICABLE?
  var frontend = (urole == "fe" || (!fronto && !backo && !minfo));

  // Voor resulttable de globalen zetten; zou ng anders moeten.
  var outputmode = params.outputmode; // print to 0 = screen, 1 = printer, 2 = excel, etc.
  var showall = params.showall;
  var catalogus_key = params.catalogus_key;
  if (catalogus_key)
     var bes_disc_info = bes.disc_info(catalogus_key, pautfunction); // alle discipline informatie.
  else
    var bes_disc_info = {fotomode: 0}; // Geen foto.
%>

  <html>
    <head>
<%
      FCLTHeader.Generate({ outputmode: outputmode });
%>
      <script type="text/javascript">
        // Text strings used clientside (bes_voorraad_list.js)
        var urole = "<%=urole%>";
        var outputmode = <%=outputmode%>;
        var catalogus_key = "<%=catalogus_key? catalogus_key : -1%>";
        var show_price = false; // Nodig voor functie checkAmount.
        var hide_cost = true;   // Nodig voor functie checkAmount.
        var bestelmode = 3;     // Actuele lijst (bes_disc_info.bestelmode is 3).

        var lijst_srtdeelkey = [];
        var lijst_tebestellen = [];
        var lijst_haskenmerken = [];

        function calculateOrder(currentstock)
        {
          var inVoorraad = currentstock.value;           // Artikelen in voorraad.
          var row = currentstock.closest("tr");
          var srtdeel_key = row.getAttribute("ROWKEY"); // Artikel key.

          var besData = JSON.parse(row.getAttribute("ROWDATA"));
          var rownr = besData.rownr;                    // Regelnummer van de ResultsetTable die begint met regel 0.
          var bestelmin = besData.bestelmin;            // Bestelminimum.
          //var bestelmax = besData.bestelmax;            // Bestelmaximum. Bestelmaximum is slechts een advies (STPH#31882). Bij het daadwerkelijk bestellen krijg je wel een waarschuwing.
          var voorraadmin = besData.voorraadmin;        // Minimumvoorraad.
          var voorraadmax = besData.voorraadmax;        // Maximumvoorraad.
          var maxbestel = besData.maxbestel;            // Maximum bestelaantal is voorraad.
          var bestelveelvoud = besData.bestelveelvoud;  // Bestelveelvoud.
          var eenheid = besData.eenheid;                // Eenheid.
          var haskenmerk = besData.haskenmerk;          // Artikel(regel) heeft kenmerken.
          var inbestelling = besData.inbestelling;      // Aritkelen in bestelling en nog niet geleverd.

          //if (inVoorraad == "" || (maxbestel > 0 && inVoorraad <= 0))
          if (inVoorraad == "" || inVoorraad < 0 || (maxbestel > 0 && inVoorraad == 0) || inVoorraad >= voorraadmin)
          {
            $("#order" + srtdeel_key).val("");
            delete lijst_tebestellen[rownr]; // Artikel hoeft niet meer besteld te worden als de actuele voorraad leeg gelaten wordt.
            return;
          }

          // Bepaal hoeveel artikelen besteld moeten worden.
          var tebestellen = voorraadmax - inVoorraad - inbestelling;
          // 1) Is het bestelaantal maximaal de voorraad indien de setting is gezet?
          if (maxbestel > 0 && inbestelling > inVoorraad)
            // Aantal verlagen naar het aantal dat in voorraad is min het aantal dat in bestelling is.
            tebestellen = inVoorraad - inbestelling;

          // 2) Is het bestelaantal minimaal het bestelminimum? Setting mag dan natuurlijk niet gezet zijn.
          if (maxbestel < 0 && tebestellen < bestelminimum)
            // Aantal gelijk aan het bestelminimum.
            tebestellen = bestelminimum;

          // 3) Is het bestelaantal minimaal de minimale voorraad? Setting mag dan natuurlijk niet gezet zijn.
          if (maxbestel < 0 && tebestellen < voorraadmin)
            // Aantal gelijk aan de minimale voorraad.
            tebestellen = voorraadmin;

          // 4) Voldoet het bestelaantal aan de bestelveelvoud?
          if ((pcs = tebestellen % bestelveelvoud) != 0)
          {
            tebestellen = tebestellen + bestelveelvoud - pcs;
            // Het kan zijn dat nu het aantal groter is als de voorraad of dat het totale aantal boven de maximale voorraad uitkomt.
            if ((maxbestel > 0 && tebestellen > inVoorraad) || (voorraadmax > 0 && tebestellen > voorraadmax - inVoorraad))
              tebestellen = tebestellen - bestelveelvoud;
          }

          if (tebestellen < 0)
            return;

          $("#order" + srtdeel_key).val(tebestellen > 0? tebestellen : "");
          lijst_tebestellen[rownr] = { srtdeel_key: srtdeel_key,
                                       tebestellen: tebestellen,
                                       haskenmerk: haskenmerk } ; // Artikelen met kenmerken worden niet gekopieerd naar een bestelling en worden dus niet besteld.
        }

        function bes_bestel()
        {
<%        if (authparams.PRSwritelevel < 9 && authparams.ALGwritelevel < 9)
          { %>
            if (catalogus_key < 0)
              FcltMgr.alert(L("lcl_bes_select_cataloque"));
            else
            {
              if (haskenmerk)
                FcltMgr.alert(L("lcl_bes_not_copy_articles"));

              var srtdeelkey_arr = [];
              var tebestellen_arr = [];
              for (var i in lijst_tebestellen)
              {
                if (!lijst_tebestellen[i].haskenmerk && lijst_tebestellen[i].tebestellen > 0)
                {
                  srtdeelkey_arr.push(lijst_tebestellen[i].srtdeel_key);
                  tebestellen_arr.push(lijst_tebestellen[i].tebestellen);
                }
              }

              var bestelurl = "appl/bes/bes_bestelling.asp?voorraad=1&urole=fo&dis_key=<%=catalogus_key%>";
              bestelurl += "&ps=" + srtdeelkey_arr.join(",") + "&pn=" + tebestellen_arr.join(",");
              FcltMgr.openDetail(bestelurl, L("lcl_bes_bestellen"));
            }
<%        } %>
        }
      </script>
    </head>
    <body id="listbody">
<%
      var sql = bes.current_srtdeel(pautfunction, params);

      /**********************************
       * Callback functies ResultsetTable
       *********************************/

      var rownr = 0;
      function fnrowData(oRs)
      {
        var srtdeelkey = oRs("bes_srtdeel_key").Value;         // Artikel key.
        var bestelmin = oRs("bestelmin").value || 0;           // Bestelminimum.
        var bestelmax = oRs("bestelmax").value;                // Bestelmaximum.
        var voorraadmin = oRs("voorraadmin").value || 0;       // Minimumvoorraad.
        var voorraadmax = oRs("voorraadmax").value || 0;       // Maximumvoorraad.
        var maxbestel = oRs("maxbestel").value || 0;           // Setting "Maximum bestelaantal is voorraad" 0=Nee, 1=Ja.
        var bestelveelvoud = oRs("bestelveelvoud").value || 1; // Bestelveelvoud.
        var eenheid = oRs("eenheid").value;                    // Eenheid.
        var haskenmerk = oRs("aantalkenmerken").value > 0;     // Artikel(regel) heeft kenmerken.
        var inbestelling = oRs("inbestelling").value;          // Artikelen in bestelling en nog niet geleverd.

        var data = { rownr: rownr,
                     srtdeelkey: srtdeelkey,
                     bestelmin: bestelmin,
                     bestelmax: bestelmax,
                     voorraadmin: voorraadmin,
                     voorraadmax: voorraadmax,
                     maxbestel: maxbestel,
                     bestelveelvoud: bestelveelvoud,
                     eenheid: eenheid,
                     haskenmerk: haskenmerk,
                     inbestelling: inbestelling };
        rownr++;
        return JSON.stringify(data);
      }

      function fncolFoto(oRs)
      {
        var fotopad = oRs("foto").Value;
        if (fotopad && fotopad.indexOf("/") == -1) // Nog geen enkele slash? Dan moet het wel lokaal zijn.
          fotopad = S("bes_image_path") + fotopad;

        return fotopad? ("<img src='{0}' alt='bessrtdeelfoto'>").format(fotopad) : "";
      }

      function fncolCurrentStock(oRs)
      {
        var bestelmax = "" + oRs("bestelmax").value; // Bestelmaximum.
        if (outputmode == 0)
        {
          var srtdeelkey = oRs("bes_srtdeel_key").Value; // Artikel key.
%>
          <script type="text/javascript">
          $(function()
          { // Voor de functie checkAmount moet tr.bes_item_info clientside gedefinieerd zijn. Dan kunnen we de aantallen controleren op juiste invoer.
            var tr = $("#currentstock<%=oRs('bes_srtdeel_key').Value%>").closest("tr")[0]; // Omdat ik checkAmount wil gebruikten moet tr.bes_item_info gedefinieerd zijn.
            //var rownr = tr.getAttribute
            var besData = JSON.parse(tr.getAttribute("ROWDATA"));
            var rownr = besData.rownr;                        // Regelnummer van de ResultsetTable die begint met regel 0.
            tr.bes_item_info = { rownr: rownr,
                                 srtdeelkey: <%=srtdeelkey%>,
                                 bestelminimum: 0,            // Elke minimum voorraad mag ingevuld worden. Bij de bestelling wordt het wel gecontroleerd.
                                 bestelmaximum: -1,           // Elke maximum voorraad mag ingevuld worden. Bij de bestelling wordt het wel gecontroleerd.
                                 veelvoud: 1,                 // Bij de bestelling wordt het wel gecontroleerd.
                                 isFreeArticle: false,        // Catalogus type (bes_disc_params_bestelmode) is Actuele lijst(4) en geen Vrij aanmaken(1).
                                 received: 0,                 // Ik moet de bestelling nog doen.
                                 price: 0                     // Met de prijs wordt in dit overzicht niets gedaan (show_price is false en hide_cost is true).
                               };
          });
          </script>
<%
           return '<input class="fldshort fldcurrentstock" type=text size="6" maxlength="' + (bestelmax.length + 1) + '"'
               + ' id="currentstock' + oRs("bes_srtdeel_key").Value + '"'
               + ' value="" OnClick="FcltMgr.stopPropagation(event)" onFocus="this.select()"'
               + ' onblur="window.blurEvent = onBlurAmount(this);" onchange="calculateOrder(this)">';
        }
        else
           return "";
      }

      var lijst_srtdeelkey = [];
      var lijst_tebestellen = [];
      var lijst_haskenmerken = [];
      // Bepalen of er de interne en externe artikelen zijn die een verschillende eenheid hebben (voorraadfactor > 1)
      // Aantal artikelen die besteld moeten worden, bijhouden voor de srtdelen (bes_srtdeel_key) zodat deze met 1 druk op de knop besteld kunnen worden.
      function fncolTeBestellen(oRs)
      {
        var bestelmax = "" + oRs("bestelmax").value; // Bestelmaximum.
        return '<input class="fldshort fldtebestellen" type=text size="6" maxlength="' + bestelmax.length + '"'
            + ' id="order' + oRs("bes_srtdeel_key").value + '" value="" readonly>';
      }

      /**************************************
       * End callback functies ResultsetTable
       *************************************/

      var buttons = [];
      buttons.push({ icon: "fa-plus", title: L("lcl_bes_order_lastcolumn"), action: "bes_bestel()" });
      buttons.push({ icon: "fa-columns",  title: L("lcl_scf_columns"), action: "openColumns()"});

      var rst = new ResultsetTable({ sql: sql,
                                     keyColumn: "bes_srtdeel_key", // Is geen unique key. Dus id van <tr> krijgt geen unique id
                                     ID: "besvoorraadtable",
                                     tabs_code: "bes_current_list-" + urole,
                                     title: L("lcl_bes_current_stock"),
                                     rowData: fnrowData,
                                     filterParams: params,
                                     outputmode: outputmode,
                                     showAll: showall,
                                     buttons: buttons
                                   });

      // Kolommen
      if (bes_disc_info.fotomode == 1)
        rst.addColumn(new Column({caption: L("lcl_bes_image"), content: fncolFoto, colName: "fncolFoto"}));
      rst.addColumn(new Column({caption: L("lcl_bes_srtdeel_volgnr"), content: "bes_srtdeel_volgnr", datatype: "number"}));
      rst.addColumn(new Column({caption: L("lcl_bes_srtdeel_nr"), content: "bes_srtdeel_nr"}));
      rst.addColumn(new Column({caption: L("lcl_bes_srtdeel"), content: "bes_srtdeel_omschrijving"}));
      rst.addColumn(new Column({caption: L("lcl_bes_group"), content: "bes_srtgroep_omschrijving"}));
      rst.addColumn(new Column({caption: L("lcl_bes_notitie"), content: "bes_srtdeel_notitie"}));
      rst.addColumn(new Column({caption: L("lcl_bes_minimum"), content: "bestelmin", datatype: "number"}));
      rst.addColumn(new Column({caption: L("lcl_bes_maximum"), content: "bestelmax", datatype: "number"}));
      rst.addColumn(new Column({caption: L("lcl_bes_voorraadmin"), content: "voorraadmin", datatype: "number"}));
      rst.addColumn(new Column({caption: L("lcl_bes_voorraadmax"), content: "voorraadmax", datatype: "number"}));
      if (catalogus_key)
      {
        rst.addColumn(new Column({caption: L("lcl_bes_artikellijst_voorraad"), content: fncolCurrentStock, colName: "fncolCurrentStock", datatype: "number"}));
      }
      rst.addColumn(new Column({caption: L("lcl_bes_ord_inbestelling"), content: "inbestelling", datatype: "number"}));
      if (catalogus_key)
      {
        rst.addColumn(new Column({caption: L("lcl_bes_bestellen"), content: fncolTeBestellen, colName: "fncolTeBestellen", datatype: "number", total: true}));
      }

      // Acties
      // Geen acties

      var count = rst.processResultset();
%>
        <script type="text/javascript">
          var haskenmerk = <%=lijst_haskenmerken.length%> > 0;
          $(function()
          {
          });
        </script>
    </body>
  </html>
<%
}
%>
