--
-- $Id$
--
-- Script containing customer specific db-configuration for DJIN.
DEFINE thisfile = 'DJIN.SQL'
DEFINE dbuser   = '^FMS'

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
WHENEVER SQLERROR EXIT;
SELECT adm.scriptspoolfile('&dbuser', '&thisfile') AS fcltlogfile FROM DUAL;
WHENEVER SQLERROR CONTINUE;
SPOOL &fcltlogfile
SET DEFINE OFF

------ payload begin ------

CREATE OR REPLACE VIEW djin_v_rap_import_log
(
   fclt_f_applicatie,
   datum,
   fclt_f_status,
   omschrijving,
   hint
)
AS
   SELECT COALESCE (fac_import_app_code, imp_log_applicatie),
          TO_CHAR (imp_log_datum, 'dd-mm-yyyy hh24:mi'),
          imp_log_status,
          imp_log_omschrijving,
          imp_log_hint
     FROM imp_log il1, fac_import fi1, fac_import_app fia1
    WHERE il1.fac_import_key = fi1.fac_import_key(+)
          AND fi1.fac_import_app_key = fia1.fac_import_app_key(+)
          AND NOT EXISTS
                (SELECT 1
                   FROM imp_log il2, fac_import fi2
                  WHERE     il2.fac_import_key = fi2.fac_import_key
                        AND fi2.fac_import_app_key = fi1.fac_import_app_key
                        AND il2.fac_import_key > il1.fac_import_key);

/* Formatted on 13-4-2015 13:58:02 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PROCEDURE djin_import_prs (p_import_key IN NUMBER)
AS
   v_errormsg       VARCHAR2 (1000) := '-';
   v_errorhint      VARCHAR2 (1000) := '-';
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_count          NUMBER (10);
BEGIN
   v_errorhint := 'Generieke import';

   -- Vestiging-kolom kopieren naar extra kolom 10 (= kenmerk1)!
   UPDATE fac_imp_file i
      SET i.fac_imp_file_line =
             SUBSTR (fac_imp_file_line, 1, INSTR (fac_imp_file_line || ';', ';', 1, 9))
             || ';'
             || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 2)
                                           + 1,   INSTR (fac_imp_file_line, ';', 1, 3)
                                                - INSTR (fac_imp_file_line, ';', 1, 2)
                                                - 1)
    WHERE fac_import_key = p_import_key AND fac_imp_file_index > 1;

   -- Vestiging-kolom resetten (op 'XXX' want verplicht)!
   UPDATE fac_imp_file i
      SET i.fac_imp_file_line =
                SUBSTR (fac_imp_file_line, 1, INSTR (fac_imp_file_line, ';', 1, 2))
             || '"XXX"'
             || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 3))
    WHERE fac_import_key = p_import_key AND fac_imp_file_index > 1;

   -- Functie-kolom kopieren naar extra kolom 11 (= kenmerk2)!
   UPDATE fac_imp_file i
      SET i.fac_imp_file_line =
             SUBSTR (fac_imp_file_line, 1, INSTR (fac_imp_file_line || ';', ';', 1, 10))
             || ';'
             || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 3)
                                           + 1,   INSTR (fac_imp_file_line, ';', 1, 4)
                                                - INSTR (fac_imp_file_line, ';', 1, 3)
                                                - 1)
    WHERE fac_import_key = p_import_key AND fac_imp_file_index > 1;

   -- Functie-kolom resetten (op 'XXX' want verplicht)!
   UPDATE fac_imp_file i
      SET i.fac_imp_file_line =
                SUBSTR (fac_imp_file_line, 1, INSTR (fac_imp_file_line, ';', 1, 3))
             || '"XXX"'
             || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 4))
    WHERE fac_import_key = p_import_key AND fac_imp_file_index > 1;

   -- DJIN#36237: Telefoonnr-kolom negeren=wissen!
   UPDATE fac_imp_file i
      SET i.fac_imp_file_line =
                SUBSTR (fac_imp_file_line, 1, INSTR (fac_imp_file_line, ';', 1, 6))
             || '""'
             || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 7))
    WHERE fac_import_key = p_import_key AND fac_imp_file_index > 1;

   -- De sequence array staat beschreven in PRS_PAC.SRC bij de import_perslid-PROCEDURE.
   --"Accountnaam";"Achternaam";"Vestiging";"Functie";"Voornaam";"E-mail";"Telefoonnr";"Werkplekruimte";"Afdeling"
   prs.import_perslid (
      p_import_key,
         '0;0;0;0;0;0;3;2;0;5;'
      || '0;0;0;0;0;7;0;6;0;0;'
      || '4;1;0;0;0;0;10;11;8;9;'
      || '0;0;0;0;0;0;0;0;0;0;'
      || '0;0;0;0;0;0',
      '%"Accountnaam";"Achternaam";"Vestiging";"Functie";"Voornaam";"E-mail";"Telefoonnr";"Werkplekruimte";"Afdeling"%');

   -- Klantspecifieke aanpassingen.
   -- Locatie/Gebouw/Verdieping/Ruimte bepalen via Vestiging-kolom -> Eigen tabel (key=1) ->
   -- Gebouw en daaronder Ruimte '_000' op Verdieping 0!
   -- Als persoon al een WP heeft op import-vestiging, dan is dat de juiste en blijft deze
   -- (handmatig gecorrigeerde WP) ongewijzigd. In alle andere gevallen verhuist persoon naar
   -- Eventuele WPs onder andere vestigingen dan import-vestiging blijven ook ongewijzigd!
   UPDATE fac_imp_perslid i
      SET i.alg_locatie_code =
             (SELECT il.alg_locatie_code
                FROM fac_v_aanwezigusrdata ud, -- Mapping AD-code -> gebouwcode
                     alg_v_aanweziggebouw ig,
                     alg_locatie il
               WHERE ud.fac_usrtab_key = 1
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code)
                     AND ig.alg_locatie_key = il.alg_locatie_key
                     AND NOT EXISTS
                           (SELECT 1
                              FROM alg_v_aanweziggebouw
                             WHERE UPPER (alg_gebouw_code) = UPPER (ud.fac_usrdata_omschr)
                                   AND alg_locatie_key < il.alg_locatie_key)),
          i.alg_gebouw_code =
             (SELECT ig.alg_gebouw_code
                FROM fac_v_aanwezigusrdata ud, -- Mapping AD-code -> gebouwcode
                     alg_v_aanweziggebouw ig,
                     alg_locatie il
               WHERE ud.fac_usrtab_key = 1
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code)
                     AND ig.alg_locatie_key = il.alg_locatie_key
                     AND NOT EXISTS
                           (SELECT 1
                              FROM alg_v_aanweziggebouw
                             WHERE UPPER (alg_gebouw_code) = UPPER (ud.fac_usrdata_omschr)
                                   AND alg_locatie_key < il.alg_locatie_key)),
          i.alg_verdieping_volgnr = 0,
          i.alg_ruimte_nr = '_000'
    WHERE NOT EXISTS           -- Nog geen werkplek binnen Vestiging=District!
             (SELECT 1
                FROM fac_v_aanwezigusrdata ud, -- Mapping AD-code -> gebouwcode
                     alg_v_aanweziggebouw ig,
                     alg_locatie il,
                     prs_v_aanwezigperslid p,
                     prs_perslidwerkplek pw,
                     prs_werkplek cw,
                     alg_v_aanwezigruimte cr,
                     alg_verdieping cv,
                     alg_gebouw cg,
                     alg_locatie cl
               WHERE ud.fac_usrtab_key = 1
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code)
                     AND ig.alg_locatie_key = il.alg_locatie_key
                     AND NOT EXISTS
                           (SELECT 1
                              FROM alg_v_aanweziggebouw
                             WHERE UPPER (alg_gebouw_code) = UPPER (ud.fac_usrdata_omschr)
                                   AND alg_locatie_key < il.alg_locatie_key)
                     AND p.prs_perslid_oslogin = i.prs_perslid_oslogin
                     AND p.prs_perslid_key = pw.prs_perslid_key
                     AND pw.prs_werkplek_key = cw.prs_werkplek_key
                     AND cw.prs_alg_ruimte_key = cr.alg_ruimte_key
                     AND cr.alg_verdieping_key = cv.alg_verdieping_key
                     AND cv.alg_gebouw_key = cg.alg_gebouw_key
                     AND cg.alg_locatie_key = cl.alg_locatie_key
                     AND cl.alg_district_key = il.alg_district_key);

   COMMIT;

   -- Locatie/Gebouw/Verdieping/Ruimte altijd volgens Werkplekruimte-kolom indien gevuld (dus ook
   -- als formaat niet klopt, want dat resulteert tenminste -normaal gesproken- in foutlogging)!
   UPDATE fac_imp_perslid i
      SET i.alg_locatie_code =
             (SELECT il.alg_locatie_code
                FROM alg_v_aanweziggebouw ig, alg_locatie il
               WHERE UPPER (ig.alg_gebouw_code) =
                        UPPER (SUBSTR (prs_kenmerk3, 1, INSTR (prs_kenmerk3, '-', 1, 1) - 1))
                     AND ig.alg_locatie_key = il.alg_locatie_key
                     AND NOT EXISTS
                           (SELECT 1
                              FROM alg_v_aanweziggebouw
                             WHERE UPPER (alg_gebouw_code) =
                                      UPPER(SUBSTR (prs_kenmerk3, 1, INSTR (prs_kenmerk3, '-', 1, 1) - 1))
                                   AND alg_locatie_key < il.alg_locatie_key)),
          i.alg_gebouw_code =
             SUBSTR (SUBSTR (prs_kenmerk3, 1, INSTR (prs_kenmerk3, '-', 1, 1) - 1), 1, 12),
          i.alg_verdieping_volgnr =
             fac.safe_to_number (SUBSTR (SUBSTR (prs_kenmerk3, INSTR (prs_kenmerk3, '-', 1, 1)
                                                               + 1,   INSTR (prs_kenmerk3, '-', 1, 2)
                                                                    - INSTR (prs_kenmerk3, '-', 1, 1)
                                                                    - 1), 1, 3)),
          i.alg_ruimte_nr =
             SUBSTR (SUBSTR (prs_kenmerk3, INSTR (prs_kenmerk3, '-', 1, 2) + 1), 1, 10)
    WHERE i.prs_kenmerk3 IS NOT NULL;

   COMMIT;

   -- Afdeling bepalen via Vestiging-kolom -> ET (key=1) -> Gebouw -> Locatie -> District ->
   -- Afdeling-3 (= Vestiging in organisatieboom)!
   UPDATE fac_imp_perslid i
      SET i.prs_afdeling_naam =
             (SELECT MAX (a.prs_afdeling_upper)
                FROM fac_v_aanwezigusrdata ud, -- Mapping AD-code -> gebouwcode
                     alg_v_aanweziggebouw ig,
                     alg_locatie il,
                     alg_district id,
                     prs_v_aanwezigafdeling a
               WHERE ud.fac_usrtab_key = 1
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code)
                     AND ig.alg_locatie_key = il.alg_locatie_key
                     AND il.alg_district_key = id.alg_district_key
                     AND UPPER (id.alg_district_omschrijving) = UPPER (a.prs_afdeling_omschrijving)
                     AND a.prs_bedrijf_key = 2
                     AND a.niveau = 3)
    WHERE i.prs_perslid_oslogin IS NOT NULL
          AND EXISTS
                (SELECT 1
                   FROM fac_v_aanwezigusrdata ud, -- Mapping AD-code -> gebouwcode
                        alg_v_aanweziggebouw ig,
                        alg_locatie il,
                        alg_district id,
                        prs_v_aanwezigafdeling a
                  WHERE ud.fac_usrtab_key = 1
                        AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                        AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code)
                        AND ig.alg_locatie_key = il.alg_locatie_key
                        AND il.alg_district_key = id.alg_district_key
                        AND UPPER (id.alg_district_omschrijving) = UPPER (a.prs_afdeling_omschrijving)
                        AND a.prs_bedrijf_key = 2
                        AND a.niveau = 3);

   COMMIT;

   -- Afdeling 'ONB'; als Vestiging-kolom wel in ET (key=1), maar mapping op Afdeling-3 niet
   -- mogelijk!
   UPDATE fac_imp_perslid i
      SET i.prs_afdeling_naam = 'ONB'
    WHERE i.prs_perslid_oslogin IS NOT NULL
          AND EXISTS
                (SELECT 1
                   FROM fac_v_aanwezigusrdata ud -- Mapping AD-code -> gebouwcode
                  WHERE ud.fac_usrtab_key = 1
                        AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1))
          AND NOT EXISTS
                (SELECT 1
                   FROM fac_v_aanwezigusrdata ud, -- Mapping AD-code -> gebouwcode
                        alg_v_aanweziggebouw ig,
                        alg_locatie il,
                        alg_district id,
                        prs_v_aanwezigafdeling a
                  WHERE ud.fac_usrtab_key = 1
                        AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                        AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code)
                        AND ig.alg_locatie_key = il.alg_locatie_key
                        AND il.alg_district_key = id.alg_district_key
                        AND UPPER (id.alg_district_omschrijving) = UPPER (a.prs_afdeling_omschrijving)
                        AND a.prs_bedrijf_key = 2
                        AND a.niveau = 3);

   COMMIT;

   -- Afdeling altijd volgens Afdeling-kolom indien gevuld!
   UPDATE fac_imp_perslid i
      SET i.prs_afdeling_naam = SUBSTR (i.prs_kenmerk4, 1, 10)
    WHERE i.prs_kenmerk4 IS NOT NULL;

   COMMIT;

   -- DJIN#36237: Functie-kolom altijd op 'Onbekend'!
   --UPDATE fac_imp_perslid i
   --   SET i.prs_srtperslid_omschrijving = COALESCE (i.prs_kenmerk2, 'Onbekend');
   UPDATE fac_imp_perslid i
      SET i.prs_srtperslid_omschrijving = 'Onbekend';

   COMMIT;

   -- DJIN#36237: Telefoon-kolom zoals in FACILITOR (voor import-doelgroep)!
   UPDATE fac_imp_perslid i
      SET i.prs_perslid_telefoonnr =
             (SELECT p.prs_perslid_telefoonnr
                FROM prs_perslid p
               WHERE UPPER (p.prs_perslid_oslogin) = UPPER (i.prs_perslid_oslogin)),
          i.prs_perslid_mobiel =
             (SELECT p.prs_perslid_mobiel
                FROM prs_perslid p
               WHERE UPPER (p.prs_perslid_oslogin) = UPPER (i.prs_perslid_oslogin))
    WHERE EXISTS
             (SELECT 1
                FROM prs_perslid p
               WHERE p.prs_perslid_telefoonnr IS NOT NULL
                     AND UPPER (p.prs_perslid_oslogin) = UPPER (i.prs_perslid_oslogin));

   COMMIT;

   DELETE FROM fac_imp_perslid i
         WHERE i.prs_perslid_oslogin IS NULL
               OR NOT EXISTS
                    (SELECT 1
                       FROM fac_v_aanwezigusrdata ud -- Mapping AD-code -> gebouwcode
                      WHERE ud.fac_usrtab_key = 1
                            AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1));

   COMMIT;

   SELECT COUNT ( * ) INTO v_count FROM fac_imp_perslid;

   fac.imp_writelog (
      p_import_key,
      'S',
      'Persoon: aantal te verwerken regels: ' || TO_CHAR (v_count),
      '');

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=
         'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ') ';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_errormsg || v_errorhint,
                        'Inleesproces personen afgebroken!');
END djin_import_prs;
/

CREATE OR REPLACE PROCEDURE djin_update_prs (p_import_key IN NUMBER)
AS
   -- Maximaal percentage aan nieuwe medewerkers tov. actieve medewerkers met een e-mail
   c_max_delta_percentage   NUMBER (10) := 25;                         -- 25%!
   v_count_prs_import       NUMBER (10);     -- #actieve personen  na  import!
   v_count_prs_actual       NUMBER (10);     -- #actieve personen voor import!

   -- Let op! Personen die niet meer in dienst zijn -> niet in fac_imp_perslid!
   -- Dubbele oslogins? Dan wordt iemand mogelijk niet verwijderd/INACTIEF!
   -- DJIN#51705: Geen personen meer verwijderen (dit loopt nu via NACHTWERK).
   --CURSOR c_del
   --IS
   --     SELECT p.prs_perslid_key, p.prs_perslid_oslogin
   --       FROM prs_v_aanwezigperslid p
   --      WHERE (p.prs_perslid_oslogin IS NULL OR p.prs_perslid_oslogin NOT LIKE '\_%' ESCAPE '\') -- ' tbv. opmaak
   --            AND p.prs_perslid_oslogin2 IS NULL
   --            AND NOT EXISTS
   --                  (SELECT 1
   --                     FROM fac_imp_perslid i
   --                    WHERE UPPER (i.prs_perslid_oslogin) = UPPER (p.prs_perslid_oslogin))
   --   ORDER BY 2, 1;
BEGIN
   -- Bepaal oslogin-match tussen FACILITOR en RECENT importbestand ofwel het aantal
   -- actieve personen na import.
   -- RECENT betekent niet meer dan een kwartiertje oud (14,4 minuten); dit voorkomt
   -- dat - als er geen nieuw importbestand is aangeleverd - telkens dezelfde fouten
   -- worden gerapporteerd (nl. op basis van een oud bestand in FAC_IMP_PERSLID).
   --SELECT COUNT ( * )
   --  INTO v_count_prs_import
   --  FROM prs_v_aanwezigperslid p, fac_imp_perslid i
   -- WHERE p.prs_perslid_oslogin IS NOT NULL
   --       AND UPPER (p.prs_perslid_oslogin) = UPPER (i.prs_perslid_oslogin);
   SELECT COUNT (DISTINCT prs_perslid_oslogin)
     INTO v_count_prs_import
     FROM fac_imp_perslid;

   -- Bepaal huidig aantal actieve personen in FACILITOR.
   SELECT DECODE (COUNT ( * ), 0, 1, COUNT ( * ))
     INTO v_count_prs_actual
     FROM prs_v_aanwezigperslid
    WHERE prs_perslid_oslogin IS NOT NULL;

   IF (TRUNC ( (v_count_prs_import / v_count_prs_actual) * 100) < (100 - c_max_delta_percentage))
   THEN
      fac.imp_writelog (
         p_import_key,
         'E',
         'Verschil tussen huidig aantal en te importeren aantal personen te groot; zie specificatie!',
            '- max. verschilpercentage = ['
         || TO_CHAR (c_max_delta_percentage)
         || '%]'
         || CHR (13) || CHR (10)
         || '- #personen/import = ['
         || TO_CHAR (v_count_prs_import)
         || ']'
         || CHR (13) || CHR (10)
         || '- #personen/huidig = ['
         || TO_CHAR (v_count_prs_actual)
         || ']');

      RETURN;
   END IF;

   -- Generieke update.
   prs.update_perslid (p_import_key, 'LOGIN', 'D');

   -- Iedereen plaatsen/behouden in de groep FE_DJI (key = 421)!
   INSERT INTO fac_gebruikersgroep (fac_groep_key, prs_perslid_key)
      SELECT 421, p.prs_perslid_key
        FROM prs_v_aanwezigperslid p
       WHERE p.prs_perslid_oslogin IS NOT NULL
             AND EXISTS
                   (SELECT 1
                      FROM fac_imp_perslid
                     WHERE UPPER (prs_perslid_oslogin) = UPPER (p.prs_perslid_oslogin))
             AND NOT EXISTS
                   (SELECT 1
                      FROM fac_gebruikersgroep
                     WHERE fac_groep_key = 421 AND prs_perslid_key = p.prs_perslid_key);

   -- Verwijder personen die niet meer in de import voorkomen.
   -- DJIN#51705: Geen personen meer verwijderen (dit loopt nu via NACHTWERK).
   --FOR rec IN c_del
   --LOOP
   --   prs.delete_perslid (p_import_key, rec.prs_perslid_key);
   --END LOOP;

   -- Verwijder ongebruikte functies; deze import bepaalt de functies!
   DELETE FROM prs_srtperslid sp
         WHERE NOT EXISTS
                  (SELECT 1
                     FROM prs_perslid p
                    WHERE p.prs_srtperslid_key = sp.prs_srtperslid_key);

   COMMIT;
END djin_update_prs;
/

CREATE OR REPLACE PROCEDURE djin_anonimiseer (p_incl_nodelays IN BOOLEAN, -- TRUE=Geen delay, dus alles direct en toekomstig!
                                              p_incl_oslogins IN BOOLEAN,
                                              p_incl_tracking IN BOOLEAN)
AS
   c_oud_medewerker   VARCHAR2 (100) := 'Inactieve medewerker';
   v_errormsg         VARCHAR2 (1000);
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   v_datum            DATE;
   v_count_del        NUMBER (10);

   CURSOR c_afspraak (p_datum DATE)
   IS
        SELECT bez_afspraak_key
          FROM bez_afspraak
         WHERE bez_afspraak_datum < ADD_MONTHS (p_datum, -6)
      ORDER BY bez_afspraak_key;

   -- DJIN#39650: Verwijderen van kenmerk Bezorgadres (141) bij soortmelding
   --             Aanvraag bloemen/boeketten (82).
   CURSOR c_bezorgadres (p_datum DATE)
   IS
        SELECT km.mld_kenmerkmelding_key
          FROM mld_melding m, mld_kenmerkmelding km
         WHERE m.mld_stdmelding_key = 82         -- Aanvraag bloemen/boeketten
               AND m.mld_melding_key = km.mld_melding_key
               AND km.mld_kenmerk_key = 141                     -- Bezorgadres
               AND EXISTS (SELECT 1
                             FROM mld_v_aanwezigkenmerkmelding
                            WHERE mld_melding_key = m.mld_melding_key
                              AND mld_kenmerk_key = 21  -- Gewenste leverdatum
                              AND fac.safe_to_date (km.mld_kenmerkmelding_waarde, 'dd-mm-yyyy') < ADD_MONTHS (p_datum, -1))
      ORDER BY km.mld_kenmerkmelding_key;

   -- DJIN#56337: Verwijderen van kenmerken Kenteken (41) en Telefoonnummer (42)
   --             bij activiteit Parkeren medewerker (110).
   CURSOR c_res_parking (p_datum DATE)
   IS
        SELECT kw.res_kenmerkwaarde_key
          FROM res_rsv_ruimte rrr, res_kenmerkwaarde kw
         WHERE rrr.res_activiteit_key = 110             -- Parkeren medewerker
               AND rrr.res_rsv_ruimte_tot < ADD_MONTHS (p_datum, -1)
               AND rrr.res_rsv_ruimte_key = kw.res_rsv_ruimte_key
               AND kw.res_kenmerk_key IN (41, 42)   -- Kenteken/Telefoonnummer
      ORDER BY kw.res_kenmerkwaarde_key;

   -- SUBPROC
   PROCEDURE prs_anonimiseer
   AS
      v_count_upd        NUMBER (10);
      v_count            NUMBER (10);
      v_tracking_oms     VARCHAR2 (2048);

      CURSOR c1
      IS
           SELECT '[' || TO_CHAR (p.prs_perslid_key) || '|' || p.prs_perslid_naam || '|' || p.prs_perslid_email || '] ' aanduiding,
                  p.prs_perslid_key
             FROM prs_perslid p
            WHERE (p.prs_perslid_oslogin IS NULL OR p.prs_perslid_oslogin NOT LIKE '\_%' ESCAPE '\') -- ' tbv. opmaak
                  AND p.prs_perslid_oslogin2 IS NULL
                  AND p.prs_perslid_apikey IS NULL       -- Voor de zekerheid!
                  AND COALESCE (p.prs_perslid_login, p.prs_perslid_aanmaak) < ADD_MONTHS (SYSDATE, -12) -- Een jaar niet ingelogd!
                  AND (p.prs_perslid_verwijder IS NULL OR p.prs_perslid_upper != UPPER (c_oud_medewerker))
                  AND NOT EXISTS (SELECT 1     -- Geen actuele verplichtingen!
                                    FROM prs_v_verplichting_keys
                                   WHERE prs_perslid_key = p.prs_perslid_key)
         ORDER BY 2;

      CURSOR c2 (p_datum DATE)
      IS
           SELECT t.fac_tracking_key, t.fac_tracking_oms,
                  LENGTH (REPLACE (t.fac_tracking_oms || 'x', ' ', '')) - LENGTH (REPLACE (TRANSLATE (t.fac_tracking_oms || 'x', '@', ' '), ' ', '')) aant_email
             FROM fac_tracking t, fac_srtnotificatie sn
            WHERE t.fac_tracking_datum < ADD_MONTHS (p_datum, -12)
                  AND INSTR (t.fac_tracking_oms, '@') > 0
                  AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
                  AND (sn.fac_srtnotificatie_code LIKE '%MAI' OR sn.fac_srtnotificatie_code LIKE '%MA')
         ORDER BY 1;
   BEGIN
      v_errormsg := 'Fout anonimiseren PRS/Medewerkers';
      v_count_upd := 0;
      FOR rec IN c1
      LOOP
         BEGIN
            UPDATE prs_perslid
               SET prs_perslid_naam = c_oud_medewerker,
                   prs_perslid_tussenvoegsel = NULL,
                   prs_perslid_voorletters = NULL,
                   prs_perslid_voornaam = NULL,
                   prs_perslid_initialen = NULL,
                   prs_perslid_geslacht = NULL,
                   prs_perslid_nr = NULL,
                   prs_perslid_telefoonnr = NULL,
                   prs_perslid_mobiel = NULL,
                   prs_perslid_email = NULL,
                   prs_perslid_oslogin = NULL,  -- prs_perslid_oslogin2 = NULL
                   prs_perslid_verwijder = SYSDATE
             WHERE prs_perslid_key = rec.prs_perslid_key;
            IF MOD (v_count_upd, 1000) = 0 THEN COMMIT; END IF;

            v_count_upd := v_count_upd + 1;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
               fac.writelog ('DJIN_ANONIMISEER', 'W', rec.aanduiding || v_errormsg, '');
               COMMIT;
         END;
      END LOOP;

      fac.writelog ('DJIN_ANONIMISEER', 'S', 'Medewerkers/#geanonimiseerd: ' || TO_CHAR (v_count_upd), '');
      COMMIT;

      -- Wis afgesproken tracking als p_incl_tracking=TRUE!
      IF p_incl_tracking
      THEN
         v_datum := TO_DATE ('31122099', 'ddmmyyyy');
      ELSE
         v_datum := SYSDATE;
      END IF;

      -- FCLT#56224: Als een gebruiker via SAML automatisch wordt aangemaakt,
      --             dan wordt er bij die persoon getrackt:
      --             Gebruiker 'Aaa Bbb' aangemaakt met key 999 voor idp 'XXX'
      v_errormsg := 'Fout anonimiseren PRSUPD-tracking';
      UPDATE fac_tracking
         SET fac_tracking_oms = 'Gebruiker aangemaakt/gewijzigd'
       WHERE fac_srtnotificatie_key = 78                             -- PRSUPD
             AND fac_tracking_oms IS NOT NULL
             AND fac_tracking_datum < ADD_MONTHS (v_datum, -12);
      COMMIT;

      v_errormsg := 'Fout anonimiseren MLDBEH-tracking';
      UPDATE fac_tracking
         SET fac_tracking_oms = 'Behandelaar is toegewezen'
       WHERE fac_srtnotificatie_key = 50                             -- MLDBEH
             AND fac_tracking_datum < ADD_MONTHS (v_datum, -12);
      COMMIT;

      v_errormsg := 'Fout anonimiseren ORDSNT/SNX-tracking';
      UPDATE fac_tracking
         SET fac_tracking_oms = 'Opdracht is verstuurd'
       WHERE fac_srtnotificatie_key IN (67, 68)                  -- ORDSNT/SNX
             AND fac_tracking_datum < ADD_MONTHS (v_datum, -12);
      COMMIT;

      v_errormsg := 'Fout anonimiseren INSOUT-tracking';
      UPDATE fac_tracking
         SET fac_tracking_oms = 'Object is uitgegeven'
       WHERE fac_srtnotificatie_key = 98                             -- INSOUT
             AND fac_tracking_datum < ADD_MONTHS (v_datum, -12);
      COMMIT;

      v_errormsg := 'Fout anonimiseren mail-tracking';
      v_count_upd := 0;
      v_tracking_oms := '';
      FOR rec IN c2 (v_datum)
      LOOP
         BEGIN
            v_count := 0;
            v_tracking_oms := rec.fac_tracking_oms;
            WHILE v_count < rec.aant_email
            LOOP
               v_tracking_oms := SUBSTR (v_tracking_oms, 1, INSTR (SUBSTR (v_tracking_oms, 1, INSTR (v_tracking_oms, '@')), ' ', -1))
                                 || SUBSTR (v_tracking_oms, INSTR (v_tracking_oms, '@') + 1);
               v_count := v_count + 1;
            END LOOP;

            UPDATE fac_tracking
               SET fac_tracking_oms = v_tracking_oms
             WHERE fac_tracking_key = rec.fac_tracking_key;

            v_count_upd := v_count_upd + 1;
            IF MOD (v_count_upd, 1000) = 0 THEN COMMIT; END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
               fac.writelog ('DJIN_ANONIMISEER', 'W', v_errormsg, '');
               COMMIT;
         END;
      END LOOP;
      fac.writelog ('DJIN_ANONIMISEER', 'S', 'Trackregels/#geanonimiseerd: ' || TO_CHAR (v_count_upd), '');
      COMMIT;
   END;
BEGIN
   -- Anonimiseer medewerkers+trackregels. In Productie beide na 1 jaar en bij
   -- anonimisering tbv. Test-omgevingen (als p_incl_tracking=TRUE) dan alleen
   -- de tracking soms per direct (en toekomstig)!
   prs_anonimiseer ();

   -- Bij anonimisering tbv. Test-omgevingen (als p_incl_nodelays=TRUE) altijd
   -- uitvoeren!
   v_errormsg := 'Fout anonimiseren p_incl_nodelays=TRUE';
   IF p_incl_nodelays
   THEN
      -- FCLT#56224: Leeg buffer-tabel, daarin vaak ook persoonsgegevens, etc.!
      DELETE FROM fac_imp_file;

      -- Wis naam- en telefoon-velden van medewerkers!
      UPDATE prs_perslid
         SET prs_perslid_naam = '[Geanonimiseerd]',
             prs_perslid_tussenvoegsel = NULL,
             prs_perslid_voorletters = NULL,
             prs_perslid_voornaam = NULL,
             prs_perslid_telefoonnr = NULL,
             prs_perslid_mobiel = NULL
       WHERE (prs_perslid_verwijder IS NULL OR prs_perslid_upper != UPPER (c_oud_medewerker));
      COMMIT;
   END IF;

   -- Wis email- en oslogin-velden van medewerkers als p_incl_oslogins=TRUE
   -- behalve van de gebruikers in '_Admin'-groepen (alleen bij anonimisering
   -- tbv. Test-omgevingen)!
   v_errormsg := 'Fout anonimiseren p_incl_oslogins=TRUE';
   IF p_incl_oslogins
   THEN
      UPDATE prs_perslid p
         SET p.prs_perslid_email = NULL,
             p.prs_perslid_oslogin = NULL,
             p.prs_perslid_oslogin2 = NULL
       WHERE NOT EXISTS
                (SELECT 1
                   FROM fac_groep g, fac_gebruikersgroep gg
                  WHERE g.fac_groep_upper LIKE '_ADMIN%'
                        AND g.fac_groep_key = gg.fac_groep_key
                        AND gg.prs_perslid_key = p.prs_perslid_key);
      COMMIT;
   END IF;

   -- *** BEGIN:Wis specifieke andere zaken na afgesproken termijn of direct!
   -- In Productie na de afgesproken termijn en alleen bij anonimisering tbv.
   -- Test-omgevingen (als p_incl_nodelays=TRUE) per direct (en toekomstig)!
   IF p_incl_nodelays
   THEN
      v_datum := TO_DATE ('31122099', 'ddmmyyyy');
   ELSE
      v_datum := SYSDATE;
   END IF;

   v_errormsg := 'Fout anonimiseren BEZ/Afspraken';
   v_count_del := 0;
   FOR rec IN c_afspraak (v_datum)
   LOOP
      -- Delete alle kenmerkwaarden van bezoekers bij te verwijderen afspraken.
      DELETE FROM bez_kenmerkwaarde kw
            WHERE EXISTS
                     (SELECT 1
                        FROM bez_bezoekers
                       WHERE bez_bezoekers_key = kw.bez_bezoekers_key
                             AND bez_afspraak_key = rec.bez_afspraak_key);

      -- Delete alle bezoekers-tracking bij te verwijderen afspraken.
      DELETE FROM fac_tracking t
            WHERE t.fac_srtnotificatie_key IN (28, 29, 30, 31, 32) -- BEZBAD/BEZDON/BEZDO2/BEZOUT/BEZOU2
                  AND EXISTS
                        (SELECT 1
                           FROM bez_bezoekers
                          WHERE bez_bezoekers_key = t.fac_tracking_refkey
                                AND bez_afspraak_key = rec.bez_afspraak_key);

      -- Delete alle bezoekers bij te verwijderen afspraken.
      DELETE FROM bez_bezoekers
            WHERE bez_afspraak_key = rec.bez_afspraak_key;

      -- Delete alle afspraak-tracking bij te verwijderen afspraken.
      DELETE FROM fac_tracking
            WHERE fac_srtnotificatie_key IN (26, 27, 128) -- BEZMUT/BEZUPD/BEZMAI
                  AND fac_tracking_refkey = rec.bez_afspraak_key;

      -- Delete alle te verwijderen afspraken.
      DELETE FROM bez_afspraak
            WHERE bez_afspraak_key = rec.bez_afspraak_key;

      v_count_del := v_count_del + 1;
      --fac.trackaction ('#BEZUPD', rec.bez_afspraak_key, NULL, v_nu, v_txt_anoniem);
   END LOOP;

   fac.writelog ('DJIN_ANONIMISEER', 'S', 'Afspraken/#verwijderd: ' || TO_CHAR (v_count_del), '');
   COMMIT;

   -- Delete bezorgadressen van 'Aanvraag bloemen/boeketten'-meldingen 1 maand
   -- na leverdatum.
   v_errormsg := 'Fout anonimiseren MLD/Bezorgadressen';
   v_count_del := 0;
   FOR rec IN c_bezorgadres (v_datum)
   LOOP
      DELETE FROM mld_kenmerkmelding
            WHERE mld_kenmerkmelding_key = rec.mld_kenmerkmelding_key;
      v_count_del := v_count_del + 1;
      --fac.trackaction ('#MLDUPD', rec.mld_melding_key, NULL, v_nu, v_txt_anoniem);
   END LOOP;

   fac.writelog ('DJIN_ANONIMISEER', 'S', 'Bezorgadressen/#verwijderd: ' || TO_CHAR (v_count_del), '');
   COMMIT;

   -- Delete de kenmerkwaarden met keys 41=Kenteken en 42=Telefoonnummer van
   -- reserveringen 1 maand nadat de reservering is geweest.
   v_count_del := 0;
   v_errormsg := 'Fout anonimiseren RES/Parkeerkenmerken';
   FOR rec IN c_res_parking (v_datum)
   LOOP
      DELETE FROM res_kenmerkwaarde
            WHERE res_kenmerkwaarde_key = rec.res_kenmerkwaarde_key;
      v_count_del := v_count_del + 1;
      --fac.trackaction ('#RESUPD', rec.res_rsv_ruimte_key, NULL, v_nu, v_txt_anoniem);
   END LOOP;

   fac.writelog ('DJIN_ANONIMISEER', 'S', 'Parkeerkenmerken/#verwijderd: ' || TO_CHAR (v_count_del), '');
   COMMIT;
   -- *** EINDE:Wis specifieke andere zaken na afgesproken termijn of direct!
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.writelog ('DJIN_ANONIMISEER', 'E', 'Proces afgebroken!', v_errormsg);
END djin_anonimiseer;
/

-- Dummy export NACHTWERK!
CREATE OR REPLACE PROCEDURE djin_select_nachtwerk (p_applname   IN VARCHAR2,
                                                   p_applrun    IN VARCHAR2)
AS
   v_errormsg         VARCHAR2 (1000);
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
BEGIN
   -- Anonimiseer medewerkers, trackregels en specifieke andere zaken zoals
   -- het in Productie de bedoeling is (dus pas na afgesproken termijnen en
   -- geen aanvullende anonimisering tbv. Test-omgevingen).
   -- Vanuit djin.sql dus altijd alle parameters op FALSE (= geen extra's)!
   djin_anonimiseer (FALSE, FALSE, FALSE);
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.writelog (p_applname, 'E', 'Proces afgebroken!', v_errormsg);
END djin_select_nachtwerk;
/


/* Formatted on 31-5-2016 16:42:24 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW djin_v_rap_personen_groepen
(
   fclt_f_naam,
   email,
   fclt_f_login,
   fclt_f_laatste_login,
   fclt_f_afdeling,
   fclt_f_complex,
   fclt_f_gebouw,
   verdieping,
   ruimte,
   fclt_f_cluster,
   fclt_f_autorisatiegroep,
   aantal_rechten,
   fclt_f_alleen_fe,
   fclt_f_alt_login
)
AS
   SELECT x.prs_perslid_naam_full,
          x.prs_perslid_email,
          x.prs_perslid_oslogin,
          x.prs_perslid_login,
          x.prs_afdeling_naam6,
          pr.alg_locatie_code,
          pr.alg_gebouw_code,
          pr.alg_verdieping_code,
          pr.alg_ruimte_nr,
          cc.fac_usrdata_omschr,
          pgr.fac_groep_omschrijving,
          TO_CHAR (pgr.aantal),
          DECODE (pg.aantal, NULL, 'Ja', 'Nee') alleen_fe,
          DECODE (x.prs_perslid_oslogin2, NULL, 'Nee', 'Ja') alt_login
     FROM (SELECT p.prs_perslid_key,
                  p.prs_perslid_email,
                  pf.prs_perslid_naam_full,
                  p.prs_perslid_oslogin,
                  p.prs_perslid_login,
                  p.prs_perslid_oslogin2,
                  a.prs_afdeling_naam6
             FROM prs_perslid p, prs_v_perslid_fullnames_all pf, prs_v_afdeling_fullnames a
            WHERE p.prs_perslid_key = pf.prs_perslid_key
                  AND p.prs_afdeling_key = a.prs_afdeling_key) x
          LEFT JOIN (SELECT pw.prs_perslid_key,
                            wg.alg_locatie_key,
                            wg.alg_locatie_code,
                            wg.alg_gebouw_code,
                            wg.alg_verdieping_code,
                            wg.alg_ruimte_nr
                       FROM prs_perslidwerkplek pw, prs_v_werkplek_gegevens wg
                      WHERE pw.prs_werkplek_key = wg.prs_werkplek_key) pr -- PersoonRuimte
             ON x.prs_perslid_key = pr.prs_perslid_key
          LEFT JOIN (SELECT ok.alg_onrgoed_key, ud.fac_usrdata_omschr
                       FROM alg_v_aanwezigonrgoedkenmerk ok, fac_usrdata ud
                      WHERE ok.alg_onrgoed_niveau = 'L' -- Kenmerk van Complex
                            AND ok.alg_kenmerk_key = 1000           -- Cluster
                            AND ok.alg_onrgoedkenmerk_waarde = TO_CHAR (ud.fac_usrdata_key)) cc -- ComplexCluster
             ON pr.alg_locatie_key = cc.alg_onrgoed_key
          LEFT JOIN (  SELECT prs_perslid_key, COUNT ( * ) aantal
                         FROM fac_gebruikersgroep
                        WHERE fac_groep_key != 1                   -- _Default
                     GROUP BY prs_perslid_key) pg            -- PersoonGroepen
             ON x.prs_perslid_key = pg.prs_perslid_key
          LEFT JOIN (  SELECT gg.prs_perslid_key, g.fac_groep_omschrijving, COUNT ( * ) aantal
                         FROM fac_gebruikersgroep gg, fac_groep g, fac_groeprechten gr
                        WHERE gg.fac_groep_key != 1                -- _Default
                              AND gg.fac_groep_key = g.fac_groep_key
                              AND g.fac_groep_key = gr.fac_groep_key
                     GROUP BY gg.prs_perslid_key, g.fac_groep_omschrijving) pgr -- PersoonGroepRechten
             ON x.prs_perslid_key = pgr.prs_perslid_key;


-- DJIN#37160: KPI-rapportages (incl. exports via NACHTWERK-taak)
-- 90=PRSSYS
-- *** PER MAAND ***
/* Formatted on 30-8-2016 11:42:24 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW djin_v_rap_kpi_mld_std
(
   fclt_3d_locatie_key,
   fclt_f_maand,
   fclt_f_type,
   fclt_f_vakgroep,
   fclt_f_cluster,
   fclt_f_vestiging,
   fclt_f_complex,
   n_tot_mld_std_cx,
   n_ac_mld_std_cx,
   n_uv_mld_std_cx,
   ac_mld_std_nl,
   ac_mld_std_cl,
   ac_mld_std_vt,
   ac_mld_std_cx,
   uv_mld_std_nl,
   uv_mld_std_cl,
   uv_mld_std_vt,
   uv_mld_std_cx
)
AS
   WITH mldstdcx -- Per vakgroep/complex onder vakgroeptype=3+4 de STD-meldingen=normaal+laag op MLDAFM-tijd!
           AS (  SELECT l.alg_locatie_key,
                        TO_CHAR (t.fac_tracking_datum, 'yyyy-mm') maand,
                        sd.ins_srtdiscipline_prefix type,
                        md.ins_discipline_omschrijving vakgroep,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend') cl,
                        d.alg_district_omschrijving vt,
                        l.alg_locatie_omschrijving cx,
                        COUNT ( * ) totaal,
                        SUM (DECODE (
                                SIGN(m.mld_melding_acceptdatum_std - fac.gettrackingdate ('MLDACP', m.mld_melding_key)),
                                -1, 0,
                                1))
                           acoptijd,
                        SUM (DECODE (
                                SIGN(m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')),
                                -1, 0,
                                1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        mld_stdmelding sm,       -- Ook verwijderde meldingen,
                        mld_discipline md,       -- en verwijderde vakgroepen,
                        ins_srtdiscipline sd, -- en verwijderde vakgroeptypen,
                        alg_locatie l,             -- en verwijderde locaties,
                        alg_district d,          -- en verwijderde districten!
                        alg_v_aanwezigonrgoedkenmerk ok,
                        fac_usrdata ud
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > ADD_MONTHS (TRUNC (SYSDATE, 'mm'), -25)
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND m.mld_melding_spoed IN (3, 4)      -- Normaal/Laag
                        AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                        AND sm.mld_ins_discipline_key = md.ins_discipline_key
                        AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                        AND sd.ins_srtdiscipline_key IN (3, 4) -- Melding Facilitair/Aanvraag
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND l.alg_locatie_key = ok.alg_onrgoed_key(+)
                        AND ok.alg_onrgoed_niveau(+) = 'L'
                        AND ok.alg_kenmerk_key(+) = 1000            -- Cluster
                        AND ok.alg_onrgoedkenmerk_waarde = TO_CHAR (ud.fac_usrdata_key(+))
               GROUP BY l.alg_locatie_key,
                        TO_CHAR (t.fac_tracking_datum, 'yyyy-mm'),
                        sd.ins_srtdiscipline_prefix,
                        md.ins_discipline_omschrijving,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend'),
                        d.alg_district_omschrijving,
                        l.alg_locatie_omschrijving)
   SELECT cx.alg_locatie_key, nl.maand, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx, -- Per vakgroep per vakgroeptype!
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT maand, type, vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldstdcx
           GROUP BY maand, type, vakgroep) nl
          LEFT JOIN (  SELECT maand, type, vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldstdcx
                     GROUP BY maand, type, vakgroep, cl) cl
             ON nl.maand = cl.maand AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT maand, type, vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldstdcx
                     GROUP BY maand, type, vakgroep, cl, vt) vt
             ON cl.maand = vt.maand AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (SELECT alg_locatie_key, maand, type, vakgroep, cl, vt, cx, totaal, acoptijd, uvoptijd
                       FROM mldstdcx) cx
             ON vt.maand = cx.maand AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                              -- ALLE vakgroepen per vakgroeptype!
   SELECT cx.alg_locatie_key, nl.maand, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT maand, type, 'Totaal' vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldstdcx
           GROUP BY maand, type, 'Totaal') nl
          LEFT JOIN (  SELECT maand, type, 'Totaal' vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldstdcx
                     GROUP BY maand, type, 'Totaal', cl) cl
             ON nl.maand = cl.maand AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT maand, type, 'Totaal' vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldstdcx
                     GROUP BY maand, type, 'Totaal', cl, vt) vt
             ON cl.maand = vt.maand AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, maand, type, 'Totaal' vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldstdcx
                     GROUP BY alg_locatie_key, maand, type, 'Totaal', cl, vt, cx) cx
             ON vt.maand = cx.maand AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                         -- Per vakgroep over BEIDE vakgroeptypen!
   SELECT cx.alg_locatie_key, nl.maand, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT maand, 'Beide' type, vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldstdcx
           GROUP BY maand, 'Beide', vakgroep) nl
          LEFT JOIN (  SELECT maand, 'Beide' type, vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldstdcx
                     GROUP BY maand, 'Beide', vakgroep, cl) cl
             ON nl.maand = cl.maand AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT maand, 'Beide' type, vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldstdcx
                     GROUP BY maand, 'Beide', vakgroep, cl, vt) vt
             ON cl.maand = vt.maand AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, maand, 'Beide' type, vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldstdcx
                     GROUP BY alg_locatie_key, maand, 'Beide', vakgroep, cl, vt, cx) cx
             ON vt.maand = cx.maand AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                      -- ALLE vakgroepen over BEIDE vakgroeptypen!
   SELECT cx.alg_locatie_key, nl.maand, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT maand, 'Beide' type, 'Totaal' vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldstdcx
           GROUP BY maand, 'Beide', 'Totaal') nl
          LEFT JOIN (  SELECT maand, 'Beide' type, 'Totaal' vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldstdcx
                     GROUP BY maand, 'Beide', 'Totaal', cl) cl
             ON nl.maand = cl.maand AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT maand, 'Beide' type, 'Totaal' vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldstdcx
                     GROUP BY maand, 'Beide', 'Totaal', cl, vt) vt
             ON cl.maand = vt.maand AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, maand, 'Beide' type, 'Totaal' vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldstdcx
                     GROUP BY alg_locatie_key, maand, 'Beide', 'Totaal', cl, vt, cx) cx
             ON vt.maand = cx.maand AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt;

CREATE OR REPLACE VIEW djin_v_export_kpi_mld_std
(
   result,
   result_order
)
AS
   SELECT    '"maand"'
          || ';"type"'
          || ';"vakgroep"'
          || ';"cluster"'
          || ';"vestiging"'
          || ';"complex"'
          || ';"n_tot_mld_std_cx"'
          || ';"n_ac_mld_std_cx"'
          || ';"n_uv_mld_std_cx"'
          || ';"ac_mld_std_nl"'
          || ';"ac_mld_std_cl"'
          || ';"ac_mld_std_vt"'
          || ';"ac_mld_std_cx"'
          || ';"uv_mld_std_nl"'
          || ';"uv_mld_std_cl"'
          || ';"uv_mld_std_vt"'
          || ';"uv_mld_std_cx"',
          0
     FROM DUAL
   UNION ALL
   SELECT    '"'
          || fclt_f_maand
          || '";"'
          || fclt_f_type
          || '";"'
          || fclt_f_vakgroep
          || '";"'
          || fclt_f_cluster
          || '";"'
          || fclt_f_vestiging
          || '";"'
          || fclt_f_complex
          || '";"'
          || n_tot_mld_std_cx
          || '";"'
          || n_ac_mld_std_cx
          || '";"'
          || n_uv_mld_std_cx
          || '";"'
          || ac_mld_std_nl
          || '";"'
          || ac_mld_std_cl
          || '";"'
          || ac_mld_std_vt
          || '";"'
          || ac_mld_std_cx
          || '";"'
          || uv_mld_std_nl
          || '";"'
          || uv_mld_std_cl
          || '";"'
          || uv_mld_std_vt
          || '";"'
          || uv_mld_std_cx
          || '"',
          1
     FROM djin_v_rap_kpi_mld_std;

CREATE OR REPLACE VIEW djin_v_rap_kpi_mld_urg
(
   fclt_3d_locatie_key,
   fclt_f_maand,
   fclt_f_type,
   fclt_f_vakgroep,
   fclt_f_cluster,
   fclt_f_vestiging,
   fclt_f_complex,
   n_tot_mld_urg_cx,
   n_ac_mld_urg_cx,
   n_uv_mld_urg_cx,
   ac_mld_urg_nl,
   ac_mld_urg_cl,
   ac_mld_urg_vt,
   ac_mld_urg_cx,
   uv_mld_urg_nl,
   uv_mld_urg_cl,
   uv_mld_urg_vt,
   uv_mld_urg_cx
)
AS
   WITH mldurgcx -- Per vakgroep/complex onder vakgroeptype=3+4 de URG-meldingen=kritiek+hoog op MLDAFM-tijd!
           AS (  SELECT l.alg_locatie_key,
                        TO_CHAR (t.fac_tracking_datum, 'yyyy-mm') maand,
                        sd.ins_srtdiscipline_prefix type,
                        md.ins_discipline_omschrijving vakgroep,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend') cl,
                        d.alg_district_omschrijving vt,
                        l.alg_locatie_omschrijving cx,
                        COUNT ( * ) totaal,
                        SUM (DECODE (
                                SIGN(m.mld_melding_acceptdatum_std - fac.gettrackingdate ('MLDACP', m.mld_melding_key)),
                                -1, 0,
                                1))
                           acoptijd,
                        SUM (DECODE (
                                SIGN(m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')),
                                -1, 0,
                                1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        mld_stdmelding sm,       -- Ook verwijderde meldingen,
                        mld_discipline md,       -- en verwijderde vakgroepen,
                        ins_srtdiscipline sd, -- en verwijderde vakgroeptypen,
                        alg_locatie l,             -- en verwijderde locaties,
                        alg_district d,          -- en verwijderde districten!
                        alg_v_aanwezigonrgoedkenmerk ok,
                        fac_usrdata ud
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > ADD_MONTHS (TRUNC (SYSDATE, 'mm'), -25)
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND m.mld_melding_spoed IN (1, 2)     -- Kritisch/Hoog
                        AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                        AND sm.mld_ins_discipline_key = md.ins_discipline_key
                        AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                        AND sd.ins_srtdiscipline_key IN (3, 4) -- Melding Facilitair/Aanvraag
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND l.alg_locatie_key = ok.alg_onrgoed_key(+)
                        AND ok.alg_onrgoed_niveau(+) = 'L'
                        AND ok.alg_kenmerk_key(+) = 1000            -- Cluster
                        AND ok.alg_onrgoedkenmerk_waarde = TO_CHAR (ud.fac_usrdata_key(+))
               GROUP BY l.alg_locatie_key,
                        TO_CHAR (t.fac_tracking_datum, 'yyyy-mm'),
                        sd.ins_srtdiscipline_prefix,
                        md.ins_discipline_omschrijving,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend'),
                        d.alg_district_omschrijving,
                        l.alg_locatie_omschrijving)
   SELECT cx.alg_locatie_key, nl.maand, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx, -- Per vakgroep per vakgroeptype!
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT maand, type, vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldurgcx
           GROUP BY maand, type, vakgroep) nl
          LEFT JOIN (  SELECT maand, type, vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldurgcx
                     GROUP BY maand, type, vakgroep, cl) cl
             ON nl.maand = cl.maand AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT maand, type, vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldurgcx
                     GROUP BY maand, type, vakgroep, cl, vt) vt
             ON cl.maand = vt.maand AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (SELECT alg_locatie_key, maand, type, vakgroep, cl, vt, cx, totaal, acoptijd, uvoptijd
                       FROM mldurgcx) cx
             ON vt.maand = cx.maand AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                              -- ALLE vakgroepen per vakgroeptype!
   SELECT cx.alg_locatie_key, nl.maand, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT maand, type, 'Totaal' vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldurgcx
           GROUP BY maand, type, 'Totaal') nl
          LEFT JOIN (  SELECT maand, type, 'Totaal' vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldurgcx
                     GROUP BY maand, type, 'Totaal', cl) cl
             ON nl.maand = cl.maand AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT maand, type, 'Totaal' vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldurgcx
                     GROUP BY maand, type, 'Totaal', cl, vt) vt
             ON cl.maand = vt.maand AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, maand, type, 'Totaal' vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldurgcx
                     GROUP BY alg_locatie_key, maand, type, 'Totaal', cl, vt, cx) cx
             ON vt.maand = cx.maand AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                         -- Per vakgroep over BEIDE vakgroeptypen!
   SELECT cx.alg_locatie_key, nl.maand, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT maand, 'Beide' type, vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldurgcx
           GROUP BY maand, 'Beide', vakgroep) nl
          LEFT JOIN (  SELECT maand, 'Beide' type, vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldurgcx
                     GROUP BY maand, 'Beide', vakgroep, cl) cl
             ON nl.maand = cl.maand AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT maand, 'Beide' type, vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldurgcx
                     GROUP BY maand, 'Beide', vakgroep, cl, vt) vt
             ON cl.maand = vt.maand AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, maand, 'Beide' type, vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldurgcx
                     GROUP BY alg_locatie_key, maand, 'Beide', vakgroep, cl, vt, cx) cx
             ON vt.maand = cx.maand AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                      -- ALLE vakgroepen over BEIDE vakgroeptypen!
   SELECT cx.alg_locatie_key, nl.maand, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT maand, 'Beide' type, 'Totaal' vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldurgcx
           GROUP BY maand, 'Beide', 'Totaal') nl
          LEFT JOIN (  SELECT maand, 'Beide' type, 'Totaal' vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldurgcx
                     GROUP BY maand, 'Beide', 'Totaal', cl) cl
             ON nl.maand = cl.maand AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT maand, 'Beide' type, 'Totaal' vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldurgcx
                     GROUP BY maand, 'Beide', 'Totaal', cl, vt) vt
             ON cl.maand = vt.maand AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, maand, 'Beide' type, 'Totaal' vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldurgcx
                     GROUP BY alg_locatie_key, maand, 'Beide', 'Totaal', cl, vt, cx) cx
             ON vt.maand = cx.maand AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt;

CREATE OR REPLACE VIEW djin_v_export_kpi_mld_urg
(
   result,
   result_order
)
AS
   SELECT    '"maand"'
          || ';"type"'
          || ';"vakgroep"'
          || ';"cluster"'
          || ';"vestiging"'
          || ';"complex"'
          || ';"n_tot_mld_urg_cx"'
          || ';"n_ac_mld_urg_cx"'
          || ';"n_uv_mld_urg_cx"'
          || ';"ac_mld_urg_nl"'
          || ';"ac_mld_urg_cl"'
          || ';"ac_mld_urg_vt"'
          || ';"ac_mld_urg_cx"'
          || ';"uv_mld_urg_nl"'
          || ';"uv_mld_urg_cl"'
          || ';"uv_mld_urg_vt"'
          || ';"uv_mld_urg_cx"',
          0
     FROM DUAL
   UNION ALL
   SELECT    '"'
          || fclt_f_maand
          || '";"'
          || fclt_f_type
          || '";"'
          || fclt_f_vakgroep
          || '";"'
          || fclt_f_cluster
          || '";"'
          || fclt_f_vestiging
          || '";"'
          || fclt_f_complex
          || '";"'
          || n_tot_mld_urg_cx
          || '";"'
          || n_ac_mld_urg_cx
          || '";"'
          || n_uv_mld_urg_cx
          || '";"'
          || ac_mld_urg_nl
          || '";"'
          || ac_mld_urg_cl
          || '";"'
          || ac_mld_urg_vt
          || '";"'
          || ac_mld_urg_cx
          || '";"'
          || uv_mld_urg_nl
          || '";"'
          || uv_mld_urg_cl
          || '";"'
          || uv_mld_urg_vt
          || '";"'
          || uv_mld_urg_cx
          || '"',
          1
     FROM djin_v_rap_kpi_mld_urg;

CREATE OR REPLACE VIEW djin_v_rap_kpi_mld_vvg
(
   fclt_3d_locatie_key,
   fclt_f_maand,
   fclt_f_type,
   fclt_f_vakgroep,
   fclt_f_cluster,
   fclt_f_vestiging,
   fclt_f_complex,
   n_tot_mld_vvg_cx,
   n_ac_mld_vvg_cx,
   n_uv_mld_vvg_cx,
   ac_mld_vvg_nl,
   ac_mld_vvg_cl,
   ac_mld_vvg_vt,
   ac_mld_vvg_cx,
   uv_mld_vvg_nl,
   uv_mld_vvg_cl,
   uv_mld_vvg_vt,
   uv_mld_vvg_cx
)
AS
   WITH mldvvgcx -- Per vakgroep/complex onder vakgroeptype=3+4 de VVG-meldingen (elke spoed) op MLDAFM-tijd!
           AS (  SELECT l.alg_locatie_key,
                        TO_CHAR (t.fac_tracking_datum, 'yyyy-mm') maand,
                        sd.ins_srtdiscipline_prefix type,
                        md.ins_discipline_omschrijving vakgroep,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend') cl,
                        d.alg_district_omschrijving vt,
                        l.alg_locatie_omschrijving cx,
                        COUNT ( * ) totaal,
                        SUM (DECODE (
                                SIGN(m.mld_melding_acceptdatum_std - fac.gettrackingdate ('MLDACP', m.mld_melding_key)),
                                -1, 0,
                                1))
                           acoptijd,
                        SUM (DECODE (
                                SIGN(m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')),
                                -1, 0,
                                1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        mld_stdmelding sm,       -- Ook verwijderde meldingen,
                        mld_discipline md,       -- en verwijderde vakgroepen,
                        ins_srtdiscipline sd, -- en verwijderde vakgroeptypen,
                        alg_locatie l,             -- en verwijderde locaties,
                        alg_district d,          -- en verwijderde districten!
                        alg_v_aanwezigonrgoedkenmerk ok,
                        fac_usrdata ud
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > ADD_MONTHS (TRUNC (SYSDATE, 'mm'), -25)
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NOT NULL -- Vervolgmeldingen
                        AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                        AND sm.mld_ins_discipline_key = md.ins_discipline_key
                        AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                        AND sd.ins_srtdiscipline_key IN (3, 4) -- Melding Facilitair/Aanvraag
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND l.alg_locatie_key = ok.alg_onrgoed_key(+)
                        AND ok.alg_onrgoed_niveau(+) = 'L'
                        AND ok.alg_kenmerk_key(+) = 1000            -- Cluster
                        AND ok.alg_onrgoedkenmerk_waarde = TO_CHAR (ud.fac_usrdata_key(+))
               GROUP BY l.alg_locatie_key,
                        TO_CHAR (t.fac_tracking_datum, 'yyyy-mm'),
                        sd.ins_srtdiscipline_prefix,
                        md.ins_discipline_omschrijving,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend'),
                        d.alg_district_omschrijving,
                        l.alg_locatie_omschrijving)
   SELECT cx.alg_locatie_key, nl.maand, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx, -- Per vakgroep per vakgroeptype!
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT maand, type, vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldvvgcx
           GROUP BY maand, type, vakgroep) nl
          LEFT JOIN (  SELECT maand, type, vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldvvgcx
                     GROUP BY maand, type, vakgroep, cl) cl
             ON nl.maand = cl.maand AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT maand, type, vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldvvgcx
                     GROUP BY maand, type, vakgroep, cl, vt) vt
             ON cl.maand = vt.maand AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (SELECT alg_locatie_key, maand, type, vakgroep, cl, vt, cx, totaal, acoptijd, uvoptijd
                       FROM mldvvgcx) cx
             ON vt.maand = cx.maand AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                              -- ALLE vakgroepen per vakgroeptype!
   SELECT cx.alg_locatie_key, nl.maand, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT maand, type, 'Totaal' vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldvvgcx
           GROUP BY maand, type, 'Totaal') nl
          LEFT JOIN (  SELECT maand, type, 'Totaal' vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldvvgcx
                     GROUP BY maand, type, 'Totaal', cl) cl
             ON nl.maand = cl.maand AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT maand, type, 'Totaal' vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldvvgcx
                     GROUP BY maand, type, 'Totaal', cl, vt) vt
             ON cl.maand = vt.maand AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, maand, type, 'Totaal' vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldvvgcx
                     GROUP BY alg_locatie_key, maand, type, 'Totaal', cl, vt, cx) cx
             ON vt.maand = cx.maand AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                         -- Per vakgroep over BEIDE vakgroeptypen!
   SELECT cx.alg_locatie_key, nl.maand, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT maand, 'Beide' type, vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldvvgcx
           GROUP BY maand, 'Beide', vakgroep) nl
          LEFT JOIN (  SELECT maand, 'Beide' type, vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldvvgcx
                     GROUP BY maand, 'Beide', vakgroep, cl) cl
             ON nl.maand = cl.maand AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT maand, 'Beide' type, vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldvvgcx
                     GROUP BY maand, 'Beide', vakgroep, cl, vt) vt
             ON cl.maand = vt.maand AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, maand, 'Beide' type, vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldvvgcx
                     GROUP BY alg_locatie_key, maand, 'Beide', vakgroep, cl, vt, cx) cx
             ON vt.maand = cx.maand AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                      -- ALLE vakgroepen over BEIDE vakgroeptypen!
   SELECT cx.alg_locatie_key, nl.maand, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT maand, 'Beide' type, 'Totaal' vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldvvgcx
           GROUP BY maand, 'Beide', 'Totaal') nl
          LEFT JOIN (  SELECT maand, 'Beide' type, 'Totaal' vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldvvgcx
                     GROUP BY maand, 'Beide', 'Totaal', cl) cl
             ON nl.maand = cl.maand AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT maand, 'Beide' type, 'Totaal' vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldvvgcx
                     GROUP BY maand, 'Beide', 'Totaal', cl, vt) vt
             ON cl.maand = vt.maand AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, maand, 'Beide' type, 'Totaal' vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldvvgcx
                     GROUP BY alg_locatie_key, maand, 'Beide', 'Totaal', cl, vt, cx) cx
             ON vt.maand = cx.maand AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt;

CREATE OR REPLACE VIEW djin_v_export_kpi_mld_vvg
(
   result,
   result_order
)
AS
   SELECT    '"maand"'
          || ';"type"'
          || ';"vakgroep"'
          || ';"cluster"'
          || ';"vestiging"'
          || ';"complex"'
          || ';"n_tot_mld_vvg_cx"'
          || ';"n_ac_mld_vvg_cx"'
          || ';"n_uv_mld_vvg_cx"'
          || ';"ac_mld_vvg_nl"'
          || ';"ac_mld_vvg_cl"'
          || ';"ac_mld_vvg_vt"'
          || ';"ac_mld_vvg_cx"'
          || ';"uv_mld_vvg_nl"'
          || ';"uv_mld_vvg_cl"'
          || ';"uv_mld_vvg_vt"'
          || ';"uv_mld_vvg_cx"',
          0
     FROM DUAL
   UNION ALL
   SELECT    '"'
          || fclt_f_maand
          || '";"'
          || fclt_f_type
          || '";"'
          || fclt_f_vakgroep
          || '";"'
          || fclt_f_cluster
          || '";"'
          || fclt_f_vestiging
          || '";"'
          || fclt_f_complex
          || '";"'
          || n_tot_mld_vvg_cx
          || '";"'
          || n_ac_mld_vvg_cx
          || '";"'
          || n_uv_mld_vvg_cx
          || '";"'
          || ac_mld_vvg_nl
          || '";"'
          || ac_mld_vvg_cl
          || '";"'
          || ac_mld_vvg_vt
          || '";"'
          || ac_mld_vvg_cx
          || '";"'
          || uv_mld_vvg_nl
          || '";"'
          || uv_mld_vvg_cl
          || '";"'
          || uv_mld_vvg_vt
          || '";"'
          || uv_mld_vvg_cx
          || '"',
          1
     FROM djin_v_rap_kpi_mld_vvg;

CREATE OR REPLACE VIEW djin_v_rap_kpi_klr
(
   fclt_3d_locatie_key,
   fclt_f_maand,
   fclt_f_melding,
   fclt_f_cluster,
   fclt_f_vestiging,
   fclt_f_complex,
   n_tot_klr_cx,
   n_ac_klr_cx,
   n_uv_klr_cx,
   ac_klr_nl,
   ac_klr_cl,
   ac_klr_vt,
   ac_klr_cx,
   uv_klr_nl,
   uv_klr_cl,
   uv_klr_vt,
   uv_klr_cx
)
AS
   WITH mldklrcx -- Per melding/complex onder vakgroeptype=2 de KLR-meldingen (klantreacties) op MLDAFM-tijd!
           AS (  SELECT l.alg_locatie_key,
                        TO_CHAR (t.fac_tracking_datum, 'yyyy-mm') maand,
                        sm.mld_stdmelding_omschrijving melding,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend') cl,
                        d.alg_district_omschrijving vt,
                        l.alg_locatie_omschrijving cx,
                        COUNT ( * ) totaal,
                        SUM (DECODE (
                                SIGN(m.mld_melding_acceptdatum_std - fac.gettrackingdate ('MLDACP', m.mld_melding_key)),
                                -1, 0,
                                1))
                           acoptijd,
                        SUM (DECODE (
                                SIGN(m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')),
                                -1, 0,
                                1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        mld_stdmelding sm,       -- Ook verwijderde meldingen!
                        mld_discipline md,      -- Ook verwijderde vakgroepen!
                        alg_locatie l,            -- Ook verwijderde locaties!
                        alg_district d,         -- Ook verwijderde districten!
                        alg_v_aanwezigonrgoedkenmerk ok,
                        fac_usrdata ud
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > ADD_MONTHS (TRUNC (SYSDATE, 'mm'), -25)
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                        AND sm.mld_ins_discipline_key = md.ins_discipline_key
                        AND md.ins_srtdiscipline_key = 2       -- Klantreactie
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND l.alg_locatie_key = ok.alg_onrgoed_key(+)
                        AND ok.alg_onrgoed_niveau(+) = 'L'
                        AND ok.alg_kenmerk_key(+) = 1000            -- Cluster
                        AND ok.alg_onrgoedkenmerk_waarde = TO_CHAR (ud.fac_usrdata_key(+))
               GROUP BY l.alg_locatie_key,
                        TO_CHAR (t.fac_tracking_datum, 'yyyy-mm'),
                        sm.mld_stdmelding_omschrijving,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend'),
                        d.alg_district_omschrijving,
                        l.alg_locatie_omschrijving)
   SELECT cx.alg_locatie_key, nl.maand, nl.melding, cl.cl, vt.vt, cx.cx, -- Per KLR-vakgroep!
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT maand, melding, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldklrcx
           GROUP BY maand, melding) nl
          LEFT JOIN (  SELECT maand, melding, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldklrcx
                     GROUP BY maand, melding, cl) cl
             ON nl.maand = cl.maand AND nl.melding = cl.melding
          LEFT JOIN (  SELECT maand, melding, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldklrcx
                     GROUP BY maand, melding, cl, vt) vt
             ON cl.maand = vt.maand AND cl.melding = vt.melding AND cl.cl = vt.cl
          LEFT JOIN (SELECT alg_locatie_key, maand, melding, cl, vt, cx, totaal, acoptijd, uvoptijd
                       FROM mldklrcx) cx
             ON vt.maand = cx.maand AND vt.melding = cx.melding AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                                           -- ALLE KLR-vakgroepen!
   SELECT cx.alg_locatie_key, nl.maand, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT maand, 'Totaal' vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldklrcx
           GROUP BY maand, 'Totaal') nl
          LEFT JOIN (  SELECT maand, 'Totaal' vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldklrcx
                     GROUP BY maand, 'Totaal', cl) cl
             ON nl.maand = cl.maand AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT maand, 'Totaal' vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldklrcx
                     GROUP BY maand, 'Totaal', cl, vt) vt
             ON cl.maand = vt.maand AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, maand, 'Totaal' vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldklrcx
                     GROUP BY alg_locatie_key, maand, 'Totaal', cl, vt, cx) cx
             ON vt.maand = cx.maand AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt;

CREATE OR REPLACE VIEW djin_v_export_kpi_klr
(
   result,
   result_order
)
AS
   SELECT    '"maand"'
          || ';"melding"'
          || ';"cluster"'
          || ';"vestiging"'
          || ';"complex"'
          || ';"n_tot_klr_cx"'
          || ';"n_ac_klr_cx"'
          || ';"n_uv_klr_cx"'
          || ';"ac_klr_nl"'
          || ';"ac_klr_cl"'
          || ';"ac_klr_vt"'
          || ';"ac_klr_cx"'
          || ';"uv_klr_nl"'
          || ';"uv_klr_cl"'
          || ';"uv_klr_vt"'
          || ';"uv_klr_cx"',
          0
     FROM DUAL
   UNION ALL
   SELECT    '"'
          || fclt_f_maand
          || '";"'
          || fclt_f_melding
          || '";"'
          || fclt_f_cluster
          || '";"'
          || fclt_f_vestiging
          || '";"'
          || fclt_f_complex
          || '";"'
          || n_tot_klr_cx
          || '";"'
          || n_ac_klr_cx
          || '";"'
          || n_uv_klr_cx
          || '";"'
          || ac_klr_nl
          || '";"'
          || ac_klr_cl
          || '";"'
          || ac_klr_vt
          || '";"'
          || ac_klr_cx
          || '";"'
          || uv_klr_nl
          || '";"'
          || uv_klr_cl
          || '";"'
          || uv_klr_vt
          || '";"'
          || uv_klr_cx
          || '"',
          1
     FROM djin_v_rap_kpi_klr;

/* Formatted on 2-9-2016 10:50:10 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW djin_v_rap_kpi_res
(
   fclt_3d_locatie_key,
   fclt_f_maand,
   fclt_f_catalogus,
   fclt_f_cluster,
   fclt_f_vestiging,
   fclt_f_complex,
   res_ant_nl,
   res_ant_cl,
   res_ant_vt,
   res_ant_cx,
   res_bzg_nl,
   res_bzg_cl,
   res_bzg_vt,
   res_bzg_cx
)
AS
   WITH rescatcx -- Per catalogus/complex de reserveringen van ruimten en voorzieningen op tot-tijd!
           AS (  SELECT l.alg_locatie_key,
                        resbes.mnd,
                        COALESCE (rd.ins_discipline_omschrijving, 'Ruimtes') catalogus,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend') cl,
                        d.alg_district_omschrijving vt,
                        l.alg_locatie_omschrijving cx,
                        SUM (resbez.aant) aantal_reserveringen,
                        SUM (ROUND (resbes.uren, 2)) bes_uren,
                        SUM (ROUND (resbez.uren, 2)) bez_uren
                   FROM (SELECT DISTINCT TO_CHAR (p.mnd, 'yyyy-mm') mnd, -- DISTINCT igv. verwijderde res_alg_ruimte!
                                -1 res_discipline_key, -- Ruimte-catalogi niet per catalogus onderverdelen!
                                rr.res_ruimte_key resource_key,
                                rar.alg_ruimte_key,
                                fac.count_work_days (p.mnd - 1, ADD_MONTHS (p.mnd, 1) - 1)
                                * (LEAST (COALESCE (rr.res_ruimte_eindtijd, 17), 17)
                                   - GREATEST (COALESCE (rr.res_ruimte_begintijd, 8), 8))
                                   uren
                           FROM res_ruimte rr, res_alg_ruimte rar,
                                (SELECT ADD_MONTHS (TRUNC (SYSDATE, 'mm'), LEVEL - 26) mnd FROM DUAL CONNECT BY LEVEL <= 25) p
                          WHERE rr.res_ruimte_key = rar.res_ruimte_key
                                AND rar.res_alg_ruimte_aanmaak < ADD_MONTHS (p.mnd, 1)
                                AND (rar.res_alg_ruimte_verwijder IS NULL OR rar.res_alg_ruimte_verwijder >= p.mnd)
                         UNION ALL
                         SELECT TO_CHAR (p.mnd, 'yyyy-mm') mnd, -- DISTINCT per definitie!
                                rd.res_discipline_key,
                                rd.res_deel_key resource_key,
                                COALESCE (d.ins_alg_ruimte_key_org, d.ins_alg_ruimte_key) alg_ruimte_key,
                                fac.count_work_days (p.mnd - 1, ADD_MONTHS (p.mnd, 1) - 1) * 9 -- = 17-8
                                   uren
                           FROM res_deel rd, ins_deel d,
                                (SELECT ADD_MONTHS (TRUNC (SYSDATE, 'mm'), LEVEL - 26) mnd FROM DUAL CONNECT BY LEVEL <= 25) p
                          WHERE     rd.res_ins_deel_key = d.ins_deel_key
                                AND COALESCE (d.ins_alg_ruimte_type_org, d.ins_alg_ruimte_type) = 'R' -- Noodzakelijk?
                                AND rd.res_deel_aanmaak < ADD_MONTHS (p.mnd, 1)
                                AND (rd.res_deel_verwijder IS NULL OR rd.res_deel_verwijder >= p.mnd)) resbes,
                        (  SELECT TO_CHAR (rrr.res_rsv_ruimte_tot, 'yyyy-mm') mnd,
                                  -1 res_discipline_key, -- Ruimte-catalogi niet per catalogus onderverdelen!
                                  rr.res_ruimte_key resource_key,
                                  ra.alg_ruimte_key,
                                  COUNT ( * ) aant,
                                  SUM (LEAST ((rrr.res_rsv_ruimte_tot - TRUNC (rrr.res_rsv_ruimte_tot)) * 24, 17)
                                       - GREATEST ((rrr.res_rsv_ruimte_van - TRUNC (rrr.res_rsv_ruimte_van)) * 24, 8))
                                     uren
                             FROM res_rsv_ruimte rrr, res_ruimte_opstelling ro, res_ruimte rr, res_alg_ruimte ra
                            WHERE rrr.res_rsv_ruimte_verwijder IS NULL
                                  AND rrr.res_rsv_ruimte_dirtlevel = 0
                                  AND rrr.res_status_fo_key IN (1, 2) -- Optie/Definitief
                                  AND rrr.res_rsv_ruimte_tot BETWEEN ADD_MONTHS (TRUNC (SYSDATE, 'mm'), -25) AND TRUNC (SYSDATE, 'mm')
                                  AND TO_CHAR (rrr.res_rsv_ruimte_tot, 'd') BETWEEN '2' AND '6'
                                  AND NOT EXISTS (SELECT 1 FROM mld_vrije_dagen WHERE TRUNC (mld_vrije_dagen_datum) = TRUNC (rrr.res_rsv_ruimte_tot))
                                  --AND TO_CHAR (rrr.res_rsv_ruimte_van, 'hh24') < '17'
                                  --AND TO_CHAR (rrr.res_rsv_ruimte_tot, 'hh24') > '08'
                                  AND rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
                                  AND ro.res_ruimte_key = rr.res_ruimte_key
                                  AND rr.res_ruimte_key = ra.res_ruimte_key
                         GROUP BY TO_CHAR (rrr.res_rsv_ruimte_tot, 'yyyy-mm'),
                                  -1,
                                  rr.res_ruimte_key,
                                  ra.alg_ruimte_key
                         UNION ALL                 -- Eendaagse voorzieningen!
                           SELECT TO_CHAR (rrd.res_rsv_deel_tot, 'yyyy-mm') mnd,
                                  rd.res_discipline_key,
                                  rd.res_deel_key resource_key,
                                  COALESCE (d.ins_alg_ruimte_key_org, d.ins_alg_ruimte_key) alg_ruimte_key,
                                  COUNT ( * ) aant,
                                  SUM (LEAST ((rrd.res_rsv_deel_tot - TRUNC (rrd.res_rsv_deel_tot)) * 24, 17)
                                       - GREATEST ((rrd.res_rsv_deel_van - TRUNC (rrd.res_rsv_deel_van)) * 24, 8))
                                     uren
                             FROM res_rsv_deel rrd, res_rsv_ruimte rrr, res_deel rd, ins_deel d
                            WHERE rrd.res_rsv_deel_verwijder IS NULL
                                  AND rrd.res_rsv_deel_dirtlevel = 0
                                  AND TRUNC (rrd.res_rsv_deel_van) = TRUNC (rrd.res_rsv_deel_tot) -- Eendaags!
                                  AND rrd.res_rsv_deel_tot BETWEEN ADD_MONTHS (TRUNC (SYSDATE, 'mm'), -25) AND TRUNC (SYSDATE, 'mm')
                                  AND TO_CHAR (rrd.res_rsv_deel_tot, 'd') BETWEEN '2' AND '6'
                                  AND NOT EXISTS (SELECT 1 FROM mld_vrije_dagen WHERE TRUNC (mld_vrije_dagen_datum) = TRUNC (rrd.res_rsv_deel_tot))
                                  --AND TO_CHAR (rrd.res_rsv_deel_van, 'hh24') < '17'
                                  --AND TO_CHAR (rrd.res_rsv_deel_tot, 'hh24') > '08'
                                  --AND rrd.bez_bezoekers_key IS NULL -- Geen parkeerplaatsen!
                                  AND rrd.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key(+)
                                  AND rrr.res_status_fo_key(+) IN (1, 2) -- Optie/Definitief
                                  AND rrd.res_deel_key = rd.res_deel_key
                                  AND rd.res_ins_deel_key = d.ins_deel_key
                                  AND COALESCE (d.ins_alg_ruimte_type_org, d.ins_alg_ruimte_type) = 'R' -- Noodzakelijk?
                         GROUP BY TO_CHAR (rrd.res_rsv_deel_tot, 'yyyy-mm'),
                                  rd.res_discipline_key,
                                  rd.res_deel_key,
                                  COALESCE (d.ins_alg_ruimte_key_org, d.ins_alg_ruimte_key)
                         UNION ALL                -- Meerdaagse voorzieningen!
                           SELECT TO_CHAR (p.dag, 'yyyy-mm') mnd,
                                  rd.res_discipline_key,
                                  rd.res_deel_key resource_key,
                                  COALESCE (d.ins_alg_ruimte_key_org, d.ins_alg_ruimte_key) alg_ruimte_key,
                                  COUNT ( * ) aant,
                                  SUM (DECODE (p.dag,
                                               TRUNC (rrd.res_rsv_deel_van), 17 - GREATEST ((rrd.res_rsv_deel_van - TRUNC (rrd.res_rsv_deel_van)) * 24, 8),
                                               TRUNC (rrd.res_rsv_deel_tot), LEAST ((rrd.res_rsv_deel_tot - TRUNC (rrd.res_rsv_deel_tot)) * 24, 17) - 8,
                                               9))                   -- = 17-8
                                     uren
                             FROM res_rsv_deel rrd, res_rsv_ruimte rrr, res_deel rd, ins_deel d,
                                  (SELECT TRUNC (SYSDATE, 'mm') - LEVEL dag FROM DUAL CONNECT BY LEVEL <= TRUNC (SYSDATE, 'mm') - ADD_MONTHS (TRUNC (SYSDATE, 'mm'), -25)) p
                            WHERE rrd.res_rsv_deel_verwijder IS NULL
                                  AND rrd.res_rsv_deel_dirtlevel = 0
                                  AND TRUNC (rrd.res_rsv_deel_van) != TRUNC (rrd.res_rsv_deel_tot) -- Meerdaags!
                                  AND rrd.res_rsv_deel_tot BETWEEN ADD_MONTHS (TRUNC (SYSDATE, 'mm'), -25) AND TRUNC (SYSDATE, 'mm')
                                  --AND TO_CHAR (rrd.res_rsv_deel_van, 'hh24') < '17'
                                  --AND TO_CHAR (rrd.res_rsv_deel_tot, 'hh24') > '08'
                                  --AND rrd.bez_bezoekers_key IS NULL -- Geen parkeerplaatsen!
                                  AND rrd.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key(+)
                                  AND rrr.res_status_fo_key(+) IN (1, 2) -- Optie/Definitief
                                  AND rrd.res_deel_key = rd.res_deel_key
                                  AND rd.res_ins_deel_key = d.ins_deel_key
                                  AND COALESCE (d.ins_alg_ruimte_type_org, d.ins_alg_ruimte_type) = 'R' -- Noodzakelijk?
                                  AND p.dag BETWEEN TRUNC (rrd.res_rsv_deel_van) AND TRUNC (rrd.res_rsv_deel_tot)
                                  AND TO_CHAR (p.dag, 'd') BETWEEN '2' AND '6'
                                  AND NOT EXISTS (SELECT 1 FROM mld_vrije_dagen WHERE TRUNC (mld_vrije_dagen_datum) = TRUNC (p.dag))
                         GROUP BY TO_CHAR (p.dag, 'yyyy-mm'),
                                  rd.res_discipline_key,
                                  rd.res_deel_key,
                                  COALESCE (d.ins_alg_ruimte_key_org, d.ins_alg_ruimte_key)) resbez,
                        res_discipline rd,        -- Ook verwijderde catalogi!
                        alg_v_onrgoed_boom aob,    -- Ook verwijderde ruimten!
                        alg_locatie l,            -- Ook verwijderde locaties!
                        alg_district d,         -- Ook verwijderde districten!
                        alg_v_aanwezigonrgoedkenmerk ok,
                        fac_usrdata ud
                  WHERE resbes.mnd = resbez.mnd(+)
                        AND resbes.res_discipline_key = resbez.res_discipline_key(+)
                        AND resbes.resource_key = resbez.resource_key(+)
                        AND resbes.alg_ruimte_key = resbez.alg_ruimte_key(+)
                        AND resbes.res_discipline_key = rd.ins_discipline_key(+)
                        AND resbes.alg_ruimte_key = aob.alg_ruimte_key
                        AND aob.alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND l.alg_locatie_key = ok.alg_onrgoed_key(+)
                        AND ok.alg_onrgoed_niveau(+) = 'L'
                        AND ok.alg_kenmerk_key(+) = 1000            -- Cluster
                        AND ok.alg_onrgoedkenmerk_waarde = TO_CHAR (ud.fac_usrdata_key(+))
                        AND resbes.uren > 0 -- Soms 0 of zelfs negatief bij vreemde/gelijke begin- en eindtijden (van reserveerbare ruimte = res_ruimte)!
                        AND COALESCE (resbez.uren, 1) > 0 -- Soms 0 of zelfs negatief bij vreemde/gelijke begin- en eindtijden (van res_rsv_ruimte/deel)!
               GROUP BY l.alg_locatie_key,
                        resbes.mnd,
                        COALESCE (rd.ins_discipline_omschrijving, 'Ruimtes'),
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend'),
                        d.alg_district_omschrijving,
                        l.alg_locatie_omschrijving)
   SELECT cx.alg_locatie_key, nl.mnd, nl.catalogus, cl.cl, vt.vt, cx.cx,
          TO_CHAR (nl.ant_nl, '999990'),
          TO_CHAR (cl.ant_cl, '999990'),
          TO_CHAR (vt.ant_vt, '999990'),
          TO_CHAR (cx.ant_cx, '999990'),
          TO_CHAR (100 * nl.bzg_nl, '990') || '%',
          TO_CHAR (100 * cl.bzg_cl, '990') || '%',
          TO_CHAR (100 * vt.bzg_vt, '990') || '%',
          TO_CHAR (100 * cx.bzg_cx, '990') || '%'
     FROM (  SELECT mnd, catalogus, SUM (aantal_reserveringen) ant_nl, SUM (COALESCE (bez_uren, 0)) / SUM (bes_uren) bzg_nl
               FROM rescatcx
           GROUP BY mnd, catalogus) nl
          LEFT JOIN (  SELECT mnd, catalogus, cl, SUM (aantal_reserveringen) ant_cl, SUM (COALESCE (bez_uren, 0)) / SUM (bes_uren) bzg_cl
                         FROM rescatcx
                     GROUP BY mnd, catalogus, cl) cl
             ON nl.mnd = cl.mnd AND nl.catalogus = cl.catalogus
          LEFT JOIN (  SELECT mnd, catalogus, cl, vt, SUM (aantal_reserveringen) ant_vt, SUM (COALESCE (bez_uren, 0)) / SUM (bes_uren) bzg_vt
                         FROM rescatcx
                     GROUP BY mnd, catalogus, cl, vt) vt
             ON cl.mnd = vt.mnd AND cl.catalogus = vt.catalogus AND cl.cl = vt.cl
          LEFT JOIN (SELECT alg_locatie_key, mnd, catalogus, cl, vt, cx, aantal_reserveringen ant_cx, COALESCE (bez_uren, 0) / bes_uren bzg_cx
                       FROM rescatcx) cx
             ON vt.mnd = cx.mnd AND vt.catalogus = cx.catalogus AND vt.cl = cx.cl AND vt.vt = cx.vt;

/* Formatted on 5-9-2016 16:32:28 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW djin_v_export_kpi_res
(
   result,
   result_order
)
AS
   SELECT    '"maand"'
          || ';"catalogus"'
          || ';"cluster"'
          || ';"vestiging"'
          || ';"complex"'
          || ';"res_ant_nl"'
          || ';"res_ant_cl"'
          || ';"res_ant_vt"'
          || ';"res_ant_cx"'
          || ';"res_bzg_nl"'
          || ';"res_bzg_cl"'
          || ';"res_bzg_vt"'
          || ';"res_bzg_cx"',
          0
     FROM DUAL
   UNION ALL
   SELECT    '"'
          || fclt_f_maand
          || '";"'
          || fclt_f_catalogus
          || '";"'
          || fclt_f_cluster
          || '";"'
          || fclt_f_vestiging
          || '";"'
          || fclt_f_complex
          || '";"'
          || res_ant_nl
          || '";"'
          || res_ant_cl
          || '";"'
          || res_ant_vt
          || '";"'
          || res_ant_cx
          || '";"'
          || res_bzg_nl
          || '";"'
          || res_bzg_cl
          || '";"'
          || res_bzg_vt
          || '";"'
          || res_bzg_cx
          || '"',
          1
     FROM djin_v_rap_kpi_res;

CREATE OR REPLACE VIEW djin_v_rap_kpi_tot
(
   fclt_3d_locatie_key,
   fclt_f_maand,
   fclt_f_type,
   fclt_f_vakgroep,
   fclt_f_cluster,
   fclt_f_vestiging,
   fclt_f_complex,
   tot_mld,
   ac_mld,
   uv_mld,
   tot_ord
)
AS
   WITH mldtot -- Per vakgroep/complex alle meldingen (incl. onderliggende opdrachten) op MLDAFM-tijd!
           AS (  SELECT l.alg_locatie_key,
                        TO_CHAR (t.fac_tracking_datum, 'yyyy-mm') maand,
                        sd.ins_srtdiscipline_prefix type,
                        md.ins_discipline_omschrijving vakgroep,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend') cl,
                        d.alg_district_omschrijving vt,
                        l.alg_locatie_omschrijving cx,
                        COUNT ( * ) tot_mld,
                        SUM (DECODE (
                                SIGN(m.mld_melding_acceptdatum_std - fac.gettrackingdate ('MLDACP', m.mld_melding_key)),
                                -1, 0,
                                1))
                           acoptijd,
                        SUM (DECODE (
                                SIGN(m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')),
                                -1, 0,
                                1))
                           uvoptijd,
                        COUNT (o.mld_opdr_key) tot_ord
                   FROM fac_tracking t,
                        mld_melding m,
                        mld_opdr o,
                        mld_stdmelding sm,       -- Ook verwijderde meldingen,
                        mld_discipline md,       -- en verwijderde vakgroepen,
                        ins_srtdiscipline sd, -- en verwijderde vakgroeptypen,
                        alg_locatie l,             -- en verwijderde locaties,
                        alg_district d,          -- en verwijderde districten!
                        alg_v_aanwezigonrgoedkenmerk ok,
                        fac_usrdata ud
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > ADD_MONTHS (TRUNC (SYSDATE, 'mm'), -25)
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        AND m.mld_melding_key = o.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                        AND sm.mld_ins_discipline_key = md.ins_discipline_key
                        AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND l.alg_locatie_key = ok.alg_onrgoed_key(+)
                        AND ok.alg_onrgoed_niveau(+) = 'L'
                        AND ok.alg_kenmerk_key(+) = 1000            -- Cluster
                        AND ok.alg_onrgoedkenmerk_waarde = TO_CHAR (ud.fac_usrdata_key(+))
               GROUP BY l.alg_locatie_key,
                        TO_CHAR (t.fac_tracking_datum, 'yyyy-mm'),
                        sd.ins_srtdiscipline_prefix,
                        md.ins_discipline_omschrijving,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend'),
                        d.alg_district_omschrijving,
                        l.alg_locatie_omschrijving)
   SELECT alg_locatie_key, maand, type, vakgroep, cl, vt, cx, -- Per vakgroep per vakgroeptype!
          TO_CHAR (tot_mld), TO_CHAR (acoptijd), TO_CHAR (uvoptijd), TO_CHAR (tot_ord)
     FROM mldtot
   UNION ALL                       -- ALLE vakgroepen over ALLE vakgroeptypen!
     SELECT alg_locatie_key, maand, 'Alle' type, 'Totaal' vakgroep, cl, vt, cx,
            TO_CHAR (SUM (tot_mld)), TO_CHAR (SUM (acoptijd)), TO_CHAR (SUM (uvoptijd)), TO_CHAR (SUM (tot_ord))
       FROM mldtot
   GROUP BY alg_locatie_key, maand, 'Alle', 'Totaal', cl, vt, cx;

CREATE OR REPLACE VIEW djin_v_export_kpi_tot
(
   result,
   result_order
)
AS
   SELECT    '"maand"'
          || ';"type"'
          || ';"vakgroep"'
          || ';"cluster"'
          || ';"vestiging"'
          || ';"complex"'
          || ';"mld"'
          || ';"ac"'
          || ';"uv"'
          || ';"ord"',
          0
     FROM DUAL
   UNION ALL
   SELECT    '"'
          || fclt_f_maand
          || '";"'
          || fclt_f_type
          || '";"'
          || fclt_f_vakgroep
          || '";"'
          || fclt_f_cluster
          || '";"'
          || fclt_f_vestiging
          || '";"'
          || fclt_f_complex
          || '";"'
          || tot_mld
          || '";"'
          || ac_mld
          || '";"'
          || uv_mld
          || '";"'
          || tot_ord
          || '"',
          1
     FROM djin_v_rap_kpi_tot;

-- *** PER WEEK ***
/* Formatted on 30-8-2016 11:42:24 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW djin_v_rap_kpi_mld_std_pw
(
   fclt_3d_locatie_key,
   --fclt_f_maand,
   fclt_f_week,
   fclt_f_type,
   fclt_f_vakgroep,
   fclt_f_cluster,
   fclt_f_vestiging,
   fclt_f_complex,
   n_tot_mld_std_cx,
   n_ac_mld_std_cx,
   n_uv_mld_std_cx,
   ac_mld_std_nl,
   ac_mld_std_cl,
   ac_mld_std_vt,
   ac_mld_std_cx,
   uv_mld_std_nl,
   uv_mld_std_cl,
   uv_mld_std_vt,
   uv_mld_std_cx
)
AS
   WITH mldstdcx -- Per vakgroep/complex onder vakgroeptype=3+4 de STD-meldingen=normaal+laag op MLDAFM-tijd!
           AS (  SELECT l.alg_locatie_key,
                        --TO_CHAR (t.fac_tracking_datum, 'yyyy-mm') maand,
                        TO_CHAR (t.fac_tracking_datum, 'iyyy-iw') week,
                        sd.ins_srtdiscipline_prefix type,
                        md.ins_discipline_omschrijving vakgroep,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend') cl,
                        d.alg_district_omschrijving vt,
                        l.alg_locatie_omschrijving cx,
                        COUNT ( * ) totaal,
                        SUM (DECODE (
                                SIGN(m.mld_melding_acceptdatum_std - fac.gettrackingdate ('MLDACP', m.mld_melding_key)),
                                -1, 0,
                                1))
                           acoptijd,
                        SUM (DECODE (
                                SIGN(m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')),
                                -1, 0,
                                1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        mld_stdmelding sm,       -- Ook verwijderde meldingen,
                        mld_discipline md,       -- en verwijderde vakgroepen,
                        ins_srtdiscipline sd, -- en verwijderde vakgroeptypen,
                        alg_locatie l,             -- en verwijderde locaties,
                        alg_district d,          -- en verwijderde districten!
                        alg_v_aanwezigonrgoedkenmerk ok,
                        fac_usrdata ud
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        --AND t.fac_tracking_datum > ADD_MONTHS (TRUNC (SYSDATE, 'mm'), -25)
                        AND t.fac_tracking_datum > TRUNC (SYSDATE, 'iw') - 770 -- Afgelopen 110 weken
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND m.mld_melding_spoed IN (3, 4)      -- Normaal/Laag
                        AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                        AND sm.mld_ins_discipline_key = md.ins_discipline_key
                        AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                        AND sd.ins_srtdiscipline_key IN (3, 4) -- Melding Facilitair/Aanvraag
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND l.alg_locatie_key = ok.alg_onrgoed_key(+)
                        AND ok.alg_onrgoed_niveau(+) = 'L'
                        AND ok.alg_kenmerk_key(+) = 1000            -- Cluster
                        AND ok.alg_onrgoedkenmerk_waarde = TO_CHAR (ud.fac_usrdata_key(+))
               GROUP BY l.alg_locatie_key,
                        TO_CHAR (t.fac_tracking_datum, 'iyyy-iw'),
                        sd.ins_srtdiscipline_prefix,
                        md.ins_discipline_omschrijving,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend'),
                        d.alg_district_omschrijving,
                        l.alg_locatie_omschrijving)
   SELECT cx.alg_locatie_key, nl.week, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx, -- Per vakgroep per vakgroeptype!
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT week, type, vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldstdcx
           GROUP BY week, type, vakgroep) nl
          LEFT JOIN (  SELECT week, type, vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldstdcx
                     GROUP BY week, type, vakgroep, cl) cl
             ON nl.week = cl.week AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT week, type, vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldstdcx
                     GROUP BY week, type, vakgroep, cl, vt) vt
             ON cl.week = vt.week AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (SELECT alg_locatie_key, week, type, vakgroep, cl, vt, cx, totaal, acoptijd, uvoptijd
                       FROM mldstdcx) cx
             ON vt.week = cx.week AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                              -- ALLE vakgroepen per vakgroeptype!
   SELECT cx.alg_locatie_key, nl.week, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT week, type, 'Totaal' vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldstdcx
           GROUP BY week, type, 'Totaal') nl
          LEFT JOIN (  SELECT week, type, 'Totaal' vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldstdcx
                     GROUP BY week, type, 'Totaal', cl) cl
             ON nl.week = cl.week AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT week, type, 'Totaal' vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldstdcx
                     GROUP BY week, type, 'Totaal', cl, vt) vt
             ON cl.week = vt.week AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, week, type, 'Totaal' vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldstdcx
                     GROUP BY alg_locatie_key, week, type, 'Totaal', cl, vt, cx) cx
             ON vt.week = cx.week AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                         -- Per vakgroep over BEIDE vakgroeptypen!
   SELECT cx.alg_locatie_key, nl.week, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT week, 'Beide' type, vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldstdcx
           GROUP BY week, 'Beide', vakgroep) nl
          LEFT JOIN (  SELECT week, 'Beide' type, vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldstdcx
                     GROUP BY week, 'Beide', vakgroep, cl) cl
             ON nl.week = cl.week AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT week, 'Beide' type, vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldstdcx
                     GROUP BY week, 'Beide', vakgroep, cl, vt) vt
             ON cl.week = vt.week AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, week, 'Beide' type, vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldstdcx
                     GROUP BY alg_locatie_key, week, 'Beide', vakgroep, cl, vt, cx) cx
             ON vt.week = cx.week AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                      -- ALLE vakgroepen over BEIDE vakgroeptypen!
   SELECT cx.alg_locatie_key, nl.week, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT week, 'Beide' type, 'Totaal' vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldstdcx
           GROUP BY week, 'Beide', 'Totaal') nl
          LEFT JOIN (  SELECT week, 'Beide' type, 'Totaal' vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldstdcx
                     GROUP BY week, 'Beide', 'Totaal', cl) cl
             ON nl.week = cl.week AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT week, 'Beide' type, 'Totaal' vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldstdcx
                     GROUP BY week, 'Beide', 'Totaal', cl, vt) vt
             ON cl.week = vt.week AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, week, 'Beide' type, 'Totaal' vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldstdcx
                     GROUP BY alg_locatie_key, week, 'Beide', 'Totaal', cl, vt, cx) cx
             ON vt.week = cx.week AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt;

CREATE OR REPLACE VIEW djin_v_export_kpi_mld_std_pw
(
   result,
   result_order
)
AS
   SELECT    '"week"'
          || ';"type"'
          || ';"vakgroep"'
          || ';"cluster"'
          || ';"vestiging"'
          || ';"complex"'
          || ';"n_tot_mld_std_cx"'
          || ';"n_ac_mld_std_cx"'
          || ';"n_uv_mld_std_cx"'
          || ';"ac_mld_std_nl"'
          || ';"ac_mld_std_cl"'
          || ';"ac_mld_std_vt"'
          || ';"ac_mld_std_cx"'
          || ';"uv_mld_std_nl"'
          || ';"uv_mld_std_cl"'
          || ';"uv_mld_std_vt"'
          || ';"uv_mld_std_cx"',
          0
     FROM DUAL
   UNION ALL
   SELECT    '"'
          || fclt_f_week
          || '";"'
          || fclt_f_type
          || '";"'
          || fclt_f_vakgroep
          || '";"'
          || fclt_f_cluster
          || '";"'
          || fclt_f_vestiging
          || '";"'
          || fclt_f_complex
          || '";"'
          || n_tot_mld_std_cx
          || '";"'
          || n_ac_mld_std_cx
          || '";"'
          || n_uv_mld_std_cx
          || '";"'
          || ac_mld_std_nl
          || '";"'
          || ac_mld_std_cl
          || '";"'
          || ac_mld_std_vt
          || '";"'
          || ac_mld_std_cx
          || '";"'
          || uv_mld_std_nl
          || '";"'
          || uv_mld_std_cl
          || '";"'
          || uv_mld_std_vt
          || '";"'
          || uv_mld_std_cx
          || '"',
          1
     FROM djin_v_rap_kpi_mld_std_pw;

CREATE OR REPLACE VIEW djin_v_rap_kpi_mld_urg_pw
(
   fclt_3d_locatie_key,
   --fclt_f_maand,
   fclt_f_week,
   fclt_f_type,
   fclt_f_vakgroep,
   fclt_f_cluster,
   fclt_f_vestiging,
   fclt_f_complex,
   n_tot_mld_urg_cx,
   n_ac_mld_urg_cx,
   n_uv_mld_urg_cx,
   ac_mld_urg_nl,
   ac_mld_urg_cl,
   ac_mld_urg_vt,
   ac_mld_urg_cx,
   uv_mld_urg_nl,
   uv_mld_urg_cl,
   uv_mld_urg_vt,
   uv_mld_urg_cx
)
AS
   WITH mldurgcx -- Per vakgroep/complex onder vakgroeptype=3+4 de URG-meldingen=kritiek+hoog op MLDAFM-tijd!
           AS (  SELECT l.alg_locatie_key,
                        --TO_CHAR (t.fac_tracking_datum, 'yyyy-mm') maand,
                        TO_CHAR (t.fac_tracking_datum, 'iyyy-iw') week,
                        sd.ins_srtdiscipline_prefix type,
                        md.ins_discipline_omschrijving vakgroep,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend') cl,
                        d.alg_district_omschrijving vt,
                        l.alg_locatie_omschrijving cx,
                        COUNT ( * ) totaal,
                        SUM (DECODE (
                                SIGN(m.mld_melding_acceptdatum_std - fac.gettrackingdate ('MLDACP', m.mld_melding_key)),
                                -1, 0,
                                1))
                           acoptijd,
                        SUM (DECODE (
                                SIGN(m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')),
                                -1, 0,
                                1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        mld_stdmelding sm,       -- Ook verwijderde meldingen,
                        mld_discipline md,       -- en verwijderde vakgroepen,
                        ins_srtdiscipline sd, -- en verwijderde vakgroeptypen,
                        alg_locatie l,             -- en verwijderde locaties,
                        alg_district d,          -- en verwijderde districten!
                        alg_v_aanwezigonrgoedkenmerk ok,
                        fac_usrdata ud
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        --AND t.fac_tracking_datum > ADD_MONTHS (TRUNC (SYSDATE, 'mm'), -25)
                        AND t.fac_tracking_datum > TRUNC (SYSDATE, 'iw') - 770 -- Afgelopen 110 weken
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND m.mld_melding_spoed IN (1, 2)     -- Kritisch/Hoog
                        AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                        AND sm.mld_ins_discipline_key = md.ins_discipline_key
                        AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                        AND sd.ins_srtdiscipline_key IN (3, 4) -- Melding Facilitair/Aanvraag
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND l.alg_locatie_key = ok.alg_onrgoed_key(+)
                        AND ok.alg_onrgoed_niveau(+) = 'L'
                        AND ok.alg_kenmerk_key(+) = 1000            -- Cluster
                        AND ok.alg_onrgoedkenmerk_waarde = TO_CHAR (ud.fac_usrdata_key(+))
               GROUP BY l.alg_locatie_key,
                        TO_CHAR (t.fac_tracking_datum, 'iyyy-iw'),
                        sd.ins_srtdiscipline_prefix,
                        md.ins_discipline_omschrijving,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend'),
                        d.alg_district_omschrijving,
                        l.alg_locatie_omschrijving)
   SELECT cx.alg_locatie_key, nl.week, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx, -- Per vakgroep per vakgroeptype!
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT week, type, vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldurgcx
           GROUP BY week, type, vakgroep) nl
          LEFT JOIN (  SELECT week, type, vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldurgcx
                     GROUP BY week, type, vakgroep, cl) cl
             ON nl.week = cl.week AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT week, type, vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldurgcx
                     GROUP BY week, type, vakgroep, cl, vt) vt
             ON cl.week = vt.week AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (SELECT alg_locatie_key, week, type, vakgroep, cl, vt, cx, totaal, acoptijd, uvoptijd
                       FROM mldurgcx) cx
             ON vt.week = cx.week AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                              -- ALLE vakgroepen per vakgroeptype!
   SELECT cx.alg_locatie_key, nl.week, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT week, type, 'Totaal' vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldurgcx
           GROUP BY week, type, 'Totaal') nl
          LEFT JOIN (  SELECT week, type, 'Totaal' vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldurgcx
                     GROUP BY week, type, 'Totaal', cl) cl
             ON nl.week = cl.week AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT week, type, 'Totaal' vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldurgcx
                     GROUP BY week, type, 'Totaal', cl, vt) vt
             ON cl.week = vt.week AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, week, type, 'Totaal' vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldurgcx
                     GROUP BY alg_locatie_key, week, type, 'Totaal', cl, vt, cx) cx
             ON vt.week = cx.week AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                         -- Per vakgroep over BEIDE vakgroeptypen!
   SELECT cx.alg_locatie_key, nl.week, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT week, 'Beide' type, vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldurgcx
           GROUP BY week, 'Beide', vakgroep) nl
          LEFT JOIN (  SELECT week, 'Beide' type, vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldurgcx
                     GROUP BY week, 'Beide', vakgroep, cl) cl
             ON nl.week = cl.week AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT week, 'Beide' type, vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldurgcx
                     GROUP BY week, 'Beide', vakgroep, cl, vt) vt
             ON cl.week = vt.week AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, week, 'Beide' type, vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldurgcx
                     GROUP BY alg_locatie_key, week, 'Beide', vakgroep, cl, vt, cx) cx
             ON vt.week = cx.week AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                      -- ALLE vakgroepen over BEIDE vakgroeptypen!
   SELECT cx.alg_locatie_key, nl.week, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT week, 'Beide' type, 'Totaal' vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldurgcx
           GROUP BY week, 'Beide', 'Totaal') nl
          LEFT JOIN (  SELECT week, 'Beide' type, 'Totaal' vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldurgcx
                     GROUP BY week, 'Beide', 'Totaal', cl) cl
             ON nl.week = cl.week AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT week, 'Beide' type, 'Totaal' vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldurgcx
                     GROUP BY week, 'Beide', 'Totaal', cl, vt) vt
             ON cl.week = vt.week AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, week, 'Beide' type, 'Totaal' vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldurgcx
                     GROUP BY alg_locatie_key, week, 'Beide', 'Totaal', cl, vt, cx) cx
             ON vt.week = cx.week AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt;

CREATE OR REPLACE VIEW djin_v_export_kpi_mld_urg_pw
(
   result,
   result_order
)
AS
   SELECT    '"week"'
          || ';"type"'
          || ';"vakgroep"'
          || ';"cluster"'
          || ';"vestiging"'
          || ';"complex"'
          || ';"n_tot_mld_urg_cx"'
          || ';"n_ac_mld_urg_cx"'
          || ';"n_uv_mld_urg_cx"'
          || ';"ac_mld_urg_nl"'
          || ';"ac_mld_urg_cl"'
          || ';"ac_mld_urg_vt"'
          || ';"ac_mld_urg_cx"'
          || ';"uv_mld_urg_nl"'
          || ';"uv_mld_urg_cl"'
          || ';"uv_mld_urg_vt"'
          || ';"uv_mld_urg_cx"',
          0
     FROM DUAL
   UNION ALL
   SELECT    '"'
          || fclt_f_week
          || '";"'
          || fclt_f_type
          || '";"'
          || fclt_f_vakgroep
          || '";"'
          || fclt_f_cluster
          || '";"'
          || fclt_f_vestiging
          || '";"'
          || fclt_f_complex
          || '";"'
          || n_tot_mld_urg_cx
          || '";"'
          || n_ac_mld_urg_cx
          || '";"'
          || n_uv_mld_urg_cx
          || '";"'
          || ac_mld_urg_nl
          || '";"'
          || ac_mld_urg_cl
          || '";"'
          || ac_mld_urg_vt
          || '";"'
          || ac_mld_urg_cx
          || '";"'
          || uv_mld_urg_nl
          || '";"'
          || uv_mld_urg_cl
          || '";"'
          || uv_mld_urg_vt
          || '";"'
          || uv_mld_urg_cx
          || '"',
          1
     FROM djin_v_rap_kpi_mld_urg_pw;

CREATE OR REPLACE VIEW djin_v_rap_kpi_mld_vvg_pw
(
   fclt_3d_locatie_key,
   --fclt_f_maand,
   fclt_f_week,
   fclt_f_type,
   fclt_f_vakgroep,
   fclt_f_cluster,
   fclt_f_vestiging,
   fclt_f_complex,
   n_tot_mld_vvg_cx,
   n_ac_mld_vvg_cx,
   n_uv_mld_vvg_cx,
   ac_mld_vvg_nl,
   ac_mld_vvg_cl,
   ac_mld_vvg_vt,
   ac_mld_vvg_cx,
   uv_mld_vvg_nl,
   uv_mld_vvg_cl,
   uv_mld_vvg_vt,
   uv_mld_vvg_cx
)
AS
   WITH mldvvgcx -- Per vakgroep/complex onder vakgroeptype=3+4 de VVG-meldingen (elke spoed) op MLDAFM-tijd!
           AS (  SELECT l.alg_locatie_key,
                        --TO_CHAR (t.fac_tracking_datum, 'yyyy-mm') maand,
                        TO_CHAR (t.fac_tracking_datum, 'iyyy-iw') week,
                        sd.ins_srtdiscipline_prefix type,
                        md.ins_discipline_omschrijving vakgroep,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend') cl,
                        d.alg_district_omschrijving vt,
                        l.alg_locatie_omschrijving cx,
                        COUNT ( * ) totaal,
                        SUM (DECODE (
                                SIGN(m.mld_melding_acceptdatum_std - fac.gettrackingdate ('MLDACP', m.mld_melding_key)),
                                -1, 0,
                                1))
                           acoptijd,
                        SUM (DECODE (
                                SIGN(m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')),
                                -1, 0,
                                1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        mld_stdmelding sm,       -- Ook verwijderde meldingen,
                        mld_discipline md,       -- en verwijderde vakgroepen,
                        ins_srtdiscipline sd, -- en verwijderde vakgroeptypen,
                        alg_locatie l,             -- en verwijderde locaties,
                        alg_district d,          -- en verwijderde districten!
                        alg_v_aanwezigonrgoedkenmerk ok,
                        fac_usrdata ud
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        --AND t.fac_tracking_datum > ADD_MONTHS (TRUNC (SYSDATE, 'mm'), -25)
                        AND t.fac_tracking_datum > TRUNC (SYSDATE, 'iw') - 770 -- Afgelopen 110 weken
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NOT NULL -- Vervolgmeldingen
                        AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                        AND sm.mld_ins_discipline_key = md.ins_discipline_key
                        AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                        AND sd.ins_srtdiscipline_key IN (3, 4) -- Melding Facilitair/Aanvraag
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND l.alg_locatie_key = ok.alg_onrgoed_key(+)
                        AND ok.alg_onrgoed_niveau(+) = 'L'
                        AND ok.alg_kenmerk_key(+) = 1000            -- Cluster
                        AND ok.alg_onrgoedkenmerk_waarde = TO_CHAR (ud.fac_usrdata_key(+))
               GROUP BY l.alg_locatie_key,
                        TO_CHAR (t.fac_tracking_datum, 'iyyy-iw'),
                        sd.ins_srtdiscipline_prefix,
                        md.ins_discipline_omschrijving,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend'),
                        d.alg_district_omschrijving,
                        l.alg_locatie_omschrijving)
   SELECT cx.alg_locatie_key, nl.week, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx, -- Per vakgroep per vakgroeptype!
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT week, type, vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldvvgcx
           GROUP BY week, type, vakgroep) nl
          LEFT JOIN (  SELECT week, type, vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldvvgcx
                     GROUP BY week, type, vakgroep, cl) cl
             ON nl.week = cl.week AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT week, type, vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldvvgcx
                     GROUP BY week, type, vakgroep, cl, vt) vt
             ON cl.week = vt.week AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (SELECT alg_locatie_key, week, type, vakgroep, cl, vt, cx, totaal, acoptijd, uvoptijd
                       FROM mldvvgcx) cx
             ON vt.week = cx.week AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                              -- ALLE vakgroepen per vakgroeptype!
   SELECT cx.alg_locatie_key, nl.week, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT week, type, 'Totaal' vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldvvgcx
           GROUP BY week, type, 'Totaal') nl
          LEFT JOIN (  SELECT week, type, 'Totaal' vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldvvgcx
                     GROUP BY week, type, 'Totaal', cl) cl
             ON nl.week = cl.week AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT week, type, 'Totaal' vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldvvgcx
                     GROUP BY week, type, 'Totaal', cl, vt) vt
             ON cl.week = vt.week AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, week, type, 'Totaal' vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldvvgcx
                     GROUP BY alg_locatie_key, week, type, 'Totaal', cl, vt, cx) cx
             ON vt.week = cx.week AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                         -- Per vakgroep over BEIDE vakgroeptypen!
   SELECT cx.alg_locatie_key, nl.week, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT week, 'Beide' type, vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldvvgcx
           GROUP BY week, 'Beide', vakgroep) nl
          LEFT JOIN (  SELECT week, 'Beide' type, vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldvvgcx
                     GROUP BY week, 'Beide', vakgroep, cl) cl
             ON nl.week = cl.week AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT week, 'Beide' type, vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldvvgcx
                     GROUP BY week, 'Beide', vakgroep, cl, vt) vt
             ON cl.week = vt.week AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, week, 'Beide' type, vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldvvgcx
                     GROUP BY alg_locatie_key, week, 'Beide', vakgroep, cl, vt, cx) cx
             ON vt.week = cx.week AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                      -- ALLE vakgroepen over BEIDE vakgroeptypen!
   SELECT cx.alg_locatie_key, nl.week, nl.type, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT week, 'Beide' type, 'Totaal' vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldvvgcx
           GROUP BY week, 'Beide', 'Totaal') nl
          LEFT JOIN (  SELECT week, 'Beide' type, 'Totaal' vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldvvgcx
                     GROUP BY week, 'Beide', 'Totaal', cl) cl
             ON nl.week = cl.week AND nl.type = cl.type AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT week, 'Beide' type, 'Totaal' vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldvvgcx
                     GROUP BY week, 'Beide', 'Totaal', cl, vt) vt
             ON cl.week = vt.week AND cl.type = vt.type AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, week, 'Beide' type, 'Totaal' vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldvvgcx
                     GROUP BY alg_locatie_key, week, 'Beide', 'Totaal', cl, vt, cx) cx
             ON vt.week = cx.week AND vt.type = cx.type AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt;

CREATE OR REPLACE VIEW djin_v_export_kpi_mld_vvg_pw
(
   result,
   result_order
)
AS
   SELECT    '"week"'
          || ';"type"'
          || ';"vakgroep"'
          || ';"cluster"'
          || ';"vestiging"'
          || ';"complex"'
          || ';"n_tot_mld_vvg_cx"'
          || ';"n_ac_mld_vvg_cx"'
          || ';"n_uv_mld_vvg_cx"'
          || ';"ac_mld_vvg_nl"'
          || ';"ac_mld_vvg_cl"'
          || ';"ac_mld_vvg_vt"'
          || ';"ac_mld_vvg_cx"'
          || ';"uv_mld_vvg_nl"'
          || ';"uv_mld_vvg_cl"'
          || ';"uv_mld_vvg_vt"'
          || ';"uv_mld_vvg_cx"',
          0
     FROM DUAL
   UNION ALL
   SELECT    '"'
          || fclt_f_week
          || '";"'
          || fclt_f_type
          || '";"'
          || fclt_f_vakgroep
          || '";"'
          || fclt_f_cluster
          || '";"'
          || fclt_f_vestiging
          || '";"'
          || fclt_f_complex
          || '";"'
          || n_tot_mld_vvg_cx
          || '";"'
          || n_ac_mld_vvg_cx
          || '";"'
          || n_uv_mld_vvg_cx
          || '";"'
          || ac_mld_vvg_nl
          || '";"'
          || ac_mld_vvg_cl
          || '";"'
          || ac_mld_vvg_vt
          || '";"'
          || ac_mld_vvg_cx
          || '";"'
          || uv_mld_vvg_nl
          || '";"'
          || uv_mld_vvg_cl
          || '";"'
          || uv_mld_vvg_vt
          || '";"'
          || uv_mld_vvg_cx
          || '"',
          1
     FROM djin_v_rap_kpi_mld_vvg_pw;

CREATE OR REPLACE VIEW djin_v_rap_kpi_klr_pw
(
   fclt_3d_locatie_key,
   --fclt_f_maand,
   fclt_f_week,
   fclt_f_melding,
   fclt_f_cluster,
   fclt_f_vestiging,
   fclt_f_complex,
   n_tot_klr_cx,
   n_ac_klr_cx,
   n_uv_klr_cx,
   ac_klr_nl,
   ac_klr_cl,
   ac_klr_vt,
   ac_klr_cx,
   uv_klr_nl,
   uv_klr_cl,
   uv_klr_vt,
   uv_klr_cx
)
AS
   WITH mldklrcx -- Per melding/complex onder vakgroeptype=2 de KLR-meldingen (klantreacties) op MLDAFM-tijd!
           AS (  SELECT l.alg_locatie_key,
                        --TO_CHAR (t.fac_tracking_datum, 'yyyy-mm') maand,
                        TO_CHAR (t.fac_tracking_datum, 'iyyy-iw') week,
                        sm.mld_stdmelding_omschrijving melding,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend') cl,
                        d.alg_district_omschrijving vt,
                        l.alg_locatie_omschrijving cx,
                        COUNT ( * ) totaal,
                        SUM (DECODE (
                                SIGN(m.mld_melding_acceptdatum_std - fac.gettrackingdate ('MLDACP', m.mld_melding_key)),
                                -1, 0,
                                1))
                           acoptijd,
                        SUM (DECODE (
                                SIGN(m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')),
                                -1, 0,
                                1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        mld_stdmelding sm,       -- Ook verwijderde meldingen!
                        mld_discipline md,      -- Ook verwijderde vakgroepen!
                        alg_locatie l,            -- Ook verwijderde locaties!
                        alg_district d,         -- Ook verwijderde districten!
                        alg_v_aanwezigonrgoedkenmerk ok,
                        fac_usrdata ud
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        --AND t.fac_tracking_datum > ADD_MONTHS (TRUNC (SYSDATE, 'mm'), -25)
                        AND t.fac_tracking_datum > TRUNC (SYSDATE, 'iw') - 770 -- Afgelopen 110 weken
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                        AND sm.mld_ins_discipline_key = md.ins_discipline_key
                        AND md.ins_srtdiscipline_key = 2       -- Klantreactie
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND l.alg_locatie_key = ok.alg_onrgoed_key(+)
                        AND ok.alg_onrgoed_niveau(+) = 'L'
                        AND ok.alg_kenmerk_key(+) = 1000            -- Cluster
                        AND ok.alg_onrgoedkenmerk_waarde = TO_CHAR (ud.fac_usrdata_key(+))
               GROUP BY l.alg_locatie_key,
                        TO_CHAR (t.fac_tracking_datum, 'iyyy-iw'),
                        sm.mld_stdmelding_omschrijving,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend'),
                        d.alg_district_omschrijving,
                        l.alg_locatie_omschrijving)
   SELECT cx.alg_locatie_key, nl.week, nl.melding, cl.cl, vt.vt, cx.cx, -- Per KLR-vakgroep!
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT week, melding, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldklrcx
           GROUP BY week, melding) nl
          LEFT JOIN (  SELECT week, melding, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldklrcx
                     GROUP BY week, melding, cl) cl
             ON nl.week = cl.week AND nl.melding = cl.melding
          LEFT JOIN (  SELECT week, melding, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldklrcx
                     GROUP BY week, melding, cl, vt) vt
             ON cl.week = vt.week AND cl.melding = vt.melding AND cl.cl = vt.cl
          LEFT JOIN (SELECT alg_locatie_key, week, melding, cl, vt, cx, totaal, acoptijd, uvoptijd
                       FROM mldklrcx) cx
             ON vt.week = cx.week AND vt.melding = cx.melding AND vt.cl = cx.cl AND vt.vt = cx.vt
   UNION ALL                                           -- ALLE KLR-vakgroepen!
   SELECT cx.alg_locatie_key, nl.week, nl.vakgroep, cl.cl, vt.vt, cx.cx,
          TO_CHAR (cx.totaal), TO_CHAR (cx.acoptijd), TO_CHAR (cx.uvoptijd),
          TO_CHAR (100 * nl.ac_nl, '990') || '%',
          TO_CHAR (100 * cl.ac_cl, '990') || '%',
          TO_CHAR (100 * vt.ac_vt, '990') || '%',
          TO_CHAR (100 * (cx.acoptijd / cx.totaal), '990') || '%',
          TO_CHAR (100 * nl.uv_nl, '990') || '%',
          TO_CHAR (100 * cl.uv_cl, '990') || '%',
          TO_CHAR (100 * vt.uv_vt, '990') || '%',
          TO_CHAR (100 * (cx.uvoptijd / cx.totaal), '990') || '%'
     FROM (  SELECT week, 'Totaal' vakgroep, SUM (acoptijd) / SUM (totaal) ac_nl, SUM (uvoptijd) / SUM (totaal) uv_nl
               FROM mldklrcx
           GROUP BY week, 'Totaal') nl
          LEFT JOIN (  SELECT week, 'Totaal' vakgroep, cl, SUM (acoptijd) / SUM (totaal) ac_cl, SUM (uvoptijd) / SUM (totaal) uv_cl
                         FROM mldklrcx
                     GROUP BY week, 'Totaal', cl) cl
             ON nl.week = cl.week AND nl.vakgroep = cl.vakgroep
          LEFT JOIN (  SELECT week, 'Totaal' vakgroep, cl, vt, SUM (acoptijd) / SUM (totaal) ac_vt, SUM (uvoptijd) / SUM (totaal) uv_vt
                         FROM mldklrcx
                     GROUP BY week, 'Totaal', cl, vt) vt
             ON cl.week = vt.week AND cl.vakgroep = vt.vakgroep AND cl.cl = vt.cl
          LEFT JOIN (  SELECT alg_locatie_key, week, 'Totaal' vakgroep, cl, vt, cx, SUM (totaal) totaal, SUM (acoptijd) acoptijd, SUM (uvoptijd) uvoptijd
                         FROM mldklrcx
                     GROUP BY alg_locatie_key, week, 'Totaal', cl, vt, cx) cx
             ON vt.week = cx.week AND vt.vakgroep = cx.vakgroep AND vt.cl = cx.cl AND vt.vt = cx.vt;

CREATE OR REPLACE VIEW djin_v_export_kpi_klr_pw
(
   result,
   result_order
)
AS
   SELECT    '"week"'
          || ';"melding"'
          || ';"cluster"'
          || ';"vestiging"'
          || ';"complex"'
          || ';"n_tot_klr_cx"'
          || ';"n_ac_klr_cx"'
          || ';"n_uv_klr_cx"'
          || ';"ac_klr_nl"'
          || ';"ac_klr_cl"'
          || ';"ac_klr_vt"'
          || ';"ac_klr_cx"'
          || ';"uv_klr_nl"'
          || ';"uv_klr_cl"'
          || ';"uv_klr_vt"'
          || ';"uv_klr_cx"',
          0
     FROM DUAL
   UNION ALL
   SELECT    '"'
          || fclt_f_week
          || '";"'
          || fclt_f_melding
          || '";"'
          || fclt_f_cluster
          || '";"'
          || fclt_f_vestiging
          || '";"'
          || fclt_f_complex
          || '";"'
          || n_tot_klr_cx
          || '";"'
          || n_ac_klr_cx
          || '";"'
          || n_uv_klr_cx
          || '";"'
          || ac_klr_nl
          || '";"'
          || ac_klr_cl
          || '";"'
          || ac_klr_vt
          || '";"'
          || ac_klr_cx
          || '";"'
          || uv_klr_nl
          || '";"'
          || uv_klr_cl
          || '";"'
          || uv_klr_vt
          || '";"'
          || uv_klr_cx
          || '"',
          1
     FROM djin_v_rap_kpi_klr_pw;

/* Formatted on 2-9-2016 10:50:10 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW djin_v_rap_kpi_res_pw
(
   fclt_3d_locatie_key,
   fclt_f_week,
   fclt_f_catalogus,
   fclt_f_cluster,
   fclt_f_vestiging,
   fclt_f_complex,
   res_ant_nl,
   res_ant_cl,
   res_ant_vt,
   res_ant_cx,
   res_bzg_nl,
   res_bzg_cl,
   res_bzg_vt,
   res_bzg_cx
)
AS
   WITH rescatcx -- Per catalogus/complex de reserveringen van ruimten en voorzieningen op tot-tijd!
           AS (  SELECT l.alg_locatie_key,
                        resbes.wk,
                        COALESCE (rd.ins_discipline_omschrijving, 'Ruimtes') catalogus,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend') cl,
                        d.alg_district_omschrijving vt,
                        l.alg_locatie_omschrijving cx,
                        SUM (resbez.aant) aantal_reserveringen,
                        SUM (ROUND (resbes.uren, 2)) bes_uren,
                        SUM (ROUND (resbez.uren, 2)) bez_uren
                   FROM (SELECT DISTINCT TO_CHAR (p.wk, 'iyyy-iw') wk, -- DISTINCT igv. verwijderde res_alg_ruimte!
                                -1 res_discipline_key, -- Ruimte-catalogi niet per catalogus onderverdelen!
                                rr.res_ruimte_key resource_key,
                                rar.alg_ruimte_key,
                                fac.count_work_days (p.wk - 1, p.wk + 5)
                                * (LEAST (COALESCE (rr.res_ruimte_eindtijd, 17), 17)
                                   - GREATEST (COALESCE (rr.res_ruimte_begintijd, 8), 8))
                                   uren
                           FROM res_ruimte rr, res_alg_ruimte rar,
                                (SELECT TRUNC (SYSDATE, 'iw') - (LEVEL * 7) wk FROM DUAL CONNECT BY LEVEL <= 110) p
                          WHERE rr.res_ruimte_key = rar.res_ruimte_key
                                AND rar.res_alg_ruimte_aanmaak < p.wk + 7
                                AND (rar.res_alg_ruimte_verwijder IS NULL OR rar.res_alg_ruimte_verwijder >= p.wk)
                         UNION ALL
                         SELECT TO_CHAR (p.wk, 'iyyy-iw') wk, -- DISTINCT per definitie!
                                rd.res_discipline_key,
                                rd.res_deel_key resource_key,
                                COALESCE (d.ins_alg_ruimte_key_org, d.ins_alg_ruimte_key) alg_ruimte_key,
                                fac.count_work_days (p.wk - 1, p.wk + 5) * 9 -- = 17-8
                                   uren
                           FROM res_deel rd, ins_deel d,
                                (SELECT TRUNC (SYSDATE, 'iw') - (LEVEL * 7) wk FROM DUAL CONNECT BY LEVEL <= 110) p
                          WHERE     rd.res_ins_deel_key = d.ins_deel_key
                                AND COALESCE (d.ins_alg_ruimte_type_org, d.ins_alg_ruimte_type) = 'R' -- Noodzakelijk?
                                AND rd.res_deel_aanmaak < p.wk + 7
                                AND (rd.res_deel_verwijder IS NULL OR rd.res_deel_verwijder >= p.wk)) resbes,
                        (  SELECT TO_CHAR (rrr.res_rsv_ruimte_tot, 'iyyy-iw') wk,
                                  -1 res_discipline_key, -- Ruimte-catalogi niet per catalogus onderverdelen!
                                  rr.res_ruimte_key resource_key,
                                  ra.alg_ruimte_key,
                                  COUNT ( * ) aant,
                                  SUM (LEAST ((rrr.res_rsv_ruimte_tot - TRUNC (rrr.res_rsv_ruimte_tot)) * 24, 17)
                                       - GREATEST ((rrr.res_rsv_ruimte_van - TRUNC (rrr.res_rsv_ruimte_van)) * 24, 8))
                                     uren
                             FROM res_rsv_ruimte rrr, res_ruimte_opstelling ro, res_ruimte rr, res_alg_ruimte ra
                            WHERE rrr.res_rsv_ruimte_verwijder IS NULL
                                  AND rrr.res_rsv_ruimte_dirtlevel = 0
                                  AND rrr.res_status_fo_key IN (1, 2) -- Optie/Definitief
                                  AND rrr.res_rsv_ruimte_tot BETWEEN TRUNC (SYSDATE, 'iw') - 770 AND TRUNC (SYSDATE, 'iw')
                                  AND TO_CHAR (rrr.res_rsv_ruimte_tot, 'd') BETWEEN '2' AND '6'
                                  AND NOT EXISTS (SELECT 1 FROM mld_vrije_dagen WHERE TRUNC (mld_vrije_dagen_datum) = TRUNC (rrr.res_rsv_ruimte_tot))
                                  --AND TO_CHAR (rrr.res_rsv_ruimte_van, 'hh24') < '17'
                                  --AND TO_CHAR (rrr.res_rsv_ruimte_tot, 'hh24') > '08'
                                  AND rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
                                  AND ro.res_ruimte_key = rr.res_ruimte_key
                                  AND rr.res_ruimte_key = ra.res_ruimte_key
                         GROUP BY TO_CHAR (rrr.res_rsv_ruimte_tot, 'iyyy-iw'),
                                  -1,
                                  rr.res_ruimte_key,
                                  ra.alg_ruimte_key
                         UNION ALL                 -- Eendaagse voorzieningen!
                           SELECT TO_CHAR (rrd.res_rsv_deel_tot, 'iyyy-iw') wk,
                                  rd.res_discipline_key,
                                  rd.res_deel_key resource_key,
                                  COALESCE (d.ins_alg_ruimte_key_org, d.ins_alg_ruimte_key) alg_ruimte_key,
                                  COUNT ( * ) aant,
                                  SUM (LEAST ((rrd.res_rsv_deel_tot - TRUNC (rrd.res_rsv_deel_tot)) * 24, 17)
                                       - GREATEST ((rrd.res_rsv_deel_van - TRUNC (rrd.res_rsv_deel_van)) * 24, 8))
                                     uren
                             FROM res_rsv_deel rrd, res_rsv_ruimte rrr, res_deel rd, ins_deel d
                            WHERE rrd.res_rsv_deel_verwijder IS NULL
                                  AND rrd.res_rsv_deel_dirtlevel = 0
                                  AND TRUNC (rrd.res_rsv_deel_van) = TRUNC (rrd.res_rsv_deel_tot) -- Eendaags!
                                  AND rrd.res_rsv_deel_tot BETWEEN TRUNC (SYSDATE, 'iw') - 770 AND TRUNC (SYSDATE, 'iw')
                                  AND TO_CHAR (rrd.res_rsv_deel_tot, 'd') BETWEEN '2' AND '6'
                                  AND NOT EXISTS (SELECT 1 FROM mld_vrije_dagen WHERE TRUNC (mld_vrije_dagen_datum) = TRUNC (rrd.res_rsv_deel_tot))
                                  --AND TO_CHAR (rrd.res_rsv_deel_van, 'hh24') < '17'
                                  --AND TO_CHAR (rrd.res_rsv_deel_tot, 'hh24') > '08'
                                  --AND rrd.bez_bezoekers_key IS NULL -- Geen parkeerplaatsen!
                                  AND rrd.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key(+)
                                  AND rrr.res_status_fo_key(+) IN (1, 2) -- Optie/Definitief
                                  AND rrd.res_deel_key = rd.res_deel_key
                                  AND rd.res_ins_deel_key = d.ins_deel_key
                                  AND COALESCE (d.ins_alg_ruimte_type_org, d.ins_alg_ruimte_type) = 'R' -- Noodzakelijk?
                         GROUP BY TO_CHAR (rrd.res_rsv_deel_tot, 'iyyy-iw'),
                                  rd.res_discipline_key,
                                  rd.res_deel_key,
                                  COALESCE (d.ins_alg_ruimte_key_org, d.ins_alg_ruimte_key)
                         UNION ALL                -- Meerdaagse voorzieningen!
                           SELECT TO_CHAR (p.dag, 'iyyy-iw') wk,
                                  rd.res_discipline_key,
                                  rd.res_deel_key resource_key,
                                  COALESCE (d.ins_alg_ruimte_key_org, d.ins_alg_ruimte_key) alg_ruimte_key,
                                  COUNT ( * ) aant,
                                  SUM (DECODE (p.dag,
                                               TRUNC (rrd.res_rsv_deel_van), 17 - GREATEST ((rrd.res_rsv_deel_van - TRUNC (rrd.res_rsv_deel_van)) * 24, 8),
                                               TRUNC (rrd.res_rsv_deel_tot), LEAST ((rrd.res_rsv_deel_tot - TRUNC (rrd.res_rsv_deel_tot)) * 24, 17) - 8,
                                               9))                   -- = 17-8
                                     uren
                             FROM res_rsv_deel rrd, res_rsv_ruimte rrr, res_deel rd, ins_deel d,
                                  (SELECT TRUNC (SYSDATE, 'iw') - LEVEL dag FROM DUAL CONNECT BY LEVEL <= 770) p
                            WHERE rrd.res_rsv_deel_verwijder IS NULL
                                  AND rrd.res_rsv_deel_dirtlevel = 0
                                  AND TRUNC (rrd.res_rsv_deel_van) != TRUNC (rrd.res_rsv_deel_tot) -- Meerdaags!
                                  AND rrd.res_rsv_deel_tot BETWEEN TRUNC (SYSDATE, 'iw') - 770 AND TRUNC (SYSDATE, 'iw')
                                  --AND TO_CHAR (rrd.res_rsv_deel_van, 'hh24') < '17'
                                  --AND TO_CHAR (rrd.res_rsv_deel_tot, 'hh24') > '08'
                                  --AND rrd.bez_bezoekers_key IS NULL -- Geen parkeerplaatsen!
                                  AND rrd.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key(+)
                                  AND rrr.res_status_fo_key(+) IN (1, 2) -- Optie/Definitief
                                  AND rrd.res_deel_key = rd.res_deel_key
                                  AND rd.res_ins_deel_key = d.ins_deel_key
                                  AND COALESCE (d.ins_alg_ruimte_type_org, d.ins_alg_ruimte_type) = 'R' -- Noodzakelijk?
                                  AND p.dag BETWEEN TRUNC (rrd.res_rsv_deel_van) AND TRUNC (rrd.res_rsv_deel_tot)
                                  AND TO_CHAR (p.dag, 'd') BETWEEN '2' AND '6'
                                  AND NOT EXISTS (SELECT 1 FROM mld_vrije_dagen WHERE TRUNC (mld_vrije_dagen_datum) = TRUNC (p.dag))
                         GROUP BY TO_CHAR (p.dag, 'iyyy-iw'),
                                  rd.res_discipline_key,
                                  rd.res_deel_key,
                                  COALESCE (d.ins_alg_ruimte_key_org, d.ins_alg_ruimte_key)) resbez,
                        res_discipline rd,        -- Ook verwijderde catalogi!
                        alg_v_onrgoed_boom aob,    -- Ook verwijderde ruimten!
                        alg_locatie l,            -- Ook verwijderde locaties!
                        alg_district d,         -- Ook verwijderde districten!
                        alg_v_aanwezigonrgoedkenmerk ok,
                        fac_usrdata ud
                  WHERE resbes.wk = resbez.wk(+)
                        AND resbes.res_discipline_key = resbez.res_discipline_key(+)
                        AND resbes.resource_key = resbez.resource_key(+)
                        AND resbes.alg_ruimte_key = resbez.alg_ruimte_key(+)
                        AND resbes.res_discipline_key = rd.ins_discipline_key(+)
                        AND resbes.alg_ruimte_key = aob.alg_ruimte_key
                        AND aob.alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND l.alg_locatie_key = ok.alg_onrgoed_key(+)
                        AND ok.alg_onrgoed_niveau(+) = 'L'
                        AND ok.alg_kenmerk_key(+) = 1000            -- Cluster
                        AND ok.alg_onrgoedkenmerk_waarde = TO_CHAR (ud.fac_usrdata_key(+))
                        AND resbes.uren > 0 -- Soms 0 of zelfs negatief bij vreemde/gelijke begin- en eindtijden (van reserveerbare ruimte = res_ruimte)!
                        AND COALESCE (resbez.uren, 1) > 0 -- Soms 0 of zelfs negatief bij vreemde/gelijke begin- en eindtijden (van res_rsv_ruimte/deel)!
               GROUP BY l.alg_locatie_key,
                        resbes.wk,
                        COALESCE (rd.ins_discipline_omschrijving, 'Ruimtes'),
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend'),
                        d.alg_district_omschrijving,
                        l.alg_locatie_omschrijving)
   SELECT cx.alg_locatie_key, nl.wk, nl.catalogus, cl.cl, vt.vt, cx.cx,
          TO_CHAR (nl.ant_nl, '999990'),
          TO_CHAR (cl.ant_cl, '999990'),
          TO_CHAR (vt.ant_vt, '999990'),
          TO_CHAR (cx.ant_cx, '999990'),
          TO_CHAR (100 * nl.bzg_nl, '990') || '%',
          TO_CHAR (100 * cl.bzg_cl, '990') || '%',
          TO_CHAR (100 * vt.bzg_vt, '990') || '%',
          TO_CHAR (100 * cx.bzg_cx, '990') || '%'
     FROM (  SELECT wk, catalogus, SUM (aantal_reserveringen) ant_nl, SUM (COALESCE (bez_uren, 0)) / SUM (bes_uren) bzg_nl
               FROM rescatcx
           GROUP BY wk, catalogus) nl
          LEFT JOIN (  SELECT wk, catalogus, cl, SUM (aantal_reserveringen) ant_cl, SUM (COALESCE (bez_uren, 0)) / SUM (bes_uren) bzg_cl
                         FROM rescatcx
                     GROUP BY wk, catalogus, cl) cl
             ON nl.wk = cl.wk AND nl.catalogus = cl.catalogus
          LEFT JOIN (  SELECT wk, catalogus, cl, vt, SUM (aantal_reserveringen) ant_vt, SUM (COALESCE (bez_uren, 0)) / SUM (bes_uren) bzg_vt
                         FROM rescatcx
                     GROUP BY wk, catalogus, cl, vt) vt
             ON cl.wk = vt.wk AND cl.catalogus = vt.catalogus AND cl.cl = vt.cl
          LEFT JOIN (SELECT alg_locatie_key, wk, catalogus, cl, vt, cx, aantal_reserveringen ant_cx, COALESCE (bez_uren, 0) / bes_uren bzg_cx
                       FROM rescatcx) cx
             ON vt.wk = cx.wk AND vt.catalogus = cx.catalogus AND vt.cl = cx.cl AND vt.vt = cx.vt;

/* Formatted on 5-9-2016 16:32:28 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW djin_v_export_kpi_res_pw
(
   result,
   result_order
)
AS
   SELECT    '"week"'
          || ';"catalogus"'
          || ';"cluster"'
          || ';"vestiging"'
          || ';"complex"'
          || ';"res_ant_nl"'
          || ';"res_ant_cl"'
          || ';"res_ant_vt"'
          || ';"res_ant_cx"'
          || ';"res_bzg_nl"'
          || ';"res_bzg_cl"'
          || ';"res_bzg_vt"'
          || ';"res_bzg_cx"',
          0
     FROM DUAL
   UNION ALL
   SELECT    '"'
          || fclt_f_week
          || '";"'
          || fclt_f_catalogus
          || '";"'
          || fclt_f_cluster
          || '";"'
          || fclt_f_vestiging
          || '";"'
          || fclt_f_complex
          || '";"'
          || res_ant_nl
          || '";"'
          || res_ant_cl
          || '";"'
          || res_ant_vt
          || '";"'
          || res_ant_cx
          || '";"'
          || res_bzg_nl
          || '";"'
          || res_bzg_cl
          || '";"'
          || res_bzg_vt
          || '";"'
          || res_bzg_cx
          || '"',
          1
     FROM djin_v_rap_kpi_res_pw;

CREATE OR REPLACE VIEW djin_v_rap_kpi_tot_pw
(
   fclt_3d_locatie_key,
   fclt_f_week,
   fclt_f_type,
   fclt_f_vakgroep,
   fclt_f_cluster,
   fclt_f_vestiging,
   fclt_f_complex,
   tot_mld,
   ac_mld,
   uv_mld,
   tot_ord
)
AS
   WITH mldtot -- Per vakgroep/complex alle meldingen (incl. onderliggende opdrachten) op MLDAFM-tijd!
           AS (  SELECT l.alg_locatie_key,
                        TO_CHAR (t.fac_tracking_datum, 'iyyy-iw') week,
                        sd.ins_srtdiscipline_prefix type,
                        md.ins_discipline_omschrijving vakgroep,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend') cl,
                        d.alg_district_omschrijving vt,
                        l.alg_locatie_omschrijving cx,
                        COUNT ( * ) tot_mld,
                        SUM (DECODE (
                                SIGN(m.mld_melding_acceptdatum_std - fac.gettrackingdate ('MLDACP', m.mld_melding_key)),
                                -1, 0,
                                1))
                           acoptijd,
                        SUM (DECODE (
                                SIGN(m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')),
                                -1, 0,
                                1))
                           uvoptijd,
                        COUNT (o.mld_opdr_key) tot_ord
                   FROM fac_tracking t,
                        mld_melding m,
                        mld_opdr o,
                        mld_stdmelding sm,       -- Ook verwijderde meldingen,
                        mld_discipline md,       -- en verwijderde vakgroepen,
                        ins_srtdiscipline sd, -- en verwijderde vakgroeptypen,
                        alg_locatie l,             -- en verwijderde locaties,
                        alg_district d,          -- en verwijderde districten!
                        alg_v_aanwezigonrgoedkenmerk ok,
                        fac_usrdata ud
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (SYSDATE, 'iw') - 770 -- Afgelopen 110 weken
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        AND m.mld_melding_key = o.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                        AND sm.mld_ins_discipline_key = md.ins_discipline_key
                        AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND l.alg_locatie_key = ok.alg_onrgoed_key(+)
                        AND ok.alg_onrgoed_niveau(+) = 'L'
                        AND ok.alg_kenmerk_key(+) = 1000            -- Cluster
                        AND ok.alg_onrgoedkenmerk_waarde = TO_CHAR (ud.fac_usrdata_key(+))
               GROUP BY l.alg_locatie_key,
                        TO_CHAR (t.fac_tracking_datum, 'iyyy-iw'),
                        sd.ins_srtdiscipline_prefix,
                        md.ins_discipline_omschrijving,
                        COALESCE (ud.fac_usrdata_omschr, 'Onbekend'),
                        d.alg_district_omschrijving,
                        l.alg_locatie_omschrijving)
   SELECT alg_locatie_key, week, type, vakgroep, cl, vt, cx, -- Per vakgroep per vakgroeptype!
          TO_CHAR (tot_mld), TO_CHAR (acoptijd), TO_CHAR (uvoptijd), TO_CHAR (tot_ord)
     FROM mldtot
   UNION ALL                       -- ALLE vakgroepen over ALLE vakgroeptypen!
     SELECT alg_locatie_key, week, 'Alle' type, 'Totaal' vakgroep, cl, vt, cx,
            TO_CHAR (SUM (tot_mld)), TO_CHAR (SUM (acoptijd)), TO_CHAR (SUM (uvoptijd)), TO_CHAR (SUM (tot_ord))
       FROM mldtot
   GROUP BY alg_locatie_key, week, 'Alle', 'Totaal', cl, vt, cx;

CREATE OR REPLACE VIEW djin_v_export_kpi_tot_pw
(
   result,
   result_order
)
AS
   SELECT    '"week"'
          || ';"type"'
          || ';"vakgroep"'
          || ';"cluster"'
          || ';"vestiging"'
          || ';"complex"'
          || ';"mld"'
          || ';"ac"'
          || ';"uv"'
          || ';"ord"',
          0
     FROM DUAL
   UNION ALL
   SELECT    '"'
          || fclt_f_week
          || '";"'
          || fclt_f_type
          || '";"'
          || fclt_f_vakgroep
          || '";"'
          || fclt_f_cluster
          || '";"'
          || fclt_f_vestiging
          || '";"'
          || fclt_f_complex
          || '";"'
          || tot_mld
          || '";"'
          || ac_mld
          || '";"'
          || uv_mld
          || '";"'
          || tot_ord
          || '"',
          1
     FROM djin_v_rap_kpi_tot_pw;

-- DJIN#38162: RTM-inrichting
-- SLA van melding bepalend voor oranje-criterium (1 werkdag voor einddatum)!
/* Formatted on 11-1-2017 16:45:15 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW DJIN_V_RAP_ORDOPEN_ORANJE
(
   FCLT_3D_LOCATIE_KEY,
   --FCLT_3D_AFDELING_KEY,
   HIDE_F_SORTERING,
   PRIO,
   PREFIX,
   MLD_MELDING_KEY,
   VOLGNR,
   MLD_OPDR_KEY,
   OPDR_ID,
   OPDRACHTTYPE,
   PLAATS,
   ALG_RUIMTE_OMSCHRIJVING,
   INS_SRTDISCIPLINE_KEY,
   INS_DISCIPLINE_KEY,
   INS_DISCIPLINE_OMS,
   MLD_STDMELDING_KEY,
   MLD_STDMELDING_OMS,
   OMSCHRIJVING,
   BEGINDATUM,
   MELDINGSTATUS,
   OPDRACHTSTATUS,
   EINDDATUM,
   UITVOERENDE_KEY,
   UITVOERENDE_NAAM,
   BEHANDELAAR_NAAM,
   AFHANDELING,
   KOSTEN,
   GEBOUWBEHEER_JN,
   URGENT_JN,
   VERVOLG_JN
)
AS
   WITH kantoortijden
           AS (SELECT fac.safe_to_number (fac.getsetting ('fac_t_endofworkday'))
                      - fac.safe_to_number (fac.getsetting ('fac_t_startofworkday'))
                         uren
                 FROM DUAL)
   SELECT l.alg_locatie_key,
          --p.prs_afdeling_key,
          TO_CHAR (o.mld_opdr_einddatum, 'yyyymmddhh24:mi:ss'),
          TO_CHAR (m.mld_melding_spoed),
          sd.ins_srtdiscipline_prefix,
          TO_CHAR (m.mld_melding_key),
          TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr),
          TO_CHAR (o.mld_opdr_key),
          sd.ins_srtdiscipline_prefix || TO_CHAR (m.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr),
          ot.mld_typeopdr_omschrijving,
          DECODE (
             og.alg_type,
             'R',
                l.alg_locatie_code
             || '-'
             || og.alg_gebouw_code
             || '-'
             || og.alg_verdieping_code
             || og.alg_ruimte_nr,
             'V',
                l.alg_locatie_code
             || '-'
             || og.alg_gebouw_code
             || '-'
             || og.alg_verdieping_code,
             'G',
             l.alg_locatie_code || '-' || og.alg_gebouw_code,
             'T',
             l.alg_locatie_code || '-' || og.alg_terreinsector_code,
             l.alg_locatie_code)
             plaatsaanduiding,
          DECODE (og.alg_type, 'R', og.alg_ruimte_omschrijving, NULL)
             alg_ruimte_omschrijving,
          sd.ins_srtdiscipline_key,
          md.ins_discipline_key,
          md.ins_discipline_omschrijving,
          sm.mld_stdmelding_key,
          sm.mld_stdmelding_omschrijving,
          o.mld_opdr_omschrijving,
          o.mld_opdr_datumbegin datum,
          ms.mld_statuses_omschrijving,
          os.mld_statusopdr_omschrijving,
          o.mld_opdr_einddatum einddatum,
          o.mld_uitvoerende_keys,
          COALESCE (b.prs_bedrijf_naam, puv.prs_perslid_naam_full)
             uitvoerende_naam,
          pb.prs_perslid_naam_full,
          o.mld_opdr_opmerking,
          o.mld_opdr_kosten,
          DECODE (md.ins_discipline_key, 24, 'J', 'N'),    -- Gebouwbeheer J/N
          DECODE (m.mld_melding_spoed, 1, 'J', 2, 'J', 'N'),     -- Urgent J/N
          DECODE (m.mld_melding_start_key, NULL, 'N', 'J')      -- Vervolg J/N
     FROM kantoortijden kt,
          mld_opdr o,
          mld_statusopdr os,
          mld_typeopdr ot,
          prs_bedrijf b,                                -- Externe leverancier
          prs_v_perslid_fullnames_all puv,              -- Interne uitvoerende
          mld_melding m,
          mld_statuses ms,
          mld_stdmelding sm,
          mld_discipline md,
          ins_srtdiscipline sd,
          alg_locatie l,
          alg_v_onroerendgoed_gegevens og,
          --prs_perslid p,
          prs_v_perslid_fullnames_all pb -- Behandelaar (per 2016.3 de gewenste?)
    WHERE     o.mld_statusopdr_key IN (3, 4, 5, 8, 10) -- 3-Ter fiattering, 4-Gefiatteerd, 5-Uitgegeven, 8-Geaccepteerd, 10-Ter goedkeuring
          AND o.mld_statusopdr_key = os.mld_statusopdr_key
          AND o.mld_typeopdr_key = ot.mld_typeopdr_key
          AND o.mld_uitvoerende_keys = b.prs_bedrijf_key(+)
          AND o.mld_uitvoerende_keys = puv.prs_perslid_key(+)
          AND o.mld_melding_key = m.mld_melding_key
          AND m.mld_melding_status IN (2, 3, 4, 7, 0) -- 2-Ingevoerd, 3-Ingezien, 4-Geaccepteerd, 7-Uitgegeven, 0-Pending
          AND m.mld_melding_einddatum_std > SYSDATE
          AND m.mld_melding_status = ms.mld_statuses_key
          AND m.mld_stdmelding_key = sm.mld_stdmelding_key
          AND sm.mld_ins_discipline_key = md.ins_discipline_key
          AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
          AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
          AND m.mld_alg_onroerendgoed_keys = og.alg_onroerendgoed_keys(+)
          --AND m.prs_perslid_key_voor = p.prs_perslid_key
          AND o.prs_perslid_key = pb.prs_perslid_key(+)
          AND SIGN(mld.geteinddatum (
                      m.mld_melding_datum,
                      m.mld_stdmelding_key,
                      m.mld_melding_spoed,
                      NULL,                  -- Plaats binnen/kleiner locatie!
                      NULL,                  -- Object met laagste uitvoertijd
                      MLD_T_UITVOERTIJD (
                         DECODE (m.mld_melding_t_uitvoertijd.eenheid,
                                 'D', GREATEST (0, m.mld_melding_t_uitvoertijd.tijdsduur - 1),
                                 GREATEST (0, m.mld_melding_t_uitvoertijd.tijdsduur - kt.uren)),
                         m.mld_melding_t_uitvoertijd.eenheid))
                   - TRUNC (SYSDATE, 'mi')) = -1;

-- Lopende opdrachten per vakgroep onder alle vakgroepen behalve Gebouwbeheer (24) tov. SLA van melding.
-- NB. Alle prio en exclusief vervolgmeldingen.
CREATE OR REPLACE VIEW DJIN_V_GRAPH_ORDOPEN_STD_NGB
(
   FCLT_3D_LOCATIE_KEY,
   FCLT_XAS_,
   FCLT_YAS_,            -- groen=ruim op tijd (>1 werkdag voor SLA-einddatum)
   FCLT_YAS2_,          -- oranje=krap op tijd (<1 werkdag voor SLA-einddatum)
   FCLT_YAS3_,                                            -- rood=echt te laat
   VOLGORDE,
   FCLT_URL
)
AS
   WITH kantoortijden
           AS (SELECT fac.safe_to_number (fac.getsetting ('fac_t_endofworkday'))
                      - fac.safe_to_number (fac.getsetting ('fac_t_startofworkday'))
                         uren
                 FROM DUAL)
   SELECT alg_locatie_key,
          alg_locatie_code || '/' || vakgroep_oms,
          ruimoptijd groen,
          totaal - ruimoptijd - echttelaat oranje,
          echttelaat rood,
          TO_CHAR (999999 - totaal) || vakgroep_oms volgorde,
             'appl/fac/fac_report.asp?mode=list'
          || '&'
          || 'usrrap_key=31'
          || '&'
          || 'ins_discipline_key='
          || TO_CHAR (ins_discipline_key)
          || '&'
          || 'gebouwbeheer_jn=N'
          --|| '&'
          --|| 'urgent_jn=N'
          || '&'
          || 'vervolg_jn=N'
     FROM (  SELECT l.alg_locatie_key,
                    l.alg_locatie_code,
                    md.ins_discipline_key,
                       sd.ins_srtdiscipline_prefix
                    || '-'
                    || md.ins_discipline_omschrijving
                       vakgroep_oms,
                    COUNT ( * ) totaal,
                    SUM(DECODE (
                           SIGN(mld.geteinddatum (
                                   m.mld_melding_datum,
                                   m.mld_stdmelding_key,
                                   m.mld_melding_spoed,
                                   NULL,     -- Plaats binnen/kleiner locatie!
                                   NULL,     -- Object met laagste uitvoertijd
                                   MLD_T_UITVOERTIJD (
                                      DECODE (m.mld_melding_t_uitvoertijd.eenheid,
                                              'D', GREATEST (0, m.mld_melding_t_uitvoertijd.tijdsduur - 1),
                                              GREATEST (0, m.mld_melding_t_uitvoertijd.tijdsduur - kt.uren)),
                                      m.mld_melding_t_uitvoertijd.eenheid))
                                - TRUNC (SYSDATE, 'mi')),
                           1, 1,
                           0))
                       ruimoptijd,
                    SUM(DECODE (
                           SIGN(m.mld_melding_einddatum_std
                                - TRUNC (SYSDATE, 'mi')),
                           -1, 1,
                           0))
                       echttelaat
               FROM kantoortijden kt,
                    mld_opdr o,
                    mld_melding m,
                    mld_stdmelding sm,
                    mld_discipline md,
                    ins_srtdiscipline sd,
                    alg_locatie l
              WHERE     o.mld_statusopdr_key IN (3, 4, 5, 8, 10) -- 3-Ter fiattering, 4-Gefiatteerd, 5-Uitgegeven, 8-Geaccepteerd, 10-Ter goedkeuring
                    AND o.mld_melding_key = m.mld_melding_key
                    --AND m.mld_melding_status IN (2, 3, 4, 7, 0) -- 2-Ingevoerd, 3-Ingezien, 4-Geaccepteerd, 7-Uitgegeven, 0-Pending
                    AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                    --AND m.mld_melding_spoed IN (3, 4)          -- Normaal/Laag
                    AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                    AND sm.mld_ins_discipline_key = md.ins_discipline_key
                    AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                    AND md.ins_discipline_key != 24 -- Gebouwbeheer
                    AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
           GROUP BY l.alg_locatie_key,
                    l.alg_locatie_code,
                    md.ins_discipline_key,
                       sd.ins_srtdiscipline_prefix
                    || '-'
                    || md.ins_discipline_omschrijving) x;

-- Lopende opdrachten per melding onder alleen vakgroep Gebouwbeheer (24) tov. SLA van melding.
-- NB. Alle prio en exclusief vervolgmeldingen.
CREATE OR REPLACE VIEW DJIN_V_GRAPH_ORDOPEN_STD_GEB
(
   FCLT_3D_LOCATIE_KEY,
   FCLT_XAS_,
   FCLT_YAS_,            -- groen=ruim op tijd (>1 werkdag voor SLA-einddatum)
   FCLT_YAS2_,          -- oranje=krap op tijd (<1 werkdag voor SLA-einddatum)
   FCLT_YAS3_,                                            -- rood=echt te laat
   VOLGORDE,
   FCLT_URL
)
AS
   WITH kantoortijden
           AS (SELECT fac.safe_to_number (fac.getsetting ('fac_t_endofworkday'))
                      - fac.safe_to_number (fac.getsetting ('fac_t_startofworkday'))
                         uren
                 FROM DUAL)
   SELECT alg_locatie_key,
          alg_locatie_code || '/' || mld_stdmelding_omschrijving,
          ruimoptijd groen,
          totaal - ruimoptijd - echttelaat oranje,
          echttelaat rood,
          TO_CHAR (999999 - totaal) || mld_stdmelding_omschrijving volgorde,
             'appl/fac/fac_report.asp?mode=list'
          || '&'
          || 'usrrap_key=31'
          || '&'
          || 'mld_stdmelding_key='
          || TO_CHAR (mld_stdmelding_key)
          || '&'
          || 'gebouwbeheer_jn=J'
          --|| '&'
          --|| 'urgent_jn=N'
          || '&'
          || 'vervolg_jn=N'
     FROM (  SELECT l.alg_locatie_key,
                    l.alg_locatie_code,
                    sm.mld_stdmelding_key,
                    sm.mld_stdmelding_omschrijving,
                    COUNT ( * ) totaal,
                    SUM(DECODE (
                           SIGN(mld.geteinddatum (
                                   m.mld_melding_datum,
                                   m.mld_stdmelding_key,
                                   m.mld_melding_spoed,
                                   NULL,     -- Plaats binnen/kleiner locatie!
                                   NULL,     -- Object met laagste uitvoertijd
                                   MLD_T_UITVOERTIJD (
                                      DECODE (m.mld_melding_t_uitvoertijd.eenheid,
                                              'D', GREATEST (0, m.mld_melding_t_uitvoertijd.tijdsduur - 1),
                                              GREATEST (0, m.mld_melding_t_uitvoertijd.tijdsduur - kt.uren)),
                                      m.mld_melding_t_uitvoertijd.eenheid))
                                - TRUNC (SYSDATE, 'mi')),
                           1, 1,
                           0))
                       ruimoptijd,
                    SUM(DECODE (
                           SIGN(m.mld_melding_einddatum_std
                                - TRUNC (SYSDATE, 'mi')),
                           -1, 1,
                           0))
                       echttelaat
               FROM kantoortijden kt,
                    mld_opdr o,
                    mld_melding m,
                    mld_stdmelding sm,
                    mld_discipline md,
                    ins_srtdiscipline sd,
                    alg_locatie l
              WHERE     o.mld_statusopdr_key IN (3, 4, 5, 8, 10) -- 3-Ter fiattering, 4-Gefiatteerd, 5-Uitgegeven, 8-Geaccepteerd, 10-Ter goedkeuring
                    AND o.mld_melding_key = m.mld_melding_key
                    --AND m.mld_melding_status IN (2, 3, 4, 7, 0) -- 2-Ingevoerd, 3-Ingezien, 4-Geaccepteerd, 7-Uitgegeven, 0-Pending
                    AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                    --AND m.mld_melding_spoed IN (3, 4)          -- Normaal/Laag
                    AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                    AND sm.mld_ins_discipline_key = md.ins_discipline_key
                    AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                    AND md.ins_discipline_key = 24 -- Gebouwbeheer
                    AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
           GROUP BY l.alg_locatie_key, l.alg_locatie_code, sm.mld_stdmelding_key, sm.mld_stdmelding_omschrijving) x;

-- Lopende urgente opdrachten per vakgroep onder alle vakgroepen behalve Gebouwbeheer (24) tov. SLA van melding.
-- NB. Alleen kritische/hoge prio en exclusief vervolgmeldingen.
CREATE OR REPLACE VIEW DJIN_V_GRAPH_ORDOPEN_URG_NGB
(
   FCLT_3D_LOCATIE_KEY,
   FCLT_XAS_,
   FCLT_YAS_,            -- groen=ruim op tijd (>1 werkdag voor SLA-einddatum)
   FCLT_YAS2_,          -- oranje=krap op tijd (<1 werkdag voor SLA-einddatum)
   FCLT_YAS3_,                                            -- rood=echt te laat
   VOLGORDE,
   FCLT_URL
)
AS
   WITH kantoortijden
           AS (SELECT fac.safe_to_number (fac.getsetting ('fac_t_endofworkday'))
                      - fac.safe_to_number (fac.getsetting ('fac_t_startofworkday'))
                         uren
                 FROM DUAL)
   SELECT alg_locatie_key,
          alg_locatie_code || '/' || vakgroep_oms,
          ruimoptijd groen,
          totaal - ruimoptijd - echttelaat oranje,
          echttelaat rood,
          TO_CHAR (999999 - totaal) || vakgroep_oms volgorde,
             'appl/fac/fac_report.asp?mode=list'
          || '&'
          || 'usrrap_key=31'
          || '&'
          || 'ins_discipline_key='
          || TO_CHAR (ins_discipline_key)
          || '&'
          || 'gebouwbeheer_jn=N'
          || '&'
          || 'urgent_jn=J'
          || '&'
          || 'vervolg_jn=N'
     FROM (  SELECT l.alg_locatie_key,
                    l.alg_locatie_code,
                    md.ins_discipline_key,
                       sd.ins_srtdiscipline_prefix
                    || '-'
                    || md.ins_discipline_omschrijving
                       vakgroep_oms,
                    COUNT ( * ) totaal,
                    SUM(DECODE (
                           SIGN(mld.geteinddatum (
                                   m.mld_melding_datum,
                                   m.mld_stdmelding_key,
                                   m.mld_melding_spoed,
                                   NULL,     -- Plaats binnen/kleiner locatie!
                                   NULL,     -- Object met laagste uitvoertijd
                                   MLD_T_UITVOERTIJD (
                                      DECODE (m.mld_melding_t_uitvoertijd.eenheid,
                                              'D', GREATEST (0, m.mld_melding_t_uitvoertijd.tijdsduur - 1),
                                              GREATEST (0, m.mld_melding_t_uitvoertijd.tijdsduur - kt.uren)),
                                      m.mld_melding_t_uitvoertijd.eenheid))
                                - TRUNC (SYSDATE, 'mi')),
                           1, 1,
                           0))
                       ruimoptijd,
                    SUM(DECODE (
                           SIGN(m.mld_melding_einddatum_std
                                - TRUNC (SYSDATE, 'mi')),
                           -1, 1,
                           0))
                       echttelaat
               FROM kantoortijden kt,
                    mld_opdr o,
                    mld_melding m,
                    mld_stdmelding sm,
                    mld_discipline md,
                    ins_srtdiscipline sd,
                    alg_locatie l
              WHERE     o.mld_statusopdr_key IN (3, 4, 5, 8, 10) -- 3-Ter fiattering, 4-Gefiatteerd, 5-Uitgegeven, 8-Geaccepteerd, 10-Ter goedkeuring
                    AND o.mld_melding_key = m.mld_melding_key
                    --AND m.mld_melding_status IN (2, 3, 4, 7, 0) -- 2-Ingevoerd, 3-Ingezien, 4-Geaccepteerd, 7-Uitgegeven, 0-Pending
                    AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                    AND m.mld_melding_spoed IN (1, 2)         -- Kritisch/Hoog
                    AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                    AND sm.mld_ins_discipline_key = md.ins_discipline_key
                    AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                    AND md.ins_discipline_key != 24 -- Gebouwbeheer
                    AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
           GROUP BY l.alg_locatie_key,
                    l.alg_locatie_code,
                    md.ins_discipline_key,
                       sd.ins_srtdiscipline_prefix
                    || '-'
                    || md.ins_discipline_omschrijving) x;

-- Lopende urgente opdrachten per melding onder alleen Gebouwbeheer (24) tov. SLA van melding.
-- NB. Alle prio en exclusief vervolgmeldingen.
CREATE OR REPLACE VIEW DJIN_V_GRAPH_ORDOPEN_URG_GEB
(
   FCLT_3D_LOCATIE_KEY,
   FCLT_XAS_,
   FCLT_YAS_,            -- groen=ruim op tijd (>1 werkdag voor SLA-einddatum)
   FCLT_YAS2_,          -- oranje=krap op tijd (<1 werkdag voor SLA-einddatum)
   FCLT_YAS3_,                                            -- rood=echt te laat
   VOLGORDE,
   FCLT_URL
)
AS
   WITH kantoortijden
           AS (SELECT fac.safe_to_number (fac.getsetting ('fac_t_endofworkday'))
                      - fac.safe_to_number (fac.getsetting ('fac_t_startofworkday'))
                         uren
                 FROM DUAL)
   SELECT alg_locatie_key,
          alg_locatie_code || '/' || mld_stdmelding_omschrijving,
          ruimoptijd groen,
          totaal - ruimoptijd - echttelaat oranje,
          echttelaat rood,
          TO_CHAR (999999 - totaal) || mld_stdmelding_omschrijving volgorde,
             'appl/fac/fac_report.asp?mode=list'
          || '&'
          || 'usrrap_key=31'
          || '&'
          || 'mld_stdmelding_key='
          || TO_CHAR (mld_stdmelding_key)
          || '&'
          || 'gebouwbeheer_jn=J'
          || '&'
          || 'urgent_jn=J'
          || '&'
          || 'vervolg_jn=N'
     FROM (  SELECT l.alg_locatie_key,
                    l.alg_locatie_code,
                    sm.mld_stdmelding_key,
                    sm.mld_stdmelding_omschrijving,
                    COUNT ( * ) totaal,
                    SUM(DECODE (
                           SIGN(mld.geteinddatum (
                                   m.mld_melding_datum,
                                   m.mld_stdmelding_key,
                                   m.mld_melding_spoed,
                                   NULL,     -- Plaats binnen/kleiner locatie!
                                   NULL,     -- Object met laagste uitvoertijd
                                   MLD_T_UITVOERTIJD (
                                      DECODE (m.mld_melding_t_uitvoertijd.eenheid,
                                              'D', GREATEST (0, m.mld_melding_t_uitvoertijd.tijdsduur - 1),
                                              GREATEST (0, m.mld_melding_t_uitvoertijd.tijdsduur - kt.uren)),
                                      m.mld_melding_t_uitvoertijd.eenheid))
                                - TRUNC (SYSDATE, 'mi')),
                           1, 1,
                           0))
                       ruimoptijd,
                    SUM(DECODE (
                           SIGN(m.mld_melding_einddatum_std
                                - TRUNC (SYSDATE, 'mi')),
                           -1, 1,
                           0))
                       echttelaat
               FROM kantoortijden kt,
                    mld_opdr o,
                    mld_melding m,
                    mld_stdmelding sm,
                    mld_discipline md,
                    ins_srtdiscipline sd,
                    alg_locatie l
              WHERE     o.mld_statusopdr_key IN (3, 4, 5, 8, 10) -- 3-Ter fiattering, 4-Gefiatteerd, 5-Uitgegeven, 8-Geaccepteerd, 10-Ter goedkeuring
                    AND o.mld_melding_key = m.mld_melding_key
                    --AND m.mld_melding_status IN (2, 3, 4, 7, 0) -- 2-Ingevoerd, 3-Ingezien, 4-Geaccepteerd, 7-Uitgegeven, 0-Pending
                    AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                    AND m.mld_melding_spoed IN (1, 2)         -- Kritisch/Hoog
                    AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                    AND sm.mld_ins_discipline_key = md.ins_discipline_key
                    AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                    AND md.ins_discipline_key = 24 -- Gebouwbeheer
                    AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
           GROUP BY l.alg_locatie_key, l.alg_locatie_code, sm.mld_stdmelding_key, sm.mld_stdmelding_omschrijving) x;

-- Nog niet geaccepteerde opdrachten per vakgroep onder alle vakgroepen tov. SLA van melding.
-- NB. Alle prio en inclusief vervolgmeldingen.
CREATE OR REPLACE VIEW DJIN_V_GRAPH_ORDOPEN_NEW
(
   FCLT_3D_LOCATIE_KEY,
   FCLT_XAS_,
   FCLT_YAS_,            -- groen=ruim op tijd (>1 werkdag voor SLA-einddatum)
   FCLT_YAS2_,          -- oranje=krap op tijd (<1 werkdag voor SLA-einddatum)
   FCLT_YAS3_,                                            -- rood=echt te laat
   VOLGORDE,
   FCLT_URL
)
AS
   WITH kantoortijden
           AS (SELECT fac.safe_to_number (fac.getsetting ('fac_t_endofworkday'))
                      - fac.safe_to_number (fac.getsetting ('fac_t_startofworkday'))
                         uren
                 FROM DUAL)
   SELECT alg_locatie_key,
          alg_locatie_code || '/' || vakgroep_oms,
          ruimoptijd groen,
          totaal - ruimoptijd - echttelaat oranje,
          echttelaat rood,
          TO_CHAR (999999 - totaal) || vakgroep_oms volgorde,
             'appl/fac/fac_report.asp?mode=list'
          || '&'
          || 'usrrap_key=31'
          || '&'
          || 'ins_discipline_key='
          || TO_CHAR (ins_discipline_key)
          --|| '&'
          --|| 'urgent_jn=N'
     FROM (  SELECT l.alg_locatie_key,
                    l.alg_locatie_code,
                    md.ins_discipline_key,
                       sd.ins_srtdiscipline_prefix
                    || '-'
                    || md.ins_discipline_omschrijving
                       vakgroep_oms,
                    COUNT ( * ) totaal,
                    SUM(DECODE (
                           SIGN(mld.geteinddatum (
                                   m.mld_melding_datum,
                                   m.mld_stdmelding_key,
                                   m.mld_melding_spoed,
                                   NULL,     -- Plaats binnen/kleiner locatie!
                                   NULL,     -- Object met laagste uitvoertijd
                                   MLD_T_UITVOERTIJD (
                                      DECODE (m.mld_melding_t_uitvoertijd.eenheid,
                                              'D', GREATEST (0, m.mld_melding_t_uitvoertijd.tijdsduur - 1),
                                              GREATEST (0, m.mld_melding_t_uitvoertijd.tijdsduur - kt.uren)),
                                      m.mld_melding_t_uitvoertijd.eenheid))
                                - TRUNC (SYSDATE, 'mi')),
                           1, 1,
                           0))
                       ruimoptijd,
                    SUM(DECODE (
                           SIGN(m.mld_melding_einddatum_std
                                - TRUNC (SYSDATE, 'mi')),
                           -1, 1,
                           0))
                       echttelaat
               FROM kantoortijden kt,
                    mld_opdr o,
                    mld_melding m,
                    mld_stdmelding sm,
                    mld_discipline md,
                    ins_srtdiscipline sd,
                    alg_locatie l
              WHERE     o.mld_statusopdr_key IN (3, 4, 5, 10) -- 3-Ter fiattering, 4-Gefiatteerd, 5-Uitgegeven, 10-Ter goedkeuring
                    AND o.mld_melding_key = m.mld_melding_key
                    --AND m.mld_melding_status IN (2, 3, 4, 7, 0) -- 2-Ingevoerd, 3-Ingezien, 4-Geaccepteerd, 7-Uitgegeven, 0-Pending
                    AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                    AND sm.mld_ins_discipline_key = md.ins_discipline_key
                    AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                    AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
           GROUP BY l.alg_locatie_key,
                    l.alg_locatie_code,
                    md.ins_discipline_key,
                       sd.ins_srtdiscipline_prefix
                    || '-'
                    || md.ins_discipline_omschrijving) x;


-- DJIN#39048: Inzichtelijk maken actuele organisatieboom (niet verwijderd en
--             evt. ook op - onterecht - lager levels dan niveau 5!
CREATE OR REPLACE VIEW djin_v_prs_afdelingsboom
(
   hide_f_regel,
   fclt_f_level,
   bedrijf_naam,
   afdeling,
   bedrijf_key,
   afd_key,
   afd_parkey,
   afd_code,
   afd_oms,
   afd_aanmaak,
   afd_verwijder,
   kpn_key,
   kpn_nr,
   kpn_oms,
   medewerkers,
   fclt_f_vervallen_jn
)
AS
     SELECT ROWNUM regel,
            a.niveau || DECODE (a.prs_afdeling_verwijder, NULL, '', ' [VERVALLEN]'),
            b.prs_bedrijf_naam,
            a.afdeling || DECODE (a.prs_afdeling_verwijder, NULL, '', ' [VERVALLEN]'),
            b.prs_bedrijf_key,
            a.prs_afdeling_key,
            a.prs_afdeling_parentkey,
            a.prs_afdeling_upper || DECODE (a.prs_afdeling_verwijder, NULL, '', ' [VERVALLEN]'),
            a.prs_afdeling_omschrijving || DECODE (a.prs_afdeling_verwijder, NULL, '', ' [VERVALLEN]'),
            a.prs_afdeling_aanmaak,
            a.prs_afdeling_verwijder,
            c.prs_kostenplaats_key,
            c.prs_kostenplaats_nr,
            c.prs_kostenplaats_omschrijving,
            d.medewerkers,
            DECODE (a.prs_afdeling_verwijder, NULL, 'nee', 'ja')
       FROM (    SELECT TO_CHAR (LEVEL) niveau,
                        prs_bedrijf_key,
                        prs_afdeling_key,
                        prs_afdeling_parentkey,
                        LPAD (' ', 4 * LEVEL, '-') || prs_afdeling_upper || '-' || prs_afdeling_omschrijving
                           afdeling,
                        prs_afdeling_upper,
                        prs_afdeling_omschrijving,
                        prs_afdeling_aanmaak,
                        prs_afdeling_verwijder
                   FROM prs_afdeling
             CONNECT BY PRIOR prs_afdeling_key = prs_afdeling_parentkey
             START WITH prs_afdeling_parentkey IS NULL) a
            LEFT JOIN prs_bedrijf b
               ON a.prs_bedrijf_key = b.prs_bedrijf_key
            LEFT JOIN (SELECT a.prs_afdeling_key, k.prs_kostenplaats_key, k.prs_kostenplaats_nr, k.prs_kostenplaats_omschrijving
                         FROM prs_afdeling a, prs_kostenplaats k
                        WHERE a.prs_kostenplaats_key = k.prs_kostenplaats_key AND k.prs_kostenplaats_verwijder IS NULL) c
               ON a.prs_afdeling_key = c.prs_afdeling_key
            LEFT JOIN (  SELECT p.prs_afdeling_key, COUNT ( * ) medewerkers
                           FROM prs_v_aanwezigperslid p
                       GROUP BY p.prs_afdeling_key) d
               ON a.prs_afdeling_key = d.prs_afdeling_key
   ORDER BY ROWNUM;

-- DJIN#55340: Dienstverleningsrapportages
CREATE OR REPLACE VIEW djin_v_rap_dvl_rpdc_cx
(
   hide_f_sortering,
   jaar,
   vestiging,
   complex,
   kpi,
   jan_apr_aantal,
   jan_apr_optijd,
   mei_aug_aantal,
   mei_aug_optijd,
   sep_dec_aantal,
   sep_dec_optijd
)
AS
   WITH mldkpi2 -- Per complex volgens KPI2-tabel de hoge prio meldingen op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 4) periode,
                        '2. Meldingen urgente storingen' kpi,
                        d.alg_district_omschrijving vt, l.alg_locatie_omschrijving cx,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        (SELECT *
                           FROM fac_v_aanwezigusrdata
                          WHERE fac_usrtab_key = 201) ud,              -- KPI2
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d           -- en verwijderde districten!
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND m.mld_melding_spoed IN (1, 2)     -- Kritisch/Hoog
                        AND TO_CHAR (m.mld_stdmelding_key) = ud.fac_usrdata_code
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 4),
                        '2. Meldingen urgente storingen',
                        d.alg_district_omschrijving, l.alg_locatie_omschrijving),
        mldkpi6 -- Per complex volgens KPI6-tabel de meldingen op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 4) periode,
                        '6. Alle dienstverlening' kpi,
                        d.alg_district_omschrijving vt, l.alg_locatie_omschrijving cx,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        (SELECT *
                           FROM fac_v_aanwezigusrdata
                          WHERE fac_usrtab_key = 221) ud,              -- KPI6
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d           -- en verwijderde districten!
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND TO_CHAR (m.mld_stdmelding_key) = ud.fac_usrdata_code
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 4),
                        '6. Alle dienstverlening',
                        d.alg_district_omschrijving, l.alg_locatie_omschrijving),
        mldkpi7 -- Per complex onder vakgroep(type)=Klantreacties de Klachten op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 4) periode,
                        '7. Afhandeling klachten' kpi,
                        d.alg_district_omschrijving vt, l.alg_locatie_omschrijving cx,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d           -- en verwijderde districten!
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND m.mld_stdmelding_key = 23                -- Klacht
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 4),
                        '7. Afhandeling klachten',
                        d.alg_district_omschrijving, l.alg_locatie_omschrijving)
     SELECT jaar || vt || cx || '1', jaar, vt, cx, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0))))
       FROM mldkpi2
   GROUP BY jaar || vt || cx || '1', jaar, vt, cx, kpi
   UNION ALL      -- Nul-regel voor deze kpi per jaar/vt/cx zonder voorkomens!
     SELECT p.jaar || d.alg_district_omschrijving || l.alg_locatie_omschrijving || '1', p.jaar, d.alg_district_omschrijving, l.alg_locatie_omschrijving,
            '2. Meldingen urgente storingen', 0, 0, 0, 0, 0, 0
       FROM (SELECT TO_CHAR (ADD_MONTHS (SYSDATE, (LEVEL - 1) * -12), 'yyyy') jaar FROM DUAL CONNECT BY LEVEL <= 3 ORDER BY 1) p,
            alg_locatie l, alg_district d
      WHERE p.jaar BETWEEN TO_CHAR (l.alg_locatie_aanmaak, 'yyyy') AND TO_CHAR (COALESCE (l.alg_locatie_verwijder, SYSDATE), 'yyyy')
            AND l.alg_district_key = d.alg_district_key
            AND NOT EXISTS (SELECT 1 FROM mldkpi2 WHERE jaar = p.jaar AND cx = l.alg_locatie_omschrijving)
   UNION ALL
     SELECT jaar || vt || cx || '2', jaar, vt, cx, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0))))
       FROM mldkpi6
   GROUP BY jaar || vt || cx || '2', jaar, vt, cx, kpi
   UNION ALL      -- Nul-regel voor deze kpi per jaar/vt/cx zonder voorkomens!
     SELECT p.jaar || d.alg_district_omschrijving || l.alg_locatie_omschrijving || '2', p.jaar, d.alg_district_omschrijving, l.alg_locatie_omschrijving,
            '6. Alle dienstverlening', 0, 0, 0, 0, 0, 0
       FROM (SELECT TO_CHAR (ADD_MONTHS (SYSDATE, (LEVEL - 1) * -12), 'yyyy') jaar FROM DUAL CONNECT BY LEVEL <= 3 ORDER BY 1) p,
            alg_locatie l, alg_district d
      WHERE p.jaar BETWEEN TO_CHAR (l.alg_locatie_aanmaak, 'yyyy') AND TO_CHAR (COALESCE (l.alg_locatie_verwijder, SYSDATE), 'yyyy')
            AND l.alg_district_key = d.alg_district_key
            AND NOT EXISTS (SELECT 1 FROM mldkpi6 WHERE jaar = p.jaar AND cx = l.alg_locatie_omschrijving)
   UNION ALL
     SELECT jaar || vt || cx || '3', jaar, vt, cx, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0))))
       FROM mldkpi7
   GROUP BY jaar || vt || cx || '3', jaar, vt, cx, kpi
   UNION ALL      -- Nul-regel voor deze kpi per jaar/vt/cx zonder voorkomens!
     SELECT p.jaar || d.alg_district_omschrijving || l.alg_locatie_omschrijving || '3', p.jaar, d.alg_district_omschrijving, l.alg_locatie_omschrijving,
            '7. Afhandeling klachten', 0, 0, 0, 0, 0, 0
       FROM (SELECT TO_CHAR (ADD_MONTHS (SYSDATE, (LEVEL - 1) * -12), 'yyyy') jaar FROM DUAL CONNECT BY LEVEL <= 3 ORDER BY 1) p,
            alg_locatie l, alg_district d
      WHERE p.jaar BETWEEN TO_CHAR (l.alg_locatie_aanmaak, 'yyyy') AND TO_CHAR (COALESCE (l.alg_locatie_verwijder, SYSDATE), 'yyyy')
            AND l.alg_district_key = d.alg_district_key
            AND NOT EXISTS (SELECT 1 FROM mldkpi7 WHERE jaar = p.jaar AND cx = l.alg_locatie_omschrijving);

CREATE OR REPLACE VIEW djin_v_rap_dvl_rpdc_org
(
   hide_f_sortering,
   jaar,
   vestiging,
   complex,
   organisatie,
   kpi,
   jan_apr_aantal,
   jan_apr_optijd,
   mei_aug_aantal,
   mei_aug_optijd,
   sep_dec_aantal,
   sep_dec_optijd
)
AS
   WITH mldkpi2 -- Per complex volgens KPI2-tabel de hoge prio meldingen op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 4) periode,
                        '2. Meldingen urgente storingen' kpi,
                        d.alg_district_omschrijving vt, l.alg_locatie_omschrijving cx,
                        a.prs_afdeling_key, a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving org,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        (SELECT *
                           FROM fac_v_aanwezigusrdata
                          WHERE fac_usrtab_key = 201) ud,              -- KPI2
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d,          -- en verwijderde districten!
                        prs_perslid p,
                        prs_afdeling a
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND m.mld_melding_spoed IN (1, 2)     -- Kritisch/Hoog
                        AND TO_CHAR (m.mld_stdmelding_key) = ud.fac_usrdata_code
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND m.prs_perslid_key = p.prs_perslid_key
                        AND p.prs_afdeling_key = a.prs_afdeling_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 4),
                        '2. Meldingen urgente storingen',
                        d.alg_district_omschrijving, l.alg_locatie_omschrijving,
                        a.prs_afdeling_key, a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving),
        mldkpi6 -- Per complex volgens KPI6-tabel de meldingen op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 4) periode,
                        '6. Alle dienstverlening' kpi,
                        d.alg_district_omschrijving vt, l.alg_locatie_omschrijving cx,
                        a.prs_afdeling_key, a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving org,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        (SELECT *
                           FROM fac_v_aanwezigusrdata
                          WHERE fac_usrtab_key = 221) ud,              -- KPI6
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d,          -- en verwijderde districten!
                        prs_perslid p,
                        prs_afdeling a
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND TO_CHAR (m.mld_stdmelding_key) = ud.fac_usrdata_code
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND m.prs_perslid_key = p.prs_perslid_key
                        AND p.prs_afdeling_key = a.prs_afdeling_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 4),
                        '6. Alle dienstverlening',
                        d.alg_district_omschrijving, l.alg_locatie_omschrijving,
                        a.prs_afdeling_key, a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving),
        mldkpi7 -- Per complex onder vakgroep(type)=Klantreacties de Klachten op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 4) periode,
                        '7. Afhandeling klachten' kpi,
                        d.alg_district_omschrijving vt, l.alg_locatie_omschrijving cx,
                        a.prs_afdeling_key, a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving org,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d,          -- en verwijderde districten!
                        prs_perslid p,
                        prs_afdeling a
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND m.mld_stdmelding_key = 23                -- Klacht
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND m.prs_perslid_key = p.prs_perslid_key
                        AND p.prs_afdeling_key = a.prs_afdeling_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 4),
                        '7. Afhandeling klachten',
                        d.alg_district_omschrijving, l.alg_locatie_omschrijving,
                        a.prs_afdeling_key, a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving)
     SELECT jaar || vt || cx || org || '1', jaar, vt, cx, org, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0))))
       FROM mldkpi2
   GROUP BY jaar || vt || cx || org || '1', jaar, vt, cx, org, kpi
   UNION ALL -- Nul-regel voor deze kpi per jaar/vt/cx/org voorkomend in andere kpi's!
     SELECT x.jaar || x.vt || x.cx || x.org || '1', x.jaar, x.vt, x.cx, x.org,
            '2. Meldingen urgente storingen', 0, 0, 0, 0, 0, 0
       FROM (SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi6 UNION SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi7) x
      WHERE NOT EXISTS (SELECT 1 FROM mldkpi2 WHERE jaar = x.jaar AND vt = x.vt AND cx = x.cx AND prs_afdeling_key = x.prs_afdeling_key)
   UNION ALL
     SELECT jaar || vt || cx || org || '2', jaar, vt, cx, org, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0))))
       FROM mldkpi6
   GROUP BY jaar || vt || cx || org || '2', jaar, vt, cx, org, kpi
   UNION ALL -- Nul-regel voor deze kpi per jaar/vt/cx/org voorkomend in andere kpi's!
     SELECT x.jaar || x.vt || x.cx || x.org || '1', x.jaar, x.vt, x.cx, x.org,
            '6. Alle dienstverlening', 0, 0, 0, 0, 0, 0
       FROM (SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi2 UNION SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi7) x
      WHERE NOT EXISTS (SELECT 1 FROM mldkpi6 WHERE jaar = x.jaar AND vt = x.vt AND cx = x.cx AND prs_afdeling_key = x.prs_afdeling_key)
   UNION ALL
     SELECT jaar || vt || cx || org || '3', jaar, vt, cx, org, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0))))
       FROM mldkpi7
   GROUP BY jaar || vt || cx || org || '3', jaar, vt, cx, org, kpi
   UNION ALL -- Nul-regel voor deze kpi per jaar/vt/cx/org voorkomend in andere kpi's!
     SELECT x.jaar || x.vt || x.cx || x.org || '1', x.jaar, x.vt, x.cx, x.org,
            '7. Afhandeling klachten', 0, 0, 0, 0, 0, 0
       FROM (SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi2 UNION SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi6) x
      WHERE NOT EXISTS (SELECT 1 FROM mldkpi7 WHERE jaar = x.jaar AND vt = x.vt AND cx = x.cx AND prs_afdeling_key = x.prs_afdeling_key);

CREATE OR REPLACE VIEW djin_v_rap_dvl_spec_cx
(
   hide_f_sortering,
   jaar,
   vestiging,
   complex,
   kpi,
   jan_feb_aantal,
   jan_feb_optijd,
   mrt_apr_aantal,
   mrt_apr_optijd,
   mei_jun_aantal,
   mei_jun_optijd,
   jul_aug_aantal,
   jul_aug_optijd,
   sep_okt_aantal,
   sep_okt_optijd,
   nov_dec_aantal,
   nov_dec_optijd
)
AS
   WITH mldkpi2 -- Per complex volgens KPI2-tabel de hoge prio meldingen op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2) periode,
                        '2. Meldingen urgente storingen' kpi,
                        d.alg_district_omschrijving vt, l.alg_locatie_omschrijving cx,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        (SELECT *
                           FROM fac_v_aanwezigusrdata
                          WHERE fac_usrtab_key = 201) ud,              -- KPI2
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d           -- en verwijderde districten!
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND m.mld_melding_spoed IN (1, 2)     -- Kritisch/Hoog
                        AND TO_CHAR (m.mld_stdmelding_key) = ud.fac_usrdata_code
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2),
                        '2. Meldingen urgente storingen',
                        d.alg_district_omschrijving, l.alg_locatie_omschrijving),
        mldkpi6 -- Per complex volgens KPI6-tabel de meldingen op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2) periode,
                        '6. Alle dienstverlening' kpi,
                        d.alg_district_omschrijving vt, l.alg_locatie_omschrijving cx,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        (SELECT *
                           FROM fac_v_aanwezigusrdata
                          WHERE fac_usrtab_key = 221) ud,              -- KPI6
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d           -- en verwijderde districten!
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND TO_CHAR (m.mld_stdmelding_key) = ud.fac_usrdata_code
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2),
                        '6. Alle dienstverlening',
                        d.alg_district_omschrijving, l.alg_locatie_omschrijving),
        mldkpi6a -- Per complex volgens KPI6a-tabel de meldingen op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2) periode,
                        '6a. Meldingen gebouwbeheer' kpi,
                        d.alg_district_omschrijving vt, l.alg_locatie_omschrijving cx,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        (SELECT *
                           FROM fac_v_aanwezigusrdata
                          WHERE fac_usrtab_key = 222) ud,            -- KPI6ab
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d           -- en verwijderde districten!
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND TO_CHAR (m.mld_stdmelding_key) = ud.fac_usrdata_code
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2),
                        '6a. Meldingen gebouwbeheer',
                        d.alg_district_omschrijving, l.alg_locatie_omschrijving),
        mldkpi6b -- Per complex volgens KPI6a-tabel de meldingen op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2) periode,
                        '6b. Meldingen gebouwbeheer RVB' kpi,
                        d.alg_district_omschrijving vt, l.alg_locatie_omschrijving cx,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        (SELECT *
                           FROM fac_v_aanwezigusrdata
                          WHERE fac_usrtab_key = 222) ud,            -- KPI6ab
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d,          -- en verwijderde districten!
                        (SELECT DISTINCT o.mld_melding_key
                           FROM mld_v_aanwezigkenmerkopdr ko, mld_opdr o
                          WHERE ko.mld_kenmerk_key = 2 -- Serviceaanvraagnummer
                                AND ko.mld_opdr_key = o.mld_opdr_key) mko
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND TO_CHAR (m.mld_stdmelding_key) = ud.fac_usrdata_code
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND m.mld_melding_key = mko.mld_melding_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2),
                        '6b. Meldingen gebouwbeheer RVB',
                        d.alg_district_omschrijving, l.alg_locatie_omschrijving),
        mldkpi7 -- Per complex onder vakgroep(type)=Klantreacties de Klachten op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2) periode,
                        '7. Afhandeling klachten' kpi,
                        d.alg_district_omschrijving vt, l.alg_locatie_omschrijving cx,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d           -- en verwijderde districten!
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND m.mld_stdmelding_key = 23                -- Klacht
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2),
                        '7. Afhandeling klachten',
                        d.alg_district_omschrijving, l.alg_locatie_omschrijving)
     SELECT jaar || vt || cx || '1', jaar, vt, cx, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0)))),
            SUM (DECODE (periode, 4, totaal, 0)),
            DECODE (SUM (DECODE (periode, 4, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 4, uvoptijd, 0)) / SUM (DECODE (periode, 4, totaal, 0)))),
            SUM (DECODE (periode, 5, totaal, 0)),
            DECODE (SUM (DECODE (periode, 5, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 5, uvoptijd, 0)) / SUM (DECODE (periode, 5, totaal, 0)))),
            SUM (DECODE (periode, 6, totaal, 0)),
            DECODE (SUM (DECODE (periode, 6, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 6, uvoptijd, 0)) / SUM (DECODE (periode, 6, totaal, 0))))
       FROM mldkpi2
   GROUP BY jaar || vt || cx || '1', jaar, vt, cx, kpi
   UNION ALL      -- Nul-regel voor deze kpi per jaar/vt/cx zonder voorkomens!
     SELECT p.jaar || d.alg_district_omschrijving || l.alg_locatie_omschrijving || '1', p.jaar, d.alg_district_omschrijving, l.alg_locatie_omschrijving,
            '2. Meldingen urgente storingen', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
       FROM (SELECT TO_CHAR (ADD_MONTHS (SYSDATE, (LEVEL - 1) * -12), 'yyyy') jaar FROM DUAL CONNECT BY LEVEL <= 3 ORDER BY 1) p,
            alg_locatie l, alg_district d
      WHERE p.jaar BETWEEN TO_CHAR (l.alg_locatie_aanmaak, 'yyyy') AND TO_CHAR (COALESCE (l.alg_locatie_verwijder, SYSDATE), 'yyyy')
            AND l.alg_district_key = d.alg_district_key
            AND NOT EXISTS (SELECT 1 FROM mldkpi2 WHERE jaar = p.jaar AND cx = l.alg_locatie_omschrijving)
   UNION ALL
     SELECT jaar || vt || cx || '2', jaar, vt, cx, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0)))),
            SUM (DECODE (periode, 4, totaal, 0)),
            DECODE (SUM (DECODE (periode, 4, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 4, uvoptijd, 0)) / SUM (DECODE (periode, 4, totaal, 0)))),
            SUM (DECODE (periode, 5, totaal, 0)),
            DECODE (SUM (DECODE (periode, 5, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 5, uvoptijd, 0)) / SUM (DECODE (periode, 5, totaal, 0)))),
            SUM (DECODE (periode, 6, totaal, 0)),
            DECODE (SUM (DECODE (periode, 6, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 6, uvoptijd, 0)) / SUM (DECODE (periode, 6, totaal, 0))))
       FROM mldkpi6
   GROUP BY jaar || vt || cx || '2', jaar, vt, cx, kpi
   UNION ALL      -- Nul-regel voor deze kpi per jaar/vt/cx zonder voorkomens!
     SELECT p.jaar || d.alg_district_omschrijving || l.alg_locatie_omschrijving || '2', p.jaar, d.alg_district_omschrijving, l.alg_locatie_omschrijving,
            '6. Alle dienstverlening', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
       FROM (SELECT TO_CHAR (ADD_MONTHS (SYSDATE, (LEVEL - 1) * -12), 'yyyy') jaar FROM DUAL CONNECT BY LEVEL <= 3 ORDER BY 1) p,
            alg_locatie l, alg_district d
      WHERE p.jaar BETWEEN TO_CHAR (l.alg_locatie_aanmaak, 'yyyy') AND TO_CHAR (COALESCE (l.alg_locatie_verwijder, SYSDATE), 'yyyy')
            AND l.alg_district_key = d.alg_district_key
            AND NOT EXISTS (SELECT 1 FROM mldkpi6 WHERE jaar = p.jaar AND cx = l.alg_locatie_omschrijving)
   UNION ALL
     SELECT jaar || vt || cx || '3', jaar, vt, cx, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0)))),
            SUM (DECODE (periode, 4, totaal, 0)),
            DECODE (SUM (DECODE (periode, 4, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 4, uvoptijd, 0)) / SUM (DECODE (periode, 4, totaal, 0)))),
            SUM (DECODE (periode, 5, totaal, 0)),
            DECODE (SUM (DECODE (periode, 5, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 5, uvoptijd, 0)) / SUM (DECODE (periode, 5, totaal, 0)))),
            SUM (DECODE (periode, 6, totaal, 0)),
            DECODE (SUM (DECODE (periode, 6, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 6, uvoptijd, 0)) / SUM (DECODE (periode, 6, totaal, 0))))
       FROM mldkpi6a
   GROUP BY jaar || vt || cx || '3', jaar, vt, cx, kpi
   UNION ALL      -- Nul-regel voor deze kpi per jaar/vt/cx zonder voorkomens!
     SELECT p.jaar || d.alg_district_omschrijving || l.alg_locatie_omschrijving || '3', p.jaar, d.alg_district_omschrijving, l.alg_locatie_omschrijving,
            '6a. Meldingen gebouwbeheer', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
       FROM (SELECT TO_CHAR (ADD_MONTHS (SYSDATE, (LEVEL - 1) * -12), 'yyyy') jaar FROM DUAL CONNECT BY LEVEL <= 3 ORDER BY 1) p,
            alg_locatie l, alg_district d
      WHERE p.jaar BETWEEN TO_CHAR (l.alg_locatie_aanmaak, 'yyyy') AND TO_CHAR (COALESCE (l.alg_locatie_verwijder, SYSDATE), 'yyyy')
            AND l.alg_district_key = d.alg_district_key
            AND NOT EXISTS (SELECT 1 FROM mldkpi6a WHERE jaar = p.jaar AND cx = l.alg_locatie_omschrijving)
   UNION ALL
     SELECT jaar || vt || cx || '4', jaar, vt, cx, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0)))),
            SUM (DECODE (periode, 4, totaal, 0)),
            DECODE (SUM (DECODE (periode, 4, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 4, uvoptijd, 0)) / SUM (DECODE (periode, 4, totaal, 0)))),
            SUM (DECODE (periode, 5, totaal, 0)),
            DECODE (SUM (DECODE (periode, 5, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 5, uvoptijd, 0)) / SUM (DECODE (periode, 5, totaal, 0)))),
            SUM (DECODE (periode, 6, totaal, 0)),
            DECODE (SUM (DECODE (periode, 6, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 6, uvoptijd, 0)) / SUM (DECODE (periode, 6, totaal, 0))))
       FROM mldkpi6b
   GROUP BY jaar || vt || cx || '4', jaar, vt, cx, kpi
   UNION ALL      -- Nul-regel voor deze kpi per jaar/vt/cx zonder voorkomens!
     SELECT p.jaar || d.alg_district_omschrijving || l.alg_locatie_omschrijving || '4', p.jaar, d.alg_district_omschrijving, l.alg_locatie_omschrijving,
            '6b. Meldingen gebouwbeheer RVB', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
       FROM (SELECT TO_CHAR (ADD_MONTHS (SYSDATE, (LEVEL - 1) * -12), 'yyyy') jaar FROM DUAL CONNECT BY LEVEL <= 3 ORDER BY 1) p,
            alg_locatie l, alg_district d
      WHERE p.jaar BETWEEN TO_CHAR (l.alg_locatie_aanmaak, 'yyyy') AND TO_CHAR (COALESCE (l.alg_locatie_verwijder, SYSDATE), 'yyyy')
            AND l.alg_district_key = d.alg_district_key
            AND NOT EXISTS (SELECT 1 FROM mldkpi6b WHERE jaar = p.jaar AND cx = l.alg_locatie_omschrijving)
   UNION ALL
     SELECT jaar || vt || cx || '5', jaar, vt, cx, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0)))),
            SUM (DECODE (periode, 4, totaal, 0)),
            DECODE (SUM (DECODE (periode, 4, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 4, uvoptijd, 0)) / SUM (DECODE (periode, 4, totaal, 0)))),
            SUM (DECODE (periode, 5, totaal, 0)),
            DECODE (SUM (DECODE (periode, 5, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 5, uvoptijd, 0)) / SUM (DECODE (periode, 5, totaal, 0)))),
            SUM (DECODE (periode, 6, totaal, 0)),
            DECODE (SUM (DECODE (periode, 6, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 6, uvoptijd, 0)) / SUM (DECODE (periode, 6, totaal, 0))))
       FROM mldkpi7
   GROUP BY jaar || vt || cx || '5', jaar, vt, cx, kpi
   UNION ALL      -- Nul-regel voor deze kpi per jaar/vt/cx zonder voorkomens!
     SELECT p.jaar || d.alg_district_omschrijving || l.alg_locatie_omschrijving || '5', p.jaar, d.alg_district_omschrijving, l.alg_locatie_omschrijving,
            '7. Afhandeling klachten', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
       FROM (SELECT TO_CHAR (ADD_MONTHS (SYSDATE, (LEVEL - 1) * -12), 'yyyy') jaar FROM DUAL CONNECT BY LEVEL <= 3 ORDER BY 1) p,
            alg_locatie l, alg_district d
      WHERE p.jaar BETWEEN TO_CHAR (l.alg_locatie_aanmaak, 'yyyy') AND TO_CHAR (COALESCE (l.alg_locatie_verwijder, SYSDATE), 'yyyy')
            AND l.alg_district_key = d.alg_district_key
            AND NOT EXISTS (SELECT 1 FROM mldkpi7 WHERE jaar = p.jaar AND cx = l.alg_locatie_omschrijving);

CREATE OR REPLACE VIEW djin_v_rap_dvl_spec_org
(
   hide_f_sortering,
   jaar,
   vestiging,
   complex,
   organisatie,
   kpi,
   jan_feb_aantal,
   jan_feb_optijd,
   mrt_apr_aantal,
   mrt_apr_optijd,
   mei_jun_aantal,
   mei_jun_optijd,
   jul_aug_aantal,
   jul_aug_optijd,
   sep_okt_aantal,
   sep_okt_optijd,
   nov_dec_aantal,
   nov_dec_optijd
)
AS
   WITH mldkpi2 -- Per complex volgens KPI2-tabel de hoge prio meldingen op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2) periode,
                        '2. Meldingen urgente storingen' kpi,
                        d.alg_district_omschrijving vt, l.alg_locatie_omschrijving cx,
                        a.prs_afdeling_key, a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving org,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        (SELECT *
                           FROM fac_v_aanwezigusrdata
                          WHERE fac_usrtab_key = 201) ud,              -- KPI2
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d,          -- en verwijderde districten!
                        prs_perslid p,
                        prs_afdeling a
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND m.mld_melding_spoed IN (1, 2)     -- Kritisch/Hoog
                        AND TO_CHAR (m.mld_stdmelding_key) = ud.fac_usrdata_code
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND m.prs_perslid_key = p.prs_perslid_key
                        AND p.prs_afdeling_key = a.prs_afdeling_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2),
                        '2. Meldingen urgente storingen',
                        d.alg_district_omschrijving, l.alg_locatie_omschrijving,
                        a.prs_afdeling_key, a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving),
        mldkpi6 -- Per complex volgens KPI6-tabel de meldingen op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2) periode,
                        '6. Alle dienstverlening' kpi,
                        d.alg_district_omschrijving vt, l.alg_locatie_omschrijving cx,
                        a.prs_afdeling_key, a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving org,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        (SELECT *
                           FROM fac_v_aanwezigusrdata
                          WHERE fac_usrtab_key = 221) ud,              -- KPI6
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d,          -- en verwijderde districten!
                        prs_perslid p,
                        prs_afdeling a
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND TO_CHAR (m.mld_stdmelding_key) = ud.fac_usrdata_code
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND m.prs_perslid_key = p.prs_perslid_key
                        AND p.prs_afdeling_key = a.prs_afdeling_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2),
                        '6. Alle dienstverlening',
                        d.alg_district_omschrijving, l.alg_locatie_omschrijving,
                        a.prs_afdeling_key, a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving),
        mldkpi6a -- Per complex volgens KPI6a-tabel de meldingen op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2) periode,
                        '6a. Meldingen gebouwbeheer' kpi,
                        d.alg_district_omschrijving vt, l.alg_locatie_omschrijving cx,
                        a.prs_afdeling_key, a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving org,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        (SELECT *
                           FROM fac_v_aanwezigusrdata
                          WHERE fac_usrtab_key = 222) ud,            -- KPI6ab
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d,          -- en verwijderde districten!
                        prs_perslid p,
                        prs_afdeling a
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND TO_CHAR (m.mld_stdmelding_key) = ud.fac_usrdata_code
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND m.prs_perslid_key = p.prs_perslid_key
                        AND p.prs_afdeling_key = a.prs_afdeling_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2),
                        '6a. Meldingen gebouwbeheer',
                        d.alg_district_omschrijving, l.alg_locatie_omschrijving,
                        a.prs_afdeling_key, a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving),
        mldkpi6b -- Per complex volgens KPI6b-tabel de meldingen op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2) periode,
                        '6b. Meldingen gebouwbeheer RVB' kpi,
                        d.alg_district_omschrijving vt, l.alg_locatie_omschrijving cx,
                        a.prs_afdeling_key, a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving org,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        (SELECT *
                           FROM fac_v_aanwezigusrdata
                          WHERE fac_usrtab_key = 222) ud,            -- KPI6ab
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d,          -- en verwijderde districten!
                        prs_perslid p,
                        prs_afdeling a,
                        (SELECT DISTINCT o.mld_melding_key
                           FROM mld_v_aanwezigkenmerkopdr ko, mld_opdr o
                          WHERE ko.mld_kenmerk_key = 2 -- Serviceaanvraagnummer
                                AND ko.mld_opdr_key = o.mld_opdr_key) mko
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND TO_CHAR (m.mld_stdmelding_key) = ud.fac_usrdata_code
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND m.prs_perslid_key = p.prs_perslid_key
                        AND p.prs_afdeling_key = a.prs_afdeling_key
                        AND m.mld_melding_key = mko.mld_melding_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2),
                        '6b. Meldingen gebouwbeheer RVB',
                        d.alg_district_omschrijving, l.alg_locatie_omschrijving,
                        a.prs_afdeling_key, a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving),
        mldkpi7 -- Per complex onder vakgroep(type)=Klantreacties de Klachten op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2) periode,
                        '7. Afhandeling klachten' kpi,
                        d.alg_district_omschrijving vt, l.alg_locatie_omschrijving cx,
                        a.prs_afdeling_key, a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving org,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d,          -- en verwijderde districten!
                        prs_perslid p,
                        prs_afdeling a
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND m.mld_stdmelding_key = 23                -- Klacht
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND m.prs_perslid_key = p.prs_perslid_key
                        AND p.prs_afdeling_key = a.prs_afdeling_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2),
                        '7. Afhandeling klachten',
                        d.alg_district_omschrijving, l.alg_locatie_omschrijving,
                        a.prs_afdeling_key, a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving)
     SELECT jaar || vt || cx || org || '1', jaar, vt, cx, org, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0)))),
            SUM (DECODE (periode, 4, totaal, 0)),
            DECODE (SUM (DECODE (periode, 4, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 4, uvoptijd, 0)) / SUM (DECODE (periode, 4, totaal, 0)))),
            SUM (DECODE (periode, 5, totaal, 0)),
            DECODE (SUM (DECODE (periode, 5, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 5, uvoptijd, 0)) / SUM (DECODE (periode, 5, totaal, 0)))),
            SUM (DECODE (periode, 6, totaal, 0)),
            DECODE (SUM (DECODE (periode, 6, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 6, uvoptijd, 0)) / SUM (DECODE (periode, 6, totaal, 0))))
       FROM mldkpi2
   GROUP BY jaar || vt || cx || org || '1', jaar, vt, cx, org, kpi
   UNION ALL -- Nul-regel voor deze kpi per jaar/vt/cx/org voorkomend in andere kpi's!
     SELECT x.jaar || x.vt || x.cx || x.org || '1', x.jaar, x.vt, x.cx, x.org,
            '2. Meldingen urgente storingen', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
       FROM (SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi6
             UNION
             SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi6a
             UNION
             SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi6b
             UNION
             SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi7) x
      WHERE NOT EXISTS (SELECT 1 FROM mldkpi2 WHERE jaar = x.jaar AND vt = x.vt AND cx = x.cx AND prs_afdeling_key = x.prs_afdeling_key)
   UNION ALL
     SELECT jaar || vt || cx || org || '2', jaar, vt, cx, org, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0)))),
            SUM (DECODE (periode, 4, totaal, 0)),
            DECODE (SUM (DECODE (periode, 4, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 4, uvoptijd, 0)) / SUM (DECODE (periode, 4, totaal, 0)))),
            SUM (DECODE (periode, 5, totaal, 0)),
            DECODE (SUM (DECODE (periode, 5, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 5, uvoptijd, 0)) / SUM (DECODE (periode, 5, totaal, 0)))),
            SUM (DECODE (periode, 6, totaal, 0)),
            DECODE (SUM (DECODE (periode, 6, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 6, uvoptijd, 0)) / SUM (DECODE (periode, 6, totaal, 0))))
       FROM mldkpi6
   GROUP BY jaar || vt || cx || org || '2', jaar, vt, cx, org, kpi
   UNION ALL -- Nul-regel voor deze kpi per jaar/vt/cx/org voorkomend in andere kpi's!
     SELECT x.jaar || x.vt || x.cx || x.org || '2', x.jaar, x.vt, x.cx, x.org,
            '6. Alle dienstverlening', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
       FROM (SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi2
             UNION
             SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi6a
             UNION
             SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi6b
             UNION
             SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi7) x
      WHERE NOT EXISTS (SELECT 1 FROM mldkpi6 WHERE jaar = x.jaar AND vt = x.vt AND cx = x.cx AND prs_afdeling_key = x.prs_afdeling_key)
   UNION ALL
     SELECT jaar || vt || cx || org || '3', jaar, vt, cx, org, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0)))),
            SUM (DECODE (periode, 4, totaal, 0)),
            DECODE (SUM (DECODE (periode, 4, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 4, uvoptijd, 0)) / SUM (DECODE (periode, 4, totaal, 0)))),
            SUM (DECODE (periode, 5, totaal, 0)),
            DECODE (SUM (DECODE (periode, 5, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 5, uvoptijd, 0)) / SUM (DECODE (periode, 5, totaal, 0)))),
            SUM (DECODE (periode, 6, totaal, 0)),
            DECODE (SUM (DECODE (periode, 6, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 6, uvoptijd, 0)) / SUM (DECODE (periode, 6, totaal, 0))))
       FROM mldkpi6a
   GROUP BY jaar || vt || cx || org || '3', jaar, vt, cx, org, kpi
   UNION ALL -- Nul-regel voor deze kpi per jaar/vt/cx/org voorkomend in andere kpi's!
     SELECT x.jaar || x.vt || x.cx || x.org || '3', x.jaar, x.vt, x.cx, x.org,
            '6a. Meldingen gebouwbeheer', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
       FROM (SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi2
             UNION
             SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi6
             UNION
             SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi6b
             UNION
             SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi7) x
      WHERE NOT EXISTS (SELECT 1 FROM mldkpi6a WHERE jaar = x.jaar AND vt = x.vt AND cx = x.cx AND prs_afdeling_key = x.prs_afdeling_key)
   UNION ALL
     SELECT jaar || vt || cx || org || '4', jaar, vt, cx, org, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0)))),
            SUM (DECODE (periode, 4, totaal, 0)),
            DECODE (SUM (DECODE (periode, 4, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 4, uvoptijd, 0)) / SUM (DECODE (periode, 4, totaal, 0)))),
            SUM (DECODE (periode, 5, totaal, 0)),
            DECODE (SUM (DECODE (periode, 5, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 5, uvoptijd, 0)) / SUM (DECODE (periode, 5, totaal, 0)))),
            SUM (DECODE (periode, 6, totaal, 0)),
            DECODE (SUM (DECODE (periode, 6, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 6, uvoptijd, 0)) / SUM (DECODE (periode, 6, totaal, 0))))
       FROM mldkpi6b
   GROUP BY jaar || vt || cx || org || '4', jaar, vt, cx, org, kpi
   UNION ALL -- Nul-regel voor deze kpi per jaar/vt/cx/org voorkomend in andere kpi's!
     SELECT x.jaar || x.vt || x.cx || x.org || '4', x.jaar, x.vt, x.cx, x.org,
            '6b. Meldingen gebouwbeheer RVB', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
       FROM (SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi2
             UNION
             SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi6
             UNION
             SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi6a
             UNION
             SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi7) x
      WHERE NOT EXISTS (SELECT 1 FROM mldkpi6b WHERE jaar = x.jaar AND vt = x.vt AND cx = x.cx AND prs_afdeling_key = x.prs_afdeling_key)
   UNION ALL
     SELECT jaar || vt || cx || org || '5', jaar, vt, cx, org, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0)))),
            SUM (DECODE (periode, 4, totaal, 0)),
            DECODE (SUM (DECODE (periode, 4, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 4, uvoptijd, 0)) / SUM (DECODE (periode, 4, totaal, 0)))),
            SUM (DECODE (periode, 5, totaal, 0)),
            DECODE (SUM (DECODE (periode, 5, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 5, uvoptijd, 0)) / SUM (DECODE (periode, 5, totaal, 0)))),
            SUM (DECODE (periode, 6, totaal, 0)),
            DECODE (SUM (DECODE (periode, 6, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 6, uvoptijd, 0)) / SUM (DECODE (periode, 6, totaal, 0))))
       FROM mldkpi7
   GROUP BY jaar || vt || cx || org || '5', jaar, vt, cx, org, kpi
   UNION ALL -- Nul-regel voor deze kpi per jaar/vt/cx/org voorkomend in andere kpi's!
     SELECT x.jaar || x.vt || x.cx || x.org || '5', x.jaar, x.vt, x.cx, x.org,
            '7. Afhandeling klachten', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
       FROM (SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi2
             UNION
             SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi6
             UNION
             SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi6a
             UNION
             SELECT jaar, vt, cx, prs_afdeling_key, org FROM mldkpi6b) x
      WHERE NOT EXISTS (SELECT 1 FROM mldkpi7 WHERE jaar = x.jaar AND vt = x.vt AND cx = x.cx AND prs_afdeling_key = x.prs_afdeling_key);

CREATE OR REPLACE VIEW djin_v_rap_dvl_spec_vt
(
   hide_f_sortering,
   jaar,
   vestiging,
   kpi,
   jan_feb_aantal,
   jan_feb_optijd,
   mrt_apr_aantal,
   mrt_apr_optijd,
   mei_jun_aantal,
   mei_jun_optijd,
   jul_aug_aantal,
   jul_aug_optijd,
   sep_okt_aantal,
   sep_okt_optijd,
   nov_dec_aantal,
   nov_dec_optijd
)
AS
   WITH mldkpi2 -- Per complex volgens KPI2-tabel de hoge prio meldingen op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2) periode,
                        '2. Meldingen urgente storingen' kpi,
                        d.alg_district_omschrijving vt,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        (SELECT *
                           FROM fac_v_aanwezigusrdata
                          WHERE fac_usrtab_key = 201) ud,              -- KPI2
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d           -- en verwijderde districten!
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND m.mld_melding_spoed IN (1, 2)     -- Kritisch/Hoog
                        AND TO_CHAR (m.mld_stdmelding_key) = ud.fac_usrdata_code
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2),
                        '2. Meldingen urgente storingen',
                        d.alg_district_omschrijving),
        mldkpi6 -- Per complex volgens KPI6-tabel de meldingen op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2) periode,
                        '6. Alle dienstverlening' kpi,
                        d.alg_district_omschrijving vt,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        (SELECT *
                           FROM fac_v_aanwezigusrdata
                          WHERE fac_usrtab_key = 221) ud,              -- KPI6
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d           -- en verwijderde districten!
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND TO_CHAR (m.mld_stdmelding_key) = ud.fac_usrdata_code
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2),
                        '6. Alle dienstverlening',
                        d.alg_district_omschrijving),
        mldkpi6a -- Per complex volgens KPI6a-tabel de meldingen op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2) periode,
                        '6a. Meldingen gebouwbeheer' kpi,
                        d.alg_district_omschrijving vt,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        (SELECT *
                           FROM fac_v_aanwezigusrdata
                          WHERE fac_usrtab_key = 222) ud,            -- KPI6ab
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d           -- en verwijderde districten!
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND TO_CHAR (m.mld_stdmelding_key) = ud.fac_usrdata_code
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2),
                        '6a. Meldingen gebouwbeheer',
                        d.alg_district_omschrijving),
        mldkpi6b -- Per complex volgens KPI6a-tabel de meldingen op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2) periode,
                        '6b. Meldingen gebouwbeheer RVB' kpi,
                        d.alg_district_omschrijving vt,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        (SELECT *
                           FROM fac_v_aanwezigusrdata
                          WHERE fac_usrtab_key = 222) ud,            -- KPI6ab
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d,          -- en verwijderde districten!
                        (SELECT DISTINCT o.mld_melding_key
                           FROM mld_v_aanwezigkenmerkopdr ko, mld_opdr o
                          WHERE ko.mld_kenmerk_key = 2 -- Serviceaanvraagnummer
                                AND ko.mld_opdr_key = o.mld_opdr_key) mko
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND TO_CHAR (m.mld_stdmelding_key) = ud.fac_usrdata_code
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
                        AND m.mld_melding_key = mko.mld_melding_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2),
                        '6b. Meldingen gebouwbeheer RVB',
                        d.alg_district_omschrijving),
        mldkpi7 -- Per complex onder vakgroep(type)=Klantreacties de Klachten op MLDAFM-tijd muv. vervolgmeldingen!
           AS (  SELECT TO_CHAR (t.fac_tracking_datum, 'yyyy') jaar,
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2) periode,
                        '7. Afhandeling klachten' kpi,
                        d.alg_district_omschrijving vt,
                        COUNT ( * ) totaal,
                        SUM (DECODE (SIGN (m.mld_melding_einddatum_std - TRUNC (t.fac_tracking_datum, 'mi')), -1, 0, 1))
                           uvoptijd
                   FROM fac_tracking t,
                        mld_melding m,
                        alg_locatie l,             -- Ook verwijderde locaties
                        alg_district d           -- en verwijderde districten!
                  WHERE t.fac_srtnotificatie_key = 38                -- MLDAFM
                        AND t.fac_tracking_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                        AND t.fac_tracking_refkey = m.mld_melding_key
                        --AND m.mld_melding_status IN (5, 6) -- Afgemeld/Verwerkt
                        AND m.mld_melding_start_key IS NULL -- Muv. vervolgmeldingen
                        AND m.mld_stdmelding_key = 23                -- Klacht
                        AND m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = d.alg_district_key
               GROUP BY TO_CHAR (t.fac_tracking_datum, 'yyyy'),
                        CEIL (fac.safe_to_number (TO_CHAR (t.fac_tracking_datum, 'mm')) / 2),
                        '7. Afhandeling klachten',
                        d.alg_district_omschrijving)
     SELECT jaar || vt || '1', jaar, vt, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0)))),
            SUM (DECODE (periode, 4, totaal, 0)),
            DECODE (SUM (DECODE (periode, 4, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 4, uvoptijd, 0)) / SUM (DECODE (periode, 4, totaal, 0)))),
            SUM (DECODE (periode, 5, totaal, 0)),
            DECODE (SUM (DECODE (periode, 5, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 5, uvoptijd, 0)) / SUM (DECODE (periode, 5, totaal, 0)))),
            SUM (DECODE (periode, 6, totaal, 0)),
            DECODE (SUM (DECODE (periode, 6, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 6, uvoptijd, 0)) / SUM (DECODE (periode, 6, totaal, 0))))
       FROM mldkpi2
   GROUP BY jaar || vt || '1', jaar, vt, kpi
   UNION ALL         -- Nul-regel voor deze kpi per jaar/vt zonder voorkomens!
     SELECT p.jaar || d.alg_district_omschrijving || '1', p.jaar, d.alg_district_omschrijving,
            '2. Meldingen urgente storingen', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
       FROM (SELECT TO_CHAR (ADD_MONTHS (SYSDATE, (LEVEL - 1) * -12), 'yyyy') jaar FROM DUAL CONNECT BY LEVEL <= 3 ORDER BY 1) p,
            alg_locatie l, alg_district d
      WHERE p.jaar BETWEEN TO_CHAR (l.alg_locatie_aanmaak, 'yyyy') AND TO_CHAR (COALESCE (l.alg_locatie_verwijder, SYSDATE), 'yyyy')
            AND l.alg_district_key = d.alg_district_key
            AND NOT EXISTS (SELECT 1 FROM mldkpi2 WHERE jaar = p.jaar AND vt = d.alg_district_omschrijving)
   UNION ALL
     SELECT jaar || vt || '2', jaar, vt, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0)))),
            SUM (DECODE (periode, 4, totaal, 0)),
            DECODE (SUM (DECODE (periode, 4, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 4, uvoptijd, 0)) / SUM (DECODE (periode, 4, totaal, 0)))),
            SUM (DECODE (periode, 5, totaal, 0)),
            DECODE (SUM (DECODE (periode, 5, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 5, uvoptijd, 0)) / SUM (DECODE (periode, 5, totaal, 0)))),
            SUM (DECODE (periode, 6, totaal, 0)),
            DECODE (SUM (DECODE (periode, 6, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 6, uvoptijd, 0)) / SUM (DECODE (periode, 6, totaal, 0))))
       FROM mldkpi6
   GROUP BY jaar || vt || '2', jaar, vt, kpi
   UNION ALL         -- Nul-regel voor deze kpi per jaar/vt zonder voorkomens!
     SELECT p.jaar || d.alg_district_omschrijving || '2', p.jaar, d.alg_district_omschrijving,
            '6. Alle dienstverlening', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
       FROM (SELECT TO_CHAR (ADD_MONTHS (SYSDATE, (LEVEL - 1) * -12), 'yyyy') jaar FROM DUAL CONNECT BY LEVEL <= 3 ORDER BY 1) p,
            alg_locatie l, alg_district d
      WHERE p.jaar BETWEEN TO_CHAR (l.alg_locatie_aanmaak, 'yyyy') AND TO_CHAR (COALESCE (l.alg_locatie_verwijder, SYSDATE), 'yyyy')
            AND l.alg_district_key = d.alg_district_key
            AND NOT EXISTS (SELECT 1 FROM mldkpi6 WHERE jaar = p.jaar AND vt = d.alg_district_omschrijving)
   UNION ALL
     SELECT jaar || vt || '3', jaar, vt, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0)))),
            SUM (DECODE (periode, 4, totaal, 0)),
            DECODE (SUM (DECODE (periode, 4, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 4, uvoptijd, 0)) / SUM (DECODE (periode, 4, totaal, 0)))),
            SUM (DECODE (periode, 5, totaal, 0)),
            DECODE (SUM (DECODE (periode, 5, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 5, uvoptijd, 0)) / SUM (DECODE (periode, 5, totaal, 0)))),
            SUM (DECODE (periode, 6, totaal, 0)),
            DECODE (SUM (DECODE (periode, 6, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 6, uvoptijd, 0)) / SUM (DECODE (periode, 6, totaal, 0))))
       FROM mldkpi6a
   GROUP BY jaar || vt || '3', jaar, vt, kpi
   UNION ALL         -- Nul-regel voor deze kpi per jaar/vt zonder voorkomens!
     SELECT p.jaar || d.alg_district_omschrijving || '3', p.jaar, d.alg_district_omschrijving,
            '6a. Meldingen gebouwbeheer', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
       FROM (SELECT TO_CHAR (ADD_MONTHS (SYSDATE, (LEVEL - 1) * -12), 'yyyy') jaar FROM DUAL CONNECT BY LEVEL <= 3 ORDER BY 1) p,
            alg_locatie l, alg_district d
      WHERE p.jaar BETWEEN TO_CHAR (l.alg_locatie_aanmaak, 'yyyy') AND TO_CHAR (COALESCE (l.alg_locatie_verwijder, SYSDATE), 'yyyy')
            AND l.alg_district_key = d.alg_district_key
            AND NOT EXISTS (SELECT 1 FROM mldkpi6a WHERE jaar = p.jaar AND vt = d.alg_district_omschrijving)
   UNION ALL
     SELECT jaar || vt || '4', jaar, vt, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0)))),
            SUM (DECODE (periode, 4, totaal, 0)),
            DECODE (SUM (DECODE (periode, 4, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 4, uvoptijd, 0)) / SUM (DECODE (periode, 4, totaal, 0)))),
            SUM (DECODE (periode, 5, totaal, 0)),
            DECODE (SUM (DECODE (periode, 5, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 5, uvoptijd, 0)) / SUM (DECODE (periode, 5, totaal, 0)))),
            SUM (DECODE (periode, 6, totaal, 0)),
            DECODE (SUM (DECODE (periode, 6, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 6, uvoptijd, 0)) / SUM (DECODE (periode, 6, totaal, 0))))
       FROM mldkpi6b
   GROUP BY jaar || vt || '4', jaar, vt, kpi
   UNION ALL         -- Nul-regel voor deze kpi per jaar/vt zonder voorkomens!
     SELECT p.jaar || d.alg_district_omschrijving || '4', p.jaar, d.alg_district_omschrijving,
            '6b. Meldingen gebouwbeheer RVB', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
       FROM (SELECT TO_CHAR (ADD_MONTHS (SYSDATE, (LEVEL - 1) * -12), 'yyyy') jaar FROM DUAL CONNECT BY LEVEL <= 3 ORDER BY 1) p,
            alg_locatie l, alg_district d
      WHERE p.jaar BETWEEN TO_CHAR (l.alg_locatie_aanmaak, 'yyyy') AND TO_CHAR (COALESCE (l.alg_locatie_verwijder, SYSDATE), 'yyyy')
            AND l.alg_district_key = d.alg_district_key
            AND NOT EXISTS (SELECT 1 FROM mldkpi6b WHERE jaar = p.jaar AND vt = d.alg_district_omschrijving)
   UNION ALL
     SELECT jaar || vt || '5', jaar, vt, kpi,
            SUM (DECODE (periode, 1, totaal, 0)),
            DECODE (SUM (DECODE (periode, 1, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 1, uvoptijd, 0)) / SUM (DECODE (periode, 1, totaal, 0)))),
            SUM (DECODE (periode, 2, totaal, 0)),
            DECODE (SUM (DECODE (periode, 2, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 2, uvoptijd, 0)) / SUM (DECODE (periode, 2, totaal, 0)))),
            SUM (DECODE (periode, 3, totaal, 0)),
            DECODE (SUM (DECODE (periode, 3, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 3, uvoptijd, 0)) / SUM (DECODE (periode, 3, totaal, 0)))),
            SUM (DECODE (periode, 4, totaal, 0)),
            DECODE (SUM (DECODE (periode, 4, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 4, uvoptijd, 0)) / SUM (DECODE (periode, 4, totaal, 0)))),
            SUM (DECODE (periode, 5, totaal, 0)),
            DECODE (SUM (DECODE (periode, 5, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 5, uvoptijd, 0)) / SUM (DECODE (periode, 5, totaal, 0)))),
            SUM (DECODE (periode, 6, totaal, 0)),
            DECODE (SUM (DECODE (periode, 6, totaal, 0)), 0, 0, ROUND (100 * SUM (DECODE (periode, 6, uvoptijd, 0)) / SUM (DECODE (periode, 6, totaal, 0))))
       FROM mldkpi7
   GROUP BY jaar || vt || '5', jaar, vt, kpi
   UNION ALL         -- Nul-regel voor deze kpi per jaar/vt zonder voorkomens!
     SELECT p.jaar || d.alg_district_omschrijving || '5', p.jaar, d.alg_district_omschrijving,
            '7. Afhandeling klachten', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
       FROM (SELECT TO_CHAR (ADD_MONTHS (SYSDATE, (LEVEL - 1) * -12), 'yyyy') jaar FROM DUAL CONNECT BY LEVEL <= 3 ORDER BY 1) p,
            alg_locatie l, alg_district d
      WHERE p.jaar BETWEEN TO_CHAR (l.alg_locatie_aanmaak, 'yyyy') AND TO_CHAR (COALESCE (l.alg_locatie_verwijder, SYSDATE), 'yyyy')
            AND l.alg_district_key = d.alg_district_key
            AND NOT EXISTS (SELECT 1 FROM mldkpi7 WHERE jaar = p.jaar AND vt = d.alg_district_omschrijving);

-- DJIN#55341: Te laat afgemelde meldingen
CREATE OR REPLACE VIEW djin_v_rap_mld_telaat
(
   mld_melding_key,
   organisatie,
   vestiging,
   complex,
   clusteroms,
   gebouwcode,
   gebouwnaam,
   verdieping,
   ruimtenr,
   ruimteoms,
   mldord_id,
   vakgroeptype,
   vakgroep,
   melding,
   behandelaar,
   servicenr,
   leverancier,
   ref_leverancier,
   mldnew,
   mldacp,
   ordnew,
   ordafm,
   mldafm,
   mldacp_sla,
   mldacp_uvtijd,
   mldacp_telaat,
   mldafm_sla,
   mldafm_uvtijd,
   mldafm_telaat,
   melder,
   onderwerp,
   omschrijving,
   afhandeling                                   -- Opdracht (indien aanwezig)
)
AS
   WITH kantoortijden
           AS (SELECT fac.safe_to_number (fac.getsetting ('fac_t_endofworkday')) - fac.safe_to_number (fac.getsetting ('fac_t_startofworkday')) uren
                 FROM DUAL),
        mldkpi6 -- Per complex volgens KPI6-tabel de gesloten meldingen muv. vervolgmeldingen!
           AS (SELECT m.mld_melding_key, m.mld_stdmelding_key,
                      m.prs_perslid_key, m.mld_melding_behandelaar_key,
                      m.mld_alg_locatie_key, m.mld_alg_onroerendgoed_keys,
                      m.mld_melding_onderwerp, m.mld_melding_omschrijving,
                      m.mld_melding_kto_key,
                      m.mld_melding_t_accepttijd, m.mld_melding_acceptdatum_std,
                      m.mld_melding_t_uitvoertijd, m.mld_melding_einddatum_std,
                      --fac.datumtijdnaaruitvoertijd (fac.gettrackingdate ('MLDNEW', m.mld_melding_key), fac.gettrackingdate ('MLDACP', m.mld_melding_key), 'U').tijdsduur mldacpuvt,
                      --fac.datumtijdnaaruitvoertijd (m.mld_melding_acceptdatum_std, fac.gettrackingdate ('MLDACP', m.mld_melding_key), 'U').tijdsduur mldacpovs,
                      --fac.datumtijdnaaruitvoertijd (fac.gettrackingdate ('MLDNEW', m.mld_melding_key), fac.gettrackingdate ('MLDAFM', m.mld_melding_key), 'U').tijdsduur mldafmuvt,
                      --fac.datumtijdnaaruitvoertijd (m.mld_melding_einddatum_std, fac.gettrackingdate ('MLDAFM', m.mld_melding_key), 'U').tijdsduur mldafmovs,
                      fac.gettrackingdate ('MLDNEW', m.mld_melding_key) mldnew,
                      fac.gettrackingdate ('MLDACP', m.mld_melding_key) mldacp,
                      fac.gettrackingdate ('MLDAFM', m.mld_melding_key) mldafm
                 FROM mld_melding m, (SELECT * FROM fac_v_aanwezigusrdata WHERE fac_usrtab_key = 221) ud -- KPI6
                WHERE m.mld_stdmelding_key = fac.safe_to_number (ud.fac_usrdata_code)
                      AND m.mld_melding_status IN (5, 6)  -- Afgemeld/Verwerkt
                      AND m.mld_melding_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                      AND m.mld_melding_start_key IS NULL) -- Muv. vervolgmeldingen
   SELECT x.mld_melding_key,
          x.prs_afdeling_naam || '-' || x.prs_afdeling_omschrijving organisatie,
          x.alg_district_omschrijving vt, x.alg_locatie_omschrijving cx,
          cl_ud.fac_usrdata_omschr clusteroms,
          x.alg_gebouw_code gebouwcode,
          x.alg_gebouw_naam gebouwnaam,
          x.alg_verdieping_code verdieping,
          x.alg_ruimte_nr ruimtenr,
          x.alg_ruimte_omschrijving ruimteoms,
          COALESCE (x.ins_srtdiscipline_prefix, '') || TO_CHAR (x.mld_melding_key) || DECODE (o.mld_opdr_key, NULL, '', '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr)) mldord_id,
          x.ins_srtdiscipline_omschrijving vakgroeptype,
          x.ins_discipline_omschrijving vakgroep,
          x.mld_stdmelding_omschrijving melding,
          COALESCE (ob.prs_perslid_naam_full, mb.prs_perslid_naam_full) beh,
          san.mld_kenmerkmelding_waarde san,
          lev.mld_kenmerkmelding_waarde lev,
          rlv.mld_kenmerkmelding_waarde ref_lev,
          x.mldnew,
          x.mldacp,
          fac.gettrackingdate ('ORDNEW', o.mld_opdr_key) ordnew,
          fac.gettrackingdate ('ORDAFM', o.mld_opdr_key) ordafm,
          x.mldafm,
          TO_CHAR (x.mld_melding_t_accepttijd.tijdsduur) || x.mld_melding_t_accepttijd.eenheid mldacp_sla,
          DECODE (x.mldacp,
                  NULL, NULL,
                  TO_CHAR (FLOOR (x.mldacpuvt / kt.uren)) || 'D-'
                  || TO_CHAR (FLOOR (ROUND (MOD (x.mldacpuvt, kt.uren) * 60) / 60)) || 'U-'
                  || TO_CHAR (ROUND (MOD (x.mldacpuvt, 1) * 60)) || 'M')
             mldacp_uvtijd,
          DECODE (SIGN (x.mld_melding_acceptdatum_std - x.mldacp),
                  -1, TO_CHAR (FLOOR (x.mldacpovs / kt.uren)) || 'D-'
                      || TO_CHAR (FLOOR (ROUND (MOD (x.mldacpovs, kt.uren) * 60) / 60)) || 'U-'
                      || TO_CHAR (ROUND (MOD (x.mldacpovs, 1) * 60)) || 'M',
                  NULL)
             mldacp_telaat,
          TO_CHAR (x.mld_melding_t_uitvoertijd.tijdsduur) || x.mld_melding_t_uitvoertijd.eenheid mldafm_sla,
          DECODE (x.mldafm,
                  NULL, NULL,
                  TO_CHAR (FLOOR (x.mldafmuvt / kt.uren)) || 'D-'
                  || TO_CHAR (FLOOR (ROUND (MOD (x.mldafmuvt, kt.uren) * 60) / 60)) || 'U-'
                  || TO_CHAR (ROUND (MOD (x.mldafmuvt, 1) * 60)) || 'M')
             mldafm_uvtijd,
          DECODE (SIGN (x.mld_melding_einddatum_std - x.mldafm),
                  -1, TO_CHAR (FLOOR (x.mldafmovs / kt.uren)) || 'D-'
                      || TO_CHAR (FLOOR (ROUND (MOD (x.mldafmovs, kt.uren) * 60) / 60)) || 'U-'
                      || TO_CHAR (ROUND (MOD (x.mldafmovs, 1) * 60)) || 'M',
                  NULL)
             mldafm_telaat,
          x.prs_perslid_naam_full melder,
          x.mld_melding_onderwerp onderwerp, x.mld_melding_omschrijving omschrijving,
          o.mld_opdr_opmerking
     FROM kantoortijden kt,
          (SELECT x.*,
                  fac.datumtijdnaaruitvoertijd (x.mldnew, x.mldacp, 'U').tijdsduur mldacpuvt,
                  fac.datumtijdnaaruitvoertijd (x.mld_melding_acceptdatum_std, x.mldacp, 'U').tijdsduur mldacpovs,
                  fac.datumtijdnaaruitvoertijd (x.mldnew, x.mldafm, 'U').tijdsduur mldafmuvt,
                  fac.datumtijdnaaruitvoertijd (x.mld_melding_einddatum_std, x.mldafm, 'U').tijdsduur mldafmovs,
                  sd.ins_srtdiscipline_prefix, sd.ins_srtdiscipline_omschrijving,
                  md.ins_discipline_omschrijving, sm.mld_stdmelding_omschrijving,
                  pf.prs_perslid_naam_full, a.prs_afdeling_naam, a.prs_afdeling_omschrijving,
                  d.alg_district_omschrijving, l.alg_locatie_key, l.alg_locatie_omschrijving,
                  aog.alg_gebouw_code, aog.alg_gebouw_naam,
                  aog.alg_verdieping_code,
                  aog.alg_ruimte_nr, aog.alg_ruimte_omschrijving
             FROM mldkpi6 x,
                  mld_stdmelding sm, mld_discipline md, ins_srtdiscipline sd,
                  prs_perslid p, prs_v_perslid_fullnames_all pf, prs_afdeling a,
                  alg_v_allonrgoed_gegevens aog,
                  alg_locatie l, alg_district d -- Ook verwijderde locaties en districten!
            WHERE x.mldafm > x.mld_melding_einddatum_std -- Sneller dan (x.mldacp > x.mld_melding_acceptdatum_std OR x.mldafm > x.mld_melding_einddatum_std)!?
                  AND x.mld_stdmelding_key = sm.mld_stdmelding_key
                  AND sm.mld_ins_discipline_key = md.ins_discipline_key
                  AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                  AND x.prs_perslid_key = p.prs_perslid_key
                  AND p.prs_perslid_key = pf.prs_perslid_key
                  AND p.prs_afdeling_key = a.prs_afdeling_key
                  AND x.mld_alg_locatie_key = l.alg_locatie_key
                  AND l.alg_district_key = d.alg_district_key
                  AND x.mld_alg_onroerendgoed_keys = aog.alg_onroerendgoed_keys(+)) x
          LEFT JOIN alg_v_aanwezigonrgoedkenmerk cl
             ON x.alg_locatie_key = cl.alg_onrgoed_key
                AND cl.alg_onrgoed_niveau = 'L' AND cl.alg_kenmerk_key = 1000 -- Cluster
          LEFT JOIN fac_usrdata cl_ud
             ON fac.safe_to_number (cl.alg_onrgoedkenmerk_waarde) = cl_ud.fac_usrdata_key
          LEFT JOIN prs_v_perslid_fullnames_all mb
             ON x.mld_melding_behandelaar_key = mb.prs_perslid_key
          LEFT JOIN mld_opdr o
             ON x.mld_melding_key = o.mld_melding_key
          LEFT JOIN prs_v_perslid_fullnames_all ob
             ON o.prs_perslid_key = ob.prs_perslid_key
          LEFT JOIN mld_v_aanwezigkenmerkmelding san -- Serviceaanvraagnummer (Soort 2)
             ON x.mld_melding_key = san.mld_melding_key
                AND EXISTS (SELECT 1 FROM mld_kenmerk WHERE mld_srtkenmerk_key = 2 AND mld_kenmerk_key = san.mld_kenmerk_key)
          LEFT JOIN mld_v_aanwezigkenmerkmelding lev -- Naam leverancier (Soort 43)
             ON x.mld_melding_key = lev.mld_melding_key
                AND EXISTS (SELECT 1 FROM mld_kenmerk WHERE mld_srtkenmerk_key = 43 AND mld_kenmerk_key = lev.mld_kenmerk_key)
          LEFT JOIN mld_v_aanwezigkenmerkmelding rlv -- Opdrachtnummer leverancier (Soort 44)
             ON x.mld_melding_key = rlv.mld_melding_key
                AND EXISTS (SELECT 1 FROM mld_kenmerk WHERE mld_srtkenmerk_key = 44 AND mld_kenmerk_key = rlv.mld_kenmerk_key);

-- DJIN#55344: Plusdiensten-rapportage
CREATE OR REPLACE VIEW djin_v_rap_plusdiensten
(
   district,
   complex,
   aanvrager,
   aanvrager_afd,
   gebruiker,
   gebruiker_afd,
   mldres_id,                               -- Meldings- of reserveringsnummer
   mldafm_resvan,               -- Datum afgemeld melding of datum reservering
   vakgroep_cat,                                      -- Vakgroep of catalogus
   melding_artikel,
   prijs_per_stuk,
   aantal,
   totaalprijs,
   leonardonr,
   locatieteam,
   kostenplaats,
   extra_velden,
   referentie,
   onderwerp,
   omschrijving
)
AS
   WITH mk AS (SELECT sk.vnr, sk.mld_srtkenmerk_key, sk.mld_srtkenmerk_omschrijving, kw.mld_melding_key, kw.waarde
                 FROM (SELECT ROWNUM vnr, mld_srtkenmerk_key, mld_srtkenmerk_omschrijving
                         FROM (  SELECT ud.fac_usrdata_volgnr, sk.mld_srtkenmerk_key, sk.mld_srtkenmerk_omschrijving
                                   FROM fac_v_aanwezigusrdata ud, mld_srtkenmerk sk
                                  WHERE ud.fac_usrtab_key = 261 -- Kenmerksoorten voor extra velden bij plusdienst!
                                        AND fac.safe_to_number (ud.fac_usrdata_code) = sk.mld_srtkenmerk_key
                                        AND sk.mld_srtkenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B', 'V')
                               ORDER BY 1, 2)) sk
                      LEFT JOIN
                      (SELECT sk.mld_srtkenmerk_key, km.mld_melding_key,
                              DECODE (sk.mld_srtkenmerk_kenmerktype,
                                      'R', fac.getdomeinwaarde (sk.fac_kenmerkdomein_key, km.mld_kenmerkmelding_waarde),
                                      'S', fac.getdomeinwaarde (sk.fac_kenmerkdomein_key, km.mld_kenmerkmelding_waarde),
                                      km.mld_kenmerkmelding_waarde)
                                 waarde
                         FROM mld_v_aanwezigkenmerkmelding km, mld_kenmerk k, mld_srtkenmerk sk
                        WHERE km.mld_kenmerk_key = k.mld_kenmerk_key
                              AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key) kw
                      ON sk.mld_srtkenmerk_key = kw.mld_srtkenmerk_key
                WHERE kw.waarde IS NOT NULL)
   SELECT -- Meldingen onder Advies en Projecten (Vakgroep met key = 282) of Plusdienst (waarbij kenmerk van kenmerksoort uit Eigen tabel met key=241 is gevuld met entry uit andere Eigen tabel met prijs>0)!
          x.alg_district_omschrijving vt, x.alg_locatie_omschrijving cx,
          x.prs_perslid_naam_full aanvrager,
          x.prs_afdeling_naam || '-' || x.prs_afdeling_omschrijving aanvrager_afd,
          COALESCE (km1.mld_kenmerkmelding_waarde, x.prs_perslid_naam_full) gebruiker,
          COALESCE (km2_ud.fac_usrdata_omschr, x.prs_afdeling_naam || '-' || x.prs_afdeling_omschrijving) gebruiker_afd,
          TO_CHAR (x.mld_melding_key) verplichtingnr,
          fac.gettrackingdate ('MLDAFM', x.mld_melding_key) datum,
          x.ins_discipline_omschrijving discipline,
          x.mld_stdmelding_omschrijving melding_artikel,
          TO_NUMBER (NULL) prijs_per_stuk,
          TO_NUMBER (NULL) aantal,
          fac.safe_to_number (tp.mld_kenmerkmelding_waarde) totaalprijs,
          ln.mld_kenmerkmelding_waarde leonardonr,
          DECODE (lt.mld_kenmerkmelding_waarde, NULL, 'Nee', 'Ja') locatieteam,
          ka.mld_kenmerkmelding_waarde kostenplaats,
             DECODE (k1.waarde, NULL, '', k1.waarde || CHR (13) || CHR (10))
          || DECODE (k2.waarde, NULL, '', k2.waarde || CHR (13) || CHR (10))
          || DECODE (k3.waarde, NULL, '', k3.waarde || CHR (13) || CHR (10))
          || DECODE (k4.waarde, NULL, '', k4.waarde || CHR (13) || CHR (10))
          || DECODE (k5.waarde, NULL, '', k5.waarde || CHR (13) || CHR (10))
          || DECODE (k6.waarde, NULL, '', k6.waarde || CHR (13) || CHR (10))
          || DECODE (k7.waarde, NULL, '', k7.waarde || CHR (13) || CHR (10))
          || DECODE (k8.waarde, NULL, '', k8.waarde || CHR (13) || CHR (10))
          || DECODE (k9.waarde, NULL, '', k9.waarde || CHR (13) || CHR (10))
          || DECODE (k10.waarde, NULL, '', k10.waarde || CHR (13) || CHR (10))
          || DECODE (k11.waarde, NULL, '', k11.waarde || CHR (13) || CHR (10))
          || DECODE (k12.waarde, NULL, '', k12.waarde || CHR (13) || CHR (10))
          || DECODE (k13.waarde, NULL, '', k13.waarde || CHR (13) || CHR (10))
          || DECODE (k14.waarde, NULL, '', k14.waarde || CHR (13) || CHR (10))
          || DECODE (k15.waarde, NULL, '', k15.waarde || CHR (13) || CHR (10))
          || DECODE (k16.waarde, NULL, '', k16.waarde || CHR (13) || CHR (10))
          || DECODE (k17.waarde, NULL, '', k17.waarde || CHR (13) || CHR (10))
          || DECODE (k18.waarde, NULL, '', k18.waarde || CHR (13) || CHR (10))
          || DECODE (k19.waarde, NULL, '', k19.waarde || CHR (13) || CHR (10))
          || DECODE (k20.waarde, NULL, '', k20.waarde || CHR (13) || CHR (10))
          || DECODE (k21.waarde, NULL, '', k21.waarde || CHR (13) || CHR (10))
          || DECODE (k22.waarde, NULL, '', k22.waarde || CHR (13) || CHR (10))
          || DECODE (k23.waarde, NULL, '', k23.waarde || CHR (13) || CHR (10))
          || DECODE (k24.waarde, NULL, '', k24.waarde || CHR (13) || CHR (10))
          || DECODE (k25.waarde, NULL, '', k25.waarde || CHR (13) || CHR (10))
          || DECODE (k26.waarde, NULL, '', k26.waarde || CHR (13) || CHR (10))
          || DECODE (k27.waarde, NULL, '', k27.waarde || CHR (13) || CHR (10))
          || DECODE (k28.waarde, NULL, '', k28.waarde || CHR (13) || CHR (10))
          || DECODE (k29.waarde, NULL, '', k29.waarde || CHR (13) || CHR (10))
          || DECODE (k30.waarde, NULL, '', k30.waarde || CHR (13) || CHR (10))
             extra_velden,
          TO_CHAR (x.mld_melding_kto_key) referentie,
          x.mld_melding_onderwerp onderwerp,
          x.mld_melding_omschrijving omschrijving
     FROM (SELECT m.mld_melding_key, m.mld_melding_onderwerp, m.mld_melding_omschrijving,
                  md.ins_discipline_omschrijving, sm.mld_stdmelding_omschrijving,
                  pf.prs_perslid_naam_full, a.prs_afdeling_naam, a.prs_afdeling_omschrijving,
                  d.alg_district_omschrijving, l.alg_locatie_omschrijving,
                  m.mld_melding_kto_key
             FROM mld_melding m, mld_stdmelding sm, mld_discipline md,
                  (SELECT DISTINCT km.mld_melding_key
                     FROM fac_v_aanwezigusrdata ud1, mld_kenmerk k, mld_v_aanwezigkenmerkmelding km, fac_v_aanwezigusrdata ud2
                    WHERE ud1.fac_usrtab_key = 241 -- Kenmerksoorten ter identificatie van Plusdienst (als prijs > 0)
                          AND ud1.fac_usrdata_code = TO_CHAR (k.mld_srtkenmerk_key)
                          AND k.mld_kenmerk_key = km.mld_kenmerk_key
                          AND km.mld_kenmerkmelding_waarde = TO_CHAR (ud2.fac_usrdata_key)
                          AND ud2.fac_usrdata_prijs > 0) pd,  -- Plusdiensten
                  prs_perslid p, prs_v_perslid_fullnames_all pf, prs_afdeling a,
                  alg_locatie l, alg_district d -- Ook verwijderde locaties en districten!
            WHERE m.mld_melding_status IN (5, 6)          -- Afgemeld/Verwerkt
                  AND m.mld_melding_datum > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
                  AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                  AND sm.mld_ins_discipline_key = md.ins_discipline_key
                  AND m.mld_melding_key = pd.mld_melding_key(+)
                  AND (md.ins_discipline_key = 282      -- Advies en Projecten
                       OR pd.mld_melding_key IS NOT NULL)        -- Plusdienst
                  AND m.prs_perslid_key = p.prs_perslid_key
                  AND p.prs_perslid_key = pf.prs_perslid_key
                  AND p.prs_afdeling_key = a.prs_afdeling_key
                  AND m.mld_alg_locatie_key = l.alg_locatie_key
                  AND l.alg_district_key = d.alg_district_key) x
          LEFT JOIN mld_v_aanwezigkenmerkmelding km1 -- Naam contactpersoon (Soort 102)
             ON x.mld_melding_key = km1.mld_melding_key
                AND km1.mld_kenmerk_key = 228 -- Naam contactpersoon (Soort 102)
          LEFT JOIN mld_v_aanwezigkenmerkmelding km2 -- Naam organisatie (Soort 161)
             ON x.mld_melding_key = km2.mld_melding_key
                AND km2.mld_kenmerk_key = 227 -- Naam organisatie (Soort 161-Domein 141-Eigen tabel 161)
          LEFT JOIN fac_usrdata km2_ud
             ON fac.safe_to_number (km2.mld_kenmerkmelding_waarde) = km2_ud.fac_usrdata_key
          LEFT JOIN mld_v_aanwezigkenmerkmelding tp -- Totaalprijs (Soort 261)
             ON x.mld_melding_key = tp.mld_melding_key
                AND EXISTS (SELECT 1 FROM mld_kenmerk WHERE mld_srtkenmerk_key = 261 AND mld_kenmerk_key = tp.mld_kenmerk_key)
          LEFT JOIN mld_v_aanwezigkenmerkmelding ln -- Leonardonummer (Soort 461)
             ON x.mld_melding_key = ln.mld_melding_key
                AND EXISTS (SELECT 1 FROM mld_kenmerk WHERE mld_srtkenmerk_key = 461 AND mld_kenmerk_key = ln.mld_kenmerk_key)
          LEFT JOIN mld_v_aanwezigkenmerkmelding lt -- Locatieteam-vinkveld (Soort 284)
             ON x.mld_melding_key = lt.mld_melding_key
                AND EXISTS (SELECT 1 FROM mld_kenmerk WHERE mld_srtkenmerk_key = 284 AND mld_kenmerk_key = lt.mld_kenmerk_key)
          LEFT JOIN mld_v_aanwezigkenmerkmelding ka -- Kostenplaats/afdeling (Soort 41)
             ON x.mld_melding_key = ka.mld_melding_key
                AND EXISTS (SELECT 1 FROM mld_kenmerk WHERE mld_srtkenmerk_key =  41 AND mld_kenmerk_key = ka.mld_kenmerk_key)
          LEFT JOIN mk k1 ON x.mld_melding_key = k1.mld_melding_key AND k1.vnr = 1
          LEFT JOIN mk k2 ON x.mld_melding_key = k2.mld_melding_key AND k2.vnr = 2
          LEFT JOIN mk k3 ON x.mld_melding_key = k3.mld_melding_key AND k3.vnr = 3
          LEFT JOIN mk k4 ON x.mld_melding_key = k4.mld_melding_key AND k4.vnr = 4
          LEFT JOIN mk k5 ON x.mld_melding_key = k5.mld_melding_key AND k5.vnr = 5
          LEFT JOIN mk k6 ON x.mld_melding_key = k6.mld_melding_key AND k6.vnr = 6
          LEFT JOIN mk k7 ON x.mld_melding_key = k7.mld_melding_key AND k7.vnr = 7
          LEFT JOIN mk k8 ON x.mld_melding_key = k8.mld_melding_key AND k8.vnr = 8
          LEFT JOIN mk k9 ON x.mld_melding_key = k9.mld_melding_key AND k9.vnr = 9
          LEFT JOIN mk k10 ON x.mld_melding_key = k10.mld_melding_key AND k10.vnr = 10
          LEFT JOIN mk k11 ON x.mld_melding_key = k11.mld_melding_key AND k11.vnr = 11
          LEFT JOIN mk k12 ON x.mld_melding_key = k12.mld_melding_key AND k12.vnr = 12
          LEFT JOIN mk k13 ON x.mld_melding_key = k13.mld_melding_key AND k13.vnr = 13
          LEFT JOIN mk k14 ON x.mld_melding_key = k14.mld_melding_key AND k14.vnr = 14
          LEFT JOIN mk k15 ON x.mld_melding_key = k15.mld_melding_key AND k15.vnr = 15
          LEFT JOIN mk k16 ON x.mld_melding_key = k16.mld_melding_key AND k16.vnr = 16
          LEFT JOIN mk k17 ON x.mld_melding_key = k17.mld_melding_key AND k17.vnr = 17
          LEFT JOIN mk k18 ON x.mld_melding_key = k18.mld_melding_key AND k18.vnr = 18
          LEFT JOIN mk k19 ON x.mld_melding_key = k19.mld_melding_key AND k19.vnr = 19
          LEFT JOIN mk k20 ON x.mld_melding_key = k20.mld_melding_key AND k20.vnr = 20
          LEFT JOIN mk k21 ON x.mld_melding_key = k21.mld_melding_key AND k21.vnr = 21
          LEFT JOIN mk k22 ON x.mld_melding_key = k22.mld_melding_key AND k22.vnr = 22
          LEFT JOIN mk k23 ON x.mld_melding_key = k23.mld_melding_key AND k23.vnr = 23
          LEFT JOIN mk k24 ON x.mld_melding_key = k24.mld_melding_key AND k24.vnr = 24
          LEFT JOIN mk k25 ON x.mld_melding_key = k25.mld_melding_key AND k25.vnr = 25
          LEFT JOIN mk k26 ON x.mld_melding_key = k26.mld_melding_key AND k26.vnr = 26
          LEFT JOIN mk k27 ON x.mld_melding_key = k27.mld_melding_key AND k27.vnr = 27
          LEFT JOIN mk k28 ON x.mld_melding_key = k28.mld_melding_key AND k28.vnr = 28
          LEFT JOIN mk k29 ON x.mld_melding_key = k29.mld_melding_key AND k29.vnr = 29
          LEFT JOIN mk k30 ON x.mld_melding_key = k30.mld_melding_key AND k30.vnr = 30
   UNION ALL               -- Reserveringen van verbruiksartikelen (catering)!
   SELECT d.alg_district_omschrijving vt,
          l.alg_locatie_omschrijving cx,
          pfc.prs_perslid_naam_full aanvrager,
          ac.prs_afdeling_naam || '-' || ac.prs_afdeling_omschrijving aanvrager_afd,
          pfh.prs_perslid_naam_full gebruiker,
          ah.prs_afdeling_naam || '-' || ah.prs_afdeling_omschrijving gebruiker_afd,
          TO_CHAR (rrr.res_reservering_key) || '/' || TO_CHAR (rrr.res_rsv_ruimte_volgnr) verplichtingnr,
          rrr.res_rsv_ruimte_van datum,
          rd.ins_discipline_omschrijving discipline,
          ra.res_artikel_omschrijving melding_artikel,
          DECODE (rra.res_rsv_artikel_prijs, NULL, ra.res_artikel_prijs, rra.res_rsv_artikel_prijs / COALESCE (rra.res_rsv_artikel_aantal, 1)) prijs_per_stuk,
          rra.res_rsv_artikel_aantal aantal,
          COALESCE (rra.res_rsv_artikel_prijs, rra.res_rsv_artikel_aantal * ra.res_artikel_prijs) totaalprijs,
          NULL leonardonr, NULL locatieteam,
          kpa.res_kenmerkreservering_waarde kostenplaats,
          NULL extra_velden, NULL referentie, NULL onderwerp,
          rrr.res_rsv_ruimte_omschrijving omschrijving
     FROM res_v_aanwezigrsv_artikel rra,
          res_artikel ra,
          res_discipline rd,
          res_v_aanwezigrsv_ruimte rrr,
          prs_perslid pc, prs_v_perslid_fullnames_all pfc, prs_afdeling ac,
          prs_perslid ph, prs_v_perslid_fullnames_all pfh, prs_afdeling ah,
          res_ruimte_opstelling rro,
          (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
               FROM res_alg_ruimte
              WHERE res_alg_ruimte_verwijder IS NULL
           GROUP BY res_ruimte_key) rar1,
          (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
               FROM res_alg_ruimte
              WHERE res_alg_ruimte_verwijder IS NOT NULL
           GROUP BY res_ruimte_key) rar2,
          alg_v_allonroerendgoed aog,
          alg_locatie l,                           -- Ook verwijderde locaties
          alg_district d,                        -- en verwijderde districten!
          (SELECT kw.res_rsv_ruimte_key, kw.res_kenmerkreservering_waarde
             FROM res_v_aanwezigkenmerkwaarde kw, res_kenmerk k
            WHERE kw.res_kenmerk_key = k.res_kenmerk_key
                  AND k.res_srtkenmerk_key = 24) kpa  -- Kostenplaats/afdeling
    WHERE rra.res_rsv_artikel_levering > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy')
          AND rra.res_rsv_artikel_levering < SYSDATE      -- Geen toekomstige!
          AND rra.res_rsv_artikel_dirtlevel = 0
          AND rra.res_artikel_key = ra.res_artikel_key
          AND ra.res_discipline_key = rd.ins_discipline_key
          AND rra.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
          AND rrr.res_rsv_ruimte_dirtlevel = 0
          AND rrr.res_rsv_ruimte_contact_key = pc.prs_perslid_key
          AND pc.prs_perslid_key = pfc.prs_perslid_key
          AND pc.prs_afdeling_key = ac.prs_afdeling_key
          AND rrr.res_rsv_ruimte_host_key = ph.prs_perslid_key
          AND ph.prs_perslid_key = pfh.prs_perslid_key
          AND ph.prs_afdeling_key = ah.prs_afdeling_key
          AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)
          AND rro.res_ruimte_key = rar1.res_ruimte_key(+)
          AND rro.res_ruimte_key = rar2.res_ruimte_key(+)
          AND COALESCE (rar1.alg_ruimte_key, rar2.alg_ruimte_key, rrr.alg_ruimte_key) = aog.alg_ruimte_key
          AND aog.alg_locatie_key = l.alg_locatie_key
          AND l.alg_district_key = d.alg_district_key
          AND rrr.res_rsv_ruimte_key = kpa.res_rsv_ruimte_key(+);

------ payload end   ------

SET DEFINE OFF
BEGIN adm.systrackscriptId ('$Id$', 0); END;
/

COMMIT;
SET ECHO OFF
SPOOL OFF
SET DEFINE ON
PROMPT Logfile of this upgrade is: &fcltlogfile
