474 lines
19 KiB
HTML
474 lines
19 KiB
HTML
<% /*
|
|
$Revision: 2 $
|
|
$Modtime: 2-11-09 12:31 $
|
|
|
|
File: obj_schedule.inc
|
|
Status: 75% (PF: hooguit)
|
|
Description: Create small planboard for reservable objects
|
|
At the body.onload it copies its entire innerHTML to the parent
|
|
Parameters: ???
|
|
|
|
Context: Geladen via ajaxals gebruiker een object categorie opent
|
|
as well serverside when object categorie should be open initially
|
|
??Let wel: 'onder het grote planbord' en 'na drukken knop voorzieningen bij een
|
|
bestaande of nieuwe reservering' geeft iets ander gedrag??
|
|
Notes: See also cons_objects.asp for consumable objects. Solved differently
|
|
though.
|
|
|
|
*/
|
|
|
|
FCLTHeader.Requires({ js: ["./room_schedule.js"] });
|
|
|
|
first=true;
|
|
|
|
function objSchedule(sdisc, res_van, res_tot, params)
|
|
{
|
|
params = params || {};
|
|
params.hour_px = params.hour_px || 48;
|
|
params.rsv_ruimte_key = params.rsv_ruimte_key || -1;
|
|
params.ch_obj_mode = params.ch_obj_mode || 0;
|
|
var res_h_px = params.hour_px * res_h;
|
|
|
|
mkDiv = function (theClass, h_start, h_end, theClick, theMouse, theOther)
|
|
{
|
|
var div;
|
|
var overleft="";
|
|
var overright="";
|
|
if (h_start<res_t1)
|
|
{
|
|
h_start = res_t1-res_h;
|
|
if (dagen > 0)
|
|
overleft = " continueleft";
|
|
else
|
|
overleft = " overflowleft";
|
|
}
|
|
|
|
if (h_end>res_t2)
|
|
{
|
|
h_end = res_t2+res_h;
|
|
if (dagen < nr_days-1)
|
|
overright = " continueright";
|
|
else
|
|
overright = " overflowright";
|
|
}
|
|
var px_start = (h_start-res_t1)*params.hour_px + 1; // 1 px speling
|
|
var px_end = (h_end-res_t1)*params.hour_px;
|
|
|
|
var px_width = px_end - px_start;
|
|
if (overleft!=""&&overright!="")
|
|
{ // Maak twee divjes, eentje links en eentje rechts.
|
|
// HTML kan maar één background image tegelijk aan
|
|
div = "<div class='"+theClass+overleft+"'"
|
|
+(theMouse||"")
|
|
+(theClick||"")
|
|
+(theOther||"")
|
|
+" style='left:"+px_start+"px;width:"+(px_width/2)+"px'>"
|
|
+" </div>";
|
|
div += "<div class='"+theClass+overright+"'"
|
|
+(theMouse||"")
|
|
+(theClick||"")
|
|
+(theOther||"")
|
|
+" style='left:"+(px_start+px_width/2)+"px;width:"+(px_width/2)+"px'>"
|
|
+" </div>";
|
|
}
|
|
else
|
|
{
|
|
div = "<div class='"+theClass+overleft+overright+"'"
|
|
+(theMouse||"")
|
|
+(theClick||"")
|
|
+(theOther||"")
|
|
+" style='left:"+px_start+"px;width:"+px_width+"px'>"
|
|
+" </div>";
|
|
}
|
|
return { div: div, overleft: overleft, overright: overright };
|
|
}
|
|
|
|
var readwrite = func_enabled[ "WEB_RESFOF"] || func_enabled[ "WEB_RESUSE"];
|
|
if( readwrite || func_enabled[ "WEB_RESFO2"] )
|
|
{ // MGE UWVA#12468: In FE planbord wordt obj_schedule.asp niet aangeroepen (Er wordt gechecked op !frontend).
|
|
// Bij invullen voorzieningen heeft FE wel recht op invoer als FE ALGwrite rechten heeft voor WEB_RESUSE
|
|
readwrite=(authparams.ALGwritelevel<9); // Ondersteun (FE) gebruikers met *alleen* FO-leesrechten: kijken planbord
|
|
|
|
if (params.rsv_ruimte_key>0) // single-reservering mode
|
|
{
|
|
sql = "SELECT ru.res_ruimte_begintijd"
|
|
+ ", ru.res_ruimte_eindtijd"
|
|
+ ", rr.alg_ruimte_key"
|
|
+ " FROM res_v_aanwezigruimte ru"
|
|
+ ", res_rsv_ruimte rr"
|
|
+ ", res_ruimte_opstelling ro"
|
|
+ " WHERE ru.res_ruimte_key = ro.res_ruimte_key"
|
|
+ " AND ro.res_ruimte_opstel_key = rr.res_ruimte_opstel_key"
|
|
+ " AND rr.res_rsv_ruimte_key = " + params.rsv_ruimte_key;
|
|
oRs = Oracle.Execute(sql);
|
|
if (!oRs.eof)
|
|
{
|
|
var alg_ruimte_key = oRs("alg_ruimte_key").value;
|
|
// Als de ruimte maar beperkt open is gaan we rekenen met een krappere res_t1/res_t2
|
|
var res_ruimte_begintijd = oRs("res_ruimte_begintijd").Value||res_t1;
|
|
var res_ruimte_eindtijd = oRs("res_ruimte_eindtijd").Value||res_t2;
|
|
if (res_ruimte_begintijd > res_ruimte_eindtijd) res_ruimte_begintijd = res_ruimte_eindtijd;
|
|
if (res_ruimte_begintijd > res_t1) res_t1 = res_ruimte_begintijd;
|
|
if (res_ruimte_eindtijd > res_t2) res_t2 = res_ruimte_eindtijd;
|
|
}
|
|
else // CV reserverering, altijd res_t1-res_t2
|
|
{
|
|
sql = "SELECT alg_ruimte_key"
|
|
+ " FROM res_rsv_ruimte"
|
|
+ " WHERE res_rsv_ruimte_key = " + params.rsv_ruimte_key;
|
|
oRs = Oracle.Execute(sql);
|
|
var alg_ruimte_key = oRs("alg_ruimte_key").value;
|
|
}
|
|
}
|
|
var loc_key = params.loc_key || -1;
|
|
|
|
isEdit = (params.ch_obj_mode > 0);
|
|
|
|
if (params.rsv_ruimte_key<0){
|
|
params.ch_obj_mode = 0;
|
|
}
|
|
|
|
if (isNaN(sdisc)) {
|
|
%>
|
|
<p><%=lcl_internal_error%>: obj_schedule.inc</p>
|
|
<%
|
|
}
|
|
else
|
|
{
|
|
ora_date1 = res_van.beginToSQL();
|
|
ora_date2 = res_tot.endToSQL();
|
|
|
|
var nr_days = 1+(res_tot.midnight() - res_van.midnight())/24/60/60/1000;
|
|
|
|
var sql, Autfunction;
|
|
var existing_res = {};
|
|
|
|
// Determine all existing reserved objects and store them in an array 'existing_res'
|
|
sql = "SELECT " // Via gewone reserveringen, die hebben res_rsv_ruimte_key
|
|
+ " rrd.RES_RSV_DEEL_VAN"
|
|
+ ", rrd.RES_RSV_DEEL_TOT"
|
|
+ ", rd.res_deel_key"
|
|
+ ", rr.res_status_fo_key"
|
|
+ ", rrd.res_rsv_deel_key"
|
|
+ ", rrd.res_rsv_deel_dirtlevel"
|
|
+ ", rrd.res_rsv_ruimte_key"
|
|
+ ", rr.alg_ruimte_key"
|
|
+ ", -1 bez_bezoekers_key"
|
|
+ ", rrd.res_status_bo_key"
|
|
+ " FROM res_v_aanwezigrsv_ruimte rr"
|
|
+ ", res_v_aanwezigdeel rd" //PF: aanwezig?
|
|
+ ", res_v_aanwezigrsv_deel rrd"
|
|
+ " WHERE rrd.res_rsv_deel_tot >= " + ora_date1
|
|
+ " AND rrd.res_rsv_deel_van <= " + ora_date2
|
|
+ " 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 = " + sdisc
|
|
|
|
if (sdisc==vis_parking_key)
|
|
sql = sql + " UNION ALL " //Die via afspraak/bezoekers (parkeerplaatsen)
|
|
+ "SELECT rrd.RES_RSV_DEEL_VAN"
|
|
+ ", rrd.RES_RSV_DEEL_TOT"
|
|
+ ", rd.RES_DEEL_KEY"
|
|
+ ", 2 res_status_fo_key" // altijd definitief
|
|
+ ", rrd.res_rsv_deel_key"
|
|
+ ", rrd.res_rsv_deel_dirtlevel"
|
|
+ ", rrd.RES_RSV_RUIMTE_KEY"
|
|
+ ", -1 ALG_RUIMTE_KEY"
|
|
+ ", rrd.bez_bezoekers_key"
|
|
+ ", rrd.res_status_bo_key"
|
|
+ " FROM RES_V_AANWEZIGDEEL RD"
|
|
+ ", RES_V_AANWEZIGRSV_DEEL rrd"
|
|
+ ", bez_bezoekers b"
|
|
+ ", bez_afspraak a"
|
|
+ " WHERE rrd.res_rsv_deel_tot >= " + ora_date1
|
|
+ " AND rrd.res_rsv_deel_van <= " + ora_date2
|
|
+ " AND rrd.res_deel_key = rd.res_deel_key"
|
|
+ " AND rrd.bez_bezoekers_key = b.bez_bezoekers_key"
|
|
+ " AND b.bez_afspraak_key = a.bez_afspraak_key"
|
|
+ " AND rrd.res_rsv_ruimte_key is null"
|
|
+ " AND rd.RES_DISCIPLINE_KEY="+sdisc
|
|
|
|
oRs = Oracle.Execute(sql);
|
|
while( !oRs.eof ) {
|
|
var res_d_key = oRs("RES_DEEL_KEY").Value;
|
|
|
|
if (! existing_res[res_d_key]) existing_res[res_d_key]=new Array();
|
|
|
|
|
|
existing_res[res_d_key].push({res_van : new Date(oRs("RES_RSV_DEEL_VAN").Value),
|
|
res_tot : new Date(oRs("RES_RSV_DEEL_TOT").Value),
|
|
rsv_ruimte_key : oRs("RES_RSV_RUIMTE_KEY").Value,
|
|
status_fo_key : oRs("res_status_fo_key").Value,
|
|
dirtlevel : oRs("res_rsv_deel_dirtlevel").Value,
|
|
rsv_deel_key : oRs("res_rsv_deel_key").Value,
|
|
alg_ruimte_key : oRs("ALG_RUIMTE_KEY").Value,
|
|
bez_key : oRs("bez_bezoekers_key").Value,
|
|
res_status : oRs("res_status_bo_key").Value
|
|
});
|
|
|
|
oRs.MoveNext();
|
|
}
|
|
oRs.close();
|
|
|
|
var onclick = "";
|
|
if (readwrite&&!params.jumped)
|
|
onclick = "onclick=obj_table_click(parseInt(window.event.offsetX)/"+params.hour_px+"+"+res_t1+",'"+urole+"')";
|
|
|
|
%>
|
|
<table id="table_dis<%=sdisc%>" class="tab_obj_sched planbord planbord<%=params.hour_px%>" cellspacing="0"
|
|
<%=onclick%>
|
|
>
|
|
<%//// Extra regel met losse cellen om afmetingen te forceren%>
|
|
|
|
<tr>
|
|
<td><label><%=lcl_item%></label></td>
|
|
<% res.emit_planbord_tijdbalk(res_van, nr_days, hour_px); %>
|
|
</tr>
|
|
<%
|
|
var showOnlyOddHours = ((res_t2 - res_t1) >= res_roomplan_skiplimit)
|
|
var mod_t1 = (res_t1 % (showOnlyOddHours?2:1)); // bepaal restwaarde
|
|
if (mod_t1 == 0) mod_t1 = (showOnlyOddHours?2:1); // als even dan restwaarde is 1 of 2
|
|
|
|
var select_fields = " r.res_deel_key"
|
|
+ ", r.res_deel_opmerking"
|
|
+ ", d.ins_deel_omschrijving"
|
|
+ ", r.res_deel_prijs"
|
|
+ ", r.res_deel_eenheid";
|
|
var group_by = " GROUP BY " + select_fields + " ORDER BY 3 "; // d.ins_deel_omschrijving: Don't use column alias with UNION ...
|
|
|
|
if (params.rsv_ruimte_key>0) {
|
|
// Iterate through all reservable objects (vertically) and show schedule for them (horizontally)
|
|
var n=0,res_deel_key,free,rsv_ruimte_key;
|
|
|
|
var sql1 = getReservedObjectTypes(alg_ruimte_key, params.rsv_ruimte_key, select_fields, loc_key, sdisc, group_by);
|
|
|
|
} else {
|
|
// We hebben dus géén alg_ruimte_key én géén res_rsv_ruimte_key
|
|
// Deze tak wordt o.a. gebruikt in het grote planbord als je onderin openklapt
|
|
// Scope is hierbij heel anders?
|
|
// Iterate through all reservable objects (vertically) and show schedule for them (horizontally)
|
|
// Er geldt: params.rsv_ruimte_key == NULL en alg_ruimte_key == NULL
|
|
var n=0, res_deel_key, free, rsv_ruimte_key;
|
|
|
|
var sql1 = "SELECT " + select_fields
|
|
+ " FROM ins_deel d,"
|
|
+ " res_v_aanwezigdeel r "
|
|
+ " WHERE r.res_discipline_key="+sdisc
|
|
+ " AND r.res_ins_deel_key=d.ins_deel_key"
|
|
+ ((loc_key > -1)
|
|
? " AND d.ins_alg_locatie_key=" + loc_key
|
|
: "")
|
|
+ " AND d.ins_alg_ruimte_type IN ('R','T')"
|
|
+ ((authparams.ALGreadlevel>-1)
|
|
? " AND d.ins_alg_locatie_key IN "
|
|
+ " (SELECT alg_locatie_key "
|
|
+ " FROM fac_v_my_locations l, fac_v_webgebruiker gg "
|
|
+ " WHERE l.prs_perslid_key="+user_key
|
|
+ " AND l.prs_perslid_key = gg.prs_perslid_key "
|
|
+ " AND niveau = gg.fac_gebruiker_alg_level_write "
|
|
+ " AND gg.ins_discipline_key=" + sdisc
|
|
+ " AND gg.fac_functie_key = " + authparams.autfunctionkey+")"
|
|
: "")
|
|
+ " UNION "
|
|
+ " SELECT r.res_deel_key"
|
|
+ ", r.res_deel_opmerking"
|
|
+ ", d.ins_deel_omschrijving"
|
|
+ ", r.res_deel_prijs"
|
|
+ ", r.res_deel_eenheid"
|
|
+ " FROM ins_deel d, res_v_aanwezigdeel r "
|
|
+ " WHERE r.res_discipline_key="+sdisc
|
|
+ " AND r.res_ins_deel_key = d.ins_deel_key "
|
|
+ " AND d.ins_alg_ruimte_type = 'T' "
|
|
+ ((authparams.ALGreadlevel>-1)
|
|
? "AND d.ins_alg_locatie_key IN "
|
|
+ " (SELECT alg_locatie_key "
|
|
+ " FROM fac_v_my_locations l, fac_v_webgebruiker gg "
|
|
+ " WHERE l.prs_perslid_key = " + user_key
|
|
+ " AND l.prs_perslid_key = gg.prs_perslid_key "
|
|
+ " AND niveau = gg.fac_gebruiker_alg_level_write "
|
|
+ " AND gg.ins_discipline_key = " + sdisc
|
|
+ " ADN gg.fac_functie_key = " + authparams.autfunctionkey+")"
|
|
: "")
|
|
+ group_by;
|
|
}
|
|
|
|
oRs = Oracle.Execute(sql1);
|
|
var cnt = 0;
|
|
var any_nofit = false;
|
|
while( !oRs.eof ) { // Doorloop reserveerbare delen binnen filter
|
|
res_deel_key = oRs("RES_DEEL_KEY").value;
|
|
ins_deel_omschrijving = escape2(oRs("INS_DEEL_OMSCHRIJVING").value);
|
|
ins_deel_omschrijving = replace( ins_deel_omschrijving , "\n" , "<br>" );
|
|
res_deel_prijs = oRs("RES_DEEL_PRIJS").Value;
|
|
res_deel_eenheid = oRs("RES_DEEL_EENHEID").Value;
|
|
var res_deel_opm = escape_js(oRs("RES_DEEL_OPMERKING").value);
|
|
|
|
var res_deel_opm2 = oRs("RES_DEEL_OPMERKING").value; //escape2(oRs("RES_DEEL_OPMERKING").value);
|
|
res_deel_opm2 = replace( res_deel_opm2 , "\n" , "<br>" );
|
|
res_deel_opm2 = replace( res_deel_opm2 , "\r" , "" );
|
|
res_deel_opm2 = replace( res_deel_opm2 , "'" , "\\'" );
|
|
res_deel_opm2 = escape2(res_deel_opm2);
|
|
|
|
if (res_deel_eenheid == null) res_deel_eenheid='';
|
|
else res_deel_eenheid='/'+res_deel_eenheid;
|
|
|
|
if( res_deel_prijs && res_deel_prijs != 0)
|
|
{
|
|
prijs_text = currency_pref + num2curr(res_deel_prijs)+currency_suff+res_deel_eenheid;
|
|
prijs_text = escape2(prijs_text);
|
|
}
|
|
else
|
|
{
|
|
prijs_text = '';
|
|
res_deel_prijs = 0.0;
|
|
}
|
|
|
|
var ar = existing_res[res_deel_key]; // Bestaande reserveringen op dit deel
|
|
|
|
var v1 = "", v2 = "", v3 = "", v4 = "", v5 = "", checked = '', ro = " readonly ", st = false;
|
|
//__Log("isEdit: " + res_deel_key)
|
|
if (isEdit) {
|
|
// check whether the current resource is reserved for the current reservation
|
|
var is_selected = false;
|
|
var is_nofit = false; // zouden we hier passen?
|
|
|
|
if (res_deel_key==params.res_deel_key) // default keuze
|
|
{
|
|
is_selected = true;
|
|
ro=false;
|
|
st = false;
|
|
};
|
|
for (ci=0; ar != null && ci<ar.length; ci++)
|
|
{
|
|
if (ar[ci].rsv_ruimte_key == params.rsv_ruimte_key)
|
|
{ // we zijn het zelf
|
|
is_selected = true;
|
|
ro = (ar[ci].res_status==6?" readonly ":"");
|
|
st = (ar[ci].res_status==6);
|
|
}
|
|
else
|
|
{
|
|
if (res_van < ar[ci].res_tot && res_tot > ar[ci].res_van)
|
|
is_nofit = true; // Overlap!
|
|
}
|
|
}
|
|
any_nofit |= is_nofit;
|
|
}
|
|
%>
|
|
<tr class="<%=is_selected?' selected':''%><%=is_nofit?' res_nofit':''%>" id='<%=res_deel_key%>'>
|
|
<td class='label'>
|
|
<% if (is_selected) { %>
|
|
<input name='has_<%=res_deel_key%>' type='hidden'>
|
|
<% } %>
|
|
<label OnMouseOver="$('#remark<%=res_deel_key%>').show();"
|
|
OnMouseOut="$('#remark<%=res_deel_key%>').hide();">
|
|
<input id='chk_<%=res_deel_key%>' name='chk_<%=res_deel_key%>'
|
|
type='checkbox' <%=is_selected?'checked':''%>
|
|
<% if (!st&&!params.jumped) { %>
|
|
onClick="javascript:res_deel_click('rdeel<%=res_deel_key%>','<%=res_deel_key%>')"
|
|
<% } %>>
|
|
<div class="ref" id='a_<%=res_deel_key%>' style='display:inline'>
|
|
<nobr><%=ins_deel_omschrijving + (isEdit ? '':(prijs_text?' ('+prijs_text+')':'')) %></nobr>
|
|
</div>
|
|
<div class="res_remark" id="remark<%=res_deel_key%>">
|
|
<%="<b>" + ins_deel_omschrijving + ":</b><br>" + res_deel_opm2%>
|
|
</div>
|
|
</label>
|
|
</td>
|
|
|
|
<%
|
|
divver = { overleft: "", overright: "" };
|
|
|
|
for (dagen=0; dagen<nr_days; dagen++)
|
|
{
|
|
%>
|
|
<td class="plantd reserv">
|
|
<%
|
|
// Maak een dummy res_nieuw aan die we eenvoudig aan kunnen zetten
|
|
if (!is_selected || res_deel_key==params.res_deel_key)
|
|
{
|
|
var h_start = (res_van - res_van.midnight()) /1000/60/60 - 24*dagen;
|
|
var h_end = (res_tot - res_tot.midnight()) /1000/60/60 + 24*(nr_days-1-dagen);
|
|
var new_divver = mkDiv("gepland res_nieuw", h_start, h_end);
|
|
Response.Write("\n"+new_divver.div);
|
|
}
|
|
|
|
for (ci=0; ar && ci<ar.length; ci++)
|
|
{
|
|
var statClass = { 1 : "res_optie",
|
|
2 : "res_definitief",
|
|
3 : "res_blok",
|
|
4 : "res_vervallen"}[ar[ci].status_fo_key ];
|
|
|
|
if (ar[ci].rsv_ruimte_key == params.rsv_ruimte_key)
|
|
statClass += " res_current";
|
|
|
|
if (ar[ci].dirtlevel & (res.dirtlevel.deel.notavailable | res.dirtlevel.deel.notallowed))
|
|
statClass += " res_fatal";
|
|
|
|
theClass = statClass + " gepland";
|
|
|
|
if (ar[ci].dirtlevel & res.dirtlevel.ruimte.notavailable)
|
|
theClass += " res_fatal";
|
|
|
|
var h_start = (ar[ci].res_van - res_van.midnight()) /1000/60/60 - 24*dagen;
|
|
var h_end = (ar[ci].res_tot - res_tot.midnight()) /1000/60/60 + 24*(nr_days-1-dagen);
|
|
if (h_start>24 || h_end < 0)
|
|
continue;
|
|
|
|
rsv_ruimte_key = ar[ci].rsv_ruimte_key;
|
|
rsv_deel_key = ar[ci].rsv_deel_key;
|
|
alg_ruimte_key = isNaN(ar[ci].alg_ruimte_key) ? -1 :ar[ci].alg_ruimte_key;
|
|
bez_key = ar[ci].bez_key;
|
|
|
|
var theClick = "";
|
|
var theMouse="";
|
|
|
|
if (bez_key > 0)
|
|
theMouse = " onMouseOver='setBezBezoekersTitle(this, "+bez_key+")'";
|
|
else
|
|
theMouse = " onMouseOver='setResRsvDeelTitle(this, "+rsv_deel_key+")'";
|
|
if (readwrite&&bez_key==-1&&!params.jumped)
|
|
{
|
|
theClick = ' onClick="rsv_click(this,\''+urole+'\');"'
|
|
theClass += " click";
|
|
}
|
|
else
|
|
if (readwrite&&!params.jumped)
|
|
theClick =" onClick=noCClick()"
|
|
|
|
divver = mkDiv(theClass, h_start, h_end, theClick, theMouse, " rsv_key='" + rsv_ruimte_key + "'");
|
|
Response.Write("\n"+divver.div);
|
|
}
|
|
|
|
if (dagen<nr_days-1) { %>
|
|
<td class="between"><div class=" <%=divver.overright!=""?statClass:""%>"> </div></td>
|
|
<% } else { %>
|
|
<td class="post <%=divver.overright%>"><div> </div></td>
|
|
<% } %>
|
|
<%
|
|
} // dagen
|
|
%> </tr>
|
|
<%
|
|
oRs.MoveNext();
|
|
n++;
|
|
} //end while
|
|
oRs.close();
|
|
%>
|
|
<tr>
|
|
<td></td>
|
|
<% res.emit_planbord_tijdbalk(res_van, nr_days, hour_px); %>
|
|
</tr>
|
|
</table>
|
|
<%
|
|
if (any_nofit)
|
|
%><span onclick="$('.res_nofit').css('display','block');$(this).toggle();$(this).next().toggle()">
|
|
TODO: Alleen beschikbare objecten getoond. Toon alles.
|
|
</span>
|
|
<span onclick="$('.res_nofit').css('display','none');$(this).toggle();;$(this).prev().toggle()" style='display:none'>
|
|
TODO: Alle objecten getoond. Toon alleen beschikbare.
|
|
</span><%
|
|
}
|
|
}//readwrite
|
|
} // function objSchedule()
|
|
%> |