1444 lines
74 KiB
C++
1444 lines
74 KiB
C++
<%
|
|
/*
|
|
$Revision$
|
|
$Id$
|
|
|
|
File: res.inc
|
|
Description: res ondersteunende functies
|
|
Context:
|
|
Note:
|
|
*/
|
|
if (!this.JSON_Result)
|
|
FCLTHeader.Requires({css: ["../res/res.css"] });
|
|
|
|
res = {
|
|
// sterke relatie met z:\Project\Sm44\VSSSRC\SQL\RES\RES_PAC.SRC
|
|
// merk op dat niet alle leveld gebruikt/ ondersteund worden
|
|
dirtlevel:
|
|
{
|
|
ruimte:
|
|
{
|
|
clean:0,
|
|
//licht
|
|
//middel
|
|
nocatering : 0x010, // 0b000100000000, // Niets zinvols (onder een CV)
|
|
//zwaar
|
|
noroom : 0x100, // 0b000100000000, // Geen alg_ruimte/opstel_key ingevuld
|
|
notavailable : 0x200 // 0b001000000000 // Niet beschikbaar op gekozen tijdstip
|
|
},
|
|
artikel:
|
|
{
|
|
clean:0,
|
|
//licht
|
|
//middel
|
|
timechanged : 0x000000010000, // Parent gewijzigd en wij mee gewijzigd
|
|
timenotchanged: 0x000000100000, // Parent gewijzigd maar wij niet mee gewijzigd
|
|
//zwaar
|
|
notallowed : 0x100 // Niet toegestaan in deze ruimte
|
|
},
|
|
deel:
|
|
{
|
|
clean:0,
|
|
//licht
|
|
//middel
|
|
timechanged : 0x000000010000, // Parent gewijzigd en wij mee gewijzigd
|
|
timenotchanged: 0x000000100000, // Parent gewijzigd maar wij niet mee gewijzigd
|
|
//zwaar
|
|
notallowed : 0x100, // Niet toegestaan in deze ruimte
|
|
notavailable : 0x200 // Niet beschikbaar op tijdstip
|
|
}
|
|
},
|
|
|
|
// Verwijder de afspraak die eventueel gekoppeld was aan rsv_ruimte_key
|
|
// (JGL: Eigenlijk moet dit gewoon cascading door een trigger gebeuren)
|
|
DeleteResAfspraak: function DeleteResAfspraak (rsv_ruimte_key)
|
|
{
|
|
var sql;
|
|
var oRs;
|
|
// delete parkeerplaatsen gebeurt wel met behulp van CASCADE (bez_bezoekers)
|
|
|
|
// delete bezoekers
|
|
var sql = "DELETE FROM bez_bezoekers"
|
|
+ " WHERE bez_afspraak_key in "
|
|
+ " (SELECT ba.bez_afspraak_key"
|
|
+ " FROM bez_afspraak ba"
|
|
+ " WHERE ba.res_rsv_ruimte_key = " + rsv_ruimte_key + ")";
|
|
Oracle.Execute( sql );
|
|
|
|
// delete afspraak
|
|
sql = "DELETE FROM bez_afspraak"
|
|
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
|
|
Oracle.Execute( sql );
|
|
},
|
|
|
|
trackreserveringupdate:
|
|
// Let op: dit moet wellicht niet altijd (aangeroepen na save)
|
|
function (rsv_ruimte_key, ptxt)
|
|
{
|
|
if (ptxt)
|
|
shared.trackaction("RESUPD", rsv_ruimte_key, ptxt);
|
|
else
|
|
shared.trackaction("RESUPD", rsv_ruimte_key);
|
|
},
|
|
|
|
trackobject:
|
|
function (deel_key, actie)
|
|
{
|
|
sql = "SELECT " + lcl.xsqla('rd.res_deel_omschrijving', 'rd.res_deel_key')
|
|
+ " FROM res_deel rd"
|
|
+ " WHERE rd.res_deel_key = " + deel_key;
|
|
oRs = Oracle.Execute(sql);
|
|
var obj_oms = oRs("res_deel_omschrijving").value;
|
|
var track = "";
|
|
switch (actie)
|
|
{
|
|
case "delete": track = L("lcl_res_insdelete") + ": " + obj_oms;
|
|
break;
|
|
case "insert": track = L("lcl_res_insinsert") + ": " + obj_oms;
|
|
break;
|
|
}
|
|
return track;
|
|
},
|
|
|
|
trackartikel:
|
|
function (artikel_key, actie, params)
|
|
{
|
|
sql = "SELECT ra.res_artikel_omschrijving"
|
|
+ " FROM res_artikel ra"
|
|
+ " WHERE ra.res_artikel_key = " + artikel_key;
|
|
oRs = Oracle.Execute(sql);
|
|
var art_oms = oRs("res_artikel_omschrijving").value;
|
|
var track = "";
|
|
switch (actie)
|
|
{
|
|
case "delete": track = L("lcl_res_artdelete") + ": " + art_oms;
|
|
break;
|
|
case "insert": track = L("lcl_res_artinsert") + ": " + art_oms;
|
|
break;
|
|
case "update": track = L("lcl_res_artupdate") + ": " + art_oms
|
|
+ (params.old_number != params.new_number
|
|
? "\n" + buildTrackText("integer", params.old_number, params.new_number, { nodiff: true })
|
|
: "")
|
|
+ (params.old_price != params.new_price
|
|
? "\n" + buildTrackText("float", params.old_price, params.new_price, { nodiff: true })
|
|
: "")
|
|
+ (params.old_date.getTime() != params.new_date.getTime()
|
|
? "\n" + buildTrackText("datetime", params.old_date, params.new_date, { nodiff: true })
|
|
: "");
|
|
break;
|
|
}
|
|
return track;
|
|
},
|
|
|
|
res_set_dialect:
|
|
function (rsv_ruimte_key)
|
|
{
|
|
var sql = "SELECT ra.res_srtactiviteit_key"
|
|
+ " FROM res_rsv_ruimte rrr, "
|
|
+ " res_activiteit ra"
|
|
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key
|
|
+ " AND rrr.res_activiteit_key = ra.res_activiteit_key";
|
|
var oRs = Oracle.Execute(sql);
|
|
lcl.set_dialect(oRs("res_srtactiviteit_key").Value, "RES_SRTACTIVITEIT_KEY");
|
|
oRs.Close();
|
|
},
|
|
|
|
res_ruimte_info: function _res_ruimte(res_ruimte_key)
|
|
{
|
|
var result = { res_ruimte_key: res_ruimte_key,
|
|
RoomConfigs: [],
|
|
default_opstel_key : -1 };
|
|
|
|
var sql = "SELECT " + lcl.xsqla('rr.res_ruimte_nr', 'rr.res_ruimte_key')
|
|
+ " , " + lcl.xsqla('rr.res_ruimte_omschrijving', 'rr.res_ruimte_key')
|
|
+ " , res_ruimte_image"
|
|
+ " , ac.res_activiteit_aantalverplicht"
|
|
+ " , res_disc_params_kosten"
|
|
+ " , ins_discipline_kpnverplicht"
|
|
+ " , COALESCE(res_ruimte_begintijd, " + S("res_t1") + ") begintijd"
|
|
+ " , COALESCE(res_ruimte_eindtijd, " + S("res_t2") + ") eindtijd"
|
|
+ " , rr.res_discipline_key"
|
|
+ " FROM res_ruimte rr"
|
|
+ " , res_disc_params rdp"
|
|
+ " , res_discipline rd"
|
|
+ " , res_activiteitdiscipline ad"
|
|
+ " , res_activiteit ac"
|
|
+ " WHERE rr.res_ruimte_key = " + res_ruimte_key
|
|
+ " AND rr.res_discipline_key = rd.ins_discipline_key "
|
|
+ " AND rr.res_discipline_key = rdp.res_ins_discipline_key"
|
|
+ " AND rd.ins_discipline_key = ad.res_discipline_key"
|
|
+ " AND ad.res_activiteit_key = ac.res_activiteit_key"
|
|
|
|
var oRs = Oracle.Execute(sql);
|
|
if (!oRs.eof)
|
|
{
|
|
result.ruimte_nr = oRs("res_ruimte_nr").Value,
|
|
result.ruimte_omschrijving = oRs("res_ruimte_omschrijving").Value,
|
|
result.aantalreq = oRs("res_activiteit_aantalverplicht").Value;
|
|
if (oRs("res_ruimte_image").Value)
|
|
result.imagePath = S("res_image_path") + oRs("res_ruimte_image").Value;
|
|
result.kosten = oRs("res_disc_params_kosten").Value;
|
|
result.kpnverplicht = oRs("ins_discipline_kpnverplicht").Value;
|
|
result.discipline_key = oRs("res_discipline_key").Value;
|
|
result.begintijd = oRs("begintijd").Value;
|
|
result.eindtijd = oRs("eindtijd").Value;
|
|
if (result.begintijd < S("res_t1")) result.begintijd = S("res_t1");
|
|
if (result.eindtijd > S("res_t2")) result.eindtijd = S("res_t2");
|
|
if (result.begintijd > result.eindtijd) result.begintijd = result.eindtijd;
|
|
}
|
|
var sql = "SELECT res_ruimte_opstel_key"
|
|
+ " , res_ruimte_opstel_bezoekers"
|
|
+ " , res_ruimte_opstel_default"
|
|
+ " , ro.res_opstelling_key"
|
|
+ " , res_ruimte_opstel_image"
|
|
+ " , " + lcl.xsqla('res_opstelling_omschrijving','ro.res_opstelling_key')
|
|
+ " FROM res_ruimte rr"
|
|
+ " , res_ruimte_opstelling rro"
|
|
+ " , res_opstelling ro"
|
|
+ " WHERE rr.res_ruimte_key = " + res_ruimte_key
|
|
+ " AND rr.res_ruimte_key = rro.res_ruimte_key"
|
|
+ " AND rro.res_opstelling_key = ro.res_opstelling_key"
|
|
+ " ORDER BY res_opstelling_volgnr";
|
|
var oRs = Oracle.Execute(sql);
|
|
|
|
while (!oRs.eof)
|
|
{
|
|
var rc = { ruimte_opstel_key: oRs("res_ruimte_opstel_key").Value,
|
|
opstelling_omschrijving: oRs("res_opstelling_omschrijving").Value,
|
|
opstelling_key: oRs("res_opstelling_key").Value,
|
|
bezoekers: oRs("res_ruimte_opstel_bezoekers").Value }
|
|
if (oRs("res_ruimte_opstel_image").Value)
|
|
rc.imagePath = S("res_image_path") + oRs("res_ruimte_opstel_image").Value;
|
|
result.RoomConfigs.push(rc);
|
|
if (oRs("res_ruimte_opstel_default").Value)
|
|
result.default_opstel_key = oRs("res_ruimte_opstel_key").Value;
|
|
oRs.MoveNext();
|
|
}
|
|
oRs.close();
|
|
|
|
return result;
|
|
},
|
|
|
|
res_voorzieningen_info: function _res_voorzieningen_info(rsv_ruimte_key)
|
|
{
|
|
var result = {};
|
|
|
|
// TODO: In de toekomst algemene voorzieningen gegevens ophalen indien ze nodig zijn.
|
|
// Nu hebben we alleen de verplichtheid van de kostenplaats nog nodig.
|
|
if (!result.kpnverplicht)
|
|
{ // Is de kostenplaats verplicht via de voorzieningen en/of verbruiksartikelen.
|
|
sql = "SELECT MAX(kpnverplicht) kpnverplicht"
|
|
+ " FROM (SELECT MAX(rd.ins_discipline_kpnverplicht) kpnverplicht"
|
|
+ " FROM res_rsv_artikel ra"
|
|
+ " , res_rsv_ruimte rr"
|
|
+ " , res_artikel a"
|
|
+ " , res_discipline rd"
|
|
+ " WHERE ra.res_rsv_ruimte_key = rr.res_rsv_ruimte_key"
|
|
+ " AND ra.res_artikel_key = a.res_artikel_key"
|
|
+ " AND a.res_discipline_key = rd.ins_discipline_key"
|
|
+ " AND ra.res_rsv_artikel_verwijder IS NULL"
|
|
+ " AND rr.res_rsv_ruimte_key = " + rsv_ruimte_key
|
|
+ " UNION"
|
|
+ " SELECT MAX (dis.ins_discipline_kpnverplicht) kpnverplicht"
|
|
+ " FROM res_rsv_deel rd"
|
|
+ " , res_rsv_ruimte rr"
|
|
+ " , res_deel d"
|
|
+ " , res_discipline dis"
|
|
+ " WHERE rd.res_rsv_ruimte_key = rr.res_rsv_ruimte_key"
|
|
+ " AND rd.res_deel_key = d.res_deel_key"
|
|
+ " AND d.res_discipline_key = dis.ins_discipline_key"
|
|
+ " AND rd.res_rsv_deel_verwijder IS NULL"
|
|
+ " AND rr.res_rsv_ruimte_key = " + rsv_ruimte_key + ")";
|
|
oRs = Oracle.Execute(sql);
|
|
if (!oRs.eof)
|
|
result.kpnverplicht = oRs("kpnverplicht").Value;
|
|
}
|
|
|
|
return result;
|
|
},
|
|
|
|
// Als een datum voor (discipline_expire(disc_key) ligt dan is hij 'te vroeg'
|
|
discipline_expire: function _discipline_expire(discipline_key, mode)
|
|
{
|
|
// Mode 0 = Use expire dagen (res_disc_params_expire_dagen)
|
|
// 1 = Use cancel dagen (res_disc_params_cancel_dagen)
|
|
// res_disc_params_expire_tijd wordt duaal gebruikt. Rol A: kloktijd en rol B: na wanneer moet levertijd zijn
|
|
// als res_disc_params_expire_tijd (A) nog niet verstreken:
|
|
// dagen = 0 ==> levertijd voorziening moet na res_disc_params_expire_tijd (B) liggen
|
|
// dagen > 0 ==> levertijd voorziening moet morgenvroeg/overmorgenvroeg etc. (wel altijd na S("res_cat_t1")) liggen
|
|
// anders als res_disc_params_expire_tijd (A) wel verstreken:
|
|
// dagen = 0 ==> levertijd voorziening moet morgenvroeg na S("res_cat_t1") liggen
|
|
// dagen > 0 ==> levertijd voorziening moet overmorgen etc. na S("res_cat_t1") liggen
|
|
// (Als het model nog verder uitgewerkt zou worden zou je voor (B) een apart tijdstip hebben,
|
|
// bijvoorbeeld 12:00h voor lunchpakketten of: 2 uur, altijd minimaal twee uren van tevoren)
|
|
// Effectief is 00:15h en 0 dag gelijk aan 23:45 en 1 dag
|
|
|
|
// dagen expire_tijd hetisnu resultaat (veronderstel cat_t1 8:00)
|
|
// --------------------------------------------------------------------------------------
|
|
// -1 nvt nvt vandaag middernacht Effectief: je mag zelfs *nu*
|
|
|
|
// 0 10.00 9:00 vandaag 10:00 \ Effectief: lunchpakketen Akzo
|
|
// 0 10.00 11:00 morgen 8:00 /
|
|
// 1 16.00 15:00 morgen 8:00 \ Effectief: voor 16:00h morgen nog
|
|
// 1 16.00 17:00 overmorgen 8:00 / anders overmorgen
|
|
|
|
// 0 00.25 9:00 morgen 8:00 \ Effectief: morgen mag altijd
|
|
// 0 00.25 11:00 morgen 8:00 /
|
|
// 1 00.25 9:00 overmorgen 8:00 \ Effectief: overmorgen mag altijd
|
|
// 1 00.25 11:00 overmorgen 8:00 /
|
|
|
|
// 23.75 is nooit nodig?
|
|
// 0 23.75 9:00 unsupported (vandaag 23.75)
|
|
// 0 23.75 11:00 unsupported (vandaag 23.75)
|
|
// 1 23.75 9:00 morgen 8:00 \ Effectief: morgen mag altijd
|
|
// 1 23.75 11:00 morgen 8:00 /
|
|
|
|
// 0 leeg 9:00 vandaag 9:00 (nu) \ Effectief: je mag altijd nog *in de toekomst*
|
|
// 0 leeg 11:00 vandaag 11:00 (nu) /
|
|
// 1 leeg 9:00 morgen 9:00 \ Effectief: over exact 24 uur
|
|
// 1 leeg 16:00 morgen 16:00 /
|
|
var sql = "SELECT fac.DatumTijdPlusUitvoerTijd(SYSDATE, COALESCE(" + (mode == 1? "res_disc_params_cancel_dagen" : "res_disc_params_expire_dagen") + ", 1), 'DAGEN') datum,"
|
|
+ " res_disc_params_expire_tijd,"
|
|
+ " COALESCE(" + (mode == 1? "res_disc_params_cancel_dagen" : "res_disc_params_expire_dagen") + ", 1) dagen,"
|
|
+ " ins_discipline_min_level"
|
|
+ " FROM res_disc_params rdp, res_discipline rd"
|
|
+ " WHERE rdp.res_ins_discipline_key = rd.ins_discipline_key"
|
|
+ " AND rd.ins_discipline_key = " + discipline_key;
|
|
var oRs = Oracle.Execute(sql);
|
|
if (oRs("dagen").Value < 0)
|
|
{
|
|
oRs.Close();
|
|
return (new Date).midnight();
|
|
}
|
|
var restype = oRs("ins_discipline_min_level").Value == 3? "R" : "CV";
|
|
|
|
var exp_time = oRs("res_disc_params_expire_tijd").Value;
|
|
var exp_datum = new Date(oRs("datum").Value);
|
|
if (exp_time)
|
|
{
|
|
var now = (new Date).getFloatHours();
|
|
if (now > exp_time) // (exp_time rol A)
|
|
{ // grens-tijdstip verstreken. Skip een dag later naar "8 uur 's ochtends"
|
|
exp_datum.setDate(exp_datum.getDate()+1);
|
|
exp_datum = exp_datum.setFloatHours((restype == "CV" && S("res_cat_t1") >= 0)? S("res_cat_t1") : S("res_t1"));
|
|
}
|
|
else // grens-tijdstip nog niet vertreken.
|
|
{
|
|
if (oRs("dagen").Value == 0) // we blijven vandaag
|
|
exp_datum = exp_datum.setFloatHours(exp_time); // (exp_time rol B)
|
|
else
|
|
exp_datum = exp_datum.setFloatHours((restype=="CV"&&S("res_cat_t1")>=0)?S("res_cat_t1"):S("res_t1"));
|
|
}
|
|
}
|
|
if (exp_datum < new Date)
|
|
exp_datum = new Date;
|
|
oRs.Close();
|
|
__Log("discipline_expire(" + discipline_key + "): " + toDateTimeString(exp_datum) + ", mode: " + mode);
|
|
return exp_datum;
|
|
},
|
|
|
|
keepFlexDocuments:
|
|
function(res_key, old_act_key, act_key)
|
|
{
|
|
/* Match de srtkenmerk_key-s van de oude en nieuwe mld_stdmelding */
|
|
if (old_act_key != act_key)
|
|
{
|
|
__Log("Old res_activiteit_key: " + old_act_key + " New: " + act_key);
|
|
var flexsql = "SELECT k_old.res_kenmerk_key k_old"
|
|
+ " , k_new.res_kenmerk_key k_new"
|
|
+ " FROM res_srtkenmerk t"
|
|
+ " , res_kenmerk k_old"
|
|
+ " , res_kenmerk k_new"
|
|
+ " , res_activiteit s_old"
|
|
+ " , res_activiteit s_new"
|
|
+ " WHERE s_old.res_activiteit_key = " + old_act_key
|
|
+ " AND s_new.res_activiteit_key = " + act_key
|
|
+ " AND k_old.res_activiteit_key = s_old.res_activiteit_key"
|
|
+ " AND k_new.res_activiteit_key = s_new.res_activiteit_key"
|
|
+ " AND k_old.res_kenmerk_verwijder IS NULL"
|
|
+ " AND k_new.res_kenmerk_verwijder IS NULL"
|
|
+ " AND k_old.res_srtkenmerk_key = t.res_srtkenmerk_key"
|
|
+ " AND k_new.res_srtkenmerk_key = t.res_srtkenmerk_key"
|
|
+ " AND t.res_srtkenmerk_verwijder IS NULL";
|
|
|
|
var subfolder = "RES/" + subfolderKey("R", res_key)
|
|
RenameFlexFolders(subfolder, flexsql);
|
|
}
|
|
},
|
|
|
|
getfostatustext:
|
|
function (p) {
|
|
var statustekst = "??";
|
|
var s = parseInt(p, 10);
|
|
// pseudo status_key -1 kan worden gebruikt om dirty te signaleren
|
|
switch (s) {
|
|
case 1: { statustekst = L("lcl_optie"); break; }
|
|
case 2: { statustekst = L("lcl_def"); break; }
|
|
case 3: { statustekst = L("lcl_blokkade"); break; }
|
|
case 4: { statustekst = L("lcl_vervallen"); break; }
|
|
case -1: { statustekst = L("lcl_res_status_dirty"); break; }
|
|
}
|
|
return statustekst;
|
|
},
|
|
|
|
getbostatustext:
|
|
function (p) {
|
|
var statustekst = "??";
|
|
var s = parseInt(p, 10);
|
|
switch (s) {
|
|
case 2: { statustekst = L("lcl_res_resnew"); break; }
|
|
case 5: { statustekst = L("lcl_res_resafm"); break; }
|
|
case 6: { statustekst = L("lcl_res_resver"); break; }
|
|
}
|
|
return statustekst;
|
|
},
|
|
|
|
|
|
// Controleert/bepaalt de rechten op het 'Algemeen' blok bij een (deel)reservering
|
|
// Altijd worden de disciplines van de catering/voorziening bekeken
|
|
// Voor restype=="R" wordt ook de discipline van de RES_RUIMTE bekeken
|
|
// We kijken pessimistisch: je moet rechten hebben voor alle disciplines
|
|
// Optioneel pdisc_key: controleer alleen voor deze discipline
|
|
func_enabled: function res_func_enabled(rsv_ruimte_key, pdisc_key)
|
|
{
|
|
// Wat informatie om rechten te kunnen bepalen
|
|
var sql = "SELECT r.res_ruimte_opstel_key,"
|
|
+ " r.alg_ruimte_key,"
|
|
+ " r.res_rsv_ruimte_van,"
|
|
+ " r.res_rsv_ruimte_contact_key,"
|
|
+ " r.res_rsv_ruimte_host_key,"
|
|
+ " r.res_status_fo_key,"
|
|
+ " r.res_status_bo_key,"
|
|
+ " r.res_reservering_key,"
|
|
+ " r.res_rsv_ruimte_verwijder"
|
|
+ " FROM res_rsv_ruimte r "
|
|
+ " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
|
|
var roRs = Oracle.Execute(sql);
|
|
|
|
var rsv_ruimte_verwijder = roRs("res_rsv_ruimte_verwijder").Value;
|
|
var res_reservering_key = roRs("res_reservering_key").Value;
|
|
var alg_ruimte_key = roRs("alg_ruimte_key").Value;
|
|
var status_fo_key = roRs("res_status_fo_key").Value;
|
|
var status_bo_key = roRs("res_status_bo_key").Value;
|
|
var rsv_ruimte_van = new Date(roRs("res_rsv_ruimte_van").Value);
|
|
var rsv_ruimte_contact_key = roRs("res_rsv_ruimte_contact_key").Value;
|
|
var rsv_ruimte_host_key = roRs("res_rsv_ruimte_host_key").Value;
|
|
|
|
// Bepaal discipline parkeerplaatsen voor reserveringen. Deze moet uitgesloten worden voor de autorisatie controle.
|
|
// Als de reservering *voor* earliest_expire ligt gaan we moeilijk doen
|
|
var earliest_expire_change = new Date(1000,1,1); // Wijzigingshorizon
|
|
var earliest_expire_cancel = new Date(1000,1,1); // Annuleringshorizon
|
|
var max_dbkosten = 0; // Maximale doorberekeningskosten van alle disciplines binnen een reservering;
|
|
var canWritePresentPrk = true; // Kan ik de parkeerplaatsen die AANWEZIG zijn zien en wijzigen.
|
|
if (typeof pdisc_key != "undefined") // alleen pdisc, ongeacht of je hem al had
|
|
{
|
|
disc_key_arr = [pdisc_key];
|
|
var expire = res.discipline_expire(pdisc_key, 0);
|
|
if (expire > earliest_expire_change) earliest_expire_change = expire;
|
|
var expire_cancel = res.discipline_expire(pdisc_key, 1);
|
|
if (expire_cancel > earliest_expire_cancel) earliest_expire_cancel = expire_cancel;
|
|
if (rsv_ruimte_van < expire_cancel)
|
|
{ // Doorberekeningskosten van de meegegeven discipline
|
|
var sql = "SELECT rdp.res_disc_params_kosten"
|
|
+ " FROM res_disc_params rdp"
|
|
+ " WHERE rdp.res_ins_discipline_key = " + pdisc_key;
|
|
var oRs1 = Oracle.Execute(sql);
|
|
max_dbkosten = oRs1("res_disc_params_kosten").value;
|
|
oRs1.Close();
|
|
}
|
|
}
|
|
else // alle disciplines die je al had
|
|
{ // Bepaal alle CV disciplines waar we iets van hebben
|
|
var discs = "SELECT DISTINCT ra.res_discipline_key"
|
|
+ " , res_disc_params_kosten"
|
|
+ " FROM res_rsv_artikel rra"
|
|
+ " , res_artikel ra"
|
|
+ " , res_disc_params rdp"
|
|
+ " WHERE rra.res_artikel_key = ra.res_artikel_key"
|
|
+ " AND ra.res_discipline_key = rdp.res_ins_discipline_key"
|
|
+ " AND rra.res_rsv_ruimte_key = " + rsv_ruimte_key
|
|
+ " UNION " // geen dubbelen nodig
|
|
+ "SELECT res_discipline_key"
|
|
+ " , 0" // Voor voorziening reserveringen met alleen reserveerbare objecten zijn de kosten altijd 0 en wordt niets doorberekend. Kostendoorberekening alleen voor ruimten en catering.
|
|
+ " FROM res_deel rd, res_rsv_deel rrd"
|
|
+ " WHERE rd.res_deel_key = rrd.res_deel_key"
|
|
+ " AND rrd.res_rsv_ruimte_key = " + rsv_ruimte_key;
|
|
var oRs = Oracle.Execute(discs);
|
|
disc_key_arr = [];
|
|
|
|
while (!oRs.eof)
|
|
{
|
|
var expire = res.discipline_expire(oRs("res_discipline_key").Value, 0);
|
|
if (expire > earliest_expire_change) earliest_expire_change = expire;
|
|
var expire_cancel = res.discipline_expire(oRs("res_discipline_key").value, 1);
|
|
if (expire_cancel > earliest_expire_cancel) earliest_expire_cancel = expire_cancel;
|
|
if ((rsv_ruimte_van < expire_cancel) && (max_dbkosten < oRs("res_disc_params_kosten").value))
|
|
{ // Annuleringshorizon is verstreken en doorberekeningskosten zijn hoger dan die ik al heb (gevonden)
|
|
max_dbkosten = oRs("res_disc_params_kosten").value;
|
|
}
|
|
if (oRs("res_discipline_key").Value != S("vis_parking_key"))
|
|
// Dicipline toevoegen
|
|
disc_key_arr.push(oRs("res_discipline_key").Value);
|
|
else
|
|
{ // Er is een parkeerplaats gereserveerd die ik niet moet toevoegen.
|
|
// Heb ik lees en wijzig rechten op "WEB_BEZPRK" (Kan ik parkeerplaatsen zien en reserveren).
|
|
var bresult = user.func_enabled("BEZ",
|
|
-1, // discipline key
|
|
-1, // alg_key
|
|
user_key,
|
|
false, // pessimist
|
|
false); // isOptional
|
|
|
|
// Kan ik de aanwezige parkeerplaatsen zien en reserveren (Alleen als parkeerplaatsen aanwezig zijn kan canWritePresentPrk false worden).
|
|
canWritePresentPrk = bresult.canRead("WEB_BEZPRK") && bresult.canWrite("WEB_BEZPRK")
|
|
}
|
|
oRs.MoveNext();
|
|
}
|
|
oRs.Close();
|
|
}
|
|
|
|
if (alg_ruimte_key == null && typeof pdisc_key == "undefined")
|
|
{ // "R" reservering, bepaal *ook* discipline van de ruimte en alg_ruimte_key
|
|
var sql = "SELECT MIN (alg_ruimte_key) alg_ruimte_key,"
|
|
+ " rr.res_discipline_key"
|
|
+ " , rdp.res_disc_params_kosten"
|
|
+ " FROM res_ruimte_opstelling rro"
|
|
+ " , res_ruimte rr"
|
|
+ " , res_alg_ruimte rar"
|
|
+ " , res_disc_params rdp"
|
|
+ " WHERE rar.res_ruimte_key = rr.res_ruimte_key "
|
|
+ " AND rr.res_ruimte_key = rro.res_ruimte_key "
|
|
+ " AND rr.res_discipline_key = rdp.res_ins_discipline_key"
|
|
+ " AND rro.res_ruimte_opstel_key = " + roRs("res_ruimte_opstel_key").Value;
|
|
var sqlG =" GROUP BY res_discipline_key"
|
|
+ " , rdp.res_disc_params_kosten";
|
|
var oRs = Oracle.Execute( sql + " AND res_alg_ruimte_verwijder IS NULL" + sqlG );
|
|
if (oRs.Eof) // Voor als *alle* onderliggende res_rsv_ruimte verwijderd
|
|
var oRs = Oracle.Execute( sql + sqlG );
|
|
var expire = res.discipline_expire(oRs("res_discipline_key").Value, 0);
|
|
if (expire > earliest_expire_change) earliest_expire_change = expire;
|
|
var expire_cancel = res.discipline_expire(oRs("res_discipline_key").value, 1);
|
|
if (expire_cancel > earliest_expire_cancel) earliest_expire_cancel = expire_cancel;
|
|
if ((rsv_ruimte_van < expire_cancel) && (max_dbkosten < oRs("res_disc_params_kosten").value))
|
|
{ // Annuleringshorizon is verstreken en doorberekeningskosten zijn hoger dan die ik al heb (gevonden)
|
|
max_dbkosten = oRs("res_disc_params_kosten").value;
|
|
}
|
|
disc_key_arr.push(oRs("res_discipline_key").Value);
|
|
alg_ruimte_key = oRs("alg_ruimte_key").Value;
|
|
oRs.Close();
|
|
}
|
|
|
|
var rresult = user.func_enabled("RES",
|
|
disc_key_arr.join(","),
|
|
alg_ruimte_key,
|
|
roRs("res_rsv_ruimte_contact_key").Value);
|
|
roRs.Close();
|
|
rresult.earliest_expire_change = earliest_expire_change;
|
|
rresult.earliest_expire_cancel = earliest_expire_cancel;
|
|
rresult.max_dbkosten = max_dbkosten;
|
|
rresult.res_reservering_key = res_reservering_key;
|
|
rresult.rsv_ruimte_verwijder = rsv_ruimte_verwijder;
|
|
|
|
rresult.canReadNoShow = rresult.canRead("WEB_RESNOS");
|
|
rresult.canWriteNoShow = rresult.canWrite("WEB_RESNOS");
|
|
|
|
// -- CONTROLE LEESRECHTEN --
|
|
// als disc_key_arr leeg is hebben we nog 'niets' en zijn we heel soepel
|
|
rresult.canReadAny = !disc_key_arr.length||
|
|
rresult.canRead("WEB_RESBAC") ||
|
|
rresult.canRead("WEB_RESFOF") ||
|
|
rresult.canRead("WEB_RESBOF") ||
|
|
rresult.canRead("WEB_RESUSE");
|
|
|
|
// (als alleen) Frontend-rechten-->we controleren nog strenger
|
|
rresult.canReadFEOnly = false;
|
|
if ( rresult.canReadAny
|
|
&& !rresult.canRead("WEB_RESBAC")
|
|
&& !rresult.canRead("WEB_RESFOF")
|
|
&& !rresult.canRead("WEB_RESBOF")
|
|
)
|
|
{ // frontend controles
|
|
rresult.canReadFEOnly = true;
|
|
if ( rsv_ruimte_contact_key != user_key
|
|
&& rsv_ruimte_host_key != user_key
|
|
&& !user.isCollega(rsv_ruimte_contact_key)
|
|
&& !user.isCollega(rsv_ruimte_host_key))
|
|
{
|
|
rresult.canReadAny = false;// JGL: Kan dit nog legaal gebeuren?
|
|
}
|
|
}
|
|
|
|
rresult.canReadFO = rresult.canRead("WEB_RESFOF");
|
|
rresult.canReadBO = rresult.canRead("WEB_RESBOF");
|
|
|
|
// -- CONTROLE SCHRIJFRECHTEN --
|
|
// Je moet tenminste schrijfrechten hebben
|
|
rresult.canChange = rresult.canReadAny &&
|
|
(rresult.canWrite("WEB_RESFOF") ||
|
|
rresult.canWrite("WEB_RESBOF") ||
|
|
rresult.canWrite("WEB_RESUSE")) &&
|
|
canWritePresentPrk;
|
|
// als disc_key_arr leeg is hebben we nog 'niets' en zijn we heel soepel
|
|
rresult.canChange |= !disc_key_arr.length;
|
|
rresult.canChangeUrole = (typeof urole == "undefined" ? "" : urole); // (mld_close kent deze niet, en change-t ook niet interactief)
|
|
|
|
if (rresult.canChange && rresult.canChangeUrole == "mi") // mi kan zeker niet wijzigen
|
|
{
|
|
if (rresult.canWrite("WEB_RESFOF"))
|
|
rresult.canChangeUrole = "fo";
|
|
else if (rresult.canWrite("WEB_RESBOF"))
|
|
rresult.canChangeUrole = "bo";
|
|
else
|
|
rresult.canChangeUrole = "fe";
|
|
}
|
|
|
|
if (!rresult.canChange)
|
|
rresult.readoReason = L("lcl_res_reado_parts"); // geen schrijfrechten op alle onderdelen
|
|
|
|
// Had ik deze kunnen aanmaken? Dan mag hij als bron van multi's dienen
|
|
rresult.couldCreate = rresult.canChange;
|
|
|
|
// Reserveringen met openstaande meldingen kunnen niet worden verwijderd.
|
|
var openstaandemld = false;
|
|
if (S("res_with_mld") == 1)
|
|
{ // Er zijn meldingen bij een reservering mogelijk
|
|
var sql = "SELECT m.mld_melding_key"
|
|
+ " FROM mld_melding m"
|
|
+ " WHERE mld_melding_status IN (0, 2, 3, 4, 7)" // Openstaande melding
|
|
+ " AND m.res_rsv_ruimte_key = " + rsv_ruimte_key;
|
|
var oRs = Oracle.Execute(sql);
|
|
if (!oRs.eof) // Er is nog een openstaande melding
|
|
openstaandemld = true;
|
|
oRs.Close();
|
|
}
|
|
rresult.canDelete = rresult.canChange && !openstaandemld; // Dan kun je ook alles er afhalen tenslotte met hetzelfde effect
|
|
|
|
rresult.canChangeFEOnly = false;
|
|
// (als alleen) Frontend-rechten-->we controleren nog strenger
|
|
if ( rresult.canChange
|
|
&& !rresult.canWrite("WEB_RESFOF")
|
|
&& !rresult.canWrite("WEB_RESBOF")
|
|
)
|
|
{ // frontend controles
|
|
rresult.canChangeFEOnly = true;
|
|
if (S("res_fe_edit_option_only") == 1 // Setting: Alleen opties mogen bewerkt
|
|
&& status_fo_key != 1)
|
|
{
|
|
rresult.canChange = false;
|
|
rresult.readoReason = L("lcl_res_fe_edit_option_only");
|
|
}
|
|
|
|
if ( rresult.canChange
|
|
&& rsv_ruimte_contact_key != user_key
|
|
&& !user.isCollega(rsv_ruimte_contact_key)
|
|
&& !user.isCollega(rsv_ruimte_host_key))
|
|
{ // JGL: Volgens mij kan dit niet meer legaal gebeuren sinds 5.1.2RC2
|
|
rresult.canChange = false;
|
|
rresult.couldCreate = false;
|
|
rresult.readoReason = L("lcl_res_notself");
|
|
}
|
|
|
|
rresult.canDelete = rresult.canChange && !openstaandemld; // Annuleringshorizon (canDelete) i.p.v. wijzigingshorizon (canChange)
|
|
|
|
if (rresult.canChange && rsv_ruimte_van < rresult.earliest_expire_change)
|
|
{
|
|
rresult.canChange = false;
|
|
rresult.readoReason = L("lcl_res_reado_late"); // Ruimte of sommige voorzieningen mogen niet meer gewijzigd worden
|
|
}
|
|
|
|
if (rresult.canDelete && rsv_ruimte_van < rresult.earliest_expire_cancel)
|
|
{
|
|
rresult.canDelete = false;
|
|
}
|
|
}
|
|
|
|
// Als *alle* R/C/V onderdelen 'verwerkt' zijn dan worden we ook readonly
|
|
// Let op: CV -reservering heeft geen bo-status in res_rsv_ruimte
|
|
sql = "SELECT rd.res_status_bo_key"
|
|
+ " FROM res_v_aanwezigrsv_deel rd"
|
|
+ " WHERE rd.res_rsv_ruimte_key = " + rsv_ruimte_key
|
|
+ " UNION "
|
|
+ "SELECT ra.res_status_bo_key"
|
|
+ " FROM res_v_aanwezigrsv_artikel ra"
|
|
+ " WHERE ra.res_rsv_ruimte_key = " + rsv_ruimte_key;
|
|
|
|
if (alg_ruimte_key == null)
|
|
{
|
|
sql +=" UNION "
|
|
+ "SELECT res_status_bo_key"
|
|
+ " FROM res_v_aanwezigrsv_ruimte rs"
|
|
+ " WHERE rs.res_rsv_ruimte_key = " + rsv_ruimte_key;
|
|
}
|
|
sql = "SELECT MAX(res_status_bo_key) max_bo"
|
|
+ " , MIN (res_status_bo_key) min_bo"
|
|
+ " FROM (" + sql + ")";
|
|
|
|
oRs = Oracle.Execute( sql );
|
|
rresult.min_bo = oRs("min_bo").Value;
|
|
rresult.max_bo = oRs("max_bo").Value;
|
|
oRs.Close();
|
|
if (rresult.min_bo && rresult.min_bo == 6) // verwerkt
|
|
{
|
|
rresult.canChange = false;
|
|
rresult.readoReason = L("lcl_res_reado_completed"); // Alles is al verwerkt;
|
|
}
|
|
|
|
if (rresult.canDelete)
|
|
{ // Hij mag geen onderdelen hebben met status 6 (verwerkt)
|
|
if (rresult.max_bo && rresult.max_bo == 6)
|
|
rresult.canDelete = false;
|
|
|
|
}
|
|
|
|
rresult.canChangeKorting = rresult.canChange
|
|
&& (status_bo_key != 5)
|
|
&& (status_bo_key != 6)
|
|
&& ( (rresult.canWrite("WEB_RESFOF") && (S("res_roompricingkorting") & 1))
|
|
|| (rresult.canWrite("WEB_RESFOF") && (S("res_roompricingkorting") & 2))
|
|
);
|
|
|
|
if ((status_bo_key && status_bo_key < S("res_bo_status_key")) || // ruimte is af te melden
|
|
(rresult.min_bo && rresult.min_bo < S("res_bo_status_key"))) // CV is af te melden
|
|
{
|
|
rresult.canClose = rresult.canWrite("WEB_RESBOF"); // je moet wel rechten ervoor hebben
|
|
}
|
|
|
|
return rresult;
|
|
},
|
|
|
|
// fnStep kan bijvoorbeeld 'parent.planStep' zijn en wordt (clientside!) aangeroepen
|
|
// als iemand 'eerder' of 'later' klikt met als parameter resp. (-1, -1) en (+1, +1)
|
|
build_planbord_tijdbalk : function (res_van, nr_days, hour_px, p_res_t1, p_res_t2, fnStep)
|
|
{
|
|
var html = [];
|
|
var size_px = hour_px*(p_res_t2-p_res_t1)+1;
|
|
for (dagen=1; dagen<=nr_days; dagen++)
|
|
{
|
|
var dttxt = "";
|
|
if (res_van)
|
|
{
|
|
var dt2 = new Date(res_van);
|
|
dt2.setDate(dt2.getDate()+dagen-1);
|
|
dttxt = toDateString(dt2);
|
|
}
|
|
html.push("<td class='plantd tijdbalk' title='" + dttxt + "'><div class='tddiv' style='height:"+(dttxt?32:16)+"px;'>");
|
|
html.push("<div style='height:"+(dttxt?32:16)+"px;width:" + size_px + "px'> </div>");
|
|
|
|
var txtnp; // 'naast' de next-prev buttons
|
|
if (hour_px < 16) // Komt het op eigen regel
|
|
txtnp = ""
|
|
else
|
|
txtnp = dttxt;
|
|
|
|
if (fnStep && dagen==1) // eerste dag
|
|
{
|
|
txtnp = "<span title='"+L("lcl_res_plan_tt_meer_eerder")+"' class='details' id='resplanmoreprev' onclick='"+fnStep+"(-1, 0)'>"+L("lcl_res_plan_meer_eerder")+"</span> " + txtnp;
|
|
txtnp = "<span title='"+L("lcl_res_plan_tt_eerder")+"' class='details' id='resplanprev' onclick='"+fnStep+"(-1, -1)'>"+L("lcl_res_plan_eerder")+"</span> " + txtnp;
|
|
}
|
|
if (fnStep && dagen==nr_days) // laatste dag
|
|
{
|
|
txtnp = txtnp + " <span title='"+L("lcl_res_plan_tt_meer_later")+"' class='details' id='resplanmorenext' onclick='"+fnStep+"(0, +1)'>"+L("lcl_res_plan_meer_later")+"</span>";
|
|
txtnp = txtnp + " <span title='"+L("lcl_res_plan_tt_later")+"' class='details' id='resplannext' onclick='"+fnStep+"(+1, +1)'>"+L("lcl_res_plan_later")+"</span>";
|
|
}
|
|
|
|
if (hour_px < 16 && dttxt) // alleen nog datum op losse regel
|
|
{
|
|
var px_start = (p_res_t2-p_res_t1)/2*hour_px;
|
|
var txt = dttxt;
|
|
var width=90;
|
|
if (hour_px<8)
|
|
{
|
|
txt = txt.substring(0, 8); // haal zelfs jaar er af
|
|
width=90;
|
|
}
|
|
var div = "<div class='plandate'"
|
|
+" style='left:"+(px_start-width/2)+"px;width:"+width+"px'>"
|
|
+txt + "<br>"+ txtnp + "</div>";
|
|
html.push("\n"+div);
|
|
}
|
|
else
|
|
{
|
|
if (txtnp)
|
|
{
|
|
var div = "<div class='plandate' style='width:100%'>"
|
|
+ txtnp + "</div>";
|
|
html.push(div);
|
|
}
|
|
|
|
var skiphours = 1;
|
|
if (hour_px < 48)
|
|
skiphours = 2;
|
|
if (hour_px < 24)
|
|
skiphours = 3;
|
|
|
|
var s = p_res_t1;
|
|
var i0 = -2;
|
|
for (s = p_res_t1; s<=p_res_t2; s+=skiphours)
|
|
{
|
|
var h = Math.floor(s);
|
|
if (h < 10) h = "0" + h;
|
|
var m = Math.floor((s - h)*60);
|
|
if (m < 10) m = "0" + m;
|
|
m = ":" + m
|
|
|
|
var px_start = (s-p_res_t1)*hour_px;
|
|
var div = "<div class='plantime'"
|
|
+" style='left:"+(px_start-19)+"px; top:"+(dttxt?16:0)+"px'>"
|
|
+h + m + "</div>";
|
|
html.push("\n"+div);
|
|
}
|
|
}
|
|
|
|
html.push("</div></td>");
|
|
if (dagen<nr_days)
|
|
{
|
|
html.push('<td class="between"><div> </div></td>');
|
|
} else {
|
|
html.push('<td class="post"><div> </div></td>');
|
|
}
|
|
} // dagen
|
|
return html.join("");
|
|
},
|
|
|
|
// Deze view wil ik graag nog kwijt (of vooral: fac_v_my_res_rooms wil ik kwijt)
|
|
// Met 5.3.1 geen tijd meer ervoor..
|
|
fac_v_my_res_ruimte_write: // 'view' die je rechten op een res_ruimte oplevert
|
|
"(SELECT rr.res_ruimte_key,"
|
|
+" fr.prs_perslid_key,"
|
|
+" g.fac_functie_key,"
|
|
+" rr.res_ruimte_begintijd,"
|
|
+" rr.res_ruimte_eindtijd,"
|
|
+" rr.res_ruimte_verwijder,"
|
|
+ lcl.xsqla('rr.res_ruimte_omschrijving', 'rr.res_ruimte_key')
|
|
+" FROM res_ruimte rr,"
|
|
+" ins_tab_discipline d,"
|
|
+" fac_v_my_res_rooms fr,"
|
|
+" fac_v_webgebruiker g"
|
|
+" WHERE rr.res_discipline_key = d.ins_discipline_key"
|
|
+" AND rr.res_ruimte_key = fr.res_ruimte_key"
|
|
+" AND fr.prs_perslid_key = g.prs_perslid_key"
|
|
+" AND niveau = g.fac_gebruiker_alg_level_write"
|
|
+" AND ins_discipline_min_level = 3"
|
|
+" AND d.ins_discipline_key = g.ins_discipline_key"
|
|
+" AND g.fac_gebruiker_alg_level_write < 9)",
|
|
|
|
insert_reservering: function _insert_reservering(params)
|
|
{
|
|
// Placeholder, invulling te geven en te gebruiken vanuit de API en dergelijke
|
|
// fields = ...
|
|
/*
|
|
var resIns = buildInsert("res_reservering", resfields);
|
|
var reservering_key = resIns.sequences["res_reservering_key"];
|
|
var volgnr = 1;
|
|
Oracle.Execute(resIns.sql);
|
|
*/
|
|
},
|
|
|
|
get_rooms_for_planbord: function _get_rooms_for_planbord(params)
|
|
{
|
|
if (params.alg_locatie_plaats)
|
|
{
|
|
params.loc_key_arr = [-1]; // Voorkom dat we 'alles' krijgen bij niet gevonden plaats
|
|
var sql = "SELECT alg_locatie_key"
|
|
+ " FROM alg_v_aanweziglocatie"
|
|
+ " WHERE UPPER(alg_locatie_plaats) = " + safe.quoted_sql_wild(params.alg_locatie_plaats + '%');
|
|
var oRs = Oracle.Execute(sql);
|
|
while (!oRs.Eof)
|
|
{
|
|
params.loc_key_arr.push(oRs("alg_locatie_key").Value);
|
|
oRs.MoveNext();
|
|
}
|
|
oRs.Close();
|
|
}
|
|
params.ruimtecat = params.ruimtecat || [];
|
|
params.loc_key_arr = params.loc_key_arr || [];
|
|
var sql_loc_from = "";
|
|
var sql_loc_where = "";
|
|
if (params.rui > 0)
|
|
sql_loc_from = ", alg_ruimte r";
|
|
else if (params.dist < 0 && params.reg > 0)
|
|
sql_loc_from = ", alg_district d";
|
|
|
|
if (params.rui > 0)
|
|
sql_loc_where = " AND r.alg_verdieping_key = rg.alg_verdieping_key"
|
|
+ " AND r.alg_ruimte_key = " + params.rui;
|
|
else if (params.ver > 0)
|
|
sql_loc_where = " AND rg.alg_verdieping_key = " + params.ver;
|
|
else if (params.bld > 0)
|
|
sql_loc_where = " AND rg.alg_gebouw_key = " + params.bld;
|
|
else if (params.loc > 0)
|
|
sql_loc_where = " AND rg.alg_locatie_key = " + params.loc;
|
|
else if (params.loc_key_arr.length)
|
|
sql_loc_where = " AND rg.alg_locatie_key IN (" + params.loc_key_arr.join(", ") + ")";
|
|
else if (params.dist > 0)
|
|
sql_loc_where = " AND l.alg_district_key = " + params.dist;
|
|
else if (params.reg > 0)
|
|
sql_loc_where = " AND l.alg_district_key = d.alg_district_key"
|
|
+ " AND d.alg_regio_key = " + params.reg;
|
|
|
|
var sati_sql = " (SELECT AVG(res_rsv_ruimte_satisfaction) "
|
|
+ " FROM res_rsv_ruimte rrr, res_ruimte_opstelling rro"
|
|
+ " WHERE rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key"
|
|
+ " AND rro.res_ruimte_key = fr.res_ruimte_key"
|
|
+ " AND res_rsv_ruimte_van > sysdate - 180)";
|
|
|
|
// RES_RUIMTE informatie
|
|
// Deze query bepaalt het aantal regels in het planbord
|
|
var sql = "SELECT DISTINCT fr.res_ruimte_key"
|
|
+ " , " + lcl.xsqla('rg.res_ruimte_nr', 'rg.res_ruimte_key')
|
|
+ " , bmin"
|
|
+ " , bmax"
|
|
+ " , alg_locatie_omschrijving"
|
|
+ " , alg_locatie_plaats"
|
|
+ " , alg_locatie_code"
|
|
+ " , " + lcl.xsqla('fr.res_ruimte_omschrijving', 'fr.res_ruimte_key')
|
|
+ " , fr.res_ruimte_begintijd"
|
|
+ " , fr.res_ruimte_eindtijd"
|
|
+ " , fr.res_ruimte_image"
|
|
+ " , res_disc_params_preposttime"
|
|
+ " , fr.res_ruimte_prijs"
|
|
+ " ," + (params.with_satisfaction?sati_sql:"0") + " satisfaction"
|
|
+ " , rg.res_discipline_key"
|
|
+ " FROM alg_locatie l"
|
|
+ " , opstel_bez"
|
|
+ " , res_ruimte fr"
|
|
+ " , res_v_res_ruimte_gegevens rg"
|
|
+ " , res_disc_params"
|
|
+ sql_loc_from
|
|
+ " WHERE rg.alg_locatie_key = l.alg_locatie_key "
|
|
+ " AND fr.res_ruimte_key = opstel_bez.res_ruimte_key"
|
|
+ " AND fr.res_ruimte_key = rg.res_ruimte_key"
|
|
+ " AND fr.res_ruimte_verwijder IS NULL"
|
|
+ " AND res_disc_params.res_ins_discipline_key = rg.res_discipline_key "
|
|
+ sql_loc_where;
|
|
|
|
// Altijd 3D Rechten ook meenemen
|
|
sql = discxalg3d (sql,
|
|
"fr.res_discipline_key",
|
|
"rg.alg_regio_key",
|
|
"rg.alg_district_key",
|
|
"rg.alg_locatie_key",
|
|
"rg.alg_gebouw_key",
|
|
"rg.alg_verdieping_key",
|
|
"rg.alg_ruimte_key",
|
|
params.authparams.autfunction,
|
|
params.ruimtecat.length?params.ruimtecat.join(",") : '',
|
|
params.forSelectRoom, // forWrite
|
|
3); // minlevel 3: alleen ruimte catalogie beschouwen
|
|
|
|
sql = "WITH opstel_bez"
|
|
+ " AS ( SELECT res_ruimte_key,"
|
|
+ " MIN (res_ruimte_opstel_bezoekers) bmin,"
|
|
+ " MAX (res_ruimte_opstel_bezoekers) bmax"
|
|
+ " FROM res_ruimte_opstelling"
|
|
+ " GROUP BY res_ruimte_key)"
|
|
+ " SELECT * FROM (" + sql + ") rg WHERE 1 = 1";
|
|
|
|
sql += (params.ruimtecat.length ? " AND res_discipline_key IN (" + params.ruimtecat.join(",") + ")" : "")
|
|
+ ((params.res_ruimte_key && !params.forSelectRoom)? " AND fr.res_ruimte_key = " + params.res_ruimte_key : "")
|
|
+ ((params.vis)? " AND bmax >= " + params.vis : "")
|
|
+ ((params.activiteit_key)?" AND EXISTS (SELECT res_activiteit_key FROM res_activiteitdiscipline rad"
|
|
+ " WHERE rad.res_discipline_key = rg.res_discipline_key"
|
|
+ " AND rad.res_activiteit_key = " + params.activiteit_key + ")" : "")
|
|
+ ((!params.activiteit_key && params.srtact > 0)
|
|
? " AND EXISTS (SELECT ra.res_activiteit_key"
|
|
+ " FROM res_activiteitdiscipline rad"
|
|
+ " , res_activiteit ra"
|
|
+ " WHERE rad.res_discipline_key = rg.res_discipline_key"
|
|
+ " AND rad.res_activiteit_key = ra.res_activiteit_key"
|
|
+ " AND ra.res_srtactiviteit_key = " + params.srtact + ")" : "")
|
|
+ " ORDER BY "
|
|
+ (params.loc == -1 ? "alg_locatie_omschrijving," : "")
|
|
+ (S("res_room_order") == 0
|
|
? (params.forSelectRoom? " bmin," : "") + lcl.xsql('rg.res_ruimte_nr', 'rg.res_ruimte_key') + ", alg_locatie_omschrijving"// Eerst sorteren op capaciteit
|
|
: lcl.xsql('rg.res_ruimte_nr', 'rg.res_ruimte_key') + ", alg_locatie_omschrijving" + (params.forSelectRoom? ", bmin" : "")); // Eerst sorteren op ruimte nummer
|
|
return sql;
|
|
},
|
|
|
|
// Levert voldoende informatie op voor een planbord voor een bepaalde periode
|
|
// In het bijzonder: alle mogelijke zalen en de bestaande bezetting
|
|
// Let op: S("res_t1") en S("res_t2") kunnen tijdelijk gewijzigd zijn
|
|
plan_rooms_info: function _plan_rooms_info (params)
|
|
{
|
|
var sql = res.get_rooms_for_planbord(params);
|
|
|
|
// Verklein de setting S("res_t1") en S("res_t2") indien geen enkele ruimte zo ruim mag.
|
|
var sqlminmax = "SELECT MIN(coalesce(res_ruimte_begintijd," + S("res_t1") + ")) tmin, "
|
|
+ " MAX(coalesce(res_ruimte_eindtijd, " + S("res_t2") + ")) tmax"
|
|
+ " FROM (" + sql + ")";
|
|
var oRs = Oracle.Execute(sqlminmax);
|
|
settings.overrule_setting("res_t1", oRs("tmin").value || S("res_t1"));
|
|
settings.overrule_setting("res_t2", oRs("tmax").value || S("res_t2"));
|
|
|
|
// Extra wrapper omdat ADO anders komt met 'Operation not allowed when object is closed'
|
|
// Blijkbaar snapt die de WITH constructie vooraan niet zo
|
|
sql = "SELECT * FROM (" + sql + ")"
|
|
oRs = Oracle.Execute(sql);
|
|
|
|
var all_rooms = []; // Hierin bouwen alle ruimtes op
|
|
if (params.get_deepurl)
|
|
{ // Bepaal de URL waarmee straks een boeking uitgevoerd kan worden
|
|
if (params.mobile)
|
|
{
|
|
var deepurl = HTTP.urlzelf() + "/pda/reservering.asp";
|
|
}
|
|
else
|
|
{
|
|
var sql = "SELECT fac_bookmark_id"
|
|
+ " FROM fac_bookmark"
|
|
+ " WHERE fac_bookmark_xmlnode = 'reservering'";
|
|
var oRs2 = Oracle.Execute(sql);
|
|
var bm = oRs2("fac_bookmark_id").Value;
|
|
var deepurl = HTTP.urlzelf() + "/?fac_id=" + customerId + "&u=" + bm;
|
|
oRs2.Close();
|
|
}
|
|
}
|
|
|
|
while (!oRs.eof)
|
|
{
|
|
var room = { res_ruimte_key: oRs("res_ruimte_key").Value,
|
|
res_ruimte_nr : oRs("res_ruimte_nr").Value,
|
|
bMin : oRs("bMin").Value,
|
|
bMax : oRs("bMax").Value,
|
|
prepost_time : oRs("res_disc_params_preposttime").Value,
|
|
begintijd : oRs("res_ruimte_begintijd").Value||S("res_t1"),
|
|
eindtijd : oRs("res_ruimte_eindtijd").Value||S("res_t2"),
|
|
image : oRs("res_ruimte_image").Value,
|
|
omschrijving : oRs("res_ruimte_omschrijving").Value,
|
|
locatie : oRs("alg_locatie_omschrijving").Value,
|
|
plaats : oRs("alg_locatie_plaats").Value,
|
|
satisfaction : oRs("satisfaction").Value,
|
|
prijs : oRs("res_ruimte_prijs").Value
|
|
};
|
|
if (room.begintijd < S("res_t1")) room.begintijd = S("res_t1");
|
|
if (room.eindtijd > S("res_t2")) room.eindtijd = S("res_t2");
|
|
if (room.begintijd > room.eindtijd) room.begintijd = room.eindtijd;
|
|
if (params.get_deepurl)
|
|
{
|
|
room.deepurl = deepurl;
|
|
if (oRs("res_ruimte_image").value)
|
|
room.image_url = HTTP.urlzelfnoroot() + S("res_image_path") + oRs("res_ruimte_image").value;
|
|
}
|
|
else
|
|
{
|
|
if (oRs("res_ruimte_image").value)
|
|
room.image_url = S("res_image_path") + oRs("res_ruimte_image").value;
|
|
}
|
|
all_rooms.push(room);
|
|
oRs.MoveNext();
|
|
}
|
|
oRs.Close();
|
|
__Log("done plan_rooms_info met {0} ruimtes.".format(all_rooms.length));
|
|
return all_rooms;
|
|
},
|
|
//
|
|
// Bestaande reserveringen
|
|
//
|
|
// Voor de API zetten we params.anonymous zodat minimale informatie wordt opgeleverd
|
|
// TODO: Of op basis van fe-geheim?
|
|
plan_bezet_info: function _plan_bezet_info (params)
|
|
{
|
|
//var room_sql = res.get_rooms_for_planbord(params);
|
|
// Pas allerlei filtering toe om te zorgen dat we niet te veel ophalen
|
|
// Dat is slecht voor de performance en (API) misschien geheim
|
|
var sql_loc_from = "";
|
|
if (params.bld > 0 || params.loc > 0 || params.dist > 0 || params.reg > 0)
|
|
{
|
|
sql_loc_from += ", alg_ruimte ar"
|
|
+ ", alg_verdieping av"
|
|
+ ", alg_gebouw ag";
|
|
}
|
|
if (params.dist > 0 || params.reg > 0)
|
|
{
|
|
sql_loc_from += ", alg_locatie al";
|
|
}
|
|
if (params.reg > 0)
|
|
{
|
|
sql_loc_from += ", alg_district ad";
|
|
}
|
|
|
|
var sql_loc_where = ""
|
|
if (params.bld > 0 || params.loc > 0 || params.dist > 0 || params.reg > 0)
|
|
{
|
|
sql_loc_where += " AND x.alg_ruimte_key = ar.alg_ruimte_key"
|
|
+ " AND ar.alg_verdieping_key = av.alg_verdieping_key"
|
|
+ " AND av.alg_gebouw_key = ag.alg_gebouw_key";
|
|
}
|
|
if (params.bld > 0)
|
|
{
|
|
sql_loc_where += " AND ag.alg_gebouw_key = " + params.bld;
|
|
}
|
|
else if (params.loc > 0)
|
|
{
|
|
sql_loc_where += " AND ag.alg_locatie_key = " + params.loc;
|
|
}
|
|
else if (params.dist > 0)
|
|
{
|
|
sql_loc_where += " AND ag.alg_locatie_key = al.alg_locatie_key"
|
|
+ " AND al.alg_district_key = " + params.dist;
|
|
}
|
|
else if (params.reg > 0)
|
|
{
|
|
sql_loc_where += " AND ag.alg_locatie_key = al.alg_locatie_key"
|
|
+ " AND al.alg_district_key = ad.alg_district_key"
|
|
+ " AND ad.alg_regio_key = " + params.reg;
|
|
}
|
|
|
|
// Determine all existing reservations and store them in an array 'existing_res'
|
|
sql = "SELECT DISTINCT rv.res_rsv_ruimte_van"
|
|
+ " , rv.res_rsv_ruimte_tot"
|
|
+ " , rv.res_rsv_ruimte_dirtlevel"
|
|
+ " , res_ruimte_key_1"
|
|
+ " , rv.res_status_fo_key, rv.res_rsv_ruimte_flag, rv.res_reservering_key, res_rsv_ruimte_volgnr, rv.res_rsv_ruimte_key, res_ruimte_key_2"
|
|
+ " , rv.res_rsv_ruimte_host_key"
|
|
+ " , rv.res_rsv_ruimte_contact_key"
|
|
+ " , rv.res_rsv_ruimte_omschrijving"
|
|
+ " , (SELECT count(1) FROM res_v_aanwezigrsv_artikel rra WHERE rra.res_rsv_ruimte_key = rv.res_rsv_ruimte_key) aantalA" // dat de CV dirty kan zijn negeren we.
|
|
+ " , (SELECT count(1) FROM res_v_aanwezigrsv_deel rrd WHERE rrd.res_rsv_ruimte_key = rv.res_rsv_ruimte_key) aantalD"
|
|
+ " , (SELECT count(1) FROM res_v_aanwezigrsv_deel rrd, res_deel rd"
|
|
+ " WHERE rrd.res_deel_key = rd.res_deel_key"
|
|
+ " AND rrd.res_rsv_ruimte_key = rv.res_rsv_ruimte_key"
|
|
+ " AND rd.res_discipline_key = " + S("vis_parking_key") + ") aantalP"
|
|
+ " FROM res_v_aanwezigrsv_ruimte rv, res_ruimte_opstelling ro"
|
|
+ sql_loc_from // als bld!=-1 dan is zeker loc!=-1
|
|
// ///////Koppelzalen meenemen want daardoor kunnen we ook bezet raken
|
|
+ ", ( SELECT DISTINCT r1.res_ruimte_key res_ruimte_key_1, r2.res_ruimte_key res_ruimte_key_2, r2.alg_ruimte_key "
|
|
+ " FROM res_alg_ruimte r1, res_alg_ruimte r2 "
|
|
+ " WHERE r1.alg_ruimte_key = r2.alg_ruimte_key"
|
|
+ " AND r1.res_alg_ruimte_verwijder IS NULL"
|
|
+ " AND r2.res_alg_ruimte_verwijder IS NULL"
|
|
+ " ) X"
|
|
+ " WHERE rv.res_rsv_ruimte_van between " + params.res_van.toSQL() + " AND " + params.res_tot.endToSQL()
|
|
+ " AND rv.res_ruimte_opstel_key = ro.res_ruimte_opstel_key"
|
|
+ " AND X.res_ruimte_key_2 = ro.res_ruimte_key"
|
|
+ sql_loc_where
|
|
+ (params.res_ruimte_key && !params.forSelectRoom
|
|
? " AND res_ruimte_key_1=" + params.res_ruimte_key
|
|
: "")
|
|
// optimalisatie lijkt leuk maar faalt als er zalen zijn in een andere catalogus waar je geen rechten voor
|
|
// hebt die overlappen met onze zaal (share and meet). Dan krijg je de bezetting-info niet goed mee. Nader
|
|
// bekijken....
|
|
// : " AND res_ruimte_key IN (SELECT res_ruimte_key FROM (" + room_sql + "))")
|
|
+ " ORDER BY res_ruimte_key_1,"
|
|
+ " (res_rsv_ruimte_tot - res_rsv_ruimte_van) DESC," // langste reserveringen eerst/onderop
|
|
+ " rv.res_rsv_ruimte_dirtlevel ASC"
|
|
|
|
var existing_res = {};
|
|
var nn = 0;
|
|
var oRs = Oracle.Execute(sql);
|
|
while (!oRs.eof)
|
|
{
|
|
nn ++;
|
|
var res_ruimte_key = oRs("res_ruimte_key_1").value;
|
|
if( ! existing_res[res_ruimte_key] )
|
|
existing_res[res_ruimte_key] = [];
|
|
var data = { res_van : new Date(oRs("res_rsv_ruimte_van").value),
|
|
res_tot : new Date(oRs("res_rsv_ruimte_tot").value),
|
|
fo_status : oRs("res_status_fo_key").value,
|
|
flag_status : oRs("res_rsv_ruimte_flag").value||0,
|
|
na_koppel : (oRs("res_ruimte_key_1").value == oRs("res_ruimte_key_2").value)? 0 : 1,
|
|
//aantalP : oRs("aantalP").value, // doen we nog niets mee
|
|
dirtlevel : oRs("res_rsv_ruimte_dirtlevel").value
|
|
};
|
|
if (params.anonymous && params.dirtlevel > 0)
|
|
{
|
|
oRs.MoveNext();
|
|
continue; // die zijn niet nodig
|
|
}
|
|
|
|
if (!params.anonymous)
|
|
{
|
|
data.rsv_ruimte_key = oRs("res_rsv_ruimte_key").value;
|
|
data.host_key = oRs("res_rsv_ruimte_host_key").value;
|
|
data.contact_key = oRs("res_rsv_ruimte_contact_key").value;
|
|
data.omschrijving = oRs("res_rsv_ruimte_omschrijving").value;
|
|
data.aantalA = oRs("aantalA").value;
|
|
data.aantalD = oRs("aantalD").value - oRs("aantalP").value;
|
|
}
|
|
else if (oRs("res_rsv_ruimte_host_key").value == user_key)
|
|
{
|
|
// Tooltip via res_load_title_rsv.asp is te complex, zou een api zijn
|
|
data.extern = { res_nr : customerId + "#" + oRs("res_reservering_key").value + "/" + oRs("res_rsv_ruimte_volgnr").Value,
|
|
omschrijving : oRs("res_rsv_ruimte_omschrijving").Value}
|
|
}
|
|
existing_res[res_ruimte_key].push(data);
|
|
oRs.MoveNext();
|
|
}
|
|
oRs.close();
|
|
__Log("done plan_bezet_info met {0} bezettingen.".format(nn));
|
|
|
|
return existing_res;
|
|
},
|
|
|
|
// Wordt bij Share&Meet via API opgevraagd
|
|
user_lopend_info: function _user_lopend_info (params)
|
|
{
|
|
var showall = false; // TODO?
|
|
// ....
|
|
var sql =
|
|
"SELECT rr.res_rsv_ruimte_host_key prs_perslid_key"
|
|
+ " , res_srtactiviteit_prefix || TO_CHAR (rr.res_reservering_key) || '/' || rr.res_rsv_ruimte_volgnr item"
|
|
+ " , rr.res_rsv_ruimte_key item_key"
|
|
+ " , 'reservering' xmlnode"
|
|
+ " , rr.res_rsv_ruimte_van datum"
|
|
+ " , COALESCE (rr.res_rsv_ruimte_omschrijving, " + lcl.xsql('ra.res_activiteit_omschrijving', 'res_activiteit_key') + ") detail"
|
|
+ " , ' ' status"
|
|
+ " , res_rsv_ruimte_satisfaction satisfaction"
|
|
+ " , DECODE (res_rsv_ruimte_dirtlevel, 0, rr.res_status_fo_key, -1) status_key"
|
|
+ " , rr.res_status_bo_key bo_status_key"
|
|
//+ sqlTracking("rr.res_rsv_ruimte_key","reservering")
|
|
+ " FROM res_v_aanwezigrsv_ruimte rr"
|
|
+ " , res_activiteit ra"
|
|
+ " , res_srtactiviteit rsa"
|
|
+ " , fac_tracking tr"
|
|
+ " , fac_srtnotificatie str"
|
|
+ " WHERE rr.res_activiteit_key = ra.res_activiteit_key"
|
|
+ " AND ra.res_srtactiviteit_key = rsa.res_srtactiviteit_key"
|
|
+ " AND (rr.res_status_bo_key IN (4, 3, 2, 7)"
|
|
+ " OR (rr.res_status_bo_key IN (5, 6)"
|
|
+ " AND tr.fac_tracking_datum > SYSDATE - " + S("facilities_flike_past")
|
|
+ " AND str.fac_srtnotificatie_code = 'RESAFM'))"
|
|
+ " AND rr.res_rsv_ruimte_key = tr.fac_tracking_refkey(+)"
|
|
+ " AND tr.fac_srtnotificatie_key = str.fac_srtnotificatie_key(+)"
|
|
+ (!showall
|
|
? " AND (rr.res_rsv_ruimte_van BETWEEN SYSDATE - " + S("facilitiespast_res") + " AND SYSDATE + " + S("facilitiesfuture_res") + " OR rr.res_rsv_ruimte_van IS NULL)"
|
|
: "")
|
|
+ " UNION "
|
|
+ "SELECT rr.res_rsv_ruimte_contact_key prs_perslid_key"
|
|
+ " , res_srtactiviteit_prefix || TO_CHAR (rr.res_reservering_key) || '/' || rr.res_rsv_ruimte_volgnr item"
|
|
+ " , rr.res_rsv_ruimte_key"
|
|
+ " , 'reservering' xmlnode"
|
|
+ " , rr.res_rsv_ruimte_van datum"
|
|
+ " , COALESCE (rr.res_rsv_ruimte_omschrijving, " + lcl.xsql('ra.res_activiteit_omschrijving', 'res_activiteit_key') + ") detail"
|
|
+ " , ' ' status"
|
|
+ " , res_rsv_ruimte_satisfaction satisfaction"
|
|
+ " , DECODE (res_rsv_ruimte_dirtlevel, 0, rr.res_status_fo_key, -1) status_key"
|
|
+ " , rr.res_status_bo_key bo_status_key"
|
|
//+ sqlTracking("rr.res_rsv_ruimte_key","reservering")
|
|
+ " FROM res_v_aanwezigrsv_ruimte rr"
|
|
+ " , res_activiteit ra"
|
|
+ " , res_srtactiviteit rsa"
|
|
+ " WHERE rr.res_activiteit_key = ra.res_activiteit_key"
|
|
+ " AND ra.res_srtactiviteit_key = rsa.res_srtactiviteit_key"
|
|
+ " AND rr.res_status_bo_key IN (4, 3, 2, 7)"
|
|
+ (!showall
|
|
? " AND (rr.res_rsv_ruimte_van BETWEEN SYSDATE - " + S("facilitiespast_res") + " AND SYSDATE + " + S("facilitiesfuture_res") + " OR rr.res_rsv_ruimte_van IS NULL)"
|
|
: "");
|
|
var sqln = "SELECT prs_perslid_key"
|
|
+ " , item"
|
|
+ " , item_key"
|
|
+ " , xmlnode"
|
|
+ " , datum"
|
|
+ " , detail"
|
|
+ " , status"
|
|
+ " , satisfaction"
|
|
+ " , status_key"
|
|
// + " , recentdatum"
|
|
+ " , bo_status_key"
|
|
+ " FROM (" + sql + ")"
|
|
+ " WHERE prs_perslid_key = " + params.prs_key
|
|
// + module_filter
|
|
+ " ORDER by datum";
|
|
var oRs = Oracle.Execute(sqln);
|
|
var user_res = Oracle.rs2hash(oRs);
|
|
oRs.Close();
|
|
|
|
// Bepaal de URL waar user straks op kan klikken
|
|
var sql = "SELECT fac_bookmark_id"
|
|
+ " FROM fac_bookmark"
|
|
+ " WHERE fac_bookmark_xmlnode = 'reservering'";
|
|
var oRs = Oracle.Execute(sql);
|
|
var bm = oRs("fac_bookmark_id").Value;
|
|
oRs.Close();
|
|
if (params.mobile)
|
|
var deepurl = HTTP.urlzelf() + "/appl/pda/reservering.asp?fac_id=" + customerId + "&rsv_ruimte_key=";
|
|
else
|
|
var deepurl = HTTP.urlzelf() + "/?fac_id=" + customerId + "&u=" + bm + "&k=" ;
|
|
for (var r in user_res)
|
|
{
|
|
user_res[r].deepurl = deepurl + user_res[r].item_key
|
|
}
|
|
|
|
return user_res;
|
|
},
|
|
getremotes_sql: function (autfunction)
|
|
{
|
|
var sql = "SELECT dis.ins_discipline_key,"
|
|
+ " "+ lcl.xsqla('dis.ins_discipline_omschrijving','dis.ins_discipline_key') +","
|
|
+ " res_disc_params_remoteurl"
|
|
+ " FROM res_v_aanwezigdiscipline dis, res_disc_params rdp"
|
|
+ " WHERE dis.ins_discipline_key = rdp.res_ins_discipline_key"
|
|
+ " AND ins_discipline_min_level = 3" // Alleen nog Ruimte
|
|
+ " AND res_disc_params_remoteurl IS NOT NULL"
|
|
+ " AND dis.ins_discipline_key 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.fac_gebruiker_prs_level_write < 9"
|
|
+ " AND g.prs_perslid_key = " + user_key + ")";
|
|
return sql;
|
|
},
|
|
anyremotes: function () // TODO: Bij veel aanroepen gaan cachen in session?
|
|
{
|
|
var sql = res.getremotes_sql("WEB_RESUSE");
|
|
var oRs = Oracle.Execute(sql);
|
|
var any = !oRs.EOF;
|
|
oRs.Close()
|
|
return any;
|
|
},
|
|
hour_px: function (width_px, nr_days)
|
|
{
|
|
var nr_hours = nr_days * (S("res_t2") - S("res_t1"));
|
|
var targethour_px = width_px / nr_hours;
|
|
var hour_px = 48;
|
|
if (targethour_px < 48) hour_px = 36;
|
|
if (targethour_px < 36) hour_px = 24;
|
|
if (targethour_px < 24) hour_px = 16;
|
|
if (targethour_px < 16) hour_px = 8;
|
|
if (targethour_px < 8) hour_px = 4;
|
|
return hour_px;
|
|
}
|
|
}
|
|
|
|
// Later nog: p_alg_ruimte_key zelf bepalen uit p_rsv_ruimte_key
|
|
/* Vier varianten
|
|
A) p_res_ruimte_key gegeven van een 'CV'. We zijn een CV reservering aan het bewerken en hebben dus een alg_ruimte
|
|
Toon alleen datgene wat gereserveerd kan worden in die ruimte
|
|
A) p_alg_ruimte_key gegeven van een 'R'. We zijn een R reservering aan het bewerken en hebben dus een res_ruimte
|
|
Toon alleen datgene wat gereserveerd kan worden in die res_ruimte
|
|
C) Geen p_rsv_ruimte_key maar wel een loc_key
|
|
Toon alleen datgene wat gereserveerd kan worden op die locatie
|
|
D) Geen p_rsv_ruimte_key en geen loc_key
|
|
Toon alleen datgene wat gereserveerd kan worden
|
|
*/
|
|
|
|
function getReservedObjectTypes (p_alg_ruimte_key, p_res_ruimte_key, p_select_fields, loc_params, p_sdisc, p_group_by)
|
|
{
|
|
var params = { alg_ruimte_key : p_alg_ruimte_key,
|
|
res_ruimte_key : p_res_ruimte_key,
|
|
select_fields : p_select_fields,
|
|
reg_key : loc_params.reg_key,
|
|
dist_key : loc_params.dist_key,
|
|
loc_key : loc_params.loc_key,
|
|
sdisc : p_sdisc,
|
|
group_by : p_group_by
|
|
};
|
|
return get_res_deel_sql ( params );
|
|
}
|
|
function get_res_deel_sql ( params )
|
|
{
|
|
|
|
params.alg_ruimte_key = params.alg_ruimte_key || -1;
|
|
params.res_ruimte_key = params.res_ruimte_key || -1;
|
|
|
|
var sql1 = "SELECT " + params.select_fields
|
|
+ " FROM ins_deel d, "
|
|
+ " res_v_aanwezigdeel r, "
|
|
+ " res_disc_params rdp,"
|
|
+ " (SELECT aob.alg_regio_key, aob.alg_district_key, aob.alg_locatie_key, aob.alg_gebouw_key, aob.alg_verdieping_key, aob.alg_ruimte_key "
|
|
+ " FROM "
|
|
+ (params.res_ruimte_key > 0? " res_v_aanwezigalg_ruimte rrr, ": "")
|
|
+ " alg_v_onrgoed_boom aob"
|
|
+ " WHERE 1=1"
|
|
+ ((params.reg_key||-1) > -1 ?" AND aob.alg_regio_key="+params.reg_key : "")
|
|
+ ((params.dist_key||-1) > -1 ?" AND aob.alg_district_key="+params.dist_key : "")
|
|
+ ((params.loc_key||-1) > -1 ?" AND aob.alg_locatie_key="+params.loc_key : "")
|
|
+ ((params.geb_key||-1) > -1 ?" AND aob.alg_gebouw_key="+params.geb_key : "")
|
|
+ ((params.ver_key||-1) > -1 ?" AND aob.alg_verdieping_key="+params.ver_key : "")
|
|
+ ((params.res_ruimte_key > 0)
|
|
? " AND res_ruimte_key = " + params.res_ruimte_key + " AND rrr.alg_ruimte_key = aob.alg_ruimte_key"
|
|
: "")
|
|
+ ((params.alg_ruimte_key > 0)
|
|
?" AND aob.alg_ruimte_key = " + params.alg_ruimte_key
|
|
: "")
|
|
+ " ) scope,"
|
|
+ " res_v_deelscope ds"
|
|
+ " WHERE r.res_ins_deel_key=d.ins_deel_key"
|
|
+ " AND rdp.res_ins_discipline_key = r.res_discipline_key"
|
|
+ (params.sdisc?" AND r.res_discipline_key = " + params.sdisc:"")
|
|
+ " AND COALESCE(d.ins_alg_ruimte_type_org, d.ins_alg_ruimte_type) IN ('R','T')";
|
|
|
|
sql1 += " AND "
|
|
+ " ( ds.alg_regio_key = scope.alg_regio_key"
|
|
+ " OR ds.alg_district_key = scope.alg_district_key"
|
|
+ " OR ds.alg_locatie_key = scope.alg_locatie_key"
|
|
+ " OR ds.alg_gebouw_key = scope.alg_gebouw_key"
|
|
+ " OR ds.alg_verdieping_key = scope.alg_verdieping_key"
|
|
+ " OR ds.alg_ruimte_key = scope.alg_ruimte_key"
|
|
+ " OR ds.res_deel_alg_level = -1)"
|
|
+ " AND r.res_deel_key = ds.res_deel_key"
|
|
|
|
if (params.res_ruimte_key<0 && (params.alg_ruimte_key<0))
|
|
{ // Locatie scope of nog groter. Rechten ook meenemen
|
|
sql1 = discxalg3d (sql1,
|
|
"r.RES_DISCIPLINE_KEY",
|
|
"scope.alg_regio_key",
|
|
"scope.alg_district_key",
|
|
"scope.alg_locatie_key",
|
|
"scope.alg_gebouw_key",
|
|
"scope.alg_verdieping_key",
|
|
"scope.alg_ruimte_key",
|
|
autfunction,
|
|
typeof params.sdisc=="number"?params.sdisc:'');
|
|
}
|
|
sql1 += params.group_by;
|
|
return sql1;
|
|
}
|
|
|
|
function planbordTooltipShowing(res_rsv_ruimte_key)
|
|
{
|
|
var tonen = false;
|
|
var disc = null;
|
|
if (res_rsv_ruimte_key) // Hebben we niet bij een afspraak
|
|
{
|
|
var sql = "SELECT res_srtactiviteit_anonym, "
|
|
+ " res_discipline_key "
|
|
+ " FROM res_srtactiviteit sa,"
|
|
+ " res_activiteit ra,"
|
|
+ " res_rsv_ruimte rrr,"
|
|
+ " res_ruimte_opstelling rro,"
|
|
+ " res_ruimte rr"
|
|
+ " WHERE sa.res_srtactiviteit_key = ra.res_srtactiviteit_key"
|
|
+ " AND ra.res_activiteit_key = rrr.res_activiteit_key"
|
|
+ " AND rrr.res_rsv_ruimte_key = " + rsv_ruimte_key
|
|
+ " AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)"
|
|
+ " AND rro.res_ruimte_key = rr.res_ruimte_key(+)";
|
|
var oRs = Oracle.Execute(sql);
|
|
var disc = oRs("res_discipline_key").Value;
|
|
tonen = (oRs("res_srtactiviteit_anonym").Value != 1);
|
|
oRs.Close();
|
|
}
|
|
// FOF mag het wel zien als hij rechten heeft op de (ruimte)discipline.
|
|
// Bij voorzieningreserveringen mag je het met any FOF altijd zien.
|
|
var canFOF = user.checkAutorisation("WEB_RESFOF", true, disc);
|
|
if (canFOF)
|
|
tonen = true;
|
|
|
|
return tonen;
|
|
}
|
|
|
|
Date.prototype.getFloatHours = function getFloatHours()
|
|
{
|
|
return this.getHours() + (this.getMinutes()/60);
|
|
}
|
|
// Noot: rondt af op S("res_h")!
|
|
// levert een nieuw date-object op
|
|
Date.prototype.setFloatHours = function setFloatHours(hrs)
|
|
{
|
|
var dd = new Date(this);
|
|
hrs = Math.floor((hrs/S("res_h"))+0.5) * S("res_h");
|
|
var hh = Math.floor(hrs);
|
|
var mm = (hrs*60) % 60;
|
|
dd.setHours(hh,mm,0,0);
|
|
return dd;
|
|
}
|
|
// Noot: rondt af op S("res_h")!
|
|
// levert een nieuw date-object op
|
|
Date.prototype.addFloatHours = function addFloatHours(hrs)
|
|
{
|
|
return this.setFloatHours(this.getFloatHours() + hrs);
|
|
}
|
|
|
|
%>
|