#ifdef CTR
/*
 * $Revision$
 * $Id$
 */


CREATE_VIEW(ctr_discipline, 0)
AS
 SELECT * FROM ins_tab_discipline WHERE ins_discipline_module = 'CTR';

DEFINIEER_VIEW_AANWEZIG(ctr_discipline, ins_discipline_verwijder,
    ctr_v_aanwezigdiscipline, 0);

CREATE_VIEW(ctr_v_monthly_recurring_tasks, 0)
AS
    -- Inspecties die dit jaar en volgend jaar nog uitgevoerd moeten worden.
    SELECT ig.discipline,
           ig.soort,
           ig.groep,
           ig.soortcode,
           ig.omschrijving object,
           ig.opmerking,
           ig.locatie_omschrijving locatie,
           ig.gebouw,
           ig.ruimtenr,
           ig.perslid persoon,
           ig.aantal,
           ig.srtcontrole_omschrijving taak,
           ig.ins_srtcontrole_eenheid eenheid,
           ig.ins_srtcontrole_periode periode,
           ig.taaksoort,
           ig.ins_deelsrtcontrole_datum inspectiedatum,
           ig.controlemode_omschrijving taakafhandeling,
           ig.ins_deelsrtcontrole_opmerking inspectie_opmerking,
           ins_deelsrtcontrole_status inspectie_code,
           ig.deelsrtcontrole_status inspectie_status,
           ins_controlemode_success succesvol,
           TO_CHAR(ig.volgendedatum, 'MM') maand,
           TO_CHAR(ig.volgendedatum, 'YYYY') jaar,
           TO_CHAR(ig.volgendedatum, 'YYYY-MM') jaarmaand,
           ig.ins_deelsrtcontrole_datum_org orgdatum,
           ig.ins_deelsrtcontrole_plandatum plandatum,
           ig.volgendedatum,
           ig.vervaldatum,
           ig.ins_deel_key deel_key,
           ig.ins_srtcontrole_key,
           ig.ins_deelsrtcontrole_key
      FROM (WITH
                comps(ins_deel_key,
                      ins_srtcontrole_key,
                      ins_deelsrtcontrole_datum,
                      ins_srtcontrole_eenheid,
                      ins_srtcontrole_periode,
                      volgendedatum,
                      discipline,
                      soort,
                      groep,
                      soortcode,
                      omschrijving,
                      opmerking,
                      locatie_omschrijving,
                      gebouw,
                      ruimtenr,
                      aantal,
                      srtcontrole_omschrijving,
                      taaksoort,
                      ins_deelsrtcontrole_datum_org,
                      controlemode_omschrijving,
                      ins_deelsrtcontrole_opmerking,
                      perslid,
                      ins_deelsrtcontrole_plandatum,
                      ins_deelsrtcontrole_status,
                      ins_controlemode_success,
                      deelsrtcontrole_status,
                      vervaldatum,
                      ins_deelsrtcontrole_key)
                AS
                    ( -- 1a) Eerste deel bepaald de laatste inspectie (geplande(0), gestarte(2), afgemeld(5) of verwerkt(6)).
                     SELECT di.deel_key ins_deel_key,
                            xcp.ins_srtcontrole_key,
                            di.ins_deelsrtcontrole_datum,
                            xcp.ins_srtcontrole_eenheid,
                            xcp.ins_srtcontrole_periode,
                            COALESCE(di.ins_deelsrtcontrole_plandatum,
                                     CASE
                                     WHEN di.ins_deelsrtcontrole_status IN (2, 3)
                                      AND di.ins_deelsrtcontrole_datum_org IS NULL
                                     THEN -- Gestart(2) en de allereerste inspectie (ins_deelsrtcontrole_datum_org is NULL).
                                         -- 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.
                                         CASE
                                         -- Er geldt dat (ctr_ismjob = 0), dus de eerste when is toch niet geldig.
                                         --WHEN di.ctr_ismjob = 1
                                         --THEN
                                         --    ins_deelsrtcontrole_freezedate
                                         WHEN xcp.ctr_controle_type = 1
                                         THEN -- Controle(1).
                                             CASE
                                             WHEN xcp.ins_srtcontroledl_xcp_startdat IS NOT NULL
                                              AND xcp.ins_srtcontroledl_xcp_startdat >= xcp.ins_deel_aanmaak
                                             THEN
                                                 xcp.ins_srtcontroledl_xcp_startdat
                                             ELSE
                                                 xcp.ins_deel_aanmaak
                                             END
                                         ELSE -- Vervanging(2), Certificering(3).
                                             CASE
                                             WHEN xcp.ins_srtcontroledl_xcp_startdat IS NOT NULL
                                              AND xcp.ins_srtcontroledl_xcp_startdat >= xcp.ins_deel_aanmaak
                                             THEN
                                                 xcp.ins_srtcontroledl_xcp_startdat
                                             ELSE
                                                 fac.nextcyclusdate(
                                                     -- er is nog geen inspectie geweest, dus de laatste inspectie is null
                                                     COALESCE(
                                                         NULL,
                                                         GREATEST(
                                                             COALESCE(xcp.ins_srtcontroledl_xcp_startdat,
                                                                      xcp.ins_deel_aanmaak),
                                                             COALESCE(xcp.ins_deel_aanmaak,
                                                                      xcp.ins_srtcontroledl_xcp_startdat))),
                                                     xcp.ins_srtcontrole_mode,
                                                     xcp.ins_srtcontrole_eenheid,
                                                     xcp.ins_srtcontrole_periode,
                                                     xcp.ins_srtcontrole_bits,
                                                     1, -- steps. De eerste inspectie is nog niet geweest dus 1 periode verder dan startdatum/aanmaakdatum.
                                                     0) -- Er geldt dat (ctr_ismjob = 0)
                                             END
                                         END
                                     WHEN di.ins_deelsrtcontrole_status IN (2, 3)
                                      AND di.ins_deelsrtcontrole_datum_org IS NOT NULL
                                     THEN -- Gestart(2) en niet de allereerste inspectie.
                                         di.ins_deelsrtcontrole_datum_org
                                     ELSE -- Status is Gereed gemeld(5) of Voltooid(6).
                                         CASE xcp.ins_srtcontrole_mode
                                         WHEN 0
                                         THEN -- Moment mode: ga uit van de originele berekende inspectiedatum.
                                             di.ins_deelsrtcontrole_datum_org
                                         ELSE -- Interval mode: ga uit van de werkelijke inspectiedatum.
                                             di.ins_deelsrtcontrole_datum
                                         END
                                     END) volgendedatum,
                            discipline,
                            soort,
                            groep,
                            soortcode,
                            omschrijving,
                            opmerking,
                            locatie_omschrijving,
                            gebouw,
                            ruimtenr,
                            aantal,
                            srtcontrole_omschrijving,
                            ctr_discipline_omschrijving taaksoort,
                            ins_deelsrtcontrole_datum_org,
                            controlemode_omschrijving,
                            ins_deelsrtcontrole_opmerking,
                            perslid,
                            ins_deelsrtcontrole_plandatum,
                            di.ins_deelsrtcontrole_status,
                            COALESCE(
                                (SELECT icm.ins_controlemode_success
                                   FROM ins_controlemode icm
                                  WHERE icm.ins_controlemode_key =
                                        (SELECT di2.ins_controlemode_key
                                           FROM ins_deelsrtcontrole di2
                                          WHERE di2.ins_deelsrtcontrole_key = di.ins_deelsrtcontrole_key)),
                                -1) ins_controlemode_success,
                            CASE di.ins_deelsrtcontrole_status
                            WHEN 0
                            THEN
                                lcl.L('lcl_ins_controle_pending')
                            WHEN 2
                            THEN
                                lcl.L('lcl_ins_controle_gestart')
                            WHEN 3
                            THEN
                                lcl.L('lcl_ins_controle_ter_uitvoer')
                            WHEN 5
                            THEN
                                CASE
                                WHEN ((SELECT icm.ins_controlemode_success
                                         FROM ins_controlemode icm
                                        WHERE icm.ins_controlemode_key =
                                              (SELECT di2.ins_controlemode_key
                                                 FROM ins_deelsrtcontrole di2
                                                WHERE di2.ins_deelsrtcontrole_key = di.ins_deelsrtcontrole_key)) =
                                      1)
                                THEN
                                    lcl.L('lcl_ins_controlemode_approved')
                                ELSE
                                    lcl.L('lcl_ins_controlemode_deprecated')
                                END
                            WHEN 6
                            THEN
                                CASE
                                WHEN ((SELECT icm.ins_controlemode_success
                                         FROM ins_controlemode icm
                                        WHERE icm.ins_controlemode_key =
                                              (SELECT ins_controlemode_key
                                                 FROM ins_deelsrtcontrole
                                                WHERE ins_deelsrtcontrole_key = di.ins_deelsrtcontrole_key)) =
                                      1)
                                THEN
                                    lcl.L('lcl_ins_controlemode_approved')
                                ELSE
                                    lcl.L('lcl_ins_controlemode_deprecated')
                                END
                            END deelsrtcontrole_status,
                            xcp.ins_srtcontrole_eind vervaldatum,
                            di.ins_deelsrtcontrole_key
                       FROM ins_v_udr_deelinspect di,
                            ins_v_defined_inspect_xcp xcp,
                            ctr_disc_params dp
                      WHERE di.ins_srtcontrole_key = xcp.ins_srtcontrole_key
                        AND di.deel_key = xcp.ins_deel_key
                        AND xcp.ctr_discipline_key = dp.ctr_ins_discipline_key
                        AND dp.ctr_disc_params_ismjob = 0
                        AND xcp.ins_srtcontrole_eenheid > 2
                        AND xcp.ins_scenario_key = 1
                        AND xcp.ins_srtcontrole_periode > 0
                        AND di.ins_deelsrtcontrole_key = (SELECT MAX(ins_deelsrtcontrole_key)
                                                            FROM ins_deelsrtcontrole id2
                                                           WHERE id2.ins_deel_key = di.deel_key
                                                             AND id2.ins_srtcontrole_key = di.ins_srtcontrole_key
                                                             AND id2.ins_scenario_key = 1)
                        AND COALESCE(di.ins_deelsrtcontrole_datum,
                                     di.ins_deelsrtcontrole_plandatum,
                                     di.ins_deelsrtcontrole_datum_org)
                                IS NOT NULL
                     UNION ALL
                     -- 1b) Tweede deel bepaalt/berekent de toekomstige inspecties van dit jaar en volgend jaar.
                     SELECT m.ins_deel_key,
                            m.ins_srtcontrole_key,
                            NULL ins_deelsrtcontrole_datum,
                            m.ins_srtcontrole_eenheid,
                            m.ins_srtcontrole_periode,
                            ADD_MONTHS(m.volgendedatum,
                                       CASE
                                       WHEN m.ins_srtcontrole_eenheid = 3 THEN m.ins_srtcontrole_periode
                                       ELSE m.ins_srtcontrole_periode * 12
                                       END),
                            m.discipline,
                            m.soort,
                            m.groep,
                            m.soortcode,
                            m.omschrijving,
                            m.opmerking,
                            m.locatie_omschrijving,
                            m.gebouw,
                            m.ruimtenr,
                            m.aantal,
                            m.srtcontrole_omschrijving,
                            m.taaksoort,
                            NULL ins_deelsrtcontrole_datum_org,
                            NULL controlemode_omschrijving,
                            NULL ins_deelsrtcontrole_opmerking,
                            NULL perslid,
                            NULL ins_deelsrtcontrole_plandatum,
                            -1 ins_deelsrtcontrole_status,
                            -1 ins_controlemode_success,
                            lcl.L('lcl_ins_controlemode_notplaned') deelsrtcontrole_status,
                            m.vervaldatum,
                            NULL ins_deelsrtcontrole_key
                       FROM comps m
                      WHERE ADD_MONTHS(m.volgendedatum,
                                       CASE
                                       WHEN m.ins_srtcontrole_eenheid = 3 THEN m.ins_srtcontrole_periode
                                       ELSE m.ins_srtcontrole_periode * 12
                                       END) <=
                            TRUNC(ADD_MONTHS(SYSDATE, 24), 'YYYY')
                                                                  )
            SELECT *
              FROM comps) ig
     WHERE (ig.vervaldatum IS NULL
         OR ig.vervaldatum > ig.volgendedatum)
       AND ig.volgendedatum BETWEEN TRUNC(ADD_MONTHS(SYSDATE, -12), 'YYYY') AND TRUNC(ADD_MONTHS(SYSDATE, 24), 'YYYY')
    UNION ALL
    -- 2) Inspecties die vorig jaar en dit jaar zijn uitgevoerd, uitgezonderd de laatste.
    SELECT di.discipline,
           di.soort,
           di.groep,
           di.soortcode,
           di.omschrijving object,
           di.opmerking,
           di.locatie_omschrijving locatie,
           di.gebouw,
           di.ruimtenr,
           di.perslid persoon,
           di.aantal,
           di.srtcontrole_omschrijving taak,
           sc.ins_srtcontrole_eenheid eenheid,
           sc.ins_srtcontrole_periode periode,
           di.ctr_discipline_omschrijving taaksoort,
           di.ins_deelsrtcontrole_datum inspectiedatum,
           di.controlemode_omschrijving taakafhandeling,
           di.ins_deelsrtcontrole_opmerking inspectie_opmerking,
           (SELECT ins_deelsrtcontrole_status
              FROM ins_deelsrtcontrole
             WHERE ins_deelsrtcontrole_key = di.ins_deelsrtcontrole_key)
               inspectie_code,
           CASE (SELECT di2.ins_deelsrtcontrole_status
                   FROM ins_deelsrtcontrole di2
                  WHERE di2.ins_deelsrtcontrole_key = di.ins_deelsrtcontrole_key)
           WHEN 0
           THEN
               lcl.L('lcl_ins_controle_pending')
           WHEN 2
           THEN
               lcl.L('lcl_ins_controle_gestart')
           WHEN 3
           THEN
               lcl.L('lcl_ins_controle_ter_uitvoer')
           WHEN 5
           THEN
               CASE
               WHEN ((SELECT icm.ins_controlemode_success
                        FROM ins_controlemode icm
                       WHERE icm.ins_controlemode_key =
                             (SELECT ins_controlemode_key
                                FROM ins_deelsrtcontrole
                               WHERE ins_deelsrtcontrole_key = di.ins_deelsrtcontrole_key)) =
                     1)
               THEN
                   lcl.L('lcl_ins_controlemode_approved')
               ELSE
                   lcl.L('lcl_ins_controlemode_deprecated')
               END
           WHEN 6
           THEN
               CASE
               WHEN ((SELECT icm.ins_controlemode_success
                        FROM ins_controlemode icm
                       WHERE icm.ins_controlemode_key =
                             (SELECT ins_controlemode_key
                                FROM ins_deelsrtcontrole
                               WHERE ins_deelsrtcontrole_key = di.ins_deelsrtcontrole_key)) =
                     1)
               THEN
                   lcl.L('lcl_ins_controlemode_approved')
               ELSE
                   lcl.L('lcl_ins_controlemode_deprecated')
               END
           END inspectie_status,
           COALESCE((SELECT icm.ins_controlemode_success
                       FROM ins_controlemode icm
                      WHERE icm.ins_controlemode_key = (SELECT di2.ins_controlemode_key
                                                          FROM ins_deelsrtcontrole di2
                                                         WHERE di2.ins_deelsrtcontrole_key = di.ins_deelsrtcontrole_key)),
                    -1) ins_controlemode_success,
           TO_CHAR(di.ins_deelsrtcontrole_datum, 'MM') maand,
           TO_CHAR(di.ins_deelsrtcontrole_datum, 'YYYY') jaar,
           TO_CHAR(di.ins_deelsrtcontrole_datum, 'YYYY-MM') jaarmaand,
           di.ins_deelsrtcontrole_datum_org orgdatum,
           di.ins_deelsrtcontrole_plandatum plandatum,
           di.ins_deelsrtcontrole_datum volgendedatum,
           di.vervaldatum,
           di.deel_key,
           sc.ins_srtcontrole_key,
           di.ins_deelsrtcontrole_key
      FROM ins_v_udr_deelinspect di,
           ins_srtcontrole sc,
           ctr_disc_params dp
     WHERE di.ins_srtcontrole_key = sc.ins_srtcontrole_key
       AND sc.ctr_discipline_key = dp.ctr_ins_discipline_key
       AND dp.ctr_disc_params_ismjob = 0
       AND sc.ins_srtcontrole_eenheid > 2
       AND di.ins_deelsrtcontrole_datum BETWEEN TRUNC(ADD_MONTHS(SYSDATE, -12), 'YYYY')
                                            AND TRUNC(ADD_MONTHS(SYSDATE, 24), 'YYYY')
       AND di.ins_deelsrtcontrole_key NOT IN (SELECT MAX(ins_deelsrtcontrole_key)
                                                FROM ins_deelsrtcontrole id2
                                               WHERE id2.ins_deel_key = di.deel_key
                                                 AND id2.ins_srtcontrole_key = di.ins_srtcontrole_key
                                                 AND id2.ins_scenario_key = 1);

CREATE_VIEW(ctr_v_monthly_recurring_tasksy, 0)  // alleen huidige jaar
AS
SELECT *
  FROM ctr_v_monthly_recurring_tasks
 WHERE jaar = TO_CHAR (SYSDATE, 'YYYY');

REGISTERRUN('$Id$')

#endif // CTR
