Files
Facilitor/APPL/RES/res_show_objcat.asp
Erik Groener 45916f3d08 UWVA#88793 Datummogelijkheden verbruiksartikelen catalogus per locatie
svn path=/Website/branches/v2025.3/; revision=70886
2025-11-11 10:18:46 +00:00

835 lines
46 KiB
Plaintext

<%@ language = "JavaScript" %>
<% /*
$Revision$
$Id$
File: res_show_objcat.asp (oude rsv_voorziening_view.inc)
Description: Show the objects en voorzieningen of a reservation part
Parameters:
res_rsv_ruimte RES_RSV_RUIMTE_KEY, de deelreservering
Context:
in een frame binnen het reserveringsscherm
in de inline?
*/
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="../Shared/resultset_table_v2.inc" -->
<!-- #include file="../ins/ins.inc" -->
<!-- #include file="./res.inc" -->
<!-- #include file="res_flexkenmerk_art.inc" -->
<%
FCLTHeader.Requires({ js: [],
css: [rooturl + "/appl/res/res.css"] });
var urole = getQParamSafe("urole");
var rsv_ruimte_key = getQParamInt("rsv_ruimte_key");
var embedded = getQParamInt("embedded", 0) == 1;
var verynew = getQParamInt("verynew", 0) == 1;
var this_res = res.func_enabled(rsv_ruimte_key); // Wat heb ik zoal aan rechten op deze specifieke reservering
user.auth_required_or_abort(this_res.canReadAny);
// Finds required res_kenmerken (regular or of type 'M'(bijlagen))
// that are either missing or have no value for a specific reservation.
var mywriterolcode = 0 + (this_res.canWrite("WEB_RESUSE") ? 1 : 0)
+ (this_res.canWrite("WEB_RESFOF") ? 2 : 0)
+ (this_res.canWrite("WEB_RESBOF") ? 4 : 0);
var sql = "SELECT COUNT (*) amount"
+ " FROM res_rsv_ruimte rrr"
+ " JOIN res_activiteit ra"
+ " ON rrr.res_activiteit_key = ra.res_activiteit_key"
+ " JOIN res_kenmerk rk ON rk.res_activiteit_key = ra.res_activiteit_key"
+ " LEFT JOIN res_kenmerkwaarde rkw"
+ " ON rk.res_kenmerk_key = rkw.res_kenmerk_key"
+ " AND rrr.res_rsv_ruimte_key = rkw.res_rsv_ruimte_key"
+ " LEFT JOIN"
+ " ( SELECT fac_bijlagen_refkey,"
+ " fac_bijlagen_kenmerk_key,"
+ " COUNT (*) AS aantal"
+ " FROM fac_bijlagen"
+ " WHERE fac_bijlagen_module = 'RES'"
+ " GROUP BY fac_bijlagen_refkey, fac_bijlagen_kenmerk_key) bijlagen"
+ " ON rrr.res_rsv_ruimte_key = bijlagen.fac_bijlagen_refkey"
+ " AND rk.res_kenmerk_key = bijlagen.fac_bijlagen_kenmerk_key"
+ " JOIN res_srtkenmerk rsk"
+ " ON rk.res_srtkenmerk_key = rsk.res_srtkenmerk_key"
+ " WHERE rrr.res_rsv_ruimte_key = " + rsv_ruimte_key
+ " AND rk.res_kenmerk_verplicht = 1"
+ " AND rk.res_kenmerk_verwijder IS NULL"
+ " AND BITAND(rk.res_kenmerk_rolcode, " + mywriterolcode + ") > 0"
+ " AND rk.res_kenmerk_show_expr IS NULL" // We gaan deze niet inline evalueren; als er een show-expressie bestaat, sluiten we deze uit
+ " AND rk.fac_functie_key IS NULL" // Idem; We gaan deze niet inline evalueren; als er een extra autorisatie bestaat, sluiten we deze uit
+ " AND (rk.res_kenmerk_toonbaar IS NULL OR rk.res_kenmerk_toonbaar = 0)" // Volgens mij altijd NULL of 1, maar voor de zekerheid ..
+ " AND rsk.res_srtkenmerk_kenmerktype NOT IN ('L', 'l', 'b', 'Q')"
+ " AND ( ( rsk.res_srtkenmerk_kenmerktype = 'M'"
+ " AND bijlagen.aantal IS NULL)"
+ " OR ( rsk.res_srtkenmerk_kenmerktype != 'M'"
+ " AND rkw.res_kenmerkreservering_waarde IS NULL))";
var oRs = Oracle.Execute(sql);
var hasMissingRequiredKenmerk = (oRs("amount").Value >= 1);
oRs.Close();
if(!hasMissingRequiredKenmerk) {
// Merk op: (later) verwijderde records of parkeerplaatsen zouden we hier weer kunnen
// uitsluiten. Dat is echter al weer te complex/ licht risicovol
cache.whenNoRecords("SELECT 1 FROM res_rsv_deel WHERE res_rsv_ruimte_key = " + rsv_ruimte_key
+ " UNION ALL SELECT 1 FROM res_rsv_artikel WHERE res_rsv_ruimte_key = " + rsv_ruimte_key);
}
res.res_set_dialect(rsv_ruimte_key);
var resdeleted = this_res.rsv_ruimte_verwijder != null;
// Als res_rsv_ruimte_cat_appr 0 is hoeft er niet gefiatteerd te worden, zelfs niet als de drempel later is verlaagd.
var sql = "SELECT sa.res_srtactiviteit_prefix"
+ " , rrr.res_reservering_key"
+ " , rrr.res_rsv_ruimte_van"
+ " , rrr.res_rsv_ruimte_tot"
+ " , ro.res_ruimte_key"
+ " , rrr.res_rsv_ruimte_volgnr"
+ " , CASE"
+ " WHEN sa.res_srtactiviteit_prefix IS NOT NULL"
+ " THEN sa.res_srtactiviteit_prefix || ' '"
+ " ELSE ''"
+ " END"
+ " || rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr resnrtxt"
+ " , rrr.res_rsv_ruimte_cat_appr"
+ " , sa.res_srtactiviteit_soort"
+ " FROM res_rsv_ruimte rrr"
+ " , res_activiteit ra"
+ " , res_srtactiviteit sa"
+ " , res_ruimte_opstelling ro"
+ " WHERE rrr.res_activiteit_key = ra.res_activiteit_key"
+ " AND ra.res_srtactiviteit_key = sa.res_srtactiviteit_key"
+ " AND rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key (+)"
+ " AND rrr.res_rsv_ruimte_key = " + rsv_ruimte_key;
var oRs = Oracle.Execute(sql);
var res_van = new Date(oRs("res_rsv_ruimte_van").Value);
var res_tot = new Date(oRs("res_rsv_ruimte_tot").Value);
var res_ruimte_key = oRs("res_ruimte_key").Value;
var resnrtxt = oRs("resnrtxt").Value;
var hasFiat = oRs("res_rsv_ruimte_cat_appr").Value == 1;
var isCV = oRs("res_srtactiviteit_soort").Value == 1;
oRs.Close();
%>
<html>
<head>
<% FCLTHeader.Generate() %>
<script>
var anyDirty = false;
var hasMissingRequiredKenmerk = <%=hasMissingRequiredKenmerk ? 1 : 0%>;
function res_change()
{
if(hasMissingRequiredKenmerk) {
FcltMgr.alert(L("lcl_shared_validator_missing"));
window.parent.$("#frametabs").tabs({ "active": 0 });
} else {
if (FcltMgr.startEdit(window)) {
var newurl = "res_edit_objcat.asp?urole=<%=this_res.canChangeUrole%>&rsv_ruimte_key=<%=rsv_ruimte_key%>&verynew=<%=verynew? 1 : 0%>&width_px=" + $(window).width();
if (anyDirty && confirm (L("lcl_res_cleanup_invalid_objcat"))) // opschonen?
{
var data = {
urole: "<%=urole%>",
rsv_ruimte_key: <%=rsv_ruimte_key%>
};
<% protectRequest.dataToken("data"); %>
$.post("res_cleanup.asp",
data,
FcltCallbackAndThen(function (data) {
anyDirty = false;
window.location.href = newurl;
}),"json");
}
else
window.location.href = newurl;
}
}
}
function res_fiatteren()
{ // Voor alle rsv_artikel regels het veld res_rsv_artikel_approved de waarde 1 geven.
FcltMgr.confirm("<%=safe.jsstring(L("lcl_res_fiatteren_art").format(resnrtxt))%>", function()
{
var data = { rsv_ruimte_key: <%=rsv_ruimte_key%> };
<% protectRequest.dataToken("data"); %>
$.post("res_fiatteren.asp",
data,
FcltCallbackRefresh,
"json"
);
});
}
function res_afwijzen()
{ // Voor alle rsv_artikel regels het veld res_rsv_artikel_approved de waarde 2 geven.
var subject = "<%=safe.jsstring(L("lcl_res_afwijzen_art").format(resnrtxt))%>";
var url = "res_afwijzen.asp?rsv_ruimte_key=<%=rsv_ruimte_key%>";
FcltMgr.openModalDetail(url, subject, {callback: window.parent.FcltMgr.reload });
}
function insCheckIn(row)
{
var rsv_deel_key = row.getAttribute("ROWKEY");
FcltMgr.openDetail("appl/ins/ins_deel_free.asp?takein=1&rsv_deel_key="+rsv_deel_key,
L("lcl_ins_insinn"), {callback: FcltMgr.reload});
}
function insCheckOut(row)
{
var rsv_deel_key = row.getAttribute("ROWKEY");
FcltMgr.openDetail("appl/INS/ins_deel_free.asp?lendout=1&rsv_deel_key="+rsv_deel_key,
L("lcl_ins_lend_out"), {callback: FcltMgr.reload});
}
// Uitleen flexkenmerken bewerken.
function insAdapt(row)
{
var rsv_deel_key = row.getAttribute("ROWKEY");
FcltMgr.openDetail("appl/ins/ins_deel_free.asp?adapt=1&rsv_deel_key="+rsv_deel_key,
L("lcl_ins_adapt"), {callback: FcltMgr.reload});
}
</script>
</head>
<body class="listmode">
<% var buttons = [];
if (this_res.canChangeCV)
buttons.push( { title: (this_res.hasCV ? L("lcl_change") : L("lcl_add")), icon: (this_res.hasCV ? "fa-fclt-edit" : "fa-plus"), action: "res_change()"});
if (this_res.canFiatteren)
buttons.push( {title: L("lcl_approve"), icon: "fa-check", action: "res_fiatteren()"});
if (this_res.canAfwijzen)
buttons.push( {title: L("lcl_reject"), icon: "fa-times", action: "res_afwijzen()"});
// Fast checks to see if we have any prices at all, to prevent superfluous column
// We beschouwen dit nu als een businessrule: helemaal nergens bedragen. Mocht er behoefte
// aan komen is het logisch dit per ins_discipline_min_level te bepalen (want die worden
// nooit gecombineerd), maar verfijnder willen we niet.
var sql = "SELECT ''"
+ " FROM res_deel"
+ " WHERE (res_deel_prijs IS NOT NULL OR res_deel_prijs_vast = 0)" // prijs is mogelijk
+ " AND (res_deel_vervaldatum IS NULL OR res_deel_vervaldatum > SYSDATE)" // actueel relevant
+ " AND res_deel_verwijder IS NULL"; // niet historisch
var oRs = Oracle.Execute(sql);
var anydeelprijs = !oRs.eof;
oRs.close();
sql = "SELECT ''"
+ " FROM res_artikel"
+ " WHERE (res_artikel_prijs IS NOT NULL OR res_artikel_prijs_vast = 0)"
+ " AND (res_artikel_vervaldatum IS NULL OR res_artikel_vervaldatum > SYSDATE)"
+ " AND res_artikel_verwijder IS NULL";
oRs = Oracle.Execute(sql);
var anyartikelprijs = !oRs.eof;
oRs.close();
if (rsv_ruimte_key > 0)
{
var total_price = 0;
var r_price = 0;
function fnOmschrijving(oRs)
{
var returnval = "";
// Voor objecten de autorisatie opvragen om eventueel door te kunnen klikken (omdat dat bij personen ook kan)
var this_ins = {canReadAny: false};
if (oRs("ins_deel_key").Value != null) // alleen als res_deel is ins_deel
{
this_ins = ins.func_enabled_deel(oRs("ins_deel_key").Value);
var action = ""; // default geen doorklik
if (this_ins.canReadAny)
{
// doorklikbaar naar objectdetails, voor details of om uit te lenen
if (oRs("ins_srtdeel_uitleenbaar").Value == 1 && this_ins.canWriteINSFOF)
action = 'FcltMgr.openDetail("appl/ins/ins_deel.asp?urole=fo&ins_key=' + oRs('ins_deel_key').value + '"); FcltMgr.stopPropagation(event);';
else
action = 'FcltMgr.openDetail("appl/ins/ins_deel.asp?urole=bo&ins_key=' + oRs('ins_deel_key').value + '"); FcltMgr.stopPropagation(event);';
}
returnval = (action == "" ? safe.html(oRs("res_deel_omschrijving").value) + " "
: "<a href='#' onclick='" + action + "'>" + safe.html(oRs("res_deel_omschrijving").value) + "</a> ")
+ (oRs("res_rsv_deel_prijs").value != 0 ? (oRs("inclBTW").value ? L("lcl_shared_inclBTW") : L("lcl_shared_exclBTW")) : "")
+ (oRs("verval").value == 0 ? L("lcl_inactive_data_suffix") : "");
}
else
{ // persoonlijke resource
// TODO: hier ook autorisatie checken of ik wel door mag klikken
var action = 'FcltMgr.openDetail("appl/prs/prs_perslid.asp?urole=fe&prs_key=' + oRs('prs_perslid_key').value + '"); FcltMgr.stopPropagation(event);';
returnval = "<a href='#' onclick='" + action + "'>" + safe.html(oRs("res_deel_omschrijving").value) + "</a> " + safe.html(oRs("prs_srtperslid_omschrijving").value) + " "
+ (oRs("res_rsv_deel_prijs").value != 0 ? (oRs("inclBTW").value? L("lcl_shared_inclBTW") : L("lcl_shared_exclBTW")) : "")
+ (oRs("verval").value == 0? L("lcl_inactive_data_suffix") : "");
}
return returnval;
}
function fnImage (oRs)
{
return oRs("ins_discipline_image").value ? I(oRs("ins_discipline_image").value+" fa-2x") : ""; // defaultje?
}
function fnVantijd(oRs)
{
// Als Van en Tot verschillen tonen we de datum erbij, anders alleen de tijd
var vanDateString = (new Date(oRs("res_rsv_deel_tot").value).midnight().getTime() != new Date(oRs("res_rsv_deel_van").value).midnight().getTime() ? toDateTimeString(new Date(oRs("res_rsv_deel_van").value)) : toTimeString(new Date(oRs("res_rsv_deel_van").value)))
if (oRs("vanbinnentijd").value == 0)
vanDateString = "<span class='outofbounds'>" + vanDateString + "</span>";
return vanDateString;
}
function fnTottijd(oRs)
{
// Als Van en Tot verschillen tonen we de datum erbij, anders alleen de tijd
var totDateString = (new Date(oRs("res_rsv_deel_tot").value).midnight().getTime() != new Date(oRs("res_rsv_deel_van").value).midnight().getTime() ? toDateTimeString(new Date(oRs("res_rsv_deel_tot").value)) : toTimeString(new Date(oRs("res_rsv_deel_tot").value)))
if (oRs("totbinnentijd").value == 0)
totDateString = "<span class='outofbounds'>" + totDateString + "</span>";
return totDateString;
}
function fnTijd(oRs)
{
if ( oRs("levbinnentijd").value == 1 )
return toTimeString(new Date(oRs("res_rsv_artikel_levering").value));
else
return "<span class='outofbounds'>" + toTimeString(new Date(oRs("res_rsv_artikel_levering").value)) + "</span>";
}
function fnAfhaaltijd(oRs)
{
if (oRs("res_rsv_artikel_afhalen").Value != null)
{
return toTimeString(new Date(oRs("res_rsv_artikel_afhalen").Value));
}
else
{
return "";
}
}
var anyDirty = false;
function fnRowClassObj(oRs)
{
if (oRs("verval").value == 0 || oRs("res_rsv_deel_dirtlevel").value & (res.dirtlevel.deel.notavailable | res.dirtlevel.deel.notallowed))
{
anyDirty = true;
return "res_fatal";
}
else
{
return "xx";
}
}
function fnRowClassCat(oRs)
{
var active_artikel = (oRs("ingang").value == 1 && oRs("verval").value == 1);
if (!active_artikel || (oRs("res_rsv_artikel_dirtlevel").value & (res.dirtlevel.artikel.notallowed)))
{
anyDirty = true;
return "res_fatal";
}
else
return "xx";
}
function fnrowActionEnabler(oRs)
{
var data = {eLendOut: false, eReceive: false, eAdapt: false };
if (oRs("ins_srtdeel_uitleenbaar").Value == 1)
{
// TODO: We negeren de 3D scope vooralsnog. Veel te ingewikkeld met org-velden en dergelijke
// Eerst maar even praktijkgeluiden afwachten
// user.checkAutorisation cache't per discipline dus dat is te overzien.
// LET OP: Hier dus de ins_discipline_key, niet de res_discipline_key
var authparams = user.checkAutorisation("WEB_INSFOF", true, oRs("ins_discipline_key").Value);
if (authparams && authparams.PRSwritelevel < 9)
{
data.eLendOut = oRs("ins_alg_ruimte_key_org").value == null;
data.eReceive = !data.eLendOut;
if (oRs("bewerkbaar").Value == 1)
{
data.eAdapt = data.eReceive;
}
}
}
return data;
}
var nonBulkFields = lcl.xsqla('rd.res_deel_omschrijving', 'rd.res_deel_key')
+ " , 0 total"
+ " , id.ins_alg_ruimte_key_org"
+ " , id.ins_deel_key"
+ " , id.ins_discipline_key"
+ " , ins_srtdeel_uitleenbaar"
+ " , rd.res_discipline_key"
+ " , d.ins_discipline_image"
+ " , " + lcl.xsqla("d.ins_discipline_omschrijving", "d.ins_discipline_key")
+ " , d.ins_discipline_volgnr"
+ " , rrd.res_rsv_deel_key"
+ " , rrd.res_rsv_deel_aantal"
+ " , res.getdeelprijs(rrd.res_rsv_deel_key) res_rsv_deel_prijs" // zou je achterwege kunnen laten als !anydeelprijs
+ " , rrd.res_rsv_deel_van"
+ " , rrd.res_rsv_deel_tot"
+ " , rrd.res_rsv_deel_dirtlevel"
+ " , CASE WHEN k.km900 > 0 THEN 1 ELSE 0 END bewerkbaar"
+ " , rrd.res_rsv_deel_verwijder ddVerwijder"
+ " , CASE "
+ " WHEN (rrd.res_rsv_deel_van BETWEEN res_rsv_ruimte_van"
+ " AND res_rsv_ruimte_tot"
+ " )"
+ " THEN 1"
+ " ELSE 0"
+ " END vanbinnentijd,"
+ " CASE "
+ " WHEN (rrd.res_rsv_deel_tot BETWEEN res_rsv_ruimte_van"
+ " AND res_rsv_ruimte_tot"
+ " )"
+ " THEN 1"
+ " ELSE 0"
+ " END totbinnentijd"
+ " , CASE WHEN id.ins_alg_ruimte_type_org IS NOT NULL AND ins_alg_ruimte_type = 'P'"
+ " THEN (SELECT pf.prs_perslid_naam_friendly"
+ " FROM prs_v_perslid_fullnames_all pf"
+ " WHERE pf.prs_perslid_key = id.ins_alg_ruimte_key)"
+ " WHEN id.ins_alg_ruimte_type_org IS NOT NULL AND ins_alg_ruimte_type = 'C'"
+ " THEN (SELECT c.prs_contactpersoon_naam"
+ " FROM prs_contactpersoon c"
+ " WHERE id.ins_alg_ruimte_key = c.prs_contactpersoon_key)"
+ " END eigenaar"
+ " , COALESCE (ks.prs_kostensoort_btw, 0) inclbtw"
+ " , CASE"
+ " WHEN (rd.res_deel_vervaldatum IS NULL OR rd.res_deel_vervaldatum > rr.res_rsv_ruimte_tot)"
+ " THEN 1"
+ " ELSE 0"
+ " END verval"
+ " , p.prs_perslid_key,"
+ lcl.xsqla('sp.prs_srtperslid_omschrijving', 'p.prs_srtperslid_key') // TODO, Diensten en zo, wat kan deze man?
+ " , 0 isbulk";
var bulkFields = " distinct "
+ lcl.xsql('rd.res_deel_omschrijving', 'rd.res_deel_key') + " || ' (' || sel.selected || '/' || cnt.total || ')'" + " res_deel_omschrijving"
+ " , cnt.total"
+ " , id.ins_alg_ruimte_key_org"
+ " , id.ins_deel_key"
+ " , id.ins_discipline_key"
+ " , ins_srtdeel_uitleenbaar"
+ " , rd.res_discipline_key"
+ " , d.ins_discipline_image"
+ " , " + lcl.xsqla("d.ins_discipline_omschrijving", "d.ins_discipline_key")
+ " , d.ins_discipline_volgnr"
+ " , rrd.res_rsv_deel_key"
+ " , rrd.res_rsv_deel_aantal"
+ " , sel.selected * res.getdeelprijs(rrd.res_rsv_deel_key) res_rsv_deel_prijs" // zou je achterwege kunnen laten als !anydeelprijs
+ " , rrd.res_rsv_deel_van"
+ " , rrd.res_rsv_deel_tot"
+ " , rrd.res_rsv_deel_dirtlevel"
+ " , CASE WHEN k.km900 > 0 THEN 1 ELSE 0 END bewerkbaar"
+ " , rrd.res_rsv_deel_verwijder ddVerwijder"
+ " , CASE "
+ " WHEN (rrd.res_rsv_deel_van BETWEEN res_rsv_ruimte_van"
+ " AND res_rsv_ruimte_tot"
+ " )"
+ " THEN 1"
+ " ELSE 0"
+ " END vanbinnentijd,"
+ " CASE "
+ " WHEN (rrd.res_rsv_deel_tot BETWEEN res_rsv_ruimte_van"
+ " AND res_rsv_ruimte_tot"
+ " )"
+ " THEN 1"
+ " ELSE 0"
+ " END totbinnentijd"
+ " , CASE WHEN id.ins_alg_ruimte_type_org IS NOT NULL AND ins_alg_ruimte_type = 'P'"
+ " THEN (SELECT pf.prs_perslid_naam_friendly"
+ " FROM prs_v_perslid_fullnames_all pf"
+ " WHERE pf.prs_perslid_key = id.ins_alg_ruimte_key)"
+ " WHEN id.ins_alg_ruimte_type_org IS NOT NULL AND ins_alg_ruimte_type = 'C'"
+ " THEN (SELECT c.prs_contactpersoon_naam"
+ " FROM prs_contactpersoon c"
+ " WHERE id.ins_alg_ruimte_key = c.prs_contactpersoon_key)"
+ " END eigenaar"
+ " , COALESCE (ks.prs_kostensoort_btw, 0) inclbtw"
+ " , CASE"
+ " WHEN (rd.res_deel_vervaldatum IS NULL OR rd.res_deel_vervaldatum > rr.res_rsv_ruimte_tot)"
+ " THEN 1"
+ " ELSE 0"
+ " END verval"
+ " , p.prs_perslid_key,"
+ lcl.xsqla('sp.prs_srtperslid_omschrijving', 'p.prs_srtperslid_key') // Later: evt Diensten en zo, wat kan deze man?
+ " , 1 isbulk";
var sql1 = "SELECT {0}"
+ " FROM res_rsv_deel rrd"
+ " , res_rsv_ruimte rr"
+ " , res_deel rd"
+ " , res_discipline d"
+ " , prs_kostensoort ks"
+ " , ins_deel id"
+ " , prs_perslid p"
+ " , prs_srtperslid sp"
+ " , ins_srtdeel isd"
+ "{1}"
+ " , ( SELECT sd.ins_srtdeel_key"
+ " , COUNT (km.ins_kenmerk_rolcode) km900" // kolomalias is historisch, maar zo gelaten
+ " FROM ins_srtkenmerk sk"
+ " , ins_kenmerk km"
+ " , ins_srtdeel sd"
+ " , ins_srtgroep gr"
+ " WHERE km.ins_srtkenmerk_key = sk.ins_srtkenmerk_key"
+ " AND gr.ins_srtgroep_key = sd.ins_srtgroep_key"
+ " AND km.ins_kenmerk_verwijder IS NULL"
+ " AND sk.ins_srtkenmerk_verwijder IS NULL"
+ " AND ( (km.ins_srtinstallatie_key = sd.ins_srtdeel_key"
+ " AND km.ins_kenmerk_niveau = 'S')"
+ " OR (km.ins_srtinstallatie_key = sd.ins_srtgroep_key"
+ " AND km.ins_kenmerk_niveau = 'G')"
+ " OR (km.ins_srtinstallatie_key = gr.ins_discipline_key"
+ " AND km.ins_kenmerk_niveau = 'D'))"
+ " AND BITAND(km.ins_kenmerk_rolcode,4) = 4" // uitleenkenmerken
+ " GROUP BY sd.ins_srtdeel_key) k"
+ " WHERE rrd.res_rsv_ruimte_key = rr.res_rsv_ruimte_key"
+ " AND rr.res_rsv_ruimte_key = " + rsv_ruimte_key
+ " AND id.ins_deel_key(+) = rd.res_ins_deel_key" // outer join voor als het een res_prs_perslid_key is
+ " AND p.prs_perslid_key(+) = rd.res_prs_perslid_key" // outer join voor als het een res_ins_deel_key is
+ " AND sp.prs_srtperslid_key(+) = p.prs_srtperslid_key" // outer join voor als het een res_ins_deel_key is
+ " AND rrd.res_deel_key = rd.res_deel_key"
+ " AND ks.prs_kostensoort_key(+) = d.prs_kostensoort_key"
+ " AND d.ins_discipline_key = rd.res_discipline_key"
+ " AND id.ins_srtdeel_key = isd.ins_srtdeel_key(+)"
+ (S("vis_parking_key") != -1 ? " AND rd.res_discipline_key != " + S("vis_parking_key") : "")
+ (!resdeleted? " AND rrd.res_rsv_deel_verwijder IS NULL" : "")
+ " AND isd.ins_srtdeel_key = k.ins_srtdeel_key(+)"
// temp table for count of bulk-items on unique description
var sqlBulkCount = ", ("
+ " SELECT distinct"
+ " oms.res_deel_omschrijving,"
+ " COUNT(oms.res_deel_omschrijving) total,"
+ " oms.res_deel_key,"
+ " oms.res_ins_deel_key ins_deel_key"
+ " FROM"
+ " ("
+ " SELECT"
+ " distinct res_deel_omschrijving, res_deel_key, res_ins_deel_key"
+ " FROM"
+ " res_v_aanwezigdeel rx"
+ " WHERE"
+ " res_deel_bulkreserveerbaar = 1"
+ " AND rx.res_deel_key IN (SELECT ry.res_deel_key FROM res_v_aanwezigdeel ry WHERE rx.res_deel_omschrijving = ry.res_deel_omschrijving)"
+ " AND res_deel_key IN ( " + sql1.format("rd.res_deel_key", "") + " )"
+ " ) oms,"
+ " res_v_aanwezigdeel r1"
+ " WHERE"
+ " oms.res_deel_omschrijving = r1.res_deel_omschrijving"
+ " AND r1.res_deel_key NOT IN ("
+ " SELECT distinct rrd.res_deel_key"
+ " FROM res_rsv_ruimte rrr, res_rsv_deel rrd, res_deel rd"
+ " WHERE ( rrr.RES_RSV_RUIMTE_VAN BETWEEN TO_DATE (" + res_van.toSQL(true) + ")"
+ " AND TO_DATE (" + res_tot.toSQL(true) + ")"
+ " OR rrr.RES_RSV_RUIMTE_TOT BETWEEN TO_DATE (" + res_van.toSQL(true) + ")"
+ " AND TO_DATE (" + res_tot.toSQL(true) + "))"
+ " AND rrr.res_rsv_ruimte_key <> " + rsv_ruimte_key
+ " AND rrd.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key"
+ " AND rrd.res_deel_key = rd.res_deel_key"
+ " AND rd.res_deel_bulkreserveerbaar = 1"
+ " )"
+ " GROUP BY"
+ " oms.res_deel_omschrijving,"
+ " oms.res_deel_key,"
+ " oms.res_ins_deel_key"
+ " ) cnt";
// temp table for count of (selected) bulk-items on unique description
var sqlSelectedCount = ", ("
+ " SELECT DISTINCT oms.res_deel_omschrijving,"
+ " COUNT (oms.res_deel_omschrijving) selected,"
+ " oms.res_deel_key,"
+ " oms.res_ins_deel_key ins_deel_key"
+ " FROM (SELECT DISTINCT"
+ " rx.res_deel_omschrijving, rx.res_deel_key, rx.res_ins_deel_key"
+ " FROM res_deel rx, res_rsv_deel rrd"
+ " WHERE rx.res_deel_bulkreserveerbaar = 1"
+ " AND rx.res_deel_key IN (SELECT min(ry.res_deel_key)"
+ " FROM res_v_aanwezigdeel ry, res_rsv_deel rrdy"
+ " WHERE rx.res_deel_omschrijving = ry.res_deel_omschrijving"
+ " AND ry.res_deel_key = rrdy.res_deel_key"
+ " AND rrdy.res_rsv_ruimte_key = " + rsv_ruimte_key + ")"
+ " AND rx.res_deel_key = rrd.res_deel_key"
+ " AND rrd.res_rsv_ruimte_key = " + rsv_ruimte_key + ") oms,"
+ " res_v_aanwezigdeel r1, res_rsv_deel rrd1"
+ " WHERE oms.res_deel_omschrijving = r1.res_deel_omschrijving"
+ " AND r1.res_deel_key = rrd1.res_deel_key"
+ " AND rrd1.res_rsv_ruimte_key = " + rsv_ruimte_key
+ " GROUP BY oms.res_deel_omschrijving,"
+ " oms.res_deel_key,"
+ " oms.res_ins_deel_key"
+ " ) sel";
var sqlComplete = sql1.format(nonBulkFields, "")
+ " AND rd.res_deel_bulkreserveerbaar = 0"
+ " UNION ALL "
+ sql1.format(bulkFields, sqlBulkCount + sqlSelectedCount)
+ " AND rd.res_deel_bulkreserveerbaar = 1"
+ " AND rd.res_deel_omschrijving = cnt.res_deel_omschrijving (+)"
+ " AND rd.res_deel_key = sel.res_deel_key "
+ " ORDER BY ins_discipline_volgnr, 1";
// Niet super efficient maar ach....
var oRs = Oracle.Execute("SELECT COUNT(*) FROM (" + sqlComplete + ") WHERE ins_srtdeel_uitleenbaar = 1" );
var ErisUitleenbaar = oRs(0).value > 0;
// Leesrechten WEB_INSFOF is grof maar beter dan niets
var showUitleenbaar = ErisUitleenbaar && user.checkAutorisation("WEB_INSFOF", true);
oRs.Close();
// Moet de fiatteur boven in de titel van het iframe getoond worden.
var fiatteur = "";
// Moet de gehele catering (opnieuw) gefiatteerd worden?
// In de setting velden res_rsv_artikel_approved en res_rsv_ruimte_cat_appr opnieuw staat aangegeven of er (opnieuw) gefiatteerd dient te worden
// Setting veld res_rsv_artikel_approved: Catalogus artikelen dienen gefiatteerd te worden 0=Nee, 1=Ja.
// Setting veld res_rsv_ruimte_cat_appr: Artikel is 0=Niet gefiatteerd, 1=Goedgekeurd, 2=Afgewezen.
var sql_a = "SELECT rr.res_rsv_ruimte_omschrijving"
+ " , rr.res_rsv_ruimte_cat_appr"
+ " , ra.res_rsv_artikel_approved"
+ " FROM res_rsv_ruimte rr"
+ " , res_rsv_artikel ra"
+ " WHERE rr.res_rsv_ruimte_key = ra.res_rsv_ruimte_key"
+ " AND rr.res_rsv_ruimte_key = " + rsv_ruimte_key;
oRs_a = Oracle.Execute(sql_a);
var approve = false;
while (!oRs_a.Eof)
{
approve = approve || (oRs_a("res_rsv_ruimte_cat_appr").Value == 1 && oRs_a("res_rsv_artikel_approved").Value == 0);
oRs_a.MoveNext();
}
oRs_a.Close();
if (approve)
{
var sql_b = "SELECT COALESCE(kp.prs_perslid_key, -1) budgethouder_key"
+ " FROM res_rsv_ruimte rr"
+ " , prs_kostenplaats kp"
+ " WHERE rr.prs_kostenplaats_key = kp.prs_kostenplaats_key"
+ " AND rr.res_rsv_ruimte_key = " + rsv_ruimte_key
var oRs_b = Oracle.Execute(sql_b);
if (!oRs_b.eof)
{
var budgethouder_key = oRs_b("budgethouder_key").Value;
if (budgethouder_key > 0)
{
var budgethouder = new Perslid(budgethouder_key);
fiatteur = " (" + L("lcl_res_approver") + ": " + budgethouder.naam() + ")";
}
else
fiatteur = " (" + L("lcl_res_no_fiatteur_known") + ")";
}
oRs_b.Close();
}
buttons.push({ icon: "fa-fclt-refresh", title: L("lcl_refresh"), action: "FcltMgr.reload()" });
var rst1 = new ResultsetTable({sql: sqlComplete,
rstableCount: 2,
rstableNr: 1,
keyColumn: "res_rsv_deel_key",
ID: "resvtable" + (embedded? "tiny" : ""),
noPrint: true,
rowClass: fnRowClassObj,
rowActionEnabler: fnrowActionEnabler,
summaryShow: function () {},
emptySetString : L("lcl_no_objects"),
title: L("lcl_res_frame_voorziening") + fiatteur,
buttons: (this_res.rsv_ruimte_verwijder != null? null : buttons)
});
rst1.addColumn(new Column({caption: "", content: fnImage, tooltip: "ins_discipline_omschrijving"}));
rst1.addColumn(new Column({caption: L("lcl_reserved_object"), content: fnOmschrijving}));
if (showUitleenbaar)
rst1.addColumn(new Column({caption: L("lcl_ins_lent_res"), content: "eigenaar", hasActions: true }));
rst1.addColumn(new Column({caption: L("lcl_from"), content: fnVantijd, align:"center"}));
rst1.addColumn(new Column({caption:L("lcl_to"), content: fnTottijd, align:"center"}));
if (anydeelprijs)
rst1.addColumn(new Column({caption: L("lcl_r_price5"), content: "res_rsv_deel_prijs", datatype: "currency"}));
if (resdeleted)
rst1.addColumn(new Column({caption:L("lcl_deleted"), content: "ddVerwijder", datatype: "datetime"}));
if (showUitleenbaar)
{
rst1.addAction({ action: "insCheckOut", caption: L("lcl_obj_lend_out"), enabler: "eLendOut", multi: true });
rst1.addAction({ action: "insCheckIn", caption: L("lcl_obj_receive"), enabler: "eReceive", multi: true });
rst1.addAction({ action: "insAdapt", caption: L("lcl_ins_adapt"), enabler: "eAdapt"});
}
function fncolFiat(oRs)
{ // Als res_rsv_ruimte_cat_appr 0 is, dan wordt deze functie niet aangeroepen. Dus de controle "res_rsv_ruimte_cat_appr == 0" hoeft hier niet uitgevoerd te worden.
// Als er voor een catalogus niet met een drempelwaarde wordt gewerkt, dan wordt er vooralsnog een blokje getoond met dezelfde kleur als de andere cateringregels van die reservering.
var ttl;
var icon;
var displ = "";
var rsv_art_key = oRs("res_rsv_artikel_key").Value; // rsv_ruimte_key
var rsv_art_appr = oRs("res_rsv_artikel_approved").Value;
switch (rsv_art_appr)
{
case 0: ttl = L("lcl_res_ter_fiat");
icon = "fa-exclamation-circle";
break;
case 1: ttl = L("lcl_res_goedgekeurd");
icon = "fa-check-circle";
break;
case 2: ttl = L("lcl_res_afgewezen");
icon = "fa-times-circle";
break;
}
var fiatimg = "<span id='resfiatimg" + rsv_art_key + "' class='resfiat" + rsv_art_appr + "' title='" + safe.htmlattr(ttl) + "'>" + I(icon+" fa-lg", {"fastyle":"fas"}) + "</span>";
displ = "<div class='resfiatdiv' title='" + safe.htmlattr(ttl) + "'>" + fiatimg + "</div>";
return displ;
}
function fnArtikeltekst(oRs)
{
var sqlFlex = getSqlFlex("RESA");
var flexData = getFlexData(sqlFlex, oRs("res_rsv_artikel_key").Value, { showProperties: true, onlyWithValue: true }); // Alleen flexkenmerken met een waarde ophalen.
var artflex = "";
if (flexData.length)
artflex = "<div class='resartflexshow'>";
for (var i = 0; i < flexData.length; i++)
{
artflex += (i? "<br>" : "") + "<span>" + safe.html(flexData[i].header) + ": " + safe.html(flexData[i].value) + "</span>"
}
// Bijlagen.
var result = res.res_deel_flex_bijlagen(oRs("res_rsv_artikel_key").Value, oRs("res_discipline_key").Value);
if (result.length)
artflex += "<br>" + result;
if (flexData.length)
artflex += "</div>";
var action = "";
if (user.has("WEB_RESMSU"))
action = 'FcltMgr.openDetail("appl/mgt/res_artikel.asp?mode=wrap&id=' + oRs('res_artikel_key').value + '"); FcltMgr.stopPropagation(event);';
var active_artikel = (oRs("ingang").value == 1 && oRs("verval").value == 1);
var arttekst = (action == "" ? safe.html(oRs("res_artikel_omschrijving").value) + " "
: "<a href='#' onclick='" + action + "'>" + safe.html(oRs("res_artikel_omschrijving").value) + "</a> ")
+ (oRs("res_artikel_eenheid").value ? " (" + safe.html(oRs("res_artikel_eenheid").value) + ")" : "")
+ (oRs("res_rsv_artikel_prijs").Value ? (" " + (oRs("inclBTW").value? L("lcl_shared_inclBTW") : L("lcl_shared_exclBTW"))) : "")
+ (!active_artikel? L("lcl_inactive_data_suffix") : "");
return arttekst + artflex;
}
var sql2 = "SELECT CASE WHEN a.res_artikel_vrije_omschrijving = 1"
+ " THEN ra.res_rsv_artikel_omschrijving"
+ " ELSE " + lcl.xsql("a.res_artikel_omschrijving", "a.res_artikel_key")
+ " END res_artikel_omschrijving"
+ " , " + lcl.xsqla("a.res_artikel_eenheid", "a.res_artikel_key")
+ " , ra.res_rsv_artikel_key"
+ " , ra.res_rsv_artikel_aantal"
+ " , res.getartikelprijs(ra.res_rsv_artikel_key) res_rsv_artikel_prijs" // zou je achterwege kunnen laten als !anyartikelprijs
+ " , d.ins_discipline_image"
+ " , " + lcl.xsqla("d.ins_discipline_omschrijving", "d.ins_discipline_key")
+ " , dp.res_disc_params_threshold"
+ " , ra.res_rsv_artikel_levering"
+ " , ra.res_rsv_artikel_afhalen"
+ " , rr.res_rsv_ruimte_tot"
+ " , ra.res_rsv_artikel_verwijder ddVerwijder"
+ " , CASE "
+ " WHEN (ra.res_rsv_artikel_levering BETWEEN rr.res_rsv_ruimte_van "
+ " AND rr.res_rsv_ruimte_tot) "
+ " THEN 1 "
+ " ELSE 0 "
+ " END levbinnentijd"
+ " , res_rsv_artikel_dirtlevel"
+ " , res_rsv_artikel_approved"
+ " , COALESCE (ks.prs_kostensoort_btw, 0) inclbtw"
+ " , CASE"
+ " WHEN (a.res_artikel_ingangsdatum IS NULL OR a.res_artikel_ingangsdatum <= rr.res_rsv_ruimte_van)"
+ " THEN 1"
+ " ELSE 0"
+ " END ingang"
+ " , CASE"
+ " WHEN (a.res_artikel_vervaldatum IS NULL OR a.res_artikel_vervaldatum > rr.res_rsv_ruimte_van)"
+ " THEN 1"
+ " ELSE 0"
+ " END verval"
+ " , a.res_artikel_key"
+ " , a.res_discipline_key"
+ " FROM res_rsv_artikel ra"
+ " , res_rsv_ruimte rr"
+ " , res_artikel a"
+ " , res_discipline d"
+ " , res_disc_params dp"
+ " , prs_kostensoort ks"
+ " WHERE ra.res_rsv_ruimte_key = rr.res_rsv_ruimte_key"
+ " AND rr.res_rsv_ruimte_key = " + rsv_ruimte_key
+ " AND ra.res_artikel_key = a.res_artikel_key"
+ " AND ks.prs_kostensoort_key(+) = d.prs_kostensoort_key"
+ " AND a.res_discipline_key = d.ins_discipline_key"
+ " AND d.ins_discipline_key = dp.res_ins_discipline_key"
+ (!resdeleted? " AND ra.res_rsv_artikel_verwijder IS NULL" : "")
+ " ORDER BY res_artikel_volgnummer"
+ " , res_rsv_artikel_levering"
+ " , d.ins_discipline_volgnr"
+ " , " + lcl.xsql("res_artikel_omschrijving", "a.res_artikel_key");
// Niet super efficient maar ach....
var oRs = Oracle.Execute("SELECT 1 FROM (" + sql2 + ")" );
var rst2Empty = oRs.EoF;
oRs.Close();
if (!rst2Empty)
rst1.emptySetString = "";
var cnt1 = rst1.processResultset();
var rst2 = new ResultsetTable({sql:sql2,
rstableCount: 2,
rstableNr: 2,
keyColumn: "res_rsv_artikel_key",
ID: "resctable"+(embedded?"tiny":""),
noPrint:true,
rowClass: fnRowClassCat,
summaryShow: function () {},
emptySetString : L("lcl_no_artikels")
});
if (hasFiat)
rst2.addColumn(new Column({caption: I("fa-circle"), content: fncolFiat, colName: "fncolFlags", colText: L("lcl_res_fiatstatus"), align: "center"}));
rst2.addColumn(new Column({caption: "", content: fnImage, tooltip: "ins_discipline_omschrijving"}));
rst2.addColumn(new Column({caption: L("lcl_consumable_objects"), content: fnArtikeltekst }));
rst2.addColumn(new Column({caption: L("lcl_count"), content: "res_rsv_artikel_aantal", align:"center"}));
rst2.addColumn(new Column({caption: L("lcl_time"), content: fnTijd, datatype: "time", align:"center"}));
rst2.addColumn(new Column({caption: L("lcl_res_ophalen"), content: fnAfhaaltijd, datatype: "time", align:"center"}));
if (this_res.res_has_visitors)
rst2.addColumn(new Column({caption: L("lcl_to"), content: "res_rsv_ruimte_tot", datatype: "time", align:"center"}));
if (anyartikelprijs)
rst2.addColumn(new Column({caption: L("lcl_r_price7"), content: "res_rsv_artikel_prijs", datatype: "currency"}));
if (resdeleted)
rst2.addColumn(new Column({caption: L("lcl_deleted"), content: "ddVerwijder", datatype: "datetime"}));
var cnt2 = rst2.processResultset();
var hasVoorziening = (cnt1 > 0);
var hasCatering = (cnt2 > 0);
if (isCV && !hasVoorziening && !hasCatering)
{
%> <script>
$(function() {
FcltMgr.setSubtabExtra("<span class='subtab-badge-icon subtab-badge-missing'>" + I("fa-exclamation-triangle fa-lg", { "fastyle": "fas" }) + "</span>");
});
</script>
<% }
if (anyDirty)
{
%> <script type='text/javascript'>
$(function()
{
anyDirty = true;
FcltMgr.alert(L("lcl_res_fail_invalid_objcat"));
})
</script>
<% }
}
%>
</body>
</html>
<% ASPPAGE_END(); %>