<% /*
     $Revision$
     $Id$

    File:               res_cat.inc
    Description         functie make_cat maakt de tabel voor een enkele catering catalogus

    Parameters:
    Context:            vanuit resres_edit_objcat voor bestaande
                        Vanuit res_edit_objcat/res_plan.js ad hoc

*/

function make_cat(discipline_key, rsv_ruimte_key, existing_only, res_artikel_key) // existing begint compressed
{
  var any_noshow = false;

  // Zo snel mogelijk relevante basisinformatie opzoeken
  var sql = "SELECT COALESCE(ks.prs_kostensoort_btw, 0) inclBTW"
          + "  FROM prs_kostensoort ks"
          + "     , res_discipline rd"
          + " WHERE ks.prs_kostensoort_key = rd.prs_kostensoort_key"
          + "   AND rd.ins_discipline_key = " + discipline_key;
  var oRs = Oracle.Execute(sql);
  var inclBTW = (!oRs.eof? oRs("inclBTW").Value : 0);

  sql = "SELECT res_rsv_ruimte_van, res_rsv_ruimte_tot,"
      + "       res_rsv_ruimte_bezoekers, "
      + "       prs_kostenplaats_key"
      + "  FROM res_rsv_ruimte"
      + " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
  oRs = Oracle.Execute(sql);
  var res_van = new Date(oRs("res_rsv_ruimte_van").Value);
  var res_tot = new Date(oRs("res_rsv_ruimte_tot").Value);
  var res_vis = oRs("res_rsv_ruimte_bezoekers").Value;
  if (!kpl_ksrt_validate(oRs("prs_kostenplaats_key"), null, discipline_key))
  {
    %><script type="text/javascript">
        FcltMgr.alert(L("lcl_res_kpks_validatie"));
    </script>
    <%
    Response.End()
  }

  var this_res = res.func_enabled(rsv_ruimte_key, discipline_key); // wat mag ik zoal op deze catalogus
  //user.auth_required_or_abort(this_res.canChange);
  var backo = this_res.canWrite("WEB_RESBOF");
  var fronto = this_res.canWrite("WEB_RESFOF");

  if (!backo && !fronto && res_van < res.discipline_expire(discipline_key))
  { %>
    <script type="text/javascript">
      FcltMgr.alert("<%=safe.jsstring(L("lcl_res_lastmin") + L("lcl_res_only_chance_after") + toDateTimeString(res.discipline_expire(discipline_key)))%>");
    </script>
<%
    Response.End()
  }
  oRs.Close()

  hour1 = res_van.getHours();
  min1  = res_van.getMinutes();

  // Haal bestaande gereserveerde artikelen op inclusief eventueel meegegeven artikel via res_artikel_key parameter
  var existing_res = new Array();
  sql_a = "SELECT res_artikel_key"
        + "     , res_rsv_artikel_key"
        + "     , res_rsv_artikel_aantal"
        + "     , res_rsv_artikel_levering"
        + "     , res_rsv_artikel_prijs"
        + "     , res_rsv_artikel_dirtlevel"
        + "     , res_status_BO_key"
        + "     , ROW_NUMBER() OVER (PARTITION BY res_artikel_key ORDER BY res_rsv_artikel_key) volgnr"
        + "  FROM (SELECT r_r_art.res_artikel_key"
                + "     , r_r_art.res_rsv_artikel_key"
                + "     , r_r_art.res_rsv_artikel_aantal"
                + "     , r_r_art.res_rsv_artikel_levering"
                + "     , r_r_art.res_rsv_artikel_prijs"
                + "     , r_r_art.res_rsv_artikel_dirtlevel"
                + "     , r_r_art.res_status_BO_key"
                + "  FROM res_v_aanwezigartikel r_art"
                + "     , res_v_aanwezigrsv_artikel r_r_art"
                + " WHERE r_r_art.res_rsv_ruimte_key = " + rsv_ruimte_key
                + "   AND r_art.res_discipline_key = " + discipline_key
                + "   AND r_r_art.res_artikel_key = r_art.res_artikel_key"
                + (res_artikel_key > 0
                  ? " UNION" // Meegegeven artikel via res_artikel_key parameter
                +" SELECT r_art.res_artikel_key"
                + "     , NULL"
                + "     , 0"
                + "     , NULL"
                + "     , NULL"
                + "     , 0"
                + "     , NULL"
                + "  FROM res_v_aanwezigartikel r_art"
                + " WHERE r_art.res_artikel_key = " + res_artikel_key
                + "   AND r_art.res_discipline_key = " + discipline_key // Artikel moet wel tot de juiste discipline behoren
                  : "")
                + " ORDER BY res_artikel_key, res_rsv_artikel_levering"
                + ")";

  oRs_a = Oracle.Execute(sql_a);
  var first = true;
  var res_artikel_key_str = "";
  while (!oRs_a.eof)
  {
    existing_res.push({ artikel_key         : oRs_a("res_artikel_key").Value,
                        rsv_artikel_key     : oRs_a("res_rsv_artikel_key").Value,
                        rsv_artikel_aantal  : oRs_a("res_rsv_artikel_aantal").Value,
                        rsv_artikel_levering: new Date(oRs_a("res_rsv_artikel_levering").Value),
                        rsv_artikel_prijs   : oRs_a("res_rsv_artikel_prijs").Value,
                        status_BO_key       : oRs_a("res_status_BO_key").Value
                      });
    res_artikel_key_str += (first? "" : ", ") + oRs_a("res_artikel_key").Value;
    first = false;
    oRs_a.MoveNext();
  }
  oRs_a.close();

  var ora_date1 = res_van.beginToSQL();
  var res_start_date = res_van.toSQL(true);
  var res_end_date = res_tot.toSQL(true);
  // Alle mogelijke artikelen
  sql = "SELECT ra.res_artikel_key"
      + "     , " + lcl.xsql('ra.res_artikel_omschrijving', 'ra.res_artikel_key') + " ||"
        + "          CASE"
        + "          WHEN (ra.res_artikel_ingangsdatum IS NULL OR ra.res_artikel_ingangsdatum <= SYSDATE) AND"
        + "               (ra.res_artikel_vervaldatum IS NULL OR ra.res_artikel_vervaldatum > SYSDATE)"
        + "          THEN ''"
        + "          ELSE " + safe.quoted_sql(L("lcl_inactive_data_suffix"))
        + "          END res_artikel_omschrijving"
      + "     , " + lcl.xsqla('ra.res_artikel_opmerking', 'ra.res_artikel_key')
      + "     , res_artikel_image"
      + "     ,      COALESCE(ra.res_artikel_default, 0) res_artikel_default"
      + "     , CASE"  // Toon de flexibele prijs of vaste prijs.
        + "     WHEN (ra.res_artikel_prijs_vast = 0)"
        + "     THEN COALESCE(aa.res_rsv_artikel_prijs / aa.res_rsv_artikel_aantal, ra.res_artikel_prijs)"
        + "     ELSE ra.res_artikel_prijs"
        + "     END prijs"
      + "     , " + lcl.xsqla('ra.res_artikel_eenheid', 'ra.res_artikel_key')
      + "     ,      ra.res_artikel_prijs_vast"
      + "     , CASE"
        + "     WHEN (ra.res_artikel_ingangsdatum IS NULL OR ra.res_artikel_ingangsdatum <= " + ora_date1 + ")"
        + "     THEN 1"
        + "     ELSE 0"
        + "     END ingang"
      + "     , CASE"
        + "     WHEN (ra.res_artikel_vervaldatum IS NULL OR ra.res_artikel_vervaldatum > " + ora_date1 + ")"
        + "     THEN 1"
        + "     ELSE 0"
        + "     END verval"
      + "     , aa.res_rsv_artikel_dirtlevel"
      + "     , COALESCE(ra.res_artikel_minimum, 0) res_artikel_minimum"
      + "     , ra.res_artikel_flags"
      + "     , COALESCE(ra.res_artikel_begintijd, " + S("res_t1") + ") res_artikel_begintijd"
      + "     , COALESCE(ra.res_artikel_eindtijd, " + S("res_t2") + ") res_artikel_eindtijd"
      + "     , aa.res_rsv_artikel_key"
      + "     , aa.res_rsv_artikel_aantal"
      + "     , aa.res_rsv_artikel_levering"
      + "     , aa.res_rsv_artikel_prijs"
      + "     , aa.res_status_BO_key"
      + "     , COALESCE(aa.volgnr, ra.res_artikel_flags) volgnr"
      + "  FROM res_v_aanwezigartikel ra"
      + "     , (" + sql_a + ") aa"
      + " WHERE (ra.res_discipline_key = " + discipline_key
      + "   AND aa.res_artikel_key(+) = ra.res_artikel_key"
      + "   AND (ra.res_artikel_ingangsdatum IS NULL OR ra.res_artikel_ingangsdatum <= " + ora_date1 + ")"
      + "   AND (ra.res_artikel_vervaldatum IS NULL OR ra.res_artikel_vervaldatum > " + ora_date1 + "))"
      // Kijken of een artikel in de reserveringstijd gekozen kan worden. Anders niet tonen.
      // 1) Begintijd artikel <= einde reservering.
      // 2) Eindtijd artikel >= begin reservering.
      + "   AND " + ora_date1 + " + COALESCE(ra.res_artikel_begintijd, " + S("res_t1") + ") / 24 <= " + res_end_date
      + "   AND " + ora_date1 + " + COALESCE(ra.res_artikel_eindtijd, " + S("res_t2") + ") / 24 >= " + res_start_date
      + " ORDER BY ra.res_artikel_volgnummer"
      + "        , " + lcl.xsql('ra.res_artikel_omschrijving', 'ra.res_artikel_key')
      + "        , aa.volgnr";

  oRs = Oracle.Execute(sql);

  if (!backo && res_van < res.discipline_expire(discipline_key))
    Response.Write(L("lcl_res_warnBO"));
%>

  <table cellspacing='0' id='table_dis<%=discipline_key%>' class='tab_cat_sched <%=existing_only?" compressed":""%>'
         catExpire="<%=res.discipline_expire(discipline_key).getTime()%>">
    <thead><tr>
      <th><%=L("lcl_object")%></th>
      <th><%=L("lcl_count")%></th>
      <th><%=L("lcl_r_price5") + " " + (inclBTW? L("lcl_shared_inclBTW") : L("lcl_shared_exclBTW"))%></th>
      <th><%=L("lcl_r_price7")%></th>
      <th colspan="2"><%=L("lcl_time")%></th>
    </tr></thead>
    <tbody>
<%
    while (!oRs.eof)
    {
      var art_text= oRs("res_artikel_omschrijving").Value + (oRs("res_artikel_eenheid").Value? " (" + oRs("res_artikel_eenheid").Value + ")" : "");
      var ch = res_van.getHours();
      var cm = res_van.getMinutes();
      var aantal = oRs("res_artikel_default")*res_vis;
      var cprice = oRs("prijs").Value; // catalogusprijs
      var cpricefix = (backo ? oRs("res_artikel_prijs_vast").Value : 1);
      var cstatus_reado =  false;
      var ingang = oRs("ingang").Value;
      var verval = oRs("verval").Value;
      var dirty = oRs("res_rsv_artikel_dirtlevel").Value & (res.dirtlevel.artikel.notavailable | res.dirtlevel.artikel.notallowed);
      var minimum = oRs("res_artikel_minimum").Value;
      var resflag = oRs("res_artikel_flags").Value == 1;
      var begintijd = oRs("res_artikel_begintijd").Value;
      var eindtijd = oRs("res_artikel_eindtijd").Value;
      var art_key = oRs("res_artikel_key").Value;
      var rsv_art_key = oRs("res_rsv_artikel_key").Value || 0;
      var volgnr  = oRs("volgnr").Value;
      var art_str = art_key + "_" + rsv_art_key;

      // Zoek of ons artikel al gereserveerd was: dan nemen we het oude tijdstip en aantal over
      var existing = false; // zodadelijk highlighten
      for (j = 0; j < existing_res.length; j++)
      {
        if (existing_res[j].artikel_key == oRs("res_artikel_key").Value && existing_res[j].rsv_artikel_key == oRs("res_rsv_artikel_key").Value)
        {
          existing = true;

          aantal = existing_res[j].rsv_artikel_aantal;
          if (aantal > 0)
          { // Gereserveerd artikel. Gebruik opgeslagen gegevens.
            ch = existing_res[j].rsv_artikel_levering.getHours();
            cm = existing_res[j].rsv_artikel_levering.getMinutes();
            // De opgeslagen prijs nemen uit res_rsv_artikel als:
            // 1) de prijs vrij invulbaar is.
            // 2) de deelreservering afgemeld is en de opgeslagen prijs bevroren is.
            if ((cpricefix == 0 || existing_res[j].status_BO_key >= 5) && existing_res[j].rsv_artikel_prijs != null)
              cprice = existing_res[j].rsv_artikel_prijs / aantal;
            if (existing_res[j].status_BO_key==6) cstatus_reado =  true;
          }
        }
      }
      any_noshow = any_noshow || (existing_only && !existing); // die hidden we initieel namelijk
      ch = (ch<10?'0'+ch:ch);
      cm = (cm<10?'0'+cm:cm);

%>    <tr id='row<%=art_key%>'
          class="catline <%=(ingang == 0 || verval == 0 || dirty? " res_fatal " : "")%> <%=(existing? " existing" : " notexisting")%>"
          >
<%
        // artikel_opmerking in popupje tonen
        var safe_tooltip = "<b>" + safe.html(oRs("res_artikel_omschrijving").Value) + ":</b><br>";
        if (oRs("res_artikel_image").Value)
        {
            var image_url = S("res_image_path") + "artikel/" + oRs("res_artikel_image").Value;
            safe_tooltip += "<img class='resartikelfoto' style='height:100px' theSrc='"+safe.htmlattr(image_url)+"'><br>"
        }

        // Over de opmerking doen we geen safe.html zodat HTML code gebruikt kan worden
        // Voor het gemak wel \n --> <br>
        if (oRs("res_artikel_image").Value || oRs("res_artikel_opmerking").Value)
        {
          safe_tooltip += String(oRs("res_artikel_opmerking").Value||"").replace(/\n/g, "<br>");

%>        <td class="label"
              OnMouseOver="showOpmerking('#remark_cat<%=art_key%>', event);"
              OnMouseOut="$('#remark_cat<%=art_key%>').hide();">
            <label <%=(ingang == 0 || verval == 0?'style="margin-left:20px;"':'')%>><%=safe.html(art_text)%></label>
            <div class="res_remark" id="remark_cat<%=art_key%>">
              <%=safe_tooltip%>
            </div>
          </td>
<%      }
        else
        { /* heel simpel */ %>
          <td class="label"><label><%=safe.html(art_text)%></label></td>
<%      } %>
        <td>
          <input type='number' id="inpb_c_<%=art_str%>"
                 class='fld_catamount'
                 name="inpb_c_<%=art_str%>"
                 value="<%=aantal%>"
                 minimum="<%=minimum%>"
                 size="4"
                 <%=(cstatus_reado? "readonly style='background-color: #dddddd;' " : "")%>
                 onblur='showTotPriceArt_ex(this);'>
<%        if (existing && aantal == 0)
          { /* Cursor in het aantal veld van meegegeven artikel (res_artikel_key) */
%>          <script type="text/javascript">
              jQuery(document).ready(function()
                                     {
                                       $("#inpb_c_<%=art_str%>").select();
                                     });
            </script>
<%        } %>
        </td>
        <td>
<%        // Voeg prijs en totaalprijs toe
          if (cpricefix == 1 || cstatus_reado || !backo)
            RWFIELD("inpbp_c_" + art_str, "rescat_p_c", null, !isNaN(cprice)? safe.curr(cprice) : "0", { readonly: true })
          else
            RWFIELD("inpbp_c_" + art_str, "rescat_p_c", null, !isNaN(cprice)? safe.curreditable(cprice) : "0",
                    {datatype: "number",  html: "size=9 onfocus='this.select()' onblur='showTotPriceArt_ex(this);'" });
%>
        </td>
        <td>
<%        RWFIELD("inpbtp_c_" + art_str, "rescat_tp_c", null, !isNaN(cprice * aantal)? safe.curr(cprice * aantal) : "0", { readonly: true }); %>
        </td>

        <td>
          <input type='number' id='inpbh1_c_<%=art_str%>'
                 class='fld_cattime'
                 name='inpbh1_c_<%=art_str%>'
                 value='<%=ch%>'
                 maxlength='2' size='2'
                 <%=(cstatus_reado? "readonly style='background-color: #dddddd;' " : "")%>>
          <input type="hidden" id="inpbb1_c_<%=art_str%>" value="<%=safe.jsfloat(begintijd)%>">
          <input type="hidden" id="inpbe1_c_<%=art_str%>" value="<%=safe.jsfloat(eindtijd)%>">
        </td>
        <td>
          <input type='number' id='inpbm1_c_<%=art_str%>'
                 class='fld_cattime'
                 name='inpbm1_c_<%=art_str%>'
                 value='<%=cm%>'
                 maxlength='2' size='2'
                 <%=(cstatus_reado?"readonly style='background-color: #dddddd;' ":"")%>>
        </td>
<%
        if (resflag && volgnr==1)
        {
%>
        <td>
          <input type='button' id='btnmore_<%=art_key%>' name='btnmore_<%=art_key%>' value='<%=L("lcl_res_add_catering")%>'
                 class="addcatering"
                 onclick="res_addcat(this)"
                 title="<%=safe.html(L("lcl_res_add_catering_remark"))%>"
                 >
        </td>
<%
        }
%>
      </tr>
<%
      oRs.MoveNext();
    }
%>
    </tbody>
  </table><%
  if (any_noshow)
  { %>
    <div class="resplanbordlimited" onclick="$('#table_dis<%=discipline_key%>').removeClass('compressed');$(this).toggle();FcltMgr.resized(window)">
        <a><%=L("lcl_res_show_full_cat_catalogus")%></a>
    </div>
<%
  }
}
%>

