From 619c2ef05a0f912c3bf86a5079ee9ec0cd57b7bb Mon Sep 17 00:00:00 2001 From: Maykel Geerdink Date: Mon, 27 Oct 2025 15:42:15 +0000 Subject: [PATCH] AAGN#88039: Performance issue bij assetmanagement en draaien/exporteren taken-overzicht. svn path=/Website/trunk/; revision=70724 --- APPL/INS/ins.inc | 616 ++++++++++++++++++++++------------ APPL/INS/ins_inspect_list.inc | 170 +--------- APPL/INS/ins_list.inc | 8 +- APPL/PDA/ins_inspect_list.asp | 6 +- 4 files changed, 415 insertions(+), 385 deletions(-) diff --git a/APPL/INS/ins.inc b/APPL/INS/ins.inc index 01b8194c85..8971fe8a40 100644 --- a/APPL/INS/ins.inc +++ b/APPL/INS/ins.inc @@ -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). diff --git a/APPL/INS/ins_inspect_list.inc b/APPL/INS/ins_inspect_list.inc index 9d5930b373..33c1a0ebc2 100644 --- a/APPL/INS/ins_inspect_list.inc +++ b/APPL/INS/ins_inspect_list.inc @@ -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" diff --git a/APPL/INS/ins_list.inc b/APPL/INS/ins_list.inc index 0c4e2045ab..0371e80b17 100644 --- a/APPL/INS/ins_list.inc +++ b/APPL/INS/ins_list.inc @@ -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; } diff --git a/APPL/PDA/ins_inspect_list.asp b/APPL/PDA/ins_inspect_list.asp index e80888cd06..8fc196851f 100644 --- a/APPL/PDA/ins_inspect_list.asp +++ b/APPL/PDA/ins_inspect_list.asp @@ -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 @@ -334,7 +334,7 @@ else plaats = "
" + I("fa-map-marker") + " " + safe.html(oRs("plaats").Value) + "
"; flexkenmerken = LIST_KENMERK_COL(oRs, {kmcol: "insflex"}); } - // else: // Voor inspectie geen plaats en kenmerken tonen. + // else: // Voor inspectie geen plaats en kenmerken tonen. return plaats + flexkenmerken; };