<% /*
    $Revision$
    $Id$

    File:           model_objects.inc

    Description:    Object model.
    Parameters:
    Context:

    Notes:          We ondersteunen vooralsnog uitsluitend ruimtegebonden objecten
*/

%>
<!-- #include file="../Shared/discxalg3d.inc"-->
<!-- #include file="./model_tracking.inc"-->
<%
model_objects =
{
    table: "ins_deel",
    primary: "ins_deel_key",
    records_name: "objects",
    record_name: "object",
    multi_update: true,
    fields: {"id"       : { dbs: "ins_deel_key",          typ: "key",     filter: "exact" },
             "name"     : { dbs: "ins_deel_omschrijving", typ: "varchar", filter: "like"},
             "description" : { dbs: "ins_deel_opmerking", typ: "varchar", filter: "like"},
             "type"     : { dbs: "ins_srtdeel_key",       typ: "key",     filter: "exact", foreign: "ins_srtdeel"},
             "state"    : { dbs: "ins_deel_state",        typ: "varchar" },
             "statedate": { dbs: "ins_deel_statedate",    typ: "datetime" },
             "expiration":{ dbs: "ins_deel_vervaldatum",  typ: "date" },
             "manager"  : { dbs: "prs_perslid_key_beh",   typ: "key",      foreign: "prs_perslid",        track: true, label: L("lcl_ins_manager"),  sfilter: "exact" },
             "location" : { dbs: "ins_v_deel_gegevens.alg_locatie_key",    typ: "key",     foreign: "alg_locatie"},
             "building" : { dbs: "ins_v_deel_gegevens.alg_gebouw_key",     typ: "key",     foreign: "alg_gebouw" },
             "floor"    : { dbs: "ins_v_deel_gegevens.alg_verdieping_key", typ: "key",     foreign: "alg_verdieping" },
             "room"     : { dbs: "ins_v_deel_gegevens.alg_ruimte_key",     typ: "key",     foreign: "alg_ruimte" },
             "owner"    : { dbs: "ins_v_deel_gegevens.prs_perslid_key",    typ: "key",     foreign: "prs_perslid" }
            },

    includes: { "tracking": {
                                  model: new model_tracking(['deel']),
                                  joinfield: "fac_tracking_refkey"
                            }
              },
    REST_GET: function _GET(params)
        {
            var urole = "fe"; // TODO: Moet echt niet ter zake doen
            var autfunction = urole == "fe"? "WEB_INSUSE" : "WEB_INSMAN";
            params.authparams = user.checkAutorisation(autfunction, null, null, true); // pessimistisch

            // TODO: Add authorization
            var query = api2.sqlfields(params, model_objects);
            query.wheres.push("ins_deel_verwijder IS NULL");
            // Toon standaard alleen de niet vervallen objecten, behalve als specifiek op object identificatie wordt gezocht.
            if (!params.filter.expired && !params.filter.name)
              query.wheres.push(" (ins_deel.ins_deel_vervaldatum IS NULL OR ins_deel.ins_deel_vervaldatum > TRUNC(SYSDATE))");
            // Als Uitgegeven of Beschikbaar is meegegeven dan overzicht uitleenmodule.
            if (params.filter.lentout || params.filter.avail)
            {
              query.tables.push("ins_srtdeel");
              query.wheres.push("ins_deel.ins_srtdeel_key = ins_srtdeel.ins_srtdeel_key");
              query.wheres.push("ins_srtdeel_uitleenbaar = 1");
              if (params.filter.lentout && !params.filter.avail)
                query.wheres.push("ins_alg_ruimte_key_org IS NOT NULL");
              if (!params.filter.lentout && params.filter.avail)
                query.wheres.push("ins_alg_ruimte_key_org IS NULL");
            }

            // TODO: We ondersteunen uitsluitend ruimte- werkplek- en persoonsgebonden objecten
            query.tables.push("ins_v_deel_gegevens");
            query.wheres.push("ins_deel.ins_alg_ruimte_type IN ('R', 'W', 'P') ");
            query.wheres.push("ins_v_deel_gegevens.ins_deel_key = ins_deel.ins_deel_key");

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

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

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

            return json;
        },
    REST_PUT: function (params, jsondata, the_key) /* update object */
        {
            var dbfields = api2.update_fields(params, model_objects, jsondata); // Build updater
            //model_objects._validate_fields(dbfields, params, jsondata);

            // TODO: Autorization
            var wheres = [" ins_deel_key = " + the_key];
            var insUpd = buildTrackingUpdate("ins_deel", wheres.join(" AND " ), dbfields, { noValidateToken: true });
            Oracle.Execute(insUpd.sql);

            //var beztrack = api2.process_includes(params, model_objects, jsondata, the_key);

            return { key: the_key };
        },
    xxx_POST: function (params) /* new object */
    {
            // Nog niet ondersteund
    },
    xxx_DELETE: function (params) /* delete object */
    {
            // Nog niet ondersteund
    }
}
%>