AAGN#88039: Performance issue bij assetmanagement en draaien/exporteren taken-overzicht.

svn path=/Website/trunk/; revision=70724
This commit is contained in:
Maykel Geerdink
2025-10-27 15:42:15 +00:00
parent 482f217959
commit 619c2ef05a
4 changed files with 415 additions and 385 deletions

View File

@@ -1738,6 +1738,380 @@ ins = {checkAutLevel:
+ " GROUP BY res_ins_deel_key)"
},
// De inspectie_next met berekeningen van de nextcyclusdate (database procedure fac.nextcyclusdate()) zo ver mogelijk naar buiten gehaald,
// zodat deze berekeningen zo laat mogelijk worden berekend met een zo klein mogelijke verzameling resultaten (RABO#60119).
// Voor RABO ging het aantal aanroepen van fac.nextcyclusdate() van 635279 naar 1888 aanroepen (nog maar 0,3% van de oorspronkelijke aantal aanroepen).
// De uitvoertijd ging van 2,5-3 minuten naar ongeveer 40 seconden.
// Voor AAGN#88039: Voor het testen van de performance van de functies getnextinspection_future en getnextinspection_n in de database zijn ze ook in de database gezet.
// De query duurde dan 3 seconden langer (Van 17 sec. naar 20 sec). Daarom deze functie maar hier in de code gelaten.
// Wel is de code voor de periodiek taken lijst en de taken lijst bij een object nu samengevoegd in de functie getnextinspection_future.
// Mode 1: Periodieke taken lijst.
// Inspecties die nog nooit zijn uitgevoerd/ingepland. Er is nog geen ins_deelsrtcontrole regel aanwezig en dus ook geen plandatum/respijtdatum.
// Er is nog geen laatste inspectie (laatste is NULL).
// Mode 2: Taken lijst bij een object.
// Mogelijke inspecties op het object die nog gaan komen.
// Als er een voorlopige inspectie is aangemaakt maar nog niet is afgemeld of afgerond, dan hoeft er geen nieuwe inspectie te worden getoond.
// Dus met de respijt heb je in dit eerste deel van de query niet meer te maken.
getnextinspection_future:
function (ptable, pmode)
{
var mjb_freeze_or_sys_year = Math.max(S("mjb_freeze_year"), new Date().getFullYear());
var mjb_start_year = S("mjb_start_year");
var laatste = "NULL";
var laatste_not_suc = "NULL";
var laatste_jaar = "NULL";
if (pmode == 2)
{
var laatste = "(SELECT MAX(ins_deelsrtcontrole_key) laatste"
+ " FROM ins_deelsrtcontrole id2"
+ " , ins_controlemode cm"
+ " WHERE id2.ins_controlemode_key = cm.ins_controlemode_key(+)"
+ " AND id2.ins_scenario_key = 1"
+ " AND (cm.ins_controlemode_success = 1 OR id2.ins_deelsrtcontrole_status < 6)"
+ " AND id2.ins_deel_key = " + ptable + ".ins_deel_key"
+ " AND id2.ins_srtcontrole_key = " + ptable + ".ins_srtcontrole_key)";
// Laatste (niet) succesvol uitgevoerde taak.
var laatste_not_suc = "(SELECT MAX(id2.ins_deelsrtcontrole_key)"
+ " FROM ins_deelsrtcontrole id2"
+ " , ins_controlemode cm"
+ " WHERE id2.ins_controlemode_key = cm.ins_controlemode_key"
+ " AND cm.ins_controlemode_success = 0"
+ " AND id2.ins_deelsrtcontrole_key = (SELECT MAX(ins_deelsrtcontrole_key)"
+ " FROM ins_deelsrtcontrole id3"
+ " WHERE id3.ins_deel_key = " + ptable + ".ins_deel_key"
+ " AND id3.ins_srtcontrole_key = " + ptable + ".ins_srtcontrole_key"
+ " AND id3.ins_scenario_key = 1"
+ " AND id3.ins_deelsrtcontrole_status = 6))";
var laatste_jaar = "(SELECT MAX(ins_deelsrtcontrole_datum) laatste_jaar"
+ " FROM ins_deelsrtcontrole id2"
+ " , ins_controlemode cm"
+ " WHERE id2.ins_controlemode_key = cm.ins_controlemode_key"
+ " AND cm.ins_controlemode_success = 0"
+ " AND id2.ins_deelsrtcontrole_key = (SELECT MAX(ins_deelsrtcontrole_key)"
+ " FROM ins_deelsrtcontrole id3"
+ " WHERE id3.ins_deel_key = " + ptable + ".ins_deel_key"
+ " AND id3.ins_srtcontrole_key = " + ptable + ".ins_srtcontrole_key"
+ " AND id3.ins_scenario_key = 1"
+ " AND id3.ins_deelsrtcontrole_status = 6))";
}
if (pmode == 1) // laatste IS NULL, dan is lastinspect dus ook NULL.
{
var lastinspect = "NULL";
}
else
{
var lastinspect = "(SELECT CASE " + ptable + ".ins_srtcontrole_mode"
+ " WHEN 0"
+ " THEN idsc.ins_deelsrtcontrole_datum_org" // Moment modus. Uitgaan van eigenlijke/orginele inspectiedatum.
+ " ELSE idsc.ins_deelsrtcontrole_datum" // Interval modus. Uitgaan van werkelijke inspectiedatum.
+ " END ins_deelsrtcontrole_datum"
+ " FROM ins_deelsrtcontrole idsc"
+ " WHERE idsc.ins_deel_key = " + ptable + ".ins_deel_key"
+ " AND idsc.ins_srtcontrole_key = " + ptable + ".ins_srtcontrole_key"
+ " AND idsc.ins_deelsrtcontrole_status IN (5, 6)"
+ " AND idsc.ins_deelsrtcontrole_key = (SELECT MAX(idsc2.ins_deelsrtcontrole_key)"
+ " FROM ins_deelsrtcontrole idsc2"
+ " WHERE idsc2.ins_deel_key = " + ptable + ".ins_deel_key"
+ " AND idsc2.ins_srtcontrole_key = " + ptable + ".ins_srtcontrole_key"
+ " AND idsc2.ins_deelsrtcontrole_status IN (5, 6)"
+ " AND idsc2.ins_scenario_key = 1))";
}
var nextdate = " CASE"
+ " WHEN " + ptable + ".ctr_ismjob = 1"
+ " THEN" // MJOB
// 1) Laatste inpspectie is NIET succesvol (laatste_not_suc IS NOT NULL).
// De NIET succesvolle taak is in het freeze jaar
// Ja) Volgende inspectie is in het jaar na het freeze jaar.
// Nee) Volgende inspectie is in het freeze jaar.
// 2) Er is nog geen inspectie geweest en de startdatum is ingevuld.
// Er geldt dan het volgende:
// Voor Controle(1): Eerste inspectie tonen op MAX(startdatum, registratiedatum) van het object.
// Voor Vervanging(2) of Certificering(3):
// a) Als registratiedatum het verst in de toekomst ligt: Eerste inspectie tonen op 1 periode verder dan de registratiedatum.
// b) Als de startdatum het verst in de toekomst ligt: Eerste inspectie tonen op de startdatum.
// De aanmaakdatum/Registratiedatum is altijd ingevuld en als er al een inspectie is geweest, zijn de startdatum en registratiedatum niet meer van belang.
// 3) Er is nog geen inspectie geweest en alleen de aanmaakdatum/Registratiedatum ligt in het huidige jaar of in de toekomst.
// Voor Controle(1):
// a) Als registratiedatum < freeze jaar dan eerste inspectie tonen in het freeze jaar
// b) Anders inspectie tonen in het registratiejaar.
// Voor Vervanging(2) of Certificering(3):
// a) Als (registratiedatum + periode) < freeze jaar dan eerste inspectie tonen in het freeze jaar
// b) Anders inspectie tonen in het (registratiejaar + periode)
// 4) Startdatum is niet ingevuld en aanmaakdatum is geweest (ligt in het verleden).
// 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? (Nextdate is eerste next(inspectie)datum, startdatum of aanmaakdatum in de toekomst. Hier aanmaakdatum + n*periode met n = 0 of hoger.
// 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.
// LET OP: c.laatste: geeft de ins_deelsrtcontrole_datum terug van de laatste geplande, geaccordeerde of succesvol uitgevoerde taak.
// laatste_not_suc: Als de laatste uitgevoerde taak NIET succesvoll is geeft deze de ins_deelsrtcontrole_datum terug van deze taak.
// P.S.: De aanmaakdatum/Registratiedatum is altijd ingevuld en als er al een inspectie is geweest, zijn de startdatum en registratiedatum niet meer van belang.
+ " COALESCE(CASE" // 1) Laatste inspectie is NIET succesvol en er zijn verder geen geplande, geaccordeerde of succesvol uitgevoerde taak aanwezig.
+ " WHEN " + laatste_not_suc + " IS NOT NULL AND " + laatste + " IS NULL"
+ " THEN"
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM " + laatste_jaar + ") = " + mjb_freeze_or_sys_year
+ " THEN TO_DATE('31-12-" + (mjb_freeze_or_sys_year + 1) + "', 'DD-MM-YYYY')"
+ " ELSE TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " END"
+ " ELSE NULL"
+ " END"
+ " , CASE" // 2) Eventueel startdatum (ins_srtcontroledl_xcp_startdat) i.g.v. als er nog geen inspectie heeft plaatsgevonden.
+ " WHEN " + laatste + " IS NULL AND" // Als er al een inspectie is geweest, is de startdatum niet meer van belang.
+ " " + ptable + ".ins_srtcontroledl_xcp_startdat IS NOT NULL" // Startdatum is ingevuld en er is nog geen inspectie geweest.
+ " THEN" // 2) Startdatum is ingevuld en ligt in het verleden of de toekomst en er is nog geen inspectie geweest.
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM " + ptable + ".ins_srtcontroledl_xcp_startdat) >= EXTRACT(YEAR FROM " + ptable + ".ins_deel_aanmaak)"
+ " THEN" // 2a) Startdatum op of na aanmaakdatum/registratiedatum.
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM " + ptable + ".ins_srtcontroledl_xcp_startdat) < " + mjb_freeze_or_sys_year
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " ELSE " + ptable + ".ins_srtcontroledl_xcp_startdat"
+ " END"
+ " ELSE" // 2b) Aanmaakdatum/Registratiedatum is na de startdatum.
+ " CASE"
+ " WHEN " + ptable + ".ctr_controle_type = 1" // Controle(1).
+ " THEN"
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM " + ptable + ".ins_deel_aanmaak) < " + mjb_freeze_or_sys_year
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " ELSE " + ptable + ".ins_deel_aanmaak" // Registratiedatum.
+ " END"
+ " ELSE" // Vervanging(2), Certificering(3).
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM ADD_MONTHS(" + ptable + ".ins_deel_aanmaak, 12 * " + ptable + ".ins_srtcontrole_periode)) < " + mjb_freeze_or_sys_year
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " ELSE ADD_MONTHS(" + ptable + ".ins_deel_aanmaak, 12 * " + ptable + ".ins_srtcontrole_periode)" // 1 periode na registratiedatum.
+ " END"
+ " END"
+ " END"
+ " WHEN " + laatste + " IS NULL AND"
+ " EXTRACT(YEAR FROM " + ptable + ".ins_deel_aanmaak) >= EXTRACT(YEAR FROM SYSDATE)" // Alleen de aanmaakdatum/registratiedatum is ingevuld.
+ " THEN" // 3) Aanmaakdatum/Registratiedatum is alleen ingevuld en ligt in het huidige jaar of in de toekomst en er is nog geen inspectie geweest.
+ " CASE"
+ " WHEN " + ptable + ".ctr_controle_type = 1" // Controle(1).
+ " THEN"
+ " CASE"
+ " WHEN EXTRACT( YEAR FROM " + ptable + ".ins_deel_aanmaak) < " + mjb_freeze_or_sys_year
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " ELSE " + ptable + ".ins_deel_aanmaak"
+ " END"
+ " ELSE" // Vervanging(2), Certificering(3).
+ " CASE"
+ " WHEN EXTRACT( YEAR FROM ADD_MONTHS(" + ptable + ".ins_deel_aanmaak, 12 * " + ptable + ".ins_srtcontrole_periode)) < " + mjb_freeze_or_sys_year
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " ELSE ADD_MONTHS(" + ptable + ".ins_deel_aanmaak, 12 * " + ptable + ".ins_srtcontrole_periode)"
+ " END"
+ " END"
+ " ELSE"
+ " NULL"
+ " END"
+ " , CASE" // 4) Berekenen jaar.
+ " WHEN " + laatste + " IS NULL AND " + ptable + ".ctr_controle_type = 1" // Controle(1).
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')" // 4a)
+ " WHEN " + laatste + " IS NULL AND " + ptable + ".ctr_controle_type != 1" // Vervanging(2), Certificering(3).
+ " THEN" // 4b) Er is nog geen inspectie geweest
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM ins.nextcyclusdate(" + ptable + ".ins_deel_key, " + ptable + ".ins_srtcontrole_key, 1, 0)) > " + mjb_freeze_or_sys_year
+ " THEN" // Nextdate is na de freeze datum.
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM ADD_MONTHS(ins.nextcyclusdate(" + ptable + ".ins_deel_key, " + ptable + ".ins_srtcontrole_key, 1, 0), -1 * 12 * " + ptable + ".ins_srtcontrole_periode)) >= " + mjb_start_year + " AND"
+ " EXTRACT(YEAR FROM ADD_MONTHS(ins.nextcyclusdate(" + ptable + ".ins_deel_key, " + ptable + ".ins_srtcontrole_key, 1, 0), -1 * 12 * " + ptable + ".ins_srtcontrole_periode)) != EXTRACT(YEAR FROM " + ptable + ".ins_deel_aanmaak)"
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')" // Nu en vorige inspectie liggen tussen start en freeze jaar.
+ " ELSE ins.nextcyclusdate(" + ptable + ".ins_deel_key, " + ptable + ".ins_srtcontrole_key, 1, 0)"
+ " END"
+ " ELSE" // Nextdate is voor of in het freeze jaar.
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM ins.nextcyclusdate(" + ptable + ".ins_deel_key, " + ptable + ".ins_srtcontrole_key, 1, 0)) >= " + mjb_start_year
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')" // Nextdate tussen start en freeze jaar.
+ " ELSE ADD_MONTHS(ins.nextcyclusdate(" + ptable + ".ins_deel_key, " + ptable + ".ins_srtcontrole_key, 1, 0), 12 * " + ptable + ".ins_srtcontrole_periode)" // Nextdate voor het start jaar.
+ " END"
+ " END"
+ " ELSE" // 4c) Laatste IS NOT NULL. Er is al een inspectie geweest.
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM ins.nextcyclusdate(" + ptable + ".ins_deel_key, " + ptable + ".ins_srtcontrole_key, 1, 0)) > EXTRACT(YEAR FROM SYSDATE)"
+ " THEN ins.nextcyclusdate(" + ptable + ".ins_deel_key, " + ptable + ".ins_srtcontrole_key, 1, 0)" // Volgende inspectie is in de toekomst.
// Geaccordeerde laatste inspectie hoeft hier niet te worden afgevangen zoals bij org_nextdate.
// Deze deelquery leverta alleen resultaat als laatste inspectie is voltooid..
+ " ELSE TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')" // Laatst ingeplande inspectie is nog steeds niet uitgevoerd. Dus opnieuw in het freeze jaar tonen zodat deze daar gefreezed kan worden.
+ " END"
+ " END)"
+ " ELSE" // Periodieke taken (NIET MJOB)
// Als respijtdatum vandaag of dit uur is dan is de respijtdatum de eerstvolgende inspectie en dan dus de respijtdatum opleveren.
// Als er vandaag of dit uur niet geinspecteerd is dan de eerstvolgende inspectiedatum vandaag of in de toekomst (steps = 0: functie nextcyclusdate(..., 0))
// Als er vandaag of dit uur al geinspecteerd is dan de eerstvolgende inspectiedatum in de toekomst (steps = 1: functie nextcyclusdate(..., 1))
//
// Er is nog geen inspectie geweest en de startdatum is ingevuld of de registratiedatum ligt in de toekomst.
// De inspectie is nog niet ingepland.
// Er geldt:
// Voor Controle(1):
// a) De eerste inspectie is op MAX(startdatum, registratiedatum) van het object.
// Voor Vervanging(2) of Certificering(3):
// a) Als aanmaakdatum > startdatum: Eerste inspectie tonen op 1 periode verder dan de registratiedatum.
// b) Als aanmaakdatum < startdatum: Eerste inspectie tonen op de startdatum.
// De aanmaakdatum/Registratiedatum is altijd ingevuld en als er al een inspectie is geweest, zijn de startdatum en registratiedatum niet meer van belang.
+ " COALESCE(CASE"
+ " WHEN " + ptable + ".ins_srtcontroledl_xcp_startdat >= " + ptable + ".ins_deel_aanmaak AND " + lastinspect + " IS NULL" // Als startdatum en aanmaakdatum/Registratiedatum hetzelfde dan op die datum beginnen.
+ " THEN " + ptable + ".ins_srtcontroledl_xcp_startdat"
+ " ELSE NULL"
+ " END"
+ " , fac.nextcyclusdate (COALESCE(" + lastinspect + ", " + ptable + ".ins_deel_aanmaak)"
+ " , " + ptable + ".ins_srtcontrole_mode"
+ " , " + ptable + ".ins_srtcontrole_eenheid"
+ " , " + ptable + ".ins_srtcontrole_periode"
+ " , " + ptable + ".ins_srtcontrole_bits"
+ " , CASE"
+ " WHEN " + pmode + " = 1"
+ " THEN 1"
+ " WHEN " + ptable + ".ins_srtcontrole_mode = 1" // Interval modus
+ " THEN 1"
+ " WHEN " + ptable + ".ins_srtcontrole_eenheid = 0 AND"
+ " TRUNC (COALESCE (" + lastinspect + ", " + ptable + ".ins_deel_aanmaak), 'HH24' ) >= TRUNC (SYSDATE, 'HH24')"
+ " THEN 1" // Uurlijks: Als de datum in de toekomst ligt, bepaal dan de volgende datum (1 step verder).
+ " WHEN " + ptable + ".ins_srtcontrole_eenheid > 0 AND"
+ " TRUNC (COALESCE (" + lastinspect + ", " + ptable + ".ins_deel_aanmaak),'DDD') >= TRUNC (SYSDATE, 'DDD')"
+ " THEN 1" // Dagelijks t/m jaarlijks: Als de datum in de toekomst ligt, bepaal dan de volgende datum (1 step verder).
+ " WHEN " + lastinspect + " IS NULL"
+ " THEN 1" // Als Eerste inspectie, bepaal dan ook de volgende (1 step) datum.
+ " ELSE 0" // Vindt de eerste datum vandaag of in de toekomst
+ " END"
+ " , " + ptable + ".ctr_ismjob))"
+ " END";
return nextdate;
},
// Periodieke taken.
// Inspecties die al eens zijn uitgevoerd of inspecties die voor het eerst zijn ingepland(0) of gestart(2) maar nog geen uitgevoerde/afgemelde(6) inspectie hebben.
getnextinspection_n:
function ()
{
var mjb_freeze_or_sys_year = Math.max(S("mjb_freeze_year"), new Date().getFullYear());
var mjb_start_year = S("mjb_start_year");
// Laatste (niet) succesvol uitgevoerde taak.
var laatste_not_suc = "(SELECT MAX(id2.ins_deelsrtcontrole_key)"
+ " FROM ins_deelsrtcontrole id2"
+ " , ins_controlemode cm"
+ " WHERE id2.ins_controlemode_key = cm.ins_controlemode_key"
+ " AND cm.ins_controlemode_success = 0"
+ " AND id2.ins_deelsrtcontrole_key = (SELECT MAX(ins_deelsrtcontrole_key)"
+ " FROM ins_deelsrtcontrole id3"
+ " WHERE id3.ins_deel_key = x.ins_deel_key"
+ " AND id3.ins_srtcontrole_key = x.ins_srtcontrole_key"
+ " AND id3.ins_scenario_key = 1"
+ " AND id3.ins_deelsrtcontrole_status = 6))";
var laatste_jaar = "(SELECT MAX(ins_deelsrtcontrole_datum) laatste_jaar"
+ " FROM ins_deelsrtcontrole id2"
+ " , ins_controlemode cm"
+ " WHERE id2.ins_controlemode_key = cm.ins_controlemode_key"
+ " AND cm.ins_controlemode_success = 0"
+ " AND id2.ins_deelsrtcontrole_key = (SELECT MAX(ins_deelsrtcontrole_key)"
+ " FROM ins_deelsrtcontrole id3"
+ " WHERE id3.ins_deel_key = x.ins_deel_key"
+ " AND id3.ins_srtcontrole_key = x.ins_srtcontrole_key"
+ " AND id3.ins_scenario_key = 1"
+ " AND id3.ins_deelsrtcontrole_status = 6))";
var lastinspect_B = "EXISTS (SELECT 1"
+ " FROM ins_deelsrtcontrole idsc"
+ " WHERE idsc.ins_srtcontrole_key = x.ins_srtcontrole_key"
+ " AND idsc.ins_deelsrtcontrole_status IN (5, 6)"
+ " AND idsc.ins_deel_key = x.ins_deel_key"
+ " AND idsc.ins_scenario_key = 1)";
var nextdate = " CASE"
+ " WHEN x.ctr_ismjob = 1"
+ " THEN" // MJOB en er is nog geen inspectie geweest.
// Query levert 1) uitgevoerde en 2) voor het eerst zijn ingepland(0) of gestart(2) inspecties op.
// Dus met de startdatum hebben we niets te doen en ook verder niet met inspecties die voor het eerst moeten beginnen.
// Bepaling in welk jaar er een inspectie is gepland.
// 1) In het jaar dat er nog een geaccordeerde/bevroren(2) inspectie actief is.
// 2) In het jaar van de plandatum.
// 3) Laatste inpspectie is NIET succesvol (laatste_not_suc IS NOT NULL).
// Volgende inspectie is in het freeze jaar.
// Eventuele startdatum doet er niet meer toe, vandaar dit punt eerder controleren.
// 4) 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 x.ins_deelsrtcontrole_status IN (2, 3)" // 1) Taak is geaccordeerd (gefreezed) of ter uitvoering. Bedrag in huidig (vervangings)jaar tonen.
+ " THEN x.ins_deelsrtcontrole_freezedate"
+ " WHEN x.ins_deelsrtcontrole_status = 0" // 2) Plandatum.
+ " THEN x.ins_deelsrtcontrole_plandatum"
+ " WHEN " + laatste_not_suc + " IS NOT NULL" // 3) Laatste inspectie is NIET succesvol en er zijn verder geen geplande, geaccordeerde of succesvol uitgevoerde taak aanwezig.
+ " THEN"
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM " + laatste_jaar + ") = " + mjb_freeze_or_sys_year
+ " THEN TO_DATE('31-12-" + (mjb_freeze_or_sys_year + 1) + "', 'DD-MM-YYYY')"
+ " ELSE TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " END"
//+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " ELSE"
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM ins.nextcyclusdate(x.ins_deel_key, x.ins_srtcontrole_key, 1, 0)) > EXTRACT(YEAR FROM SYSDATE)"
+ " THEN ins.nextcyclusdate(x.ins_deel_key, x.ins_srtcontrole_key, 1, 0)" // Volgende inspectie is in de toekomst.
// Geaccordeerde laatste inspectie wordt in het begin al afgevangen.
// en niet hier zoals bij org_nextdate in functie getmjblist_sql.
+ " ELSE TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')" // Laatst ingeplande inspectie is nog steeds niet uitgevoerd. Dus opnieuw in het freeze jaar tonen zodat deze daar gefreezed kan worden.
+ " END"
+ " END"
+ " ELSE" // Periodieke taken (NIET MJOB)
+ " CASE"
+ " WHEN NOT " + lastinspect_B // Inspectie die voor het eerst is ingepland(0) of gestart(2) maar nog geen uitgevoerde/afgemelde(6) inspectie heeft.
+ " THEN COALESCE(CASE"
+ " WHEN x.ins_srtcontroledl_xcp_startdat >= x.ins_deel_aanmaak" // Eerste inspectie is ingepland(0) of gestart(2). Als startdatum en aanmaakdatum/Registratiedatum hetzelfde dan op die datum beginnen.
+ " THEN x.ins_srtcontroledl_xcp_startdat"
+ " ELSE NULL"
+ " END"
+ " , CASE"
+ " WHEN x.ins_deel_aanmaak > SYSDATE AND x.ctr_controle_type = 1" // Eerste inspectie is ingepland(0) of gestart(2).
+ " THEN x.ins_deel_aanmaak"
+ " ELSE NULL"
+ " END"
+ " , fac.nextcyclusdate(x.ins_deel_aanmaak" // Dan registratiedatum + planning
+ " , x.ins_srtcontrole_mode"
+ " , x.ins_srtcontrole_eenheid"
+ " , x.ins_srtcontrole_periode"
+ " , x.ins_srtcontrole_bits"
+ " , 1"
+ " , x.ctr_ismjob))"
+ " WHEN x.ins_deelsrtcontrole_status IN (0, 2, 3)"
+ " THEN ins_deelsrtcontrole_datum_org" // In status 0, 2 en 3 (eigenlijk kun je niet diret naar 3) wordt de volgende inspectie in ins_deelsrtcontrole_datum_org direct opgeslagen.
+ " ELSE"
+ " fac.nextcyclusdate(CASE"
+ " WHEN x.ins_srtcontrole_mode = 0"
+ " THEN x.ins_deelsrtcontrole_datum_org" // Moment modus (0). Uitgaan van eigenlijke/orginele inspectiedatum.
+ " ELSE x.ins_deelsrtcontrole_datum" // Interval modus (1). Uitgaan van werkelijke inspectiedatum.
+ " END"
+ " , x.ins_srtcontrole_mode"
+ " , x.ins_srtcontrole_eenheid"
+ " , x.ins_srtcontrole_periode"
+ " , x.ins_srtcontrole_bits"
+ " , 1"
+ " , x.ctr_ismjob)"
+ " END"
+ " END";
return nextdate;
},
getobjectinspect_sql:
function (pautfunction, params)
{ // Lever de objecten of inpectie sql op.
@@ -1959,7 +2333,7 @@ ins = {checkAutLevel:
+ " , ins_srtcontrole_mode"
+ " , ins_srtcontroledl_xcp_startdat"
+ " , ins_srtcontroledl_xcp_prio"
+ " , inspectie_eenheid"
+ " , ins_srtcontrole_eenheid"
+ " , inspectie_eind"
+ " , ins_srtcontrole_omschrijving"
+ " , ins_srtcontrole_opmerking"
@@ -1990,7 +2364,7 @@ ins = {checkAutLevel:
+ " , dsc.prs_perslid_key inspecteur_key"
+ " , di.ins_srtcontroledl_xcp_startdat"
+ " , di.ins_srtcontroledl_xcp_prio"
+ " , di.ins_srtcontrole_eenheid inspectie_eenheid"
+ " , di.ins_srtcontrole_eenheid"
+ " , di.ins_srtcontrole_eind inspectie_eind"
+ " , " + lcl.xsqla("di.ins_srtcontrole_omschrijving", "di.ins_srtcontrole_key")
+ " , " + lcl.xsqla("di.ins_srtcontrole_opmerking", "di.ins_srtcontrole_key")
@@ -2046,6 +2420,9 @@ ins = {checkAutLevel:
+ " AND idsc2.ins_srtcontrole_key = di.ins_srtcontrole_key"
+ " AND idsc2.ins_deelsrtcontrole_status IN (5, 6)"
+ " AND idsc2.ins_scenario_key = 1)) = " + (insSuccessY? "1" : "0"))
+ (inspect && ctrdisc_key_arr.length > 0
? " AND di.ctr_discipline_key IN (" + ctrdisc_key_arr.join(",") + ")"
: "")
+ " AND di.ctr_discipline_key IN (SELECT w.ins_discipline_key"
+ " FROM fac_v_webgebruiker w"
+ " , fac_functie f"
@@ -2067,7 +2444,7 @@ ins = {checkAutLevel:
+ " , di.ins_srtcontrole_bits"
+ " , di.ins_srtcontroledl_xcp_startdat"
+ " , di.ins_srtcontroledl_xcp_prio"
+ " , di.ins_srtcontrole_eenheid inspectie_eenheid"
+ " , di.ins_srtcontrole_eenheid"
+ " , di.ins_srtcontrole_eind inspectie_eind"
+ " , " + lcl.xsqla("di.ins_srtcontrole_omschrijving", "di.ins_srtcontrole_key")
+ " , " + lcl.xsqla("di.ins_srtcontrole_opmerking", "di.ins_srtcontrole_key")
@@ -2099,6 +2476,9 @@ ins = {checkAutLevel:
+ (srtcontrole_key_arr.length
? " AND di.ins_srtcontrole_key IN (" + srtcontrole_key_arr.join(",") + ")"
: "")
+ (inspect && ctrdisc_key_arr.length > 0
? " AND di.ctr_discipline_key IN (" + ctrdisc_key_arr.join(",") + ")"
: "")
+ " AND di.ctr_discipline_key IN (SELECT w.ins_discipline_key"
+ " FROM fac_v_webgebruiker w"
+ " , fac_functie f"
@@ -2124,7 +2504,7 @@ ins = {checkAutLevel:
+ " , di.ins_srtcontrole_bits"
+ " , ins_srtcontroledl_xcp_startdat"
+ " , ins_srtcontroledl_xcp_prio"
+ " , di.ins_srtcontrole_eenheid inspectie_eenheid"
+ " , di.ins_srtcontrole_eenheid"
+ " , di.ins_srtcontrole_eind inspectie_eind"
+ " , " + lcl.xsqla("di.ins_srtcontrole_omschrijving", "di.ins_srtcontrole_key")
+ " , " + lcl.xsqla("di.ins_srtcontrole_opmerking", "di.ins_srtcontrole_key")
@@ -2163,6 +2543,9 @@ ins = {checkAutLevel:
+ (srtcontrole_key_arr.length
? " AND di.ins_srtcontrole_key IN (" + srtcontrole_key_arr.join(",") + ")"
: "")
+ (inspect && ctrdisc_key_arr.length > 0
? " AND di.ctr_discipline_key IN (" + ctrdisc_key_arr.join(",") + ")"
: "")
+ " AND di.ctr_discipline_key IN (SELECT w.ins_discipline_key"
+ " FROM fac_v_webgebruiker w"
+ " , fac_functie f"
@@ -2202,7 +2585,7 @@ ins = {checkAutLevel:
+ " , ispn.ins_deelsrtcontrole_plandatum"
+ " , ispn.ins_deelsrtcontrole_datum_org"
+ " , ispn.inspectie_eind"
+ " , ispn.inspectie_eenheid"
+ " , ispn.ins_srtcontrole_eenheid"
+ " , ispn.ctr_controle_type"
+ " , ispn.periode"
+ (!mobile
@@ -2461,7 +2844,9 @@ ins = {checkAutLevel:
+ (groepering == 11
? ", prs_v_afdeling_fullnames afn"
: "")
+ ", " + sqlKenmerkBewerkbaar_from
+ (fronto
? ", " + sqlKenmerkBewerkbaar_from
: "")
+ (koppel_key
? ", (SELECT *"
+ " FROM ins_deelkoppeling"
@@ -2518,7 +2903,9 @@ ins = {checkAutLevel:
+ (groepering == 11
? ", prs_v_afdeling_fullnames afn"
: "")
+ ", " + sqlKenmerkBewerkbaar_from
+ (fronto
? ", " + ", " + sqlKenmerkBewerkbaar_from
: "")
+ (koppel_key
? ", (SELECT *"
+ " FROM ins_deelkoppeling"
@@ -2565,7 +2952,9 @@ ins = {checkAutLevel:
+ sqlOwner_from
+ ", prs_contactpersoon cp"
+ ", prs_bedrijf b"
+ ", " + sqlKenmerkBewerkbaar_from
+ (fronto
? ", " + ", " + sqlKenmerkBewerkbaar_from
: "")
+ (koppel_key
? ", (SELECT *"
+ " FROM ins_deelkoppeling"
@@ -2735,7 +3124,7 @@ ins = {checkAutLevel:
+ " FROM alg_district d"
+ " , alg_locatie l"
+ " WHERE d.alg_district_key = l.alg_district_key"
+ " UNION"
+ " UNION ALL"
+ " SELECT NULL, NULL, NULL, NULL, NULL, NULL"
+ " FROM DUAL"
+ " ) alg"
@@ -2772,7 +3161,9 @@ ins = {checkAutLevel:
+ " WHERE v.prs_perslid_key_verantw_key = p.prs_perslid_key(+)) gtv"
: "")
+ sqlInspectie_from
+ " , " + sqlKenmerkBewerkbaar_from
+ (fronto
? ", " + " , " + sqlKenmerkBewerkbaar_from
: "")
+ (koppel_key
? ", (SELECT *"
+ " FROM ins_deelkoppeling"
@@ -3147,11 +3538,11 @@ ins = {checkAutLevel:
// ik zit niet bij uitleenregistratie of
// object is niet uitgeleend.
sqlOwner = (insAvail || !auth_org
? sqlOwnerA + sql_ex + sql_score + " UNION " + sqlOwnerCP + sql_ex + sql_score + " UNION "
? sqlOwnerA + sql_ex + sql_score + " UNION ALL " + sqlOwnerCP + sql_ex + sql_score + " UNION ALL "
: "")
+ sqlOwnerP + sql_ex + sql_score
+ (auth_org // S("ins_auth_obj_lendout") == 1 && fronto && insLentOut
? " UNION " + sqlOwnerA_org + sql_ex + sql_score + " UNION " + sqlOwnerP_org + sql_ex + sql_score + " UNION " + sqlOwnerCP_org + sql_ex + sql_score
? " UNION ALL " + sqlOwnerA_org + sql_ex + sql_score + " UNION ALL " + sqlOwnerP_org + sql_ex + sql_score + " UNION ALL " + sqlOwnerCP_org + sql_ex + sql_score
: "");
// Now apply user filtering on this query:
@@ -3185,7 +3576,7 @@ ins = {checkAutLevel:
? sqlPosition
: "")
+ (auth_org && sqlPosition != ""
? (!hasOwner? " UNION " : "") + sqlPosition_org
? (!hasOwner? " UNION ALL " : "") + sqlPosition_org
: "");
var sql_bdl = "";
@@ -3275,204 +3666,11 @@ ins = {checkAutLevel:
+ ")"
: "");
// Laatste (niet) succesvol uitgevoerde taak.
var laatste_not_suc = "(SELECT MAX(id2.ins_deelsrtcontrole_key)"
+ " FROM ins_deelsrtcontrole id2"
+ " , ins_controlemode cm"
+ " WHERE id2.ins_controlemode_key = cm.ins_controlemode_key"
+ " AND cm.ins_controlemode_success = 0"
+ " AND id2.ins_deelsrtcontrole_key = (SELECT MAX(ins_deelsrtcontrole_key)" // Laatste afgeronde inspectie.
+ " FROM ins_deelsrtcontrole id3"
+ " WHERE id3.ins_deel_key = x.ins_deel_key"
+ " AND id3.ins_srtcontrole_key = x.ins_srtcontrole_key"
+ " AND id3.ins_scenario_key = 1"
+ " AND id3.ins_deelsrtcontrole_status = 6))";
// inspecties die nog nooit zijn uitgevoerd/ingepland. Er is nog geen ins_deelsrtcontrole regel aanwezig en dus ook geen plandatum/respijtdatum.
var inspectie_next_A = " CASE"
+ " WHEN x.ctr_ismjob = 1"
+ " THEN" // MJOB en er is nog geen inspectie geweest.
// 1) Er is nog geen inspectie geweest en de startdatum is ingevuld of de registratiedatum ligt in de toekomst.
// Er geldt dan het volgende:
// Voor Controle(1): Eerste inspectie tonen op MAX(startdatum, registratiedatum) van het object.
// Voor Vervanging(2) of Certificering(3):
// a) Als registratiedatum het verst in de toekomst ligt: Eerste inspectie tonen op 1 periode verder dan de registratiedatum.
// b) Als de startdatum het verst ligt: Eerste inspectie tonen op de startdatum.
// De aanmaakdatum/Registratiedatum is altijd ingevuld en als er al een inspectie is geweest, zijn de startdatum en registratiedatum niet meer van belang.
// 2) 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) Kan hier niet voorkomen omdat er nog geen inspectie heeft plaatsgevonden (deze regels worden namenlijk opgeleverd).
+ " COALESCE(CASE" // 1) Eventueel startdatum (ins_srtcontroledl_xcp_startdat) i.g.v. als er nog geen inspectie heeft plaatsgevonden.
+ " WHEN x.ins_srtcontroledl_xcp_startdat IS NOT NULL" // Startdatum is ingevuld en er is nog geen inspectie geweest.
+ " THEN" // Startdatum is ingevuld en ligt in het verleden of de toekomst en er is nog geen inspectie geweest.
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM x.ins_srtcontroledl_xcp_startdat) >= EXTRACT(YEAR FROM x.ins_deel_aanmaak)"
+ " THEN" // Startdatum op of na aanmaakdatum/registratiedatum.
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM x.ins_srtcontroledl_xcp_startdat) < " + mjb_freeze_or_sys_year
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " ELSE x.ins_srtcontroledl_xcp_startdat"
+ " END"
+ " ELSE" // Aanmaakdatum/Registratiedatum is na de startdatum.
+ " CASE"
+ " WHEN x.ctr_controle_type = 1" // Controle(1).
+ " THEN"
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM x.ins_deel_aanmaak) < " + mjb_freeze_or_sys_year
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " ELSE x.ins_deel_aanmaak" // Registratiedatum.
+ " END"
+ " ELSE" // Vervanging(2), Certificering(3).
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM ADD_MONTHS(x.ins_deel_aanmaak, 12 * x.ins_srtcontrole_periode)) < " + mjb_freeze_or_sys_year
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " ELSE ADD_MONTHS(x.ins_deel_aanmaak, 12 * x.ins_srtcontrole_periode)" // 1 periode na registratiedatum.
+ " END"
+ " END"
+ " END"
+ " WHEN EXTRACT(YEAR FROM x.ins_deel_aanmaak) >= EXTRACT(YEAR FROM SYSDATE)" // Alleen de aanmaakdatum/registratiedatum is ingevuld.
+ " THEN" // Aanmaakdatum/Registratiedatum is ingevuld en ligt in de toekomst en er is nog geen inspectie geweest.
+ " CASE"
+ " WHEN x.ctr_controle_type = 1" // Controle(1).
+ " THEN"
+ " CASE"
+ " WHEN EXTRACT( YEAR FROM x.ins_deel_aanmaak) < " + mjb_freeze_or_sys_year
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " ELSE x.ins_deel_aanmaak"
+ " END"
+ " ELSE" // Vervanging(2), Certificering(3).
+ " CASE"
+ " WHEN EXTRACT( YEAR FROM ADD_MONTHS(x.ins_deel_aanmaak, 12 * x.ins_srtcontrole_periode)) < " + mjb_freeze_or_sys_year
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " ELSE ADD_MONTHS(x.ins_deel_aanmaak, 12 * x.ins_srtcontrole_periode)"
+ " END"
+ " END"
+ " ELSE"
+ " NULL"
+ " END"
+ " , CASE" // 2) Berekenen jaar. Er is nog geen inspectie geweest.
+ " WHEN x.ctr_controle_type = 1" // 2a) Controle(1).
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " WHEN x.ctr_controle_type != 1" // 2b) Vervanging(2), Certificering(3).
+ " THEN"
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM ins.nextcyclusdate(x.ins_deel_key, x.ins_srtcontrole_key, 1, 0)) > " + mjb_freeze_or_sys_year
+ " THEN" // Nextdate is na de freeze datum.
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM ADD_MONTHS(ins.nextcyclusdate(x.ins_deel_key, x.ins_srtcontrole_key, 1, 0), -1 * 12 * x.ins_srtcontrole_periode)) >= " + mjb_start_year + " AND"
+ " EXTRACT(YEAR FROM ADD_MONTHS(ins.nextcyclusdate(x.ins_deel_key, x.ins_srtcontrole_key, 1, 0), -1 * 12 * x.ins_srtcontrole_periode)) != EXTRACT(YEAR FROM x.ins_deel_aanmaak)"
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')" // Nu en vorige inspectie liggen tussen start en freeze jaar.
+ " ELSE ins.nextcyclusdate(x.ins_deel_key, x.ins_srtcontrole_key, 1, 0)"
+ " END"
+ " ELSE" // Nextdate is voor of in het freeze jaar.
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM ins.nextcyclusdate(x.ins_deel_key, x.ins_srtcontrole_key, 1, 0)) >= " + mjb_start_year
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')" // Nextdate tussen start en freeze jaar.
+ " ELSE ADD_MONTHS(ins.nextcyclusdate(x.ins_deel_key, x.ins_srtcontrole_key, 1, 0), 12 * x.ins_srtcontrole_periode)" // Nextdate voor het start jaar.
+ " END"
+ " END"
//+ " ELSE" // 2c) Laatste IS NOT NULL. Er is al een inspectie geweest.
//+ " NULL" // Voor deze deelquery geldt, er is nog geen inspectie geweest. Hier kom je nooit.
+ " END)"
+ " ELSE" // Periodieke taken (NIET MJOB)
// Er geldt al dat er nog geen inspectie is geweest.
+ " COALESCE(CASE"
+ " WHEN x.ins_srtcontroledl_xcp_startdat >= x.ins_deel_aanmaak" // Als startdatum en aanmaakdatum/Registratiedatum hetzelfde dan op die datum beginnen.
+ " THEN x.ins_srtcontroledl_xcp_startdat"
+ " ELSE NULL"
+ " END"
+ " , fac.nextcyclusdate(x.ins_deel_aanmaak"
+ " , x.ins_srtcontrole_mode"
+ " , x.inspectie_eenheid"
+ " , x.ins_srtcontrole_periode"
+ " , x.ins_srtcontrole_bits"
+ " , 1"
+ " , x.ctr_ismjob))" // Periode verder als registratiedatum/aanmaakdatum.
+ " END";
var lastinspect_B = "EXISTS (SELECT 1"
+ " FROM ins_deelsrtcontrole idsc"
+ " WHERE idsc.ins_srtcontrole_key = x.ins_srtcontrole_key"
+ " AND idsc.ins_deelsrtcontrole_status IN (5, 6)"
+ " AND idsc.ins_deel_key = x.ins_deel_key"
+ " AND idsc.ins_scenario_key = 1)";
// Inspecties die nog nooit zijn uitgevoerd/ingepland. Er is nog geen ins_deelsrtcontrole regel aanwezig en dus ook geen plandatum/respijtdatum.
var inspectie_next_A = ins.getnextinspection_future("x", 1);
// Inspecties die al eens zijn uitgevoerd of inspecties die voor het eerst zijn ingepland(0) of gestart(2) maar nog geen uitgevoerde/afgemelde(6) inspectie hebben.
var inspectie_next_B = " CASE"
+ " WHEN x.ctr_ismjob = 1"
+ " THEN" // MJOB en er is nog geen inspectie geweest.
// Query levert 1) uitgevoerde en 2) voor het eerst zijn ingepland(0) of gestart(2) inspecties op.
// Dus met de startdatum hebben we niets te doen en ook verder niet met inspecties die voor het eerst moeten beginnen.
// Bepaling in welk jaar er een inspectie is gepland.
// 1) In het jaar dat er nog een geaccordeerde/bevroren(2) inspectie actief is.
// 2) In het jaar van de plandatum.
// 3) Laatste inpspectie is NIET succesvol (laatste_not_suc IS NOT NULL).
// Volgende inspectie is in het freeze jaar.
// Eventuele startdatum doet er niet meer toe, vandaar dit punt eerder controleren.
// 4) 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 x.ins_deelsrtcontrole_status IN (2, 3)" // 1) Taak is geaccordeerd (gefreezed) of ter uitvoering. Bedrag in huidig (vervangings)jaar tonen.
+ " THEN x.ins_deelsrtcontrole_freezedate"
+ " WHEN x.ins_deelsrtcontrole_status = 0" // 2) Plandatum.
+ " THEN x.ins_deelsrtcontrole_plandatum"
+ " WHEN " + laatste_not_suc + " IS NOT NULL" // 3) Laatste inspectie is NIET succesvol en er zijn verder geen geplande, geaccordeerde of succesvol uitgevoerde taak aanwezig.
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " ELSE"
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM ins.nextcyclusdate(x.ins_deel_key, x.ins_srtcontrole_key, 1, 0)) > EXTRACT(YEAR FROM SYSDATE)"
+ " THEN ins.nextcyclusdate(x.ins_deel_key, x.ins_srtcontrole_key, 1, 0)" // Volgende inspectie is in de toekomst.
// Geaccordeerde laatste inspectie wordt in het begin al afgevangen.
// en niet hier zoals bij org_nextdate in functie getmjblist_sql.
+ " ELSE TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')" // Laatst ingeplande inspectie is nog steeds niet uitgevoerd. Dus opnieuw in het freeze jaar tonen zodat deze daar gefreezed kan worden.
+ " END"
+ " END"
+ " ELSE" // Periodieke taken (NIET MJOB)
+ " CASE"
+ " WHEN NOT " + lastinspect_B // Inspectie die voor het eerst is ingepland(0) of gestart(2) maar nog geen uitgevoerde/afgemelde(6) inspectie heeft.
+ " THEN COALESCE(CASE"
+ " WHEN x.ins_srtcontroledl_xcp_startdat >= x.ins_deel_aanmaak" // Eerste inspectie is ingepland(0) of gestart(2). Als startdatum en aanmaakdatum/Registratiedatum hetzelfde dan op die datum beginnen.
+ " THEN x.ins_srtcontroledl_xcp_startdat"
+ " ELSE NULL"
+ " END"
+ " , CASE"
+ " WHEN x.ins_deel_aanmaak > SYSDATE AND x.ctr_controle_type = 1" // Eerste inspectie is ingepland(0) of gestart(2).
+ " THEN x.ins_deel_aanmaak"
+ " ELSE NULL"
+ " END"
+ " , fac.nextcyclusdate(x.ins_deel_aanmaak" // Dan registratiedatum + planning
+ " , x.ins_srtcontrole_mode"
+ " , x.inspectie_eenheid"
+ " , x.ins_srtcontrole_periode"
+ " , x.ins_srtcontrole_bits"
+ " , 1"
+ " , x.ctr_ismjob))"
+ " WHEN x.ins_deelsrtcontrole_status IN (0, 2, 3)"
+ " THEN ins_deelsrtcontrole_datum_org" // In status 0, 2 en 3 (eigenlijk kun je niet diret naar 3) wordt de volgende inspectie in ins_deelsrtcontrole_datum_org direct opgeslagen.
+ " ELSE"
+ " fac.nextcyclusdate(CASE"
+ " WHEN x.ins_srtcontrole_mode = 0"
+ " THEN x.ins_deelsrtcontrole_datum_org" // Moment modus (0). Uitgaan van eigenlijke/orginele inspectiedatum.
+ " ELSE x.ins_deelsrtcontrole_datum" // Interval modus (1). Uitgaan van werkelijke inspectiedatum.
+ " END"
+ " , x.ins_srtcontrole_mode"
+ " , x.inspectie_eenheid"
+ " , x.ins_srtcontrole_periode"
+ " , x.ins_srtcontrole_bits"
+ " , 1"
+ " , x.ctr_ismjob)"
+ " END"
+ " END";
var inspectie_next_B = ins.getnextinspection_n();
// De inspectie_next met berekeningen van de nextcyclusdate (database procedure fac.nextcyclusdate()) zo ver mogelijk naar buiten gehaald,
// zodat deze berekeningen zo laat mogelijk worden berekend met een zo klein mogelijke verzameling resultaten (RABO#60119).

View File

@@ -60,175 +60,7 @@ insp = {
+ " inspectie_steps"
+ " , di.ctr_ismjob"
// De volgende inspectie berekenen (inspectie_next).
+ " , CASE"
+ " WHEN di.ctr_ismjob = 1"
+ " THEN" // MJOB
// 1) Laatste inpspectie is NIET succesvol (laatste_not_suc IS NOT NULL).
// De NIET succesvolle taak is in het freeze jaar
// Ja) Volgende inspectie is in het jaar na het freeze jaar.
// Nee) Volgende inspectie is in het freeze jaar.
// 2) Er is nog geen inspectie geweest en de startdatum is ingevuld.
// Er geldt dan het volgende:
// Voor Controle(1): Eerste inspectie tonen op MAX(startdatum, registratiedatum) van het object.
// Voor Vervanging(2) of Certificering(3):
// a) Als registratiedatum het verst in de toekomst ligt: Eerste inspectie tonen op 1 periode verder dan de registratiedatum.
// b) Als de startdatum het verst in de toekomst ligt: Eerste inspectie tonen op de startdatum.
// De aanmaakdatum/Registratiedatum is altijd ingevuld en als er al een inspectie is geweest, zijn de startdatum en registratiedatum niet meer van belang.
// 3) Er is nog geen inspectie geweest en alleen de aanmaakdatum/Registratiedatum ligt in het huidige jaar of in de toekomst.
// Voor Controle(1):
// a) Als registratiedatum < freeze jaar dan eerste inspectie tonen in het freeze jaar
// b) Anders inspectie tonen in het registratiejaar.
// Voor Vervanging(2) of Certificering(3):
// a) Als (registratiedatum + periode) < freeze jaar dan eerste inspectie tonen in het freeze jaar
// b) Anders inspectie tonen in het (registratiejaar + periode)
// 4) Startdatum is niet ingevuld en aanmaakdatum is geweest (ligt in het verleden).
// 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? (Nextdate is eerste next(inspectie)datum, startdatum of aanmaakdatum in de toekomst. Hier aanmaakdatum + n*periode met n = 0 of hoger.
// 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.
// LET OP: c.laatste: geeft de ins_deelsrtcontrole_datum terug van de laatste geplande, geaccordeerde of succesvol uitgevoerde taak.
// laatste_not_suc: Als de laatste uitgevoerde taak NIET succesvoll is geeft deze de ins_deelsrtcontrole_datum terug van deze taak.
// P.S.: De aanmaakdatum/Registratiedatum is altijd ingevuld en als er al een inspectie is geweest, zijn de startdatum en registratiedatum niet meer van belang.
+ " COALESCE(CASE" // 1) Laatste inspectie is NIET succesvol en er zijn verder geen geplande, geaccordeerde of succesvol uitgevoerde taak aanwezig.
+ " WHEN ltst_not_suc.laatste_not_suc IS NOT NULL AND ltst.laatste IS NULL"
+ " THEN"
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM ltst_not_suc.laatste_jaar) = " + mjb_freeze_year
+ " THEN TO_DATE('31-12-" + (mjb_freeze_year + 1) + "', 'DD-MM-YYYY')"
+ " ELSE TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " END"
+ " ELSE NULL"
+ " END"
+ " , CASE" // 2) Eventueel startdatum (ins_srtcontroledl_xcp_startdat) i.g.v. als er nog geen inspectie heeft plaatsgevonden.
+ " WHEN ltst.laatste IS NULL AND" // Als er al een inspectie is geweest, is de startdatum niet meer van belang.
+ " di.ins_srtcontroledl_xcp_startdat IS NOT NULL" // Startdatum is ingevuld en er is nog geen inspectie geweest.
+ " THEN" // 2) Startdatum is ingevuld en ligt in het verleden of de toekomst en er is nog geen inspectie geweest.
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM di.ins_srtcontroledl_xcp_startdat) >= EXTRACT(YEAR FROM di.ins_deel_aanmaak)"
+ " THEN" // 2a) Startdatum op of na aanmaakdatum/registratiedatum.
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM di.ins_srtcontroledl_xcp_startdat) < " + mjb_freeze_year
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " ELSE di.ins_srtcontroledl_xcp_startdat"
+ " END"
+ " ELSE" // 2b) Aanmaakdatum/Registratiedatum is na de startdatum.
+ " CASE"
+ " WHEN di.ctr_controle_type = 1" // Controle(1).
+ " THEN"
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM di.ins_deel_aanmaak) < " + mjb_freeze_year
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " ELSE di.ins_deel_aanmaak" // Registratiedatum.
+ " END"
+ " ELSE" // Vervanging(2), Certificering(3).
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM ADD_MONTHS(di.ins_deel_aanmaak, 12 * di.ins_srtcontrole_periode)) < " + mjb_freeze_year
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " ELSE ADD_MONTHS(di.ins_deel_aanmaak, 12 * di.ins_srtcontrole_periode)" // 1 periode na registratiedatum.
+ " END"
+ " END"
+ " END"
+ " WHEN ltst.laatste IS NULL AND"
+ " EXTRACT(YEAR FROM di.ins_deel_aanmaak) >= EXTRACT(YEAR FROM SYSDATE)" // Alleen de aanmaakdatum/registratiedatum is ingevuld.
+ " THEN" // 3) Aanmaakdatum/Registratiedatum is alleen ingevuld en ligt in het huidige jaar of in de toekomst en er is nog geen inspectie geweest.
+ " CASE"
+ " WHEN di.ctr_controle_type = 1" // Controle(1).
+ " THEN"
+ " CASE"
+ " WHEN EXTRACT( YEAR FROM di.ins_deel_aanmaak) < " + mjb_freeze_year
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " ELSE di.ins_deel_aanmaak"
+ " END"
+ " ELSE" // Vervanging(2), Certificering(3).
+ " CASE"
+ " WHEN EXTRACT( YEAR FROM ADD_MONTHS(di.ins_deel_aanmaak, 12 * di.ins_srtcontrole_periode)) < " + mjb_freeze_year
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')"
+ " ELSE ADD_MONTHS(di.ins_deel_aanmaak, 12 * di.ins_srtcontrole_periode)"
+ " END"
+ " END"
+ " ELSE"
+ " NULL"
+ " END"
+ " , CASE" // 4) Berekenen jaar.
+ " WHEN ltst.laatste IS NULL AND di.ctr_controle_type = 1" // Controle(1).
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')" // 4a)
+ " WHEN ltst.laatste IS NULL AND di.ctr_controle_type != 1" // Vervanging(2), Certificering(3).
+ " THEN" // 4b) Er is nog geen inspectie geweest
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM ins.nextcyclusdate(di.ins_deel_key, di.ins_srtcontrole_key, 1, 0)) > " + mjb_freeze_year
+ " THEN" // Nextdate is na de freeze datum.
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM ADD_MONTHS(ins.nextcyclusdate(di.ins_deel_key, di.ins_srtcontrole_key, 1, 0), -1 * 12 * di.ins_srtcontrole_periode)) >= " + mjb_start_year + " AND"
+ " EXTRACT(YEAR FROM ADD_MONTHS(ins.nextcyclusdate(di.ins_deel_key, di.ins_srtcontrole_key, 1, 0), -1 * 12 * di.ins_srtcontrole_periode)) != EXTRACT(YEAR FROM di.ins_deel_aanmaak)"
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')" // Nu en vorige inspectie liggen tussen start en freeze jaar.
+ " ELSE ins.nextcyclusdate(di.ins_deel_key, di.ins_srtcontrole_key, 1, 0)"
+ " END"
+ " ELSE" // Nextdate is voor of in het freeze jaar.
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM ins.nextcyclusdate(di.ins_deel_key, di.ins_srtcontrole_key, 1, 0)) >= " + mjb_start_year
+ " THEN TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')" // Nextdate tussen start en freeze jaar.
+ " ELSE ADD_MONTHS(ins.nextcyclusdate(di.ins_deel_key, di.ins_srtcontrole_key, 1, 0), 12 * di.ins_srtcontrole_periode)" // Nextdate voor het start jaar.
+ " END"
+ " END"
+ " ELSE" // 4c) Laatste IS NOT NULL. Er is al een inspectie geweest.
+ " CASE"
+ " WHEN EXTRACT(YEAR FROM ins.nextcyclusdate(di.ins_deel_key, di.ins_srtcontrole_key, 1, 0)) > EXTRACT(YEAR FROM SYSDATE)"
+ " THEN ins.nextcyclusdate(di.ins_deel_key, di.ins_srtcontrole_key, 1, 0)" // Volgende inspectie is in de toekomst.
// Geaccordeerde laatste inspectie hoeft hier niet te worden afgevangen zoals bij org_nextdate.
// Deze deelquery leverta alleen resultaat als laatste inspectie is voltooid..
+ " ELSE TO_DATE('31-12-" + mjb_freeze_or_sys_year + "', 'DD-MM-YYYY')" // Laatst ingeplande inspectie is nog steeds niet uitgevoerd. Dus opnieuw in het freeze jaar tonen zodat deze daar gefreezed kan worden.
+ " END"
+ " END)"
+ " ELSE" // Periodieke taken (NIET MJOB)
// Als respijtdatum vandaag of dit uur is dan is de respijtdatum de eerstvolgende inspectie en dan dus de respijtdatum opleveren.
// Als er vandaag of dit uur niet geinspecteerd is dan de eerstvolgende inspectiedatum vandaag of in de toekomst (steps = 0: functie nextcyclusdate(..., 0))
// Als er vandaag of dit uur al geinspecteerd is dan de eerstvolgende inspectiedatum in de toekomst (steps = 1: functie nextcyclusdate(..., 1))
//
// Er is nog geen inspectie geweest en de startdatum is ingevuld of de registratiedatum ligt in de toekomst.
// De inspectie is nog niet ingepland.
// Er geldt:
// Voor Controle(1):
// a) De eerste inspectie is op MAX(startdatum, registratiedatum) van het object.
// Voor Vervanging(2) of Certificering(3):
// a) Als aanmaakdatum > startdatum: Eerste inspectie tonen op 1 periode verder dan de registratiedatum.
// b) Als aanmaakdatum < startdatum: Eerste inspectie tonen op de startdatum.
// De aanmaakdatum/Registratiedatum is altijd ingevuld en als er al een inspectie is geweest, zijn de startdatum en registratiedatum niet meer van belang.
+ " COALESCE(CASE"
+ " WHEN di.ins_srtcontroledl_xcp_startdat >= di.ins_deel_aanmaak AND " + lastinspect + " IS NULL" // Als startdatum en aanmaakdatum/Registratiedatum hetzelfde dan op die datum beginnen.
+ " THEN di.ins_srtcontroledl_xcp_startdat"
+ " ELSE NULL"
+ " END"
+ " , fac.nextcyclusdate (COALESCE(" + lastinspect + ", di.ins_deel_aanmaak)"
+ " , di.ins_srtcontrole_mode"
+ " , di.ins_srtcontrole_eenheid"
+ " , di.ins_srtcontrole_periode"
+ " , di.ins_srtcontrole_bits"
+ " , CASE"
+ " WHEN di.ins_srtcontrole_mode = 1" // Interval modus
+ " THEN 1"
+ " WHEN di.ins_srtcontrole_eenheid = 0 AND"
+ " TRUNC (COALESCE (" + lastinspect + ", di.ins_deel_aanmaak), 'HH24' ) >= TRUNC (SYSDATE, 'HH24')"
+ " THEN 1" // Uurlijks: Als de datum in de toekomst ligt, bepaal dan de volgende datum (1 step verder).
+ " WHEN di.ins_srtcontrole_eenheid > 0 AND"
+ " TRUNC (COALESCE (" + lastinspect + ", di.ins_deel_aanmaak),'DDD') >= TRUNC (SYSDATE, 'DDD')"
+ " THEN 1" // Dagelijks t/m jaarlijks: Als de datum in de toekomst ligt, bepaal dan de volgende datum (1 step verder).
+ " WHEN " + lastinspect + " IS NULL"
+ " THEN 1" // Als Eerste inspectie, bepaal dan ook de volgende (1 step) datum.
+ " ELSE 0" // Vindt de eerste datum vandaag of in de toekomst
+ " END"
+ " , di.ctr_ismjob))"
+ " END"
+ " inspectie_next"
+ " , " + ins.getnextinspection_future("di", 2) + " inspectie_next"
+ " , di.ins_srtcontrole_key"
+ " , " + lcl.xsqla("di.ins_srtcontrole_omschrijving", "di.ins_srtcontrole_key")
+ " , di.ins_srtcontrole_groep"

View File

@@ -572,7 +572,7 @@ function ins_list (pautfunction, params)
{
var lclass = "";
var istatus = oRs("ins_deelsrtcontrole_status").Value != null? oRs("ins_deelsrtcontrole_status").Value : -1;
var eenheid = oRs("inspectie_eenheid").Value;
var eenheid = oRs("ins_srtcontrole_eenheid").Value;
var mode = oRs("ins_srtcontrole_mode").Value;
if (inspDone) return lclass;
@@ -770,7 +770,7 @@ function ins_list (pautfunction, params)
dttxt = new Date(inspectie).getFullYear(); // Voor MJOB is alleen het jaar van belang.
else
{
var inspectie_eenheid = oRs("inspectie_eenheid").Value;
var inspectie_eenheid = oRs("ins_srtcontrole_eenheid").Value;
if (inspectie_eenheid == 0)
var dttxt = toDateTimeString(inspectie);
else
@@ -784,7 +784,7 @@ function ins_list (pautfunction, params)
{
var vervallen = (oRs("inspectie_eind").Value != null && new Date(oRs("inspectie_eind").Value).getTime() < new Date().midnight());
if (vervallen) return L("lcl_ins_controle_vervallen");
var inspectie_eenheid = oRs("inspectie_eenheid").Value;
var inspectie_eenheid = oRs("ins_srtcontrole_eenheid").Value;
if (inspDone)
var plandatum = oRs("ins_deelsrtcontrole_datum_org").Value; // Plandatum is dan de orginele datum.
@@ -804,7 +804,7 @@ function ins_list (pautfunction, params)
var res = "";
var txt = "";
var aantal = oRs("periode").Value;
switch (oRs("inspectie_eenheid").Value) // 0=uurlijks, 1=dagelijks, 2=wekelijk, 3=maandelijk, 4=jaarlijks, null=niet
switch (oRs("ins_srtcontrole_eenheid").Value) // 0=uurlijks, 1=dagelijks, 2=wekelijk, 3=maandelijk, 4=jaarlijks, null=niet
{
case 0: { txt = L("lcl_ins_controle_period_hour"); break; }
case 1: { txt = L("lcl_ins_controle_period_day"); break; }

View File

@@ -272,7 +272,7 @@ else
var inspectie = inspDone? oRs("inspectie_date").Value : oRs("inspectie_next").Value;
var inspectie_eenheid = (isPeriodiekeTaken ? oRs("inspectie_eenheid").Value : oRs("eenheid").Value);
var inspectie_eenheid = (isPeriodiekeTaken ? oRs("ins_srtcontrole_eenheid").Value : oRs("eenheid").Value);
if (inspectie_eenheid == 0)
var dttxt = toDateTimeString(inspectie);
else
@@ -289,7 +289,7 @@ else
var plandatum = (isPeriodiekeTaken ? oRs("ins_deelsrtcontrole_plandatum").Value : oRs("ins_deelsrtcontrole_datum").Value);
if (plandatum == null) return "";
var inspectie_eenheid = (isPeriodiekeTaken ? oRs("inspectie_eenheid").Value : oRs("eenheid").Value);
var inspectie_eenheid = (isPeriodiekeTaken ? oRs("ins_srtcontrole_eenheid").Value : oRs("eenheid").Value);
if (inspectie_eenheid == 0)
var dttxt = toDateTimeString(plandatum);
else