<% /*
    $Revision$
    $Id$

    File:           model_reservationequipment.inc

    Description:    reserveren delen model.
    Parameters:
    Context:

    Notes:
*/
%>
<!-- #include file="../Shared/discxalg3d.inc"-->
<%

var _disc_expires = []; // expire tijd per discipline
function is_expired(disc_key, jsDate)
{
  if (disc_key > 0)
  {
    if (!_disc_expires[disc_key])
      _disc_expires[disc_key] = res.discipline_expire(disc_key);
    return (jsDate < _disc_expires[disc_key]);
  }
}


model_reservationequipment =
{
    table: "res_rsv_deel",
    primary: "res_rsv_deel_key",
    records_name: "reservationequipment",
    record_name:  "reservationequipment",

    fields: {"id"         : { dbs: "res_rsv_deel_key",         typ: "key",      filter: "exact" },
             "reservation": { dbs: "res_rsv_ruimte_key",       typ: "key",      filter: "exact", foreign: "res_rsv_ruimte" },
             "equipment"  : { dbs: "res_deel_key",             typ: "key",      filter: "exact", foreign: "res_deel" },
             "status"     : { dbs: "res_status_bo_key",        typ: "key",      filter: "exact", foreign: res.getbostatustext },
             "from"       : { dbs: "res_rsv_deel_van",         typ: "datetime", filter: "exact" },
             "to"         : { dbs: "res_rsv_deel_tot",         typ: "datetime"  },
             "price"      : { dbs: "res_rsv_deel_prijs",       typ: "float",    "iscurrency": true},
             "processed"  : { dbs: "res_rsv_deel_verwerkt",    typ: "datetime"  },
             "closed"     : { dbs: "res_rsv_deel_afgemeld",    typ: "datetime"  },
             "changed"    : { dbs: "res_rsv_deel_mutatie",     typ: "datetime"  },
             "dirtlevel"  : { dbs: "res_rsv_deel_dirtlevel",   typ: "number",   filter: "exact" }
              // altijd 1          { name: "number",      dbs: "res_rsv_deel_aantal",  typ: "number", filter: "exact" }
             },

    list: { columns: [ "id", "from", "to", "equipment", "price" ] },

    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_reservationequipment);
            query.wheres.push("res_rsv_deel_verwijder IS NULL");

            query.tables.push("res_rsv_ruimte");
            query.wheres.push("res_rsv_ruimte.res_rsv_ruimte_key = res_rsv_deel.res_rsv_ruimte_key");
            query.wheres.push(user_key + " IN (res_rsv_ruimte_host_key, res_rsv_ruimte_contact_key)"); // Altijd fe vooralnog
            query.wheres.push("res_rsv_ruimte_van BETWEEN SYSDATE - " + S("facilitiespast_res") + " AND SYSDATE + " + S("facilitiesfuture_res"));

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

            var sql = "SELECT " + query.selects.join(", ")
                    + "  FROM " + query.tables.join(", ")
                    + " WHERE " + query.wheres.join(" AND " )
                    + " ORDER BY res_rsv_deel_key";
            var json = api2.sql2json (params, sql, model_reservationequipment);

            return json;
        },

    REST_PUT: function (params, jsondata, the_key) /* update reservable equipment */
        {
            var rsv_deel_key = the_key;
            var dbfields = api2.update_fields(params, model_reservationequipment, jsondata); // Build updater
            var res_deel_key = parseInt(jsondata.equipment);
            model_reservationequipment._analyze_fields(dbfields, params, jsondata);
            model_reservationequipment._validate_fields(dbfields, params, jsondata);

            // De voorziening kan niet buiten de reservering van de ruimte geclaimd worden
            var sql = "SELECT r.res_rsv_ruimte_key"
                    + "     , r.res_rsv_ruimte_van"
                    + "     , r.res_rsv_ruimte_tot"
                    + "  FROM res_rsv_ruimte r"
                    + "     , res_rsv_deel d"
                    + " WHERE r.res_rsv_ruimte_key = d.res_rsv_ruimte_key"
                    + "   AND d.res_rsv_deel_key = " + rsv_deel_key;
            var oRs = Oracle.Execute(sql);
            var rsv_ruimte_key = oRs("res_rsv_ruimte_key").value;
            var res_van = new Date(oRs("res_rsv_ruimte_van").value);
            var res_tot = new Date(oRs("res_rsv_ruimte_tot").value);
            oRs.Close();

            var wheres = [" res_rsv_deel_key = " + rsv_deel_key];
            var resUpd = buildTrackingUpdate("res_rsv_deel", wheres.join(" AND " ), dbfields, { noValidateToken: true });
            var check_fail_sql = "  if res.dirty_level_all(" + rsv_ruimte_key + ") <> 0 then"
                               + "    raise_application_error (-20000, 'res_m999 " + L("lcl_res_fe_no_dirty") + "');"
                               + "  end if;"
            var sql = "BEGIN "
                    + resUpd.sql + ";"
                    + "  res.set_deel_dirty (" + rsv_deel_key + "); " // Zelf dirty geworden?
                    + "  res.set_delen_clean (" + res_deel_key + "," + res_van.toSQL() + "," + res_tot.toSQL() +"); " //Anderen clean geworden?
                    + check_fail_sql
                    + "END;";
            var err = Oracle.Execute(sql, true);
            if (err.friendlyMsg)
                abort_with_warning(err.friendlyMsg);

            return { key: rsv_deel_key };
        },

    REST_POST: function (params, jsondata, parent_key) /* new reservable object */
        {
            params.isNew       = true;
            var trackarray     = [];
            var rsv_ruimte_key = parent_key;
            var this_res       = res.func_enabled(rsv_ruimte_key); // Wat heb ik zoal aan rechten op deze specifieke reservering

            var dbfields = api2.update_fields(params, model_reservationequipment, jsondata); // Build updater
            model_reservationequipment._analyze_fields(dbfields, params, jsondata);
            model_reservationequipment._validate_fields(dbfields, params, jsondata);

            var sql = "SELECT res_reservering_key"
                    + "     , res_rsv_ruimte_van"
                    + "     , res_rsv_ruimte_tot"
                    + "     , res_rsv_ruimte_volgnr"
                    + "  FROM res_rsv_ruimte"
                    + " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
            var oRs = Oracle.Execute(sql);
            var res_key    = oRs("res_reservering_key").value;
            var res_volgnr = oRs("res_rsv_ruimte_volgnr").value;
            var res_van    = new Date(oRs("res_rsv_ruimte_van").value);
            var res_tot    = new Date(oRs("res_rsv_ruimte_tot").value);
            oRs.Close();

            dbfields["id"]     = { dbs: "res_rsv_deel_key",    typ: "key",      seq: "res_s_res_rsv_deel_key" };
            dbfields["reservation"] = { dbs: "res_rsv_ruimte_key",  typ: "key",      val: rsv_ruimte_key };
            dbfields["from"]   = { dbs: "res_rsv_deel_van",    typ: "datetime", val: res_van };
            dbfields["to"]     = { dbs: "res_rsv_deel_tot",    typ: "datetime", val: res_tot };
            dbfields["amount"] = { dbs: "res_rsv_deel_aantal", typ: "number",   val: 1 };

            var resIns = buildInsert("res_rsv_deel", dbfields, { noValidateToken: true });
            var rsv_deel_key = resIns.sequences["res_rsv_deel_key"];

            // Tracking toevoegen.
            var res_deel_key = parseInt(jsondata.equipment);
            var sql = "SELECT res_deel_omschrijving"
                    + "  FROM res_deel"
                    + " WHERE res_deel_key = " + res_deel_key;
            var oRs = Oracle.Execute(sql);
            var res_deel_name = oRs("res_deel_omschrijving").value;
            __Log("added " + res_deel_name + " : " + res_deel_key);
            var inserttrack = res.trackobject(res_deel_key, "insert");
            trackarray.push(inserttrack);

            // Check of er delen dirty zijn (geworden)
            var check_fail_sql = "";
            if (S("res_fe_allow_dirty") != 1 && this_res.canChangeFEOnly)
            {
              check_fail_sql = "  if res.dirty_level_all(" + rsv_ruimte_key + ") <> 0 then"
                             + "    raise_application_error (-20000, 'res_m960 "+L("lcl_res_fe_no_dirty")+"');"
                             + "  end if;"
            }
            var sql = "BEGIN "
                    + resIns.sql + ";"
                    + "  res.set_delen_dirty (" + rsv_deel_key + "); "
                    + check_fail_sql
                    + "END;";
            var err = Oracle.Execute(sql, true);
            if (err.friendlyMsg)
                abort_with_warning(err.friendlyMsg);
            else
                res.trackreserveringupdate(rsv_ruimte_key, trackarray.length? L("lcl_res_is_resupdtrack").format(res_key + "/" + res_volgnr) + "\n" + trackarray.join("\n") : null);

            params.isNew = false; // Voorkom dat een volgende reservationequipment ook een insert wordt.
            return { key: rsv_deel_key };
        },

    REST_DELETE: function (params, the_key) /* delete reservable object */
        {
            var rsv_deel_key = the_key;
            var must_warn      = false; // must I warn about last-minute?
            var trackarray     = [];
            var urole = "fe";

            var sql = "SELECT rr.res_reservering_key"
                    + "     , rr.res_rsv_ruimte_key"
                    + "     , rr.res_rsv_ruimte_van"
                    + "     , rr.res_rsv_ruimte_tot"
                    + "     , rr.res_rsv_ruimte_volgnr"
                    + "     , d.res_deel_key"
                    + "     , d.res_deel_omschrijving"
                    + "     , d.res_discipline_key"
                    + "  FROM res_rsv_ruimte rr"
                    + "     , res_rsv_deel rd"
                    + "     , res_deel d"
                    + " WHERE rr.res_rsv_ruimte_key = rd.res_rsv_ruimte_key"
                    + "   AND rd.res_deel_key = d.res_deel_key"
                    + "   AND rd.res_rsv_deel_key = " + rsv_deel_key;
            var oRs = Oracle.Execute(sql);
            var res_key        = oRs("res_reservering_key").value;
            var res_volgnr     = oRs("res_rsv_ruimte_volgnr").value;
            var res_van        = new Date(oRs("res_rsv_ruimte_van").value);
            var res_tot        = new Date(oRs("res_rsv_ruimte_tot").value);
            var rsv_ruimte_key = oRs("res_rsv_ruimte_key").value;
            var res_deel_key   = oRs("res_deel_key").value;
            var res_deel_name  = oRs("res_deel_omschrijving").value;
            var res_disc_key   = oRs("res_discipline_key").value;
            oRs.Close();

            // Expire check
            must_warn = must_warn || is_expired(res_disc_key, res_van);

            var resDel = "DELETE from res_rsv_deel"
                       + " WHERE res_rsv_ruimte_key=" + rsv_ruimte_key
                       + "   AND res_deel_key = " + res_deel_key; // eventuele dubbelen ook verwijderen.

            __Log("removed " + res_deel_name + " : " + res_deel_key);
            // Tracking toevoegen.
            var deletetrack = res.trackobject(res_deel_key, "delete");
            trackarray.push(deletetrack);

            var sql = "BEGIN "
                    + resDel + ";"
                    + "  res.set_delen_clean (" + res_deel_key + "," + res_van.toSQL() + "," + res_tot.toSQL() +"); " // Anderen clean geworden?
                    + "END;";
            var err = Oracle.Execute(sql, true);
            if (err.friendlyMsg)
                abort_with_warning(err.friendlyMsg);
            else
                res.trackreserveringupdate(rsv_ruimte_key, trackarray.length? L("lcl_res_is_resupdtrack").format(res_key + "/" + res_volgnr) + "\n" + trackarray.join("\n") : null);

            //
            if (must_warn && urole != "bo")
            {
                warning = L("lcl_res_obj_lastminute");
            }

        },

    _analyze_fields: function (dbfields, params, jsondata) /* analyseer inkomende data, common voor PUT en POST */
                                                         /* res_ruimte+config wordt bijvoorbeeld omgezet in res_ruimte_opstel_key */
    {
        if ("equipment" in jsondata)
        {
            // Mag/kan het deel gereserveerd worden in deze ruimte
            var res_deel_key = parseInt(jsondata.equipment);
            var sql = "SELECT res_ins_deel_key"
                    + "  FROM res_deel"
                    + " WHERE res_deel_key = " + res_deel_key;
            var oRs = Oracle.Execute(sql);
            if (oRs.eof)
                api2.error(500, "Unknown equipment in input");
            oRs.Close();
        }
        else // moet er een res_deel zijn
        {
            api2.error(500, "Missing equipment in input");
        }
    },

    _validate_fields: function (dbfields, params, jsondata) /* valideer dbfields, alle constraints die niet door de database worden afgevangen */
    {
// testurl = http://uwva.5iwork/branch542/api2/reservations/3112748.json?pretty=1&logging=1&include=reservationequipment
    }

}
%>
