<% /*
    $Revision$
    $Id$

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

*/
%>

<!-- #include file="./Suggest/objectFilter.inc" -->

<%
// Vanuit CNT\loadRuimteObjecten.asp is stdmld_key niet in gebruik
// Uitsluitend vanuit CNT\loadRuimteObjecten.asp is dept_key in gebruik
function get_objecten_sql(alg_key, alg_niveau, prs_key, dept_key, stdmld_key, params)
{
    if (dept_key > 0 && stdmld_key > 0)
        UNEXEPECTED_get_objecten_sql;

    params = params || {};
    var obj_sqls = [];

    // Plaatsgebonden objecten
    if (stdmld_key > 0) // Melding objecten
    {
        var org_onrgoed_niveau = "";
        var org_obj_niveau     = 8;
        var is_afdobj = true;
        var is_prsobj = false;

        var sql = "SELECT msm.alg_onrgoed_obj_niveau"
                + "     , msm.alg_org_obj_niveau"
                + "     , msm.mld_stdmelding_prsafdobj"
                + "  FROM mld_stdmelding msm"
                + " WHERE msm.mld_stdmelding_key = " + stdmld_key;
        var oRs = Oracle.Execute(sql);
        org_onrgoed_niveau = oRs("alg_onrgoed_obj_niveau").Value || "";
        org_obj_niveau     = oRs("alg_org_obj_niveau").Value;
        is_afdobj = ((oRs("mld_stdmelding_prsafdobj").Value & 1) == 1);
        is_prsobj = ((oRs("mld_stdmelding_prsafdobj").Value & 2) == 2);
        oRs.Close();

        var alg_niveau_sql = !(stdmld_key > 0) || org_onrgoed_niveau != "" ? get_alg_niveau_sql(alg_niveau, alg_key, org_onrgoed_niveau) : ""; // plaatsgebonden objecten
        var afdeling_sql   = (is_afdobj ? get_afdeling_sql(org_obj_niveau, prs_key): ""); // organisatie afdelingsgebonden objecten
        var persoon_sql    = (is_prsobj ? get_persoon_sql(org_obj_niveau, prs_key) : ""); // organisatie persoonsgebonden objecten

        // Het aantal objecten kan ook ingeperkt worden door mld_stdmelding_srtinst.ins_srtinstallatie_key
        var sql = "SELECT msi.ins_srtinstallatie_key"
                + "     , msi.ins_srtinstallatie_niveau"
                + "  FROM mld_stdmelding_srtinst msi"
                + " WHERE msi.mld_stdmelding_key = " + stdmld_key;
        var oRs = Oracle.Execute(sql);
        if (oRs.eof) // Geen objectsoort beperking
        {
            obj_sqls = get_stdmelding_sql(alg_niveau_sql, [afdeling_sql, persoon_sql], "", params);
        }
        else
        {
            var disc_keys = [];
            var group_keys = [];
            var srt_keys = [];
            while (!oRs.eof)
            {
                var inst_key  = oRs("ins_srtinstallatie_key").Value;
                var inst_type = oRs("ins_srtinstallatie_niveau").Value;
                if (inst_key && inst_type) // Onzinnig als ze leeg zijn maar de interface ging het met 2017.3 nog niet tegen
                {
                    switch (inst_type)
                    {
                        case "D": disc_keys.push(inst_key); break;
                        case "G": group_keys.push(inst_key); break;
                        case "S": srt_keys.push(inst_key); break;
                    }
                }
                oRs.MoveNext();
            }
            if (disc_keys.length)
            {
                var sqls = get_stdmelding_sql(alg_niveau_sql, [afdeling_sql, persoon_sql], " AND g.ins_discipline_key IN ({0})".format(disc_keys.join(", ")), params);
                obj_sqls = obj_sqls.concat(sqls);
            }
            if (group_keys.length)
            {
                var sqls = get_stdmelding_sql(alg_niveau_sql, [afdeling_sql, persoon_sql], " AND s.ins_srtgroep_key IN ({0})".format(group_keys.join(", ")), params);
                obj_sqls = obj_sqls.concat(sqls);
            }
            if (srt_keys.length)
            {
                var sqls = get_stdmelding_sql(alg_niveau_sql, [afdeling_sql, persoon_sql], " AND d.ins_srtdeel_key IN ({0})".format(srt_keys.join(", ")), params);
                obj_sqls = obj_sqls.concat(sqls);
            }
        }
        oRs.Close();
    }
    else // Contract objecten
    {
        var org_onrgoed_niveau="";
        var alg_niveau_sql = (((alg_key > 0) || (alg_key < 0 && dept_key < 0)) ? get_alg_niveau_sql(alg_niveau, alg_key, org_onrgoed_niveau) : "1=0");
        var afdeling_sql = (dept_key > 0) ? " ins_alg_ruimte_type = 'A' AND ins_alg_ruimte_key = " + dept_key : "";
        var persoon_sql  = (prs_key > 0) ? " ins_alg_ruimte_type = 'P' AND ins_alg_ruimte_key = " + prs_key : "";
        obj_sqls = get_stdmelding_sql(alg_niveau_sql, [persoon_sql, afdeling_sql], "", params);
    }

    if (obj_sqls.length)
        return obj_sqls.join(" UNION ") + " ORDER BY 2";
    else
        return "SELECT 1 FROM DUAL WHERE 1=0";
}

function get_alg_niveau_sql(p_alg_niveau, p_alg_key, p_org_onrgoed_niveau)
{
    var v_alg_niveau_sql = "";
    if ((p_alg_niveau == "R" || p_alg_niveau == "V" || p_alg_niveau == "G" || p_alg_niveau == "L" || p_alg_niveau == "B"  || p_alg_niveau == "T") && p_alg_key > 0)
    {
        // In welke ruimtes keuren we objecten goed?
        var roomsql = "SELECT -1 FROM DUAL";
        if (p_alg_niveau == "R")
            roomsql = "SELECT " + p_alg_key + " FROM DUAL";
        else if (p_alg_niveau == "V")
            roomsql = "SELECT alg_ruimte_key"
                    + "  FROM alg_ruimte"
                    + " WHERE alg_verdieping_key = " + p_alg_key;
        else if (p_alg_niveau == "G" || p_alg_niveau == "B"  || p_alg_niveau == "T") // 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 = " + p_alg_key;
        else if (p_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 = " + p_alg_key;

        var werkpleksql = "SELECT prs_werkplek_key"
                        + "  FROM prs_werkplek"
                        + " WHERE prs_alg_ruimte_key IN (" + roomsql + ")";
        v_alg_niveau_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 (" + werkpleksql + "))"

        if  ( p_alg_niveau == "G"  || p_alg_niveau == "T")// Gebouw kan ook een Terrein zijn
            v_alg_niveau_sql += " OR (ins_alg_ruimte_type = 'T' AND ins_alg_ruimte_key = " + p_alg_key + ")";

    }
    else if (p_org_onrgoed_niveau && p_org_onrgoed_niveau == "A") // all objects when no location selected
    {
      v_alg_niveau_sql = " ins_alg_ruimte_type IN ('R', 'V', 'G', 'L', 'B', 'T') "
    }
    return v_alg_niveau_sql;
}

function get_scope_sql(p_org_obj_niveau, p_prs_key)
{
    var scope_sql = "-1";
    if (p_prs_key > 0)
    {
        // voor p_org_obj_niveau = 8 en -1 hier niets doen (Alleen persoonsgebonden objecten van de melder, of alle objecten).
        if (p_org_obj_niveau == 3) // Alle persoonsgebonden objecten op hetzelfde account als de melder
        {
            scope_sql = "SELECT ac.prs_afdeling_key"
                      + "  FROM prs_afdeling ac"
                      + "     , prs_afdeling af"
                      + "     , prs_perslid  pl"
                      + " WHERE af.prs_afdeling_key = pl.prs_afdeling_key"
                      + "   AND af.prs_kostenplaats_key = ac.prs_kostenplaats_key"
                      + "   AND pl.prs_perslid_key = " + p_prs_key;
        }
        else if (p_org_obj_niveau == 2) // Alle persoonsgebonden objecten op dezelfde afdeling als melder (ongeacht eigenaar)
        {
            scope_sql = "SELECT b.prs_afdeling_key1"
                      + "  FROM prs_perslid p"
                      + "     , prs_v_afdeling_boom b"
                      + " WHERE p.prs_afdeling_key = b.prs_afdeling_key"
                      + "   AND p.prs_perslid_key = " + p_prs_key;
        }
        else if (p_org_obj_niveau == 1) // Alle persoonsgebonden objecten binnen dezelfde businessunit als de melder
        {
            scope_sql = "SELECT f.prs_afdeling_key"
                      + "  FROM prs_v_afdeling_boom f"
                      + " WHERE f.prs_afdeling_key1 IN"
                      + "       (SELECT b.prs_afdeling_key1"
                      + "          FROM prs_perslid p"
                      + "             , prs_v_afdeling_boom b"
                      + "         WHERE p.prs_afdeling_key = b.prs_afdeling_key"
                      + "           AND p.prs_perslid_key = " + p_prs_key
                      + "       )";
        }
        else if (p_org_obj_niveau == 0) // Alle persoonsgebonden objecten binnen hetzelfde bedrijf als de melder
        {
            scope_sql = "SELECT afd_b.prs_afdeling_key"
                      + "  FROM prs_afdeling afd_b"
                      + " WHERE afd_b.prs_afdeling_verwijder IS NULL"
                      + "   AND afd_b.prs_afdeling_parentkey IN"
                          + "   (SELECT afd_u.prs_afdeling_key"
                          + "      FROM prs_v_afdeling_boom u"
                          + "         , prs_afdeling afd_u"
                          + "     WHERE afd_u.prs_afdeling_verwijder IS NULL"
                          + "       AND u.prs_afdeling_key = afd_u.prs_afdeling_key"
                          + "       AND u.niveau = 1"
                          + "       AND u.prs_bedrijf_key IN"
                                  + "   (SELECT prs_bedrijf_key"
                                  + "      FROM prs_perslid p"
                                  + "         , prs_v_afdeling_boom afd_p"
                                  + "     WHERE p.prs_afdeling_key = afd_p.prs_afdeling_key"
                                  + "       AND p.prs_perslid_key = " + p_prs_key
                                  + "   )"
                          + "   )";
        }
    }
    return scope_sql;
}

function get_persoon_sql(p_org_obj_niveau, p_prs_key)
{
    var scope_sql = get_scope_sql(p_org_obj_niveau, p_prs_key);
    var persoon_sql = "";

    if (p_org_obj_niveau == -1)      // Alle persoonsgebonden objecten ongeacht de melder
    {
        persoon_sql = " ins_alg_ruimte_type = 'P'";
    }
    else if ( p_org_obj_niveau == 8) // Alle persoonsgebonden objecten van deze melder
    {
        persoon_sql = " ins_alg_ruimte_type = 'P'"
                    + " AND ins_alg_ruimte_key = " + p_prs_key;
    }
    else if (  p_org_obj_niveau == 2 // Alle persoonsgebonden objecten op dezelfde afdeling als melder
            || p_org_obj_niveau == 1 // Alle persoonsgebonden objecten binnen dezelfde businessunit als de melder
            || p_org_obj_niveau == 0 // Alle persoonsgebonden objecten binnen hetzelfde bedrijf als de melder
            )
    {
        persoon_sql = " ins_alg_ruimte_type = 'P'"
                    + " AND ins_alg_ruimte_key IN"
                    + "     (SELECT a.prs_perslid_key"
                    + "        FROM prs_perslid a"
                    + "       WHERE a.prs_perslid_verwijder IS NULL"
                    + "         AND a.prs_afdeling_key IN (" + scope_sql + ")"
                    + "     )";
    }

    return persoon_sql;
}

function get_afdeling_sql(p_org_obj_niveau, p_prs_key)
{
    // p_org_obj_niveau is het afdelingsobjecten niveau (stdmelding.alg_org_obj_niveau) van waaruit objecten gekozen kunnen worden (null=alle, 0=bedrijf, ...., 9=geen).

    var scope_sql = get_scope_sql(p_org_obj_niveau, p_prs_key);
    var afdeling_sql = "";

    if (p_org_obj_niveau == -1)      // Alle afdelingsgebonden objecten
    {
        afdeling_sql = " ins_alg_ruimte_type = 'A'";
    }
    else if ( p_org_obj_niveau == 8) // Alle afdelingsgebonden objecten van deze melder: kan niet!
    {
        afdeling_sql = "";
    }
    else if (  p_org_obj_niveau == 2 // Alle afdelingsgebonden objecten op dezelfde afdeling als melder
            || p_org_obj_niveau == 1 // Alle afdelingsgebonden objecten binnen dezelfde businessunit als de melder
            || p_org_obj_niveau == 0 // afdelingsgebonden objecten binnen hetzelfde bedrijf als de melder
            || p_org_obj_niveau == 3 // afdelingsgebonden objecten binnen hetzelfde account (kostensoort)
            )
    {
        afdeling_sql = " ins_alg_ruimte_type = 'A'"
                     + " AND d.ins_alg_ruimte_key IN (" + scope_sql + ")";
    }

    return afdeling_sql;
}


// Per installatiesoort uit mld_stdmelding_srtinst
function get_stdmelding_sql(p_alg_niveau_sql, arr_sql, p_installatie_where, params)
{
    params = params || {};
    var element_description;
    var wpprefix;
    if (S("ins_element_description") == "")
    {
      var parentdeel = "CASE WHEN d.ins_deel_parent_key IS NOT NULL"
                     + "     THEN (SELECT p.ins_deel_omschrijving"
                     + "             FROM ins_deel p"
                     + "            WHERE p.ins_deel_key = d.ins_deel_parent_key"
                     + "          ) ||' / '"
                     + "     ELSE ''"
                     + "END ";
      wpprefix = S("prs_wpprefix_objectid") == 1;
      var plaatsaanduiding = (wpprefix
                             ? " CASE"
                               + " WHEN d.ins_alg_ruimte_type = 'W' AND wp.prs_werkplek_omschrijving IS NOT NULL"
                               + " THEN ' ' || wp.prs_werkplek_omschrijving"
                               + " ELSE ''"
                               + " END"
                             : "''");
      element_description = ", " + parentdeel + "|| d.ins_deel_omschrijving || " + plaatsaanduiding
                       + " || ' (' || " + lcl.xsql("s.ins_srtdeel_omschrijving", "s.ins_srtdeel_key")
                       + " || ') ' || d.ins_deel_opmerking ";
    }
    else
    {
      element_description = ", " + S("ins_element_description");
    }

    var extraInf = getExtraInfObject(params.extracode);
    var sqls = [];
    var searchColumn = element_description.substr(2); // Strip leading comma
    if (p_alg_niveau_sql || params.disc_key > -1 || params.srtgrp_key > -1 || params.grp_key > -1)
    {
        var alg_niveau_sql = (p_alg_niveau_sql == "" ? "1=1" : p_alg_niveau_sql);

            var sql_from = "  ins_v_deelenonderdeel d"
                         + ", alg_v_aanwezigruimte a"
                         + ", ins_srtdeel s"
                         + ", ins_srtgroep g"
                         + ", ins_tab_discipline dis"
                         + (wpprefix
                            ? ", prs_werkplek wp"
                            : "")
                         + extraInf.fromstr;

            var sql_where = "     d.ins_deel_verwijder IS NULL"
                          + " AND (" + alg_niveau_sql + " )"
                          + " AND d.ins_alg_ruimte_key = a.alg_ruimte_key(+)" // outer join voor werkplekken (en locatie-objecten?)
                          + " 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 g.ins_discipline_key = dis.ins_discipline_key"
                          + (wpprefix? "   AND d.ins_alg_ruimte_key = wp.prs_werkplek_key(+)" : "")
                          + (params.disc_key   > -1 ? " AND g.ins_discipline_key = " + params.disc_key   : "")
                          + (params.srtgrp_key > -1 ? " AND s.ins_srtgroep_key = "   + params.srtgrp_key : "")
                          + (params.grp_key    > -1 ? " AND d.ins_srtdeel_key = "    + params.grp_key    : "")
                          + (params.search
                            ? "   AND UPPER(" + searchColumn + ") LIKE " + safe.quoted_sql_wild2(params.search)
                            : "")
                          + p_installatie_where
                          + extraInf.wherestr;

        sqls.push("SELECT d.ins_deel_key"
                 + element_description + " deel"
                 + "     , d.ins_alg_ruimte_key"
                 + "     , d.ins_alg_ruimte_type"
                 + "     , a.alg_ruimte_nr" // gebruikt in mld_edit_melding.js/process_object_info om automatisch de ruimte te kiezen
                 + extraInf.selectstr
                 + "  FROM " + sql_from
                 + " WHERE " + sql_where
                 + (params.components
                   ? " AND d.ins_deel_parent_key IN (" + (params.deel_parent_key_arr && params.deel_parent_key_arr.length? params.deel_parent_key_arr.join(",") : "-1") + ")"
                   : "")
                 + (params.exclude_deel_key_arr && params.exclude_deel_key_arr.length
                   ? " AND (d.ins_deel_key NOT IN (" + params.exclude_deel_key_arr.join(",") + ")"
                     + " OR d.ins_deel_key IN (SELECT d.ins_deel_parent_key"
                     + "                         FROM " + sql_from
                     + "                        WHERE " + sql_where
                     + "                          AND d.ins_deel_parent_key IN (" + params.exclude_deel_key_arr.join(",") + ")"
                     + "                          AND d.ins_deel_key NOT IN (" + params.exclude_deel_key_arr.join(",") + ")"
                     + "                      )"
                     + "   )"
                   : "")
                 );
    }

    // Nu de objecten zonder plaats-scope
    for (var i in arr_sql)
    {
        if (arr_sql[i])
        {
            var sql_from = ", ins_srtdeel s"
                         + ", ins_srtgroep g"
                         + ", ins_tab_discipline dis"
                         + (wpprefix
                            ? ", prs_werkplek wp"
                            : "")
                         + extraInf.fromstr;

            var sql_where = arr_sql[i]
                          + " 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 g.ins_discipline_key = dis.ins_discipline_key"
                          + (wpprefix ? "   AND d.ins_alg_ruimte_key = wp.prs_werkplek_key(+)" : "")
                          + (params.disc_key   > -1 ? " AND g.ins_discipline_key = " + params.disc_key   : "")
                          + (params.srtgrp_key > -1 ? " AND s.ins_srtgroep_key = "   + params.srtgrp_key : "")
                          + (params.grp_key    > -1 ? " AND d.ins_srtdeel_key = "    + params.grp_key    : "")
                          + (params.search
                            ? " AND UPPER(" + searchColumn + ") LIKE " + safe.quoted_sql_wild2(params.search)
                            : "")
                          + p_installatie_where
                          + extraInf.wherestr;

            sqls.push("SELECT d.ins_deel_key"
                     + element_description + " deel"
                     + "      , d.ins_alg_ruimte_key"
                     + "      , d.ins_alg_ruimte_type"
                     + "      , NULL alg_ruimte_nr"
                     + extraInf.selectstr
                     + "  FROM " + (params.components? "ins_v_aanwezigdeelenonderdeel" : "ins_v_aanwezigdeel") + " d" + sql_from
                     + " WHERE " + sql_where
                     + (params.components
                       ? " AND d.ins_deel_parent_key IN (" + (params.deel_parent_key_arr && params.deel_parent_key_arr.length? params.deel_parent_key_arr.join(",") : "-1") + ")"
                       : "")
                     + (params.exclude_deel_key_arr && params.exclude_deel_key_arr.length
                       ? " AND (d.ins_deel_key NOT IN (" + params.exclude_deel_key_arr.join(",") + ")"
                         + " OR d.ins_deel_key IN (SELECT d.ins_deel_parent_key"
                         + "                         FROM ins_deel d" + sql_from
                         + "                        WHERE " + sql_where
                         + "                          AND d.ins_deel_parent_key IN (" + params.exclude_deel_key_arr.join(",") + ")"
                         + "                          AND d.ins_deel_key NOT IN (" + params.exclude_deel_key_arr.join(",") + ")"
                         + "                      )"
                         + "   )"
                       : "")
                     );
        }
    }

    return sqls;
}

%>