<% /*
     $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
         categorie_key   search for orders with the given categorie key (discipline key)
     Context:            Search action from bes_search.asp form
     Note:
*/ %>

<!-- #include file="../Shared/json2.js" -->
<!-- #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_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_srtdeel = "SELECT sd2.bes_srtdeel_nr"
                      + "     , sd2.bes_srtdeel_voorraadfactor  intern_voorraadfactor"
                      + "     , sg2.ins_discipline_key"
                      + "     , sd2.bes_srtdeel_notitie intern_notitie"
                      + "     , "+ lcl.xsqla("sd2.bes_srtdeel_omschrijving","sd2.bes_srtdeel_key")
                      + "  FROM bes_srtdeel sd2"
                      + "     , bes_srtgroep sg2"
                      + " WHERE sd2.bes_srtgroep_key = sg2.bes_srtgroep_key"
                      + "   AND sd2.bes_srtdeel_verwijder IS NULL";

      // Bestelde artikelen intern (gekoppeld via bes_disc_params.bes_ins_discipline_key_inkoop)
      var sql_from_intern = "SELECT sd.bes_srtdeel_nr"
                          + "     , sd.bes_srtdeel_key"
                          + "     , (SELECT isd2.bes_srtdeel_key"
                          + "         FROM bes_srtdeel isd2"
                          + "            , bes_srtgroep isg2"
                          + "            ,  bes_discipline bd2"
                          + "        WHERE isd2.bes_srtgroep_key = isg2.bes_srtgroep_key"
                          + "          AND bd2.ins_discipline_key = isg2.ins_discipline_key"
                          + "          AND isd2.bes_srtdeel_nr LIKE sd.bes_srtdeel_nr"
                          + "          AND bes_srtdeel_verwijder IS NULL"
                          + "          AND bd2.ins_discipline_key = dp.bes_ins_discipline_key_inkoop) bes_srtdeel_key_inkoop"
                          + "     , dp.bes_ins_discipline_key"
                          + "     , dp.bes_ins_discipline_key_inkoop inkoop_disc"
                          + "     , (SELECT "+ lcl.xsql('bd2.ins_discipline_omschrijving','bd2.ins_discipline_key')
                                  + "  FROM bes_discipline bd2"
                                  + " WHERE bd2.ins_discipline_key = dp.bes_ins_discipline_key_inkoop) disc_oms"
                          + "     , (SELECT isd2.bes_srtdeel_voorraadmax"
                                  + "  FROM bes_srtdeel isd2"
                                  + "     , bes_srtgroep isg2"
                                  + "     , bes_discipline bd2"
                                  + " WHERE isd2.bes_srtgroep_key = isg2.bes_srtgroep_key"
                                  + "   AND bd2.ins_discipline_key = isg2.ins_discipline_key"
                                  + "   AND isd2.bes_srtdeel_nr LIKE sd.bes_srtdeel_nr"
                                  + "   AND bes_srtdeel_verwijder IS NULL"
                                  + "   AND bd2.ins_discipline_key = dp.bes_ins_discipline_key_inkoop) voorraadmax" // Voorraadmax van gekoppelde discipline
                          + "     , (SELECT isd2.bes_srtdeel_voorraadmin"
                                  + "  FROM bes_srtdeel isd2"
                                  + "     , bes_srtgroep isg2"
                                  + "     , bes_discipline bd2"
                                  + " WHERE isd2.bes_srtgroep_key = isg2.bes_srtgroep_key"
                                  + "   AND bd2.ins_discipline_key = isg2.ins_discipline_key"
                                  + "   AND isd2.bes_srtdeel_nr LIKE sd.bes_srtdeel_nr"
                                  + "   AND bes_srtdeel_verwijder IS NULL"
                                  + "   AND bd2.ins_discipline_key = dp.bes_ins_discipline_key_inkoop) voorraadmin" // Voorraadmin van gekoppelde discipline
                          + "     , SUM (bo.bes_bestelopdr_item_aantal) aantal_intern"
                          + "     , TO_NUMBER (NULL) aantal_open_order"
                          + "     , TO_NUMBER (NULL) aantal_extern_geleverd"
                          + "     , (SELECT isd2.bes_srtdeel_maxbestel"
                                  + "  FROM bes_srtdeel isd2"
                                  + "     , bes_srtgroep isg2"
                                  + "     , bes_discipline bd2"
                                  + " WHERE isd2.bes_srtgroep_key = isg2.bes_srtgroep_key"
                                  + "   AND bd2.ins_discipline_key = isg2.ins_discipline_key"
                                  + "   AND isd2.bes_srtdeel_nr LIKE sd.bes_srtdeel_nr"
                                  + "   AND bes_srtdeel_verwijder IS NULL"
                                  + "   AND bd2.ins_discipline_key = dp.bes_ins_discipline_key_inkoop) maxbestel" // maxbestel van gekoppelde discipline
                          + "     , (SELECT isd2.bes_srtdeel_minimum"
                                  + "  FROM bes_srtdeel isd2"
                                  + "     , bes_srtgroep isg2"
                                  + "     , bes_discipline bd2"
                                  + " WHERE isd2.bes_srtgroep_key = isg2.bes_srtgroep_key"
                                  + "   AND bd2.ins_discipline_key = isg2.ins_discipline_key"
                                  + "   AND isd2.bes_srtdeel_nr LIKE sd.bes_srtdeel_nr"
                                  + "   AND bes_srtdeel_verwijder IS NULL"
                                  + "   AND bd2.ins_discipline_key = dp.bes_ins_discipline_key_inkoop) bestelmin" // Bestelminimum van gekoppelde discipline
                          + "     , (SELECT isd2.bes_srtdeel_veelvoud"
                                  + "  FROM bes_srtdeel isd2"
                                  + "     , bes_srtgroep isg2"
                                  + "     , bes_discipline bd2"
                                  + " WHERE isd2.bes_srtgroep_key = isg2.bes_srtgroep_key"
                                  + "   AND bd2.ins_discipline_key = isg2.ins_discipline_key"
                                  + "   AND isd2.bes_srtdeel_nr LIKE sd.bes_srtdeel_nr"
                                  + "   AND bes_srtdeel_verwijder IS NULL"
                                  + "   AND bd2.ins_discipline_key = dp.bes_ins_discipline_key_inkoop) bestelveelvoud" // Bestelveelvoud van gekoppelde discipline
                          + "     , (SELECT isd2.bes_srtdeel_eenheid"
                                  + "  FROM bes_srtdeel isd2"
                                  + "     , bes_srtgroep isg2"
                                  + "     , bes_discipline bd2"
                                  + " WHERE isd2.bes_srtgroep_key = isg2.bes_srtgroep_key"
                                  + "   AND bd2.ins_discipline_key = isg2.ins_discipline_key"
                                  + "   AND isd2.bes_srtdeel_nr LIKE sd.bes_srtdeel_nr"
                                  + "   AND bes_srtdeel_verwijder IS NULL"
                                  + "   AND bd2.ins_discipline_key = dp.bes_ins_discipline_key_inkoop) bes_srtdeel_eenheid" // Eenheid van gekoppelde discipline
                          + "     , sd.bes_srtdeel_eenheid bes_srtdeel_eenheid_intern"
                          + "  FROM bes_discipline bd"
                          + "     , bes_v_aanwezigsrtgroep g"
                          + "     , bes_v_aanwezigsrtdeel sd"
                          + "     , bes_bestelling b"
                          + "     , bes_bestelling_item bi"
                          + "     , bes_bestelopdr_item bo"
                          + "     , bes_disc_params dp"
                          + " WHERE sd.bes_srtgroep_key = g.bes_srtgroep_key"
                          + "   AND bi.bes_srtdeel_key = sd.bes_srtdeel_key"
                          + "   AND b.bes_bestelling_key = bi.bes_bestelling_key"
                          + "   AND bi.bes_bestelopdr_item_key = bo.bes_bestelopdr_item_key"
                          + "   AND g.ins_discipline_key = bd.ins_discipline_key"
                          + "   AND bd.ins_discipline_key = dp.bes_ins_discipline_key"
                          + "   AND sd.bes_srtdeel_verwijder IS NULL"
                          + "   AND dp.bes_ins_discipline_key_inkoop IS NOT NULL"
                          + (params.catalogus_key
                            ? " AND dp.bes_ins_discipline_key_inkoop = " + params.catalogus_key
                              + " AND (sd.bes_srtdeel_vervaldatum IS NULL OR sd.bes_srtdeel_vervaldatum > SYSDATE)"
                            : "")
                          + (params.besgroep_key
                            ? " AND g.bes_srtgroep_key IN (SELECT sd2.bes_srtgroep_key"
                                     + "                     FROM bes_v_aanwezigsrtdeel sd2"
                                     + "                        ,  bes_v_aanwezigsrtgroep sg2"
                                     + "                    WHERE sd2.bes_srtgroep_key = sg2.bes_srtgroep_key"
                                     + "                      AND (sd2.bes_srtdeel_vervaldatum IS NULL OR sd2.bes_srtdeel_vervaldatum > SYSDATE)"
                                     + "                      AND sd2.bes_srtdeel_nr IN (SELECT sd3.bes_srtdeel_nr"
                                     + "                                                   FROM bes_v_aanwezigsrtdeel sd3"
                                     + "                                                  WHERE (sd3.bes_srtdeel_vervaldatum IS NULL OR sd3.bes_srtdeel_vervaldatum > SYSDATE)"
                                     + "                                                    AND sd3.bes_srtgroep_key = " + params.besgroep_key + "))"
                            : "")
                          + (params.item_key
                            ? " AND sd.bes_srtdeel_key IN (SELECT sd2.bes_srtdeel_key"
                                     + "                     FROM bes_v_aanwezigsrtdeel sd2"
                                     + "                        ,  bes_v_aanwezigsrtgroep sg2"
                                     + "                    WHERE sd2.bes_srtgroep_key = sg2.bes_srtgroep_key"
                                     + "                      AND (sd2.bes_srtdeel_vervaldatum IS NULL OR sd2.bes_srtdeel_vervaldatum > SYSDATE)"
                                     + "                      AND sd2.bes_srtdeel_nr LIKE (SELECT sd3.bes_srtdeel_nr"
                                     + "                                                     FROM bes_v_aanwezigsrtdeel sd3"
                                     + "                                                    WHERE (sd3.bes_srtdeel_vervaldatum IS NULL OR sd3.bes_srtdeel_vervaldatum > SYSDATE)"
                                     + "                                                    AND sd3.bes_srtdeel_key = " + params.item_key + "))"
                            : "")
                          + " GROUP BY sd.bes_srtdeel_nr"
                          + "     , sd.bes_srtdeel_key"
                          + "     , dp.bes_ins_discipline_key"
                          + "     , dp.bes_ins_discipline_key_inkoop"
                          + "     , "+ lcl.xsql("bd.ins_discipline_omschrijving","bd.ins_discipline_key")
                          + "     , bes_srtdeel_voorraadmax"
                          + "     , bes_srtdeel_voorraadmin"
                          + "     , sd.bes_srtdeel_maxbestel"
                          + "     , sd.bes_srtdeel_minimum"
                          + "     , sd.bes_srtdeel_veelvoud"
                          + "     , sd.bes_srtdeel_eenheid";

      // Bestelde artikelen bij de leverancier (extern)
      // Besteld (status = 5) en Geleverd (status = 6,7)
      var sql_from_extern = "SELECT sd.bes_srtdeel_nr"
                          + "     , sd.bes_srtdeel_key"
                          + "     , NULL bes_srtdeel_key_inkoop"
                          + "     , dp.bes_ins_discipline_key"
                          + "     , bd.ins_discipline_key inkoop_disc"
                          + "     , "+ lcl.xsql("bd.ins_discipline_omschrijving","bd.ins_discipline_key") +" disc_oms"
                          + "     , bes_srtdeel_voorraadmax voorraadmax"
                          + "     , bes_srtdeel_voorraadmin voorraadmin"
                          + "     , TO_NUMBER (NULL) aantal_intern"
                          + "     , SUM (bi.bes_bestelling_item_aantal) - SUM (COALESCE(bi.bes_bestelling_item_aantalontv, 0)) aantal_open_order"
                          + "     , TO_NUMBER (NULL) aantal_extern_geleverd"
                          + "     , sd.bes_srtdeel_maxbestel maxbestel"
                          + "     , sd.bes_srtdeel_minimum bestelmin"
                          + "     , sd.bes_srtdeel_veelvoud bestelveelvoud"
                          + "     , sd.bes_srtdeel_eenheid"
                          + "     , (SELECT isd2.bes_srtdeel_eenheid"
                                  + "  FROM bes_srtdeel isd2"
                                  + "     , bes_srtgroep isg2"
                                  + "     , bes_disc_params dp2"
                                  + " WHERE isd2.bes_srtgroep_key = isg2.bes_srtgroep_key"
                                  + "   AND dp2.bes_ins_discipline_key = isg2.ins_discipline_key"
                                  + "   AND isd2.bes_srtdeel_nr LIKE sd.bes_srtdeel_nr"
                                  + "   AND bes_srtdeel_verwijder IS NULL"
                                  + "   AND dp.bes_ins_discipline_key = dp2.bes_ins_discipline_key_inkoop) bes_srtdeel_eenheid_intern" // Eenheid van gekoppelde discipline
                          + "  FROM bes_discipline bd"
                          + "     , bes_v_aanwezigsrtgroep g"
                          + "     , bes_v_aanwezigsrtdeel sd"
                          + "     , bes_bestelling b"
                          + "     , bes_bestelling_item bi"
                          + "     , bes_bestelopdr_item bo"
                          + "     , bes_disc_params dp"
                          + " WHERE sd.bes_srtgroep_key = g.bes_srtgroep_key"
                          + "   AND bi.bes_srtdeel_key = sd.bes_srtdeel_key"
                          + "   AND b.bes_bestelling_key = bi.bes_bestelling_key"
                          + "   AND bi.bes_bestelopdr_item_key = bo.bes_bestelopdr_item_key"
                          + "   AND g.ins_discipline_key = bd.ins_discipline_key"
                          + "   AND bd.ins_discipline_key = dp.bes_ins_discipline_key"
                          + "   AND sd.bes_srtdeel_verwijder IS NULL"
                          + "   AND b.bes_bestelling_status IN (2, 3, 4, 5)"
                          + "   AND dp.bes_ins_discipline_key_inkoop IS NULL"
                          // Het moet een gekoppelde discipline zijn
                          + "   AND dp.bes_ins_discipline_key IN"
                                + " (SELECT dp1.bes_ins_discipline_key_inkoop"
                                + "    FROM bes_disc_params dp1"
                                + "   WHERE dp1.bes_ins_discipline_key_inkoop IS NOT NULL)"
                          + (params.catalogus_key
                            ? " AND bd.ins_discipline_key = " + params.catalogus_key
                              + " AND (sd.bes_srtdeel_vervaldatum IS NULL OR sd.bes_srtdeel_vervaldatum > SYSDATE)"
                            : "")
                          + (params.besgroep_key
                            ? " AND g.bes_srtgroep_key = " + besgroep_key
                              + " AND (sd.bes_srtdeel_vervaldatum IS NULL OR sd.bes_srtdeel_vervaldatum > SYSDATE)"
                            : "")
                          + (params.item_key
                            ? " AND sd.bes_srtdeel_key = " + item_key
                            : "")
                          + " GROUP BY bes_srtdeel_nr"
                          + "     , sd.bes_srtdeel_key"
                          + "     , dp.bes_ins_discipline_key"
                          + "     , bd.ins_discipline_key"
                          + "     , "+ lcl.xsql("bd.ins_discipline_omschrijving","bd.ins_discipline_key")
                          + "     , bes_srtdeel_voorraadmax"
                          + "     , bes_srtdeel_voorraadmin"
                          + "     , sd.bes_srtdeel_maxbestel"
                          + "     , sd.bes_srtdeel_minimum"
                          + "     , sd.bes_srtdeel_veelvoud"
                          + "     , sd.bes_srtdeel_eenheid"
                          + " UNION ALL "
                          + "SELECT sd.bes_srtdeel_nr"
                          + "     , sd.bes_srtdeel_key"
                          + "     , NULL bes_srtdeel_key_inkoop"
                          + "     , dp.bes_ins_discipline_key"
                          + "     , bd.ins_discipline_key inkoop_disc"
                          + "     , "+ lcl.xsql("bd.ins_discipline_omschrijving","bd.ins_discipline_key") +" disc_oms"
                          + "     , bes_srtdeel_voorraadmax voorraadmax"
                          + "     , bes_srtdeel_voorraadmin voorraadmin"
                          + "     , TO_NUMBER (NULL) aantal_intern"
                          + "     , TO_NUMBER (NULL) aantal_open_order"
                          + "     , SUM (COALESCE(bi.bes_bestelling_item_aantalontv, 0)) aantal_extern_geleverd"
                          + "     , sd.bes_srtdeel_maxbestel maxbestel"
                          + "     , sd.bes_srtdeel_minimum bestelmin"
                          + "     , sd.bes_srtdeel_veelvoud bestelveelvoud"
                          + "     , sd.bes_srtdeel_eenheid"
                          + "     , (SELECT isd2.bes_srtdeel_eenheid"
                                  + "  FROM bes_srtdeel isd2"
                                  + "     , bes_srtgroep isg2"
                                  + "     , bes_disc_params dp2"
                                  + " WHERE isd2.bes_srtgroep_key = isg2.bes_srtgroep_key"
                                  + "   AND dp2.bes_ins_discipline_key = isg2.ins_discipline_key"
                                  + "   AND isd2.bes_srtdeel_nr LIKE sd.bes_srtdeel_nr"
                                  + "   AND bes_srtdeel_verwijder IS NULL"
                                  + "   AND dp.bes_ins_discipline_key = dp2.bes_ins_discipline_key_inkoop) bes_srtdeel_eenheid_intern" // Eenheid van gekoppelde discipline
                          + "  FROM bes_discipline bd"
                          + "     , bes_v_aanwezigsrtgroep g"
                          + "     , bes_v_aanwezigsrtdeel sd"
                          + "     , bes_bestelling b"
                          + "     , bes_bestelling_item bi"
                          + "     , bes_bestelopdr_item bo"
                          + "     , bes_disc_params dp"
                          + " WHERE sd.bes_srtgroep_key = g.bes_srtgroep_key"
                          + "   AND bi.bes_srtdeel_key = sd.bes_srtdeel_key"
                          + "   AND b.bes_bestelling_key = bi.bes_bestelling_key"
                          + "   AND bi.bes_bestelopdr_item_key = bo.bes_bestelopdr_item_key"
                          + "   AND g.ins_discipline_key = bd.ins_discipline_key"
                          + "   AND bd.ins_discipline_key = dp.bes_ins_discipline_key"
                          + "   AND sd.bes_srtdeel_verwijder IS NULL"
                          // Bestellingstatus 5:      Alleen de bestelopdr items waarbij de ontvangen datum is gezet zijn gedeeltelijk of in zijn geheel geleverd.
                          // Bestellingstatus 6 en 7: Bestelopdr is in zijn geheel geleverd.
                          + "   AND (b.bes_bestelling_status IN (6, 7)"
                          + "        OR (bo.bes_bestelopdr_item_ontvangen IS NOT NULL"
                          + "            AND b.bes_bestelling_status IN (5)))"
                          + "   AND dp.bes_ins_discipline_key_inkoop IS NULL"
                          // Het moet een gekoppelde discipline zijn
                          + "   AND dp.bes_ins_discipline_key IN"
                                + " (SELECT dp1.bes_ins_discipline_key_inkoop"
                                + "    FROM bes_disc_params dp1"
                                + "   WHERE dp1.bes_ins_discipline_key_inkoop IS NOT NULL)"
                          + (params.catalogus_key
                            ? " AND bd.ins_discipline_key = " + params.catalogus_key
                              + " AND (sd.bes_srtdeel_vervaldatum IS NULL OR sd.bes_srtdeel_vervaldatum > SYSDATE)"
                            : "")
                          + (params.besgroep_key
                            ? " AND g.bes_srtgroep_key = " + besgroep_key
                              + " AND (sd.bes_srtdeel_vervaldatum IS NULL OR sd.bes_srtdeel_vervaldatum > SYSDATE)"
                            : "")
                          + (params.item_key
                            ? " AND sd.bes_srtdeel_key = " + item_key
                            : "")
                          + " GROUP BY bes_srtdeel_nr"
                          + "     , sd.bes_srtdeel_key"
                          + "     , dp.bes_ins_discipline_key"
                          + "     , bd.ins_discipline_key"
                          + "     , "+ lcl.xsql("bd.ins_discipline_omschrijving","bd.ins_discipline_key")
                          + "     , bes_srtdeel_voorraadmax"
                          + "     , bes_srtdeel_voorraadmin"
                          + "     , sd.bes_srtdeel_maxbestel"
                          + "     , sd.bes_srtdeel_minimum"
                          + "     , sd.bes_srtdeel_veelvoud"
                          + "     , sd.bes_srtdeel_eenheid";

      var sql_from = sql_from_intern
                   + " UNION ALL "
                   + sql_from_extern;

      var sql_from_all = "SELECT COALESCE (bo.bes_srtdeel_key_inkoop, bo.bes_srtdeel_key) bes_srtdeel_key"
                       + "     , bo.bes_srtdeel_nr"
                       + "     , bo.bes_ins_discipline_key"
                       + "     , bo.inkoop_disc"
                       + "     , bo.disc_oms"
                       + "     , bo.voorraadmax"
                       + "     , bo.voorraadmin"
                       + "     , SUM (bo.aantal_intern) aantal_intern_uit"
                       + "     , SUM (bo.aantal_extern_geleverd) aantal_geleverd"
                       + "     , SUM (bo.aantal_open_order) aantal_open_order"
                       + "     , bo.maxbestel"
                       + "     , bo.bestelmin"
                       + "     , bo.bestelveelvoud"
                       + "     , bo.bes_srtdeel_eenheid"
                       + "     , bo.bes_srtdeel_eenheid_intern"
                       + "  FROM (" + sql_from + ") bo"
                       + " GROUP BY bo.bes_srtdeel_key"
                       + "        , bo.bes_srtdeel_key_inkoop"
                       + "        , bo.bes_srtdeel_nr"
                       + "        , bo.bes_ins_discipline_key"
                       + "        , bo.inkoop_disc"
                       + "        , bo.disc_oms"
                       + "        , bo.voorraadmax"
                       + "        , bo.voorraadmin"
                       + "        , bo.maxbestel"
                       + "        , bo.bestelmin"
                       + "        , bo.bestelveelvoud"
                       + "        , bo.bes_srtdeel_eenheid"
                       + "        , bo.bes_srtdeel_eenheid_intern";

      var sql_prijs = "SELECT sp.bes_srtdeel_key"
                    + "     , sp.bes_srtdeel_prijs_prijs"
                    + "     , sp.bes_srtdeel_prijs_inkprijs"
                    + "  FROM bes_srtdeel_prijs sp"
                    + " WHERE sp.bes_srtdeel_prijs_vervaldatum IS NULL"

      var sql_val = "SELECT a.bes_srtdeel_key"
                  + "     , a.bes_srtdeel_nr"
                  + "     , a.inkoop_disc"
                  + "     , a.disc_oms"
                  + "     , a.voorraadmax"
                  + "     , a.voorraadmin"
                  + "     , a.maxbestel"
                  + "     , a.bestelmin"
                  + "     , a.bestelveelvoud"
                  + "     , SUM(a.aantal_intern_uit) aantal_intern_uit"
                  + "     , SUM(CEIL (a.aantal_intern_uit / b.intern_voorraadfactor))  aantal_extern_uit"
                  + "     , SUM(a.aantal_geleverd) aantal_geleverd"
                  + "     , SUM(a.aantal_open_order) aantal_open_order"
                  + "     , b.intern_voorraadfactor"
                  + "     , COALESCE(SUM(a.aantal_geleverd), 0) - COALESCE(SUM(CEIL (a.aantal_intern_uit / b.intern_voorraadfactor)), 0) voorraad"
                  + "     , COALESCE(SUM (a.aantal_geleverd * b.intern_voorraadfactor), 0) -  COALESCE(SUM (a.aantal_intern_uit), 0) voorraad_intern"
                  + "     , b.intern_notitie"
                  + "     , b.bes_srtdeel_omschrijving"
                  + "     , a.bes_srtdeel_eenheid eenheid_extern"
                  + "     , a.bes_srtdeel_eenheid_intern eenheid_intern"
                  + "     , c.bes_srtdeel_prijs_prijs prijs_intern"
                  + "  FROM (" + sql_from_all + ") a"
                  + "     , (" + sql_srtdeel  + ") b"
                  + "     , (" + sql_prijs    + ") c"
                  + " WHERE a.bes_srtdeel_nr = b.bes_srtdeel_nr"
                  + "   AND a.inkoop_disc = b.ins_discipline_key"
                  + "   AND a.bes_srtdeel_key = c.bes_srtdeel_key(+)"
                  + (params.catalogus_key
                    ? " AND a.inkoop_disc = " + params.catalogus_key
                    : "")
                  + (params.searchtekst
                    ? " AND (  UPPER(a.bes_srtdeel_nr) LIKE " + safe.quoted_sql_wild("%" + params.searchtekst + "%")
                      + "   OR UPPER(b.bes_srtdeel_omschrijving) LIKE " + safe.quoted_sql_wild("%" + params.searchtekst + "%") + ")"
                    : "")
                  + " GROUP BY a.bes_srtdeel_key"
                  + "        , a.bes_srtdeel_nr"
                  + "        , a.inkoop_disc"
                  + "        , a.disc_oms"
                  + "        , a.voorraadmax"
                  + "        , a.voorraadmin"
                  + "        , a.maxbestel"
                  + "        , a.bestelmin"
                  + "        , a.bestelveelvoud"
                  + "        , b.intern_voorraadfactor"
                  + "        , b.intern_notitie"
                  + "        , b.bes_srtdeel_omschrijving"
                  + "        , a.bes_srtdeel_eenheid"
                  + "        , a.bes_srtdeel_eenheid_intern"
                  + "        , c.bes_srtdeel_prijs_prijs";

      var sql = "SELECT bes_srtdeel_key"
              + "     , bes_srtdeel_nr"
              + "     , bes_srtdeel_omschrijving"
              + "     , intern_notitie bes_srtdeel_notitie"
              + "     , intern_voorraadfactor"
              + "     , inkoop_disc"
              + "     , disc_oms"
              + "     , voorraadmax"
              + "     , voorraadmin"
              + "     , maxbestel"
              + "     , bestelmin"
              + "     , bestelveelvoud"
              + "     , aantal_intern_uit"
              + "     , aantal_extern_uit"
              + "     , aantal_geleverd"
              + "     , aantal_open_order"
              + "     , CASE"
              + "         WHEN (  COALESCE(aantal_open_order, 0)"
              + "               + COALESCE (aantal_geleverd, 0)"
              + "               - COALESCE (aantal_extern_uit, 0) < voorraadmin)"
              + "          THEN"
              + "               voorraadmax"
              + "             - COALESCE (aantal_open_order, 0)"
              + "             - COALESCE (aantal_geleverd, 0)"
              + "             + COALESCE (aantal_extern_uit, 0)"
              + "          ELSE"
              + "             NULL"
              + "       END tebestellen"
              + "     , voorraad"
              + "     , voorraad_intern"
              + "     , (SELECT COUNT(*)"
              + "          FROM bes_kenmerk bk"
              + "             , bes_srtdeel sd"
              + "             , bes_srtgroep sg"
              + "         WHERE sd.bes_srtgroep_key = sg.bes_srtgroep_key"
              + "           AND (bk.bes_srtinstallatie_key = sg.ins_discipline_key AND bk.bes_kenmerk_niveau LIKE 'D'"
              + "                OR bk.bes_srtinstallatie_key = sg.bes_srtgroep_key AND bk.bes_kenmerk_niveau LIKE 'G'"
              + "                OR bk.bes_srtinstallatie_key = sd.bes_srtdeel_key AND bk.bes_kenmerk_niveau LIKE 'S')"
              + "           AND bk.bes_kenmerk_type = 'I'"
              + "           AND sd.bes_srtdeel_key = l.bes_srtdeel_key) aantalkenmerken"
              + "     , l.eenheid_extern"
              + "     , l.eenheid_intern"
              + "     , l.prijs_intern"
              + "  FROM (" + sql_val + ") l";


      if (params.tebestellen)
        sql = "SELECT *"
            + " FROM (" + sql + ")"
            + " WHERE tebestellen IS NOT NULL"

      sql += " ORDER BY bes_srtdeel_nr";

      /**********************************
       * 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: "plus.png", 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: L("lcl_bes_aantal_uit"), content: "aantal_extern_uit", 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_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;

          jQuery(document).ready(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>
<%
}
%>

