<% /*
    $Revision$
    $Id$

    File:           model_reservablerooms.inc

    Description:    Reservereerbare ruimtes model.
    Parameters:
    Context:

    Notes:          let op: dit bestand wordt gebruikt om ruimtes echt te gaan reserveren.
                    Het bestand model_res_ruimte is om reserveerbare ruimtes te beheren. Dat is wat heel anders.
                    // TODO: Koppelzalen?
                    // TODO: getQParamISODate moet niet hier maar in api_

    http://uwva.5iwork/Branch541/api2/reservablerooms.json?apikey=APIPFO&pretty=1&location=71&include=occupations&freefrom=2014-05-06T11:00:00Z&freeto=2014-05-06T13:00:00Z
*/

%>
<!-- #include file="../Shared/discxalg3d.inc"-->
<!-- #include file="../Shared/flexfiles.inc"-->
<!-- #include file="model_reservableequipment.inc"-->
<!-- #include file="model_res_ruimte_opstelling.inc"-->

<%
var sqlcap = "(SELECT MAX (res_ruimte_opstel_bezoekers) bmax"
           + "   FROM res_ruimte_opstelling"
           + "  WHERE res_ruimte_opstelling.res_ruimte_key = res_ruimte.res_ruimte_key)";

function fnFrom (oRs, field, model)
{
    var tijd = oRs(field.dbs).Value || S("res_t1");
    return toTimeString(tijd);
}
function fnTo (oRs, field, model)
{
    var tijd = oRs(field.dbs).Value || S("res_t2");
    return toTimeString(tijd);
}
model_reservablerooms =
{
    table: "res_ruimte",
    primary: "res_ruimte_key",
    records_name: "reservablerooms",
    record_name: "reservableroom",
    fields: {"id"         : { dbs: "res_ruimte_key",          typ: "key",     filter: "exact", seq: "res_s_res_ruimte_key"},
             "name"       : { dbs: "res_ruimte_nr",           typ: "varchar"},
             "description": { dbs: "res_ruimte_omschrijving", typ: "varchar"},
             "open"       : { dbs: "res_ruimte_begintijd",    typ: "time", val: fnFrom },
             "close"      : { dbs: "res_ruimte_eindtijd",     typ: "time", val: fnTo },
             "location"   : { dbs: "alg_v_allonroerendgoed.alg_locatie_key",  typ: "key", foreign: "alg_locatie", filter: "exact"},
             "capacity"   : { dbs: "dummy",                   typ: "varchar",  sql: sqlcap },
             "room"       : { dbs: "res_alg_ruimte.alg_ruimte_key",       typ: "key",     foreign: "alg_ruimte"},
             "catalog"    : { "dbs": "res_discipline_key",
                              "label": L("res_discipline_key"),
                              "typ": "key",
                              "foreign": {
                                "tbl": "(select ins_discipline_key, ins_discipline_omschrijving"
                                     + "  from ins_tab_discipline"
                                     + " where ins_discipline_verwijder is null"
                                     + "   and ins_discipline_module = 'RES'"
                                     + "   and ins_discipline_min_level = 3)",
                                "key": "ins_discipline_key",
                                "desc": "ins_discipline_omschrijving"
                              },
                              "filter": "exact",
                              "LOVinit": ""
                            },
             "image"      : { dbs: "res_ruimte_image",        typ: "varchar" }
            },
    // advanced filter
    filter: { prefunc: function _prefilterfunc(params)
                {
                    if (typeof getQParamISODate == "undefined")
                        return null;
                    //__DoLog("getQParamISODate: " + getQParamISODate("res_van"));
                    var res_van = getQParamISODate("freefrom", null);
                    var res_tot = getQParamISODate("freeto", null);
                    var loc_key = parseInt(params.filter.location);
                    if (res_van && res_tot)
                    {
                        var params = {res_van: res_van, // TODO: Welke dag?
                                      res_tot: res_tot,
                                      loc: loc_key, // 71=alkw
                                      authparams : user.checkAutorisation("WEB_RESUSE", null, null, true),
                                      forSelectRoom: true
                                    }
                        return res.plan_bezet_info(params); // wordt meegeven aan de volgende func
                    }
                    else
                        return null;
                },
             func: function _filterfunc(oRs, params, prefuncdata)
                {
                    if (!prefuncdata)
                        return true;
                    var res_van = getQParamISODate("freefrom", null);
                    var res_tot = getQParamISODate("freeto", null); // TODO: Voorkomen dat het een andere dag is
                    var key = oRs("res_ruimte_key").Value;
                    var occupations = prefuncdata[key]
                    prev_end = res_van.setFloatHours(S("res_t1")); // TODO: per ruimte?
                    for (var i in occupations)
                    {
                        var occu = occupations[i];
                        if (res_van < occu.res_tot && res_tot > occu.res_van)
                        {
                            return false; // Overlap
                        }
                        prev_end = occu.res_tot;
                    }
                    return true;
                }
            },
    includes: {"reservableequipment": // Komt waarschijnlijk te vervallen: gebruik maar filter op model_reservableequipment
                                    { model: model_reservableequipment,
                                      joinfield: "res_ruimte_key",
                                      single_only: true, // Zodat je alleen de mogelijke objecten van één ruimte kunt opvragen (performance)
                                      joinfunction: function (params) // Alleen objecten die zijn toegestaan in deze ruimte
                                      {
                                        var urole = "fe"; // TODO: Moet echt niet ter zake doen
                                        var autfunction = urole == "fe"? "WEB_RESUSE" : "WEB_RESMAN";
                                        var params = {  res_ruimte_key : params.filter.id, // die is er dankzij single_only
                                                        select_fields  : "r.res_deel_key",
                                                        //sdisc          : p_sdisc, // TODO
                                                        group_by       : " GROUP BY r.res_deel_key",
                                                        autfunction    : autfunction
                                                     };
                                        var sql = get_res_deel_sql ( params );
                                        return "res_deel_key IN (" + sql + ")"
                                      }
                                    },
               "configurations": { model: new model_res_ruimte_opstelling(),
                                   joinfield: "res_ruimte_key"
                                 },
               "occupations": { // prefunc om alles tegelijk op te halen
                                prefunc: function _occupations(params)
                                    {
                                        var res_van = getQParamISODate("from", new Date());
                                        var res_tot = getQParamISODate("to", res_van);
                                        var loc_key = parseInt(params.filter.location); // 71=alkw

                                        var params = { res_van: res_van,
                                                       res_tot: res_tot,
                                                       loc: loc_key,
                                                       authparams : user.checkAutorisation("WEB_RESUSE", null, null, true),
                                                       forSelectRoom: true
                                                     }
                                        return res.plan_bezet_info(params); // wordt meegeven aan de volgende func
                                    },
                                func: function _occupations(key, params, oRs, record, prefuncdata)
                                    {
                                        var occupied = prefuncdata[key] ;
                                        if (!occupied)
                                            return null;

                                        var bezet_info = occupied;
                                        // formatteren naar gewenste veldnamen
                                        var result = [];
                                        for (var bezet in bezet_info)
                                        {
                                            result.push({ from: bezet_info[bezet].res_van,
                                                          to: bezet_info[bezet].res_tot,
                                                          id: bezet_info[bezet].rsv_ruimte_key
                                                        });
                                        }
                                        //return bezet_info;
                                        return result;
                                    }
                              }
              },

    search: {
        autosearch: true,
        filters: ["name","description","location","catalog"]
      },

    _autorized_discs_sql: function (field)
    {
        var urole = "fe"; // TODO: Moet echt niet ter zake doen
        var autfunction = urole == "fe"? "WEB_RESUSE" : "WEB_RESMAN";
        var sql = field + " IN ("
                + "   SELECT g.ins_discipline_key"
                + "     FROM fac_v_webgebruiker g, fac_functie f "
                + "    WHERE g.fac_functie_key = f.fac_functie_key "
                + "      AND f.fac_functie_code = " + safe.quoted_sql(autfunction)
                + "      AND g.fac_gebruiker_alg_level_write < 9"
                + "      AND g.prs_perslid_key = " + user_key
                + "      AND " + field + " = g.ins_discipline_key" // deze regel is redundant maar goed voor de performance
                + "   )";
        return sql;
    },
    REST_GET: function _GET(params)
        {
            var urole = "fe"; // TODO: Moet echt niet ter zake doen
            var autfunction = urole == "fe"? "WEB_ALGUSE" : "WEB_ALGMAN";
            params.authparams = user.checkAutorisation(autfunction, null, null, true); // pessimistisch

            // TODO: Add authorization
            var query = api2.sqlfields(params, model_reservablerooms );
            query.wheres.push(model_reservablerooms._autorized_discs_sql("res_ruimte.res_discipline_key"));

            query.tables.push("res_alg_ruimte");

            query.wheres.push("res_ruimte_verwijder IS NULL");
            query.wheres.push("res_alg_ruimte_verwijder IS NULL");

            //query.wheres.push("(bez_afspraak_contact_key = " + user_key // Altijd fe vooralnog
            //                   + "     OR bez_afspraak_host_key = " + user_key + ")");
            query.wheres.push("res_alg_ruimte.res_ruimte_key = res_ruimte.res_ruimte_key");
            //query.wheres.push("bez_afspraak_datum BETWEEN SYSDATE - " + S("facilitiespast_bez") + " AND SYSDATE + " + S("facilitiesfuture_bez"));

            query.tables.push("alg_v_allonroerendgoed");
            query.wheres.push("alg_v_allonroerendgoed.alg_onroerendgoed_keys = res_alg_ruimte.alg_ruimte_key");
            query.wheres.push("alg_v_allonroerendgoed.alg_type = 'R'");

            var wheres = api2.sqlfilter(params, model_reservablerooms);
            query.wheres = query.wheres.concat(wheres);

            var sql = "SELECT " + query.selects.join(", ")
                    + "  FROM " + query.tables.join(", ")
                    + " WHERE " + query.wheres.join(" AND " )
                    + " ORDER BY res_ruimte_nr";

            var json = api2.sql2json (params, sql, model_reservablerooms );

            return json;
        },
    REST_PUT: function (params, jsondata, the_key) /* update reservablerooms */
        {
            abort_with_warning("Nog niet ondersteund");//
        },
    xxxREST_POST: function (params, jsondata, parent_key) /* new reservablerooms */
        {
            // Nog niet ondersteund
        },
    xxxRES_DELETE: function (params) /* delete reservablerooms */
    {
            // Nog niet ondersteund
    }
}
%>