<% /*
    $Revision$
    $Id$

    File:        get_objecten_sql.inc
    Parameters:
    Context:     Vanuit ins EN mld

*/

function get_objecten_sql(alg_key, alg_niveau, prs_key, dept_key, stdmld_key)
{
  // Het aantal objecten kan ook ingeperkt worden door mld_stdmelding.ins_srtinst_key
  var inst_key = -1;
  var inst_type = "";
  var org_obj_niveau = 9;
  if (stdmld_key != -1)
  {
    sql = "SELECT ins_srtinst_key"
        + ", ins_srtinst_niveau"
        + ", alg_org_obj_niveau"
        + " FROM mld_stdmelding"
        + " WHERE mld_stdmelding_key = " + stdmld_key;

    oRs = Oracle.Execute(sql);
    if (!oRs.eof)
    {
      inst_key = oRs("ins_srtinst_key").Value;
      inst_type = oRs("ins_srtinst_niveau").Value;
      org_obj_niveau = oRs("alg_org_obj_niveau").Value;
    }
  }

  if (alg_niveau == "R" || alg_niveau == "V" || alg_niveau == "G" || alg_niveau == "L")
  {
    // In welke ruimtes keuren we objecten goed?
    var roomsql = "SELECT -1 FROM DUAL";
    if (alg_niveau == "R")
      roomsql = "SELECT " + alg_key + " FROM DUAL";
    else if (alg_niveau == "V")
      roomsql = "SELECT alg_ruimte_key"
              + "  FROM alg_ruimte"
              + " WHERE alg_verdieping_key = " + alg_key;
    else if (alg_niveau == "G") // en !isTerra?
      roomsql = "SELECT alg_ruimte_key"
              + "  FROM alg_ruimte ar"
              + "     , alg_verdieping av"
              + " WHERE ar.alg_verdieping_key = av.alg_verdieping_key"
              + "   AND alg_gebouw_key = " + alg_key;
    else if (alg_niveau == "L") // en !isTerra?
      roomsql = "SELECT alg_ruimte_key"
              + "  FROM alg_ruimte ar"
              + "     , alg_verdieping av"
              + "     , alg_gebouw ag"
              + " WHERE ar.alg_verdieping_key = av.alg_verdieping_key"
              + "   AND av.alg_gebouw_key = ag.alg_gebouw_key"
              + "   AND alg_locatie_key = " + alg_key;
  }

  if (org_obj_niveau < 9)
  { // Autlevel is het afdelingsobjecten niveau (stdmelding.alg_org_obj_niveau) van waaruit objecten gekozen kunnen worden (null=alle, 0=bedrijf, ...., 9=geen).
    var autlevel = org_obj_niveau;

    if (autlevel == 0)
      var departmentsql = "SELECT a.prs_afdeling_key"
                        + "  FROM prs_v_afdeling a"
                        + " WHERE a.prs_bedrijf_key = " + user.afdeling().prs_bedrijf_key();
    else if (autlevel > 0)
      var departmentsql = "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 = " + user.prs_afdeling_key()
                        + "               AND aa.niveau = (" + autlevel + "))"
                        + "   AND a.prs_afdeling_key = d.ins_alg_ruimte_key";
    else
      var departmentsql = "d.ins_alg_ruimte_key";
  }

  var plaatsaanduiding = (S("prs_wpprefix_objectid") == 1
                         ? " CASE"
                           + " WHEN o.prs_werkplek_omschrijving IS NOT NULL"
                           + " THEN ' ' || o.prs_werkplek_omschrijving"
                           + " ELSE ''"
                           + " END"
                         : "''");
  sql = "SELECT d.ins_deel_key"
      + "     , d.ins_deel_omschrijving || " + plaatsaanduiding + " || ' (' || " + lcl.xsql('s.ins_srtdeel_omschrijving', 's.ins_srtdeel_key') + " || ') ' || d.ins_deel_opmerking deel"
      + "     , d.ins_alg_ruimte_key"
      + "     , d.ins_alg_ruimte_type"
      + "     , a.alg_ruimte_nr" // JGL: Ik vermoed dat deze effectief niet gebruikt wordt
      + "     , CASE"
      + "       WHEN d.ins_deel_t_uitvoertijd.eenheid = 'U'"
      + "       THEN d.ins_deel_t_uitvoertijd.tijdsduur / 24"
      + "       ELSE d.ins_deel_t_uitvoertijd.tijdsduur"
      + "       END uitvoertijd" // Uitvoertijd in dagen.
      + "  FROM ins_v_aanwezigdeel d"
      + "     , alg_v_aanwezigruimte a"
      + "     , ins_srtdeel s"
      + "     , ins_srtgroep g"
      + "     , ins_v_alg_overzicht o"
      + " WHERE ("  // let op het haakje hier
  if (alg_niveau == "R" || alg_niveau == "V" || alg_niveau == "G" || alg_niveau == "L")
  {
    sql += " (ins_alg_ruimte_type = 'R' AND ins_alg_ruimte_key IN (" + roomsql + "))"
         + "  OR (ins_alg_ruimte_type = 'W' AND ins_alg_ruimte_key IN"
         + "       (SELECT prs_werkplek_key FROM prs_werkplek "
         + "        WHERE prs_alg_ruimte_key IN (" + roomsql + ")))";
  }
  else
    sql += " (1 = 0)";
  sql += (alg_niveau == "G" // Gebouw kan ook een Terrein zijn
         ? " OR (ins_alg_ruimte_type = 'T' AND ins_alg_ruimte_key = " + alg_key + ")"
         : "")
       + (prs_key != -1
         ? " OR (ins_alg_ruimte_type = 'P' AND ins_alg_ruimte_key = " + prs_key + ")"
         : "")
       + ")" // en het sluithaakje hier
       + " AND (d.ins_deel_vervaldatum IS NULL OR d.ins_deel_vervaldatum > TRUNC(SYSDATE))"
       + " AND d.ins_alg_ruimte_key = a.alg_ruimte_key(+)" // outer join voor werkplekken (en locatie-objecten?)
       + " AND d.ins_srtdeel_key  = s.ins_srtdeel_key"
       + " AND s.ins_srtgroep_key = g.ins_srtgroep_key"
       + " AND d.ins_alg_ruimte_key = o.alg_onroerendgoed_keys(+)"
       + " AND d.ins_alg_ruimte_type = o.alg_onroerendgoed_type(+)"
       + " AND d.ins_alg_locatie_key = o.alg_locatie_key(+)";
  if (inst_type == 'D')
    sql += " AND g.ins_discipline_key = " + inst_key;
  else if (inst_type == 'G')
    sql += " AND s.ins_srtgroep_key = " + inst_key;
  else if (inst_type == 'S')
    sql += " AND d.ins_srtdeel_key = " + inst_key;

  // Als persoons key is meegegeven dan niet meer eigen afdeling bepalen.
  // Eigen afdelings objecten worden nu meegenomen in autorisatie van departmentsql
  if (org_obj_niveau < 9 || prs_key != -1 || (dept_key && dept_key > 0))
  {
    sql += " UNION"
         + " SELECT d.ins_deel_key"
         + "      , d.ins_deel_omschrijving || " + plaatsaanduiding + " || ' (' || " + lcl.xsql('s.ins_srtdeel_omschrijving', 's.ins_srtdeel_key') + " || ') ' || d.ins_deel_opmerking deel"
         + "      , d.ins_alg_ruimte_key"
         + "      , d.ins_alg_ruimte_type"
         + "      , NULL alg_ruimte_nr"
         + "      , CASE"
         + "        WHEN d.ins_deel_t_uitvoertijd.eenheid = 'U'"
         + "        THEN d.ins_deel_t_uitvoertijd.tijdsduur / 24"
         + "        ELSE d.ins_deel_t_uitvoertijd.tijdsduur"
         + "        END uitvoertijd" // Uitvoertijd in dagen.
         + "   FROM ins_v_aanwezigdeel d"
         + "      , ins_srtdeel s"
         + "      , ins_srtgroep g"
         + "      , ins_v_alg_overzicht o"
         + "  WHERE (" // let op het haakje hier
         + (org_obj_niveau < 9
           ? "      (ins_alg_ruimte_type = 'A' AND d.ins_alg_ruimte_key IN (" + departmentsql + "))"
             + (prs_key != -1 || (dept_key && dept_key > 0)? " OR" : "")
           : "")
         + (prs_key != -1
           ? "      (ins_alg_ruimte_type = 'P' AND ins_alg_ruimte_key = " + prs_key + ")"
             + (dept_key && dept_key > 0? " OR" : "")
           : "")
         + (dept_key && dept_key > 0
           ? "      (ins_alg_ruimte_type = 'A' AND ins_alg_ruimte_key = " + dept_key + ")"
           : "")
         + ")" // en het sluithaakje hier
         + " AND (d.ins_deel_vervaldatum IS NULL OR d.ins_deel_vervaldatum > TRUNC(SYSDATE))"
         + " AND d.ins_srtdeel_key  = s.ins_srtdeel_key"
         + " AND s.ins_srtgroep_key = g.ins_srtgroep_key"
         + " AND d.ins_alg_ruimte_key = o.alg_onroerendgoed_keys(+)"
         + " AND d.ins_alg_ruimte_type = o.alg_onroerendgoed_type(+)"
         + " AND d.ins_alg_locatie_key = o.alg_locatie_key(+)";
    if (inst_type == 'D')
      sql += " AND g.ins_discipline_key = " + inst_key;
    else if (inst_type == 'G')
      sql += " AND s.ins_srtgroep_key = " + inst_key;
    else if (inst_type == 'S')
      sql += " AND d.ins_srtdeel_key = " + inst_key;
  }
  sql += " ORDER BY 2";

  return sql;
}
%>