FSN#36298: 1. Scenario’s (per complex moeten verschillende scenario’s gemaakt moeten kunnen.

svn path=/Website/trunk/; revision=34586
This commit is contained in:
Maykel Geerdink
2017-07-11 07:42:28 +00:00
parent a1919282bd
commit 7b67044212
4 changed files with 183 additions and 32 deletions

View File

@@ -15,6 +15,9 @@
<!-- #include file="../Shared/selector.inc" -->
<%
var ctrdisc_key = getQParamInt("ctrdisc_key", -1); // Ctrdiscipline
var ins_key_arr = getQParamIntArray("ins_keys", []);
user.anything_todo_or_abort(ins_key_arr.length > 0); // We klagen niet over enkele wel en enkele niet
if (ctrdisc_key > 0)
lcl.set_dialect(ctrdisc_key, "INS_TAB_DISCIPLINE_KEY");

View File

@@ -16,6 +16,7 @@
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="../Shared/selector.inc" -->
<!-- #include file="../INS/ins.inc" -->
<%
FCLTHeader.Requires({ plugins: ["jQuery"],
js: [] })
@@ -25,7 +26,32 @@ FCLTHeader.Requires({ plugins: ["jQuery"],
<% FCLTHeader.Generate(); %>
<%
var ins_key_arr = getQParamIntArray("ins_keys");
var srtcont_key_arr = getQParamIntArray("srtcont_keys");
var srtcont_key_arr = getQParamIntArray("srtcont_keys", []);
var tobeincluded = 0;
var ingesloten = [];
var ingeslotensc = [];
// Bepaal de objecten in de selectie die
// ook echt opgenomen kunnen of mogen worden in het scenario.
for (var i = 0; i < ins_key_arr.length; i++)
{
var this_ins = ins.func_enabled_deel(ins_key_arr[i], {srtcont_key: srtcont_key_arr[i]});
if (this_ins.canChangeXcp) // Mag ik nieuwe exceptions (xcp) waarden van de taak voor het nieuwe scenario wijzigen?
{
ingesloten.push(ins_key_arr[i]);
ingeslotensc.push(srtcont_key_arr[i]);
tobeincluded++;
}
}
user.anything_todo_or_abort(tobeincluded > 0); // We klagen niet over enkele wel en enkele niet.
var sql = "SELECT isc.ctr_discipline_key"
+ " FROM ins_srtcontrole isc"
+ " WHERE isc.ins_srtcontrole_key = " + srtcont_key_arr[0];
var oRs = Oracle.Execute(sql);
ctrdisc_key = oRs("ctr_discipline_key").Value;
lcl.set_dialect(ctrdisc_key, "INS_TAB_DISCIPLINE_KEY");
var sql_scen = "SELECT COUNT(ins_scenario_key) aantal"
+ " , MAX(ins_scenario_key) maxkey"
@@ -82,8 +108,8 @@ FCLTHeader.Requires({ plugins: ["jQuery"],
<body class="modal" id="mod_mjbinclscen">
<form action="mjb_incl_scen_save.asp" method="post" name="u2">
<input type="hidden" name="ins_keys" id="ins_keys" value="<%=ins_key_arr.join(",")%>">
<input type="hidden" name="srtcont_keys" id="srtcont_keys" value="<%=srtcont_key_arr.join(",")%>">
<input type="hidden" name="ins_keys" id="ins_keys" value="<%=ingesloten.join(",")%>">
<input type="hidden" name="srtcont_keys" id="srtcont_keys" value="<%=ingeslotensc.join(",")%>">
<input type="hidden" name="scen_key" id="scen_key" value="<%=aantal == 1? maxkey : -1%>">
<div id="mjbexistscen" <%=!hassenarios? "style='display:none'" : ""%>>
@@ -91,8 +117,10 @@ FCLTHeader.Requires({ plugins: ["jQuery"],
sql = "SELECT ins_scenario_key"
+ " , ins_scenario_omschrijving"
+ " FROM ins_scenario";
var oRs = Oracle.Execute(sql + " WHERE ins_scenario_verwerkt IS NULL");
+ " FROM ins_scenario"
+ " WHERE ins_scenario_verwerkt IS NULL"
+ " ORDER BY ins_scenario_omschrijving";
var oRs = Oracle.Execute(sql);
FCLTselector("scenario",
sql,
{ label: L("lcl_mjb_scenarios"),

View File

@@ -48,7 +48,7 @@ var frequentie = getQParamInt("frequentie", -1);
var toyear = getQParamInt("toyear", new Date().getFullYear() + S("mjb_show_years"));
var incbtw = getQParamInt("incbtw", 0) == 1;
var scen_key_arr = getQParamIntArray("scen_keys", [-1]); // Scenario's
var onlyscen = getQParamInt("onlyscen", 0) == 1;
var actsit = getQParamInt("actsit", 0) == 1;
var ctrdisc_key = getQParamInt("ctrdisc_key", -1); // Ctrdiscipline
@@ -87,13 +87,41 @@ var authparamsCTRUSE = user.checkAutorisation("WEB_CTRUSE");
<script type="text/javascript">
var urole = "<%=urole%>";
function doSubmit()
{
document.forms.u2.submit();
function doSubmit()
{
document.forms.u2.submit();
}
var selectedScen = true;
function onChangeScenario()
{
if ($("#scenarios").val() > 0)
{
if (!selectedScen)
{
$("#actsit").prop("checked", false);
selectedScen = true;
}
$(".tractsit").show();
}
<% if (autosearch) { %>
$(document).ready(function() { doSubmit(); });
<%}%>
else
{
$(".tractsit").hide();
$("#actsit").prop("checked", true);
selectedScen = false;
}
}
$(document).ready(function()
{
$(".tractsit").hide();
$("#actsit").prop("checked", true);
selectedScen = false;
<% if (autosearch)
{ %>
doSubmit();
<% } %>
});
</script>
</head>
@@ -277,7 +305,8 @@ var authparamsCTRUSE = user.checkAutorisation("WEB_CTRUSE");
sql = "SELECT ins_scenario_key"
+ " , ins_scenario_omschrijving"
+ " FROM ins_scenario"
+ " WHERE ins_scenario_verwerkt IS NULL";
+ " WHERE ins_scenario_verwerkt IS NULL"
+ " ORDER BY ins_scenario_omschrijving";
var oRs = Oracle.Execute(sql);
if (!oRs.Eof)
{
@@ -285,11 +314,12 @@ var authparamsCTRUSE = user.checkAutorisation("WEB_CTRUSE");
sql,
{ label: L("lcl_mjb_scenarios"),
initKey: scen_key_arr,
multi: true,
//multi: true, // Voor nu niet multi
trclass:"primsearch noxd",
emptyOption: ""
emptyOption: "",
onChange: "onChangeScenario()"
});
RWCHECKBOXTR("onlyscen", "fldonlyscen", L("lcl_mjb_onlyscen"), onlyscen, { html: " value='1' ", trclass: 'primsearch noxd'});
RWCHECKBOXTR("actsit", "fldactsit", L("lcl_mjb_act_situation"), actsit, { html: " value='1' ", trclass: 'primsearch noxd tractsit'});
}
oRs.Close();
%> </table>

View File

@@ -79,7 +79,7 @@ var scenarios = getQParamIntArray("scenarios", []); // Array met scenario's.
var sindex = scenarios.join(",").indexOf("-1");
if (sindex > -1)
scenarios.splice(sindex, 1);
var onlyscen = getQParamInt("onlyscen", 0) == 1; // Lijst inclusief BTW weergeven.
var actsit = getQParamInt("actsit", 0) == 1; // Ook actuele situatie.
var ctrdisc_key = getQParamInt("ctrdisc_key", -1); // Ctrdiscipline
if (ctrdisc_key > 0)
@@ -124,16 +124,19 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
var url = "appl/mjb/mjb_search.asp?autosearch=1&groupby=7<%=transitParam%>&gebouw_key=" + bld_key;
FcltMgr.openDetail(url, $(deze).text());
}
function naardeel(ins_key, deze)
{
var url = "appl/ins/ins_deel.asp?ins_key=" + ins_key + "&urole=bo";
FcltMgr.openDetail(url, $(deze).text());
}
function exception(ins_key, srtcont_key, ttl)
function exception(ins_key, srtcont_key, scen_key, ttl)
{
var url = "../ins/ins_xcp.asp?ins_key=" + ins_key + "&srtcont_key=" + srtcont_key + "&urole=bo";
var url = "../ins/ins_xcp.asp?ins_key=" + ins_key + "&srtcont_key=" + srtcont_key + (scen_key > 0? "&scen_key=" + scen_key : "") + "&urole=bo";
FcltMgr.openModalDetail(url, { titel: L("lcl_ins_change_xcp") + " " + ttl, callback: <%=bld_key > 0? "FcltMgr.reload ": "null"%> });
}
function moveplan(evt, ins_key, srtcont_key, jaar)
{
FcltMgr.stopPropagation(evt);
@@ -237,11 +240,15 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
for (var i = 0; i < rowArray.length; i++)
{
rowdata = eval('(' + rowArray[i].getAttribute("ROWDATA") + ')');
mjbDeelKeyArray.push(rowdata.insKey);
mjbSrtContrKeyArray.push(rowdata.insSrtControleKey);
// Scenario's kunnen niet gestart worden. Hier de scenario's er al uit filteren.
if (!rowdata.insScenKey || rowdata.insScenKey < 0)
{ // Het is geen scenario. De periodieke taak kan in tijd verschoven worden. De periodieke taak aan het array toevoegen.
mjbDeelKeyArray.push(rowdata.insKey);
mjbSrtContrKeyArray.push(rowdata.insSrtControleKey);
}
}
url = "../mjb/mjb_dragdropyear.asp?ctrdisc_key=<%=ctrdisc_key%>";
url = "../mjb/mjb_dragdropyear.asp?ctrdisc_key=<%=ctrdisc_key%>&ins_keys=" + mjbDeelKeyArray.join(",");
FcltMgr.openModalDetail(url, L("lcl_mjb_dragdrop"), {callback: dragDropCallback});
}
@@ -252,7 +259,11 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
for (var i = 0; i < rowArray.length; i++)
{
rowdata = eval('(' + rowArray[i].getAttribute("ROWDATA") + ')');
srtcontrolekeyArray[i] = rowdata.insSrtControleKey;
// Scenario's kunnen niet opgenomen worden in een scenario. Hier de scenario's er al uit filteren.
if (!rowdata.insScenKey || rowdata.insScenKey < 0)
{ // Het is geen scenario. De periodieke taak kan in een scenario worden opgenomen. De inspectie aan het array toevoegen.
srtcontrolekeyArray[i] = rowdata.insSrtControleKey;
}
}
var subject = L("lcl_mjb_incl_scen");
@@ -312,6 +323,8 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
+ " , e.ctr_controle_type"
+ " , e.ins_scenario_key"
+ " , e.hasscenario"
+ " , e.scenario_oms"
+ " , e.scenario_aantal"
+ " FROM (SELECT el.ins_deel_key"
+ " , el.ins_srtcontroledl_xcp_key"
+ " , el.ins_srtcontrole_omschrijving"
@@ -335,6 +348,20 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
+ " , el.ctr_controle_type"
+ " , el.ins_scenario_key"
+ " , el.hasscenario"
+ " , (SELECT LISTAGG(isc.ins_scenario_omschrijving, ', ') WITHIN GROUP (ORDER BY isc.ins_scenario_omschrijving)"
+ " FROM ins_srtcontroledl_xcp xcp"
+ " , ins_scenario isc"
+ " WHERE xcp.ins_scenario_key = isc.ins_scenario_key "
+ " AND xcp.ins_srtcontrole_key = el.ins_srtcontrole_key"
+ " AND xcp.ins_deel_key = el.ins_deel_key"
+ " AND xcp.ins_scenario_key IS NOT NULL) scenario_oms"
+ " , (SELECT COUNT(isc.ins_scenario_omschrijving)"
+ " FROM ins_srtcontroledl_xcp xcp"
+ " , ins_scenario isc"
+ " WHERE xcp.ins_scenario_key = isc.ins_scenario_key "
+ " AND xcp.ins_srtcontrole_key = el.ins_srtcontrole_key"
+ " AND xcp.ins_deel_key = el.ins_deel_key"
+ " AND xcp.ins_scenario_key IS NOT NULL) scenario_aantal"
+ " FROM ins_v_defined_inspect_xcp el"
+ " WHERE el.ins_srtcontrole_periode > 0"
+ " AND el.ctr_ismjob = 1"
@@ -434,6 +461,8 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
+ " , comp.ctr_controle_type"
+ " , comp.ins_scenario_key"
+ " , comp.hasscenario"
+ " , comp.scenario_oms"
+ " , comp.scenario_aantal"
+ " FROM (WITH comps (ins_deel_key" // Recursive WITH statement om het volgende vervangingsjaar te vinden (m.vervangingsjaar + m.ins_srtcontrole_periode).
+ " , ins_srtcontroledl_xcp_key"
+ " , ins_srtcontrole_key"
@@ -456,7 +485,9 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
+ " , ins_srtcontroledl_xcp_eind"
+ " , ctr_controle_type"
+ " , ins_scenario_key"
+ " , hasscenario)"
+ " , hasscenario"
+ " , scenario_oms"
+ " , scenario_aantal)"
+ " AS (SELECT ins_deel_key"
+ " , ins_srtcontroledl_xcp_key"
+ " , ins_srtcontrole_key"
@@ -480,6 +511,8 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
+ " , ctr_controle_type"
+ " , ins_scenario_key"
+ " , hasscenario"
+ " , scenario_oms"
+ " , scenario_aantal"
+ " FROM (" + sql_componenten + ")"
+ " WHERE vervangingsjaar IS NOT NULL"
+ " UNION ALL" // latere jaren
@@ -506,6 +539,8 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
+ " , ctr_controle_type"
+ " , ins_scenario_key"
+ " , hasscenario"
+ " , scenario_oms"
+ " , scenario_aantal"
+ " FROM comps m"
+ " WHERE (m.vervangingsjaar + m.ins_srtcontrole_periode <= " + toyear + "))"
+ " SELECT *"
@@ -573,6 +608,8 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
+ " , cy.ctr_controle_type"
+ " , cy.ins_scenario_key"
+ " , cy.hasscenario"
+ " , cy.scenario_oms"
+ " , cy.scenario_aantal"
+ " FROM (" + sql_yearcost + ") cy"
+ " , ins_v_deel_gegevens dg"
+ " , alg_district d"
@@ -605,7 +642,7 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
+ " , cv.keyColumn"
+ " , cv.ins_srtcontroledl_xcp_key"
+ " , cv.ins_srtcontrole_key"
+ " , ins.nextcyclusdate (cv.ins_deel_key, cv.ins_srtcontrole_key, 0) org_nexdate_0" // Eerstaankomende inspectie: 1-ste vandaag of in de toekomst.
+ " , ins.nextcyclusdate (cv.ins_deel_key, cv.ins_srtcontrole_key, cv.ins_scenario_key, 0) org_nexdate_0" // Eerstaankomende inspectie: 1-ste vandaag of in de toekomst.
+ " , cv.ins_srtcontrole_periode"
+ " , cv.ins_srtcontrole_opmerking"
+ " , cv.ins_srtcontrole_level"
@@ -648,6 +685,8 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
+ " , cv.ctr_controle_type"
+ " , cv.ins_scenario_key"
+ " , cv.hasscenario"
+ " , cv.scenario_oms"
+ " , cv.scenario_aantal"
+ " FROM (" + sql_cost_verval + ") cv";
if (!fulldetails)
@@ -687,15 +726,20 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
+ ") PIVOT (SUM(bedrag), SUM(orgbedrag) AS orgbedrag "
+ " FOR vervangingsjaar IN (" + jaren.join(",") + ") )";
// TODO: Testen of dit filter stukje klopt en uitbereiden???
if (scenarios.length > 0)
{
if (onlyscen)
if (!actsit)
sql += " WHERE ins_scenario_key IN (" + scenarios + ") AND hasscenario = 1";
else
sql += " WHERE ins_scenario_key IN (" + scenarios + ") OR hasscenario = 0";
}
//else TODO
else
{
if (!actsit)
sql += " WHERE 1 = 0";
else
sql += " WHERE ins_scenario_key IS NULL";
}
sql += " ORDER BY 1";
for (var i = 2; i <= groupby; i++)
@@ -721,6 +765,7 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
data.insDeelSrtContrKey = oRs("ins_deelsrtcontrole_key").Value? oRs("ins_deelsrtcontrole_key").Value : -1;
data.insNexdate0 = new Date(oRs("org_nexdate_0").Value).getFullYear(); // Eerstaankomende vandaag of in de toekomst.
data.insCtrControleType = oRs("ctr_controle_type").Value;
data.insScenKey = oRs("ins_scenario_key").Value? oRs("ins_scenario_key").Value : -1;
}
return JSON.stringify(data);
@@ -730,7 +775,7 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
{
if (!fulldetails)
return "";
scen_key = oRs("ins_scenario_key").Value? oRs("ins_scenario_key").Value : -1;
var scen_key = oRs("ins_scenario_key").Value? oRs("ins_scenario_key").Value : -1;
var lclass = scen_key < 0 && oRs("ins_srtcontroledl_xcp_key").Value != null? "mjbxcp" : "mjbstd";
if (scen_key > 0)
lclass += " scenerized1";
@@ -755,7 +800,8 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
// Inspectie acties alleen zichtbaar in het overzicht gegroepeerd naar Taken. Het gebouw filter is dan al vaak ingevuld.
var this_ins = ins.func_enabled_deel(oRs("ins_deel_key").Value,
{srtcont_key: oRs("ins_srtcontrole_key").Value,
deelsrtcont_key:oRs("ins_deelsrtcontrole_key").Value? oRs("ins_deelsrtcontrole_key").Value : -1});
deelsrtcont_key: oRs("ins_deelsrtcontrole_key").Value? oRs("ins_deelsrtcontrole_key").Value : -1,
isScenario: oRs("ins_scenario_key").Value? true : null});
ePlan = this_ins.canInspPlan;
eStart = this_ins.canInspStart;
eClose = this_ins.canInspClose;
@@ -766,6 +812,16 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
return data;
}
function fnHasScenario(oRs)
{
if (oRs("hasscenario").Value)
{
return "<nobr>" + (oRs("scenario_aantal").Value > 1? "*" : "") + "<i class='fa fa-fw fa-clone' title='" + oRs("scenario_oms").Value + "'></i>" + "</nobr>"
}
else
return "";
}
function fnGebouw(oRs)
{
if (hasReadALGUSE || hasReadALGMAN)
@@ -794,6 +850,7 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
var fncall = "exception({0}, {1}, '{2}')"
.format(oRs("ins_deel_key").Value,
oRs("ins_srtcontrole_key").Value,
oRs("ins_scenario_key").Value || -1,
safe.jsstring(oRs("ins_deel_omschrijving").Value));
return "<span class='details' onclick='{0}'>{1}</span>"
.format(safe.htmlattr(fncall),
@@ -812,6 +869,7 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
return v;
}
}
function fnfnBedragNumber(jaar) // Voor optellen
{
return function (oRs)
@@ -819,6 +877,7 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
return Math.round(oRs(jaar).Value);
}
}
function totalShow(column, rowNum)
{
return safe.curr(column.totalsum, true);
@@ -834,6 +893,7 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
}
return s;
}
function fnTotalText(oRs)
{
return safe.curr(fnTotal(oRs), true);
@@ -870,9 +930,10 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
doneclik[deel_key + ":" + srtcont_key] = 1;
var scen_key = oRs("ins_scenario_key").Value? oRs("ins_scenario_key").Value : -1;
// INSUSE read rechten heb je al nodig om dit overzicht te zien.
// Inspecties in de status gestart(2) of gereedgemeld(5) mogen niet drag en drop zijn. Planningsdatum is daarvan niet aan te passen.
return "<span" + (hasWriteCTRUSE? " class='" + (oRs("canBePlanned").Value == 1? "details draggable" : "") + "'" : "") + ">{0}</span>".format(safe.curr(v, true))
return "<span" + (hasWriteCTRUSE? " class='" + (oRs("canBePlanned").Value == 1 && scen_key == -1? "details draggable" : "") + "'" : "") + ">{0}</span>".format(safe.curr(v, true))
/* experimenteel inline schuiven
var fnprev = "moveplan(event, {0}, {1}, {2}-1)".format(deel_key, srtcont_key, jaar);
@@ -904,6 +965,18 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
}
}
function fncolCloneClass()
{
return function (oRs)
{
if (oRs("hasscenario").Value)
{
return "mjbcloned"
}
else
return "";
}
}
var buttons = [];
buttons.push({ icon: "page_refresh.png", title: L("lcl_refresh"), action: "FcltMgr.reload()" });
@@ -927,6 +1000,8 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
});
//rst.addColumn(new Column({caption: L("level"), content: "ins_srtcontrole_level" /*, hasActions: true*/}));
if (scenarios.length == 0)
rst.addColumn(new Column({caption: "<span title='{0}'>".format(safe.htmlattr(L("lcl_mjb_scenarios"))) + I("fa-clone") + "</span>", content: fnHasScenario }));
rst.addColumn(new Column({caption: L("lcl_district"), content: "alg_district_omschrijving", purpose: (dist_key>-1 ? PRINTING_ONLY : PRINT_AND_VIEW)}));
if (groupby > 1)
rst.addColumn(new Column({caption: L("lcl_building"), content: fnGebouw }));
@@ -990,7 +1065,7 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
<script type="text/javascript">
function openLegenda()
{
params = { width: 300,
params = { width: 500,
minWidth: 250,
minHeight: 10,
resizable: false,
@@ -1006,12 +1081,27 @@ var transitParam = buildTransitParam(["disc", "srtgroep", "srtdeel", "srtcontrol
<tr class="mjbplanned">
<td title="<%= L("lcl_mjb_moved") %>"><%= L("lcl_mjb_moved") %></td>
</tr>
<tr class="scenerized1">
<td title="<%= L("lcl_mjb_scenario") %>"><%= L("lcl_mjb_scenario") %></td>
</tr>
<tr class="mjbafbouw">
<td title="<%= L("lcl_mjb_phasingout") %>"><%= L("lcl_mjb_phasingout") %></td>
</tr>
<tr class="mjbverval">
<td title="<%= L("lcl_mjb_becancelled") %>"><%= L("lcl_mjb_becancelled") %></td>
</tr>
<tr class="mjbcloned">
<td title="<%= L("lcl_mjb_part_scenario") %>">
<span style="z-index:-1;"><%= L("lcl_mjb_part_scenario") %></span>
<span style="position:absolute; left:242px;"><%= I("fa-clone") %></span>
</td>
</tr>
<tr class="mjbcloned">
<td title="<%= L("lcl_mjb_part_scenario_m") %>">
<span style="z-index:-1;"><%= L("lcl_mjb_part_scenario_m") %></span>
<span style="position:absolute; left:242px;">*<%= I("fa-clone") %></span>
</td>
</tr>
<tr class="mjbxcp">
<td title="<%= L("lcl_mjb_overruled_xcp") %>"><%= L("lcl_mjb_overruled_xcp") %></td>
</tr>