318 lines
15 KiB
C++
318 lines
15 KiB
C++
<% /*
|
||
$Revision$
|
||
$Id$
|
||
|
||
File: model_appointments.inc
|
||
|
||
Description: Afspraken model.
|
||
Parameters:
|
||
Context:
|
||
|
||
Notes:
|
||
*/
|
||
|
||
%>
|
||
<!-- #include file="../Shared/discxalg3d.inc"-->
|
||
<!-- #include file="../bez/bez.inc" -->
|
||
<!-- #include file="./model_visitors.inc" -->
|
||
<!-- #include file="./model_fac_tracking.inc"-->
|
||
<%
|
||
function afs_alg_onrgoed_keys(jsondata)
|
||
{
|
||
// TODO: key-check, auth check
|
||
var onrgoed_keys = null;
|
||
if (typeof jsondata.room == "undefined" && typeof jsondata.floor == "undefined" && typeof jsondata.building == "undefined")
|
||
{
|
||
if (jsondata.id && jsondata.id > 0)
|
||
{
|
||
var sql = "SELECT alg_onrgoed_keys"
|
||
+ " FROM bez_afspraak"
|
||
+ " WHERE bez_afspraak_key = " + jsondata.id;
|
||
var oRs = Oracle.Execute(sql);
|
||
if (!oRs.eof)
|
||
onrgoed_keys = oRs("alg_onrgoed_keys").Value;
|
||
oRs.Close();
|
||
}
|
||
return onrgoed_keys;
|
||
}
|
||
else
|
||
{
|
||
if (jsondata.room > 0)
|
||
return jsondata.room;
|
||
else if (jsondata.room && jsondata.room.id > 0)
|
||
return jsondata.room.id;
|
||
if (jsondata.floor > 0)
|
||
return jsondata.floor;
|
||
else if (jsondata.floor && jsondata.floor.id > 0)
|
||
return jsondata.floor.id;
|
||
if (jsondata.building > 0)
|
||
return jsondata.building;
|
||
else if (jsondata.building && jsondata.building.id > 0)
|
||
return jsondata.building.id;
|
||
return null;
|
||
}
|
||
};
|
||
|
||
function model_appointments()
|
||
{
|
||
this.module = "BEZ";
|
||
this.table = "bez_afspraak";
|
||
this.primary = "bez_afspraak_key";
|
||
this.records_name = "appointments";
|
||
this.record_name = "appointment";
|
||
this.fields =
|
||
{"id" : { dbs: "bez_afspraak_key", typ: "key", label: L("lcl_vis_appointment") },
|
||
"from" : { dbs: "bez_afspraak_datum", typ: "datetime", label: L("lcl_vis_start_date"), track: true},
|
||
"to" : { dbs: "bez_afspraak_eind", typ: "datetime", label: L("lcl_vis_end_date"), track: true },
|
||
"description": { dbs: "bez_afspraak_opmerking", typ: "varchar", label: L("lcl_remark"), track: true},
|
||
"action" : { dbs: "bez_actie_key", typ: "key", foreign: "bez_actie", label: L("lcl_action"), track: true},
|
||
"location" : { dbs: "alg_locatie_key", typ: "key", foreign: "alg_locatie"},
|
||
"_alg_keys" : { dbs: "alg_onrgoed_keys", typ: "key", fnval: afs_alg_onrgoed_keys },
|
||
"contact" : { dbs: "bez_afspraak_contact_key", typ: "key", foreign: "prs_perslid", label: L("lcl_vis_contactperson"), track: true},
|
||
"reservation": { dbs: "res_rsv_ruimte_key", typ: "key", foreign: "res_rsv_ruimte", label: L("lcl_reservation"), track: true},
|
||
"externnr" : { dbs: "bez_afspraak_externnr", typ: "varchar", label: L("extern_nr"), readonly: !(user.has("WEB_FACTAB") || user.has("WEB_FACXNR")) },
|
||
"externsyncdate": { dbs: "bez_afspraak_externsyncdate", typ: "datetime", label: L("extern_syncdate"), readonly: !(user.has("WEB_FACTAB") || user.has("WEB_FACXNR")) },
|
||
"order" : { dbs: "mld_opdr_key", typ: "key", foreign: "mld_opdr", label: L("lcl_mld_opdr"), track: true}
|
||
};
|
||
|
||
if (S("vis_afspraak_onrgoed_uses_keys"))
|
||
{
|
||
this.fields["building"] = { dbs: "alg_v_allonroerendgoed.alg_gebouw_key", typ: "key", foreign: "alg_gebouw" };
|
||
this.fields["floor"] = { dbs: "alg_v_allonroerendgoed.alg_verdieping_key", typ: "key", foreign: "alg_verdieping" };
|
||
this.fields["room"] = { dbs: "alg_v_allonroerendgoed.alg_ruimte_key", typ: "key", foreign: "alg_ruimte" };
|
||
}
|
||
else if (S("vis_mandatory_alg_level") != "L")
|
||
{
|
||
this.fields["room"] = { dbs: "bez_afspraak_ruimte", typ: "varchar", label: L("lcl_room"), track: true};
|
||
}
|
||
|
||
if (S("vis_afspraak_host_uses_keys") & 1)
|
||
{
|
||
this.fields["host"] = { dbs: "bez_afspraak_host_key", typ: "key", foreign: "prs_perslid", label: L("lcl_vis_visit"), track: true };
|
||
}
|
||
else
|
||
{
|
||
this.fields["host"] = { dbs: "bez_afspraak_gastheer", typ: "varchar", label: L("lcl_vis_visit"), track: true};
|
||
}
|
||
this.fields["phone"] = { dbs: "bez_afspraak_telefoonnr", typ: "varchar", label: L("lcl_phone"), track: true};
|
||
|
||
this.list = { columns: ["id", "from", "to"] },
|
||
this.includes =
|
||
{"visitors": { model: new model_visitors(),
|
||
joinfield: "appointment",
|
||
enable_update: true
|
||
},
|
||
"tracking": {
|
||
model: new model_tracking(['afspraak']),
|
||
joinfield: "trackingrefkey"
|
||
}
|
||
};
|
||
this.impersonate_auth = "WEB_BEZFOF";
|
||
this.REST_GET = function _GET(params)
|
||
{
|
||
var scope = params.filter.scope || "fe";
|
||
var autfunction = { fe : "WEB_BEZUSE", fo : "WEB_BEZFOF", bo : "WEB_BEZBOF", mi : "WEB_RESBAC" } [scope];
|
||
params.authparams = user.checkAutorisation(autfunction, null, null, true); // pessimistisch
|
||
|
||
var query = api2.sqlfields(params, this );
|
||
|
||
if (params.filter.id)
|
||
{
|
||
var this_bez = bez.func_enabled_afspraak(params.filter.id);
|
||
user.auth_required_or_abort(this_bez.canReadAny);
|
||
}
|
||
else if (scope == "fe")
|
||
{
|
||
query.wheres.push("(bez_afspraak_contact_key = " + user_key
|
||
+ " OR bez_afspraak_host_key = " + user_key + ")");
|
||
query.wheres.push("bez_afspraak_datum BETWEEN SYSDATE - " + S("facilitiespast_bez") + " AND SYSDATE + " + S("facilitiesfuture_bez"));
|
||
}
|
||
else // TODO: Add authorization
|
||
{
|
||
if (!params.filter.start_from && !params.filter.end_from && !params.filter.start_to && !params.filter.end_to)
|
||
query.wheres.push("bez_afspraak_datum >= TRUNC(SYSDATE)"); // afspraken van vandaag en komende dagen!
|
||
}
|
||
|
||
query.tables.push("alg_v_allonroerendgoed");
|
||
query.wheres.push("alg_v_allonroerendgoed.alg_onroerendgoed_keys(+) = bez_afspraak.alg_onrgoed_keys");
|
||
|
||
var wheres = api2.sqlfilter(params, this);
|
||
query.wheres = query.wheres.concat(wheres);
|
||
|
||
var sql = "SELECT " + query.selects.join(", ")
|
||
+ " FROM " + query.tables.join(", ")
|
||
+ " WHERE " + query.wheres.join(" AND " )
|
||
+ " ORDER BY bez_afspraak.bez_afspraak_key";
|
||
if (query.orderbys.length)
|
||
sql += ", " + query.orderbys.join(", ");
|
||
|
||
var json = api2.sql2json (params, sql, this );
|
||
|
||
return json;
|
||
};
|
||
|
||
this._validate_fields = function (dbfields, params, jsondata) /* valideer dbfields, alle constraints die niet door de database worden afgevangen */
|
||
{
|
||
// TODO: vis_fe_afspraak_limiet en vis_afspraak_limiet controleren
|
||
if (jsondata.from < new Date().midnight())
|
||
abort_with_warning(L("lcl_vis_error_date"));
|
||
if (jsondata.from >= jsondata.to)
|
||
abort_with_warning(L("lcl_vis_error_date"));
|
||
|
||
if ("action" in jsondata)
|
||
{
|
||
// TODO: mag hij? Of controleren we dat in _validate_fields
|
||
}
|
||
else
|
||
{
|
||
if (params.isNew)
|
||
{
|
||
var default_actie = null;
|
||
// Wat is de default actie of de alfabetisch eerste als er geen actie met default=1 aanwezig is.
|
||
var sqla = "SELECT bez_actie_key"
|
||
+ " , bez_actie_omschrijving"
|
||
+ " FROM bez_actie"
|
||
+ " WHERE bez_actie_verwijder IS NULL"
|
||
+ " AND bez_actie_groep_key = "
|
||
+ "( COALESCE( (SELECT g.bez_actie_groep_key"
|
||
+ " FROM alg_gebouw g"
|
||
+ " , alg_v_onroerendgoed o"
|
||
+ " WHERE g.alg_gebouw_key = o.alg_gebouw_key"
|
||
+ " AND o.alg_onroerendgoed_keys = " + (jsondata._alg_keys ? jsondata._alg_keys : -1)
|
||
+ " )"
|
||
+ " , (SELECT MIN(bez_actie_groep_key)"
|
||
+ " FROM bez_actie_groep"
|
||
+ " WHERE bez_actie_groep_default = 1"
|
||
+ " AND bez_actie_groep_verwijder IS NULL"
|
||
+ " )"
|
||
+ " , bez_actie_groep_key"
|
||
+ " )"
|
||
+ ")"
|
||
+ " ORDER BY bez_actie_default DESC NULLS LAST"
|
||
+ " , bez_actie_omschrijving";
|
||
|
||
var oRsa = Oracle.Execute(sqla);
|
||
if (!oRsa.eof)
|
||
default_actie = oRsa("bez_actie_key").Value;
|
||
oRsa.Close();
|
||
|
||
if (jsondata.reservation)
|
||
{
|
||
// De default actie van de reserveerbare ruimte gaat voor.
|
||
var sqlb = "SELECT COALESCE(a.bez_actie_key, " + (default_actie ? default_actie : "NULL") + ") actie"
|
||
+ " FROM res_rsv_ruimte r"
|
||
+ " , res_ruimte_opstelling o"
|
||
+ " , res_ruimte a"
|
||
+ " WHERE a.res_ruimte_key = o.res_ruimte_key"
|
||
+ " AND r.res_ruimte_opstel_key = o.res_ruimte_opstel_key"
|
||
+ " AND r.res_rsv_ruimte_key = " + jsondata.reservation;
|
||
var oRsb = Oracle.Execute(sqlb);
|
||
if (!oRsb.eof)
|
||
default_actie = oRsb("actie").Value;
|
||
oRsb.Close()
|
||
}
|
||
dbfields["action"] = { dbs: "bez_actie_key", typ: "key", val: default_actie };
|
||
}
|
||
}
|
||
|
||
// Zet ook de locatie als S("vis_afspraak_onrgoed_uses_keys")=1 en er onrgoed_keys zijn meegegeven.
|
||
if (S("vis_afspraak_onrgoed_uses_keys") == 1)
|
||
{
|
||
if (!jsondata.location)
|
||
{
|
||
var alg_key = -1;
|
||
if (jsondata.room)
|
||
alg_key = jsondata.room;
|
||
else if (jsondata.floor)
|
||
alg_key = jsondata.floor;
|
||
else if (jsondata.building)
|
||
alg_key = jsondata.building;
|
||
|
||
if (alg_key > 0) // anders niet meegegeven bij update en/of het is een appointment onder een reservering en er komt nog wel een follow_afspraak
|
||
{
|
||
var sql = "SELECT MAX(alg_locatie_key) loc_key"
|
||
+ " FROM alg_v_allonroerendgoed"
|
||
+ " WHERE alg_onroerendgoed_keys = " + alg_key;
|
||
var oRs = Oracle.Execute(sql);
|
||
if (!oRs.eof)
|
||
{
|
||
var loc_key = oRs("loc_key").Value;
|
||
dbfields["location"] = { dbs: "alg_locatie_key", typ: "key", foreign: "alg_locatie", val: loc_key};
|
||
jsondata.location = loc_key;
|
||
}
|
||
oRs.Close();
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
this.REST_PUT = function (params, jsondata, the_key) /* update appointment */
|
||
{
|
||
var dbfields = api2.update_fields(params, this, jsondata); // Build updater
|
||
this._validate_fields(dbfields, params, jsondata);
|
||
|
||
var this_bez = bez.func_enabled_afspraak(the_key);
|
||
user.auth_required_or_abort(this_bez.canChange);
|
||
|
||
// bezUpd heeft na afloop eventueel oldjsvals
|
||
var wheres = [" bez_afspraak_key = " + the_key];
|
||
var bezUpd = buildTrackingUpdate("bez_afspraak", wheres.join(" AND " ), dbfields, { noValidateToken: true });
|
||
Oracle.Execute(bezUpd.sql);
|
||
|
||
params.delayTracking = true;
|
||
var beztrack = api2.process_includes(params, this, jsondata, the_key);
|
||
var all_track = (bezUpd && bezUpd.trackarray ? bezUpd.trackarray : []);
|
||
all_track = all_track.concat(beztrack);
|
||
if (all_track.length)
|
||
{
|
||
bez.trackafspraakupdate(the_key, L("lcl_bez_is_bezupdtrack").format(the_key) + "\n" + all_track.join("\n"));
|
||
}
|
||
|
||
return { key: the_key };
|
||
};
|
||
|
||
this.REST_POST = function (params, jsondata) /* new appointment */
|
||
{
|
||
params.isNew = true; // negeer eventuele bestaande keys
|
||
|
||
var dbfields = api2.update_fields(params, this, jsondata); // Build updater
|
||
this._validate_fields(dbfields, params, jsondata);
|
||
|
||
dbfields["id"] = { dbs: "bez_afspraak_key", typ: "key", seq: "bez_s_bez_afspraak_key" };
|
||
dbfields["contact"] = { dbs: "bez_afspraak_contact_key", typ: "key", val: jsondata.contact || user_key };
|
||
// trigger doet de host eventueel wel
|
||
|
||
var bezIns = buildInsert("bez_afspraak", dbfields, { noValidateToken: true });
|
||
var afs_key = bezIns.sequences["bez_afspraak_key"];
|
||
|
||
var sql = "BEGIN "
|
||
+ bezIns.sql + ";"
|
||
// Afspraak/Bezoekers mee verplaatsen (ruimte, tijden) en eventueel de opmerking en flexkenmerken kopi<70>ren.
|
||
+ (jsondata.reservation > 0
|
||
? " res.follow_afspraak (" + jsondata.reservation + ", " + S("res_copy_to_bez") + "); "
|
||
: "")
|
||
+ "END;";
|
||
var err = Oracle.Execute(sql, true);
|
||
if (err.friendlyMsg)
|
||
abort_with_warning(err.friendlyMsg);
|
||
|
||
var beztrack = api2.process_includes(params, this, jsondata, afs_key);
|
||
|
||
shared.trackaction("BEZMUT", afs_key); // Er bestaat geen echte BEZNEW tracking
|
||
|
||
return { key: afs_key };
|
||
};
|
||
|
||
this.REST_DELETE = function (params, the_key) /* delete appointment */
|
||
{
|
||
var this_bez = bez.func_enabled_afspraak(the_key);
|
||
user.auth_required_or_abort(this_bez.canDelete);
|
||
|
||
var sql = "DELETE FROM bez_afspraak"
|
||
+ " WHERE bez_afspraak_key = " + the_key;
|
||
Oracle.Execute(sql);
|
||
|
||
// Geen tracking (mogelijk) omdat het record echt is verwijderd
|
||
};
|
||
}
|
||
%> |