<% /*
     $Revision$
     $Id$
*/
%>
<%

insp = {
    list_sql: function _list_sql(ins_key, mld_key, params)
        {
            var mjb_freeze_year = Math.max(S("mjb_freeze_year"), new Date().getFullYear());
            var mjb_start_year  = S("mjb_start_year");
            params = params || {};
            if (!params.past && !params.future && !params.present)  // present is een specifiek onderdeel van past (niet van future), alleen present werkt nu dus niet (niet nodig)
                params = { past: true, present: true, future: true}; // Default alle inspectie tonen.
            var lastinspect = "(SELECT CASE di.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_srtcontrole_key = di.ins_srtcontrole_key"
                            + "    AND idsc.ins_deelsrtcontrole_status IN (5, 6)"
                            + "    AND idsc.ins_deel_key = di.ins_deel_key"
                            + "    AND idsc.ins_deelsrtcontrole_key = (SELECT MAX(idsc2.ins_deelsrtcontrole_key)"
                            + "                                          FROM ins_deelsrtcontrole idsc2"
                            + "                                         WHERE idsc2.ins_deel_key = di.ins_deel_key"
                            + "                                           AND idsc2.ins_srtcontrole_key = di.ins_srtcontrole_key"
                            + "                                           AND idsc2.ins_deelsrtcontrole_status IN (5, 6)"
                            + "                                           AND idsc2.ins_scenario_key = 1))";

            var sqlCost = " ("
                        + "   di.ins_deel_aantal"
                        + "   * (COALESCE(di.ins_srtcontrole_percentage, 100) / 100)"
                        + "   * (COALESCE(di.ins_srtcontrole_kosten, 0) + COALESCE(di.ins_srtcontrole_kosten2, 0) + COALESCE(di.ins_srtcontrole_kosten3, 0) + COALESCE(di.ins_srtcontrole_materiaal, 0))"
                        + " )";

            // Als het freeze jaar nog op vorig jaar staat dan wil men het vorige jaar ook in het overzicht zien (DEMO#65665).
            // Als het freeze jaar nog op vorig jaar staat dan moet/kan de volgende inspectie niet in het freeze jaar zijn maar in het huidige jaar.
            // In die gevallen dat een datum dan op het freeze jaar moet wordeen gezet moeten we dan nu de volgende parameter gebruiken.
            // (Als het freeze jaar op meer dan een jaar terug staat is dat een foute configuratie.)
            var mjb_freeze_or_sys_year = (new Date()).getFullYear() > mjb_freeze_year? (new Date()).getFullYear() : mjb_freeze_year;

            var future_inspect = "" // mogelijke inspecties op dit 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.
                    + "        SELECT 1 seq"
                    + "             , di.ins_deel_key"
                    + "             , di.ins_deel_aantal"
                    + "             , TO_DATE (NULL) ins_deelsrtcontrole_datum"
                    + "             , NULL inspectie_org"
                    + "             , NULL isrespijt"
                    // Als respijtdatum vandaag of dit uur is dan is de respijtdatum de eerstvolgende inspectie en dus maar 1 step.
                    // Als er vandaag al geinspecteerd is dan de volgende inspectiedatum in de toekomst (functie nextcyclusdatesteps())
                    + "             , fac.nextcyclusdatesteps (COALESCE(" + lastinspect + ", SYSDATE)"
                      + "                                    , di.ins_srtcontrole_mode"
                      + "                                    , di.ins_srtcontrole_eenheid"
                      + "                                    , di.ins_srtcontrole_periode"
                      + "                                    , di.ins_srtcontrole_bits)"
                      + "             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"
                    + "             , di.ins_srtcontrole_key"
                    + "             , " + lcl.xsqla("di.ins_srtcontrole_omschrijving", "di.ins_srtcontrole_key")
                    + "             , di.ins_srtcontrole_groep"
                    + "             , di.ins_srtcontrole_opmerking"
                    + "             , NULL ins_deelsrtcontrole_key"
                    + "             , di.ins_srtcontrole_periode periode"
                    + "             , di.ins_srtcontrole_eenheid eenheid"
                    + "             , 0 frozen"
                    + "             , " + sqlCost + " kosten"
                    + "             , di.ins_srtcontrole_mode isc_mode"
                    + "             , NULL plandatum"
                    + "             , '' ins_deelsrtcontrole_opmerking"
                    + "             , NULL inspecteur"
                    + "             , di.ctr_controle_type"
                    + "             , -1 ins_deelsrtcontrole_status"
                    + "             , di.ins_srtcontrole_eind inspectie_eind"
                    + "             , di.ins_srtcontrole_options options"
                    + "             , NULL ins_controlemode_success"
                    + "             , d.ins_deel_omschrijving"
                    + "             , d.ins_deel_actief"
                    + "             , s.ins_srtdeel_omschrijving"
                    + "             , cd.ins_discipline_omschrijving"
                    + (params.insFlexParams && params.insFlexParams.anyflex
                      ? "           , NULL insflex"
                      : "")
                    + "          FROM ins_v_defined_inspect_xcp di"
                    + "             , ins_deel d"
                    + "             , ins_srtdeel s"
                    + "             , ctr_v_aanwezigdiscipline cd"
                    + "             , (SELECT MAX(ins_deelsrtcontrole_key) laatste"
                      + "                   , id2.ins_deel_key"
                      + "                   , id2.ins_srtcontrole_key"
                      + "                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)"
                      + "              GROUP BY id2.ins_deel_key"
                      + "                     , id2.ins_srtcontrole_key) ltst"
                    + "             , (SELECT MAX(id2.ins_deelsrtcontrole_key) laatste_not_suc"
                      + "                   , MAX(ins_deelsrtcontrole_datum) laatste_jaar"
                      + "                   , id2.ins_deel_key"
                      + "                   , id2.ins_srtcontrole_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 = id2.ins_deel_key"
                      + "                                                       AND id3.ins_srtcontrole_key = id2.ins_srtcontrole_key"
                      + "                                                       AND id3.ins_scenario_key = 1"
                      + "                                                       AND id3.ins_deelsrtcontrole_status = 6)"
                      + "             GROUP BY id2.ins_deel_key"
                      + "                    , id2.ins_srtcontrole_key) ltst_not_suc"
                    + "         WHERE (di.ins_srtcontrole_eind >= TRUNC(SYSDATE, 'DD')"
                    + "                OR di.ins_srtcontrole_eind IS NULL)"
                    + "           AND di.ins_deel_key = " + ins_key
                    + "           AND di.ins_deel_key = d.ins_deel_key"
                    + "           AND d.ins_srtdeel_key = s.ins_srtdeel_key"
                    + "           AND di.ins_deel_key = ltst.ins_deel_key(+)"
                    + "           AND di.ins_srtcontrole_key = ltst.ins_srtcontrole_key(+)"
                    + "           AND di.ins_deel_key = ltst_not_suc.ins_deel_key(+)"
                    + "           AND di.ins_srtcontrole_key = ltst_not_suc.ins_srtcontrole_key(+)"
                    + "           AND di.ins_srtcontrole_periode > 0" // Als de periode 0 is dan de inspecties die gaan komen niet meer tonen.
                    + "           AND di.ins_scenario_key = 1"
                    // Als er een voorlopige inspectie is aangemaakt maar nog niet is afgemeld of afgerond, dan hoeft er geen nieuwe inspectie te worden getoond.
                    + "           AND NOT EXISTS (SELECT idsc.ins_deelsrtcontrole_key"
                    + "                             FROM ins_deelsrtcontrole idsc"
                    + "                            WHERE idsc.ins_srtcontrole_key = di.ins_srtcontrole_key"
                    + "                              AND idsc.ins_deelsrtcontrole_status NOT IN (6)"
                    + "                              AND idsc.ins_deel_key = di.ins_deel_key"
                    + "                              AND idsc.ins_scenario_key = 1)"
                    + "           AND di.ctr_discipline_key = cd.ins_discipline_key(+)"
                    + "           AND di.ctr_discipline_key IN (SELECT w.ins_discipline_key"
                    + "                                           FROM fac_v_webgebruiker w"
                    + "                                              , fac_functie f"
                    + "                                          WHERE w.fac_functie_key = f.fac_functie_key "
                    + "                                            AND f.fac_functie_code = 'WEB_CTRUSE'"
                    + "                                            AND w.fac_gebruiker_prs_level_read < 9"
                    + "                                            AND w.fac_gebruiker_alg_level_read < 9"
                    + "                                            AND w.prs_perslid_key = " + user_key + ")"
                    + "           AND d.ins_deel_actief = 1";

            var inspectie_org = "COALESCE(idsc.ins_deelsrtcontrole_plandatum"
                              + "       , CASE"
                              + "         WHEN idsc.ins_deelsrtcontrole_status IN (2, 3) AND idsc.ins_deelsrtcontrole_datum_org IS NULL" // Alle eerste inspectie.
                              // MJOB: Geplande aanvang van geaccordeerde taak (blauw) moet in geaccordeerde jaar zijn (ins_deelsrtcontrole_freezedate).
                              // Periodieke taken: De startdatum is MAX(startdatum, aanmaakdatum/registratiedatum) en heeft altijd een waarde (ins_deel_aanmaak is altijd gevuld).
                              //                   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 de startdatum het verst ligt: Eerste inspectie tonen op de startdatum.
                              //                   b) Als registratiedatum het verst in de toekomst ligt: Eerste inspectie tonen op 1 periode verder dan de registratiedatum.
                              //                   De aanmaakdatum/Registratiedatum is altijd ingevuld en als er al een inspectie is geweest,
                              //                   zijn de startdatum en registratiedatum niet meer van belang.
                              + "         THEN"
                              + "           CASE"
                              + "           WHEN di.ctr_ismjob = 1"
                              + "           THEN ins_deelsrtcontrole_freezedate" // MJOB.
                              + "           WHEN di.ctr_controle_type = 1"
                              + "           THEN" // Controle(1).
                              + "                CASE"
                              + "                WHEN di.ins_srtcontroledl_xcp_startdat IS NOT NULL AND" // Startdatum is ingevuld en er is nog geen inspectie geweest.
                              + "                     di.ins_srtcontroledl_xcp_startdat >= di.ins_deel_aanmaak" // Startdatum op of na aanmaakdatum/registratiedatum.
                              + "                THEN di.ins_srtcontroledl_xcp_startdat"
                              + "                ELSE di.ins_deel_aanmaak"
                              + "                END"
                              + "           ELSE" // Vervanging(2), Certificering(3).
                              + "                CASE"
                              + "                WHEN di.ins_srtcontroledl_xcp_startdat IS NOT NULL AND" // Startdatum is ingevuld en er is nog geen inspectie geweest.
                              + "                     di.ins_srtcontroledl_xcp_startdat >= di.ins_deel_aanmaak" // Startdatum op of na aanmaakdatum/registratiedatum.
                              + "                THEN di.ins_srtcontroledl_xcp_startdat"
                              + "                ELSE"
                              + "                  fac.nextcyclusdate (COALESCE(" + lastinspect + ", GREATEST(COALESCE(di.ins_srtcontroledl_xcp_startdat"
                              + "                                                                                    , di.ins_deel_aanmaak)"
                              + "                                                                           , COALESCE(di.ins_deel_aanmaak"
                              + "                                                                                    , di.ins_srtcontroledl_xcp_startdat)))"
                              + "                                    , 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"
                              + "           END"
                              + "         ELSE ins_deelsrtcontrole_datum_org"
                              + "         END)";

            var past_inspect = "" // Combineren met uitgevoerde inspecties op dit object of (indien present) lopende inspecties (ingepland(0), gestart(2), ter uitvoering(3) of gereedgemeld(5))
                    + "        SELECT 2 seq"
                    + "             , di.ins_deel_key"
                    + "             , di.ins_deel_aantal"
                    + "             , idsc.ins_deelsrtcontrole_datum"
                    + "             , " + inspectie_org + " inspectie_org"
                    + "             , CASE WHEN idsc.ins_deelsrtcontrole_plandatum > idsc.ins_deelsrtcontrole_datum_org THEN 1 ELSE 0 END isrespijt"
                    + "             , CASE"
                    + "               WHEN di.ins_srtcontrole_eenheid = 0 AND"
                    + "                    idsc.ins_deelsrtcontrole_plandatum IS NOT NULL AND"
                    + "                    TRUNC (idsc.ins_deelsrtcontrole_plandatum, 'HH24') >= TRUNC (SYSDATE, 'HH24')"
                    + "               THEN 1"
                    + "               WHEN di.ins_srtcontrole_eenheid > 0 AND"
                    + "                    idsc.ins_deelsrtcontrole_plandatum IS NOT NULL AND"
                    + "                    TRUNC (idsc.ins_deelsrtcontrole_plandatum, 'DDD') >= TRUNC (SYSDATE, 'DDD')"
                    + "               THEN 1"
                    + "               ELSE NULL"
                    + "               END inspectie_steps"
                    + "             , di.ctr_ismjob"
                    + "             , CASE"
                    + "               WHEN idsc.ins_deelsrtcontrole_status IN (0, 2, 3)"
                    + "               THEN " + inspectie_org
                    + "               ELSE TO_DATE (NULL)"
                    + "               END inspectie_next"
                    + "             , idsc.ins_srtcontrole_key"
                    + "             , " + lcl.xsqla("di.ins_srtcontrole_omschrijving", "di.ins_srtcontrole_key")
                    + "             , di.ins_srtcontrole_groep"
                    + "             , di.ins_srtcontrole_opmerking"
                    + "             , idsc.ins_deelsrtcontrole_key"
                    + "             , di.ins_srtcontrole_periode periode"
                    + "             , di.ins_srtcontrole_eenheid eenheid"
                    + "             , CASE WHEN idsc.ins_deelsrtcontrole_freezecost IS NULL THEN 0 ELSE 1 END frozen"
                    + "             , COALESCE(idsc.ins_deelsrtcontrole_freezecost, " + sqlCost + ") kosten"
                    + "             , di.ins_srtcontrole_mode isc_mode"
                    + "             , idsc.ins_deelsrtcontrole_plandatum plandatum"
                    + "             , idsc.ins_deelsrtcontrole_opmerking"
                    + "             , " + S("prs_pers_string") + " inspecteur"
                    + "             , di.ctr_controle_type"
                    + "             , idsc.ins_deelsrtcontrole_status"
                    + "             , di.ins_srtcontrole_eind inspectie_eind"
                    + "             , di.ins_srtcontrole_options options"
                    + "             , cm.ins_controlemode_success ins_controlemode_success"
                    + "             , d.ins_deel_omschrijving"
                    + "             , d.ins_deel_actief"
                    + "             , s.ins_srtdeel_omschrijving"
                    + "             , cd.ins_discipline_omschrijving"
                    + (params.insFlexParams && params.insFlexParams.anyflex
                      ?               params.insFlexParams.sql
                      : "")
                    + "          FROM ins_v_defined_inspect_xcp di"
                    + "             , ins_deelsrtcontrole idsc"
                    + "             , prs_perslid p"
                    + "             , ins_controlemode cm"
                    + "             , ins_deel d"
                    + "             , ins_srtdeel s"
                    + (mld_key > 0
                    ? "             , mld_melding_object mo"
                    : "")
                    + "             , ctr_v_aanwezigdiscipline cd"
                    + "         WHERE idsc.ins_srtcontrole_key = di.ins_srtcontrole_key"
                    + "           AND idsc.ins_deel_key = di.ins_deel_key"
                    + "           AND d.ins_deel_key = di.ins_deel_key"
                    + "           AND d.ins_srtdeel_key = s.ins_srtdeel_key"
                    + (!params.present ? " AND idsc.ins_deelsrtcontrole_status NOT IN (2, 3)" : "")
                    + "           AND idsc.prs_perslid_key = p.prs_perslid_key(+)"
                    + "           AND idsc.ins_controlemode_key = cm.ins_controlemode_key(+)"
                    + (mld_key > 0
                      ? "         AND d.ins_deel_key = mo.ins_deel_key"
                        + "       AND idsc.ins_deelsrtcontrole_key = mo.ins_deelsrtcontrole_key"
                        + "       AND mo.mld_melding_key = " + mld_key // Bij bestaande melding ook de gekoppelde inspecties tonen waarvan de periode ondertussen op 0 is gezet.
                      : "         AND di.ins_deel_key = " + ins_key
                        + "       AND di.ins_srtcontrole_periode > 0") // Als de periode 0 is dan de inspecties die gaan komen niet meer tonen.
                    + "           AND di.ins_scenario_key = 1"
                    + "           AND idsc.ins_scenario_key = 1"
                    + "           AND di.ctr_discipline_key = cd.ins_discipline_key(+)"
                    + "           AND di.ctr_discipline_key IN (SELECT w.ins_discipline_key"
                    + "                                           FROM fac_v_webgebruiker w"
                    + "                                              , fac_functie f"
                    + "                                          WHERE w.fac_functie_key = f.fac_functie_key "
                    + "                                            AND f.fac_functie_code = 'WEB_CTRUSE'"
                    + "                                            AND w.fac_gebruiker_prs_level_read < 9"
                    + "                                            AND w.fac_gebruiker_alg_level_read < 9"
                    + "                                            AND w.prs_perslid_key = " + user_key + ")";
                    // Voor lopende en voltooide inspecties kijken later naar ins_deel_actief
                    // Gedaande inspectie altijd tonen.

            var sql = "SELECT *"
                    + "  FROM (" + (params.past ? past_inspect : "")
                                 + (params.past && params.future ? " UNION ALL " : "")
                                 + (params.future ? future_inspect : "")
                    + "       )"
                    + " WHERE (inspectie_next < inspectie_eind OR inspectie_next IS NULL OR inspectie_eind IS NULL)"
                    + "   AND (ins_deel_actief = 1 OR ins_deelsrtcontrole_status > 0)" // Als het object inactief is (ins_deel_actief = 0), dan de lopende en voltooide inspecties wel tonen (niet de ingeplande).
                    + " ORDER BY seq"
                            + ", ins_deelsrtcontrole_datum DESC"
                            + ", ins_deelsrtcontrole_key DESC"
                            + ", inspectie_org DESC"
                            + ", inspectie_next"
                            + ", ins_srtcontrole_omschrijving";

            return sql;
        }
}
%>