<% /*
    $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"
                             + "                  , res_ruimte rr"
                             + "              WHERE rar.res_alg_ruimte_verwijder IS NULL"
                             + "                AND rr.res_ruimte_verwijder IS NULL"
                             + "                AND (   rr.res_ruimte_vervaldatum IS NULL"
                             + "                     OR rr.res_ruimte_vervaldatum > SYSDATE)"
                             + "                AND rar.res_ruimte_key = rr.res_ruimte_key"
                             + "                AND rr.res_ruimte_cv = 0"
                             + "                AND rar.alg_ruimte_key = r.alg_ruimte_key)";

// Bedrijfdienstlocatie afhankelijkheid voor gebouw gedeelte.
function getBdlGebouwNiveau()
{
  // Is er een dienst die de scope heeft voor alle gebouwen en locaties. Dit is het geval als er geen locaties of gebouwen zijn ingevuld.
  // Dan geen bedrijfdienstlocatie scope beperking op gebouw niveau.
  var sql = "SELECT bdl.prs_bedrijfdienstlocatie_key"
          + "  FROM prs_bedrijfdienstlocatie bdl"
          + " WHERE bdl.prs_bedrijf_key IN (SELECT cp.prs_bedrijf_key"
          + "                                 FROM prs_contactpersoon cp"
          + "                                WHERE cp.prs_perslid_key = " + user_key + ")"
          + "   AND bdl.alg_locatie_key IS NULL"
          + "   AND bdl.alg_gebouw_key IS NULL"
    var oRs = Oracle.Execute(sql);
    if (!oRs.eof)
      return ""; // Geen bedrijfdienstlocatie scope beperking op gebouw en locatie.
    oRs.Close();

  var bdl_gebouw_niveau = " AND EXISTS (SELECT bdl.alg_locatie_key"
                        + "               FROM prs_bedrijfdienstlocatie bdl"
                        + "                  , prs_dienst dd"
                        + "              WHERE bdl.prs_dienst_key = dd.prs_dienst_key"
                        + "                AND bdl.prs_bedrijf_key IN (SELECT cp.prs_bedrijf_key"
                        + "                                              FROM prs_contactpersoon cp"
                        + "                                             WHERE cp.prs_perslid_key = " + user_key + ")"
                        + "                AND bdl.alg_locatie_key = g.alg_locatie_key"
                        + "             UNION"
                        + "             SELECT bdl.alg_gebouw_key"
                        + "               FROM prs_bedrijfdienstlocatie bdl"
                        + "                  , prs_dienst dd"
                        + "              WHERE bdl.prs_dienst_key = dd.prs_dienst_key"
                        + "                AND bdl.prs_bedrijf_key IN (SELECT cp.prs_bedrijf_key"
                        + "                                              FROM prs_contactpersoon cp"
                        + "                                             WHERE cp.prs_perslid_key = " + user_key + ")"
                        + "                AND bdl.alg_gebouw_key = g.alg_gebouw_key)";
  return bdl_gebouw_niveau
}

// Bedrijfdienstlocatie afhankelijkheid voor terrein gedeelte.
function getBdlLocatieNiveau(tableref)
{
  var extra_from = "";
  var extra_where1 = "";
  var extra_where2 = "";
  switch (tableref)
  {
    case "r": extra_from   = "   , alg_v_aanwezigdistrict ad";
              extra_where1 = " AND al.alg_district_key = ad.alg_district_key"
                           + " AND ad.alg_regio_key = r.alg_regio_key";
              extra_where2 = extra_where1;
              // Geen break.
    case "d": extra_from   += "   , alg_v_aanweziglocatie al";
              extra_where1 += " AND bdl.alg_locatie_key = al.alg_locatie_key";
              extra_where2 += " AND ag.alg_locatie_key = al.alg_locatie_key";
              if (tableref == "d")
              {
                extra_where1 += " AND al.alg_district_key = d.alg_district_key";
                extra_where2 += " AND al.alg_district_key = d.alg_district_key";
              }
              break;
    case "w": extra_from   = "   , prs_v_werkplek_gegevens wpg";
              extra_where1 = " AND wpg.alg_locatie_key = bdl.alg_locatie_key"
                           + " AND wpg.alg_ruimte_key = w1.prs_alg_ruimte_key";
              extra_where2 = extra_where1;
              break;
    default:  extra_where1 += " AND bdl.alg_locatie_key = " + tableref + ".alg_locatie_key";
              extra_where2 += " AND bdl.alg_locatie_key = " + tableref + ".alg_locatie_key";
              break;
  }

  // Is er een dienst die de scope heeft voor alle gebouwen en locaties. Dit is het geval als er geen locaties of gebouwen zijn ingevuld.
  // Dan geen bedrijfdienstlocatie scope beperking op locatie niveau.
  var sql = "SELECT bdl.prs_bedrijfdienstlocatie_key"
          + "  FROM prs_bedrijfdienstlocatie bdl"
          + " WHERE bdl.prs_bedrijf_key IN (SELECT cp.prs_bedrijf_key"
          + "                                 FROM prs_contactpersoon cp"
          + "                                WHERE cp.prs_perslid_key = " + user_key + ")"
          + "   AND bdl.alg_locatie_key IS NULL"
          + "   AND bdl.alg_gebouw_key IS NULL"
    var oRs = Oracle.Execute(sql);
    if (!oRs.eof)
      return ""; // Geen bedrijfdienstlocatie scope beperking op gebouw en locatie.
    oRs.Close();

  var bdl_locatie_niveau = " AND EXISTS (SELECT bdl.alg_locatie_key"
                         + "               FROM prs_bedrijfdienstlocatie bdl"
                         + "                  , prs_dienst dd"
                         + extra_from
                         + "              WHERE bdl.prs_dienst_key = dd.prs_dienst_key"
                         + "                AND bdl.prs_bedrijf_key IN (SELECT cp.prs_bedrijf_key"
                         + "                                              FROM prs_contactpersoon cp"
                         + "                                             WHERE cp.prs_perslid_key = " + user_key + ")"
                         + extra_where1
                         + "             UNION"
                         + "             SELECT ag.alg_locatie_key"
                         + "               FROM prs_bedrijfdienstlocatie bdl"
                         + "                  , prs_dienst dd"
                         + "                  , alg_v_aanweziggebouw ag"
                         + extra_from
                         + "              WHERE bdl.prs_dienst_key = dd.prs_dienst_key"
                         + "                AND bdl.alg_gebouw_key = ag.alg_gebouw_key"
                         + "                AND bdl.prs_bedrijf_key IN (SELECT cp.prs_bedrijf_key"
                         + "                                              FROM prs_contactpersoon cp"
                         + "                                             WHERE cp.prs_perslid_key = " + user_key + ")"
                         + extra_where2
                         + ")";
  return bdl_locatie_niveau
}

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 (al.alg_locatie_vervaldatum IS NULL OR al.alg_locatie_vervaldatum > TRUNC(SYSDATE))"
                              + " 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;
      // Voor backo2 moet de bedrijfdienstlocatie meegenomen worden.
      case "INCVRB2": lfiltClause = getBdlLocatieNiveau("r");
                      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 (al.alg_locatie_vervaldatum IS NULL OR al.alg_locatie_vervaldatum > TRUNC(SYSDATE))"
                              + " 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;
      case "FACMLD": 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_mld = 1"
                              + " AND (al.alg_locatie_vervaldatum IS NULL OR al.alg_locatie_vervaldatum > TRUNC(SYSDATE))"
                              + " 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 (al.alg_locatie_vervaldatum IS NULL OR al.alg_locatie_vervaldatum > TRUNC(SYSDATE))"
                              + " AND (ag.alg_gebouw_vervaldatum IS NULL OR ag.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                              + " AND al.alg_district_key = d.alg_district_key)";
                  break;
      // Voor backo2 moet de bedrijfdienstlocatie meegenomen worden.
      case "INCVRB2": lfiltClause = getBdlLocatieNiveau("d");
                      break;
      // Check if district has locations
      case "EXPMLD":
      case "EXP": lfiltClause = " AND EXISTS"
                              + " (SELECT ''"
                              + "    FROM alg_v_aanweziglocatie al"
                              + "   WHERE al.alg_district_key = d.alg_district_key"
                              + "     AND (al.alg_locatie_vervaldatum IS NULL OR al.alg_locatie_vervaldatum > TRUNC(SYSDATE))"
                              + " )";
                  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 (al.alg_locatie_vervaldatum IS NULL OR al.alg_locatie_vervaldatum > TRUNC(SYSDATE))"
                              + " 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;
      case "FACMLD": 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_mld = 1"
                              + " AND (al.alg_locatie_vervaldatum IS NULL OR al.alg_locatie_vervaldatum > TRUNC(SYSDATE))"
                              + " 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: ""};

  function filtClauseFAC(isMLD)
  { // 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"
                       + ( isMLD ? " AND gg.alg_gebouw_mld = 1" : "" )
                       + "    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 = " + ( params.outerjoinlocatie
                                                           ? "DECODE(l.alg_locatie_key, NULL, gg.alg_locatie_key, l.alg_locatie_key)"
                                                           : "l.alg_locatie_key"
                                                           )
                       + "  UNION ALL"
                       + " SELECT ''"
                       + "   FROM alg_v_aanwezigterreinsector t"
                       + "  WHERE t.alg_locatie_key = " + ( params.outerjoinlocatie
                                                          ? "DECODE(l.alg_locatie_key, NULL, t.alg_locatie_key, l.alg_locatie_key)"
                                                          : "l.alg_locatie_key"
                                                          )
                       + ")";
    return lfiltClauseFAC;
  }

  function filtClauseEXP(isMLD)
  {
    var lfiltClauseEXP = " AND EXISTS"
                       + "  (SELECT ''"
                       + "     FROM alg_v_aanweziggebouw g"
                       + "    WHERE g.alg_locatie_key = l.alg_locatie_key"
                       + ( isMLD ? " AND g.alg_gebouw_mld = 1" : "" )
                       + "      AND (g.alg_gebouw_vervaldatum IS NULL OR g.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                       + (pfiltcode == "INCVRB2" // Voor backo2 moet de bedrijfdienstlocatie meegenomen worden.
                         ? getBdlGebouwNiveau()
                         : "")
                       + "    UNION ALL"
                       + "   SELECT ''"
                       + "     FROM alg_v_aanwezigterreinsector t"
                       + "    WHERE t.alg_locatie_key = l.alg_locatie_key"
                       + (pfiltcode == "INCVRB2" // Voor backo2 moet de bedrijfdienstlocatie meegenomen worden.
                         ? getBdlLocatieNiveau("t")
                         : "")
                       + " )";
    return lfiltClauseEXP;
  }

  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 += filtClauseEXP();
                  break;

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

      case "FACMLD": lfiltClause.where = filtClauseFAC(true);
                     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 += filtClauseFAC();  // 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 += filtClauseFAC();  // 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"
                                     + "      AND (res_deel_vervaldatum IS NULL OR res_deel_vervaldatum > TRUNC(SYSDATE))"
                                     +        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 += filtClauseFAC();  // Ook dat nog
                  break;

      case "INCVR":   // Include virtual rooms, default these are NOT included.
      case "INCVRB2": // Voor backo2 moet de bedrijfdienstlocatie meegenomen worden.
                      lfiltClause.where = filtClauseEXP();
                      break;

      case "EXP": // vervallen gebouwen niet tonen
                  lfiltClause.where = filtClauseEXP();
                  break;
      case "EXPMLD": // Vervallen gebouwen en gebouwen waarop geen meldingen kunnen worden gedaan niet tonen
                     lfiltClause.where = filtClauseEXP(true);
                     break;
    }
  }

  if (params.stdm_key > 0)
    lfiltClause.where += get_rel_obj_filter(params.stdm_key, 2)
                       // Als er ruimtefuncties zijn gedefinieerd, dan moet de locatie wel ruimtes hebben die aan de ruimtefunctie voldoen.
                       + get_srtruimte_filter(params.stdm_key, 2);

  return lfiltClause;
}

function getFiltClauseGebouw(pfiltcode, params)
{
  params = params || {};
  var lfiltClause = {code: "", from: "", where_geb: "", where_ter: ""};
  // Facilitair relevant hebben we vaker nodig
  var lfiltClauseFAC = " AND sg.alg_srtgebouw_passief IS NULL";

  if (pfiltcode && pfiltcode != "")
  {
    switch(pfiltcode)
    {
      case "BEZ": lfiltClause.where_geb = " AND g.alg_gebouw_bez = 1";
                  break;
      // Filter als gevolg van UWVA#14613
      case "RES": var loc_scope_act_filter = get_loc_scope_act_filter(params, 3);
                  lfiltClause.from = loc_scope_act_filter.from;
                  lfiltClause.where_geb = " AND (g.alg_gebouw_vervaldatum IS NULL OR g.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                                        + " AND EXISTS (SELECT ''"
                                                    + "   FROM res_v_alg_ruimte_gegevens rrg"
                                                    + "      , res_alg_ruimte rar"
                                                    + "      , res_ruimte rr"
                                                    + "      , res_activiteitdiscipline rad"
                                                    + "  WHERE rar.res_alg_ruimte_verwijder IS NULL"
                                                    + "    AND rr.res_ruimte_verwijder IS NULL"
                                                    + "    AND rar.res_ruimte_key = rr.res_ruimte_key"
                                                    + "    AND rar.res_ruimte_key = rrg.res_ruimte_key"
                                                    + "    AND rr.res_discipline_key = rad.res_discipline_key"
                                                    + ( params.act_key && params.act_key > 0
                                                      ? "    AND rad.res_activiteit_key = " + params.act_key
                                                      : ""
                                                      )
                                                    + "    AND rrg.alg_gebouw_key = g.alg_gebouw_key"
                                                    + ")"
                                        + loc_scope_act_filter.where
                                        + lfiltClauseFAC;  // Ook dat nog
                  break;
      case "FAC": lfiltClause.where_geb = " AND (g.alg_gebouw_vervaldatum IS NULL OR g.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                                        + lfiltClauseFAC;
                  break;
      case "FACMLD": lfiltClause.where_geb = " AND (g.alg_gebouw_vervaldatum IS NULL OR g.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                                           + " AND g.alg_gebouw_mld = 1"
                                           + lfiltClauseFAC;
                   break;
      case "INCVR":   // Include virtual rooms, default these are NOT included.
      case "INCVRB2": // Voor backo2 moet de bedrijfdienstlocatie meegenomen worden.
                      lfiltClause.where_geb = (pfiltcode == "INCVRB2"
                                              ? getBdlGebouwNiveau()
                                              : "");

                      lfiltClause.where_ter = (pfiltcode == "INCVRB2"
                                              ? getBdlLocatieNiveau("t")
                                              : "");
                      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_geb = " 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_geb += get_res_bezorgfilter(params, 3);
                   lfiltClause.where_geb += lfiltClauseFAC;  // Ook dat nog
                   break;
      case "RESA": // RES Afhaal: 'thuishaven' objecten en catering die een ruimte-scope heeft
                   lfiltClause.where_geb = " 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"
                                         + "      AND (res_deel_vervaldatum IS NULL OR res_deel_vervaldatum > TRUNC(SYSDATE))"
                                         +        get_res_afhaalfilter(params, true)
                                         +        not_reserveerbare_ruimte
                                         + ")";
                   break;

      case "CAD": // Die met CAD_TEKENING record
                  lfiltClause.where_geb = " 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 AND parkgebter.vrij <> 0";
                  lfiltClause.where_ter = " AND parkgebter.alg_terreinsector_key = t.alg_terreinsector_key AND parkgebter.vrij <> 0";
                  break;
    }
  }
  if (params.stdm_key > 0)
  {
    lfiltClause.where_geb += get_rel_obj_filter(params.stdm_key, 3)
                           // Als er ruimtefuncties zijn gedefinieerd, dan moet het gebouw wel ruimtes hebben die aan de ruimtefunctie voldoen.
                           + get_srtruimte_filter(params.stdm_key, 3);

    if (params.terrein)
      lfiltClause.where_ter += get_rel_obj_filter(params.stdm_key, 3.5)
                       // Als er ruimtefuncties zijn gedefinieerd voor de standaard melding, dan geen terreinen tonen.
                       + get_srtruimte_filter(params.stdm_key, 3.5);
  }

  return lfiltClause;
}

function getFiltClauseVerdieping(pfiltcode, params)
{
  params = params || {};
  var lfiltClause = {from: "", where: ""};
  function filtClauseFAC(isMLD)
  {  // 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"
                       + ( isMLD ? " AND g.alg_gebouw_mld = 1" : "")
                       + " 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)";
    return lfiltClauseFAC;
  }
  function filtClauseEXP(isMLD)
  { // Nog niet vervallen gebouwen
    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"
                       + (isMLD ? " AND xg.alg_gebouw_mld = 1" : "")
                       + " AND xg.alg_gebouw_key = v.alg_gebouw_key)";
    return lfiltClauseEXP;
  }

  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;
      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 = filtClauseEXP();
                  break;

      case "EXPMLD": lfiltClause.where = filtClauseEXP(true);
                     break;

      case "INCVR":   lfiltClause.where = filtClauseEXP();
                      break;

      case "INCVRB2": lfiltClause.where = getBdlGebouwNiveau(); // Voor backo2 moet de bedrijfdienstlocatie meegenomen worden.
                      break;

      // Filter als gevolg van UWVA#14613
      case "RES": // Er is (nog) nergens een verdiepingfilter bij reserveerbare ruimten

      case "FAC": lfiltClause.where = filtClauseFAC();
                  break;

      case "FACMLD": lfiltClause.where = filtClauseFAC(true);
                     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 += filtClauseFAC();  // 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"
                                    + "      AND (res_deel_vervaldatum IS NULL OR res_deel_vervaldatum > TRUNC(SYSDATE))"
                                    +        get_res_afhaalfilter(params, true)
                                    +        not_reserveerbare_ruimte
                                    + ")";
                  break;
    }
  }

  if (params.stdm_key > 0)
    lfiltClause.where += get_rel_obj_filter(params.stdm_key, 4)
                       // Als er ruimtefuncties zijn gedefinieerd, dan moet de verdieping wel ruimtes hebben die aan de ruimtefunctie voldoen.
                       + get_srtruimte_filter(params.stdm_key, 4);

  return lfiltClause;
}

function getFiltClauseRuimte(pfiltcode, params)
{
  params = params || {};
  var lfiltClause = {from: "", where: ""};
  function filtClauseFAC(isMLD)
  { // 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"
                       + ( isMLD ? " AND ag.alg_gebouw_mld = 1" : "" )
                       + " AND (ag.alg_gebouw_vervaldatum IS NULL OR ag.alg_gebouw_vervaldatum > TRUNC(SYSDATE))"
                       + " AND sg.alg_srtgebouw_key(+) = ag.alg_srtgebouw_key"
                       + " AND av.alg_verdieping_key = r.alg_verdieping_key)";
    return lfiltClauseFAC;
  }
  function filtClauseEXP(isMLD)
  {
    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"
                       + ( isMLD ? " AND xag.alg_gebouw_mld = 1" : "")
                       + " 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)";
    return lfiltClauseEXP;
  }

  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;

      case "EXP": lfiltClause.where = filtClauseEXP();
                  break;

      case "EXPMLD": lfiltClause.where = filtClauseEXP(true);
                  break;

      case "INCVR":   lfiltClause.where = filtClauseEXP();
                      break;

      case "INCVRB2": lfiltClause.where = getBdlGebouwNiveau(); // Voor backo2 moet de bedrijfdienstlocatie meegenomen worden.
                      break;

      // Filter als gevolg van UWVA#14613
      case "RES": // Er is geen ruimtefilter bij reserveerbare ruimten

      case "FAC": lfiltClause.where = filtClauseFAC();
                  break;

      case "FACMLD": lfiltClause.where = filtClauseFAC(true);
                     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'"
                                    + "      AND (res_deel_vervaldatum IS NULL OR res_deel_vervaldatum > TRUNC(SYSDATE))"
                                    +        get_res_afhaalfilter(params, true)
                                    + ")"
                                    + not_reserveerbare_ruimte;
                  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
                                    + filtClauseFAC();  // Ook dat nog
                  break;
    }
  }

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

  if (params.stdm_key > 0)
    lfiltClause.where += get_rel_obj_filter(params.stdm_key, 5)
                       // De ruimtefunctie moet aan de standaard melding gekoppeld zijn.
                       + get_srtruimte_filter(params.stdm_key, 5);

  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;

      // Voor backo2 moet de bedrijfdienstlocatie meegenomen worden.
      case "INCVRB2": lfiltClause = getBdlLocatieNiveau("w");
                      break;
    }
  }
  return lfiltClause;
}

function get_rel_obj_filter(stdm_key, level)
{
    var stdm_key_bestaat = false;
    var sql = "SELECT msm.ins_srtinst_verplichtstatus"
            + "     , COUNT(mss.mld_stdmelding_srtinst_key) aantal"
            + "  FROM mld_stdmelding msm"
            + "     , mld_stdmelding_srtinst mss"
            + " WHERE msm.mld_stdmelding_key = mss.mld_stdmelding_key(+)"
            + "   AND msm.mld_stdmelding_key = " + stdm_key
            + " GROUP BY msm.ins_srtinst_verplichtstatus";
    var oRs = Oracle.Execute(sql);
    var srtinst_verplichtstatus = oRs("ins_srtinst_verplichtstatus").Value == 1;
    var srtinst_aanwezig = oRs("aantal").Value;
    var stdm_key_bestaat = true;
    oRs.Close();

    var rel_obj_filter = "";
    if (srtinst_verplichtstatus && srtinst_aanwezig > 0)
    {
    var filter_table = "";
        switch (level)
        {
            case 5:   filter_table = " AND ao.alg_ruimte_key = r.alg_ruimte_key";
                      break;
            case 4:   filter_table = " AND ao.alg_verdieping_key = v.alg_verdieping_key";
                      break;
            case 3.5: filter_table = " AND ao.alg_terreinsector_key = t.alg_terreinsector_key";
                      break;
            case 3:   filter_table = " AND ao.alg_gebouw_key = g.alg_gebouw_key";
                      break;
            case 2:   filter_table = " AND ao.alg_locatie_key = l.alg_locatie_key";
                      break;
        }

      if (stdm_key_bestaat && filter_table != "")
      {
        rel_obj_filter = " AND EXISTS"
                       + " (SELECT 'x'"
                       + "    FROM alg_v_allonroerendgoed ao"
                       + "   WHERE ao.alg_ruimte_key IN"
                               + " (SELECT ins_alg_ruimte_key"
                               + "    FROM ins_deel"
                               + "   WHERE ins_srtdeel_key IN"
                                       + " (SELECT DISTINCT mss.ins_srtdeel_key"
                                       + "    FROM mld_v_mld_stdmelding_srtinst mss"
                                       + "   WHERE mss.mld_stdmelding_key = " + stdm_key
                                       + " )"
                               + "     AND ins_deel_verwijder IS NULL"
                               + " )"
                       + "     AND ao.alg_type = 'R'"
                       +       filter_table
                       + " )";
      }
    }
    return rel_obj_filter;
}

function get_srtruimte_filter(stdm_key, level)
{
    var no_srtruimte = " NOT EXISTS (SELECT '1'"
                   + "               FROM mld_stdmelding_srtruimte mss"
                   + "              WHERE mss.mld_stdmelding_key = " + stdm_key + ")";

  if (level == 3.5)
    var rel_srtruimte_filter = " AND" + no_srtruimte;
  else
    var rel_srtruimte_filter = " AND (EXISTS (SELECT '1'"
                             + "                FROM mld_stdmelding_srtruimte mss"
                             + (level <= 4
                               ? "                 , alg_v_aanwezigruimte r"
                                 + "               , alg_srtruimte sr"
                               : "")
                             + (level <= 3
                               ? "                 , alg_v_aanwezigverdieping v"
                               : "")
                             + (level == 2
                               ? "                 , alg_v_aanweziggebouw g"
                               : "")
                             + "               WHERE mss.alg_srtruimte_key = sr.alg_srtruimte_key"
                             + "                 AND mss.mld_stdmelding_key = " + stdm_key
                             + (level <= 4
                               ? "               AND sr.alg_srtruimte_key = r.alg_srtruimte_key"
                                 + "             AND r.alg_verdieping_key = v.alg_verdieping_key"
                               : "")
                             + (level <= 3
                               ? "               AND v.alg_gebouw_key = g.alg_gebouw_key"
                               : "")
                             + (level == 2
                               ? "                 AND g.alg_locatie_key = l.alg_locatie_key"
                               : "")
                             + "     )"
                             + " OR" + no_srtruimte + ")";

  return rel_srtruimte_filter
}

function get_res_bezorgfilter(params, level)
{
    params = params || {};
    var res_deel_key = getQParamInt("res_deel_key", params.res_deel_key||-1);
    var res_deel_alg_level = -1;
    var filter_deel = "";
    var bezorgfilter = "";


    var sql_CV = "SELECT DISTINCT DECODE(ins_discipline_min_level, 1, 'V', 2, 'C', 3, 'R') srtvoorziening"
               + "  FROM res_activiteitdiscipline ad"
               + "     , res_discipline rd"
               + " WHERE ad.res_discipline_key = rd.ins_discipline_key"
               + "   AND ad.res_activiteit_key = " + params.act_key;
    var sql_CV_nr = "SELECT COUNT(*) aantal"
                  + "  FROM (" + sql_CV + ")";
    var oRs = Oracle.Execute(sql_CV_nr);
    var v_aantal = oRs("aantal").Value;
    oRs.Close();

    var v_srtvoorziening = "V";
    if (v_aantal == 1)
    {
        // Catering OF voorzieningen
        var oRs = Oracle.Execute(sql_CV);
        var v_srtvoorziening = oRs("srtvoorziening").Value;
        oRs.Close();
    }

    if (v_srtvoorziening == "V")
    {
        // Alleen voorzieningen of voorzieningen EN catering.
        var deel_filter = "";
        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) deel_filter = " AND rr.alg_ruimte_key = "     + oRs("alg_ruimte_key").Value;
            if (level == 4 && res_deel_alg_level >= 4) deel_filter = " AND vv.alg_verdieping_key = " + oRs("alg_verdieping_key").Value;
            if (level == 3 && res_deel_alg_level >= 3) deel_filter = " AND gg.alg_gebouw_key = "     + oRs("alg_gebouw_key").Value;
            if (level == 2 && res_deel_alg_level >= 2) deel_filter = " AND gg.alg_locatie_key = "    + oRs("alg_locatie_key").Value;
            oRs.close();
        }
        bezorgfilter = " AND EXISTS"
                     + " (SELECT '' "
                     + "    FROM alg_ruimte rr"
                     + "       , alg_verdieping vv"
                     + "       , alg_gebouw gg "
                     + "   WHERE rr.alg_ruimte_verwijder IS NULL "
                     + deel_filter
                     + (level >  4 ? " AND rr.alg_verdieping_key = vv.alg_verdieping_key " : "")
                     + (level <= 3 ? " AND vv.alg_gebouw_key = gg.alg_gebouw_key " : "")
                     + (level <= 2 ? " AND gg.alg_locatie_key = l.alg_locatie_key" : "")
                     + ")";
    }
    else
    {
        // Alleen catering
        if (!params.scope)
        {
            bezorgfilter = "";
        }
        else
        {
            var niveau = {alias: "l", field: "alg_district_key"};
            switch (level)
            {
                case 2: niveau = {alias: "l", field: "alg_locatie_key"}; break;
                case 3: niveau = {alias: "g", field: "alg_gebouw_key"}; break;
                case 4: niveau = {alias: "v", field: "alg_verdieping_key"}; break;
                case 5: niveau = {alias: "r", field: "alg_ruimte_key"}; break;
            }

            bezorgfilter = "AND " + niveau.alias + "." + niveau.field + " IN "
                         + "(SELECT aob." + niveau.field
                         + "   FROM ( SELECT alg_onrgoed_key"
                                  + "      , alg_onrgoed_niveau"
                                  + "      , res_discipline_key"
                                  + "      , res_srtartikel_og_verwijder alg_onrgoed_verwijder"
                                  + "      , 'C'  object_type"
                                  + "   FROM res_srtartikel_onrgoed"
                                  + ") obj"
                         + "      , res_activiteitdiscipline rad"
                         + "      , alg_v_onrgoed_boom aob"
                         + "      , alg_ruimte r"
                         + "  WHERE rad.res_discipline_key = obj.res_discipline_key"
                         + "    AND r.alg_ruimte_key = aob.alg_ruimte_key"
                         + "    AND (  (obj.alg_onrgoed_niveau = 'R' and obj.alg_onrgoed_key = aob.alg_ruimte_key)"
                         + "        OR (obj.alg_onrgoed_niveau = 'V' and obj.alg_onrgoed_key = aob.alg_verdieping_key)"
                         + "        OR (obj.alg_onrgoed_niveau = 'G' and obj.alg_onrgoed_key = aob.alg_gebouw_key)"
                         + "        OR (obj.alg_onrgoed_niveau = 'L' and obj.alg_onrgoed_key = aob.alg_locatie_key)"
                         + "        OR (obj.alg_onrgoed_niveau = 'D' and obj.alg_onrgoed_key = aob.alg_district_key)"
                         + "        )"
                         + "    AND obj.alg_onrgoed_verwijder IS NULL"
                         + "    AND rad.res_activiteit_key = " + params.act_key
                         + ")";
        }
    }
    return " /* get_res_bezorgfilter */ " + bezorgfilter;
}

// 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_discipline_key IS NOT NULL"
            + "   AND 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 timeout
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.res_discipline_key = ra.res_discipline_key"
                            + "   AND (  (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 SYSDATE BETWEEN COALESCE(a.res_srtartikel_og_ingangsdatum, ra.res_artikel_ingangsdatum, SYSDATE)"
                            + "                   AND COALESCE(a.res_srtartikel_og_vervaldatum,  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"
                            + (params.act_key > 0
                              ? " AND a.res_discipline_key IN (SELECT res_discipline_key"
                                + "                              FROM res_activiteitdiscipline"
                                + "                             WHERE res_activiteit_key = " + params.act_key + ")"
                              : "")
                            // Verbruiksartikelen met Locatie(L) scope.
                            + " 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(a.res_srtartikel_og_ingangsdatum, ra.res_artikel_ingangsdatum, SYSDATE)"
                            + "                   AND COALESCE(a.res_srtartikel_og_vervaldatum,  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"
                            + (params.act_key > 0
                              ? " AND a.res_discipline_key IN (SELECT res_discipline_key"
                                + "                              FROM res_activiteitdiscipline"
                                + "                             WHERE res_activiteit_key = " + params.act_key + ")"
                              : "")
                            // Voorzieningen.
                            + " UNION "
                            + "SELECT scope." + pSelect
                            + "  FROM res_v_aanwezigdeel a"
                            + "     , alg_v_onrgoed_boom scope"
                            + "     , res_v_deelscope ds"
                            + " WHERE a.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 (a.res_deel_vervaldatum IS NULL OR a.res_deel_vervaldatum > SYSDATE)" // Zijn er wel geldige voorzieningen onder deze catalogus?
                            + (params.act_key > 0
                              ? " AND a.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;
}
%>
