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

    File:               SuggestObject.asp
    Description:        Suggereer objecten
    Parameters:         k         De eerste paar letters
                        bAll      Haal alle records op (met nog steeds een maximum van 500)
                        filtcode  Beperkt de lijst met getoonde objecten
                                  'I': Filter op ingenomen objecten (die ingenomen zijn)
                                  'U': Filter op uitgeleende objecten (die uitgeleend zijn)
    Globals:
    Context:
    Note:               Tot nu alleen ondersteund/gebruikt: niet uitgeleende,
                        plaatsgebonden objecten laten zien met objecten suggestbox (filtcode = "I")!
*/ %>

<%
JSON_Result = true;
%>

<!-- #include file="../../Shared/common.inc" -->
<!-- #include file="./suggest.inc" -->
<!-- #include file="./objectFilter.inc" -->
<!-- #include file="../get_objecten_sql.inc" -->
<!-- #include file="../discx3d.inc" -->

<%
var chars = getQParam("k", "");
var bAll = getQParamInt("SuggestAll", 0) == 1;
var module = getQParam("module", "");
var filtcode = getQParam("filtcode", "");
var disc_key = getQParamInt("disc_key", -1);
var srtgroep_key = getQParamInt("srtgroep_key", -1);
var srtdeel_key = getQParamInt("srtdeel_key", -1);
var excludekey = getQParamInt("excludekey", -1);

var stdm_key = getQParamInt("stdm_key", -1);
var prs_key = getQParamInt("prs_key", -1);
var alg_key = getQParamInt("alg_key", -1);
var alg_niveau = getQParam("alg_niveau", "L");

var extracode = getQParam("extraCode", "");
var pautfunction = getQParam("autfunction");
var extraParamValue = getQParam("extraParamValue", "");
var inclComp = getQParamInt("inclComp", 0) == 1;
var relate = getQParamInt("relate", 0) == 1;

chars = chars.replace(/\*/g,"%");

var filt_params = { filtcode: filtcode,
                    disc_key: disc_key,
                    srtgroep_key: srtgroep_key,
                    srtdeel_key: srtdeel_key,
                    excludekey: excludekey
                  };

var filtClause = getFiltClauseObject(filt_params);

if (module == "MLD")
{
  var sql = get_objecten_sql(alg_key, alg_niveau, prs_key, null, stdm_key, { search: chars, extracode: extracode });
  var resultParams = { bAll: bAll,
                       fldName: "deel",
                       fldKey: "ins_deel_key",
                       fldDesc: "ins_srtdeel_omschrijving",
                       fldExtraParam: "ins_srtdeel_omschrijving",
                       extraParamValue: extraParamValue
                     };
}
else
{
  // Objecten laten zien waar ik rechten op heb (die ik mag zien)
  // Objecten kunnen gekoppeld zijn aan een afdeling, persoon, contactpersoon, terrein, ruimte of werkplek (alg_ruimte_type 'A', 'P', 'C;, 'T', 'R' of 'W')
  // met ieder een eigen 3d autorisatie (eigen union tak).
  sqlR = "SELECT d.ins_deel_key"
       + "     , d.ins_deel_omschrijving"
       + "     , " + lcl.xsqla('s.ins_srtdeel_omschrijving', 's.ins_srtdeel_key')
       + "     , d.ins_deel_upper"
       + "     , '' extra"
       + "     , d.ins_deel_opmerking"
       + "  FROM " + (inclComp? "ins_v_aanwezigdeelenonderdeel" : "ins_v_aanwezigdeel") + " d"
       + "     , ins_v_aanwezigsrtdeel s"
       + "     , alg_locatie l"
       + "     , alg_district di"
       + "     , alg_ruimte alg_r"
       + "     , alg_verdieping alg_v"
       + "     , alg_gebouw alg_g"
       + " WHERE ins_deel_upper || ' ' || UPPER(d.ins_deel_opmerking) LIKE " + safe.quoted_sql_wild2(chars)
       + "   AND d.ins_srtdeel_key = s.ins_srtdeel_key"
       + "   AND alg_r.alg_ruimte_key = d.ins_alg_ruimte_key"
       + "   AND d.ins_alg_ruimte_type = 'R'"
       + "   AND alg_g.alg_locatie_key = d.ins_alg_locatie_key"
       + "   AND alg_g.alg_locatie_key = l.alg_locatie_key"
       + "   AND l.alg_district_key = di.alg_district_key"
       + "   AND alg_r.alg_verdieping_key = alg_v.alg_verdieping_key"
       + "   AND alg_v.alg_gebouw_key = alg_g.alg_gebouw_key"
       + "   AND (d.ins_deel_vervaldatum IS NULL OR d.ins_deel_vervaldatum > TRUNC(SYSDATE))"
       + filtClause;

  sqlR = discx3d (sqlR,
                  "d.ins_discipline_key",
                  "di.alg_regio_key",
                  "l.alg_district_key",
                  "l.alg_locatie_key",
                  "o.alg_gebouw_key",
                  "o.alg_verdieping_key",
                  "o.alg_ruimte_key",
                  "", // b.prs_bedrijf_key: not used because algprs == 0
                  "", // d.prs_afdeling_key: not used because algprs == 0
                  pautfunction,
                  (disc_key > 0? [disc_key] : []),
                  0);

  sqlW = "SELECT d.ins_deel_key"
       + "     , d.ins_deel_omschrijving"
       + "     , " + lcl.xsqla('s.ins_srtdeel_omschrijving', 's.ins_srtdeel_key')
       + "     , d.ins_deel_upper"
       + "     , '' extra"
       + "     , d.ins_deel_opmerking"
       + "  FROM " + (inclComp? "ins_v_aanwezigdeelenonderdeel" : "ins_v_aanwezigdeel") + " d"
       + "     , ins_v_aanwezigsrtdeel s"
       + "     , prs_werkplek w"
       + "     , alg_locatie l"
       + "     , alg_district di"
       + "     , alg_ruimte alg_r"
       + "     , alg_verdieping alg_v"
       + "     , alg_gebouw alg_g"
       + " WHERE ins_deel_upper || ' ' || UPPER(d.ins_deel_opmerking) LIKE " + safe.quoted_sql_wild2(chars)
       + "   AND d.ins_srtdeel_key = s.ins_srtdeel_key"
       + "   AND w.prs_werkplek_key = d.ins_alg_ruimte_key"
       + "   AND alg_r.alg_ruimte_key = w.prs_alg_ruimte_key"
       + "   AND d.ins_alg_ruimte_type = 'W'"
       + "   AND alg_g.alg_locatie_key = d.ins_alg_locatie_key"
       + "   AND alg_g.alg_locatie_key = l.alg_locatie_key"
       + "   AND l.alg_district_key = di.alg_district_key"
       + "   AND alg_r.alg_verdieping_key = alg_v.alg_verdieping_key"
       + "   AND alg_v.alg_gebouw_key = alg_g.alg_gebouw_key"
       + "   AND (d.ins_deel_vervaldatum IS NULL OR d.ins_deel_vervaldatum > TRUNC(SYSDATE))"
       + filtClause;

  sqlW = discx3d (sqlW,
                  "d.ins_discipline_key",
                  "di.alg_regio_key",
                  "l.alg_district_key",
                  "l.alg_locatie_key",
                  "o.alg_gebouw_key",
                  "o.alg_verdieping_key",
                  "o.alg_ruimte_key",
                  "", // b.prs_bedrijf_key: not used because algprs == 0
                  "", // d.prs_afdeling_key: not used because algprs == 0
                  pautfunction,
                  (disc_key > 0? [disc_key] : []),
                  0);


  sqlT = "SELECT d.ins_deel_key"
       + "     , d.ins_deel_omschrijving"
       + "     , " + lcl.xsqla('s.ins_srtdeel_omschrijving', 's.ins_srtdeel_key')
       + "     , d.ins_deel_upper"
       + "     , '' extra"
       + "     , d.ins_deel_opmerking"
       + "  FROM " + (inclComp? "ins_v_aanwezigdeelenonderdeel" : "ins_v_aanwezigdeel") + " d"
       + "     , ins_v_aanwezigsrtdeel s"
       + "     , alg_locatie l"
       + "     , alg_district di"
       + "     , alg_terreinsector alg_t"
       + " WHERE ins_deel_upper || ' ' || UPPER(d.ins_deel_opmerking) LIKE " + safe.quoted_sql_wild2(chars)
       + "   AND d.ins_srtdeel_key = s.ins_srtdeel_key"
       + "   AND alg_t.alg_terreinsector_key = d.ins_alg_ruimte_key"
       + "   AND d.ins_alg_ruimte_type = 'T'"
       + "   AND alg_t.alg_locatie_key = d.ins_alg_locatie_key"
       + "   AND alg_t.alg_locatie_key = l.alg_locatie_key"
       + "   AND l.alg_district_key = di.alg_district_key"
       + "   AND (d.ins_deel_vervaldatum IS NULL OR d.ins_deel_vervaldatum > TRUNC(SYSDATE))"
       + filtClause;

  sqlT = discx3d (sqlT,
                  "d.ins_discipline_key",
                  "di.alg_regio_key",
                  "l.alg_district_key",
                  "l.alg_locatie_key",
                  "", // o.alg_gebouw_key
                  "", // o.alg_verdieping_key
                  "", // o.alg_ruimte_key
                  "", // b.prs_bedrijf_key: not used because algprs == 0
                  "", // d.prs_afdeling_key: not used because algprs == 0
                  pautfunction,
                  (disc_key > 0? [disc_key] : []),
                  0);

  sqlP = "SELECT d.ins_deel_key"
       + "     , d.ins_deel_omschrijving"
       + "     , s.ins_srtdeel_omschrijving ins_srtdeel_omschrijving"
       + "     , d.ins_deel_upper"
       + "     , '' extra"
       + "     , d.ins_deel_opmerking"
       + "  FROM " + (inclComp? "ins_v_aanwezigdeelenonderdeel" : "ins_v_aanwezigdeel") + " d"
       + "     , ins_v_aanwezigsrtdeel s"
       + "     , prs_perslid p"
       + "     , prs_v_afdeling_boom boom"
       + " WHERE ins_deel_upper || ' ' || UPPER(d.ins_deel_opmerking) LIKE " + safe.quoted_sql_wild2(chars)
       + "   AND d.ins_srtdeel_key = s.ins_srtdeel_key"
       + "   AND p.prs_perslid_key = d.ins_alg_ruimte_key"
       + "   AND p.prs_afdeling_key = boom.prs_afdeling_key"
       + "   AND d.ins_alg_ruimte_type = 'P'"
       + "   AND (d.ins_deel_vervaldatum IS NULL OR d.ins_deel_vervaldatum > TRUNC(SYSDATE))"
       + filtClause;

  sqlP = discx3d (sqlP,
                  "d.ins_discipline_key",
                  "", // alg_regio_key
                  "", // alg_district_key
                  "", // alg_locatie_key
                  "", // alg_gebouw_key
                  "", // alg_verdieping_key
                  "", // alg_ruimte_key
                  "boom.prs_bedrijf_key", // b.prs_bedrijf_key
                  "boom.prs_afdeling_key", // d.prs_afdeling_key
                  pautfunction,
                  (disc_key > 0? [disc_key] : []),
                  1); // algprs mode (only prs)

  // Contactpersonen hebben geen alg en prs scope. Contactpersonen behoren tot EXTERNE bedrijven.
  sqlC = "SELECT d.ins_deel_key"
       + "     , d.ins_deel_omschrijving"
       + "     , s.ins_srtdeel_omschrijving ins_srtdeel_omschrijving"
       + "     , d.ins_deel_upper"
       + "     , '' extra"
       + "     , d.ins_deel_opmerking"
       + "  FROM " + (inclComp? "ins_v_aanwezigdeelenonderdeel" : "ins_v_aanwezigdeel") + " d"
       + "     , ins_v_aanwezigsrtdeel s"
       + "     , prs_contactpersoon c"
       + " WHERE ins_deel_upper || ' ' || UPPER(d.ins_deel_opmerking) LIKE " + safe.quoted_sql_wild2(chars)
       + "   AND d.ins_srtdeel_key = s.ins_srtdeel_key"
       + "   AND c.prs_contactpersoon_key = d.ins_alg_ruimte_key"
       + "   AND d.ins_alg_ruimte_type = 'C'"
       + "   AND (d.ins_deel_vervaldatum IS NULL OR d.ins_deel_vervaldatum > TRUNC(SYSDATE))"
       + (disc_key > 0
         ? " AND d.ins_discipline_key = " + disc_key
         : "")
       + filtClause;

  sqlA = "SELECT d.ins_deel_key"
       + "     , d.ins_deel_omschrijving"
       + "     , s.ins_srtdeel_omschrijving ins_srtdeel_omschrijving"
       + "     , d.ins_deel_upper"
       + "     , '' extra"
       + "     , d.ins_deel_opmerking"
       + "  FROM " + (inclComp? "ins_v_aanwezigdeelenonderdeel" : "ins_v_aanwezigdeel") + " d"
       + "     , ins_v_aanwezigsrtdeel s"
       + "     , prs_v_afdeling_boom boom"
       + " WHERE ins_deel_upper || ' ' || UPPER(d.ins_deel_opmerking) LIKE " + safe.quoted_sql_wild2(chars)
       + "   AND d.ins_srtdeel_key = s.ins_srtdeel_key"
       + "   AND boom.prs_afdeling_key = d.ins_alg_ruimte_key"
       + "   AND d.ins_alg_ruimte_type = 'A'"
       + "   AND (d.ins_deel_vervaldatum IS NULL OR d.ins_deel_vervaldatum > TRUNC(SYSDATE))"
       + filtClause;

  sqlA = discx3d (sqlA,
                  "d.ins_discipline_key",
                  "", // alg_regio_key
                  "", // alg_district_key
                  "", // alg_locatie_key
                  "", // alg_gebouw_key
                  "", // alg_verdieping_key
                  "", // alg_ruimte_key
                  "boom.prs_bedrijf_key", // b.prs_bedrijf_key: not used because algprs == 0
                  "boom.prs_afdeling_key", // d.prs_afdeling_key: not used because algprs == 0
                  pautfunction,
                  (disc_key > 0? [disc_key] : []),
                  1); // algprs mode (only prs)

  var sql = "  SELECT x.ins_deel_key"
          + "       , x.ins_deel_omschrijving || NVL2(x.ins_deel_opmerking, ' ' ||  x.ins_deel_opmerking, '') deel_omschrijving"
          + "       , x.ins_srtdeel_omschrijving ins_srtdeel_omschrijving"
          + "       , x.ins_deel_upper"
          + "       , x.extra"
          + "    FROM (" + sqlT + " UNION " + sqlR + " UNION " + sqlW + " UNION " + sqlP + " UNION " + sqlC + " UNION " + sqlA + ") x"
          + (relate // Toon objecten/onderdelen die gerelateerd kunnen worden. Voorkom van-naar lussen.
            ? " WHERE NOT EXISTS (SELECT ins_deelkoppeling_key"
              + "                   FROM ins_deelkoppeling"
              + "                  WHERE ins_deelkoppeling_van_key = x.ins_deel_key"          // Van de te relateren objecten mogen niet al een van-naar lus bestaan.
              + "                    AND ins_deelkoppeling_naar_key IN (" + excludekey + "))" // Zichzelf is als excludekey meegegeven.
            : "")
          + "  ORDER BY x.ins_deel_upper";

  var resultParams = { bAll: bAll,
                       fldName: "deel_omschrijving",
                       fldKey: "ins_deel_key",
                       fldDesc: "ins_srtdeel_omschrijving",
                       fldExtraParam: "ins_srtdeel_omschrijving"
                     };
}

WriteResult2(sql, resultParams);
%>
<% ASPPAGE_END(); %>
