<%@ language = "JavaScript" %>
<% /*
     $Revision$
     $Id$

    File:               res_show_objcat.asp (oude rsv_voorziening_view.inc)
    Description:        Show the objects en voorzieningen of a reservation part
    Parameters:
        res_rsv_ruimte  RES_RSV_RUIMTE_KEY, de deelreservering
    Context:
        in een frame binnen het reserveringsscherm
        in de inline?

*/
%>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="../Shared/resultset_table_v2.inc" -->
<!-- #include file="../ins/ins.inc" -->
<!-- #include file="./res.inc" -->
<!-- #include file="res_flexkenmerk_art.inc" -->

<%
FCLTHeader.Requires({ js: [],
                      css: [rooturl + "/appl/res/res.css"] });

var urole          = getQParamSafe("urole");
var rsv_ruimte_key = getQParamInt("rsv_ruimte_key");
var embedded       = getQParamInt("embedded", 0) == 1;
var verynew        = getQParamInt("verynew", 0) == 1;

var this_res = res.func_enabled(rsv_ruimte_key); // Wat heb ik zoal aan rechten op deze specifieke reservering
user.auth_required_or_abort(this_res.canReadAny);

// Finds required res_kenmerken (regular or of type 'M'(bijlagen))
// that are either missing or have no value for a specific reservation.

var mywriterolcode = 0 + (this_res.canWrite("WEB_RESUSE") ? 1 : 0)
                       + (this_res.canWrite("WEB_RESFOF") ? 2 : 0)
                       + (this_res.canWrite("WEB_RESBOF") ? 4 : 0);

var sql = "SELECT COUNT (*) amount"
        + "  FROM res_rsv_ruimte  rrr"
        + "       JOIN res_activiteit ra"
        + "           ON rrr.res_activiteit_key = ra.res_activiteit_key"
        + "       JOIN res_kenmerk rk ON rk.res_activiteit_key = ra.res_activiteit_key"
        + "       LEFT JOIN res_kenmerkwaarde rkw"
        + "           ON     rk.res_kenmerk_key = rkw.res_kenmerk_key"
        + "              AND rrr.res_rsv_ruimte_key = rkw.res_rsv_ruimte_key"
        + "       LEFT JOIN"
        + "       (  SELECT fac_bijlagen_refkey,"
        + "                 fac_bijlagen_kenmerk_key,"
        + "                 COUNT (*)     AS aantal"
        + "            FROM fac_bijlagen"
        + "           WHERE fac_bijlagen_module = 'RES'"
        + "        GROUP BY fac_bijlagen_refkey, fac_bijlagen_kenmerk_key) bijlagen"
        + "           ON     rrr.res_rsv_ruimte_key = bijlagen.fac_bijlagen_refkey"
        + "              AND rk.res_kenmerk_key = bijlagen.fac_bijlagen_kenmerk_key"
        + "       JOIN res_srtkenmerk rsk"
        + "           ON rk.res_srtkenmerk_key = rsk.res_srtkenmerk_key"
        + " WHERE     rrr.res_rsv_ruimte_key = " + rsv_ruimte_key
        + "       AND rk.res_kenmerk_verplicht = 1"
        + "       AND rk.res_kenmerk_verwijder IS NULL"
        + "       AND BITAND(rk.res_kenmerk_rolcode, " + mywriterolcode + ") > 0"
        + "       AND rk.res_kenmerk_show_expr IS NULL" // We gaan deze niet inline evalueren; als er een show-expressie bestaat, sluiten we deze uit
        + "       AND rk.fac_functie_key IS NULL" // Idem; We gaan deze niet inline evalueren; als er een extra autorisatie bestaat, sluiten we deze uit
        + "       AND (rk.res_kenmerk_toonbaar IS NULL OR rk.res_kenmerk_toonbaar = 0)" // Volgens mij altijd NULL of 1, maar voor de zekerheid ..
        + "       AND rsk.res_srtkenmerk_kenmerktype NOT IN ('L', 'l', 'b', 'Q')"
        + "       AND (   (    rsk.res_srtkenmerk_kenmerktype = 'M'"
        + "                AND bijlagen.aantal IS NULL)"
        + "            OR (    rsk.res_srtkenmerk_kenmerktype != 'M'"
        + "                AND rkw.res_kenmerkreservering_waarde IS NULL))";
var oRs = Oracle.Execute(sql);
var hasMissingRequiredKenmerk = (oRs("amount").Value >= 1);
oRs.Close();

if(!hasMissingRequiredKenmerk) {
  // Merk op: (later) verwijderde records of parkeerplaatsen zouden we hier weer kunnen
  //          uitsluiten. Dat is echter al weer te complex/ licht risicovol
  cache.whenNoRecords("SELECT 1 FROM res_rsv_deel WHERE res_rsv_ruimte_key = " + rsv_ruimte_key
                    + " UNION ALL SELECT 1 FROM res_rsv_artikel WHERE res_rsv_ruimte_key = " + rsv_ruimte_key);
}

res.res_set_dialect(rsv_ruimte_key);

var resdeleted = this_res.rsv_ruimte_verwijder != null;

// Als res_rsv_ruimte_cat_appr 0 is hoeft er niet gefiatteerd te worden, zelfs niet als de drempel later is verlaagd.
var sql = "SELECT sa.res_srtactiviteit_prefix"
        + "     , rrr.res_reservering_key"
        + "     , rrr.res_rsv_ruimte_van"
        + "     , rrr.res_rsv_ruimte_tot"
        + "     , ro.res_ruimte_key"
        + "     , rrr.res_rsv_ruimte_volgnr"
        + "     , CASE"
        + "       WHEN sa.res_srtactiviteit_prefix IS NOT NULL"
        + "       THEN sa.res_srtactiviteit_prefix || ' '"
        + "       ELSE ''"
        + "       END"
        + "       || rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr resnrtxt"
        + "     , rrr.res_rsv_ruimte_cat_appr"
        + "     , sa.res_srtactiviteit_soort"
        + "  FROM res_rsv_ruimte rrr"
        + "     , res_activiteit ra"
        + "     , res_srtactiviteit sa"
        + "     , res_ruimte_opstelling ro"
        + " WHERE rrr.res_activiteit_key = ra.res_activiteit_key"
        + "   AND ra.res_srtactiviteit_key = sa.res_srtactiviteit_key"
        + "   AND rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key (+)"
        + "   AND rrr.res_rsv_ruimte_key = " + rsv_ruimte_key;
var oRs = Oracle.Execute(sql);
var server_res_van = new Date(oRs("res_rsv_ruimte_van").Value);
var server_res_tot = new Date(oRs("res_rsv_ruimte_tot").Value);
var res_ruimte_key = oRs("res_ruimte_key").Value;
var resnrtxt = oRs("resnrtxt").Value;
var hasFiat = oRs("res_rsv_ruimte_cat_appr").Value == 1;
var isCV = oRs("res_srtactiviteit_soort").Value == 1;
oRs.Close();

var local_tz = res.getRsvTimezone(rsv_ruimte_key);
function toLocalDate(expr) {
    return convertToLocalTimeSQL(expr, local_tz);
}

%>
<html>
  <head>
<%  FCLTHeader.Generate() %>
    <script>
      var anyDirty = false;
      var hasMissingRequiredKenmerk = <%=hasMissingRequiredKenmerk ? 1 : 0%>;

      function res_change()
      {
            if(hasMissingRequiredKenmerk) {
              FcltMgr.alert(L("lcl_shared_validator_missing"));
              window.parent.$("#frametabs").tabs({ "active": 0 });
            } else {
              if (FcltMgr.startEdit(window)) {
                var newurl = "res_edit_objcat.asp?urole=<%=this_res.canChangeUrole%>&rsv_ruimte_key=<%=rsv_ruimte_key%>&verynew=<%=verynew? 1 : 0%>&width_px=" + $(window).width();
                if (anyDirty && confirm (L("lcl_res_cleanup_invalid_objcat"))) // opschonen?
                {
                  var data = {
                              urole: "<%=urole%>",
                              rsv_ruimte_key: <%=rsv_ruimte_key%>
                            };
                  <% protectRequest.dataToken("data"); %>
                  $.post("res_cleanup.asp",
                          data,
                          FcltCallbackAndThen(function (data) {
                                anyDirty = false;
                                window.location.href = newurl;
                          }),"json");
                }
                else
                  window.location.href = newurl;
              }
          }
      }
      function res_fiatteren()
      { // Voor alle rsv_artikel regels het veld res_rsv_artikel_approved de waarde 1 geven.
        FcltMgr.confirm("<%=safe.jsstring(L("lcl_res_fiatteren_art").format(resnrtxt))%>", function()
        {
          var data = { rsv_ruimte_key: <%=rsv_ruimte_key%> };
          <% protectRequest.dataToken("data"); %>
          $.post("res_fiatteren.asp",
                 data,
                 FcltCallbackRefresh,
                 "json"
                );
        });
      }
      function res_afwijzen()
      { // Voor alle rsv_artikel regels het veld res_rsv_artikel_approved de waarde 2 geven.
        var subject = "<%=safe.jsstring(L("lcl_res_afwijzen_art").format(resnrtxt))%>";
        var url = "res_afwijzen.asp?rsv_ruimte_key=<%=rsv_ruimte_key%>";
        FcltMgr.openModalDetail(url, subject, {callback: window.parent.FcltMgr.reload });
      }
      function insCheckIn(row)
      {
          var rsv_deel_key = row.getAttribute("ROWKEY");
          FcltMgr.openDetail("appl/ins/ins_deel_free.asp?takein=1&rsv_deel_key="+rsv_deel_key,
                                          L("lcl_ins_insinn"), {callback: FcltMgr.reload});
      }

      function insCheckOut(row)
      {
          var rsv_deel_key = row.getAttribute("ROWKEY");
          FcltMgr.openDetail("appl/INS/ins_deel_free.asp?lendout=1&rsv_deel_key="+rsv_deel_key,
                                          L("lcl_ins_lend_out"), {callback: FcltMgr.reload});
      }

      // Uitleen flexkenmerken bewerken.
      function insAdapt(row)
      {
          var rsv_deel_key = row.getAttribute("ROWKEY");
          FcltMgr.openDetail("appl/ins/ins_deel_free.asp?adapt=1&rsv_deel_key="+rsv_deel_key,
                                          L("lcl_ins_adapt"), {callback: FcltMgr.reload});
      }
    </script>
  </head>

  <body class="listmode">
<%  var buttons = [];
    var multi_tz = local_tz != S("fac_server_timezone") || local_tz != Session("time_zone"); // Hebben we te maken met een ruimte, gebruiker of server in een afwijkende tijdszone?
    if (!multi_tz && this_res.canChangeCV)
      buttons.push( { title: (this_res.hasCV ? L("lcl_change") : L("lcl_add")), icon: (this_res.hasCV ? "fa-fclt-edit" : "fa-plus"), action: "res_change()"});
    if (this_res.canFiatteren)
      buttons.push( {title: L("lcl_approve"), icon: "fa-check", action: "res_fiatteren()"});
    if (this_res.canAfwijzen)
      buttons.push( {title: L("lcl_reject"), icon: "fa-times", action: "res_afwijzen()"});

    // Fast checks to see if we have any prices at all, to prevent superfluous column
    // We beschouwen dit nu als een businessrule: helemaal nergens bedragen. Mocht er behoefte
    // aan komen is het logisch dit per ins_discipline_min_level te bepalen (want die worden
    // nooit gecombineerd), maar verfijnder willen we niet.
    var sql = "SELECT ''"
            + "  FROM res_deel"
            + " WHERE (res_deel_prijs IS NOT NULL OR res_deel_prijs_vast = 0)"          // prijs is mogelijk
            + "   AND (res_deel_vervaldatum IS NULL OR res_deel_vervaldatum > SYSDATE)" // actueel relevant
            + "   AND res_deel_verwijder IS NULL";                                      // niet historisch
    var oRs = Oracle.Execute(sql);
    var anydeelprijs = !oRs.eof;
    oRs.close();
    sql = "SELECT ''"
            + "  FROM res_artikel"
            + " WHERE (res_artikel_prijs IS NOT NULL OR res_artikel_prijs_vast = 0)"
            + "   AND (res_artikel_vervaldatum IS NULL OR res_artikel_vervaldatum > SYSDATE)"
            + "   AND res_artikel_verwijder IS NULL";
    oRs = Oracle.Execute(sql);
    var anyartikelprijs = !oRs.eof;
    oRs.close();

    if (rsv_ruimte_key > 0)
      {
        var total_price = 0;
        var r_price = 0;

        function fnOmschrijving(oRs)
        {
          var returnval = "";

          // Voor objecten de autorisatie opvragen om eventueel door te kunnen klikken (omdat dat bij personen ook kan)
          var this_ins = {canReadAny: false};
          if (oRs("ins_deel_key").Value != null)  // alleen als res_deel is ins_deel
          {
            this_ins = ins.func_enabled_deel(oRs("ins_deel_key").Value);
            var action = "";  // default geen doorklik
            if (this_ins.canReadAny)
            {
              // doorklikbaar naar objectdetails, voor details of om uit te lenen
              if (oRs("ins_srtdeel_uitleenbaar").Value == 1 && this_ins.canWriteINSFOF)
                action = 'FcltMgr.openDetail("appl/ins/ins_deel.asp?urole=fo&ins_key=' + oRs('ins_deel_key').value + '"); FcltMgr.stopPropagation(event);';
              else
                action = 'FcltMgr.openDetail("appl/ins/ins_deel.asp?urole=bo&ins_key=' + oRs('ins_deel_key').value + '"); FcltMgr.stopPropagation(event);';
            }
            returnval = (action == "" ? safe.html(oRs("res_deel_omschrijving").value) + " "
                                      : "<a href='#' onclick='" + action + "'>" + safe.html(oRs("res_deel_omschrijving").value) + "</a> ")
                + (oRs("res_rsv_deel_prijs").value != 0 ? (oRs("inclBTW").value ? L("lcl_shared_inclBTW") : L("lcl_shared_exclBTW")) : "")
                + (oRs("verval").value == 0 ? L("lcl_inactive_data_suffix") : "");
          }
          else
          { //  persoonlijke resource
            // TODO: hier ook autorisatie checken of ik wel door mag klikken
            var action = 'FcltMgr.openDetail("appl/prs/prs_perslid.asp?urole=fe&prs_key=' + oRs('prs_perslid_key').value + '"); FcltMgr.stopPropagation(event);';
            returnval = "<a href='#' onclick='" + action + "'>" + safe.html(oRs("res_deel_omschrijving").value) + "</a> " + safe.html(oRs("prs_srtperslid_omschrijving").value) + " "
                + (oRs("res_rsv_deel_prijs").value != 0 ? (oRs("inclBTW").value? L("lcl_shared_inclBTW") : L("lcl_shared_exclBTW")) : "")
                + (oRs("verval").value == 0? L("lcl_inactive_data_suffix") : "");
          }

          return returnval;
        }

        function fnImage (oRs)
        {
            return oRs("ins_discipline_image").value ? I(oRs("ins_discipline_image").value+" fa-2x") : "";  // defaultje?
        }

        function fnVantijd(oRs)
        {
            var res_rsv_deel_van = oRs("local_res_rsv_deel_van").Value;
            var res_rsv_deel_tot = oRs("local_res_rsv_deel_tot").Value;

            // Als Van en Tot verschillen tonen we de datum erbij, anders alleen de tijd
            var vanDateString = (new Date(res_rsv_deel_tot).midnight().getTime() != new Date(res_rsv_deel_van).midnight().getTime()
                                ? toDateTimeString(res_rsv_deel_van, undefined, undefined, undefined, undefined, true)
                                : toTimeString(res_rsv_deel_van, undefined, true));
            if (oRs("vanbinnentijd").value == 0) {
                vanDateString = "<span class='outofbounds'>" + vanDateString + "</span>";
            }
            return vanDateString;
        }

        function fnTottijd(oRs)
        {
            var res_rsv_deel_van = oRs("local_res_rsv_deel_van").Value;
            var res_rsv_deel_tot = oRs("local_res_rsv_deel_tot").Value;

            // Als Van en Tot verschillen tonen we de datum erbij, anders alleen de tijd
            var totDateString = (new Date(res_rsv_deel_tot).midnight().getTime() != new Date(res_rsv_deel_van).midnight().getTime()
                                ? toDateTimeString(res_rsv_deel_tot, undefined, undefined, undefined, undefined, true)
                                : toTimeString(res_rsv_deel_tot, undefined, true));
            if (oRs("totbinnentijd").value == 0) {
                totDateString = "<span class='outofbounds'>" + totDateString + "</span>";
            }
            return totDateString;
        }

        function fnTijd(oRs)
        {
           if ( oRs("levbinnentijd").value == 1 )
                return toTimeString(new Date(oRs("res_rsv_artikel_levering").value));
           else
                return "<span class='outofbounds'>" + toTimeString(new Date(oRs("res_rsv_artikel_levering").value)) + "</span>";
        }

        function fnAfhaaltijd(oRs)
        {
            if (oRs("res_rsv_artikel_afhalen").Value != null)
            {
                return toTimeString(new Date(oRs("res_rsv_artikel_afhalen").Value));
            }
            else
            {
                return "";
            }
        }

        var anyDirty = false;
        function fnRowClassObj(oRs)
        {
            if (oRs("verval").value == 0 || oRs("res_rsv_deel_dirtlevel").value & (res.dirtlevel.deel.notavailable | res.dirtlevel.deel.notallowed))
            {
                anyDirty = true;
                return "res_fatal";
            }
            else
            {
                return "xx";
            }
        }

        function fnRowClassCat(oRs)
        {
            var active_artikel = (oRs("ingang").value == 1 && oRs("verval").value == 1);
            if (!active_artikel || (oRs("res_rsv_artikel_dirtlevel").value & (res.dirtlevel.artikel.notallowed)))
            {
                anyDirty = true;
                return "res_fatal";
            }
            else
                return "xx";
        }

        function fnrowActionEnabler(oRs)
        {
          var data = {eLendOut: false, eReceive: false, eAdapt: false };
          if (oRs("ins_srtdeel_uitleenbaar").Value == 1)
          {
            // TODO: We negeren de 3D scope vooralsnog. Veel te ingewikkeld met org-velden en dergelijke
            //       Eerst maar even praktijkgeluiden afwachten
            //       user.checkAutorisation cache't per discipline dus dat is te overzien.
            // LET OP: Hier dus de ins_discipline_key, niet de res_discipline_key
            var authparams = user.checkAutorisation("WEB_INSFOF", true, oRs("ins_discipline_key").Value);
            if (authparams && authparams.PRSwritelevel < 9)
            {
                data.eLendOut = oRs("ins_alg_ruimte_key_org").value == null;
                data.eReceive = !data.eLendOut;

                if (oRs("bewerkbaar").Value == 1)
                {
                  data.eAdapt = data.eReceive;
                }
            }
          }

          return data;
        }

var nonBulkFields = lcl.xsqla('rd.res_deel_omschrijving', 'rd.res_deel_key')
                 + "     , 0 total"
                 + "     , id.ins_alg_ruimte_key_org"
                 + "     , id.ins_deel_key"
                 + "     , id.ins_discipline_key"
                 + "     , ins_srtdeel_uitleenbaar"
                 + "     , rd.res_discipline_key"
                 + "     , d.ins_discipline_image"
                 + "     , " + lcl.xsqla("d.ins_discipline_omschrijving", "d.ins_discipline_key")
                 + "     , d.ins_discipline_volgnr"
                 + "     , rrd.res_rsv_deel_key"
                 + "     , rrd.res_rsv_deel_aantal"
                 + "     , res.getdeelprijs(rrd.res_rsv_deel_key) res_rsv_deel_prijs" // zou je achterwege kunnen laten als !anydeelprijs
                 + "     , rrd.res_rsv_deel_van"
                 + "     , rrd.res_rsv_deel_tot"
                 + "     , " + toLocalDate("rrd.res_rsv_deel_van") + " local_res_rsv_deel_van"
                 + "     , " + toLocalDate("rrd.res_rsv_deel_tot") + " local_res_rsv_deel_tot"
                 + "     , rrd.res_rsv_deel_dirtlevel"
                 + "     , CASE WHEN k.km900 > 0 THEN 1 ELSE 0 END bewerkbaar"
                 + "     , rrd.res_rsv_deel_verwijder ddVerwijder"
                 + "     , CASE "
                 + "          WHEN (rrd.res_rsv_deel_van BETWEEN res_rsv_ruimte_van"
                 + "                                         AND res_rsv_ruimte_tot"
                 + "               )"
                 + "             THEN 1"
                 + "          ELSE 0"
                 + "       END vanbinnentijd,"
                 + "       CASE "
                 + "          WHEN (rrd.res_rsv_deel_tot BETWEEN res_rsv_ruimte_van"
                 + "                                         AND res_rsv_ruimte_tot"
                 + "              )"
                 + "             THEN 1"
                 + "          ELSE 0"
                 + "       END totbinnentijd"
                 + "     , CASE WHEN id.ins_alg_ruimte_type_org IS NOT NULL AND ins_alg_ruimte_type = 'P'"
                 + "            THEN (SELECT pf.prs_perslid_naam_friendly"
                 + "                   FROM prs_v_perslid_fullnames_all pf"
                 + "                  WHERE pf.prs_perslid_key = id.ins_alg_ruimte_key)"
                 + "            WHEN id.ins_alg_ruimte_type_org IS NOT NULL AND ins_alg_ruimte_type = 'C'"
                 + "            THEN (SELECT c.prs_contactpersoon_naam"
                 + "                   FROM prs_contactpersoon c"
                 + "                  WHERE id.ins_alg_ruimte_key = c.prs_contactpersoon_key)"
                 + "       END eigenaar"
                 + "     , COALESCE (ks.prs_kostensoort_btw, 0) inclbtw"
                 + "     , CASE"
                   + "     WHEN (rd.res_deel_vervaldatum IS NULL OR rd.res_deel_vervaldatum > rr.res_rsv_ruimte_tot)"
                   + "     THEN 1"
                   + "     ELSE 0"
                   + "     END verval"
                 + "      , p.prs_perslid_key,"
                 + lcl.xsqla('sp.prs_srtperslid_omschrijving', 'p.prs_srtperslid_key')  // TODO, Diensten en zo, wat kan deze man?
                 + "     , 0 isbulk";
var bulkFields = " distinct "
                 + lcl.xsql('rd.res_deel_omschrijving', 'rd.res_deel_key') + " || ' (' || sel.selected || '/'  || cnt.total || ')'" + " res_deel_omschrijving"
                 + "     , cnt.total"
                 + "     , id.ins_alg_ruimte_key_org"
                 + "     , id.ins_deel_key"
                 + "     , id.ins_discipline_key"
                 + "     , ins_srtdeel_uitleenbaar"
                 + "     , rd.res_discipline_key"
                 + "     , d.ins_discipline_image"
                 + "     , " + lcl.xsqla("d.ins_discipline_omschrijving", "d.ins_discipline_key")
                 + "     , d.ins_discipline_volgnr"
                 + "     , rrd.res_rsv_deel_key"
                 + "     , rrd.res_rsv_deel_aantal"
                 + "     , sel.selected * res.getdeelprijs(rrd.res_rsv_deel_key) res_rsv_deel_prijs" // zou je achterwege kunnen laten als !anydeelprijs
                 + "     , rrd.res_rsv_deel_van"
                 + "     , rrd.res_rsv_deel_tot"
                 + "     , " + toLocalDate("rrd.res_rsv_deel_van") + " local_res_rsv_deel_van"
                 + "     , " + toLocalDate("rrd.res_rsv_deel_tot") + " local_res_rsv_deel_tot"
                 + "     , rrd.res_rsv_deel_dirtlevel"
                 + "     , CASE WHEN k.km900 > 0 THEN 1 ELSE 0 END bewerkbaar"
                 + "     , rrd.res_rsv_deel_verwijder ddVerwijder"
                 + "     , CASE "
                 + "          WHEN (rrd.res_rsv_deel_van BETWEEN res_rsv_ruimte_van"
                 + "                                         AND res_rsv_ruimte_tot"
                 + "               )"
                 + "             THEN 1"
                 + "          ELSE 0"
                 + "       END vanbinnentijd,"
                 + "       CASE "
                 + "          WHEN (rrd.res_rsv_deel_tot BETWEEN res_rsv_ruimte_van"
                 + "                                         AND res_rsv_ruimte_tot"
                 + "              )"
                 + "             THEN 1"
                 + "          ELSE 0"
                 + "       END totbinnentijd"
                 + "     , CASE WHEN id.ins_alg_ruimte_type_org IS NOT NULL AND ins_alg_ruimte_type = 'P'"
                 + "            THEN (SELECT pf.prs_perslid_naam_friendly"
                 + "                   FROM prs_v_perslid_fullnames_all pf"
                 + "                  WHERE pf.prs_perslid_key = id.ins_alg_ruimte_key)"
                 + "            WHEN id.ins_alg_ruimte_type_org IS NOT NULL AND ins_alg_ruimte_type = 'C'"
                 + "            THEN (SELECT c.prs_contactpersoon_naam"
                 + "                   FROM prs_contactpersoon c"
                 + "                  WHERE id.ins_alg_ruimte_key = c.prs_contactpersoon_key)"
                 + "       END eigenaar"
                 + "     , COALESCE (ks.prs_kostensoort_btw, 0) inclbtw"
                 + "     , CASE"
                   + "     WHEN (rd.res_deel_vervaldatum IS NULL OR rd.res_deel_vervaldatum > rr.res_rsv_ruimte_tot)"
                   + "     THEN 1"
                   + "     ELSE 0"
                   + "     END verval"
                 + "      , p.prs_perslid_key,"
                 + lcl.xsqla('sp.prs_srtperslid_omschrijving', 'p.prs_srtperslid_key')  // Later: evt Diensten en zo, wat kan deze man?
                 + "     , 1 isbulk";

        var sql1 = "SELECT {0}"
                 + "  FROM res_rsv_deel rrd"
                 + "     , res_rsv_ruimte rr"
                 + "     , res_deel rd"
                 + "     , res_discipline d"
                 + "     , prs_kostensoort ks"
                 + "     , ins_deel id"
                 + "     , prs_perslid p"
                 + "     , prs_srtperslid sp"
                 + "     , ins_srtdeel isd"
                 + "{1}"
                 + "     , (  SELECT sd.ins_srtdeel_key"
                 + "               , COUNT (km.ins_kenmerk_rolcode) km900"  // kolomalias is historisch, maar zo gelaten
                 + "            FROM ins_srtkenmerk sk"
                 + "               , ins_kenmerk km"
                 + "               , ins_srtdeel sd"
                 + "               , ins_srtgroep gr"
                 + "           WHERE km.ins_srtkenmerk_key = sk.ins_srtkenmerk_key"
                 + "             AND gr.ins_srtgroep_key = sd.ins_srtgroep_key"
                 + "             AND km.ins_kenmerk_verwijder IS NULL"
                 + "             AND sk.ins_srtkenmerk_verwijder IS NULL"
                 + "              AND ( (km.ins_srtinstallatie_key = sd.ins_srtdeel_key"
                 + "                 AND km.ins_kenmerk_niveau = 'S')"
                 + "                OR (km.ins_srtinstallatie_key = sd.ins_srtgroep_key"
                 + "                  AND km.ins_kenmerk_niveau = 'G')"
                 + "                OR (km.ins_srtinstallatie_key = gr.ins_discipline_key"
                 + "                  AND km.ins_kenmerk_niveau = 'D'))"
                 + "              AND BITAND(km.ins_kenmerk_rolcode,4) = 4"  // uitleenkenmerken
                 + "         GROUP BY sd.ins_srtdeel_key) k"
                 + " WHERE rrd.res_rsv_ruimte_key = rr.res_rsv_ruimte_key"
                 + "   AND rr.res_rsv_ruimte_key = " + rsv_ruimte_key
                 + "   AND id.ins_deel_key(+) = rd.res_ins_deel_key" // outer join voor als het een res_prs_perslid_key is
                 + "   AND p.prs_perslid_key(+) = rd.res_prs_perslid_key" // outer join voor als het een res_ins_deel_key is
                 + "   AND sp.prs_srtperslid_key(+) = p.prs_srtperslid_key" // outer join voor als het een res_ins_deel_key is
                 + "   AND rrd.res_deel_key = rd.res_deel_key"
                 + "   AND ks.prs_kostensoort_key(+) = d.prs_kostensoort_key"
                 + "   AND d.ins_discipline_key = rd.res_discipline_key"
                 + "   AND id.ins_srtdeel_key = isd.ins_srtdeel_key(+)"
                 + (S("vis_parking_key") != -1 ? " AND rd.res_discipline_key != " + S("vis_parking_key") : "")
                 + (!resdeleted? " AND rrd.res_rsv_deel_verwijder IS NULL" : "")
                 + "   AND isd.ins_srtdeel_key = k.ins_srtdeel_key(+)"
        // temp table for count of bulk-items on unique description
        var sqlBulkCount = ", ("
                         + "     SELECT distinct"
                         + "         oms.res_deel_omschrijving,"
                         + "         COUNT(oms.res_deel_omschrijving) total,"
                         + "         oms.res_deel_key,"
                         + "         oms.res_ins_deel_key ins_deel_key"
                         + "     FROM"
                         + "         ("
                         + "             SELECT"
                         + "                 distinct res_deel_omschrijving, res_deel_key, res_ins_deel_key"
                         + "             FROM"
                         + "                 res_v_aanwezigdeel rx"
                         + "             WHERE"
                         + "                 res_deel_bulkreserveerbaar = 1"
                         + "                 AND rx.res_deel_key IN (SELECT ry.res_deel_key FROM res_v_aanwezigdeel ry WHERE rx.res_deel_omschrijving = ry.res_deel_omschrijving)"
                         + "                 AND res_deel_key IN ( " + sql1.format("rd.res_deel_key", "") + " )"
                         + "         ) oms,"
                         + "         res_v_aanwezigdeel r1"
                         + "     WHERE"
                         + "         oms.res_deel_omschrijving = r1.res_deel_omschrijving"
                         + "               AND r1.res_deel_key NOT IN ("
                         + "                                           SELECT distinct rrd.res_deel_key"
                         + "                                             FROM res_rsv_ruimte rrr, res_rsv_deel rrd, res_deel rd"
                         + "                                            WHERE     (   rrr.res_rsv_ruimte_van BETWEEN TO_DATE (" + server_res_van.toSQL(true) + ")"
                         + "                                                                                     AND TO_DATE (" + server_res_tot.toSQL(true) + ")"
                         + "                                                       OR rrr.res_rsv_ruimte_tot BETWEEN TO_DATE (" + server_res_van.toSQL(true) + ")"
                         + "                                                                                     AND TO_DATE (" + server_res_tot.toSQL(true) + "))"
                         + "                                                  AND rrr.res_rsv_ruimte_key <> " + rsv_ruimte_key
                         + "                                                  AND rrd.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key"
                         + "                                                  AND rrd.res_deel_key = rd.res_deel_key"
                         + "                                                  AND rd.res_deel_bulkreserveerbaar = 1"
                         + "                                          )"
                         + "     GROUP BY"
                         + "         oms.res_deel_omschrijving,"
                         + "         oms.res_deel_key,"
                         + "         oms.res_ins_deel_key"
                         + "   ) cnt";
        // temp table for count of (selected) bulk-items on unique description
        var sqlSelectedCount = ", ("
                         + "  SELECT DISTINCT oms.res_deel_omschrijving,"
                         + "                    COUNT (oms.res_deel_omschrijving) selected,"
                         + "                    oms.res_deel_key,"
                         + "                    oms.res_ins_deel_key ins_deel_key"
                         + "      FROM (SELECT DISTINCT"
                         + "                   rx.res_deel_omschrijving, rx.res_deel_key, rx.res_ins_deel_key"
                         + "              FROM res_deel rx, res_rsv_deel rrd"
                         + "             WHERE     rx.res_deel_bulkreserveerbaar = 1"
                         + "               AND rx.res_deel_key IN (SELECT min(ry.res_deel_key)"
                         + "                                         FROM res_v_aanwezigdeel ry, res_rsv_deel rrdy"
                         + "                                        WHERE rx.res_deel_omschrijving = ry.res_deel_omschrijving"
                         + "                                          AND ry.res_deel_key = rrdy.res_deel_key"
                         + "                                          AND rrdy.res_rsv_ruimte_key = " + rsv_ruimte_key + ")"
                         + "               AND rx.res_deel_key = rrd.res_deel_key"
                         + "               AND rrd.res_rsv_ruimte_key = " + rsv_ruimte_key + ") oms,"
                         + "           res_v_aanwezigdeel r1, res_rsv_deel rrd1"
                         + "     WHERE oms.res_deel_omschrijving = r1.res_deel_omschrijving"
                         + "               AND r1.res_deel_key = rrd1.res_deel_key"
                         + "               AND rrd1.res_rsv_ruimte_key = " + rsv_ruimte_key
                         + "     GROUP BY oms.res_deel_omschrijving,"
                         + "           oms.res_deel_key,"
                         + "           oms.res_ins_deel_key"
                         + "   ) sel";
          var sqlComplete = sql1.format(nonBulkFields, "")
                        + " AND rd.res_deel_bulkreserveerbaar = 0"
                        + " UNION ALL "
                        + sql1.format(bulkFields, sqlBulkCount + sqlSelectedCount)
                        + " AND rd.res_deel_bulkreserveerbaar = 1"
                        + " AND rd.res_deel_omschrijving = cnt.res_deel_omschrijving (+)"
                        + " AND rd.res_deel_key = sel.res_deel_key "
                        + "  ORDER BY ins_discipline_volgnr, 1";

        // Niet super efficient maar ach....
        var oRs = Oracle.Execute("SELECT COUNT(*) FROM (" + sqlComplete + ") WHERE ins_srtdeel_uitleenbaar = 1" );
        var ErisUitleenbaar = oRs(0).value > 0;
        // Leesrechten WEB_INSFOF is grof maar beter dan niets
        var showUitleenbaar = ErisUitleenbaar && user.checkAutorisation("WEB_INSFOF", true);
        oRs.Close();

        // Moet de fiatteur boven in de titel van het iframe getoond worden.
        var fiatteur = "";
        // Moet de gehele catering (opnieuw) gefiatteerd worden?
        // In de setting velden res_rsv_artikel_approved en res_rsv_ruimte_cat_appr opnieuw staat aangegeven of er (opnieuw) gefiatteerd dient te worden
        // Setting veld res_rsv_artikel_approved: Catalogus artikelen dienen gefiatteerd te worden 0=Nee, 1=Ja.
        // Setting veld res_rsv_ruimte_cat_appr: Artikel is 0=Niet gefiatteerd, 1=Goedgekeurd, 2=Afgewezen.
        var sql_a = "SELECT rr.res_rsv_ruimte_omschrijving"
                  + "     , rr.res_rsv_ruimte_cat_appr"
                  + "     , ra.res_rsv_artikel_approved"
                  + "  FROM res_rsv_ruimte rr"
                  + "     , res_rsv_artikel ra"
                  + " WHERE rr.res_rsv_ruimte_key = ra.res_rsv_ruimte_key"
                  + "  AND rr.res_rsv_ruimte_key = " + rsv_ruimte_key;
        oRs_a = Oracle.Execute(sql_a);
        var approve = false;
        while (!oRs_a.Eof)
        {
          approve = approve || (oRs_a("res_rsv_ruimte_cat_appr").Value == 1 && oRs_a("res_rsv_artikel_approved").Value == 0);
          oRs_a.MoveNext();
        }
        oRs_a.Close();

        if (approve)
        {
          var sql_b = "SELECT COALESCE(kp.prs_perslid_key, -1) budgethouder_key"
                    + "  FROM res_rsv_ruimte rr"
                    + "     , prs_kostenplaats kp"
                    + " WHERE rr.prs_kostenplaats_key = kp.prs_kostenplaats_key"
                    + "   AND rr.res_rsv_ruimte_key = " + rsv_ruimte_key
          var oRs_b  = Oracle.Execute(sql_b);
          if (!oRs_b.eof)
          {
            var budgethouder_key = oRs_b("budgethouder_key").Value;
            if (budgethouder_key > 0)
            {
              var budgethouder = new Perslid(budgethouder_key);
              fiatteur = " (" + L("lcl_res_approver") + ": " + budgethouder.naam() + ")";
            }
            else
              fiatteur = " (" + L("lcl_res_no_fiatteur_known") + ")";
          }
          oRs_b.Close();
        }

        buttons.push({ icon: "fa-fclt-refresh", title: L("lcl_refresh"), action: "FcltMgr.reload()" });

        var rst1 = new ResultsetTable({sql: sqlComplete,
                                       rstableCount: 2,
                                       rstableNr: 1,
                                       keyColumn: "res_rsv_deel_key",
                                       ID: "resvtable" + (embedded? "tiny" : ""),
                                       noPrint: true,
                                       rowClass: fnRowClassObj,
                                       rowActionEnabler: fnrowActionEnabler,
                                       summaryShow: function () {},
                                       emptySetString : L("lcl_no_objects"),
                                       title: L("lcl_res_frame_voorziening") + fiatteur,
                                       buttons: (this_res.rsv_ruimte_verwijder != null? null : buttons)
                                      });
        rst1.addColumn(new Column({caption: "", content: fnImage, tooltip: "ins_discipline_omschrijving"}));
        rst1.addColumn(new Column({caption: L("lcl_reserved_object"), content: fnOmschrijving}));
        if (showUitleenbaar)
            rst1.addColumn(new Column({caption: L("lcl_ins_lent_res"), content: "eigenaar", hasActions: true }));
        rst1.addColumn(new Column({caption: L("lcl_from"), content: fnVantijd, align:"center"}));
        rst1.addColumn(new Column({caption:L("lcl_to"), content: fnTottijd, align:"center"}));
        if (anydeelprijs)
          rst1.addColumn(new Column({caption: L("lcl_r_price5"), content: "res_rsv_deel_prijs", datatype: "currency"}));
        if (resdeleted)
          rst1.addColumn(new Column({caption:L("lcl_deleted"), content: "ddVerwijder", datatype: "datetime"}));

        if (showUitleenbaar)
        {
            rst1.addAction({ action: "insCheckOut", caption: L("lcl_obj_lend_out"), enabler: "eLendOut", multi: true });
            rst1.addAction({ action: "insCheckIn", caption: L("lcl_obj_receive"), enabler: "eReceive", multi: true });
            rst1.addAction({ action: "insAdapt", caption: L("lcl_ins_adapt"), enabler: "eAdapt"});
        }

        function fncolFiat(oRs)
        { // Als res_rsv_ruimte_cat_appr 0 is, dan wordt deze functie niet aangeroepen. Dus de controle "res_rsv_ruimte_cat_appr == 0" hoeft hier niet uitgevoerd te worden.
          // Als er voor een catalogus niet met een drempelwaarde wordt gewerkt, dan wordt er vooralsnog een blokje getoond met dezelfde kleur als de andere cateringregels van die reservering.
          var ttl;
          var icon;
          var displ = "";
          var rsv_art_key = oRs("res_rsv_artikel_key").Value; // rsv_ruimte_key
          var rsv_art_appr = oRs("res_rsv_artikel_approved").Value;
          switch (rsv_art_appr)
          {
            case 0: ttl = L("lcl_res_ter_fiat");
                    icon = "fa-exclamation-circle";
                    break;
            case 1: ttl = L("lcl_res_goedgekeurd");
                    icon = "fa-check-circle";
                    break;
            case 2: ttl = L("lcl_res_afgewezen");
                    icon = "fa-times-circle";
                    break;
          }
          var fiatimg = "<span id='resfiatimg" + rsv_art_key + "' class='resfiat" + rsv_art_appr + "' title='" + safe.htmlattr(ttl) + "'>" + I(icon+" fa-lg", {"fastyle":"fas"}) + "</span>";
          displ = "<div class='resfiatdiv' title='" + safe.htmlattr(ttl) + "'>" + fiatimg + "</div>";
          return displ;
        }

        function fnArtikeltekst(oRs)
        {
          var sqlFlex = getSqlFlex("RESA");
          var flexData = getFlexData(sqlFlex, oRs("res_rsv_artikel_key").Value, { showProperties: true, onlyWithValue: true }); // Alleen flexkenmerken met een waarde ophalen.
          var artflex = "";
          if (flexData.length)
            artflex = "<div class='resartflexshow'>";
          for (var i = 0; i < flexData.length; i++)
          {
            artflex += (i? "<br>" : "") + "<span>" +  safe.html(flexData[i].header) + ": " +  safe.html(flexData[i].value) + "</span>"
          }

          // Bijlagen.
          var result = res.res_deel_flex_bijlagen(oRs("res_rsv_artikel_key").Value, oRs("res_discipline_key").Value);
          if (result.length)
            artflex += "<br>" + result;

          if (flexData.length)
            artflex += "</div>";

          var action = "";
          if (user.has("WEB_RESMSU"))
                action = 'FcltMgr.openDetail("appl/mgt/res_artikel.asp?mode=wrap&id=' + oRs('res_artikel_key').value + '"); FcltMgr.stopPropagation(event);';
          var active_artikel = (oRs("ingang").value == 1 && oRs("verval").value == 1);
          var arttekst = (action == "" ? safe.html(oRs("res_artikel_omschrijving").value) + " "
                                       : "<a href='#' onclick='" + action + "'>" + safe.html(oRs("res_artikel_omschrijving").value) + "</a> ")
                       + (oRs("res_artikel_eenheid").value ? " (" + safe.html(oRs("res_artikel_eenheid").value) + ")" : "")
                       + (oRs("res_rsv_artikel_prijs").Value ? (" " + (oRs("inclBTW").value? L("lcl_shared_inclBTW") : L("lcl_shared_exclBTW"))) : "")
                       + (!active_artikel? L("lcl_inactive_data_suffix") : "");

          return arttekst + artflex;
        }

        var sql2 = "SELECT CASE WHEN a.res_artikel_vrije_omschrijving = 1"
                 + "            THEN ra.res_rsv_artikel_omschrijving"
                 + "            ELSE " + lcl.xsql("a.res_artikel_omschrijving", "a.res_artikel_key")
                 + "       END  res_artikel_omschrijving"
                 + "     , " + lcl.xsqla("a.res_artikel_eenheid", "a.res_artikel_key")
                 + "     , ra.res_rsv_artikel_key"
                 + "     , ra.res_rsv_artikel_aantal"
                 + "     , res.getartikelprijs(ra.res_rsv_artikel_key) res_rsv_artikel_prijs" // zou je achterwege kunnen laten als !anyartikelprijs
                 + "     , d.ins_discipline_image"
                 + "     , " + lcl.xsqla("d.ins_discipline_omschrijving", "d.ins_discipline_key")
                 + "     , dp.res_disc_params_threshold"
                 + "     , ra.res_rsv_artikel_levering"
                 + "     , ra.res_rsv_artikel_afhalen"
                 + "     , rr.res_rsv_ruimte_tot"
                 + "     , " + toLocalDate("rr.res_rsv_ruimte_tot") + " local_res_rsv_ruimte_tot"
                 + "     , ra.res_rsv_artikel_verwijder ddVerwijder"
                 + "     , CASE "
                 + "       WHEN (ra.res_rsv_artikel_levering BETWEEN rr.res_rsv_ruimte_van "
                 + "                                             AND rr.res_rsv_ruimte_tot) "
                 + "       THEN 1 "
                 + "       ELSE 0 "
                 + "       END levbinnentijd"
                 + "     , res_rsv_artikel_dirtlevel"
                 + "     , res_rsv_artikel_approved"
                 + "     , COALESCE (ks.prs_kostensoort_btw, 0) inclbtw"
                 + "     , CASE"
                   + "     WHEN (a.res_artikel_ingangsdatum IS NULL OR a.res_artikel_ingangsdatum <= rr.res_rsv_ruimte_van)"
                   + "     THEN 1"
                   + "     ELSE 0"
                   + "     END ingang"
                 + "     , CASE"
                   + "     WHEN (a.res_artikel_vervaldatum IS NULL OR a.res_artikel_vervaldatum > rr.res_rsv_ruimte_van)"
                   + "     THEN 1"
                   + "     ELSE 0"
                   + "     END verval"
                 + "     , a.res_artikel_key"
                 + "     , a.res_discipline_key"
                 + "  FROM res_rsv_artikel ra"
                 + "     , res_rsv_ruimte rr"
                 + "     , res_artikel a"
                 + "     , res_discipline d"
                 + "     , res_disc_params dp"
                 + "     , prs_kostensoort ks"
                 + " WHERE ra.res_rsv_ruimte_key = rr.res_rsv_ruimte_key"
                 + "   AND rr.res_rsv_ruimte_key = " + rsv_ruimte_key
                 + "   AND ra.res_artikel_key = a.res_artikel_key"
                 + "   AND ks.prs_kostensoort_key(+) = d.prs_kostensoort_key"
                 + "   AND a.res_discipline_key = d.ins_discipline_key"
                 + "   AND d.ins_discipline_key = dp.res_ins_discipline_key"
                 + (!resdeleted? " AND ra.res_rsv_artikel_verwijder IS NULL" : "")
                 + " ORDER BY  res_artikel_volgnummer"
                 + "        , res_rsv_artikel_levering"
                 + "        , d.ins_discipline_volgnr"
                 + "        , " + lcl.xsql("res_artikel_omschrijving", "a.res_artikel_key");

        // Niet super efficient maar ach....
        var oRs = Oracle.Execute("SELECT 1 FROM (" + sql2 + ")" );
        var rst2Empty = oRs.EoF;
        oRs.Close();

        if (!rst2Empty)
          rst1.emptySetString = "";

        var cnt1 = rst1.processResultset();

        var rst2 = new ResultsetTable({sql:sql2,
                                       rstableCount: 2,
                                       rstableNr: 2,
                                       keyColumn: "res_rsv_artikel_key",
                                       ID: "resctable"+(embedded?"tiny":""),
                                       noPrint:true,
                                       rowClass: fnRowClassCat,
                                       summaryShow: function () {},
                                       emptySetString : L("lcl_no_artikels")
                                      });
        if (hasFiat)
          rst2.addColumn(new Column({caption: I("fa-circle"), content: fncolFiat, colName: "fncolFlags", colText: L("lcl_res_fiatstatus"), align: "center"}));
        rst2.addColumn(new Column({caption: "", content: fnImage, tooltip: "ins_discipline_omschrijving"}));
        rst2.addColumn(new Column({caption: L("lcl_consumable_objects"), content: fnArtikeltekst }));
        rst2.addColumn(new Column({caption: L("lcl_count"), content: "res_rsv_artikel_aantal", align:"center"}));
        rst2.addColumn(new Column({caption: L("lcl_time"), content: fnTijd, datatype: "time", align:"center"}));
        rst2.addColumn(new Column({caption: L("lcl_res_ophalen"), content: fnAfhaaltijd, datatype: "time", align:"center"}));
        if (this_res.res_has_visitors)
          rst2.addColumn(new Column({caption: L("lcl_to"), content: "local_res_rsv_ruimte_tot", datatype: "time", align:"center"}));
        if (anyartikelprijs)
          rst2.addColumn(new Column({caption: L("lcl_r_price7"), content: "res_rsv_artikel_prijs", datatype: "currency"}));
        if (resdeleted)
          rst2.addColumn(new Column({caption: L("lcl_deleted"), content: "ddVerwijder", datatype: "datetime"}));
        var cnt2 = rst2.processResultset();

        var hasVoorziening = (cnt1 > 0);
        var hasCatering = (cnt2 > 0);
        if (isCV && !hasVoorziening && !hasCatering)
        {
%>        <script>
            $(function() {
                FcltMgr.setSubtabExtra("<span class='subtab-badge-icon subtab-badge-missing'>" + I("fa-exclamation-triangle fa-lg", { "fastyle": "fas" }) + "</span>");
            });
          </script>
<%      }

        if (anyDirty)
        {
%>        <script type='text/javascript'>
            $(function()
            {
                anyDirty = true;
                FcltMgr.alert(L("lcl_res_fail_invalid_objcat"));
            })
          </script>
<%      }
      }
%>
  </body>
</html>
<% ASPPAGE_END(); %>
