Files
Facilitor/APPL/INS/ins_inspect_start.asp
Maykel Geerdink 4aa264a52a PLAT#51511: AiAi foutmelding accorderen Clusters - (Maximum aantal cursors?).
svn path=/Website/branches/v2017.2/; revision=36258
2017-12-06 13:48:07 +00:00

443 lines
25 KiB
Plaintext

<%@ LANGUAGE = JavaScript %>
<% Server.ScriptTimeout=6000; %>
<% /*
$Revision$
$Id$
File: ins_inspect_start.asp
Description: Starten van de inspecties.
Parameters:
ins_keys Array van objecten waarvan inspecties moeten worden gestart.
srtcont_keys Array van soort controles die moeten worden gestart.
Context: Inline actie ins_list.inc of actie ins_inspect_list
Resultaat van een submit is een json object
*/ %>
<%
var JSON_Result = true;
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../shared/save2db.inc" -->
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="../Shared/kenmerk_common.inc" -->
<!-- #include file="../API2/api2.inc" -->
<!-- #include file="../API2/model_issues.inc" -->
<!-- #include file="ins.inc" -->
<%
protectRequest.validateToken();
var ins_key_arr = getFParamIntArray("ins_keys");
var srtcont_key_arr = getFParamIntArray("srtcont_key_arr", []);
var multi = ins_key_arr.length > 1;
var freeze = getFParamInt("freeze", 0) == 1;
var groupby = getFParamInt("groupby", 7);
var inflatiepct = S("mjb_inflation");
var inflatiefactor = 1 + (inflatiepct / 100);
var mjb_start_year = S("mjb_start_year");
var mjb_freeze_year = S("mjb_freeze_year");
var ingesloten = [];
if (freeze && groupby < 7)
{
var dist_key = getFParamInt("dist_key", -1); // District
var loc_key = getFParamInt("loc_key", -1); // Locatie
var bld_key = getFParamInt("bld_key", -1); // Gebouw
var disc_key = getFParamInt("disc_key", -1);
var srtgroep_key = getFParamInt("srtgroep_key", -1);
var srtdeel_key = getFParamInt("srtdeel_key", -1);
var groep = getFParam("groep", ""); // Groep
var categorie_key = getFParamInt("categorie_key", -1); // Categorie
var srtcontrole = getFParamIntArray("srtcontrole", []); // Taak
var frequentie = getFParamIntArray("frequentie", []); // Array met frequenties.
var incbtw = getFParamInt("incbtw", 0) == 1; // Lijst inclusief BTW weergeven.
var deel = getFParam("deel", ""); // Identieficatie
var mjbMoved = getFParamInt("mjbMoved", 0) == 1; // Verschoven.
var mjbFreezed = getFParamInt("mjbFreezed", 0) == 1; // In behandeling.
var mjbXcped = getFParamInt("mjbXcped", 0) == 1; // Aangepast.
// Start building the query to fetch all objects satisfying
var mjbparams = { niveau: groupby, // Het niveau (betekenis) van de keys (district(1), gebouw(2), discipline(3), groep(4), objectsoort(5), object(6))
keys: ins_key_arr,
scenario: 1,
fulldetails: true,
//actsit: actsit,
dist_key: dist_key,
loc_key: loc_key,
bld_key: bld_key,
disc_key: disc_key,
srtgroep_key: srtgroep_key,
srtdeel_key: srtdeel_key,
groep: groep,
categorie_key: categorie_key,
srtcontrole: srtcontrole,
frequentie: frequentie,
incbtw: incbtw,
toyear: mjb_freeze_year,
groupby: 7, // Ik wil alle objecten opvragen.
deel: deel,
mjbMoved: mjbMoved,
mjbFreezed: mjbFreezed,
mjbXcped: mjbXcped,
jaren: [mjb_freeze_year],
freeze: true
};
var mjblist_sql = ins.getmjblist_sql(mjbparams);
// De mjblist_sql bevat nu alle objecten (ins_deel_key) van de aangevinkte regels uit het mjb overzicht en levert voor elk object de waarden voor de insert op.
var result = {success: true, multi: multi, start: true };
var oRs = Oracle.Execute(mjblist_sql);
user.anything_todo_or_abort(!oRs.eof); // We klagen niet over enkele wel en enkele niet
var insert_sql = "BEGIN ";
while (!oRs.eof)
{
var ins_key = oRs("ins_deel_key").Value;
var srtcont_key = oRs("ins_srtcontrole_key").Value;
var nextdate = oRs("nextdate").Value != null? new Date(oRs("nextdate").Value) : null;
var inspstatus = oRs("ins_deelsrtcontrole_status").Value;
var kosten = oRs("freeze_bedrag").Value;
var opm_has_higherprio = oRs("opm_has_higherprio").Value;
ingesloten.push({ins_key: ins_key, srtcont_key: srtcont_key, dlsrtcont_key: -1,
inspectiestatus: inspstatus, kosten: kosten, ismjob: true});
insert_sql += "INSERT INTO ins_deelsrtcontrole(ins_deel_key"
+ " , ins_srtcontrole_key"
+ " , ins_deelsrtcontrole_status"
+ " , prs_perslid_key"
+ (nextdate
? " , ins_deelsrtcontrole_datum_org"
: "")
+ " , ins_deelsrtcontrole_freezecost"
+ " , ins_deelsrtcontrole_freezedate"
+ " , ins_deelsrtcontrole_opmerking"
+ " )"
+ " VALUES (" + ins_key
+ " , " + srtcont_key
+ " , 2"
+ " , " + user_key
+ (nextdate
? " , " + nextdate.toSQL(true)
: "")
+ " , " + kosten
+ " , TRUNC(TO_DATE(TO_CHAR(SYSDATE, 'DD-MON') || '-" + mjb_freeze_year + "', 'DD-MON-YYYY'), 'YEAR')"
+ " , " + safe.quoted_sql(opm_has_higherprio)
+ " )"
+ ";";
oRs.MoveNext();
}
oRs.Close();
insert_sql += " END;"
var err = Oracle.Execute(insert_sql, true);
if (err.friendlyMsg)
result.message = err.friendlyMsg;
for (var i = 0; i < ingesloten.length; i++)
{
var sql = "SELECT MAX(idsc.ins_deelsrtcontrole_key) max_idsc_key"
+ " FROM ins_deelsrtcontrole idsc"
+ " WHERE idsc.ins_deel_key = " + ingesloten[i].ins_key
+ " AND idsc.ins_srtcontrole_key = " + ingesloten[i].srtcont_key
+ " AND idsc.ins_scenario_key = 1";
var oRs_idsc = Oracle.Execute(sql);
ingesloten[i].dlsrtcont_key = oRs_idsc("max_idsc_key").Value;
oRs_idsc.Close();
}
}
else
{
var tobestart = 0;
var dlsrtcont_key = -1;
// Bepaal de objecten/delen in de selectie die
// ook echt gestart kunnen of mogen worden.
var ctrdisc_key = -1;
if (srtcont_key_arr.length > 0)
{
for (var i = 0; i < ins_key_arr.length; i++)
{
dlsrtcont_key = -1;
var ins_xcp_active_cost = S("ins_xcp_active_cost");
var costarray = [];
if (ins_xcp_active_cost & 1) costarray.push("COALESCE(xcp.ins_srtcontrole_kosten, 0)");
if (ins_xcp_active_cost & 2) costarray.push("COALESCE(xcp.ins_srtcontrole_kosten2, 0)");
if (ins_xcp_active_cost & 4) costarray.push("COALESCE(xcp.ins_srtcontrole_kosten3, 0)");
if (ins_xcp_active_cost & 8) costarray.push("COALESCE(xcp.ins_srtcontrole_materiaal, 0)");
var sqlcost = "";
if (costarray.length > 0)
sqlcost = "(" + costarray.join(" + ") + ") *";
var sql = "SELECT idsc.ins_deelsrtcontrole_key"
+ " , idsc.ins_deelsrtcontrole_status"
+ " , xcp.ctr_discipline_key"
+ " , xcp.ins_srtcontrole_key"
+ " , xcp.ins_srtcontrole_level"
+ " , COALESCE (xcp.ins_deel_aantal *"
+ " " + sqlcost
+ " (COALESCE(xcp.ins_srtcontrole_percentage, 100) / 100) *"
+ " POWER(" + inflatiefactor + " , " + mjb_freeze_year + " - EXTRACT(YEAR FROM SYSDATE))" // Bevriezen van het kalenderjaar S("mjb_freeze_year").
+ " , 0) bedrag" // Geen btw in bedrag/kosten die opgeslagen moet worden.
+ " , xcp.ctr_ismjob"
+ " FROM ins_deelsrtcontrole idsc"
+ " , ins_v_defined_inspect_xcp xcp"
+ " WHERE xcp.ins_srtcontrole_key = idsc.ins_srtcontrole_key(+)" // Er kan nog voor de eerste keer geinspecteerd moeten worden.
+ " AND xcp.ins_deel_key = idsc.ins_deel_key(+)"
+ " AND xcp.ins_deel_key = " + ins_key_arr[i]
+ " AND xcp.ins_srtcontrole_key = " + srtcont_key_arr[i]
+ " AND idsc.ins_scenario_key(+) = 1"
+ " AND xcp.ins_scenario_key = 1"
+ " ORDER BY ins_deelsrtcontrole_datum DESC";
var oRs = Oracle.Execute(sql);
ctrdisc_key = oRs("ctr_discipline_key").Value;
// Waarden moeten aanwezig zijn. Mocht dat niet zo zijn dan is er iets fout.
var ins_deelsrtcontrole_status = oRs("ins_deelsrtcontrole_status").Value != null? oRs("ins_deelsrtcontrole_status").Value : -1; // Als er nog geen inspectie is geweest is de status -1.
var ins_deelsrtcontrole_key = oRs("ins_deelsrtcontrole_key").Value;
var kosten = oRs("bedrag").Value;
var ismjob = oRs("ctr_ismjob").Value == 1;
oRs.Close();
if (ins_deelsrtcontrole_status != -1 && ins_deelsrtcontrole_status != 6)
dlsrtcont_key = ins_deelsrtcontrole_key;
var this_ins = ins.func_enabled_deel(ins_key_arr[i],
{srtcont_key: srtcont_key_arr[i],
deelsrtcont_key: dlsrtcont_key
});
// Het laatste inspectierecord moet Gepland(0) of Verwerkt(6) (ins_deelsrtcontrole_status = -1) zijn, anders kan de inspectie niet gestart worden.
if ((!freeze && this_ins.canInspStart) || (freeze && this_ins.canInspFreeze))
{ // Alle Arrays zijn even groot.
ingesloten.push({ins_key: ins_key_arr[i], srtcont_key: srtcont_key_arr[i], dlsrtcont_key: dlsrtcont_key,
inspectiestatus: ins_deelsrtcontrole_status, kosten: kosten, ismjob: ismjob});
tobestart++;
}
}
}
lcl.set_dialect(ctrdisc_key, "INS_TAB_DISCIPLINE_KEY");
user.anything_todo_or_abort(tobestart > 0); // We klagen niet over enkele wel en enkele niet
var result = {success: true, multi: multi, start: true };
result.key = "";
for (var i = 0; i < ingesloten.length; i++)
{ // Zetten van de status en afhandelen van de tracking van het starten.
if (ingesloten[i].dlsrtcont_key < 0)
{ // Er is nog geen inspectie (ins_deelsrtcontrole) record aangemaakt. Eerst maar eens aanmaken.
// Als er al een inspectie is geweest kan er een volgende inspectiedatum berekend worden.
var nextdate = null;
if (ingesloten[i].inspectiestatus > -1)
{ // Bereken de volgende inspectiedatum.
// Alleen Active Situatie (AS) soort controle's kunnen gestart worden dus voor scenario key moet 1 genomen worden.
var sql = "SELECT ins.nextcyclusdate (" + ingesloten[i].ins_key + ", " + ingesloten[i].srtcont_key + ", 1, 1) nextdate FROM DUAL"
var oRs = Oracle.Execute(sql);
nextdate = new Date(oRs("nextdate").Value);
oRs.Close();
}
//else Er zijn nog geen inspecties geweest voor dit object. Dit wordt de eerste inspectie.
// Volgende inspectiedatum kun je niet berekenen en is dus onbekend (leeg)
// Plandatum blijft leeg.
var fields = [ { dbs: "ins_deelsrtcontrole_key", typ: "key", seq: "ins_s_ins_deelsrtcontrole_key" },
{ dbs: "ins_deel_key", typ: "key", val: ingesloten[i].ins_key },
{ dbs: "ins_srtcontrole_key", typ: "key", val: ingesloten[i].srtcont_key },
{ dbs: "ins_deelsrtcontrole_status", typ: "key", val: 2 },
{ dbs: "prs_perslid_key", typ: "key", val: user_key },
{ dbs: "ins_deelsrtcontrole_datum_org", typ: "datetime", val: (nextdate? nextdate : null) }
];
// Als je mag bevriezen (canInspFreeze) dan zijn er kosten aanwezig in het jaar mjb_freeze_year.
if (freeze && (ingesloten[i].kosten >= 0))
{ // Uitzoeken of de taak door een hogere prio taak wordt uitgevoerd (kosten zijn 0 in het overzicht).
// In dat geval zijn de freeze kosten 0 en plaatsen we een opmerking.
// Voor MJOB is de interval modus actief.
// Neem de Active Situatie (AS) (Scenario = 1).
var sql = "SELECT insp.ins_deelsrtcontrole_key"
+ " , insp.ins_srtcontrole_level"
// Bepaling in welk jaar er een inspectie is gepland.
// 1) In het jaar van de plandatum.
// 2) In het jaar van de startdatum.
// 3) a) Laatste inspectie is NULL (eerste inspectie moet nog komen) en het is een Controle(1).
// Volgende inspectie is in het freeze jaar.
// b) Laatste inspectie is NULL (eerste inspectie moet nog komen) en het is een Vervanging(2) of Certificering(3).
// Nextdate is na het freeze jaar?
// Ja) Vorige inspectie ligt na het start jaar en ligt niet in het aanmaak jaar?
// Ja) Volgende inspectie is in het freeze jaar.
// Nee) Volgende inspectie is het jaar van de nextdate.
// Nee) De laatst ingeplande inspectie (nextdate) is na of in het start jaar?
// Ja) Volgende inspectie is in het freeze jaar.
// Nee) Volgende inspectie is in het jaar "nextdatum + periode".
// c) Laatste inspectie is niet NULL. Er is al 1 of meerdere keren geinspecteerd.
// Ligt de laatst ingeplande inspectie (nextdate) na dit jaar?
// Ja) Volgende inspectie is het jaar van de nextdate (in de toekomst).
// Nee) Volgende inspectie is in het freeze jaar.
+ " , CASE"
+ " WHEN"
+ " EXTRACT(YEAR FROM "
+ " COALESCE(insp.plandatum"
+ " , CASE WHEN insp.laatste IS NULL THEN insp.ins_srtcontroledl_xcp_startdat ELSE NULL END"
+ " , CASE"
+ " WHEN insp.laatste IS NULL AND insp.ctr_controle_type = 1" // 1: Controle.
+ " THEN TO_DATE('" + mjb_freeze_year + "', 'YYYY')"
+ " WHEN insp.laatste IS NULL AND insp.ctr_controle_type != 1" // 2: Vervanging, 3: Certificering.
+ " THEN" // Er is nog geen inspectie geweest
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM insp.inspectie_next0) > " + mjb_freeze_year
+ " THEN" // Nextdate is na de freeze datum.
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM ADD_MONTHS(insp.inspectie_next0, -1 * 12 * insp.ins_srtcontrole_periode)) >= " + mjb_start_year + " AND"
+ " EXTRACT(YEAR FROM ADD_MONTHS(insp.inspectie_next0, -1 * 12 * insp.ins_srtcontrole_periode)) != EXTRACT(YEAR FROM insp.ins_deel_aanmaak)"
+ " THEN TO_DATE('" + mjb_freeze_year + "', 'YYYY')" // Vorige inspectie ligt tussen start en freeze jaar (Nu ligt er ook tussen).
+ " ELSE insp.inspectie_next0"
+ " END"
+ " ELSE" // Nextdate is voor of in het freeze jaar.
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM insp.inspectie_next0) >= " + mjb_start_year
+ " THEN TO_DATE('" + mjb_freeze_year + "', 'YYYY')" // Nextdate tussen start en freeze jaar.
+ " ELSE ADD_MONTHS(insp.inspectie_next0, 12 * insp.ins_srtcontrole_periode)" // Nextdate voor het start jaar.
+ " END"
+ " END"
+ " ELSE" // Laatste IS NOT NULL. Er is al een inspectie geweest.
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM insp.inspectie_next0) > EXTRACT(YEAR FROM SYSDATE)"
+ " THEN insp.inspectie_next0" // Volgende inspectie is in de toekomst.
+ " ELSE TO_DATE('" + mjb_freeze_year + "', 'YYYY')" // Laatst ingeplande inspectie is nog niet uitgevoerd.
+ " END"
+ " END)) = " + mjb_freeze_year
+ " THEN 1"
+ " ELSE 0"
+ " END isFreezeYear"
+ " FROM ("
+ " SELECT xcp.ins_deel_key"
+ " , xcp.ins_srtcontrole_key"
+ " , idsc.ins_deelsrtcontrole_key"
+ " , xcp.ctr_discipline_key"
+ " , xcp.ins_srtcontrole_periode"
+ " , xcp.ins_deel_aanmaak"
+ " , xcp.ctr_controle_type"
+ " , idsc.ins_deelsrtcontrole_plandatum plandatum"
+ " , ins_srtcontroledl_xcp_startdat"
+ " , xcp.ins_srtcontrole_level"
+ " , ins.nextcyclusdate(xcp.ins_deel_key, xcp.ins_srtcontrole_key, 1, 0) inspectie_next0"
+ " , (SELECT MAX(idsc2.ins_deelsrtcontrole_datum)"
+ " FROM ins_deelsrtcontrole idsc2"
+ " WHERE idsc2.ins_deel_key = " + ingesloten[i].ins_key
+ " AND idsc2.ins_srtcontrole_key = xcp.ins_srtcontrole_key"
+ " AND idsc2.ins_scenario_key = 1) laatste"
+ " FROM ins_deelsrtcontrole idsc"
+ " , ins_v_defined_inspect_xcp xcp"
+ " WHERE xcp.ins_srtcontrole_key = idsc.ins_srtcontrole_key(+)" // Er kan nog voor de eerste keer geinspecteerd moeten worden.
+ " AND xcp.ins_srtcontrole_key = xcp.ins_srtcontrole_key"
+ " AND xcp.ins_deel_key = " + ingesloten[i].ins_key
+ " AND idsc.ins_deel_key(+) = " + ingesloten[i].ins_key
+ " AND idsc.ins_scenario_key(+) = 1"
+ " AND xcp.ins_scenario_key = 1"
+ " AND (idsc.ins_deelsrtcontrole_key IS NULL OR"
+ " idsc.ins_deelsrtcontrole_key = (SELECT MAX(idsc2.ins_deelsrtcontrole_key)"
+ " FROM ins_deelsrtcontrole idsc2"
+ " WHERE idsc2.ins_deel_key = " + ingesloten[i].ins_key
+ " AND idsc2.ins_srtcontrole_key = xcp.ins_srtcontrole_key"
+ " AND idsc2.ins_scenario_key = 1"
+ " ))"
// Zichtzelf uitsluiten.
+ " AND xcp.ins_srtcontrole_key != " + ingesloten[i].srtcont_key
// Alleen soort controles met een lager level opleveren.
+ " AND xcp.ins_srtcontrole_level < (SELECT isc.ins_srtcontrole_level"
+ " FROM ins_srtcontrole isc"
+ " WHERE isc.ins_srtcontrole_key = " + ingesloten[i].srtcont_key + ")"
+ " ) insp";
var oRs = Oracle.Execute(sql);
var has_higherprio = !oRs.eof && oRs("isFreezeYear").Value == 1; // Is er een hoger prio soort controle in het freeze jaar?
oRs.Close();
fields.push( { dbs: "ins_deelsrtcontrole_freezecost", typ: "float", val: (has_higherprio? 0 : ingesloten[i].kosten) } );
fields.push( { dbs: "ins_deelsrtcontrole_freezedate", typ: "datetime", val: new Date(mjb_freeze_year, 0, 1) } ); // Freezedate eerste dag van freeze year.
// Als er een hoger prio soort controle aanwezig is in het freeze jaar, dan een opmerking toevoegen.
if (has_higherprio)
fields.push( { dbs: "ins_deelsrtcontrole_opmerking", typ: "varchar", val: L("lcl_mjb_performed_high") } );
}
var insIns = buildInsert("ins_deelsrtcontrole", fields);
ingesloten[i].dlsrtcont_key = insIns.sequences["ins_deelsrtcontrole_key"];
var err = Oracle.Execute(insIns.sql, true);
if (err.friendlyMsg)
{
result.warning = err.friendlyMsg;
result.success = false;
}
}
// else de melding is wellicht ingepland. Dan zet we later wel de status op 2.
}
}
for (var i = 0; i < ingesloten.length; i++)
{ // Zetten van de status en afhandelen van de tracking van het starten.
// Melding aanmaken bij bevriezen van taak als setting op internal staat.
if (freeze && ingesloten[i].ismjob && S("mjb_operation_external") == 0) // Operational handling mjob {0=internal (default) | 1=external}.
{ // Melding aanmaken bij bevriezing.
// De setting "mjb_default_stdmelding" moet gevuld zijn met een geldige waarde. Daar gaan we van uit.
sql = "SELECT COALESCE(di.mld_stdmelding_key, fac.safe_To_Number(fac.getsetting ('mjb_default_stdmelding'))) default_stdmelding"
+ " , di.ctr_ismjob"
+ " FROM ins_deelsrtcontrole idsc"
+ " , ins_srtcontrole isc"
+ " , ins_tab_discipline itd"
+ " , ins_v_defined_inspect di"
+ " WHERE idsc.ins_srtcontrole_key = isc.ins_srtcontrole_key"
+ " AND idsc.ins_scenario_key = isc.ins_scenario_key"
+ " AND isc.ctr_discipline_key = itd.ins_discipline_key"
+ " AND isc.ins_srtcontrole_key = di.ins_srtcontrole_key"
+ " AND idsc.ins_deel_key = di.ins_deel_key"
+ " AND idsc.ins_deelsrtcontrole_key = " + ingesloten[i].dlsrtcont_key;
oRs = Oracle.Execute(sql);
var default_stdmelding = oRs("default_stdmelding").Value;
var stdm_info = mld.mld_stdmeldinginfo(default_stdmelding);
oRs.Close();
sql = "SELECT alg_locatie_key,"
+ " alg_gebouw_key,"
+ " alg_verdieping_key,"
+ " alg_ruimte_key"
+ " FROM ins_deel isd, alg_v_allonroerendgoed alg"
+ " WHERE ins_deel_key = " + ingesloten[i].ins_key
+ " AND alg_onroerendgoed_keys = isd.ins_alg_ruimte_key"
+ " AND isd.ins_alg_ruimte_type = 'R'"
oRs = Oracle.Execute(sql);
if (!oRs.Eof)
{
loc_key = oRs("alg_locatie_key").Value;
bld_key = oRs("alg_gebouw_key").Value;
flr_key = oRs("alg_verdieping_key").Value;
room_key = oRs("alg_ruimte_key").Value;
}
var issues = new model_issues();
var params = {};
var jsondata = {issuetype: default_stdmelding,
issuedate: new Date(),
account: user.afdeling().prs_kostenplaats_key(),
contact: user_key,
location: loc_key,
building: bld_key,
floor: flr_key,
room: room_key,
priority: 3, // Default prioriteit 3.
kto_key: ingesloten[i].dlsrtcont_key,
kto_type: "T",
kto: (stdm_info.stdmelding_kto & 1)? 1 : 0,
meldbron: 10};
var issues_array = issues.REST_POST(params, jsondata);
oRs.Close();
}
// Nu nog de status zetten, tracking genereren en notificaties sturen.
ins.setinspectstatus(ingesloten[i].dlsrtcont_key, 2); // In behandeling(2)
result.key += (i > 0? "," : "") + ingesloten[i].dlsrtcont_key;
}
Response.Write(JSON.stringify(result));
%>