Files
Facilitor/APPL/RES/res_plan_obj.inc
2009-11-02 15:44:52 +00:00

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'>"
+"&nbsp;</div>";
div += "<div class='"+theClass+overright+"'"
+(theMouse||"")
+(theClick||"")
+(theOther||"")
+" style='left:"+(px_start+px_width/2)+"px;width:"+(px_width/2)+"px'>"
+"&nbsp;</div>";
}
else
{
div = "<div class='"+theClass+overleft+overright+"'"
+(theMouse||"")
+(theClick||"")
+(theOther||"")
+" style='left:"+px_start+"px;width:"+px_width+"px'>"
+"&nbsp;</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:""%>">&nbsp;</div></td>
<% } else { %>
<td class="post <%=divver.overright%>"><div>&nbsp;</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()
%>