<% /*
     $Revision$
     $Id$

     File:        res_rsv_deel_by_placetime.inc
     Description: Shared functions for res/res_rsv_deel_by_placetime.asp
                  and pda/res_rsv_deel_by_placetime.asp
*/

rdpt = {

    // Levert de 3 meest recent geboekte werkplekken op voor de gegeven catalogi
    mijn_verdiepingen_met_resdelen_hist_sql: function(p_res_disc_key_arr, p_alglevel)
    {
        var hsql = " SELECT l.alg_locatie_plaats"
                 + "      , g.alg_gebouw_naam"
                 + "      , g.alg_gebouw_image"
                 + "      , g.alg_gebouw_key"
                 + "      , v.alg_verdieping_key"
                 + "      , v.alg_verdieping_omschrijving"
                 + "      , v.alg_verdieping_code"
                 + "      , o.alg_ruimte_key"
                 + "      , d.res_deel_key"
                 + "      , w.res_deel_omschrijving"
                 + "      , rdis.ins_discipline_key"
                 + "      , rdis.ins_discipline_image"
                 + "      , " + lcl.xsqla("rdis.ins_discipline_omschrijving", "rdis.ins_discipline_key")
                 + "      , MAX(r.res_rsv_ruimte_van) res_rsv_ruimte_van"
                 + "   FROM res_rsv_ruimte r"
                 + "      , res_rsv_deel   d"
                 + "      , res_deel       w"
                 + "      , res_discipline rdis"
                 + "      , alg_locatie    l"
                 + "      , alg_gebouw     g"
                 + "      , alg_verdieping v"
                 + "      , alg_ruimte     o"
                 + "  WHERE r.res_rsv_ruimte_key = d.res_rsv_ruimte_key"
                 + "    AND d.res_deel_key = w.res_deel_key"
                 + "    AND r.alg_ruimte_key = o.alg_ruimte_key"
                 + "    AND o.alg_verdieping_key = v.alg_verdieping_key"
                 + "    AND v.alg_gebouw_key = g.alg_gebouw_key"
                 + "    AND g.alg_locatie_key = l.alg_locatie_key"
                 + "    AND r.res_rsv_ruimte_omschrijving = " + safe.quoted_sql(L("lcl_res_planmode_gereserveerd"))
                 + "    AND r.res_rsv_ruimte_host_key = " + user_key
                 + "    AND r.res_rsv_ruimte_van >= TRUNC(SYSDATE) - " + S("res_lookhistory_days")
                 + "    AND w.res_discipline_key = rdis.ins_discipline_key"
                 + "    AND rdis.ins_discipline_verwijder IS NULL"
                 + "    AND w.res_discipline_key IN (" + p_res_disc_key_arr.join(",") + ")";

        if (p_alglevel > -1)
        {   // Er is een scope-beperking van kracht
            hsql  += "  AND v.alg_verdieping_key IN"
                   + "      (SELECT alg_verdieping_key"
                   + "         FROM fac_v_my_floors"
                   + "        WHERE prs_perslid_key = " + user_key
                   + "          AND niveau = " + p_alglevel
                   + "      )";
        }
        hsql += "  GROUP BY l.alg_locatie_plaats"
              + "         , g.alg_gebouw_naam"
              + "         , g.alg_gebouw_image"
              + "         , g.alg_gebouw_key"
              + "         , v.alg_verdieping_key"
              + "         , v.alg_verdieping_omschrijving"
              + "         , v.alg_verdieping_code"
              + "         , o.alg_ruimte_key"
              + "         , d.res_deel_key"
              + "         , w.res_deel_omschrijving"
              + "         , rdis.ins_discipline_key"
              + "         , rdis.ins_discipline_image"
              + "         , rdis.ins_discipline_omschrijving"
              + "  ORDER BY res_rsv_ruimte_van DESC";

        return "SELECT * FROM (" + hsql + ") WHERE ROWNUM <= 3";
    },

    // Selecteer gebouwen of verdiepingen waarop res_delen van deze disciplines voorkomen, met wat gegevens
    // Als gebouw_key -1 is worden gebouwen geselecteerd, als er een gebouw_key gegeven is, dan de verdiepingen
    mijn_verdiepingen_met_resdelen_sql: function(p_res_disc_key_arr, p_gebouw_key, p_alglevel, p_dateoffset, p_resdate)
    {
        var lsql = "  SELECT l.alg_locatie_plaats"
                + "        , l.alg_locatie_code"
                + "        , g.alg_gebouw_naam"
                + "        , g.alg_gebouw_key"
                + "        , g.alg_gebouw_image"
                + "        , v.alg_verdieping_key"
                + "        , v.alg_verdieping_omschrijving"
                + "        , v.alg_verdieping_code"
                + "        , rdis.ins_discipline_key"
                + "        , " + lcl.xsqla("rdis.ins_discipline_omschrijving", "rdis.ins_discipline_key")
                + "        , COUNT (*) aantal "
                + "     FROM res_v_aanwezigdeel       rd "
                + "        , res_discipline           rdis"
                + "        , ins_v_aanwezigdeel       id"
                + "        , alg_v_allonroerendgoed   plts"
                + "        , alg_v_aanweziggebouw     g"
                + "        , alg_v_aanwezigverdieping v"
                + "        , alg_locatie              l"
                + "        , alg_district             di"
                + "    WHERE di.alg_district_key = l.alg_district_key "
                + "      AND g.alg_locatie_key = l.alg_locatie_key "
                + "      AND plts.alg_verdieping_key = v.alg_verdieping_key"
                + "      AND v.alg_gebouw_key = g.alg_gebouw_key "
                + (p_gebouw_key > -1 ? " AND g.alg_gebouw_key = " + p_gebouw_key : "")
                + "      AND id.ins_alg_ruimte_key = plts.alg_onroerendgoed_keys "
                + "      AND id.ins_alg_ruimte_type = plts.alg_type "
                + "      AND rd.res_ins_deel_key = id.ins_deel_key "
                + "      AND (    rd.res_deel_vervaldatum IS NULL"
                + "            OR rd.res_deel_vervaldatum > " + (p_resdate ? p_resdate.toSQL() : "SYSDATE + " + (p_dateoffset || 0)) + ")"
                + "      AND rd.res_discipline_key = rdis.ins_discipline_key"
                + "      AND rdis.ins_discipline_verwijder IS NULL"
                + "      AND rd.res_discipline_key IN (" + p_res_disc_key_arr.join(",") + ")";

        if (p_alglevel > -1 )
        {  // Er is een scope-beperking van kracht
          lsql  += " AND v.alg_verdieping_key IN (SELECT alg_verdieping_key FROM fac_v_my_floors "
                + "                                WHERE prs_perslid_key = " + user_key
                + "                                  AND niveau = " + p_alglevel + ")";
        }
        lsql += " GROUP BY l.alg_locatie_plaats"
              + "        , l.alg_locatie_code"
              + "        , g.alg_gebouw_naam"
              + "        , g.alg_gebouw_key"
              + "        , g.alg_gebouw_image"
              + "        , v.alg_verdieping_key"
              + "        , v.alg_verdieping_omschrijving"
              + "        , v.alg_verdieping_volgnr"
              + "        , v.alg_verdieping_code"
              + "        , rdis.ins_discipline_key"
              + "        , rdis.ins_discipline_omschrijving"
              + " ORDER BY alg_locatie_plaats, alg_gebouw_naam, ins_discipline_omschrijving, alg_verdieping_volgnr, alg_verdieping_code";

        if (p_gebouw_key == -1)
        {
            lsql = "SELECT alg_locatie_plaats,"
                 + "       alg_locatie_code,"
                 + "       alg_gebouw_naam,"
                 + "       alg_gebouw_key,"
                 + "       alg_gebouw_image,"
                 + "       ins_discipline_omschrijving,"
                 + "       ins_discipline_key,"
                 + "       SUM (aantal) aantal"
                 + "  FROM (" + lsql + ")"
                 + " GROUP BY alg_locatie_plaats,"
                 + "          alg_locatie_code,"
                 + "          alg_gebouw_naam,"
                 + "          alg_gebouw_key,"
                 + "          alg_gebouw_image,"
                 + "          ins_discipline_key,"
                 + "          ins_discipline_omschrijving"
                 + " ORDER BY alg_locatie_plaats, alg_gebouw_naam, ins_discipline_omschrijving, aantal DESC";  // wat deed die aantal desc ook weer?
        }

        return lsql;
    },

    // telt het aantal reserveerbare delen van de discipline in het gebouw of de verdieping
    aantal_resdelen_in_gebouw_sql: function(p_res_disc_key_arr, p_geb_key)
    {
        // Bepaal het aantal items in dit gebouw
        var lsql = "SELECT COUNT (*) aantal "
                 + "  FROM res_v_aanwezigdeel rd, ins_v_aanwezigdeel id, alg_v_allonroerendgoed plts "
                 + " WHERE     id.ins_alg_ruimte_key = plts.alg_onroerendgoed_keys "
                 + "       AND id.ins_alg_ruimte_type = plts.alg_type "
                 + "       AND rd.res_ins_deel_key = id.ins_deel_key "
                 + "       AND plts.alg_gebouw_key = " + p_geb_key
                 + "       AND rd.res_discipline_key IN (" + p_res_disc_key_arr.join(",") + ")"
                 + "       AND (rd.res_deel_vervaldatum IS NULL OR rd.res_deel_vervaldatum > SYSDATE)";
        return lsql;
    },

    // Dagbezetting (som van de gereserveerde uren) van iedere dag vanaf vandaag+offset t/m vandaag+limit, inclusief de lege dagen
    // Als p_resdate is gegeven, dan wordt uiteindelijk alleen het record voor die dag daaruit geselecteerd.
    // Als p_act_key is meegegeven en het is een child-activiteit dan worden alleen dagen meegenomen waar
    // de master een reservering heeft
    dagbezetting_resdelen_in_gebouw_sql: function (p_res_disc_key_arr, p_geb_key, p_flr_key, p_dateoffset, p_datelimit, p_local_resdate, p_act_key)
    {
        var local_tz;
        if (p_flr_key > -1) {
            local_tz = res.getTimezoneBy(p_flr_key, "V");
        } else {
            local_tz = res.getTimezoneBy(p_geb_key, "G");
        }

        function toLocalDate(expr) {
            return convertToLocalTimeSQL(expr, local_tz);
        }

        var offsetExpr = (p_dateoffset || 0);

        var localRsvDate = toLocalDate("rrd.res_rsv_deel_van");
        var localResWeekday = "fac.getweekdaynum(" + localRsvDate + ")";

        var localToday = "TRUNC(" + toLocalDate("SYSDATE") + ")";
        var localRangeStart = localToday + " + " + offsetExpr;
        var localRangeEnd   = localToday + " + " + (offsetExpr + p_datelimit - 1);

        var localResdateFilter, localVrijeDagFilter;
        if (p_local_resdate) {
            localResdateFilter = " AND TRUNC(" + localRsvDate + ") = " + p_local_resdate.toSQL();
            localVrijeDagFilter = " vrij.mld_vrije_dagen_datum = " + p_local_resdate.toSQL();
        } else {
            localResdateFilter = " AND TRUNC(" + localRsvDate + ") BETWEEN " + localRangeStart + " AND " + localRangeEnd;
            localVrijeDagFilter = " vrij.mld_vrije_dagen_datum BETWEEN " + localRangeStart + " AND " + localRangeEnd;
        }
        var localDayByLevel = localRangeStart + " + (LEVEL - 1)";

        var lsql = "SELECT datum, SUM (gevuld) gevuld, MAX (aantal) aantal, MAX (vrijedag) vrijedag, MAX (weekdag) weekdag "
                 + "   FROM ("
                 + "   SELECT TRUNC(" + localRsvDate + ") datum,"
                 + "          SUM(rrd.res_rsv_deel_tot-rrd.res_rsv_deel_van)*24 gevuld,"
                 + "          vrij.mld_vrije_dagen_key vrijedag, "
                 + "          " + localResWeekday + " weekdag, "
                 + "          COUNT (*) aantal "
                 + "     FROM res_v_aanwezigrsv_deel rrd, "
                 + "          res_v_aanwezigdeel     rd, "
                 + "          ins_v_aanwezigdeel     id, "
                 + "          alg_v_allonroerendgoed plts, "
                 + "          alg_gebouw             g,"
                 + "          mld_vrije_dagen        vrij "
                 + "    WHERE     rrd.res_deel_key = rd.res_deel_key "
                 + "          AND id.ins_alg_ruimte_key = plts.alg_onroerendgoed_keys "
                 + "          AND id.ins_alg_ruimte_type = plts.alg_type "
                 + "          AND vrij.mld_vrije_dagen_datum(+) = TRUNC(" + localRsvDate + ")"
                 + "          AND rd.res_ins_deel_key = id.ins_deel_key "
                 + "          AND rrd.res_rsv_deel_dirtlevel = 0"
                 + (p_flr_key > -1 ? "  AND plts.alg_verdieping_key = " + p_flr_key
                                   : "  AND plts.alg_gebouw_key = " + p_geb_key)
                 + "          AND g.alg_gebouw_key = plts.alg_gebouw_key"
                 + "          AND vrij.mld_vrije_dagen_id(+) = COALESCE(g.mld_vrije_dagen_id, 'Default')"
                 + "          AND rd.res_discipline_key IN (" + p_res_disc_key_arr.join(",") + ")"
                 + localResdateFilter
                 + "    GROUP BY vrij.mld_vrije_dagen_key, TRUNC(" + localRsvDate + "), res_rsv_deel_van "
                 + " UNION ALL"
                 + "   SELECT TRUNC(" + localDayByLevel + ") dag, 0, 0, fac.getweekdaynum(" + localDayByLevel + "), 0 "
                 + "     FROM DUAL"
                 + "   CONNECT BY LEVEL <= " + p_datelimit
                 + " UNION ALL"
                 + "   SELECT vrij.mld_vrije_dagen_datum, 0, 1, 0, 0 "
                 + "     FROM mld_vrije_dagen    vrij"
                 + "        , alg_gebouw         g"
                 + (p_flr_key > -1 ? " , alg_verdieping v" : "")
                 + "    WHERE " + localVrijeDagFilter
                 + (p_flr_key > -1 ? "  AND v.alg_verdieping_key = " + p_flr_key
                                   + "  AND v.alg_gebouw_key = g.alg_gebouw_key"
                                   : "  AND g.alg_gebouw_key = " + p_geb_key)
                 + "      AND vrij.mld_vrije_dagen_id = COALESCE(g.mld_vrije_dagen_id, 'Default')"
                 + ")"
                 + "    GROUP BY datum ";

        if (p_local_resdate) {
            lsql = "SELECT * FROM (" + lsql + ") WHERE datum = " + p_local_resdate.toSQL(); // Deze is al TRUNC'ed
        }

        if (p_act_key > 0)
        {
            var sql = "SELECT res_activiteit_master_key"
                    + "     , res_activiteit_duur"
                    + "  FROM res_activiteit "
                    + " WHERE res_activiteit_key = " + p_act_key;
            var oRs = Oracle.Execute(sql);
            var master_act_key = oRs("res_activiteit_master_key").Value;
            res_activiteit_duur = oRs("res_activiteit_duur").Value;
            oRs.close();
            if (master_act_key > 0)
            {
                lsql = "SELECT * FROM (" + lsql + ")"
                     + " WHERE EXISTS (SELECT 1 FROM res_rsv_ruimte"
                     + "                WHERE res_rsv_ruimte_verwijder IS NULL"
                     + "                  AND res_activiteit_key = " + master_act_key
                     + "                  AND TRUNC(res_rsv_ruimte_van) = datum"
                     + "              )";
            }
        }
        lsql = lsql + " ORDER BY 1";

        return lsql;
    },

    dagbezetting_resdelen_in_aanweziggebouw_sql: function (p_res_disc_key_arr, p_res_deel_key, p_geb_key, p_dateoffset, p_datelimit, p_act_key)
    {
        var server_tz = S("fac_server_timezone");
        var local_tz = res.getTimezoneBy(p_geb_key, "G") || server_tz;

        function toServerDate(expr) {
            return convertToServerTimeSQL(expr, local_tz);
        }
        function toLocalDate(expr) {
            return convertToLocalTimeSQL(expr, local_tz);
        }
        // Deze functie converteert de gegeven expressie naar locale tijd, trunct die dan op locale dag, en converteert die naar server-tijd
        function localizedTrunc(expr) {
            return toServerDate("TRUNC(" + toLocalDate(expr) + ")");
        }
        var offsetExpr = (p_dateoffset || 0);

        var localRsvDate = toLocalDate("rrd.res_rsv_deel_van");
        var localRsvDateTrunced = "TRUNC(" + localRsvDate + ")";

        var localResWeekday = "fac.getweekdaynum(" + toLocalDate("rrd.res_rsv_deel_van") + ")";
        var localVervalDate = "TRUNC(" + toLocalDate("rd.res_deel_vervaldatum") + ")";

        var serverFromLocalRangeStart = localizedTrunc("SYSDATE") + " + " + offsetExpr;
        var serverFromLocalRangeEnd   = localizedTrunc("SYSDATE") + " - 1 + " + offsetExpr + " + " + p_datelimit;

        var serverDateFilter = " AND rrd.res_rsv_deel_van BETWEEN " + serverFromLocalRangeStart + " AND " + serverFromLocalRangeEnd;

        var lsql = "SELECT datum"
                 + "     , ins_discipline_key"
                 + "     , ins_discipline_omschrijving"
                 + "     , ins_discipline_image"
                 + "     , SUM(gevuld) gevuld"
                 + "     , MAX(aantal) aantal"
                 + "     , MAX(vrijedag) vrijedag"
                 + "     , MAX(weekdag) weekdag"
                 + "     , MAX(aantal_delen) delen"
                 + "  FROM ("
                            + "   SELECT " + localRsvDateTrunced + " datum"
                            + "        , rdis.ins_discipline_key"
                            + "        , " + lcl.xsqla("rdis.ins_discipline_omschrijving", "rdis.ins_discipline_key")
                            + "        , rdis.ins_discipline_image"
                            + "        , SUM(rrd.res_rsv_deel_tot-rrd.res_rsv_deel_van)*24 gevuld"
                            + "        , vrij.mld_vrije_dagen_key vrijedag"
                            + "        , " + localResWeekday + " weekdag"
                            + "        , COUNT(*) aantal"
                            + "        , 0 aantal_delen"
                            + "     FROM res_v_aanwezigrsv_deel rrd"
                            + "        , res_v_aanwezigdeel     rd"
                            + "        , res_discipline         rdis"
                            + "        , ins_v_aanwezigdeel     id"
                            + "        , alg_v_allonroerendgoed plts"
                            + "        , alg_gebouw             g"
                            + "        , mld_vrije_dagen        vrij"
                            + "    WHERE rrd.res_deel_key = rd.res_deel_key"
                            + (p_res_deel_key > -1 ? " AND rd.res_deel_key = " + p_res_deel_key : "")
                            + "      AND id.ins_alg_ruimte_key = plts.alg_onroerendgoed_keys"
                            + "      AND id.ins_alg_ruimte_type = plts.alg_type"
                            + "      AND vrij.mld_vrije_dagen_datum(+) = " + localRsvDateTrunced
                            + "      AND rd.res_ins_deel_key = id.ins_deel_key"
                            + "      AND rrd.res_rsv_deel_dirtlevel = 0"
                            + "      AND rd.res_discipline_key = rdis.ins_discipline_key"
                            + "      AND rd.res_discipline_key IN (" + p_res_disc_key_arr.join(",") + ")"
                            + "      AND plts.alg_gebouw_key = " + p_geb_key
                            + "      AND g.alg_gebouw_key = plts.alg_gebouw_key"
                            + "      AND vrij.mld_vrije_dagen_id(+) = COALESCE(g.mld_vrije_dagen_id, 'Default')"
                            + serverDateFilter
                            + "      AND (  rd.res_deel_vervaldatum IS NULL"
                            + "          OR rd.res_deel_vervaldatum > rrd.res_rsv_deel_van"
                            + "          )"
                            + "    GROUP BY vrij.mld_vrije_dagen_key"
                            + "           , " + localRsvDateTrunced
                            + "           , res_rsv_deel_van"
                            + "           , rdis.ins_discipline_key"
                            + "           , ins_discipline_omschrijving"
                            + "           , ins_discipline_image"
                            + " UNION ALL"
                            + "   SELECT d.dag"
                            + "        , rdis.ins_discipline_key"
                            + "        , " + lcl.xsqla("rdis.ins_discipline_omschrijving", "rdis.ins_discipline_key")
                            + "        , rdis.ins_discipline_image"
                            + "        , 0"
                            + "        , 0"
                            + "        , fac.getweekdaynum(d.dag) dagnr"
                            + "        , 0"
                            + "        , COUNT(*)"
                            + "     FROM res_v_aanwezigdeel     rd"
                            + "        , res_discipline         rdis"
                            + "        , ins_v_aanwezigdeel     id"
                            + "        , alg_v_allonroerendgoed plts"
                            + "        , alg_gebouw             g"
                            + "        , (SELECT TRUNC(" + toLocalDate("SYSDATE + " + p_dateoffset + " + (LEVEL - 1)") + ") dag"
                            + "                , fac.getweekdaynum(" + toLocalDate("SYSDATE + " + p_dateoffset + " + (LEVEL - 1)") + ") dagnr"
                            + "             FROM DUAL"
                            + "                  CONNECT BY LEVEL <= " + p_datelimit
                            + "          ) d"
                            + "    WHERE id.ins_alg_ruimte_key = plts.alg_onroerendgoed_keys "
                            + "      AND id.ins_alg_ruimte_type = plts.alg_type"
                            + "      AND rd.res_ins_deel_key = id.ins_deel_key"
                            + (p_res_deel_key > -1 ? " AND rd.res_deel_key = " + p_res_deel_key
                                             : ""
                              )
                            + "      AND rd.res_discipline_key = rdis.ins_discipline_key"
                            + "      AND rd.res_discipline_key IN (" + p_res_disc_key_arr.join(",") +")"
                            + "      AND plts.alg_gebouw_key = " + p_geb_key
                            + "      AND g.alg_gebouw_key = plts.alg_gebouw_key"
                            + "      AND (  rd.res_deel_vervaldatum IS NULL"
                            + "          OR " + localVervalDate + " > d.dag"
                            + "          )"
                            + "    GROUP BY d.dag"
                            + "           , rdis.ins_discipline_key"
                            + "           , ins_discipline_omschrijving"
                            + "           , ins_discipline_image"
                            + " UNION ALL"
                            + "   SELECT vrij.mld_vrije_dagen_datum"
                            + "        , rdis.ins_discipline_key"
                            + "        , " + lcl.xsqla("rdis.ins_discipline_omschrijving", "rdis.ins_discipline_key")
                            + "        , rdis.ins_discipline_image"
                            + "        , 0"
                            + "        , 1"
                            + "        , 0"
                            + "        , 0"
                            + "        , 0"
                            + "     FROM mld_vrije_dagen    vrij"
                            + "        , res_discipline     rdis"
                            + "        , alg_gebouw         g"
                            + "    WHERE vrij.mld_vrije_dagen_datum BETWEEN " + serverFromLocalRangeStart + " AND " + serverFromLocalRangeEnd
                            + "      AND rdis.ins_discipline_key IN (" + p_res_disc_key_arr.join(",") +")"
                            + "      AND g.alg_gebouw_key = " + p_geb_key
                            + "      AND vrij.mld_vrije_dagen_id = COALESCE(g.mld_vrije_dagen_id, 'Default')"
                        + ")"
                 + " GROUP BY ins_discipline_key, ins_discipline_omschrijving, ins_discipline_image, datum";

        if (p_act_key > 0)
        {
            var sql = "SELECT res_activiteit_master_key"
                    + "     , res_activiteit_duur"
                    + "  FROM res_activiteit "
                    + " WHERE res_activiteit_key = " + p_act_key;
            var oRs = Oracle.Execute(sql);
            var master_act_key;
            if (!oRs.EoF) {
                master_act_key = oRs("res_activiteit_master_key").Value;
                res_activiteit_duur = oRs("res_activiteit_duur").Value;
            }
            oRs.close();
            if (master_act_key > 0) {
                lsql = "SELECT * FROM (" + lsql + ")"
                     + " WHERE EXISTS (SELECT 1 FROM res_rsv_ruimte"
                     + "                WHERE res_rsv_ruimte_verwijder IS NULL"
                     + "                  AND res_activiteit_key = " + master_act_key
                     + "                  AND TRUNC(" + toLocalDate("res_rsv_ruimte_van") + ") = datum"
                     + "              )";
            }
        }

        lsql += " ORDER BY ins_discipline_omschrijving, datum";

        return lsql;
    },

    // Per item (werkplek) in dit gebouw hoeveel er die dag beschikbaar is
    // Als p_maxbezet is gedefinieerd worden alleen de werkplekken geselecteerd minder dan p_maxbezet bezet zijn
    // Zo kun je dus bezette plekken uitsluiten
    res_deel_bezetting_op_dag_sql: function (p_res_disc_key_arr, p_geb_key, p_flr_key, p_resdate, p_maxbezet)
    {
        var server_tz = S("fac_server_timezone");
        var local_tz = server_tz;
        if (p_flr_key > -1) {
            local_tz = res.getTimezoneBy(p_flr_key, "V");
        } else {
            local_tz = res.getTimezoneBy(p_geb_key, "G");
        }

        function toLocalDate(expr) {
            return convertToLocalTimeSQL(expr, local_tz);
        }

        var localRsvDate = toLocalDate("rrd.res_rsv_deel_van");
        var localRsvDateTrunced = "TRUNC(" + localRsvDate + ")";

        // p_resdate is hier al de juiste (lokale) dag, TRUNC'ed

        var localVervalDate = toLocalDate("rd.res_deel_vervaldatum");

        var lsql = "SELECT  plaan.alg_plaatsaanduiding plaats, "
                + lcl.xsql("rd.res_deel_omschrijving", "rd.res_deel_key") + " res_deel_omschrijving, "
                + "         COALESCE(SUM (rrd.res_rsv_deel_tot - rrd.res_rsv_deel_van) * 24, 0) bezet, "
                + "         rd.res_deel_key, "
                + "         rd.res_deel_image, "
                + "         plaan.alg_verdieping_omschrijving, "
                + "         plaan.alg_ruimte_omschrijving, "
                + "         plaan.alg_verdieping_code, "
                + "         rdis.ins_discipline_image, "
                + lcl.xsqla("rdis.ins_discipline_omschrijving", "rdis.ins_discipline_key")
                + "    FROM res_v_aanwezigrsv_deel rrd, "
                + "         res_v_aanwezigdeel     rd, "
                + "         ins_v_aanwezigdeel     id, "
                + "         alg_v_allonroerendgoed plts, "
                + "         alg_v_allonrgoed_gegevens plaan, "
                + "         res_discipline rdis "
                + "   WHERE     rrd.res_deel_key = rd.res_deel_key "
                + "         AND id.ins_alg_ruimte_key = plts.alg_onroerendgoed_keys "
                + "         AND id.ins_alg_ruimte_type = plts.alg_type "
                + "         AND plts.alg_onroerendgoed_keys = plaan.alg_onroerendgoed_keys "
                + "         AND plts.alg_type = plaan.alg_type "
                + "         AND rd.res_ins_deel_key = id.ins_deel_key "
                + "         AND (rd.res_deel_vervaldatum IS NULL OR " + localVervalDate + " > " + p_resdate.toSQL() + ")"
                + (p_flr_key>-1 ? "  AND plts.alg_verdieping_key = " + p_flr_key
                                : "  AND plts.alg_gebouw_key = " + p_geb_key
                  )
                + "         AND rd.res_discipline_key = rdis.ins_discipline_key"
                + "         AND rd.res_discipline_key IN (" + p_res_disc_key_arr.join(",") + ")"
                + "         AND " + localRsvDateTrunced + " = " + p_resdate.toSQL()
                + " GROUP BY plaan.alg_plaatsaanduiding, "
                + "          rd.res_deel_omschrijving, "
                + "          rd.res_deel_key, "
                + "          rd.res_deel_image, "
                + "          plaan.alg_verdieping_omschrijving, "
                + "          plaan.alg_ruimte_omschrijving, "
                + "          plaan.alg_verdieping_code, "
                + "          ins_discipline_image, "
                + "          rdis.ins_discipline_key, "
                + "          ins_discipline_omschrijving "
                + (p_maxbezet ? " HAVING COALESCE(SUM (rrd.res_rsv_deel_tot - rrd.res_rsv_deel_van) * 24, 0) <=" + p_maxbezet : "")
                + " UNION ALL"
                + "  SELECT plaan.alg_plaatsaanduiding plaats, "
                + lcl.xsql("rd.res_deel_omschrijving", "rd.res_deel_key") + " res_deel_omschrijving, "
                + "         0 bezet, "
                + "         rd.res_deel_key, "
                + "         rd.res_deel_image, "
                + "         plaan.alg_verdieping_omschrijving, "
                + "         plaan.alg_ruimte_omschrijving, "
                + "         plaan.alg_verdieping_code, "
                + "         rdis.ins_discipline_image, "
                + lcl.xsqla("rdis.ins_discipline_omschrijving", "rdis.ins_discipline_key")
                + "    FROM res_v_aanwezigdeel       rd, "
                + "         ins_v_aanwezigdeel       id, "
                + "         alg_v_allonroerendgoed   plts, "
                + "         alg_v_allonrgoed_gegevens plaan, "
                + "         res_discipline rdis "
                + "   WHERE     id.ins_alg_ruimte_key = plts.alg_onroerendgoed_keys "
                + "         AND id.ins_alg_ruimte_type = plts.alg_type "
                + "         AND plts.alg_onroerendgoed_keys = plaan.alg_onroerendgoed_keys "
                + "         AND plts.alg_type = plaan.alg_type "
                + "         AND rd.res_ins_deel_key = id.ins_deel_key "
                + "         AND rd.res_discipline_key = rdis.ins_discipline_key"
                + "         AND (rd.res_deel_vervaldatum IS NULL OR " + localVervalDate + " > " + p_resdate.toSQL() + ")"
                + (p_flr_key>-1 ? "  AND plts.alg_verdieping_key = " + p_flr_key
                                : "  AND plts.alg_gebouw_key = " + p_geb_key
                  )
                + "         AND rd.res_discipline_key IN (" + p_res_disc_key_arr.join(",") + ")"
                + "         AND NOT EXISTS "
                + "                 (SELECT '' "
                + "                    FROM res_v_aanwezigrsv_deel rrd "
                + "                   WHERE     rrd.res_deel_key = rd.res_deel_key "
                + "                         AND " + localRsvDateTrunced + " = " + p_resdate.toSQL() + ") "
                + " GROUP BY plaan.alg_plaatsaanduiding, "
                + "          rd.res_deel_omschrijving, "
                + "          rd.res_deel_key, "
                + "          rd.res_deel_image, "
                + "          plaan.alg_verdieping_omschrijving, "
                + "          plaan.alg_ruimte_omschrijving, "
                + "          plaan.alg_verdieping_code, "
                + "          ins_discipline_image, "
                + "          rdis.ins_discipline_key, "
                + "          ins_discipline_omschrijving "
                + " ORDER BY alg_verdieping_code,1,2 ";
        return lsql;
    },

    // Bepaal een (kleurings)class obv de bezetting tov de capaciteit
    // ik zou de class/kleur liever af laten hangen van het al/niet beschikbaar zijn van opties cf. fnIntervallen, maar dat vind ik te duur
    // zo kan het, maar er kan over gediscussieerd worden; low prio
    bezettings_class: function (p_bezet, p_capaciteit, p_minimum)
    {
        var lclass = "";
        __Log('bezet:'+p_bezet+' capaciteit:'+p_capaciteit+' minimum:'+p_minimum)
        if      (p_bezet >= p_capaciteit - p_minimum)   { lclass = "beschikb0"; }
        else if (p_bezet >= p_capaciteit - p_minimum*2) { lclass = "beschikb10";  }
        else if (p_bezet < p_minimum)                   { lclass = "beschikb100";  }
        else                                            { lclass = "beschikb50";  }
        return lclass;
    },

    // Geef de beschikbare intervallen uit p_bloktijden op p_resdate van p_res_deel_key, "" indien onbeschikbaar
    getIntervalString: function (p_res_deel_key, p_resdate, p_bloktijden)
    {
        var server_tz = S("fac_server_timezone") || "";
        var local_tz = server_tz;

        if (p_res_deel_key > 0) {
            var tzSql = "SELECT MIN(l.alg_locatie_timezone) alg_tz"
                      + "  FROM res_v_aanwezigdeel     rd"
                      + "     , ins_v_aanwezigdeel     id"
                      + "     , alg_v_allonroerendgoed plts"
                      + "     , alg_gebouw             g"
                      + "     , alg_locatie            l"
                      + " WHERE rd.res_ins_deel_key = id.ins_deel_key"
                      + "   AND id.ins_alg_ruimte_key = plts.alg_onroerendgoed_keys"
                      + "   AND id.ins_alg_ruimte_type = plts.alg_type"
                      + "   AND plts.alg_gebouw_key = g.alg_gebouw_key"
                      + "   AND g.alg_locatie_key = l.alg_locatie_key"
                      + "   AND rd.res_deel_key = " + p_res_deel_key;
            var tzRs = Oracle.Execute(tzSql);
            var alg_tz = tzRs("alg_tz").Value;
            tzRs.Close();
            if (alg_tz) {
                local_tz = alg_tz;
            }
        }

        function toLocalDate(expr) {
            return convertToLocalTimeSQL(expr, local_tz);
        }
        function toServerDate(expr) {
            return convertToServerTimeSQL(expr, local_tz);
        }

        var lres = "";
        var l_bloktijden = p_bloktijden.slice(0);
        for (var i = 0; i < l_bloktijden.length; i++) {
            l_bloktijden[i].bezet = false;
        }

        var localResVanExpr = toLocalDate("rm.res_rsv_ruimte_van");
        var localResTotExpr = toLocalDate("rm.res_rsv_ruimte_tot");

        // p_resdate is de lokale _dag_ (ge-TRUNCed dus)
        var serverResdateRangeStart = toServerDate(p_resdate.toSQL());
        var serverResdateRangeEnd = serverResdateRangeStart + " + 1";

        var lsql = "SELECT rm.res_reservering_key,"
            + "       rm.res_rsv_ruimte_volgnr,"
            + "       rm.res_rsv_ruimte_key,"
            + "       rm.res_rsv_ruimte_omschrijving,"
            + "       " + localResVanExpr + " AS res_rsv_ruimte_van,"
            + "       " + localResTotExpr + " AS res_rsv_ruimte_tot,"
            + "       0 res_disc_params_preposttime"
            + "  FROM res_rsv_ruimte rm,"
            + "       res_rsv_deel rd"
            + " WHERE     res_rsv_ruimte_van < " + serverResdateRangeEnd
            + "       AND res_rsv_ruimte_tot > " + serverResdateRangeStart
            + "       AND rd.res_rsv_ruimte_key = rm.res_rsv_ruimte_key"
            + "       AND rd.res_deel_key = " + p_res_deel_key
            + "       AND rm.res_rsv_ruimte_verwijder IS NULL"
            + "       AND rd.res_rsv_deel_verwijder IS NULL"
            + "       AND rd.res_rsv_deel_dirtlevel = 0"
            + " ORDER BY res_rsv_ruimte_van";

        var loRs = Oracle.Execute(lsql);
        while (!loRs.Eof) {
            var van = new Date(loRs("res_rsv_ruimte_van").Value);
            var tot = new Date(loRs("res_rsv_ruimte_tot").Value);
            for (var j = 0; j < l_bloktijden.length; j++) {
                if (van < l_bloktijden[j].einddatum && tot > l_bloktijden[j].startdatum) {
                    l_bloktijden[j].bezet = true;
                }
            }
            loRs.MoveNext();
        }
        loRs.Close();

        for (var k = 0; k < l_bloktijden.length; k++) {
            if (!l_bloktijden[k].bezet) {
                lres += l_bloktijden[k].name + " | ";
            }
        }

        if (lres.substr(lres.length - 3, 3) === " | ") {
            lres = lres.substr(0, lres.length - 3);
        } else {
            lres = "";
        }

        return lres;
    },

    // Bereken een specifieke(re) dagcapaciteit
    // Het kan afhankelijk zijn van de bloktijden die zijn gedefinieerd.
    // Dan wordt 'date' alleen gebruikt om de bloktijden naar 'date' te verschuiven
    // Als act_key een subreservering is wordt zelfs gekeken of er op date een master-reservering is
    dagcapaciteitCalc: function _dagcapaciteitCalc(date, dagcapaciteit, act_key, res_disc_key_arr, geb_key)
    {
        var begintijd = new Date();
        begintijd.setHours(23, 59, 0);
        var eindtijd = new Date();
        eindtijd.setHours(0, 0, 0);
        var btBegintijd;
        var btEindtijd;
        var btArr;
        var index;
        // Neem bij meerdere disciplines alleen de eerste: De bloktijden zouden hetzelfde moeten zijn.
        // Mergen van twee disciplines is niet mogelijk.
        var bt = res.getBloktijden(act_key, res_disc_key_arr[0], date, geb_key);
        if (bt.length > 0)
        {
            for (index = 0; index < bt.length; index++)
            {
                btArr = bt[index].begin.split(":");
                btBegintijd = new Date();
                btBegintijd.setHours(btArr[0], btArr[1]);
                if (btBegintijd.getTime() < begintijd.getTime())
                {
                    begintijd = btBegintijd;
                }
                btArr = bt[index].end.split(":");
                btEindtijd = new Date();
                btEindtijd.setHours(btArr[0], btArr[1]);
                if (btEindtijd.getTime() > eindtijd.getTime())
                {
                    eindtijd = btEindtijd;
                }
            }
            var diff = eindtijd.getTime() - begintijd.getTime();
            var uren = Math.floor(diff / 1000 / 60 / 60);
            diff -= uren * 1000 * 60 * 60;
            var minuten = Math.floor(diff / 1000 / 60) / 60; // make minutes decimal
            return uren + minuten;
        }
        else
        {
            return dagcapaciteit;
        }
    }
}
%>
