<% /*
     $Revision$
     $Id$
     File:               bes_voorraad_list.inc
     Description:        Show an overview of orders in 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_search.asp form
     Note:
*/ %>

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

<%
FCLTHeader.Requires({ plugins:["jQuery"]
                    });

function bes_voorraad_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_type: key
  // params.catalogus_key : key
  // params.besgroep_key  :
  // params.item_key      :
  // params.searchtekst   :
  // params.tebestellen   :
  // params.voorraad      : 0=bestelvoorraad, 1=actuele voorraad

  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 showvoorraad = params.voorraad;
%>

  <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 = "<%=params.catalogus_key? params.catalogus_key : -1%>";

        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 bestelurl = "appl/bes/bes_bestelling.asp?voorraad=1&urole=fo&dis_key=<%=params.catalogus_key%>";
              bestelurl += "&ps=" + ps + "&pn=" + pn;
              FcltMgr.openDetail(bestelurl, L("lcl_bes_bestellen"));
            }
<%        } %>
        }
      </script>
    </head>
    <body id="listbody">
<%
      var sql = bes.voorraad_srtdeel(pautfunction, params);

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

      // Bepalen of er de interne en externe artikelen zijn die een verschillende eenheid hebben (voorraadfactor > 1)
      var eenheidDiff = false;
      function fncolVoorraadIntern (oRs)
      {
        if (oRs("intern_voorraadfactor").Value > 1)
          eenheidDiff = true;
        return oRs("voorraad_intern").Value;
      }

      // Aantal artikelen die besteld moeten worden, bijhouden voor de srtdelen (bes_srtdeel_key) zodat deze met 1 druk op de knop besteld kunnen worden.
      var lijst_srtdeelkey = [];
      var lijst_tebestellen = [];
      var lijst_haskenmerken = [];
      function fncolTeBestellen(oRs)
      {
        var tebestellen = oRs("tebestellen").Value || 0;
        var besteld = oRs("aantal_open_order").Value || 0;
        var voorraad = oRs("voorraad").Value;
        var bestelminimum = oRs("bestelmin").Value || 0;
        var maxbestel = oRs("maxbestel").Value || 0; // Setting "Maximum bestelaantal is voorraad" 0=Nee, 1=Ja.
        var voorraadmin = oRs("voorraadmin").Value;
        var voorraadmax = oRs("voorraadmax").Value || 0;
        var bestelveelvoud = oRs("bestelveelvoud").Value || 1;
        var srtdeelkey = oRs("bes_srtdeel_key").Value;

        if (tebestellen == 0 || (maxbestel > 0 && voorraad <= 0))
          return null;

        // Onderstaande testen zie ook function checkAmount in sel_items_tab.js.
        // 1) Is het bestelaantal maximaal de voorraad indien de setting is gezet?
        if (maxbestel > 0 && besteld > voorraad)
          // Aantal verlagen naar het aantal dat in voorraad is min het aantal dat in bestelling is.
          tebestellen = voorraad - besteld;

        // 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 het bestelminimum.
          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 > voorraad) || (voorraadmax > 0 && tebestellen > voorraadmax - voorraad))
            tebestellen = tebestellen - bestelveelvoud;
        }

        // Deze functie wordt twee keer aangeroepen. Tweede keer item niet toevoegen.
        if (tebestellen > 0 && lijst_srtdeelkey[lijst_srtdeelkey.length - 1] != srtdeelkey)
        {
          var aantalkenmerken = oRs("aantalkenmerken").Value;
          if (aantalkenmerken == 0)
          {
            lijst_tebestellen.push(tebestellen);
            lijst_srtdeelkey.push(srtdeelkey);
          }
          else
            // Artikelen met kenmerken worden niet gekopieerd naar een bestelling en worden dus niet besteld.
            lijst_haskenmerken.push(srtdeelkey);
        }

        return tebestellen;
      }

      function fncolEenheidPrijs(oRs)
      {
        var factor = oRs("intern_voorraadfactor").Value;
        var prijs = oRs("prijs_intern").Value;
        var eenheidprijs = prijs / factor;

        return eenheidprijs.toFixed(2);
      }

      function fncolTotaalPrijs(oRs)
      { // Door afronding van eenheidsprijs kan de totaalprijs afwijken.
        // Deze heeft echter wel de juiste waarde!
        var factor = oRs("intern_voorraadfactor").Value;
        var prijs = oRs("prijs_intern").Value;
        var aantal = oRs("voorraad_intern").Value;
        var eenheidprijs = prijs / factor;
        var totaal = aantal * eenheidprijs;

        return totaal;
      }

      function fncolTotaalPrijsText(oRs)
      {
        return safe.curr(fncolTotaalPrijs(oRs), false);
      }

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

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

      var rst = new ResultsetTable({ sql: sql,
                                     keyColumn: "inkoop_disc", // Is geen unique key. Dus id van <tr> krijgt geen unique id
                                     ID: "besvoorraadtable",
                                     sql: sql,
                                     filterParams: params,
                                     outputmode: outputmode,
                                     title: L("lcl_bes_artikel_voorraad"),
                                     showAll: showall,
                                     buttons: buttons
                                   });

      // Kolommen
      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_notitie"), content: "bes_srtdeel_notitie"}));
      rst.addColumn(new Column({caption: L("lcl_bes_voorraad") + " (" + L("lcl_mld_intern") + ")", content: fncolVoorraadIntern, datatype: "number", total: true, thClass: "eenheiddiff", columnClass: function(){return "eenheiddiff";}}));
      rst.addColumn(new Column({caption: L("lcl_bes_unity"), content: "eenheid_intern", thClass: "eenheiddiff", columnClass: function(){return "eenheiddiff";}}));
      if (!showvoorraad)
      {
        rst.addColumn(new Column({caption: L("lcl_bes_aantal_in"), content: "aantal_geleverd", datatype: "number", total: true}));
        rst.addColumn(new Column({caption: "In bestelling"       , content: "aantal_inbestellingbijlever", datatype: "number", total: true}));
        rst.addColumn(new Column({caption: L("lcl_bes_aantal_uit"), content: "aantal_extern_uit", datatype: "number", total: true}));
        rst.addColumn(new Column({caption: "Uit-maar nog in magazijn", content: "aantal_uitmaarnoginmagazijn", datatype: "number", total: true}));
        rst.addColumn(new Column({caption: L("lcl_bes_voorraad"), content: "voorraad", datatype: "number", total: true}));
        rst.addColumn(new Column({caption: L("lcl_bes_unity"), content: "eenheid_extern"}));
        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"}));
        rst.addColumn(new Column({caption: L("lcl_bes_lopend"), content: "aantal_open_order", datatype: "number", total: true}));
        rst.addColumn(new Column({caption: L("lcl_bes_bestellen"), content: fncolTeBestellen, datatype: "number", total: true}));
      }
      else
      {
        rst.addColumn(new Column({caption: L("lcl_bes_price_per_unity"), content: fncolEenheidPrijs, datatype: "currency"}));
        rst.addColumn(new Column({caption: L("lcl_bes_price_total"), content: fncolTotaalPrijsText, fnAmount: fncolTotaalPrijs, datatype: "currency", total: true}));
      }
      // Acties
      // Geen acties

      var count = rst.processResultset();
%>
        <script type="text/javascript">

          var ps = "<%=lijst_srtdeelkey.join(",")%>";
          var pn = "<%=lijst_tebestellen.join(",")%>";
          var haskenmerk = <%=lijst_haskenmerken.length%> > 0;
          $(function()
          {
            // Indien voor alle artikelen de voorraadfactor 1 hebben, dan de kolommen m.b.t. interne voorraad niet tonen.
            if (<%=!eenheidDiff? 1 : 0%> == 1)
              $(".eenheiddiff").hide();
          });

        </script>
    </body>
  </html>
<%
}
%>
