<% /*
    $Revision$
    $Id$

    File:           plaatsFilter.inc
    Description:    functies voor plaats suggest velden (regio, district, locatie, gebouw, verdieping, ruimte)
    Globals:
    Context:
    Note:           Supported filtercodes:
                        BEZ: bezoekbare gebouwen (alg_gebouw_bez = 1)
                        FAC: facilitaire gebouw (alg_srtgebouw_passief is null)
                        RES: als FAC maar zonder reserveerbare alg_ruimte's
                        RESA: Afhaal ruimtes
                        RESB: bezorg ruimtes
                        CAD: Verdiepingen met een CAD_TEKENING record

                    params:
                        disc_key: filter bij RESA en RESB scope van res_deel objecten van die discipline
                        res_act_key: filter bij RESA en RESB scope van res_deel objecten van disciplines van die activiteit

*/ %>

<%
// Deze slaan we bij RESA en RESB over.
var not_reserveerbare_ruimte = " AND NOT EXISTS  "
                             + "            (SELECT '' "
                             + "               FROM  res_alg_ruimte rar"
                             + "              WHERE  res_alg_ruimte_verwijder IS NULL "
                             + "                AND  rar.alg_ruimte_key = r.alg_ruimte_key)";

function getFiltClauseRegio(pfiltcode, params)
{
  var lfiltClause = "";
  if (pfiltcode && pfiltcode != "")
  {
    switch(pfiltcode)
    {
      case "BEZ": lfiltClause = " AND EXISTS"
                              + " (SELECT ad.alg_regio_key"
                              + " FROM alg_v_aanwezigdistrict ad"
                              + ", alg_v_aanweziggebouw ag"
                              + ", alg_v_aanweziglocatie al"
                              + " WHERE al.alg_locatie_key = ag.alg_locatie_key"
                              + " AND ad.alg_district_key = al.alg_district_key"
                              + " AND (ag.alg_gebouw_vervaldatum IS NULL OR ag.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                              + " AND ag.alg_gebouw_bez = 1"
                              + " AND ad.alg_regio_key = r.alg_regio_key)";
                  break;
      // Filter als gevolg van UWVA#14613
      case "RES":
      case "FAC": lfiltClause = " AND EXISTS"
                              + " (SELECT ad.alg_regio_key"
                              + " FROM alg_v_aanwezigdistrict ad"
                              + ", alg_srtgebouw sg, alg_v_aanweziggebouw ag"
                              + ", alg_v_aanweziglocatie al"
                              + " WHERE al.alg_locatie_key = ag.alg_locatie_key"
                              + " AND sg.alg_srtgebouw_passief IS NULL"
                              + " AND (ag.alg_gebouw_vervaldatum IS NULL OR ag.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                              + " AND sg.alg_srtgebouw_key(+) = ag.alg_srtgebouw_key"
                              + " AND ad.alg_district_key = al.alg_district_key"
                              + " AND ad.alg_regio_key = r.alg_regio_key)";
                  break;
    }
  }
  return lfiltClause;
}

function getFiltClauseDistrict(pfiltcode, params)
{
  var lfiltClause = "";
  if (pfiltcode && pfiltcode != "")
  {
    switch(pfiltcode)
    {
      case "BEZ": lfiltClause = " AND EXISTS"
                              + " (SELECT al.alg_district_key"
                              + " FROM alg_v_aanweziggebouw ag"
                              + ", alg_v_aanweziglocatie al"
                              + " WHERE al.alg_locatie_key = ag.alg_locatie_key"
                              + " AND ag.alg_gebouw_bez = 1"
                              + " AND (ag.alg_gebouw_vervaldatum IS NULL OR ag.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                              + " AND al.alg_district_key = d.alg_district_key)";
                  break;
      // Filter als gevolg van UWVA#14613
      case "RES":
      case "FAC": lfiltClause = " AND EXISTS"
                              + " (SELECT al.alg_district_key"
                              + " FROM alg_srtgebouw sg, alg_v_aanweziggebouw ag"
                              + ", alg_v_aanweziglocatie al"
                              + " WHERE al.alg_locatie_key = ag.alg_locatie_key"
                              + " AND sg.alg_srtgebouw_passief IS NULL"
                              + " AND (ag.alg_gebouw_vervaldatum IS NULL OR ag.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                              + " AND sg.alg_srtgebouw_key(+) = ag.alg_srtgebouw_key"
                              + " AND al.alg_district_key = d.alg_district_key)";
                  break;
    }
  }
  return lfiltClause;
}

function getFiltClauseLocatie(pfiltcode, params)
{
  params = params || {};
  var lfiltClause = {from: "", where: ""};
  // Facilitair relevant hebben we vaker nodig
  var lfiltClauseFAC = " AND EXISTS "
                     + "(SELECT ''"
                     + "   FROM alg_srtgebouw sg, alg_v_aanweziggebouw gg"
                     + "  WHERE sg.alg_srtgebouw_passief IS NULL"
                     + "    AND (gg.alg_gebouw_vervaldatum IS NULL OR gg.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                     + "    AND sg.alg_srtgebouw_key(+) = gg.alg_srtgebouw_key"
                     + "    AND gg.alg_locatie_key = DECODE(l.alg_locatie_key, NULL, gg.alg_locatie_key, l.alg_locatie_key)"
                     + "  UNION ALL"
                     + " SELECT ''"
                     + "   FROM alg_v_aanwezigterreinsector t"
                     + "  WHERE t.alg_locatie_key = DECODE(l.alg_locatie_key, NULL, t.alg_locatie_key, l.alg_locatie_key)"
                     + ")";

  var lfiltClauseEXP = " AND EXISTS"
                     + "  (SELECT ''"
                     + "     FROM alg_v_aanweziggebouw gg"
                     + "    WHERE gg.alg_locatie_key = DECODE(l.alg_locatie_key, NULL, gg.alg_locatie_key, l.alg_locatie_key)"
                     + "      AND (gg.alg_gebouw_vervaldatum IS NULL OR gg.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                     + "    UNION ALL"
                     + "   SELECT ''"
                     + "     FROM alg_v_aanwezigterreinsector t"
                     + "    WHERE t.alg_locatie_key = DECODE(l.alg_locatie_key, NULL, t.alg_locatie_key, l.alg_locatie_key)"
                     + " )";

  if (pfiltcode && pfiltcode != "")
  {
    switch(pfiltcode)
    {
      case "BEZ": lfiltClause.where = " AND EXISTS"
                                    + " (SELECT ag.alg_locatie_key"
                                    + " FROM alg_v_aanweziggebouw ag"
                                    + " WHERE ag.alg_gebouw_bez = 1"
                                    + " AND (ag.alg_gebouw_vervaldatum IS NULL OR ag.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                                    + " AND ag.alg_locatie_key = l.alg_locatie_key)";
                  lfiltClause.where += lfiltClauseEXP;
                  break;

      case "FAC": // Facilitaire locaties, met een niet-passief gebouw of terrein
                  lfiltClause.where = lfiltClauseFAC;
                  break;

      case "RESB": // Bezorgplaats voor voorzieningen, d.i. locatie met ruimtes zonder louter reserveerbare ruimten
                  var loc_scope_act_filter = get_loc_scope_act_filter(params, 2)
                  lfiltClause.from = loc_scope_act_filter.from;
                  lfiltClause.where = " AND EXISTS"
                                    + " (SELECT '' "
                                    + "    FROM alg_ruimte r, alg_verdieping vv, alg_gebouw gg "
                                    + "   WHERE r.alg_ruimte_verwijder IS NULL "
                                    + "     AND r.alg_verdieping_key = vv.alg_verdieping_key "
                                    + "     AND vv.alg_gebouw_key = gg.alg_gebouw_key "
                                    + "     AND gg.alg_locatie_key = l.alg_locatie_key"
                                    + not_reserveerbare_ruimte
                                    + ")"
                                    + loc_scope_act_filter.where;
                  lfiltClause.where += get_res_bezorgfilter(params, 2);
                  lfiltClause.where += lfiltClauseFAC;  // Ook dat nog
                  break;

      case "RES": // Locatie met minstens reserveerbare ruimte, en FAC bovendien
                  lfiltClause.where = " AND EXISTS"
                                    + " (SELECT g.alg_locatie_key "
                                    + "    FROM res_alg_ruimte rar, alg_ruimte r, alg_verdieping v, alg_gebouw g "
                                    + "   WHERE rar.res_alg_ruimte_verwijder IS NULL "
                                    + "     AND rar.alg_ruimte_key = r.alg_ruimte_key "
                                    + "     AND r.alg_verdieping_key = v.alg_verdieping_key "
                                    + "     AND v.alg_gebouw_key = g.alg_gebouw_key "
                                    + "     AND g.alg_locatie_key = l.alg_locatie_key)";
                  lfiltClause.where += lfiltClauseFAC;  // Ook dat nog
                  if (params.act_key > 0)
                  { // Alleen die locaties met ruimten waar de activiteit mogelijk is.
                    lfiltClause.where += "   AND EXISTS (SELECT res_activiteit_key"
                                       + "                   FROM res_activiteitdiscipline rad"
                                       + "                      , res_v_res_ruimte_gegevens rg"
                                       + "                  WHERE rg.alg_locatie_key = l.alg_locatie_key"
                                       + "                    AND rad.res_discipline_key = rg.res_discipline_key"
                                       + "                       AND rad.res_activiteit_key = " + params.act_key + ")";
                  }
                  break;

      case "RESA": // RES Afhaal: 'thuishaven' objecten en catering die een ruimte-scope heeft
                  lfiltClause.where = " AND l.alg_locatie_key IN"
                                    + "  (SELECT g.alg_locatie_key"
                                    + "     FROM res_srtartikel_onrgoed rso, alg_ruimte r, alg_verdieping v, alg_gebouw g"
                                    + "    WHERE rso.alg_onrgoed_niveau='R'"
                                    + "      AND rso.alg_onrgoed_key = r.alg_ruimte_key"
                                    + "      AND r.alg_verdieping_key = v.alg_verdieping_key"
                                    + "      AND rso.res_srtartikel_og_verwijder IS NULL"
                                    + "      AND v.alg_gebouw_key = g.alg_gebouw_key"
                                    +        get_res_afhaalfilter(params)
                                    +        not_reserveerbare_ruimte
                                    + "  UNION"
                                    + "   SELECT g.alg_locatie_key "
                                    + "     FROM res_v_aanwezigdeel, ins_deel, alg_ruimte r, alg_verdieping v, alg_gebouw g"
                                    + "    WHERE res_ins_deel_key = ins_deel_key"
                                    + "      AND COALESCE(ins_alg_ruimte_type_org, ins_alg_ruimte_type) = 'R'"
                                    + "      AND COALESCE(ins_alg_ruimte_key_org, ins_alg_ruimte_key) = r.alg_ruimte_key"
                                    + "      AND r.alg_verdieping_key = v.alg_verdieping_key"
                                    + "      AND v.alg_gebouw_key = g.alg_gebouw_key"
                                    +        get_res_afhaalfilter(params, true)
                                    +        not_reserveerbare_ruimte
                                    + ")";
                  break;

      case "CAD": // Die met CAD_TEKENING record
                  lfiltClause.where = " AND EXISTS"
                                    + "  (SELECT ct.alg_verdieping_key"
                                    + "     FROM cad_tekening ct, alg_verdieping v, alg_gebouw g"
                                    + "    WHERE ct.alg_verdieping_key = v.alg_verdieping_key"
                                    + "      AND v.alg_gebouw_key = g.alg_gebouw_key"
                                    + "      AND g.alg_locatie_key = l.alg_locatie_key"
                                    + ")";
                  lfiltClause.where += lfiltClauseFAC;  // Ook dat nog
                  break;

      case "INCVR": // include virtual rooms, default these are NOT included
                  lfiltClause.where = lfiltClauseEXP;
                  break;

      case "EXP": // vervallen gebouwen niet tonen
                  lfiltClause.where = lfiltClauseEXP;
                  break;
    }
  }
  return lfiltClause;
}

function getFiltClauseGebouw(pfiltcode, params)
{
  var lfiltClause = {code: "", from: "", where: "", where_geb: "", where_ter: ""};
  // Facilitair relevant hebben we vaker nodig
  var lfiltClauseFAC = " AND sg.alg_srtgebouw_passief IS NULL"
                     + " AND (g.alg_gebouw_vervaldatum IS NULL OR g.alg_gebouw_vervaldatum > TRUNC(SYSDATE))";

  var lfiltClauseEXP = " AND (g.alg_gebouw_vervaldatum IS NULL OR g.alg_gebouw_vervaldatum > TRUNC(SYSDATE))";

  if (pfiltcode && pfiltcode != "")
  {
    switch(pfiltcode)
    {
      case "BEZ": lfiltClause.where = " AND g.alg_gebouw_bez = 1";
                  break;
      // Filter als gevolg van UWVA#14613
      case "RES": // Er is (nog) geen gebouwfilter bij reserveerbare ruimten
      case "FAC": lfiltClause.where = lfiltClauseFAC;
                  break;
      case "INCVR": // include virtual rooms, default these are NOT included
                  lfiltClause.where = lfiltClauseEXP;
                  break;
      case "EXP": lfiltClause.where = lfiltClauseEXP;
                  break;
      case "RESB": // Bezorgplaats voor voorzieningen, d.i. gebouwen met ruimten excl. reserveerbare ruimten
                  var loc_scope_act_filter = get_loc_scope_act_filter(params, 3)
                  lfiltClause.from = loc_scope_act_filter.from;
                  lfiltClause.where = " AND EXISTS"
                                    + " (SELECT '' "
                                    + "    FROM alg_ruimte r, alg_verdieping vv"
                                    + "   WHERE r.alg_ruimte_verwijder IS NULL "
                                    + "     AND r.alg_verdieping_key = vv.alg_verdieping_key "
                                    + "     AND vv.alg_gebouw_key = g.alg_gebouw_key "
                                    + not_reserveerbare_ruimte
                                    + ")"
                                    + loc_scope_act_filter.where;
                  lfiltClause.where += get_res_bezorgfilter(params, 3);
                  lfiltClause.where += lfiltClauseFAC;  // Ook dat nog
                  break;
      case "RESA": // RES Afhaal: 'thuishaven' objecten en catering die een ruimte-scope heeft
                  lfiltClause.where = " AND g.alg_gebouw_key IN"
                                    + "  (SELECT v.alg_gebouw_key"
                                    + "     FROM res_srtartikel_onrgoed rso, alg_ruimte r, alg_verdieping v"
                                    + "    WHERE rso.alg_onrgoed_niveau='R'"
                                    + "      AND rso.alg_onrgoed_key = r.alg_ruimte_key"
                                    + "      AND r.alg_verdieping_key = v.alg_verdieping_key"
                                    + "      AND rso.res_srtartikel_og_verwijder IS NULL"
                                    +        get_res_afhaalfilter(params)
                                    +        not_reserveerbare_ruimte
                                    + "  UNION"
                                    + "   SELECT v.alg_gebouw_key "
                                    + "     FROM res_v_aanwezigdeel, ins_deel, alg_ruimte r, alg_verdieping v"
                                    + "    WHERE res_ins_deel_key = ins_deel_key"
                                    + "      AND COALESCE(ins_alg_ruimte_type_org, ins_alg_ruimte_type) = 'R'"
                                    + "      AND COALESCE(ins_alg_ruimte_key_org, ins_alg_ruimte_key) = r.alg_ruimte_key"
                                    + "      AND r.alg_verdieping_key = v.alg_verdieping_key"
                                    +        get_res_afhaalfilter(params, true)
                                    +        not_reserveerbare_ruimte
                                    + ")";
                  break;

      case "CAD": // Die met CAD_TEKENING record
                  lfiltClause.where = " AND EXISTS"
                                    + "  (SELECT ct.alg_verdieping_key"
                                    + "     FROM cad_tekening ct, alg_verdieping v"
                                    + "    WHERE ct.alg_verdieping_key = v.alg_verdieping_key"
                                    + "      AND v.alg_gebouw_key = g.alg_gebouw_key"
                                    + ")";
                  break;
      case "PRK": // Parkeerplaats gebouwen/terreinen
                  // getgebouwterrein_sql heeft al de WEB_BEZPAF authorisatie in zich
                  lfiltClause.code  = " || ' [' ||"
                                    + " CASE parkgebter.vrij"
                                    + " WHEN 0"
                                    + " THEN " + safe.quoted_sql(L("lcl_bez_vol"))
                                    + " ELSE TO_CHAR(parkgebter.vrij) || " + safe.quoted_sql(" - " + L("lcl_bez_vrij"))
                                    + " END"
                                    + " || ']'";
                  // Merk op dat we een functie uit BEZ.INC gebruiken. Die is er in relevante gevallen wel.
                  lfiltClause.from  = ", (" + bez.getgebouwterrein_sql(params.date_from, params.date_to, params.locatiekey) + ") parkgebter"
                  lfiltClause.where_geb = " AND parkgebter.alg_gebouw_key = g.alg_gebouw_key";
                  lfiltClause.where_ter = " AND parkgebter.alg_terreinsector_key = t.alg_terreinsector_key";
                  break;
    }
  }
  return lfiltClause;
}

function getFiltClauseVerdieping(pfiltcode, params)
{
  var lfiltClause = {from: "", where: ""};
  // Facilitair relevant hebben we vaker nodig
  var lfiltClauseFAC = " AND EXISTS"
                     + " (SELECT g.alg_gebouw_key"
                     + " FROM alg_srtgebouw sg, alg_v_aanweziggebouw g"
                     + " WHERE sg.alg_srtgebouw_passief IS NULL"
                     + " AND (g.alg_gebouw_vervaldatum IS NULL OR g.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                     + " AND sg.alg_srtgebouw_key(+) = g.alg_srtgebouw_key"
                     + " AND g.alg_gebouw_key = v.alg_gebouw_key)";
  var lfiltClauseEXP = " AND EXISTS"
                     + " (SELECT xg.alg_gebouw_key"
                     + " FROM alg_srtgebouw xsg, alg_v_aanweziggebouw xg"
                     + " WHERE (xg.alg_gebouw_vervaldatum IS NULL OR xg.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                     + " AND xsg.alg_srtgebouw_key(+) = xg.alg_srtgebouw_key"
                     + " AND xg.alg_gebouw_key = v.alg_gebouw_key)";
  if (pfiltcode && pfiltcode != "")
  {
    switch(pfiltcode)
    {
      case "BEZ": lfiltClause.where = " AND EXISTS"
                                    + " (SELECT ag.alg_gebouw_key"
                                    + " FROM alg_v_aanweziggebouw ag"
                                    + " WHERE ag.alg_gebouw_bez = 1"
                                    + " AND (ag.alg_gebouw_vervaldatum IS NULL OR ag.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                                    + " AND ag.alg_gebouw_key = v.alg_gebouw_key)";
                  break;
      // Filter als gevolg van UWVA#14613
      case "RES": // Er is (nog) nergens een verdiepingfilter bij reserveerbare ruimten
      case "FAC": lfiltClause.where = lfiltClauseFAC;
                  break;

      case "RESB": // Bezorgplaats voor voorzieningen, d.i. verdieping met ruimte excl. reserveerbare ruimten
                  var loc_scope_act_filter = get_loc_scope_act_filter(params, 4)
                  lfiltClause.from = loc_scope_act_filter.from;
                  lfiltClause.where = " AND EXISTS"
                                    + " (SELECT '' "
                                    + "    FROM alg_ruimte r"
                                    + "   WHERE r.alg_ruimte_verwijder IS NULL "
                                    + "     AND r.alg_verdieping_key = v.alg_verdieping_key "
                                    + not_reserveerbare_ruimte
                                    + ")"
                                    + loc_scope_act_filter.where;
                  lfiltClause.where += get_res_bezorgfilter(params, 4);
                  lfiltClause.where += lfiltClauseFAC;  // Ook dat nog
                  break;

      case "RESA": // RES Afhaal: 'thuishaven' objecten en catering die een ruimte-scope heeft
                  lfiltClause.where = " AND v.alg_verdieping_key IN"
                                    + "  (SELECT r.alg_verdieping_key "
                                    + "     FROM res_srtartikel_onrgoed rso, alg_ruimte r"
                                    + "    WHERE rso.alg_onrgoed_niveau='R'"
                                    + "      AND rso.alg_onrgoed_key = r.alg_ruimte_key"
                                    + "      AND rso.res_srtartikel_og_verwijder IS NULL"
                                    +        get_res_afhaalfilter(params)
                                    +        not_reserveerbare_ruimte
                                    + "  UNION"
                                    + "   SELECT r.alg_verdieping_key  "
                                    + "     FROM res_v_aanwezigdeel, ins_deel, alg_ruimte r"
                                    + "    WHERE res_ins_deel_key = ins_deel_key"
                                    + "      AND COALESCE(ins_alg_ruimte_type_org, ins_alg_ruimte_type) = 'R'"
                                    + "      AND COALESCE(ins_alg_ruimte_key_org, ins_alg_ruimte_key) = r.alg_ruimte_key"
                                    +        get_res_afhaalfilter(params, true)
                                    +        not_reserveerbare_ruimte
                                    + ")";
                  break;

      case "CAD": // Die met CAD_TEKENING record
                  lfiltClause.where = " AND EXISTS"
                                    + "  (SELECT ct.alg_verdieping_key"
                                    + "     FROM cad_tekening ct"
                                    + "    WHERE ct.alg_verdieping_key = v.alg_verdieping_key"
                                    + ")";
                  break;

      case "EXP": lfiltClause.where = lfiltClauseEXP;
                  break;
    }
  }
  return lfiltClause;
}

function getFiltClauseRuimte(pfiltcode, params)
{
  var lfiltClause = {from: "", where: ""};
  // Facilitair relevant hebben we vaker nodig
  var lfiltClauseFAC = " AND EXISTS"
                     + " (SELECT alg_verdieping_key"
                     + " FROM alg_srtgebouw sg, alg_v_aanweziggebouw ag"
                     + ", alg_v_aanwezigverdieping av"
                     + " WHERE ag.alg_gebouw_key = av.alg_gebouw_key"
                     + " AND sg.alg_srtgebouw_passief IS NULL"
                     + " AND (g.alg_gebouw_vervaldatum IS NULL OR g.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                     + " AND sg.alg_srtgebouw_key(+) = ag.alg_srtgebouw_key"
                     + " AND av.alg_verdieping_key = r.alg_verdieping_key)";
  var lfiltClauseEXP = " AND EXISTS"
                     + " (SELECT xav.alg_verdieping_key"
                     + " FROM alg_srtgebouw xsg, alg_v_aanweziggebouw xag"
                     + ", alg_v_aanwezigverdieping xav"
                     + " WHERE xag.alg_gebouw_key = xav.alg_gebouw_key"
                     + " AND (xag.alg_gebouw_vervaldatum IS NULL OR xag.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                     + " AND xsg.alg_srtgebouw_key(+) = xag.alg_srtgebouw_key"
                     + " AND xav.alg_verdieping_key = r.alg_verdieping_key)";

  if (pfiltcode && pfiltcode != "")
  {
    switch(pfiltcode)
    {
      case "BEZ": lfiltClause.where = " AND EXISTS"
                                    + " (SELECT alg_verdieping_key"
                                    + " FROM alg_v_aanweziggebouw ag"
                                    + ", alg_v_aanwezigverdieping av"
                                    + " WHERE ag.alg_gebouw_key = av.alg_gebouw_key"
                                    + " AND ag.alg_gebouw_bez = 1"
                                    + " AND (ag.alg_gebouw_vervaldatum IS NULL OR ag.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                                    + " AND av.alg_verdieping_key = r.alg_verdieping_key)";
                  break;
      // Filter als gevolg van UWVA#14613
      case "RES": // Er is geen ruimtefilter bij reserveerbare ruimten
      case "FAC": lfiltClause.where = lfiltClauseFAC;
                  break;

      case "RESB": // Bezorgplaats voor voorzieningen, d.i. zonder de reserveerbare ruimten
                  var loc_scope_act_filter = get_loc_scope_act_filter(params, 5)
                  lfiltClause.from = loc_scope_act_filter.from;
                  lfiltClause.where = not_reserveerbare_ruimte
                                    + get_res_bezorgfilter(params, 5)
                                    + loc_scope_act_filter.where
                                    + lfiltClauseFAC;  // Ook dat nog
                  break;

      case "RESA": // RES Afhaal: 'thuishaven' objecten en catering die een ruimte-scope heeft
                  lfiltClause.where = " AND r.alg_ruimte_key IN "
                                    + "  (SELECT rso.alg_onrgoed_key"
                                    + "     FROM res_srtartikel_onrgoed rso"
                                    + "    WHERE rso.alg_onrgoed_niveau='R'"
                                    + "      AND rso.res_srtartikel_og_verwijder IS NULL"
                                    +        get_res_afhaalfilter(params)
                                    + "   UNION"
                                    + "   SELECT COALESCE(ins_alg_ruimte_key_org, ins_alg_ruimte_key) "
                                    + "     FROM res_v_aanwezigdeel, ins_deel"
                                    + "    WHERE res_ins_deel_key = ins_deel_key"
                                    + "      AND COALESCE(ins_alg_ruimte_type_org, ins_alg_ruimte_type) = 'R'"
                                    +        get_res_afhaalfilter(params, true)
                                    + ")"
                                    + not_reserveerbare_ruimte;
                  break;

      case "EXP": lfiltClause.where = lfiltClauseEXP;
                  break;
    }
  }
  if (pfiltcode != "INCVR") {  // include virtual rooms, default these are NOT included
    lfiltClause.where = lfiltClause.where + " AND alg_ruimte_nr NOT LIKE '\\_%' ESCAPE '\\' ";
  }
  return lfiltClause;
}

function getFiltClauseWerkplek(pfiltcode, params)
{
  var lfiltClause = "";
  if (pfiltcode && pfiltcode != "")
  {
    switch(pfiltcode)
    {
      case "BEZ": lfiltClause = " AND EXISTS"
                              + " (SELECT alg_ruimte_key"
                              + " FROM alg_v_aanweziggebouw ag"
                              + ", alg_v_aanwezigverdieping av"
                              + ", alg_v_aanwezigruimte ar"
                              + " WHERE ag.alg_gebouw_key = av.alg_gebouw_key"
                              + " AND av.alg_verdieping_key = ar.alg_verdieping_key"
                              + " AND ag.alg_gebouw_bez = 1"
                              + " AND (ag.alg_gebouw_vervaldatum IS NULL OR ag.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                              + " AND ar.alg_ruimte_key = w.prs_alg_ruimte_key)";
                  break;
    }
  }
  return lfiltClause;
}

function get_res_bezorgfilter(params, level)
{
    params = params || {};
    var res_deel_key = getQParamInt("res_deel_key", params.res_deel_key||-1);
    if (res_deel_key>0)
    {
        sql = "SELECT res_deel_alg_level,"
            + "       alg_district_key,"
            + "       alg_regio_key,"
            + "       alg_locatie_key,"
            + "       alg_gebouw_key,"
            + "       alg_verdieping_key,"
            + "       alg_ruimte_key"
            + "  FROM res_deel rd, ins_deel id, "
            + "       alg_v_onrgoed_boom aob"
            + " WHERE rd.res_ins_deel_key = id.ins_deel_key"
            + "   AND COALESCE(id.ins_alg_ruimte_type_org, id.ins_alg_ruimte_type) = 'R'"
            + "   AND COALESCE(id.ins_alg_ruimte_key_org, id.ins_alg_ruimte_key) = aob.alg_ruimte_key"
            + "   AND res_deel_key = " + res_deel_key;
        var oRs = Oracle.Execute(sql);
        var res_deel_alg_level = oRs("res_deel_alg_level").Value;

        if (level == 5 && res_deel_alg_level >= 5) return " AND r.alg_ruimte_key = "     + oRs("alg_ruimte_key").Value;
        if (level == 4 && res_deel_alg_level >= 4) return " AND v.alg_verdieping_key = " + oRs("alg_verdieping_key").Value;
        if (level == 3 && res_deel_alg_level >= 3) return " AND g.alg_gebouw_key = "     + oRs("alg_gebouw_key").Value;
        if (level == 2 && res_deel_alg_level >= 2) return " AND l.alg_locatie_key = "    + oRs("alg_locatie_key").Value;
        if (level == 1 && res_deel_alg_level >= 1) return " AND r.alg_regio_key = "      + oRs("alg_regio_key").Value;
        if (level == 0 && res_deel_alg_level >= 0) return " AND d.alg_district_key = "   + oRs("alg_district_key").Value;
        oRs.close();

        return "";
    }

    return "";
}

// Levert lege string of
// " AND RES_DISCIPLINE_KEY IN (1,2,3)"
function get_res_afhaalfilter(params, forDeel)
{
    params = params || {};
    var deel_key = getQParamInt("res_deel_key", params.res_deel_key||-1);
    if (deel_key>0 && forDeel)
        return " AND RES_DEEL_KEY = " + deel_key;

    var disc_key = getQParamInt("disc_key", params.disc_key||-1);
    if (disc_key>0)
        return " AND RES_DISCIPLINE_KEY = " + disc_key;

    var act_key = getQParamInt("res_act_key", params.act_key||-1);
    if (act_key<0)
        return "";

    var sql = "SELECT rad.res_discipline_key"
            + "  from res_activiteitdiscipline rad"
            + " where rad.res_activiteit_key = " + act_key;
    var lst = [];
    var oRs = Oracle.Execute(sql);
    while (!oRs.Eof)
    {
        lst.push(oRs("res_discipline_key").Value);
        oRs.MoveNext()
    }
    oRs.close();
    if (lst.length)
        return " AND RES_DISCIPLINE_KEY IN ( " + lst.join(", ") + ")";
    return "";
}

// Filter alleen die locaties waar een bepaalde activiteit mogelijk is
// FSN#29479 Deze functie is bij sommige klanten/inrichtingen extreem traag (timeouts)
//           Daarom uitschakelbaar via S("res_strict_locfilter"). Beter iets te veel
//           ruimtes dan een timeotu
function get_loc_scope_act_filter(params, level)
{
  var loc_scope_act_filter = {from: "", where: ""};

  if (!S("res_strict_locfilter"))
    return loc_scope_act_filter;

  var pSelect;
  switch (level)
  {
    case 2: pSelect = "alg_locatie_key";
            break;
    case 3: pSelect = "alg_gebouw_key";
            break;
    case 4: pSelect = "alg_verdieping_key";
            break;
    case 5: pSelect = "alg_ruimte_key";
            break;
  }
  // Alleen die locaties met een verbruiksartikelen of voorzieningen scope tonen zodat ook verbruiksartikelen of voorzieningen geselecteerd kunnen worden.
  // Catalogi zonder geldige verbruiksartikelen ook niet tonen.
  // Alleen die locaties met ruimten waar de activiteit mogelijk is.
  loc_scope_act_filter.from = ", ("
                            // Verbruiksartikelen met Gebouw(G), Verdieping(V) en Ruimte(R) scope.
                            + "SELECT og." + pSelect
                            + "  FROM res_srtartikel_onrgoed a"
                            + "     , alg_v_allonroerendgoed og"
                            + "     , res_v_aanwezigartikel ra"
                            // Niet onrgoed_keys aan elkaar gelijk stellen (a.alg_onrgoed_key = og.alg_onroerendgoed_keys).
                            // Er zijn nog meer regels in de alg_v_allonroerendgoed tabel waarbij alg_onrgoed_key gelijk is aan Gebouw, Verdieping of Ruimte key.
                            + " WHERE ((a.alg_onrgoed_niveau = 'G'"
                            + "        AND a.alg_onrgoed_key = og.alg_gebouw_key)"
                            + "     OR (a.alg_onrgoed_niveau = 'V'"
                            + "        AND a.alg_onrgoed_key = og.alg_verdieping_key)"
                            + "     OR (a.alg_onrgoed_niveau = 'R'"
                            + "        AND a.alg_onrgoed_key = og.alg_ruimte_key))"
                            + "   AND a.res_discipline_key = ra.res_discipline_key"
                            + "   AND SYSDATE BETWEEN COALESCE(ra.res_artikel_ingangsdatum,SYSDATE)"
                            + "                   AND COALESCE(ra.res_artikel_vervaldatum, SYSDATE)" // Zijn er wel geldige verbruiksartikelen onder deze catalogus?
                            + "   AND a.alg_onrgoed_niveau IN ('G', 'V', 'R')"
                            + "   AND a.res_srtartikel_og_verwijder IS NULL"
                            // Verbruiksartikelen met Locatie(L) scope.
                            + (params.act_key > 0
                              ? " AND a.res_discipline_key IN (SELECT res_discipline_key"
                                + "                              FROM res_activiteitdiscipline"
                                + "                             WHERE res_activiteit_key = " + params.act_key + ")"
                              : "")
                            + " UNION "
                            + "SELECT og." + pSelect
                            + "  FROM res_srtartikel_onrgoed a"
                            + "     , res_v_aanwezigartikel ra"
                            + "     , alg_v_allonroerendgoed og"
                            + " WHERE a.res_discipline_key = ra.res_discipline_key"
                            + "   AND a.alg_onrgoed_key = og.alg_locatie_key"
                            + "   AND SYSDATE BETWEEN COALESCE(ra.res_artikel_ingangsdatum,SYSDATE)"
                            + "                   AND COALESCE(ra.res_artikel_vervaldatum, SYSDATE)" // Zijn er wel geldige verbruiksartikelen onder deze catalogus?
                            + "   AND a.alg_onrgoed_niveau IN ('L')"
                            + "   AND a.res_srtartikel_og_verwijder IS NULL"
                            // Voorzieningen.
                            + (params.act_key > 0
                              ? " AND a.res_discipline_key IN (SELECT res_discipline_key"
                                + "                              FROM res_activiteitdiscipline"
                                + "                             WHERE res_activiteit_key = " + params.act_key + ")"
                              : "")
                            + " UNION "
                            + "SELECT scope." + pSelect
                            + "  FROM res_v_aanwezigdeel r"
                            + "     , alg_v_onrgoed_boom scope"
                            + "     , res_v_deelscope ds"
                            + " WHERE r.res_deel_key = ds.res_deel_key"
                             + "  AND (ds.alg_regio_key = scope.alg_regio_key"
                            + "        OR ds.alg_district_key = scope.alg_district_key"
                            + "        OR ds.alg_locatie_key = scope.alg_locatie_key"
                            + "        OR ds.alg_gebouw_key = scope.alg_gebouw_key"
                            + "        OR ds.alg_verdieping_key = scope.alg_verdieping_key"
                            + "        OR ds.alg_ruimte_key = scope.alg_ruimte_key"
                            + "        OR ds.res_deel_alg_level = -1)"
                            + "   AND (r.res_deel_vervaldatum IS NULL OR r.res_deel_vervaldatum > SYSDATE)" // Zijn er wel geldige voorzieningen onder deze catalogus?
                            + (params.act_key > 0
                              ? " AND r.res_discipline_key IN (SELECT res_discipline_key"
                                + "                              FROM res_activiteitdiscipline"
                                + "                             WHERE res_activiteit_key = " + params.act_key + ")"
                              : "")
                            + ") scope";

  switch (level)
  {
    case 2: loc_scope_act_filter.where = " AND l.alg_locatie_key = scope.alg_locatie_key";
            break;
    case 3: loc_scope_act_filter.where = " AND g.alg_gebouw_key = scope.alg_gebouw_key";
            break;
    case 4: loc_scope_act_filter.where = " AND v.alg_verdieping_key = scope.alg_verdieping_key";
            break;
    case 5: loc_scope_act_filter.where = " AND r.alg_ruimte_key = scope.alg_ruimte_key";
            break;
  }
  return loc_scope_act_filter;
}
%>
