<% /*
     $Revision$
     $Id$

     File:               details.inc
     Description:        Bepaalt een clientside array details_Items met bestelregels
                         Daar wordt clientside in sel_items_tab.js dan weer HTML van gemaakt
     Parameters:         veelal globalen
     Context:            Include van bes_edit_bestelling.asp
     Note:               Wordt gebruikt voor bestaande bestellingen en voor (net terug van) punch-out
*/ %>

<%
// aanroeper moet hebben: var details_Items = new Array(); // voor details.inc


// Gebruikt voor bestaande bestellingen (bes_key >0)
// of voor binnenkomst punchout (bes_key==-1 en psrt_keys, pamounts arrays met keys en aantallen)
// of voor auto-bestellijst (bes_key==-1, params.disc_key gezet en params.bestellijst = true)
function generateDetails(bes_key, params)
{
  params = params || {};
  var edit = params.edit;
  var auto_bestellijst = params.auto_bestellijst;
  var from_voorraad = params.from_voorraad;
  var psrt_keys = params.psrt_keys;
  var pamounts = params.pamounts;
  var pregel_kenmerken = params.pregel_kenmerken;
  var sql;
  var oRs;
  if (bes_key > 0)
  {
    // retrieve info about the objects
    sql = "SELECT ins_discipline_key"
        + "     , i.bes_srtdeel_key"
        + "     , s.bes_srtdeel_nr"
        + ", " + lcl.xsqla('s.bes_srtdeel_omschrijving', 's.bes_srtdeel_key')
        + "    , bes_srtdeel_details_loc"
        + "    ,  NVL2(s.bes_srtdeel_image, p.prs_bedrijf_image_loc || s.bes_srtdeel_image, NULL) foto"
        + "    , i.bes_bestelling_item_aantal"
        + "    , g.bes_srtgroep_key"
        + ", " + lcl.xsqla('g.bes_srtgroep_omschrijving', 'g.bes_srtgroep_key')
        + (edit
          ? "   , COALESCE(bes.getsrtdeelprijs(i.bes_srtdeel_key, null) , 0)"
          : "   , i.bes_bestelling_item_prijs") + " prijs" // pak bestelling prijs inclusief kortingen
        + "     , s.bes_srtdeel_btw"
        + "     , s.bes_srtdeel_veelvoud"
        + "     , bes_bestelling_item_aantalontv"
        + "     , i.bes_bestelling_key"
        + "     , i.bes_bestelling_item_key"
        + ", " + lcl.xsqla('s.bes_srtdeel_eenheid', 's.bes_srtdeel_key')
        + "     , (SELECT COALESCE(ABS(SUM(bi.bes_bestelling_item_aantal)), 0)"
          + "        FROM bes_bestelling b"
          + "           , bes_bestelling_item bi"
          + "       WHERE b.bes_bestelling_key = bi.bes_bestelling_key"
          + "         AND b.bes_bestelling_retourvan_key = i.bes_bestelling_key) retour"
        + "     , CASE WHEN bst.bes_staffeltabel_groep = 0"
          + "          THEN 0" // artikelkorting
          + "          WHEN bst.bes_staffeltabel_groep = 1"
          + "          THEN bst.bes_staffeltabel_key" // groepskorting
          + "          ELSE -1" // geen staffelkorting
          + "          END staffelgroep"
        + "    , s.bes_srtdeel_minimum"
        + "    , s.bes_srtdeel_maximum"
        + ", " + lcl.xsqla('s.bes_srtdeel_opmerking', 's.bes_srtdeel_key')
        + "    , s.bes_srtdeel_maxbestel"
        + " FROM bes_bestelling_item i"
        + "    , bes_srtdeel s"
        + "    , bes_srtgroep g"
        + "    , bes_bestelling b"
        + "    , bes_staffeltabel bst"
        + "    , prs_bedrijf p"
        + " WHERE i.bes_bestelling_key = " + bes_key
        + "   AND i.bes_srtdeel_key = s.bes_srtdeel_key"
        + "   AND b.bes_bestelling_key = i.bes_bestelling_key"
        + "   AND s.bes_srtgroep_key = g.bes_srtgroep_key"
        + "   AND bst.bes_staffeltabel_key(+) = s.bes_staffeltabel_key"
        + "   AND p.prs_bedrijf_verwijder IS NULL"   // want ook die geven later een error en kunnen niet besteld worden
        + "   AND s.prs_bedrijf_key = p.prs_bedrijf_key"
        + " ORDER BY bes_srtdeel_nr, UPPER(bes_srtdeel_omschrijving)";   // XLAT??
  }
  else // punchout en bestellijst hebben niets met staffels o.i.d.
  {
    sql_select = "SELECT ins_discipline_key"
               + "     , s.bes_srtdeel_key"
               + "     , s.bes_srtdeel_nr"
               + ", " + lcl.xsqla('s.bes_srtdeel_omschrijving', 's.bes_srtdeel_key')
               + "     , g.bes_srtgroep_volgnr"
               + "     , s.bes_srtdeel_volgnr"
//               + "     , 0 bes_bestelling_item_aantal" // komt straks uit pamounts
               + "    , bes_srtdeel_details_loc"
               + "    ,  NVL2(s.bes_srtdeel_image, p.prs_bedrijf_image_loc || s.bes_srtdeel_image, NULL) foto"
               + "    , g.bes_srtgroep_key"
               + ", " + lcl.xsqla('g.bes_srtgroep_omschrijving', 'g.bes_srtgroep_key')
               + "    , bes.getsrtdeelprijs (s.bes_srtdeel_key, NULL) prijs"
               + "    , s.bes_srtdeel_btw"
               + "    , s.bes_srtdeel_veelvoud"
               + "    , -1 bes_bestelling_item_aantalontv"
               + "    , -1 bes_bestelling_key"
               + "    , -ROWNUM-1 bes_bestelling_item_key" // uniek maar niet bestaand
               + ", " + lcl.xsqla('s.bes_srtdeel_eenheid', 's.bes_srtdeel_key')
               + "    , 0 retour"
               + "    , -1 staffelgroep"
               + "    , s.bes_srtdeel_minimum"
               + "    , s.bes_srtdeel_maximum"
               + ", " + lcl.xsqla('s.bes_srtdeel_opmerking', 's.bes_srtdeel_key')
               + "    , s.bes_srtdeel_maxbestel";
    sql_fromwhere = " FROM bes_srtdeel s"
                  + "    , bes_srtgroep g"
                  + "    , prs_bedrijf p"
                  + " WHERE "
                  +      (auto_bestellijst // Dan alle artikelen van deze discipline
                              ?"g.ins_discipline_key = " + params.disc_key
                                  + " AND bes_srtdeel_verwijder IS NULL"
                                  + " AND bes_srtgroep_verwijder IS NULL"
                                  + " AND (bes_srtdeel_vervaldatum IS NULL"
                                  + "      OR bes_srtdeel_vervaldatum > SYSDATE)"
                              :"s.bes_srtdeel_key IN (" + psrt_keys.join(", ") + ")")
                  + "   AND s.bes_srtgroep_key = g.bes_srtgroep_key"
                  + "   AND p.prs_bedrijf_verwijder IS NULL"   // want ook die geven later een error en kunnen niet besteld worden
                  + "   AND s.prs_bedrijf_key = p.prs_bedrijf_key";

    if (auto_bestellijst && psrt_keys.length > 0)
    { // Eerste de artikelen met aantallen en dan de artikelen zonder aantallen tonen.
      sql = sql_select
          + ", 'A' serie"
          + sql_fromwhere
          + " AND s.bes_srtdeel_key IN (" + psrt_keys.join(", ") + ")"
          + " UNION "
          + sql_select
          + ", 'B' serie"
          + sql_fromwhere
          + " AND s.bes_srtdeel_key NOT IN (" + psrt_keys.join(", ") + ")";

      sql = "SELECT xx.*"
          + "    , -ROWNUM-1 bes_bestelling_item_key" // uniek maar niet bestaand
          + "  FROM (" + sql + ") xx";
    }
    else
      sql = sql_select
          + ", 'A' serie"
          + "    , -ROWNUM-1 bes_bestelling_item_key" // uniek maar niet bestaand
          + sql_fromwhere;

    sql += " ORDER BY serie"
         + "        , bes_srtgroep_volgnr"
         + "        , bes_srtgroep_omschrijving"
         + "        , bes_srtdeel_volgnr"
         + "        , bes_srtdeel_omschrijving";
  }
  var oRs = Oracle.Execute(sql);
%>
  <script>
    var i = 0;
<%
      var isCorrectie = false; // We hebben geen apart
      while (!oRs.eof)
      {
%>
        var objFlex = new Array;
        objFlex[0] = new Array(); // bes_kenmerk_key
        objFlex[1] = new Array(); // bes_kenmerkbestell_waarde
        objFlex[2] = new Array(); // flexkenmerk omschrijving
        objFlex[3] = new Array(); // flexkenmerkwaarde omschrijving
        i = 0;
<%
        if (oRs("bes_bestelling_item_key").Value > 0)
        {
          sql = " SELECT k.bes_kenmerk_key"
              + "     , COALESCE (" + lcl.xsql("k.bes_kenmerk_omschrijving", "k.bes_kenmerk_key")
              + "              ,  " + lcl.xsql("sk.bes_srtkenmerk_omschrijving", "sk.bes_srtkenmerk_key") + ") kenmerk_omschrijving"
              + ",       sk.bes_srtkenmerk_kenmerktype"
              + ",       r.fac_kenmerkdomein_objectnaam"
              + ",       r.fac_kenmerkdomein_kolomnaam"
              + ",       r.fac_kenmerkdomein_kolomtxt"
              + ",       r.fac_usrtab_key"
              + ",       sk.bes_srtkenmerk_lengte"
              + ",       sk.bes_srtkenmerk_dec"
              + ",       sk.bes_srtkenmerk_nmin"
              + ",       sk.bes_srtkenmerk_nmax"
              + ",       (SELECT v.bes_kenmerkbesteli_waarde"
              + "           FROM bes_kenmerkbesteli v"
              + "          WHERE v.bes_bestelling_item_key = " + oRs("bes_bestelling_item_key").Value
              + "            AND v.bes_kenmerk_key = k.bes_kenmerk_key"
              + "            AND v.bes_kenmerkbesteli_verwijder IS NULL) waarde" // 11
              + ",       k.bes_kenmerk_verplicht"
              + ",       k.bes_kenmerk_groep"
              + ", " + lcl.xsqla('k.bes_kenmerk_default', 'k.bes_kenmerk_key')
              + ",           k.bes_srtinstallatie_key"
              + "   FROM bes_srtkenmerk sk"
              + ",       bes_kenmerk k"
              + ",       fac_kenmerkdomein r"
              + ",       bes_kenmerkbesteli kbi"
              + "  WHERE k.bes_kenmerk_verwijder IS NULL"
              + "    AND kbi.bes_kenmerk_key = k.bes_kenmerk_key"
              + "    AND kbi.bes_bestelling_item_key IN (" + oRs("bes_bestelling_item_key").Value + ")"
              + "    AND k.bes_srtkenmerk_key = sk.bes_srtkenmerk_key"
              + "    AND sk.bes_srtkenmerk_verwijder IS NULL"
              + "    AND sk.fac_kenmerkdomein_key  = r.fac_kenmerkdomein_key(+)"
              + "    AND k.bes_kenmerk_type = 'I'"
              + "    AND sk.bes_srtkenmerk_kenmerktype NOT IN ('F', 'M', 'E')" // Bestelitemregels hebben geen bijlages of bestanden.
              + " ORDER BY k.bes_kenmerk_volgnummer"
              + "        , UPPER( COALESCE (" + lcl.xsql("k.bes_kenmerk_omschrijving", "k.bes_kenmerk_key")
              + "                        ,  " + lcl.xsql("sk.bes_srtkenmerk_omschrijving", "sk.bes_srtkenmerk_key") + "))";
          oRs1 = Oracle.Execute(sql);
          while (!oRs1.eof)
          {
            var ktype = oRs1("bes_srtkenmerk_kenmerktype").Value;
            if (ktype == 'R' || ktype == 'S')
            {
              val = oRs1("waarde").Value;
              var FAC_USRTAB_KEY = oRs1("fac_usrtab_key").Value;
              if (oRs1("fac_kenmerkdomein_objectnaam").Value == "FAC_USRDATA" && FAC_USRTAB_KEY)
                where = "FAC_USRTAB_KEY = " + FAC_USRTAB_KEY;
              sql = "SELECT " + oRs1("fac_kenmerkdomein_kolomnaam").Value + "," + oRs1("fac_kenmerkdomein_kolomtxt").Value + " waarde"
                  + " FROM " + oRs1("fac_kenmerkdomein_objectnaam").Value
                  + " WHERE " + oRs1("fac_kenmerkdomein_kolomnaam").Value + " = " + safe.quoted_sql(val);
              oRs2 = Oracle.Execute(sql);

              if (!oRs2.eof)
              { %>
                objFlex[0][i] = <%=oRs1("bes_kenmerk_key").Value%>;
                objFlex[1][i] = "<%=safe.jsstring(oRs1("waarde").Value)%>";
                objFlex[2][i] = "<%=safe.jsstring(oRs1("kenmerk_omschrijving").Value)%>";
                objFlex[3][i] = "<%=safe.jsstring(oRs2("waarde").Value)%>";
                i++;
    <%        }
            }
            else
            { %>
              objFlex[0][i] = <%=oRs1("bes_kenmerk_key").Value%>;
              objFlex[1][i] = "<%=safe.jsstring(oRs1("waarde").Value)%>";
              objFlex[2][i] = "<%=safe.jsstring(oRs1("kenmerk_omschrijving").Value)%>";
              objFlex[3][i] = "<%=safe.jsstring(oRs1("waarde").Value)%>";
              i++;
    <%      }
            oRs1.moveNext();
          }
          oRs1.Close();
        }
        var amount = 0;
        if (bes_key > 0)
        {
          amount = oRs("bes_bestelling_item_aantal").Value;
          isCorrectie = isCorrectie || amount < 0; // Heuristisch
        }
        else if (auto_bestellijst && !from_voorraad)
        {
          amount = 0;
        }
        else // punch_out
        {
          for (var j = 0; j < psrt_keys.length; j++)
          {
            if (psrt_keys[j] == oRs("bes_srtdeel_key").Value)
            {
              amount = pamounts[j];

              for (var kenmerk_oms in pregel_kenmerken)
              {
                var sqlk = "SELECT k.bes_kenmerk_key"
                         + "  FROM bes_srtkenmerk sk"
                         + "     , bes_kenmerk k"
                         + " WHERE k.bes_srtkenmerk_key = sk.bes_srtkenmerk_key"
                         + "   AND LOWER(COALESCE(k.bes_kenmerk_omschrijving, sk.bes_srtkenmerk_omschrijving)) = LOWER(" + safe.quoted_sql(kenmerk_oms) + ")";
                oRsk = Oracle.Execute(sqlk);
                if (!oRsk.eof && pregel_kenmerken[kenmerk_oms][j] != "") // Kenmerk moet wel een waarde hebben.
                { %>
                  objFlex[0][i] = <%=oRsk("bes_kenmerk_key").Value%>;
                  objFlex[1][i] = "<%=safe.jsstring(pregel_kenmerken[kenmerk_oms][j])%>";
                  objFlex[2][i] = "<%=safe.jsstring(kenmerk_oms)%>";
                  objFlex[3][i] = "<%=safe.jsstring(pregel_kenmerken[kenmerk_oms][j])%>";
                  i++;
<%              }
                oRsk.Close();
              }
            }
          }
        }
        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;

        var bresult = bes.func_enabled_bestelitem( (edit?bes_key:-1), oRs("bes_srtdeel_key").Value);
%>
        details_Items[<%=oRs("bes_bestelling_item_key").Value%>] =
            { bestelling_key: <%=oRs("bes_bestelling_key").Value%>,
              srtdeel_key: <%=oRs("bes_srtdeel_key").Value%>,
              srtdeel_nr: "<%=safe.jsstring(oRs("bes_srtdeel_nr").Value)%>",
              srtdeel_omschrijving: "<%=safe.jsstring(oRs("bes_srtdeel_omschrijving").Value)%>",
              srtdeel_details_loc: "<%=safe.jsstring(oRs("bes_srtdeel_details_loc").Value)%>",
              srtdeel_image: "<%=safe.jsstring(fotopad)%>",
              srtdeel_maxbestel: <%=oRs("bes_srtdeel_maxbestel").Value%>,
              srtgroup_text: "<%=safe.jsstring(oRs("bes_srtgroep_omschrijving").Value)%>",
              amount: <%=safe.jsfloat(amount)%>,
              price: <%=safe.jsfloat(oRs("prijs").Value || 0)%>,
              btw: <%=safe.jsfloat(oRs("bes_srtdeel_btw").Value || 0)%>,
              eenheid: "<%=safe.jsstring(oRs("bes_srtdeel_eenheid").Value)%>",
              veelvoud: <%=safe.jsfloat(oRs("bes_srtdeel_veelvoud").Value || 1)%>,
              received: <%=safe.jsfloat(oRs("bes_bestelling_item_aantalontv").Value || 0)%>,
              retour: <%=safe.jsfloat(oRs("retour").Value)%>,
              item_key: <%=oRs("bes_bestelling_item_key").Value%>,
              objFlex: objFlex,
              // staffelgroep (-1=geen staffelgroep, 0=artikelkorting, >0=groepskorting met key van staffelgroep)
              staffelgroep: <%=oRs("staffelgroep").Value%>,
              bestelminimum: <%=safe.jsfloat(oRs("bes_srtdeel_minimum").Value || 0)%>,
              bestelmaximum: <%=safe.jsfloat(oRs("bes_srtdeel_maximum").Value || -1)%>,
              opmerking: "<%=safe.jsstring(oRs("bes_srtdeel_opmerking").Value || "")%>",
              urole: "<%=safe.jsstring(params.urole)%>",
              disc_key: <%=oRs("ins_discipline_key").Value%>,
              srtgroup_key: <%=oRs("bes_srtgroep_key").Value%>,
              auth: { canWriteBESBOF: <%=(bresult.canChangeLine?1:0)%> }
            };

<%
        oRs.moveNext();
      }
      oRs.close();
%>
  </script>
<%
  return isCorrectie;
}
%>
