<% /*
    $Revision$
    $Id$

    File:           model_reservableequipment.inc

    Description:    reserveerbare delen model.
    Parameters:
    Context:

    Notes:
*/

%>
<!-- #include file="../Shared/discxalg3d.inc"-->
<%
function alg_level(json)
{
    var alg_level_id = json;
    var alg_level = "";
    switch (alg_level_id)
    {
        case -1: alg_level = "Alles";      break;
        case 0:  alg_level = "Regio";      break;
        case 1:  alg_level = "District";   break;
        case 2:  alg_level = "Locatie";    break;
        case 3:  alg_level = "Gebouw";     break;
        case 4:  alg_level = "Verdieping"; break;
        case 5:  alg_level = "Ruimte";     break;
        default: UNKNOWN_FORMAT_TYPE;
    }
    return alg_level;
}

model_reservableequipment =
{
    table: "res_deel",
    primary: "res_deel_key",
    records_name: "reservableequipment",
    record_name: "reservableequipment",
    fields: { "id"      : { dbs: "res_deel_key",            typ: "key",     filter: "exact", seq: "res_s_res_deel_key" },
              "name"    : { dbs: "res_deel_omschrijving",   typ: "varchar", filter: "like" },
              "remark"  : { dbs: "res_deel_opmerking",      typ: "varchar", filter: "like" },
              "unit"    : { dbs: "res_deel_eenheid",        typ: "varchar", filter: "like" },
              "price"   : { dbs: "res_deel_prijs",          typ: "float",   "iscurrency": true, filter: "like" },
              "fixed"   : { dbs: "res_deel_prijs_vast",     typ: "check0",  filter: "exact" },
              "object"  : { dbs: "res_ins_deel_key",        typ: "key",     foreign: "ins_deel" },
              "catalog" : { dbs: "res_discipline_key",      typ: "key",     foreign: "res_discipline", filter: "exact" },
              "scope"   : { dbs: "res_deel_alg_level",      typ: "key",     foreign: alg_level },
              "expires" : { dbs: "res_deel_vervaldatum",    typ: "date" }
             },
    // advanced filter
    filter: { prefunc: function _prefilterfunc(params)
                {
                    return null;
                    //__DoLog("getQParamISODate: " + getQParamISODate("res_van"));
                    var res_room_key = getQParamInt("allowedinroom", -1);
                    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_room_key = getQParamInt("allowedinroom", -1);
                    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: {
               "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

                                        // JGL: Eigenlijk wil ik hier res.plan_deel_bezet_info gaan gebruiken,
                                        //      Die is echter zeer sterk gericht op het werken voor één
                                        //      discipline tegelijk en dat durfde ik niet met 5.4.2b overhoop te halen
                                        // TODO: Nu ondersteunen we echter nog niet dat een ins_deel voor meerdere
                                        //       res_delen gebruikt wordt (is wel mogelijk namelijk als dat
                                        //       verschillende catalogi zijn)
                                        var sql = "SELECT rrd.res_rsv_deel_van"
                                                + "     , rrd.res_rsv_deel_tot"
                                                + "     , rd.res_deel_key"
                                                + "     , rrd.res_rsv_deel_key"
                                                + "  FROM res_v_aanwezigrsv_ruimte rr"
                                                + "     , res_v_aanwezigdeel rd"
                                                + "     , res_v_aanwezigrsv_deel rrd"
                                                + " WHERE rrd.res_rsv_deel_tot >= " + res_van.beginToSQL()
                                                + "   AND rrd.res_rsv_deel_van <= " + res_tot.endToSQL()
                                                + "   AND rrd.res_deel_key = rd.res_deel_key"
                                                + "   AND rrd.res_rsv_ruimte_key = rr.res_rsv_ruimte_key"
                                                + "   AND rd.res_discipline_key <> " + S("vis_parking_key")
                                                + "   AND " + model_reservableequipment._autorized_discs_sql("rd.res_discipline_key");

                                        var existing_res = {};
                                        var oRs = Oracle.Execute(sql);
                                        while (!oRs.Eof)
                                        {
                                            var res_deel_key = oRs("res_deel_key").value;
                                            if (!existing_res[res_deel_key]) existing_res[res_deel_key] = [];

                                            var data = { id: oRs("res_rsv_deel_key").Value,
                                                         from: new Date(oRs("res_rsv_deel_van").Value),
                                                         to: new Date(oRs("res_rsv_deel_tot").Value)
                                                       };
                                            existing_res[res_deel_key].push(data);
                                            oRs.MoveNext();
                                        }
                                        oRs.Close();
                                        //if (params.filter.allowedinresroom)
                                        //    params.res_ruimte_key = params.filter.allowedinresroom;

                                        return existing_res; // wordt meegeven aan de volgende func
                                    },
                                func: function _occupations(key, params, oRs, record, prefuncdata)
                                    {
                                        var ins_deel_key = key; //record.object.id;
                                        // Het is al in het goede formaat
                                        return prefuncdata[ins_deel_key] ;
                                    }
                              }
              },
    _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_read < 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_RESUSE" : "WEB_RESMAN";
            params.authparams = user.checkAutorisation(autfunction, null, null, true); // pessimistisch

            // TODO: Add authorization
            var query = api2.sqlfields(params, model_reservableequipment);
            query.wheres.push("res_deel_verwijder IS NULL");
            query.wheres.push(model_reservableequipment._autorized_discs_sql("res_deel.res_discipline_key"));

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

            if (params.filter.allowedinresroom)
            {
                var rparams = {  res_ruimte_key : params.filter.allowedinresroom,
                                 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 ( rparams );
                query.wheres.push("res_deel_key IN (" + sql + ")");
            }

            var sql = "SELECT " + query.selects.join(", ")
                    + "  FROM " + query.tables.join(", ")
                    + " WHERE " + query.wheres.join(" AND " )
                    + " ORDER BY res_deel_omschrijving";
            var json = api2.sql2json (params, sql, model_reservableequipment);
            return json;
        },
    xxxREST_PUT: function (params, jsondata, the_key) /* update reservable equipment */
    {
            // Nog niet ondersteund
    },
    xxxREST_POST: function (params, jsondata, parent_key) /* new reservable object */
    {
            // Nog niet ondersteund
    },
    DELETE: function (params) /* delete reservable object */
    {
            // Nog niet ondersteund
    }
}
%>
