<% /*
     $Revision$
     $Id$

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


<%

function getFiltClausePersoon(pfiltcode, params)
{
  var lfiltClause = "";
  if (pfiltcode && pfiltcode != "")
  {
    switch(pfiltcode)
    {
      case 'B':    lfiltClause = " AND p.fac_profiel_key IS NOT NULL";
                   break;
      case 'F':    lfiltClause = " AND p.prs_perslid_key != " + filtvalue;
                   break;
      case 'M':    lfiltClause = " AND p.prs_perslid_key IN (SELECT prs_perslid_key FROM mld_melding)";
                   break;
      case 'O':    // Bestaande aanvragers van bestellingen
                   lfiltClause = " AND p.prs_perslid_key IN"
                               + " (SELECT m.prs_perslid_key"
                               + " FROM mld_melding m"
                               + "    , mld_opdr o"
                               + " WHERE m.mld_melding_key = o.mld_melding_key)";
                   break;
      case 'CNTB': // Contract beheerder
                   lfiltClause = " AND p.prs_perslid_key IN ("
                               + "SELECT prs_perslid_key FROM fac_v_webgebruiker g "
                               + " WHERE g.fac_functie_key=(SELECT fac_functie_key FROM fac_functie WHERE fac_functie_code = 'WEB_CNTUSE') "
                               + " AND g.fac_gebruiker_alg_level_write < 9"
                               + " AND g.fac_gebruiker_prs_level_write < 9"
                               + ") "
                   break;
      case 'BES':  // Bestaande aanvragers van bestellingen
                   lfiltClause = " AND p.prs_perslid_key IN (SELECT prs_perslid_key FROM bes_bestelling)";
                   break;
      case 'BEZH': // Bestaande gastheren van afspraken
                   lfiltClause = " AND p.prs_perslid_key IN (SELECT bez_afspraak_host_key FROM bez_afspraak)";
                   break;
      case 'BEZR': // Bestaande aanvragers van afspraken
                   lfiltClause = " AND p.prs_perslid_key IN (SELECT bez_afspraak_contact_key FROM bez_afspraak)";
                   break;
      case 'CNT':  // Bestaande beheerders van contracten
                   lfiltClause = " AND p.prs_perslid_key IN (SELECT prs_perslid_key_beh FROM cnt_contract)";
                   break;
      case 'CNTE': // Bestaande verantwoordelijke managers van contracten
                   lfiltClause = " AND p.prs_perslid_key IN (SELECT prs_perslid_key_eig FROM cnt_contract)";
                   break;
      case 'CNTN': // Bestaande personen als contractpartij
                   lfiltClause = " AND p.prs_perslid_key IN (SELECT cnt_prs_perslid_key FROM cnt_contract)";
                   break;
      case 'BEHS': // Bestaande behandelaars (@todo binnen mijn max-scopes?)
                   lfiltClause = " AND p.prs_perslid_key IN (SELECT mld_melding_behandelaar_key FROM mld_melding WHERE mld_melding_behandelaar_key IS NOT NULL)";
                   break;
      case 'BEHO': // Bestaande behandelaars van opdrachten
      case 'BEHOC':// Bestaande behandelaars van opdrachten binnen scope van mijn/onze opdrachten. Dan ben ik contactpersoon van uitvoerende bedrijf.
                   lfiltClause = " AND p.prs_perslid_key IN (SELECT prs_perslid_key"
                               + "                             FROM mld_opdr o"
                               + "                            WHERE prs_perslid_key IS NOT NULL"
                               + (pfiltcode == 'BEHOC'
                                 ? "                              AND o.mld_uitvoerende_keys in (SELECT prs_bedrijf_key"
                                   + "                                                            FROM prs_contactpersoon cp"
                                   + "                                                            WHERE cp.prs_contactpersoon_verwijder is null"
                                   + "                                                           AND cp.prs_perslid_key = " + user_key + ")"
                                   : "")
                               + "                          )";
                   break;
      case 'BEHF': // Mogelijke behandelaar (voor toekenning)
                   // Dat is: als ik FO ben: fo-collegas
                   var afd_key = new Perslid(params.prs_key).prs_afdeling_key();
                   // Let op: *mijn* rechten (params.autlevel) doen niet ter zake. Het gaat om de rechten van de collega
                   lfiltClause = " AND p.prs_perslid_key IN"
                               + " (SELECT prs_perslid_key"
                               + " FROM fac_v_webgebruiker g, fac_functie f"
                               + " WHERE g.fac_functie_key = f.fac_functie_key"
                               + " AND g.ins_discipline_key = " + params.disc_key
                               + " AND (g.fac_gebruiker_prs_level_write = -1"
                               + "     OR (g.fac_gebruiker_prs_level_write = 0"
                               + "        AND d.prs_bedrijf_key = (SELECT aa.prs_bedrijf_key"
                               + "                                   FROM prs_v_afdeling aa"
                               + "                                  WHERE aa.prs_afdeling_key = " + afd_key + "))"
                               + "     OR (g.fac_gebruiker_prs_level_write > 0"
                               + "        AND p.prs_afdeling_key IN "
                               + "         (SELECT prs_afdeling_key FROM prs_v_afdeling_familie a"
                               + "           WHERE a.prs_afdeling_elder_key IN"
                               + "                (SELECT aa.prs_afdeling_elder_key"
                               + "                   FROM prs_v_afdeling_familie aa"
                               + "                  WHERE aa.prs_afdeling_key = " + afd_key
                               + "                    AND aa.niveau = g.fac_gebruiker_prs_level_write))"
                               + " ))";
                   if (params.loc_key > 0)
                       lfiltClause += " AND (g.fac_gebruiker_alg_level_write = -1"
                                   + "      OR (g.fac_gebruiker_alg_level_write < 9"
                                   + "          AND " + params.loc_key + " IN "
                                   + "              (SELECT alg_locatie_key FROM fac_v_my_locations "
                                   + "                WHERE prs_perslid_key = p.prs_perslid_key"
                                   + "                  AND niveau = fac_gebruiker_alg_level_write)"
                                   + " ))";
                   lfiltClause +=" AND fac_functie_code = 'WEB_MLDFOF') ";
                   break;
      case 'BEHB': // Mogelijke behandelaar (voor toekenning)
                   // Dat is: als ik BO ben de bo-collegas.
                   var afd_key = new Perslid(params.prs_key).prs_afdeling_key(); // afdeling van de melder!
                   // Let op: *mijn* rechten (params.autlevel) doen niet ter zake. Het gaat om de rechten van de collega
                   lfiltClause = " AND p.prs_perslid_key IN"
                               + " (SELECT prs_perslid_key"
                               + " FROM fac_v_webgebruiker g, fac_functie f"
                               + " WHERE g.fac_functie_key = f.fac_functie_key"
                               + " AND g.ins_discipline_key = " + params.disc_key
                               + " AND (g.fac_gebruiker_prs_level_write = -1"
                               + "     OR (g.fac_gebruiker_prs_level_write = 0"
                               + "        AND d.prs_bedrijf_key = (SELECT aa.prs_bedrijf_key"
                               + "                                   FROM prs_v_afdeling aa"
                               + "                                  WHERE aa.prs_afdeling_key = " + afd_key + "))"
                               + "     OR (g.fac_gebruiker_prs_level_write > 0"
                               + "        AND p.prs_afdeling_key IN "
                               + "         (SELECT prs_afdeling_key FROM prs_v_afdeling_familie a"
                               + "           WHERE a.prs_afdeling_elder_key IN"
                               + "                (SELECT aa.prs_afdeling_elder_key"
                               + "                   FROM prs_v_afdeling_familie aa"
                               + "                  WHERE aa.prs_afdeling_key = " + afd_key
                               + "                    AND aa.niveau = g.fac_gebruiker_prs_level_write))"
                               + " ))";
                   if (params.loc_key > 0)
                       lfiltClause += " AND (g.fac_gebruiker_alg_level_write = -1"
                                   + "      OR (g.fac_gebruiker_alg_level_write < 9"
                                   + "          AND EXISTS"
                                   + "              (SELECT alg_locatie_key FROM fac_v_my_locations fl"
                                   + "                WHERE prs_perslid_key = p.prs_perslid_key"
                                   + "                  AND niveau = fac_gebruiker_alg_level_write"
                                   + "                  AND fl.alg_locatie_key = " + params.loc_key + ")"
                                   + " ))";
                   lfiltClause +=" AND (fac_functie_code = 'WEB_MLDBOF' OR fac_functie_code = 'WEB_MLDBO2')) ";
                   break;
      case 'FING': // externe partijen toegang tot facilitor
                   lfiltClause = " AND p.prs_perslid_key IN ("
                               + "SELECT prs_perslid_key FROM fac_v_webgebruiker g "
                               + " WHERE g.fac_functie_key = (SELECT fac_functie_key FROM fac_functie WHERE fac_functie_code = 'WEB_FINGOE') "
                               + "   AND g.fac_gebruiker_alg_level_read < 9"
                               + "   AND g.fac_gebruiker_prs_level_read < 9"
                               + ") ";
                   break;
      case 'CPO':  // Contactpersonen van bestaande opdrachten
                   lfiltClause = " AND p.prs_perslid_key IN"
                               + " (SELECT o.prs_perslid_key"
                               + " FROM mld_opdr o)";
                   break;
      case 'OBJP': // Personen die een object bezitten
                   lfiltClause = " AND p.prs_perslid_key IN"
                               + " (SELECT d.ins_alg_ruimte_key"
                               + " FROM ins_v_aanwezigdeel d"
                               + " WHERE d.ins_alg_ruimte_type LIKE 'P')";
                   break;
      case 'OCP':  // interne contactpersonen voor opdrachten (behandelaar)
                   lfiltClause = "AND p.prs_perslid_key IN"
                               + " (SELECT prs_perslid_key"
                               + " FROM fac_v_webgebruiker f"
                               + ", fac_functie ff"
                               + " WHERE f.fac_functie_key = ff.fac_functie_key"
                               + "   AND ins_discipline_key = " + params.disc_key
                               + "   AND (fac_functie_code = 'WEB_MLDBOF'"
                               + "        OR fac_functie_code = 'WEB_MLDBO3'"
                               + (params.pbtype == "BI"
                                 ? "      OR fac_functie_code = 'WEB_ORDBO2'"
                                 : "")
                               + "        OR fac_functie_code = 'WEB_ORDBOF')" //(vermoeden is dat MLDBOx hier eigenlijk niet bij hoort)
                               + "   AND f.fac_gebruiker_prs_level_write <9"
                               + "   AND f.fac_gebruiker_alg_level_write <9)";
                   break;
      case 'RESH': // Bestaande gastheren van reserveringen
                   lfiltClause = " AND p.prs_perslid_key IN (SELECT res_rsv_ruimte_host_key FROM res_rsv_ruimte)";
                   break;
      case 'RESR': // Bestaande aanvragers van reserveringen
                   lfiltClause = " AND p.prs_perslid_key IN (SELECT res_rsv_ruimte_contact_key from res_rsv_ruimte)";
                   break;
      case 'ORDBO2':  // externe partijen toegang tot facilitor
                   lfiltClause = " AND p.prs_perslid_key IN ("
                               + "SELECT prs_perslid_key FROM fac_v_webgebruiker g "
                               + " WHERE g.fac_functie_key=(SELECT FAC_FUNCTIE_KEY FROM FAC_FUNCTIE WHERE FAC_FUNCTIE_CODE = 'WEB_ORDBO2') "
                               + "   AND g.fac_gebruiker_alg_level_read < 9"
                               + "   AND g.fac_gebruiker_prs_level_read < 9"
                               + ") ";
                   break;
      case 'MLDORDBOF': // Personen die interne uitvoerende kunnen zijn en waar ik WEB_UURBOF op de discipline heb
      case 'MLDORDFOF': // Personen die interne uitvoerende kunnen zijn en waar ik WEB_UURFOF op de discipline heb
                   // Normaal gesproken doen we niet zo aan losse keys ophalen maar bij UWVA ging de query
                   // van meer dan 60 seconde (onwerkbaar) naar minder dan 1 seconde. De moeite waard.
                   var oRs = Oracle.Execute("SELECT fac_functie_key FROM fac_functie WHERE fac_functie_code = 'WEB_MLDORD'");
                   var mldord_key = oRs("fac_functie_key").Value;
                   var oRs = Oracle.Execute("SELECT fac_functie_key FROM fac_functie WHERE fac_functie_code = " + (pfiltcode=="MLDORDFOF"?"'WEB_UURFOF'":"'WEB_UURBOF'"));
                   var fobo_key = oRs("fac_functie_key").Value;

                   lfiltClause = "AND p.prs_perslid_key IN"
                               + " (SELECT f.prs_perslid_key"
                               + "    FROM fac_v_webgebruiker f"
                               + "       , fac_v_webgebruiker fzelf"
                               + "   WHERE f.fac_functie_key = " + mldord_key
                               + "    AND fzelf.fac_functie_key = " + fobo_key
                               + "    AND f.ins_discipline_key = fzelf.ins_discipline_key"
                               + "    AND fzelf.fac_gebruiker_prs_level_write <9"
                               + "    AND fzelf.fac_gebruiker_alg_level_write <9"
                               + "    AND fzelf.prs_perslid_key = " + user_key
                               + "    AND f.fac_gebruiker_prs_level_read <9" // die ander heeft geen write nodig
                               + "    AND f.fac_gebruiker_alg_level_read <9)";
                   break;
      case 'MSG': // Potentiele berichtontvangers
                   lfiltClause = " AND (p.prs_perslid_oslogin IS NOT NULL OR p.prs_perslid_email IS NOT NULL) ";
                   break;
      case 'BUD': // Potentiele fiatteurs, budgethouders
                   lfiltClause = " AND p.prs_perslid_key IN "
                               + " (SELECT prs_perslid_key FROM prs_kostenplaats WHERE prs_kostenplaats_verwijder IS NULL "
                               + " UNION "
                               + " SELECT prs_perslid_key FROM prs_kostenplaatsgrp) ";
                   break;
      case 'PHB': // Telefoonboek, alleen als ingids==true
                   lfiltClause = " AND prs_perslid_ingids = 1";
                   break;
      case 'TRCK': // Tracking (ongeacht wie/wat/waar)
                   lfiltClause = " AND p.prs_perslid_key IN ("
                               + "       SELECT prs_perslid_key"
                               + "         FROM fac_tracking"
                               + "       ) ";
                   break;
      case 'KP':   // Afdelingen die behoren bij de kostenplaatsen waarvoor ik als bestelbevoegde gemandateerd ben
                   // Heb ik rechten voor alle kostenplaaten
                   sql = "SELECT COUNT('*') allekp"
                       + "  FROM prs_perslidkostenplaats pk"
                       + "     , prs_v_aanwezigperslid p"
                       + "     , prs_kostenplaats k"
                       + "     , prs_afdeling a"
                       + "  WHERE pk.prs_perslid_key = p.prs_perslid_key"
                       + "  AND k.prs_kostenplaats_key(+) = pk.prs_kostenplaats_key"
                       + "  AND a.prs_afdeling_key = p.prs_afdeling_key"
                       + "  AND p.prs_perslid_key = " + user_key
                       + "  AND k.prs_kostenplaats_key IS NULL"
                   var oRs = Oracle.Execute(sql);
                   if (oRs("allekp").value == 1)
                   { // Ik heb rechten op alle kostenplaatsen
                     lfiltClause = " AND d.prs_afdeling_key IN ("
                                 + " SELECT a.prs_afdeling_key"
                                 + "   FROM prs_afdeling a"
                                 + "      , prs_v_aanwezigkostenplaats k"
                                 + "  WHERE a.prs_kostenplaats_key = k.prs_kostenplaats_key)";
                   }
                   else
                   { // Ik heb geen rechten op alle kostenplaatsen
                     lfiltClause = " AND d.prs_afdeling_key IN ("
                                 + " SELECT a.prs_afdeling_key"
                                 + "   FROM prs_afdeling a"
                                 + "  WHERE a.prs_kostenplaats_key IN (SELECT k.prs_kostenplaats_key"
                                 + "   FROM prs_perslidkostenplaats pk"
                                 + "      , prs_v_aanwezigperslid p"
                                 + "      , prs_kostenplaats k"
                                 + "      , prs_afdeling a"
                                 + "  WHERE pk.prs_perslid_key = p.prs_perslid_key"
                                 + "    AND k.prs_kostenplaats_key(+) = pk.prs_kostenplaats_key"
                                 + "    AND a.prs_afdeling_key = p.prs_afdeling_key"
                                 + "    AND p.prs_perslid_key = " + user_key + "))";
                   }
                   break;
      case 'BESV': // Alleen de personen die ook in prs_perslid_voor gebruikt worden
                   lfiltClause = " AND prs_perslid_key IN"
                               + " (SELECT B.prs_perslid_key_voor"
                               + "  FROM bes_bestelling B"
                               + " )";
                   break;
      case 'GV':   // Gebouw Verantwoordelijke
                   lfiltClause = " AND (p.prs_perslid_key IN ("
                               + " SELECT prs_perslid_key_verantw"
                               + "   FROM alg_gebouw"
                               + "  WHERE prs_perslid_key_verantw IS NOT NULL)"
                               + " OR p.prs_perslid_key IN ("
                               + " SELECT prs_perslid_key_verantw2"
                               + "   FROM alg_gebouw"
                               + "  WHERE prs_perslid_key_verantw2 IS NOT NULL))";
                   break;
      case 'INSB':  // Objectbeheerders, met schrijfrechten op INSMAN of INSUSE - gokje
                   lfiltClause = " AND (  (1 = "+ S("ins_can_edit_own_objects")+" )"
                               + "     OR p.prs_perslid_key IN"
                                            + "( SELECT prs_perslid_key"
                                            + "    FROM fac_v_webgebruiker g"
                                            + "   WHERE g.fac_functie_key IN"
                                                    + "( SELECT fac_functie_key"
                                                    + "    FROM fac_functie"
                                                    + "   WHERE fac_functie_code IN ('WEB_INSMAN', 'WEB_INSUSE')"
                                                    + ")"
                                            + "     AND g.fac_gebruiker_alg_level_write < 9"
                                            + "     AND g.fac_gebruiker_prs_level_write < 9"
                                            + ")"
                               + "     )"
                               + " AND (p.prs_perslid_key IN"
                                          + "( SELECT prs_perslid_key"
                                          + "    FROM fac_v_webgebruiker g"
                                          + "   WHERE g.fac_functie_key IN"
                                                  + "( SELECT fac_functie_key"
                                                  + "    FROM fac_functie"
                                                  + "   WHERE fac_functie_code IN ('WEB_INSMAN', 'WEB_INSUSE')"
                                                  + ")"
                                          + "     AND g.fac_gebruiker_alg_level_read < 9"
                                          + "     AND g.fac_gebruiker_prs_level_read < 9"
                                          + ")"
                               + "     )"
                   break;
      case 'INS':  // Bestaande beheerders van bestaande objecten
                   lfiltClause = " AND p.prs_perslid_key IN (SELECT prs_perslid_key_beh FROM ins_deel WHERE ins_deel_verwijder IS NULL)";
                   break;
      case 'MAIL': // Alleen personen die een email hebben
                   lfiltClause = " AND p.prs_perslid_email IS NOT NULL ";
                   break;
      case 'SUBS': // Vervangers
                   var pkey = params.prs_key;
                   var bdr_key = new Perslid(pkey).afdeling().prs_bedrijf_key();
                   var afd_key = new Perslid(pkey).prs_afdeling_key();
                   if (S("prs_collegas_used") == 0) // Bedrijf niveau zit niet in prs_v_afdeling_familie
                     {
                       lfiltClause += " AND p.prs_afdeling_key IN"
                                   + "    (SELECT a.prs_afdeling_key FROM prs_v_afdeling a"
                                   + "      WHERE a.prs_bedrijf_key = " + bdr_key + " )"
                     }

                    // PRS autorisatie
                    if (S("prs_collegas_used") > 0) // Efficiente versie van FAC_V_MY_PRS_AFDELINGEN_WRITE
                      {
                          lfiltClause +=" AND p.prs_afdeling_key IN "
                                     + "    (SELECT prs_afdeling_key FROM prs_v_afdeling_familie a"
                                     + "      WHERE a.prs_afdeling_elder_key IN"
                                     + "        (SELECT aa.prs_afdeling_elder_key"
                                     + "           FROM prs_v_afdeling_familie aa"
                                     + "          WHERE aa.prs_afdeling_key = " + afd_key
                                     + "            AND aa.niveau = " + S("prs_collegas_used") + "))"
                       }
                   break;
      default:     __Log("KIES JUISTE FILTERCODE!!!");
                   lfiltClause = " AND 1 = 2";
                   break;
    }
  }
  if (pfiltcode != 'CPO')
    lfiltClause += " AND prs_perslid_verwijder IS NULL";
  if (params.afd_key) // Afdeling gegeven
    lfiltClause += " AND p.prs_afdeling_key = " + params.afd_key;
  return lfiltClause;
}

// Merk op dat in het algemeen een onChange call naar get_prs_info_ajax.asp
// veel praktischer is, zie bijv. mld_edit_melding.js
function getExtraInfPersoon(pextracode)
{
  var lExtraInf = { selectstr: ", '' extra", fromstr: "", wherestr: "" };
  if (pextracode && pextracode != "")
  {
    switch(pextracode)
    {
      case 'A':  lExtraInf.selectstr = ", " + S("prs_dep_string") + " extra";
                 break;
      case 'AK': lExtraInf.selectstr = ", d.prs_afdeling_key extra";
                 break;
      case 'E':  lExtraInf.selectstr = ", p.prs_perslid_email extra";
                 break;
    }
  }
  return lExtraInf;
}
%>
