<% /*
     $Revision$
     $Id$

    File:               bedrijfFilter.inc
    Description:        functies voor bedrijf suggest velden
    Globals:
    Context:
    Note:
*/ %>


<%
function getFiltClauseUitvoerende(pfiltcode, params)
{
  if (params.onrgoed_key && params.onrgoed_key > 0)
  {
    sql = " SELECT alg_regio_key"
        + "      , d.alg_district_key"
        + "      , l.alg_locatie_key"
        + "      , alg_gebouw_key"
        + "      , alg_verdieping_key"
        + "      , alg_ruimte_key"
        + "   FROM alg_v_allonroerendgoed aog"
        + "      , alg_locatie l"
        + "      , alg_district d"
        + "  WHERE aog.alg_locatie_key = l.alg_locatie_key"
        + "    AND l.alg_district_key = d.alg_district_key"
        + "    AND aog.alg_onroerendgoed_keys = " + params.onrgoed_key;
  }
  else
  {
    sql = " SELECT alg_regio_key"
        + "      , d.alg_district_key"
        + "      , l.alg_locatie_key"
        + "      , null alg_gebouw_key"
        + "      , null alg_verdieping_key"
        + "      , null alg_ruimte_key"
        + "   FROM alg_locatie l"
        + "      , alg_district d"
        + "  WHERE l.alg_district_key = d.alg_district_key"
        + "    AND l.alg_locatie_key = "
        + (params.loc_key && params.loc_key > 0
          ? params.loc_key
          : "-1");
  }
  oRs = Oracle.Execute(sql);

  sql_web_ordbof = " SELECT prs_perslid_key"
                 + "   FROM fac_gebruikersgroep gg"
                 + "      , fac_groeprechten gr"
                 + "      , fac_functie f"
                 + "  WHERE gg.fac_groep_key = gr.fac_groep_key"
                 + "    AND gr.fac_functie_key = f.fac_functie_key"
                 + "    AND f.fac_functie_code = 'WEB_MLDORD'"
                 + (params.disc_key && params.disc_key > 0
                   ? "  AND gr.ins_discipline_key = " + params.disc_key
                   : "");

  if (!oRs.eof)
  {
    sql_web_ordbof += " AND (fac_gebruiker_alg_level_read = -1"
                      + " OR (fac_gebruiker_alg_level_read = 0"
                        + " AND EXISTS ("
                          + " SELECT prs_perslid_key"
                          + " FROM alg_v_my_region mr"
                          + " WHERE gg.prs_perslid_key = mr.prs_perslid_key"
                          + " AND mr.alg_regio_key = " + oRs("alg_regio_key").Value + "))"
                      + " OR (fac_gebruiker_alg_level_read = 1"
                        + " AND EXISTS ("
                          + " SELECT prs_perslid_key"
                          + " FROM alg_v_my_district md"
                          + " WHERE gg.prs_perslid_key = md.prs_perslid_key"
                          + " AND md.alg_district_key = " + oRs("alg_district_key").Value + "))"
                      + "OR (fac_gebruiker_alg_level_read = 2"
                        + " AND EXISTS ("
                          + " SELECT prs_perslid_key"
                          + " FROM alg_v_my_location ml"
                          + " WHERE gg.prs_perslid_key = ml.prs_perslid_key"
                          + " AND ml.alg_locatie_key = " + oRs("alg_locatie_key").Value + "))"
                      + " OR (fac_gebruiker_alg_level_read = 3"
                        + " AND EXISTS ("
                          + " SELECT prs_perslid_key"
                          + " FROM alg_v_my_building mg"
                          + " WHERE gg.prs_perslid_key = mg.prs_perslid_key"
                          + " AND mg.alg_gebouw_key = " + oRs("alg_gebouw_key").Value + "))"
                      + " OR (fac_gebruiker_alg_level_read = 4"
                        + " AND EXISTS ("
                          + " SELECT prs_perslid_key"
                          + " FROM alg_v_my_floor mf"
                          + " WHERE gg.prs_perslid_key = mf.prs_perslid_key"
                          + " AND mf.alg_verdieping_key = " + oRs("alg_verdieping_key").Value + "))"
                      + " OR (fac_gebruiker_alg_level_read = 5"
                        + " AND EXISTS ("
                          + " SELECT prs_perslid_key"
                          + " FROM alg_v_my_room mr"
                          + " WHERE gg.prs_perslid_key = mr.prs_perslid_key"
                          + " AND mr.alg_ruimte_key = " + oRs("alg_ruimte_key").Value + ")))";
  }

  if (params.dienst && params.dienst > 0)
    sql_dienst = " AND dl.prs_dienst_key = " + params.dienst ;
  else
    sql_dienst = "";

  // De uitvoerende. CONN#15546 vindt dat voor BES-meldingen er ook beter
  // uit leveranciers kan worden gekozen dan uit uitvoerenden.
  // Kan dit nog zuiverder? Bijvoorbeeld tegelijk MLD en BES?
  if (params.lutype == "L")
    var uitvtabel = "prs_v_leverancierbedrijf"; // prs_bedrijf_leverancier = 1.
  else if (params.lutype == "U")
    var uitvtabel = "prs_v_uitvoerendebedrijf"; // prs_bedrijf_uitvoerende = 1.
  else if (params.lutype == "LU")
    var uitvtabel = "(SELECT prs_bedrijf_key"
                  + "      , prs_bedrijf_naam"
                  + "      , prs_bedrijf_naam_upper"
                  + "   FROM prs_v_leverancierbedrijf"
                  + " UNION"
                  + " SELECT prs_bedrijf_key"
                  + "      , prs_bedrijf_naam"
                  + "      , prs_bedrijf_naam_upper"
                  + "   FROM prs_v_uitvoerendebedrijf)"; // prs_bedrijf_leverancier = 1 en prs_bedrijf_uitvoerende = 1.
  else // lutype == "B"
    var uitvtabel = "prs_v_aanwezigbedrijf"; // aanwezig prs_bedrijf.

  // Zoek de uitvoerenden zo goed mogelijk, dat is:
  // Bij het gebouw als het gebouw bekend is, evt voor gevraagde dienst
  //  Bij de locatie als de locatie bekend is, evt voor gevraagde dienst
  //   Voor de gevraagde dienst
  //    En dan internen die mogen uitvoeren

  // Als in prs_bedrijfdienstlocatie geen scope is aangegeven nemen we eventueel contractscope mee

  // Als bld_key bekend
  sqlG0 =" SELECT dl.prs_bedrijf_key"
       + "      , dl.prs_dienst_key"
       + "      , 2 niveau"
       + "   FROM prs_bedrijfdienstlocatie dl"
       + "  WHERE dl.alg_gebouw_key = " + params.bld_key
       + "  UNION" // geen ALL */
       + " SELECT cc.cnt_prs_bedrijf_key"
       + "      , cc.prs_dienst_key"
       + "      , 2 niveau"
       + "   FROM cnt_contract cc"
       + "      , cnt_contract_plaats ccp"
       + "  WHERE cc.cnt_contract_key = ccp.cnt_contract_key"
       + "    AND sysdate BETWEEN cnt_contract_looptijd_van AND cnt_contract_looptijd_tot"
       + "    AND ccp.cnt_alg_plaats_key = " + params.bld_key
       + "    AND ccp.cnt_alg_plaats_code = 'G'";

  // Als loc_key bekend
  sqlL0 = " SELECT dl.prs_bedrijf_key"
        + "      , dl.prs_dienst_key"
        + "      , 3 niveau"
        + "   FROM prs_bedrijfdienstlocatie dl"
        + "  WHERE dl.alg_locatie_key = " + params.loc_key
        + "  UNION" // geen ALL */
        + " SELECT cc.cnt_prs_bedrijf_key"
        + "      , cc.prs_dienst_key"
        + "      , 3 niveau"
        + "   FROM cnt_contract cc"
        + "      , cnt_contract_plaats ccp"
        + "  WHERE cc.cnt_contract_key = ccp.cnt_contract_key"
        + "    AND sysdate BETWEEN cnt_contract_looptijd_van AND cnt_contract_looptijd_tot"
        + "    AND ccp.cnt_alg_plaats_key = " + params.loc_key
        + "    AND ccp.cnt_alg_plaats_code = 'L'";

  function fsql(ster, sql)
  { return " SELECT b.prs_bedrijf_key uitv_key"
           + "    , " + safe.quoted_sql(L("lcl_mld_bedrijf_prefix") + ster) + " || b.prs_bedrijf_naam naam"
           + "    , " + lcl.xsql('d.prs_dienst_omschrijving', 'd.prs_dienst_key') + " dienst"
           + "    , CASE"
           + "      WHEN b.prs_bedrijf_intern = 1"
           + "      THEN 'BI'"
           + "      ELSE 'BE'"
           + "      END extra"
           + "    , niveau"
           + "    , prs_bedrijf_naam_upper"
           + " FROM " + uitvtabel + " b"
           + "    , (" + sql + ") dl"
           + "    , prs_dienst d"
           + " WHERE b.prs_bedrijf_key = dl.prs_bedrijf_key"
           + "   AND dl.prs_dienst_key = d.prs_dienst_key"
           + "   AND (UPPER(" + safe.quoted_sql(L("lcl_mld_bedrijf_prefix")) + " || b.prs_bedrijf_naam) LIKE " + safe.quoted_sql_wild("%" + params.chars + "%")
           + "        OR UPPER(" + lcl.xsql('d.prs_dienst_omschrijving', 'd.prs_dienst_key') + ") LIKE " + safe.quoted_sql_wild("%" + params.chars + "%") + ")"
           +       sql_dienst;
  }
  sqlL = fsql("*", sqlL0);
  sqlG = fsql("**", sqlG0);

  var lfiltClause = {perslid: "", bedrijf: "", locatie: "", gebouw: ""};
  lfiltClause.bedrijf = (params.exhandler
                        ? "  AND b.prs_bedrijf_key IN (SELECT prs_bedrijf_key FROM prs_contactpersoon WHERE prs_contactpersoon_verwijder IS NULL AND prs_perslid_key = " + user_key + ")"
                        : "")
                      + (params.dienst > 0
                          ? "    AND EXISTS" //
                          + "       (SELECT dl.prs_bedrijf_key"
                          + "          FROM prs_bedrijfdienstlocatie dl "
                          + "         WHERE dl.prs_bedrijf_key = b.prs_bedrijf_key "
                          + "           AND dl.prs_dienst_key = " + params.dienst + ")"
                          : "")
                      + (params.bld_key > 0
                          ? "    AND NOT EXISTS" // De locatiegebonden bedrijven hebben we dan al eerder gehad.
                          + "       (SELECT 1"
                          + "          FROM (" + sqlG + ") dl "
                          + "         WHERE dl.uitv_key = b.prs_bedrijf_key)"
                          : "")
                      + (params.loc_key > 0
                          ? "    AND NOT EXISTS" // De locatiegebonden bedrijven hebben we dan al eerder gehad.
                          + "       (SELECT 1"
                          + "          FROM (" + sqlL + ") dl "
                          + "         WHERE dl.uitv_key = b.prs_bedrijf_key)"
                          : "");

  lfiltClause.perslid = " AND p.prs_perslid_key IN (" + sql_web_ordbof + ")"
                      + ((params.autlevel > 0)
                        ? " AND prs_afdeling_key IN (SELECT ab.prs_afdeling_key1 FROM prs_perslid p, prs_v_afdeling_boom ab"
                          + " WHERE p.prs_afdeling_key = ab.prs_afdeling_key AND prs_perslid_key = " + user_key + ")"
                        : ((params.autlevel == 0)
                          ? " AND p.prs_afdeling_key IN (SELECT a.prs_afdeling_key FROM prs_v_afdeling a "
                            + " WHERE a.prs_bedrijf_key = " + user.afdeling().prs_bedrijf_key() + " )"
                          : ""))
  lfiltClause.locatie = sqlL;
  lfiltClause.gebouw = sqlG;

  if (pfiltcode && pfiltcode != "")
  {
    switch(pfiltcode)
    {
      case 'M': lfiltClause.perslid += " AND p.prs_perslid_key IN (SELECT mld_uitvoerende_keys from mld_opdr)";
                lfiltClause.bedrijf += " AND b.prs_bedrijf_key IN (SELECT mld_uitvoerende_keys from mld_opdr)";
                break;
    }
  }
  return lfiltClause;
}
%>
