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

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 curs_v_rap_infobord (
   item_type,
   item_key,
   aktief,
   bezoek_status,
   offset,
   dag,
   tijd_van,
   tijd_tot,
   ruimte,
   catalogus,
   aanvrager,
   gastheer,
   omschrijving,
   status,
   bezoeker,
   bedrijf,
   locatie_code,
   gebouw_code,
   verdieping_code,
   locatie_omschrijving,
   gebouw_omschrijving,
   verdieping_omschrijving,
   alg_locatie_key,
   alg_gebouw_key,
   alg_verdieping_key
   )
AS
 SELECT   'RES',
          rrr.res_rsv_ruimte_key,
          ( CASE
              WHEN res_rsv_ruimte_van > SYSDATE THEN 'expected'
              WHEN res_rsv_ruimte_tot < SYSDATE THEN 'passed'
              ELSE 'active'
           END)
             aktief,
           ( CASE
              WHEN B.BEZ_BEZOEKERS_OUT IS not null THEN 'out'
              WHEN b.bez_bezoekers_done is not null THEN 'in'
              ELSE 'expected'
           END)
             bezoek_status,
          TRUNC ( (SYSDATE - res_rsv_ruimte_van) * 24 * 60) offset,
          TO_CHAR (res_rsv_ruimte_van, 'dd-mm-yyyy') dag,
          TO_CHAR (res_rsv_ruimte_van, 'hh24:mi') tijd_van,
          TO_CHAR (res_rsv_ruimte_tot, 'hh24:mi') tijd_tot,
          res_ruimte_nr ruimte,
          ins_discipline_omschrijving catalogus,
          aanvrager.prs_perslid_naam_full aanvrager,
          gastheer.prs_perslid_naam_full gastheer,
          res_rsv_ruimte_omschrijving omschrijving,
          sf.res_status_fo_omschrijving status,
          b.bez_afspraak_naam,
          b.bez_afspraak_bedrijf,
          alg_locatie_code locatie_code,
          alg_gebouw_code gebouw_code,
          alg_verdieping_code verdieping_code,
          alg_locatie_omschrijving locatie_omschrijving,
          alg_gebouw_omschrijving gebouw_omschrijving,
          alg_verdieping_omschrijving verdieping_omschrijving,
          l.alg_locatie_key,
          g.alg_gebouw_key,
          v.alg_verdieping_key
   FROM res_v_aanwezigrsv_ruimte rrr,
        res_ruimte_opstelling rro,
        prs_v_perslid_fullnames aanvrager,
        prs_v_perslid_fullnames gastheer,
        res_v_res_ruimte_gegevens rrg,
        alg_locatie l,
        alg_gebouw g,
        alg_verdieping v,
        res_status_fo sf,
        res_discipline rd,
        bez_afspraak a,
        bez_bezoekers b
   WHERE     rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key
         AND rro.res_ruimte_key = rrg.res_ruimte_key
         AND rrr.res_rsv_ruimte_host_key = gastheer.prs_perslid_key
         AND rrr.res_rsv_ruimte_contact_key = aanvrager.prs_perslid_key
         AND TRUNC (res_rsv_ruimte_van) = TRUNC (SYSDATE)
         AND rrg.alg_locatie_key = l.alg_locatie_key
         AND rrg.alg_gebouw_key = g.alg_gebouw_key
         AND rrg.alg_verdieping_key = v.alg_verdieping_key
         AND rrr.res_status_fo_key = sf.res_status_fo_key
         AND rrg.res_discipline_key = rd.ins_discipline_key
         AND rrr.res_rsv_ruimte_key = a.res_rsv_ruimte_key(+)
         AND a.bez_afspraak_key = b.bez_afspraak_key(+)
         union all
 select 'BEZ', b.bez_afspraak_key,
          ( CASE
              WHEN A.BEZ_AFSPRAAK_DATUM > SYSDATE THEN 'expected'
              WHEN a.bez_afspraak_eind < SYSDATE THEN 'passed'
              ELSE 'active'
           END)
             aktief,
                        ( CASE
              WHEN B.BEZ_BEZOEKERS_OUT IS not null THEN 'out'
              WHEN b.bez_bezoekers_done is not null THEN 'in'
              ELSE 'expected'
           END)
             bezoek_status,
          TRUNC ( (SYSDATE - BEZ_AFSPRAAK_DATUM) * 24 * 60) offset,
          TO_CHAR (BEZ_AFSPRAAK_DATUM, 'dd-mm-yyyy') dag,
          TO_CHAR (BEZ_AFSPRAAK_DATUM, 'hh24:mi') tijd_van,
          TO_CHAR (BEZ_AFSPRAAK_eind, 'hh24:mi') tijd_tot,
          null ruimte,
          null catalogus,
          aanvrager.prs_perslid_naam_full aanvrager,
          gastheer.prs_perslid_naam_full gastheer,
          null omschrijving,
          null status,
          b.bez_afspraak_naam,
          b.bez_afspraak_bedrijf,
          alg_locatie_code locatie_code,
          alg_gebouw_code gebouw_code,
          null verdieping_code,
          alg_locatie_omschrijving locatie_omschrijving,
          alg_gebouw_naam gebouw_omschrijving,
          alg_verdieping_omschrijving verdieping_omschrijving,
          l.alg_locatie_key,
          ogg.alg_gebouw_key,
          ogg.alg_verdieping_key
         from bez_afspraak a, bez_bezoekers b,
                 prs_v_perslid_fullnames aanvrager, alg_locatie l, alg_v_allonrgoed_gegevens ogg,
        prs_v_perslid_fullnames gastheer
         where a.bez_afspraak_key = b.bez_afspraak_key
         and A.BEZ_AFSPRAAK_HOST_KEY = gastheer.prs_perslid_key
         and a.bez_afspraak_contact_key = aanvrager.prs_perslid_key
         and A.ALG_LOCATIE_KEY = l.alg_locatie_key
         and A.ALG_ONRGOED_KEYS = ogg.alg_onroerendgoed_keys(+)
         and A.RES_RSV_RUIMTE_KEY is null;

CREATE OR REPLACE VIEW curs_v_info_loc_overzicht (
   aktief,
   boarding,
   offset,
   dag,
   tijd_van,
   tijd_tot,
   ruimte,
   aanvrager,
   gastheer,
   omschrijving,
   status,
   locatie_code,
   gebouw_code,
   verdieping_code,
   alg_locatie_key,
   alg_gebouw_key,
   alg_verdieping_key
   )
AS
   SELECT (SELECT 'active'
           FROM DUAL
           WHERE res_rsv_ruimte_van < SYSDATE
                 AND res_rsv_ruimte_tot > SYSDATE
           UNION
           SELECT 'expected'
           FROM DUAL
           WHERE res_rsv_ruimte_van > SYSDATE
           UNION
           SELECT 'passed'
           FROM DUAL
           WHERE res_rsv_ruimte_tot < SYSDATE)
             aktief,
          (SELECT DECODE (COUNT ( * ), 0, 1, 0)
           FROM res_rsv_ruimte rrr2
           WHERE rrr2.res_rsv_ruimte_tot BETWEEN SYSDATE
                                             AND  rrr.res_rsv_ruimte_van
                 AND rrr2.res_ruimte_opstel_key = rrr.res_ruimte_opstel_key)
             boarding,
          TRUNC ( (SYSDATE - res_rsv_ruimte_van) * 24 * 60) offset,
          TO_CHAR (res_rsv_ruimte_van, 'dd-mm-yyyy') dag,
          TO_CHAR (res_rsv_ruimte_van, 'hh24:mi') tijd_van,
          TO_CHAR (res_rsv_ruimte_tot, 'hh24:mi') tijd_tot,
          res_ruimte_nr ruimte,
          aanvrager.prs_perslid_naam_full aanvrager,
          gastheer.prs_perslid_naam_full gastheer,
          res_rsv_ruimte_omschrijving omschrijving,
          sf.res_status_fo_omschrijving status,
          alg_locatie_code locatie_code,
          alg_gebouw_code gebouw_code,
          alg_verdieping_code verdieping_code,
          l.alg_locatie_key,
          g.alg_gebouw_key,
          v.alg_verdieping_key
   FROM res_v_aanwezigrsv_ruimte rrr,
        res_ruimte_opstelling rro,
        prs_v_perslid_fullnames aanvrager,
        prs_v_perslid_fullnames gastheer,
        res_v_res_ruimte_gegevens rrg,
        alg_locatie l,
        alg_gebouw g,
        alg_verdieping v,
        res_status_fo sf
   WHERE     rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key
         AND rro.res_ruimte_key = rrg.res_ruimte_key
         AND rrr.res_rsv_ruimte_host_key = gastheer.prs_perslid_key
         AND rrr.res_rsv_ruimte_contact_key = aanvrager.prs_perslid_key
         AND TRUNC (res_rsv_ruimte_van) = TRUNC (SYSDATE)
         AND rrg.alg_locatie_key = l.alg_locatie_key
         AND rrg.alg_gebouw_key = g.alg_gebouw_key
         AND rrg.alg_verdieping_key = v.alg_verdieping_key
         AND rrr.res_status_fo_key = sf.res_status_fo_key;


CREATE OR REPLACE FORCE VIEW curs_v_prs_indienst (
   fclt_f_maand,
   fclt_f_naam,
   nummer,
   indienst,
   fclt_f_afdeling
   )
AS
   SELECT TO_CHAR (p.prs_perslid_ingangsdatum, 'YYMM'),
          pf.prs_perslid_naam_full,
          p.prs_perslid_nr,
          TO_CHAR (p.prs_perslid_ingangsdatum, 'DD-MM-YYYY'),
          a.prs_afdeling_naam1
   FROM prs_v_afdeling a, prs_v_aanwezigperslid p, prs_v_perslid_fullnames pf
   WHERE     p.prs_afdeling_key = a.prs_afdeling_key
         AND pf.prs_perslid_key = p.prs_perslid_key
         AND p.prs_perslid_ingangsdatum IS NOT NULL;

CREATE OR REPLACE FORCE VIEW curs_v_prs_uitdienst (
   fclt_f_maand,
   fclt_f_naam,
   nummer,
   uitdienst,
   fclt_f_afdeling
   )
AS
   SELECT TO_CHAR (p.prs_perslid_einddatum, 'YYMM'),
          pf.prs_perslid_naam_full,
          p.prs_perslid_nr,
          TO_CHAR (p.prs_perslid_einddatum, 'DD-MM-YYYY'),
          a.prs_afdeling_naam1
   FROM prs_v_afdeling a, prs_v_aanwezigperslid p, prs_v_perslid_fullnames pf
   WHERE     p.prs_afdeling_key = a.prs_afdeling_key
         AND pf.prs_perslid_key = p.prs_perslid_key
         AND p.prs_perslid_einddatum IS NOT NULL;


CREATE OR REPLACE FORCE VIEW curs_v_verbruik1 (
   fclt_f_locatie,
   objectomschrijving,
   waarde,
   fclt_f_datum,
   datumstr,
   hide_f_ins_deel_key
   )
AS
   SELECT l.alg_locatie_omschrijving,
          d.ins_deel_omschrijving objectomschrijving,
          fac.safe_to_number (kd.ins_kenmerkdeel_waarde) eindwaarde,
          TO_CHAR (kd.ins_kenmerkdeel_aanmaak, 'YYMM') einddatum,
          TO_CHAR (kd.ins_kenmerkdeel_aanmaak, 'DD-MM-YY') einddatumstr,
          d.ins_deel_key
   FROM ins_v_aanwezigsrtdeel sd,
        ins_v_aanwezigdeel d,
        ins_kenmerkdeel kd,
        ins_kenmerk k,
        ins_srtkenmerk sk,
        alg_v_aanweziglocatie l
   WHERE     sd.ins_srtdeel_key = d.ins_srtdeel_key
         AND d.ins_deel_key = kd.ins_deel_key
         AND kd.ins_kenmerk_key = k.ins_kenmerk_key
         AND k.ins_kenmerk_verwijder IS NULL
         AND k.ins_kenmerk_volgnummer >= 100
         AND sk.ins_srtkenmerk_kenmerktype = 'N'
         AND k.ins_srtkenmerk_key = sk.ins_srtkenmerk_key
         AND d.ins_alg_locatie_key = l.alg_locatie_key;

CREATE OR REPLACE FORCE VIEW curs_v_verbruik (
   fclt_f_locatie,
   objectomschrijving,
   verbruik,
   fclt_f_begindatum,
   fclt_f_einddatum
   )
AS
   SELECT v1.fclt_f_locatie,
          v1.objectomschrijving,
          (v1.waarde - v2.waarde) verbruik,
          v2.fclt_f_datum begindatum,
          v1.fclt_f_datum einddatum
   FROM curs_v_verbruik1 v1, curs_v_verbruik1 v2
   WHERE     v1.hide_f_ins_deel_key = v2.hide_f_ins_deel_key
         AND v1.fclt_f_datum >= v2.fclt_f_datum
         AND v1.waarde >= v2.waarde
         AND (v1.waarde - v2.waarde) < 99999999;

/* Formatted on 2009/01/08 11:40 (Formatter Plus v4.8.7) */
CREATE OR REPLACE VIEW curs_v_hv_actual (dis_oms,
                                         loc_code,
                                         geb_code,
                                         ver_code,
                                         ruimte_nr,
                                         ruimtesoort,
                                         wp_cap,
                                         teken_opp,
                                         sp_nummer,
                                         sp_naam,
                                         bezetting,
                                         m2_wpnorm,
                                         m2_tarief
                                        )
AS
   (SELECT a.alg_district_omschrijving, a.alg_locatie_code, a.alg_gebouw_code,
           a.alg_verdieping_code, a.alg_ruimte_nr, b.ruimtesoort,
           fac.safe_to_number (COALESCE (c.wp_cap, '0')), a.opp, d.afd_naam,
           d.afd_oms, d.afd_bez,
           (SELECT fac.safe_to_number
                              (COALESCE (kl.prs_kenmerklink_waarde, '0')
                              )
              FROM prs_kenmerklink kl
             WHERE kl.prs_link_key = 28021                         -- Atos Origin
               AND kl.prs_kenmerklink_niveau = 'B'
               AND kl.prs_kenmerk_key = 1240) m2_wpnorm,          -- m2-wpnorm
           (SELECT fac.safe_to_number
                              (COALESCE (kl.prs_kenmerklink_waarde, '0')
                              )
              FROM prs_kenmerklink kl
             WHERE kl.prs_link_key = 28021                         -- Atos Origin
               AND kl.prs_kenmerklink_niveau = 'B'
               AND kl.prs_kenmerk_key = 1180) m2_tarief           -- m2-tarief
      FROM (SELECT r.alg_ruimte_key, r.alg_ruimte_nr, v.alg_verdieping_code,
                   g.alg_gebouw_code, l.alg_locatie_code,
                   d.alg_district_omschrijving,
                   r.alg_ruimte_bruto_vloeropp opp
              FROM alg_v_aanwezigruimte r,
                   alg_verdieping v,
                   alg_gebouw g,
                   alg_locatie l,
                   alg_district d
             WHERE r.alg_verdieping_key = v.alg_verdieping_key
               AND v.alg_gebouw_key = g.alg_gebouw_key
               AND g.alg_locatie_key = l.alg_locatie_key
               AND l.alg_district_key = d.alg_district_key) a
           LEFT JOIN
           (SELECT r.alg_ruimte_key,
                   COALESCE (sr.alg_srtruimte_omschrijving, '-') ruimtesoort
              FROM alg_v_aanwezigruimte r, alg_srtruimte sr
             WHERE r.alg_srtruimte_key = sr.alg_srtruimte_key) b
           ON a.alg_ruimte_key = b.alg_ruimte_key
           LEFT JOIN
           (SELECT ok.alg_onrgoed_key, ok.alg_onrgoedkenmerk_waarde wp_cap
              FROM alg_onrgoedkenmerk ok
             WHERE ok.alg_kenmerk_key = 1240                         -- wp_cap
               AND ok.alg_onrgoed_niveau = 'R') c
           ON a.alg_ruimte_key = c.alg_onrgoed_key
           LEFT JOIN                                 -- afdeling(en) op ruimte
           (SELECT ra.alg_ruimte_key, afd.prs_afdeling_naam afd_naam,
                   afd.prs_afdeling_omschrijving afd_oms,
                   ra.prs_ruimteafdeling_bezetting afd_bez
              FROM prs_v_aanwezigruimteafdeling ra, prs_afdeling afd
             WHERE ra.prs_afdeling_key = afd.prs_afdeling_key
            UNION ALL
            SELECT x.alg_ruimte_key, NULL afd_naam, NULL afd_oms,
                   (100 - x.rui_bez) afd_bez
              FROM (SELECT   ra.alg_ruimte_key,
                             SUM (ra.prs_ruimteafdeling_bezetting) rui_bez
                        FROM prs_v_aanwezigruimteafdeling ra
                    GROUP BY ra.alg_ruimte_key) x
             WHERE x.rui_bez < 100) d ON a.alg_ruimte_key = d.alg_ruimte_key
           )
/
CREATE OR REPLACE VIEW curs_v_hv_xactual (
   loc_code,
   geb_code,
   ver_code,
   ruimte_nr,
   ruimtesoort,
   wp_cap,
   teken_opp,
   sp_nummer,
   sp_naam,
   bezetting,
   m2_wpnorm,
   m2_tarief
   )
AS
   (SELECT a.alg_locatie_code,
           a.alg_gebouw_code,
           a.alg_verdieping_code,
           a.alg_ruimte_nr,
           b.ruimtesoort,
           fac.safe_to_number (COALESCE (c.wp_cap, '0')),
           a.opp,
           d.afd_naam,
           d.afd_oms,
           d.afd_bez,
           (SELECT fac.safe_to_number(COALESCE (kl.prs_kenmerklink_waarde, '0'
                                      ))
            FROM prs_kenmerklink kl
            WHERE     kl.prs_link_key = 28021                      -- Atos Origin
                  AND kl.prs_kenmerklink_niveau = 'B'
                  AND kl.prs_kenmerk_key = 1240)
              m2_wpnorm,                                          -- m2-wpnorm
           (SELECT fac.safe_to_number(COALESCE (kl.prs_kenmerklink_waarde, '0'
                                      ))
            FROM prs_kenmerklink kl
            WHERE     kl.prs_link_key = 28021                      -- Atos Origin
                  AND kl.prs_kenmerklink_niveau = 'B'
                  AND kl.prs_kenmerk_key = 1180)
              m2_tarief                                           -- m2-tarief
    FROM             (SELECT r.alg_ruimte_key,
                             r.alg_ruimte_nr,
                             v.alg_verdieping_code,
                             g.alg_gebouw_code,
                             l.alg_locatie_code,
                             r.alg_ruimte_bruto_vloeropp opp
                      FROM alg_v_aanwezigruimte r,
                           alg_verdieping v,
                           alg_gebouw g,
                           alg_locatie l
                      WHERE     r.alg_verdieping_key = v.alg_verdieping_key
                            AND v.alg_gebouw_key = g.alg_gebouw_key
                            AND g.alg_locatie_key = l.alg_locatie_key) a
                  LEFT JOIN
                     (SELECT r.alg_ruimte_key,
                             COALESCE (sr.alg_srtruimte_omschrijving, '-')
                                ruimtesoort
                      FROM alg_v_aanwezigruimte r, alg_srtruimte sr
                      WHERE r.alg_srtruimte_key = sr.alg_srtruimte_key) b
                  ON a.alg_ruimte_key = b.alg_ruimte_key
               LEFT JOIN
                  (SELECT ok.alg_onrgoed_key,
                          ok.alg_onrgoedkenmerk_waarde wp_cap
                   FROM alg_onrgoedkenmerk ok
                   WHERE ok.alg_kenmerk_key = 1240                   -- wp_cap
                         AND ok.alg_onrgoed_niveau = 'R') c
               ON a.alg_ruimte_key = c.alg_onrgoed_key
         LEFT JOIN                                   -- afdeling(en) op ruimte
            (SELECT ra.alg_ruimte_key,
                    afd.prs_afdeling_naam afd_naam,
                    afd.prs_afdeling_omschrijving afd_oms,
                    ra.prs_ruimteafdeling_bezetting afd_bez
             FROM prs_v_aanwezigruimteafdeling ra, prs_afdeling afd
             WHERE ra.prs_afdeling_key = afd.prs_afdeling_key) d
         ON a.alg_ruimte_key = d.alg_ruimte_key)
/

/* Formatted on 2009/01/08 09:15 (Formatter Plus v4.8.7) */
CREATE OR REPLACE VIEW curs_v_rap_hv_doorbelasting (fclt_f_district,
                                                    fclt_f_locatie,
                                                    fclt_f_gebouw,
                                                    fclt_f_afdeling_naam,
                                                    fclt_f_afdeling_nr,
                                                    aantal_m2,
                                                    kosten
                                                   )
AS
   (SELECT   x.dis_oms, x.loc_code, x.geb_code,
             COALESCE (x.sp_naam, '[Leegstand]'),
             COALESCE (x.sp_nummer, '[Leegstand]'),
             SUM (DECODE (UPPER (x.ruimtesoort),
                          'OPEN WERKPLEK', x.wp * x.m2_wpnorm,
                          x.teken_opp
                         )
                 ) reken_opp,
             SUM (DECODE (UPPER (x.ruimtesoort),
                          'OPEN WERKPLEK', x.wp * x.m2_wpnorm * x.m2_tarief,
                          x.teken_opp * x.m2_tarief
                         )
                 ) kosten
        FROM (SELECT   v.dis_oms, v.loc_code, v.geb_code, v.sp_nummer,
                       v.sp_naam, v.ruimtesoort, v.m2_tarief, v.m2_wpnorm,
                       SUM (v.wp_cap * COALESCE (v.bezetting, 100) / 100) wp,
                       SUM (v.teken_opp * COALESCE (v.bezetting, 100) / 100
                           ) teken_opp
                  FROM curs_v_hv_actual v
              GROUP BY v.dis_oms,
                       v.loc_code,
                       v.geb_code,
                       v.sp_nummer,
                       v.sp_naam,
                       v.ruimtesoort,
                       v.m2_tarief,
                       v.m2_wpnorm) x
    GROUP BY x.dis_oms, x.loc_code, x.geb_code, x.sp_naam, x.sp_nummer)
/
CREATE OR REPLACE VIEW curs_v_rap_hv_xdoorbelasting (fclt_f_gebouw,
                                                    fclt_f_afdeling_naam,
                                                    fclt_f_afdeling_nr,
                                                    reken_opp
                                                   )
AS
   (SELECT   v.geb_code, COALESCE (v.sp_naam, '[Leegstand]'),
             COALESCE (v.sp_nummer, '[Leegstand]'),
             REPLACE (TO_CHAR (SUM (DECODE (UPPER (v.ruimtesoort),
                                            'OPEN WERKPLEK', v.wp_cap
                                             * v.m2_wpnorm,
                                            v.teken_opp
                                           )
                                   ),
                               '999999990D99'
                              ),
                      '.',
                      ','
                     ) reken_opp
        FROM curs_v_hv_xactual v
    GROUP BY v.geb_code, v.sp_naam, v.sp_nummer)
/



/* Formatted on 2009/01/08 09:15 (Formatter Plus v4.8.7) */
CREATE OR REPLACE VIEW curs_v_rap_hv_doorbelfrozen (fclt_f_datum,
                                                    fclt_f_district,
                                                    fclt_f_locatie,
                                                    fclt_f_gebouw,
                                                    fclt_f_afdeling_naam,
                                                    fclt_f_afdeling_nr,
                                                    aantal_m2,
                                                    kosten
                                                   )
AS
   (SELECT   TO_CHAR (x.freeze_datum, 'YYYY-MM-DD') datum, x.dis_oms,
             x.loc_code, x.geb_code, COALESCE (x.sp_naam, '[Leegstand]'),
             COALESCE (x.sp_nummer, '[Leegstand]'),
             SUM (DECODE (UPPER (x.ruimtesoort),
                          'OPEN WERKPLEK', x.wp * x.m2_wpnorm,
                          x.teken_opp
                         )
                 ) reken_opp,
             SUM (DECODE (UPPER (x.ruimtesoort),
                          'OPEN WERKPLEK', x.wp * x.m2_wpnorm * x.m2_tarief,
                          x.teken_opp * x.m2_tarief
                         )
                 ) kosten
        FROM (SELECT   v.freeze_datum, v.dis_oms, v.loc_code, v.geb_code,
                       v.sp_nummer, v.sp_naam, v.ruimtesoort, v.m2_tarief,
                       v.m2_wpnorm,
                       SUM (v.wp_cap * COALESCE (v.bezetting, 100) / 100) wp,
                       SUM (v.teken_opp * COALESCE (v.bezetting, 100) / 100
                           ) teken_opp
                  FROM curs_hv_freeze v
              GROUP BY v.freeze_datum,
                       v.dis_oms,
                       v.loc_code,
                       v.geb_code,
                       v.sp_nummer,
                       v.sp_naam,
                       v.ruimtesoort,
                       v.m2_tarief,
                       v.m2_wpnorm) x
    GROUP BY x.freeze_datum,
             x.dis_oms,
             x.loc_code,
             x.geb_code,
             x.sp_naam,
             x.sp_nummer)
/

/* Formatted on 14-1-2009 17:12:04 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW curs_v_rap_hv_ruimte_details
(
	fclt_f_district,
	fclt_f_locatie,
	fclt_f_gebouw,
	fclt_f_verdieping,
	ruimte_nr,
	aantal_wp,
	reken_opp,
	fclt_f_afdeling_naam,
	fclt_f_afdeling_nr,
	fclt_f_ruimtesoort,
	m2_tarief,
	ruimteprijs
)
AS
	SELECT	v.dis_oms,
				v.loc_code,
				v.geb_code,
				v.ver_code,
				v.ruimte_nr,
				TO_CHAR (v.wp_cap),
				(DECODE (UPPER (v.ruimtesoort),
							'OPEN WERKPLEK', v.wp_cap * v.m2_wpnorm,
							v.teken_opp
						  )
				 * COALESCE (v.bezetting, 100)
				 / 100)
					reken_opp,
				COALESCE (v.sp_naam, '[Leegstand]'),
				COALESCE (v.sp_nummer, '[Leegstand]'),
				v.ruimtesoort,
				REPLACE (TO_CHAR (v.m2_tarief), '.', ','),
				(DECODE (UPPER (v.ruimtesoort),
							'OPEN WERKPLEK', v.wp_cap * v.m2_wpnorm * v.m2_tarief,
							v.teken_opp * v.m2_tarief
						  )
				 * COALESCE (v.bezetting, 100)
				 / 100)
					ruimteprijs
	  FROM	curs_v_hv_actual v
/

/* Formatted on 2009/01/08 09:18 (Formatter Plus v4.8.7) */
CREATE OR REPLACE VIEW curs_v_rap_hv_ruimteoverzicht (fclt_f_district,
                                                      fclt_f_locatie,
                                                      fclt_f_gebouw,
                                                      fclt_f_verdieping,
                                                      ruimte_nr,
                                                      fclt_f_ruimtesoort,
                                                      aantal_wp,
                                                      reken_opp
                                                     )
AS
   SELECT DISTINCT v.dis_oms, v.loc_code, v.geb_code, v.ver_code, v.ruimte_nr,
                   v.ruimtesoort, TO_CHAR (v.wp_cap),
                   DECODE (UPPER (v.ruimtesoort),
                           'OPEN WERKPLEK', v.wp_cap * v.m2_wpnorm,
                           v.teken_opp
                          ) reken_opp
              FROM curs_v_hv_actual v
/

/* Formatted on 2009/01/08 09:18 (Formatter Plus v4.8.7) */
CREATE OR REPLACE VIEW curs_v_rap_hv_sp_totalen (fclt_f_district,
                                                 fclt_f_locatie,
                                                 fclt_f_gebouw,
                                                 fclt_f_verdieping,
                                                 fclt_f_afdeling_naam,
                                                 fclt_f_afdeling_nr,
                                                 fclt_f_ruimtesoort,
                                                 aantal_ruimten,
                                                 aantal_wp,
                                                 reken_opp,
                                                 m2_tarief,
                                                 prijs
                                                )
AS
   (SELECT x.dis_oms, x.loc_code, x.geb_code, x.ver_code,
           COALESCE (x.sp_naam, '[Leegstand]'),
           COALESCE (x.sp_nummer, '[Leegstand]'), x.ruimtesoort,
           x.ruimten,
           REPLACE (TO_CHAR (x.wp, '999999990D99'), '.', ',') wp,
           DECODE (UPPER (x.ruimtesoort),
                   'OPEN WERKPLEK', x.wp * x.m2_wpnorm,
                   x.teken_opp
                  ) reken_opp,
           REPLACE (TO_CHAR (x.m2_tarief), '.', ','),
           DECODE (UPPER (x.ruimtesoort),
                   'OPEN WERKPLEK', x.wp * x.m2_wpnorm * x.m2_tarief,
                   x.teken_opp * x.m2_tarief
                  ) prijs
      FROM (SELECT   v.dis_oms, v.loc_code, v.geb_code, v.ver_code,
                     v.sp_nummer, v.sp_naam, v.ruimtesoort, v.m2_tarief,
                     v.m2_wpnorm,
                     SUM (COALESCE (v.bezetting, 100) / 100) ruimten,
                     SUM (v.wp_cap * COALESCE (v.bezetting, 100) / 100) wp,
                     SUM (v.teken_opp * COALESCE (v.bezetting, 100) / 100
                         ) teken_opp
                FROM curs_v_hv_actual v
            GROUP BY v.dis_oms,
                     v.loc_code,
                     v.geb_code,
                     v.ver_code,
                     v.sp_nummer,
                     v.sp_naam,
                     v.ruimtesoort,
                     v.m2_tarief,
                     v.m2_wpnorm) x)
/

/* Formatted on 9-1-2009 13:42:38 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW curs_v_rap_hv_leegstand
(
	hide_f_sortering,
	fclt_f_district,
	fclt_f_locatie,
	fclt_f_gebouw,
	totaal_opp,
	leegst_opp,
	leegst_ratio
)
AS
	(SELECT	 '-',
				 tot.dis_oms,
				 tot.loc_code,
				 tot.geb_code,
				 REPLACE (TO_CHAR (COALESCE (tot.reken_opp, 0), '999999990D99'),
							 '.',
							 ','
							)
					 tot_opp,
				 REPLACE (TO_CHAR (COALESCE (leeg.reken_opp, 0), '999999990D99'),
							 '.',
							 ','
							)
					 lg_opp,
				 DECODE (
					 leeg.reken_opp,
					 NULL,
					 '0,00',
					 0,
					 '0,00',
					 REPLACE (
						 TO_CHAR (leeg.reken_opp / tot.reken_opp * 100,
									 '999999990D99'
									),
						 '.',
						 ','
					 )
				 )
				 || '%'
					 lg_ratio
		FROM		 (  SELECT	 v.geb_code,
									 v.loc_code,
									 v.dis_oms,
									 SUM(DECODE (
											  UPPER (v.ruimtesoort),
											  'OPEN WERKPLEK',
												 v.wp_cap
											  * v.m2_wpnorm
											  * COALESCE (v.bezetting, 100)
											  / 100,
												 v.teken_opp
											  * COALESCE (v.bezetting, 100)
											  / 100
										  ))
										 reken_opp
							FROM	 curs_v_hv_actual v
					  GROUP BY	 v.geb_code, v.loc_code, v.dis_oms) tot
				 LEFT JOIN
					 (  SELECT	 v.geb_code,
									 SUM(DECODE (
											  UPPER (v.ruimtesoort),
											  'OPEN WERKPLEK',
												 v.wp_cap
											  * v.m2_wpnorm
											  * COALESCE (v.bezetting, 100)
											  / 100,
												 v.teken_opp
											  * COALESCE (v.bezetting, 100)
											  / 100
										  ))
										 reken_opp
							FROM	 curs_v_hv_actual v
						  WHERE	 v.sp_nummer IS NULL
					  GROUP BY	 v.geb_code) leeg
				 ON tot.geb_code = leeg.geb_code)
	UNION ALL
	(SELECT	 'z',
				 'LANDELIJK',
				 '-',
				 '-',
				 REPLACE (
					 TO_CHAR (SUM (COALESCE (tot.reken_opp, 0)), '999999990D99'),
					 '.',
					 ','
				 )
					 tot_opp,
				 REPLACE (
					 TO_CHAR (SUM (COALESCE (leeg.reken_opp, 0)), '999999990D99'),
					 '.',
					 ','
				 )
					 lg_opp,
				 DECODE (
					 SUM (COALESCE (leeg.reken_opp, 0)),
					 NULL,
					 '0,00',
					 0,
					 '0,00',
					 REPLACE (
						 TO_CHAR (
								SUM (COALESCE (leeg.reken_opp, 0))
							 / SUM (COALESCE (tot.reken_opp, 0))
							 * 100,
							 '999999990D99'
						 ),
						 '.',
						 ','
					 )
				 )
				 || '%'
					 lg_ratio
		FROM		 (  SELECT	 v.geb_code,
									 v.loc_code,
									 v.dis_oms,
									 SUM(DECODE (
											  UPPER (v.ruimtesoort),
											  'OPEN WERKPLEK',
												 v.wp_cap
											  * v.m2_wpnorm
											  * COALESCE (v.bezetting, 100)
											  / 100,
												 v.teken_opp
											  * COALESCE (v.bezetting, 100)
											  / 100
										  ))
										 reken_opp
							FROM	 curs_v_hv_actual v
					  GROUP BY	 v.geb_code, v.loc_code, v.dis_oms) tot
				 LEFT JOIN
					 (  SELECT	 v.geb_code,
									 SUM(DECODE (
											  UPPER (v.ruimtesoort),
											  'OPEN WERKPLEK',
												 v.wp_cap
											  * v.m2_wpnorm
											  * COALESCE (v.bezetting, 100)
											  / 100,
												 v.teken_opp
											  * COALESCE (v.bezetting, 100)
											  / 100
										  ))
										 reken_opp
							FROM	 curs_v_hv_actual v
						  WHERE	 v.sp_nummer IS NULL
					  GROUP BY	 v.geb_code) leeg
				 ON tot.geb_code = leeg.geb_code)
/

/* Formatted on 2009/01/08 13:55 (Formatter Plus v4.8.7) */
/* MAG WEG OF NIET? - NIET AANGEBODEN! */
CREATE OR REPLACE VIEW curs_v_rap_hv_lg_frozen (hide_f_sortering,
                                                fclt_f_datum,
                                                fclt_f_district,
                                                fclt_f_locatie,
                                                fclt_f_gebouw,
                                                totaal_opp,
                                                leegst_opp,
                                                leegst_ratio
                                               )
AS
   (SELECT TO_CHAR (tot.freeze_datum, 'YYYY-MM-DD') datum, '-', tot.dis_oms,
           tot.loc_code, tot.geb_code,
           REPLACE (TO_CHAR (tot.reken_opp, '999999990D99'), '.',
                    ',') tot_opp,
           REPLACE (TO_CHAR (leeg.reken_opp, '999999990D99'), '.',
                    ',') lg_opp,
              REPLACE (TO_CHAR (leeg.reken_opp / tot.reken_opp * 100,
                                '999999990D99'
                               ),
                       '.',
                       ','
                      )
           || '%' lg_ratio
      FROM (SELECT   v.geb_code, v.loc_code, v.dis_oms, v.freeze_datum,
                     SUM (DECODE (UPPER (v.ruimtesoort),
                                  'OPEN WERKPLEK', v.wp_cap
                                   * v.m2_wpnorm
                                   * COALESCE (v.bezetting, 100)
                                   / 100,
                                    v.teken_opp
                                  * COALESCE (v.bezetting, 100)
                                  / 100
                                 )
                         ) reken_opp
                FROM curs_hv_freeze v
            GROUP BY v.geb_code, v.loc_code, v.dis_oms, v.freeze_datum) tot
           LEFT JOIN
           (SELECT   v.geb_code, v.freeze_datum,
                     SUM (DECODE (UPPER (v.ruimtesoort),
                                  'OPEN WERKPLEK', v.wp_cap
                                   * v.m2_wpnorm
                                   * COALESCE (v.bezetting, 100)
                                   / 100,
                                    v.teken_opp
                                  * COALESCE (v.bezetting, 100)
                                  / 100
                                 )
                         ) reken_opp
                FROM curs_hv_freeze v
               WHERE v.sp_nummer IS NULL
            GROUP BY v.geb_code, v.freeze_datum) leeg
           ON tot.geb_code = leeg.geb_code
         AND tot.freeze_datum = leeg.freeze_datum
           )
   UNION ALL
   (SELECT   TO_CHAR (tot.freeze_datum, 'YYYY-MM-DD') datum, 'z', 'LANDELIJK',
             '-', '-',
             REPLACE (TO_CHAR (SUM (tot.reken_opp), '999999990D99'),
                      '.',
                      ','
                     ) tot_opp,
             REPLACE (TO_CHAR (SUM (leeg.reken_opp), '999999990D99'),
                      '.',
                      ','
                     ) lg_opp,
                REPLACE (TO_CHAR (  SUM (leeg.reken_opp)
                                  / SUM (tot.reken_opp)
                                  * 100,
                                  '999999990D99'
                                 ),
                         '.',
                         ','
                        )
             || '%' lg_ratio
        FROM (SELECT   v.geb_code, v.loc_code, v.dis_oms, v.freeze_datum,
                       SUM (DECODE (UPPER (v.ruimtesoort),
                                    'OPEN WERKPLEK', v.wp_cap
                                     * v.m2_wpnorm
                                     * COALESCE (v.bezetting, 100)
                                     / 100,
                                      v.teken_opp
                                    * COALESCE (v.bezetting, 100)
                                    / 100
                                   )
                           ) reken_opp
                  FROM curs_hv_freeze v
              GROUP BY v.geb_code, v.loc_code, v.dis_oms, v.freeze_datum) tot
             LEFT JOIN
             (SELECT   v.geb_code, v.freeze_datum,
                       SUM (DECODE (UPPER (v.ruimtesoort),
                                    'OPEN WERKPLEK', v.wp_cap
                                     * v.m2_wpnorm
                                     * COALESCE (v.bezetting, 100)
                                     / 100,
                                      v.teken_opp
                                    * COALESCE (v.bezetting, 100)
                                    / 100
                                   )
                           ) reken_opp
                  FROM curs_hv_freeze v
                 WHERE v.sp_nummer IS NULL
              GROUP BY v.geb_code, v.freeze_datum) leeg
             ON tot.geb_code = leeg.geb_code
           AND tot.freeze_datum = leeg.freeze_datum
    GROUP BY tot.freeze_datum)
/

/* Formatted on 19-1-2009 13:15:45 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW curs_v_rap_hv_doorbel_delta
(
	fclt_f_district,
	fclt_f_locatie,
	fclt_f_gebouw,
	fclt_f_afdeling_nr,
	fclt_f_afdeling_naam,
	m2_nu,
	m2_delta
)
AS
	(SELECT	 DISTINCT
				 z.dis, z.loc, z.geb, z.nr, z.naam, z.m2_actueel, z.m2_verschil
		FROM	 (SELECT   COALESCE (x.dis, y.dis) dis,
							  COALESCE (x.loc, y.loc) loc,
							  COALESCE (x.geb, y.geb) geb,
							  COALESCE (x.nr, y.nr) nr,
							  DECODE (x.naam,
										 COALESCE (y.naam, x.naam), x.naam,
										 '***GEWIJZIGD: ' || COALESCE (x.naam, '')
										)
								  naam,
							  x.m2 m2_actueel,
							  y.m2 m2_laatste,
							  (COALESCE (x.m2, 0) - COALESCE (y.m2, 0)) m2_verschil
					 FROM 	  (SELECT	fclt_f_district dis,
												fclt_f_locatie loc,
												fclt_f_gebouw geb,
												fclt_f_afdeling_nr nr,
												fclt_f_afdeling_naam naam,
												aantal_m2 m2,
												kosten kosten
									  FROM	curs_v_rap_hv_doorbelasting) x
							  LEFT JOIN
								  (SELECT	fclt_f_district dis,
												fclt_f_locatie loc,
												fclt_f_gebouw geb,
												fclt_f_afdeling_nr nr,
												fclt_f_afdeling_naam naam,
												aantal_m2 m2,
												kosten kosten
									  FROM	curs_v_rap_hv_doorbelfrozen
									 WHERE	fclt_f_datum =
													(	SELECT	TO_CHAR (MAX (freeze_datum),
																				'yyyy-mm-dd'
																			  )
														  FROM	curs_hv_freeze)) y
							  ON		x.dis = y.dis
								  AND x.loc = y.loc
								  AND x.geb = y.geb
								  AND x.nr = y.nr
				  UNION
				  SELECT   COALESCE (x.dis, y.dis) dis,
							  COALESCE (x.loc, y.loc) loc,
							  COALESCE (x.geb, y.geb) geb,
							  COALESCE (x.nr, y.nr) nr,
							  DECODE (y.naam,
										 COALESCE (x.naam, y.naam), y.naam,
										 '***GEWIJZIGD: ' || COALESCE (x.naam, '')
										)
								  naam,
							  x.m2 m2_actueel,
							  y.m2 m2_laatste,
							  (COALESCE (x.m2, 0) - COALESCE (y.m2, 0)) m2_verschil
					 FROM 	  (SELECT	fclt_f_district dis,
												fclt_f_locatie loc,
												fclt_f_gebouw geb,
												fclt_f_afdeling_nr nr,
												fclt_f_afdeling_naam naam,
												aantal_m2 m2,
												kosten kosten
									  FROM	curs_v_rap_hv_doorbelasting) x
							  RIGHT JOIN
								  (SELECT	fclt_f_district dis,
												fclt_f_locatie loc,
												fclt_f_gebouw geb,
												fclt_f_afdeling_nr nr,
												fclt_f_afdeling_naam naam,
												aantal_m2 m2,
												kosten kosten
									  FROM	curs_v_rap_hv_doorbelfrozen
									 WHERE	fclt_f_datum =
													(	SELECT	TO_CHAR (MAX (freeze_datum),
																				'yyyy-mm-dd'
																			  )
														  FROM	curs_hv_freeze)) y
							  ON		x.dis = y.dis
								  AND x.loc = y.loc
								  AND x.geb = y.geb
								  AND x.nr = y.nr) z);

/* Formatted on 19-1-2009 13:15:45 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW curs_v_rap_hv_details_delta
(
	fclt_f_district,
	fclt_f_locatie,
	fclt_f_gebouw,
	fclt_f_verdieping,
	ruimte_nr,
	fclt_f_afdeling_nr,
	fclt_f_afdeling_naam,
	fclt_f_ruimtesoort,
	wp_nu,
	wp_delta,
	m2_nu,
	m2_delta
)
AS
	(SELECT	 DISTINCT
				 z.dis,
				 z.loc,
				 z.geb,
				 z.ver,
				 z.rui,
				 z.nr,
				 z.naam,
				 z.soort,
				 z.wp_actueel,
				 z.wp_verschil,
				 z.m2_actueel,
				 z.m2_verschil
		FROM	 (SELECT   COALESCE (x.dis_oms, y.dis_oms) dis,
							  COALESCE (x.loc_code, y.loc_code) loc,
							  COALESCE (x.geb_code, y.geb_code) geb,
							  COALESCE (x.ver_code, y.ver_code) ver,
							  COALESCE (x.ruimte_nr, y.ruimte_nr) rui,
							  COALESCE (x.sp_nr, y.sp_nr) nr,
							  DECODE (x.sp_naam,
										 COALESCE (y.sp_naam, x.sp_naam), x.sp_naam,
										 '***GEWIJZIGD: ' || COALESCE (x.sp_naam, '')
										)
								  naam,
							  DECODE (
								  x.ruimtesoort,
								  COALESCE (y.ruimtesoort, x.ruimtesoort),
								  x.ruimtesoort,
								  '***GEWIJZIGD: ' || COALESCE (x.ruimtesoort, '')
							  )
								  soort,
							  x.wp wp_actueel,
							  y.wp wp_laatste,
							  (COALESCE (x.wp, 0) - COALESCE (y.wp, 0)) wp_verschil,
							  x.m2 m2_actueel,
							  y.m2 m2_laatste,
							  (COALESCE (x.m2, 0) - COALESCE (y.m2, 0)) m2_verschil
					 FROM 	  (SELECT	v.dis_oms,
												v.loc_code,
												v.geb_code,
												v.ver_code,
												v.ruimte_nr,
												COALESCE (v.sp_nummer, '[Leegstand]')
													sp_nr,
												v.sp_naam,
												v.ruimtesoort,
												v.bezetting bez,
												v.wp_cap wp,
												(DECODE (UPPER (v.ruimtesoort),
															'OPEN WERKPLEK',
															v.wp_cap * v.m2_wpnorm,
															v.teken_opp
														  )
												 * COALESCE (v.bezetting, 100)
												 / 100)
													m2
									  FROM	curs_v_hv_actual v) x
							  LEFT JOIN
								  (SELECT	v.dis_oms,
												v.loc_code,
												v.geb_code,
												v.ver_code,
												v.ruimte_nr,
												COALESCE (v.sp_nummer, '[Leegstand]')
													sp_nr,
												v.sp_naam,
												v.ruimtesoort,
												v.bezetting bez,
												v.wp_cap wp,
												(DECODE (UPPER (v.ruimtesoort),
															'OPEN WERKPLEK',
															v.wp_cap * v.m2_wpnorm,
															v.teken_opp
														  )
												 * COALESCE (v.bezetting, 100)
												 / 100)
													m2
									  FROM	curs_hv_freeze v
									 WHERE	TRUNC (v.freeze_datum) =
													(	SELECT	TRUNC (MAX (freeze_datum))
														  FROM	curs_hv_freeze)) y
							  ON		x.dis_oms = y.dis_oms
								  AND x.loc_code = y.loc_code
								  AND x.geb_code = y.geb_code
								  AND x.ver_code = y.ver_code
								  AND x.ruimte_nr = y.ruimte_nr
								  AND x.sp_nr = y.sp_nr
				  UNION
				  SELECT   COALESCE (x.dis_oms, y.dis_oms) dis,
							  COALESCE (x.loc_code, y.loc_code) loc,
							  COALESCE (x.geb_code, y.geb_code) geb,
							  COALESCE (x.ver_code, y.ver_code) ver,
							  COALESCE (x.ruimte_nr, y.ruimte_nr) rui,
							  COALESCE (x.sp_nr, y.sp_nr) nr,
							  DECODE (y.sp_naam,
										 COALESCE (x.sp_naam, y.sp_naam), y.sp_naam,
										 '***GEWIJZIGD: ' || COALESCE (x.sp_naam, '')
										)
								  naam,
							  DECODE (
								  y.ruimtesoort,
								  COALESCE (x.ruimtesoort, y.ruimtesoort),
								  y.ruimtesoort,
								  '***GEWIJZIGD: ' || COALESCE (x.ruimtesoort, '')
							  )
								  soort,
							  x.wp wp_actueel,
							  y.wp wp_laatste,
							  (COALESCE (x.wp, 0) - COALESCE (y.wp, 0)) wp_verschil,
							  x.m2 m2_actueel,
							  y.m2 m2_laatste,
							  (COALESCE (x.m2, 0) - COALESCE (y.m2, 0)) m2_verschil
					 FROM 	  (SELECT	v.dis_oms,
												v.loc_code,
												v.geb_code,
												v.ver_code,
												v.ruimte_nr,
												COALESCE (v.sp_nummer, '[Leegstand]')
													sp_nr,
												v.sp_naam,
												v.ruimtesoort,
												v.bezetting bez,
												v.wp_cap wp,
												(DECODE (UPPER (v.ruimtesoort),
															'OPEN WERKPLEK',
															v.wp_cap * v.m2_wpnorm,
															v.teken_opp
														  )
												 * COALESCE (v.bezetting, 100)
												 / 100)
													m2
									  FROM	curs_v_hv_actual v) x
							  RIGHT JOIN
								  (SELECT	v.dis_oms,
												v.loc_code,
												v.geb_code,
												v.ver_code,
												v.ruimte_nr,
												COALESCE (v.sp_nummer, '[Leegstand]')
													sp_nr,
												v.sp_naam,
												v.ruimtesoort,
												v.bezetting bez,
												v.wp_cap wp,
												(DECODE (UPPER (v.ruimtesoort),
															'OPEN WERKPLEK',
															v.wp_cap * v.m2_wpnorm,
															v.teken_opp
														  )
												 * COALESCE (v.bezetting, 100)
												 / 100)
													m2
									  FROM	curs_hv_freeze v
									 WHERE	TRUNC (v.freeze_datum) =
													(	SELECT	TRUNC (MAX (freeze_datum))
														  FROM	curs_hv_freeze)) y
							  ON		x.dis_oms = y.dis_oms
								  AND x.loc_code = y.loc_code
								  AND x.geb_code = y.geb_code
								  AND x.ver_code = y.ver_code
								  AND x.ruimte_nr = y.ruimte_nr
								  AND x.sp_nr = y.sp_nr) z);

/* Formatted on 2008/11/27 12:45 (Formatter Plus v4.8.7) */
CREATE OR REPLACE VIEW curs_v_label_ruimte_sp (
   alg_ruimte_key,
   waarde
   )
AS
   SELECT DISTINCT ra.alg_ruimte_key, a.prs_afdeling_naam1
   FROM prs_v_aanwezigruimteafdeling ra, prs_v_aanwezigafdeling a
   WHERE ra.prs_afdeling_key = a.prs_afdeling_key
   UNION
   SELECT DISTINCT r.alg_ruimte_key, '[Leegstand]'        -- ruimten zonder sp
   FROM alg_v_aanwezigruimte r
   WHERE NOT EXISTS (                           -- waar geen sp binnen bestaat
                     SELECT ra.alg_ruimte_key
                     FROM prs_v_aanwezigruimteafdeling ra
                     WHERE ra.alg_ruimte_key = r.alg_ruimte_key)
/

CREATE OR REPLACE VIEW curs_v_prj_label_ruimte_sp (
   prj_ruimte_key,
   waarde
   )
AS
   SELECT DISTINCT ra.prj_ruimte_key, a.prs_afdeling_naam1
   FROM prj_ruimteafdeling ra, prs_v_aanwezigafdeling a
   WHERE ra.prs_afdeling_key = a.prs_afdeling_key
   UNION
   SELECT DISTINCT r.prj_ruimte_key, '[Leegstand]'        -- ruimten zonder sp
   FROM prj_ruimte r
   WHERE r.prj_ruimte_verwijder IS NULL
         AND NOT EXISTS
               (                                -- waar geen sp binnen bestaat
                SELECT ra.prj_ruimte_key
                FROM prj_ruimteafdeling ra
                WHERE ra.prj_ruimteafdeling_verwijder IS NULL
                      AND ra.prj_ruimte_key = r.prj_ruimte_key)
/

/* Formatted on 2008/09/19 14:14 (Formatter Plus v4.8.7) */
CREATE OR REPLACE VIEW curs_v_label_ruimte_sp_nr (alg_ruimte_key, waarde)
AS
   SELECT DISTINCT ra.alg_ruimte_key, a.prs_afdeling_naam
   FROM prs_v_aanwezigruimteafdeling ra, prs_v_aanwezigafdeling a
   WHERE ra.prs_afdeling_key = a.prs_afdeling_key
   UNION
   SELECT DISTINCT r.alg_ruimte_key, '[Leegstand]'        -- ruimten zonder sp
   FROM alg_v_aanwezigruimte r
   WHERE NOT EXISTS (                           -- waar geen sp binnen bestaat
                     SELECT ra.alg_ruimte_key
                     FROM prs_v_aanwezigruimteafdeling ra
                     WHERE ra.alg_ruimte_key = r.alg_ruimte_key)
/

CREATE OR REPLACE VIEW curs_v_prj_label_ruimte_sp_nr (prj_ruimte_key, waarde)
AS
   SELECT DISTINCT ra.prj_ruimte_key, a.prs_afdeling_naam
   FROM prj_ruimteafdeling ra, prs_v_aanwezigafdeling a
   WHERE ra.prs_afdeling_key = a.prs_afdeling_key
   UNION
   SELECT DISTINCT r.prj_ruimte_key, '[Leegstand]'        -- ruimten zonder sp
   FROM prj_ruimte r
   WHERE r.prj_ruimte_verwijder IS NULL
         AND NOT EXISTS
               (                                -- waar geen sp binnen bestaat
                SELECT ra.prj_ruimte_key
                FROM prj_ruimteafdeling ra
                WHERE ra.prj_ruimteafdeling_verwijder IS NULL
                      AND ra.prj_ruimte_key = r.prj_ruimte_key)
/

/* Formatted on 2008/09/19 14:14 (Formatter Plus v4.8.7) */
CREATE OR REPLACE VIEW curs_v_label_ruimte_sp_oms (alg_ruimte_key, waarde)
AS
   SELECT DISTINCT ra.alg_ruimte_key, a.prs_afdeling_omschrijving
   FROM prs_v_aanwezigruimteafdeling ra, prs_v_aanwezigafdeling a
   WHERE ra.prs_afdeling_key = a.prs_afdeling_key
   UNION
   SELECT DISTINCT r.alg_ruimte_key, '[Leegstand]'        -- ruimten zonder sp
   FROM alg_v_aanwezigruimte r
   WHERE NOT EXISTS (                           -- waar geen sp binnen bestaat
                     SELECT ra.alg_ruimte_key
                     FROM prs_v_aanwezigruimteafdeling ra
                     WHERE ra.alg_ruimte_key = r.alg_ruimte_key)
/

CREATE OR REPLACE VIEW curs_v_prj_label_ruimte_sp_oms (prj_ruimte_key, waarde)
AS
   SELECT DISTINCT ra.prj_ruimte_key, a.prs_afdeling_omschrijving
   FROM prj_ruimteafdeling ra, prs_v_aanwezigafdeling a
   WHERE ra.prs_afdeling_key = a.prs_afdeling_key
   UNION
   SELECT DISTINCT r.prj_ruimte_key, '[Leegstand]'        -- ruimten zonder sp
   FROM prj_ruimte r
   WHERE r.prj_ruimte_verwijder IS NULL
         AND NOT EXISTS
               (                                -- waar geen sp binnen bestaat
                SELECT ra.prj_ruimte_key
                FROM prj_ruimteafdeling ra
                WHERE ra.prj_ruimteafdeling_verwijder IS NULL
                      AND ra.prj_ruimte_key = r.prj_ruimte_key)
/

/* Formatted on 2008/09/19 14:14 (Formatter Plus v4.8.7) */
CREATE OR REPLACE VIEW curs_v_label_wp_cnt (alg_ruimte_key, waarde)
AS
   SELECT a.alg_ruimte_key, COALESCE (b.wp, '0') || ' werkplekken'
     FROM (SELECT r.alg_ruimte_key
             FROM alg_v_aanwezigruimte r) a
          LEFT JOIN
          (SELECT ok.alg_onrgoed_key, ok.alg_onrgoedkenmerk_waarde wp
             FROM alg_onrgoedkenmerk ok
            WHERE ok.alg_onrgoed_niveau = 'R'
              AND ok.alg_kenmerk_key = 1240                     -- werkplekken
              AND ok.alg_onrgoedkenmerk_verwijder IS NULL) b
          ON a.alg_ruimte_key = b.alg_onrgoed_key
/

CREATE OR REPLACE VIEW curs_v_prj_label_wp_cnt (prj_ruimte_key, waarde)
AS
   SELECT a.prj_ruimte_key, COALESCE (b.wp, '0') || ' werkplekken'
     FROM (SELECT r.prj_ruimte_key
             FROM prj_ruimte r
            WHERE r.prj_ruimte_verwijder IS NULL) a
          LEFT JOIN
          (SELECT r.prj_ruimte_key, ok.alg_onrgoedkenmerk_waarde wp
             FROM prj_ruimte r, alg_onrgoedkenmerk ok
            WHERE r.alg_ruimte_key = ok.alg_onrgoed_key
              AND ok.alg_onrgoed_niveau = 'R'
              AND ok.alg_kenmerk_key = 1240                     -- werkplekken
              AND ok.alg_onrgoedkenmerk_verwijder IS NULL) b
          ON a.prj_ruimte_key = b.prj_ruimte_key
/

/* Formatted on 2008/11/28 13:40 (Formatter Plus v4.8.7) */
CREATE OR REPLACE FORCE VIEW curs_v_thema_ruimte_sp (
   alg_ruimte_key,
   waarde,
   waarde_key
   )
AS
   SELECT x.alg_ruimte_key,
          DECODE (y.aantal,
             NULL, '[Leegstand]',
             1, SUBSTR (y.sp, 1, 60),
             'Meer dan 1 service afdeling!'),
          DECODE (y.aantal, NULL, -1, 1, y.sp_key, NULL)
   FROM    (SELECT r.alg_ruimte_key
            FROM alg_v_aanwezigruimte r) x
        LEFT JOIN
           (SELECT ra.alg_ruimte_key,
                   MIN (a.prs_afdeling_naam1) sp,
                   MIN (a.prs_afdeling_key) sp_key,
                   COUNT (ra.prs_afdeling_key) aantal
            FROM prs_v_aanwezigruimteafdeling ra, prs_v_aanwezigafdeling a
            WHERE ra.prs_afdeling_key = a.prs_afdeling_key
            GROUP BY ra.alg_ruimte_key) y
        ON x.alg_ruimte_key = y.alg_ruimte_key
   UNION ALL
   SELECT NULL, a.prs_afdeling_naam1, a.prs_afdeling_key
   FROM prs_v_aanwezigafdeling a
   WHERE NOT EXISTS
            (SELECT ra.prs_afdeling_key
             FROM prs_v_aanwezigruimteafdeling ra
             WHERE ra.prs_afdeling_key = a.prs_afdeling_key)
/

CREATE OR REPLACE TRIGGER curs_t_thema_ruimte_sp_i_iu
   INSTEAD OF INSERT OR UPDATE
   ON curs_v_thema_ruimte_sp
BEGIN
   IF UPDATING           -- oude hard weggooien; dus DELETE (lekker opruimen)!
   THEN
      DELETE FROM prs_ruimteafdeling
      WHERE alg_ruimte_key = :new.alg_ruimte_key
            AND prs_afdeling_key <> :new.waarde_key;
   END IF;

   BEGIN
      IF :new.waarde_key <> -1
      THEN
         INSERT INTO prs_ruimteafdeling
        (
            alg_ruimte_key, prs_afdeling_key
        )
         VALUES (:new.alg_ruimte_key, :new.waarde_key);
      END IF;
   EXCEPTION
      WHEN DUP_VAL_ON_INDEX                                 -- was al aanwezig
      THEN
         NULL;
   END;
END;
/

CREATE OR REPLACE VIEW curs_v_prj_thema_ruimte_sp (
   prj_ruimte_key,
   waarde,
   waarde_key
   )
AS
   SELECT x.prj_ruimte_key,
          DECODE (y.aantal,
             NULL, '[Leegstand]',
             1, SUBSTR (y.sp, 1, 60),
             'Meer dan 1 service afdeling!'),
          DECODE (y.aantal, NULL, -1, 1, y.sp_key, NULL)
   FROM    (SELECT r.prj_ruimte_key
            FROM prj_ruimte r
            WHERE r.prj_ruimte_verwijder IS NULL) x
        LEFT JOIN
           (SELECT ra.prj_ruimte_key,
                   MIN (a.prs_afdeling_naam1) sp,
                   MIN (a.prs_afdeling_key) sp_key,
                   COUNT (ra.prs_afdeling_key) aantal
            FROM prj_ruimteafdeling ra, prs_v_aanwezigafdeling a
            WHERE ra.prj_ruimteafdeling_verwijder IS NULL
                  AND ra.prs_afdeling_key = a.prs_afdeling_key
            GROUP BY ra.prj_ruimte_key) y
        ON x.prj_ruimte_key = y.prj_ruimte_key
   UNION ALL
   SELECT NULL, a.prs_afdeling_naam1, a.prs_afdeling_key
   FROM prs_v_aanwezigafdeling a
   WHERE NOT EXISTS
            (SELECT ra.prs_afdeling_key
             FROM prj_ruimteafdeling ra
             WHERE ra.prj_ruimteafdeling_verwijder IS NULL
                   AND ra.prs_afdeling_key = a.prs_afdeling_key)
/

CREATE OR REPLACE TRIGGER curs_t_prj_t_ruimte_sp_i_iu
   INSTEAD OF INSERT OR UPDATE
   ON curs_v_prj_thema_ruimte_sp
BEGIN
   IF UPDATING                     -- oude logisch weggooien, dus géén DELETE!
   THEN
      UPDATE prj_ruimteafdeling
      SET prj_ruimteafdeling_verwijder    = SYSDATE
      WHERE prj_ruimte_key = :new.prj_ruimte_key
            AND prs_afdeling_key <> :new.waarde_key;
   END IF;

   BEGIN
      IF :new.waarde_key <> -1
      THEN
         UPDATE prj_ruimteafdeling
         SET prj_ruimteafdeling_verwijder    = NULL
         WHERE prj_ruimte_key = :new.prj_ruimte_key
               AND prs_afdeling_key = :new.waarde_key;

         INSERT INTO prj_ruimteafdeling
        (
            prj_ruimte_key, prs_afdeling_key
        )
         VALUES (:new.prj_ruimte_key, :new.waarde_key);
      END IF;
   EXCEPTION
      WHEN DUP_VAL_ON_INDEX                                 -- was al aanwezig
      THEN
         NULL;
   END;
END;
/

CREATE OR REPLACE VIEW curs_v_thema_ruimteafd
(
   ALG_RUIMTE_KEY,
   WAARDE,
   WAARDE_KEY
)
AS
   SELECT x.alg_ruimte_key,
          DECODE (y.aantal,
                  NULL, '[Leegstand]',
                  1, SUBSTR (y.sp, 1, 60),
                  '[Meerdere afdelingen]'),
          DECODE (y.aantal, NULL, -1, 1, y.sp_key, NULL)
     FROM    (SELECT r.alg_ruimte_key
                FROM alg_v_aanwezigruimte r) x
          LEFT JOIN
             (  SELECT ra.alg_ruimte_key,
                       MIN (a.prs_afdeling_naam1) sp,
                       MIN (a.prs_afdeling_key) sp_key,
                       COUNT (ra.prs_afdeling_key) aantal
                  FROM prs_v_aanwezigruimteafdeling ra,
                       prs_v_aanwezigafdeling a
                 WHERE ra.prs_afdeling_key = a.prs_afdeling_key
              GROUP BY ra.alg_ruimte_key) y
          ON x.alg_ruimte_key = y.alg_ruimte_key
   UNION ALL
   SELECT NULL, SUBSTR (a.prs_afdeling_naam1, 1, 60), a.prs_afdeling_key
     FROM prs_v_aanwezigafdeling a
    WHERE NOT EXISTS (SELECT ra.prs_afdeling_key
                        FROM prs_v_aanwezigruimteafdeling ra
                       WHERE ra.prs_afdeling_key = a.prs_afdeling_key);

CREATE OR REPLACE TRIGGER curs_t_thema_ruimteafd_i_iu
   INSTEAD OF INSERT OR UPDATE
   ON curs_v_thema_ruimteafd
BEGIN
   IF UPDATING           -- oude hard weggooien; dus DELETE (lekker opruimen)!
   THEN
      DELETE FROM prs_ruimteafdeling
      WHERE alg_ruimte_key = :new.alg_ruimte_key
            AND prs_afdeling_key <> :new.waarde_key;
   END IF;

   BEGIN
      IF :new.waarde_key <> -1
      THEN
         INSERT INTO prs_ruimteafdeling
        (
            alg_ruimte_key, prs_afdeling_key
        )
         VALUES (:new.alg_ruimte_key, :new.waarde_key);
      END IF;
   EXCEPTION
      WHEN DUP_VAL_ON_INDEX                                 -- was al aanwezig
      THEN
         NULL;
   END;
END;
/

/* Formatted on 2008/09/19 15:30 (Formatter Plus v4.8.7) */
CREATE OR REPLACE VIEW curs_v_thema_wp_cnt (alg_ruimte_key, waarde)
AS
   SELECT a.alg_ruimte_key,
          DECODE (b.wp,
                  NULL, '0',
                  '0', '0',
                  '1', '1',
                  '2', '2',
                  '3', '3',
                  '4', '4',
                  '5', '5',
                  '>5'
                 )
     FROM (SELECT r.alg_ruimte_key
             FROM alg_v_aanwezigruimte r) a
          LEFT JOIN
          (SELECT ok.alg_onrgoed_key, ok.alg_onrgoedkenmerk_waarde wp
             FROM alg_onrgoedkenmerk ok
            WHERE ok.alg_onrgoed_niveau = 'R'
              AND ok.alg_kenmerk_key = 1240                     -- werkplekken
              AND ok.alg_onrgoedkenmerk_verwijder IS NULL) b
          ON a.alg_ruimte_key = b.alg_onrgoed_key
/

CREATE OR REPLACE VIEW curs_v_prj_thema_wp_cnt (prj_ruimte_key, waarde)
AS
   SELECT a.prj_ruimte_key,
          DECODE (b.wp,
                  NULL, '0',
                  '0', '0',
                  '1', '1',
                  '2', '2',
                  '3', '3',
                  '4', '4',
                  '5', '5',
                  '>5'
                 )
     FROM (SELECT r.prj_ruimte_key
             FROM prj_ruimte r
            WHERE r.prj_ruimte_verwijder IS NULL) a
          LEFT JOIN
          (SELECT r.prj_ruimte_key, ok.alg_onrgoedkenmerk_waarde wp
             FROM prj_ruimte r, alg_onrgoedkenmerk ok
            WHERE r.alg_ruimte_key = ok.alg_onrgoed_key
              AND ok.alg_onrgoed_niveau = 'R'
              AND ok.alg_kenmerk_key = 1240                     -- werkplekken
              AND ok.alg_onrgoedkenmerk_verwijder IS NULL) b
          ON a.prj_ruimte_key = b.prj_ruimte_key
/


-- Real-time monitors
CREATE OR REPLACE VIEW demo_v_graph_meldingpm_fm
(
   fclt_xas_,
   fclt_yas_,
   volgorde
)
AS
     SELECT DECODE( lcl.getuserlanguage(),
               'NL', DECODE (SUBSTR (TO_CHAR (mld_melding_datum, 'yyyymm'), 5),
                       '01', 'Januari',
                       '02', 'Februari',
                       '03', 'Maart',
                       '04', 'April',
                       '05', 'Mei',
                       '06', 'Juni',
                       '07', 'Juli',
                       '08', 'Augustus',
                       '09', 'September',
                       '10', 'Oktober',
                       '11', 'November',
                       'December'),
               DECODE (SUBSTR (TO_CHAR (mld_melding_datum, 'yyyymm'), 5),
                       '01', 'January',
                       '02', 'February',
                       '03', 'March',
                       '04', 'April',
                       '05', 'May',
                       '06', 'June',
                       '07', 'July',
                       '08', 'August',
                       '09', 'September',
                       '10', 'October',
                       '11', 'November',
                       'December') ),
            COUNT (d.ins_discipline_omschrijving),
            TO_CHAR (mld_melding_datum, 'yyyymm')
       FROM mld_melding m, mld_stdmelding std, ins_tab_discipline d
      WHERE mld_melding_datum BETWEEN ADD_MONTHS (
                                         TO_DATE (
                                            TO_CHAR (SYSDATE, 'yyyymm') || '01',
                                            'yyyymmdd'),
                                         -11)
                                  AND  SYSDATE
            AND m.mld_stdmelding_key = std.mld_stdmelding_key
            AND std.mld_ins_discipline_key = d.ins_discipline_key
            AND d.ins_srtdiscipline_key IN (1, 81, 101, 241)
   GROUP BY TO_CHAR (mld_melding_datum, 'yyyymm');

CREATE OR REPLACE VIEW demo_v_graph_meldingpm_ict
(
   fclt_xas_,
   fclt_yas_,
   volgorde
)
AS
     SELECT DECODE( lcl.getuserlanguage(),
               'NL', DECODE (SUBSTR (TO_CHAR (mld_melding_datum, 'yyyymm'), 5),
                       '01', 'Januari',
                       '02', 'Februari',
                       '03', 'Maart',
                       '04', 'April',
                       '05', 'Mei',
                       '06', 'Juni',
                       '07', 'Juli',
                       '08', 'Augustus',
                       '09', 'September',
                       '10', 'Oktober',
                       '11', 'November',
                       'December'),
               DECODE (SUBSTR (TO_CHAR (mld_melding_datum, 'yyyymm'), 5),
                       '01', 'January',
                       '02', 'February',
                       '03', 'March',
                       '04', 'April',
                       '05', 'May',
                       '06', 'June',
                       '07', 'July',
                       '08', 'August',
                       '09', 'September',
                       '10', 'October',
                       '11', 'November',
                       'December') ),
            COUNT (d.ins_discipline_omschrijving),
            TO_CHAR (mld_melding_datum, 'yyyymm')
       FROM mld_melding m, mld_stdmelding std, ins_tab_discipline d
      WHERE mld_melding_datum BETWEEN ADD_MONTHS (
                                         TO_DATE (
                                            TO_CHAR (SYSDATE, 'yyyymm') || '01',
                                            'yyyymmdd'),
                                         -11)
                                  AND  SYSDATE
            AND m.mld_stdmelding_key = std.mld_stdmelding_key
            AND std.mld_ins_discipline_key = d.ins_discipline_key
            AND d.ins_srtdiscipline_key IN (201, 202)
   GROUP BY TO_CHAR (mld_melding_datum, 'yyyymm');

CREATE OR REPLACE VIEW demo_v_graph_openst_behand
(
   fclt_xas_,
   fclt_yas_,
   fclt_yas2_
)
AS
     SELECT behandelaar,
            COUNT (mld_key) - SUM (uitvoeringoptijd) totaal,
            SUM (uitvoeringoptijd) op_tijd
       FROM (SELECT DISTINCT
                    m.mld_melding_key mld_key,
                    CASE
                       WHEN fac.gettrackingdate ('MLDREJ', m.mld_melding_key) IS NULL
                       THEN
                          CASE SIGN(fac.datumtijdplusuitvoertijd (
                                       m.mld_melding_datum,
                                       m.mld_melding_t_uitvoertijd.tijdsduur,
                                       m.mld_melding_t_uitvoertijd.eenheid)
                                    - COALESCE (
                                         fac.gettrackingdate (
                                            'MLDREJ',
                                            m.mld_melding_key),
                                         COALESCE (
                                            fac.gettrackingdate (
                                               'MLDAFM',
                                               m.mld_melding_key),
                                            SYSDATE)))
                             WHEN -1
                             THEN
                                0
                             ELSE
                                1
                          END
                       ELSE
                          1
                    END
                       uitvoeringoptijd,
                    DECODE (
                       mld_melding_status,
                       7,
                       (SELECT MAX (prs_bedrijf_naam)
                          FROM mld_opdr o, prs_bedrijf b
                         WHERE     o.mld_melding_key = m.mld_melding_key
                               AND O.MLD_UITVOERENDE_KEYS = b.prs_bedrijf_key
                               AND O.MLD_STATUSOPDR_KEY IN (3, 4, 5, 8)), -- 3- Ter fiattering, 4-Gefiatteerd, 5-Uitgegeven, 8-Geaccepteerd
                       4,
                       COALESCE (
                          (SELECT MAX (prs_bedrijf_naam)
                             FROM mld_opdr o, prs_bedrijf b
                            WHERE o.mld_melding_key = m.mld_melding_key
                                  AND O.MLD_UITVOERENDE_KEYS =
                                        b.prs_bedrijf_key
                                  AND O.MLD_STATUSOPDR_KEY IN (3, 4, 5, 8)), -- 3- Ter fiattering, 4-Gefiatteerd, 5-Uitgegeven, 8-Geaccepteerd
                          (SELECT prs_perslid_naam_full
                             FROM prs_v_perslid_fullnames pf
                            WHERE pf.prs_perslid_key =
                                     M.MLD_MELDING_BEHANDELAAR_KEY)),
                       (SELECT prs_perslid_naam_full
                          FROM prs_v_perslid_fullnames pf
                         WHERE pf.prs_perslid_key =
                                  M.MLD_MELDING_BEHANDELAAR_KEY))
                       behandelaar
               FROM mld_melding m,
                    mld_discipline md,
                    prs_perslid p,
                    mld_stdmelding std
              WHERE     m.prs_perslid_key = p.prs_perslid_key
                    --                    AND p.prs_perslid_key != 28421
                    AND md.ins_discipline_key = std.mld_ins_discipline_key
                    AND std.mld_stdmelding_key = m.mld_stdmelding_key
                    AND mld_melding_status IN (2, 3, 4, 7, 0) -- 2-ingevoerd, 3-ingezien, 4-geaccepteerd, 7-uitgegeven, 0-pending
                    AND md.ins_srtdiscipline_key IN (1, 81, 101, 241, 201, 202))
      WHERE behandelaar IS NOT NULL
   GROUP BY behandelaar;

CREATE OR REPLACE VIEW demo_v_graph_ppi_acc
(
   fclt_xas_,
   fclt_yas_
)
AS
   SELECT SUM (acceptoptijd) aantal, COUNT (mld_key) totaal
     FROM (SELECT DISTINCT
                  m.mld_melding_key mld_key,
                  CASE SIGN(fac.datumtijdplusuitvoertijd (
                               fac.gettrackingdate ('MLDNEW', m.mld_melding_key),
                               std.mld_stdmelding_t_accepttijd.tijdsduur,
                               std.mld_stdmelding_t_accepttijd.eenheid
)
                            - COALESCE (
                                 fac.gettrackingdate ('MLDREJ', m.mld_melding_key),
                                 COALESCE (
                                    fac.gettrackingdate ('MLDACP', m.mld_melding_key),
                                    SYSDATE)))
                     WHEN -1
                     THEN
                        0
                     ELSE
                        1
                  END
                     acceptoptijd
             FROM mld_melding m, mld_discipline md, mld_stdmelding std
            WHERE     md.ins_discipline_key = std.mld_ins_discipline_key
                  AND std.mld_stdmelding_key = m.mld_stdmelding_key
                  AND md.ins_srtdiscipline_key IN (1, 81, 101, 241, 201, 202)
                  AND mld_melding_status IN (2, 3)  -- 2-ingevoerd, 3-ingezien
                                                  );

CREATE OR REPLACE VIEW demo_v_graph_ppi_uitv
(
   fclt_xas_,
   fclt_yas_
)
AS
   SELECT SUM (uitvoeringoptijd) aantal, COUNT (mld_key) totaal
     FROM (SELECT DISTINCT
                  m.mld_melding_key mld_key,
                  CASE
                     WHEN fac.gettrackingdate ('MLDREJ', m.mld_melding_key) IS NULL
                     THEN
                        CASE SIGN(fac.datumtijdplusuitvoertijd (
                                     m.mld_melding_datum,
                                     m.mld_melding_t_uitvoertijd.tijdsduur,
                                     m.mld_melding_t_uitvoertijd.eenheid)
                                  - COALESCE (
                                       fac.gettrackingdate (
                                          'MLDREJ',
                                          m.mld_melding_key),
                                       COALESCE (
                                          fac.gettrackingdate (
                                             'MLDAFM',
                                             m.mld_melding_key),
                                          SYSDATE)))
                           WHEN -1
                           THEN
                              0
                           ELSE
                              1
                        END
                     ELSE
                        1
                  END
                     uitvoeringoptijd
             FROM mld_melding m, mld_discipline md, mld_stdmelding std
            WHERE     md.ins_discipline_key = std.mld_ins_discipline_key
                  AND std.mld_stdmelding_key = m.mld_stdmelding_key
                  AND md.ins_srtdiscipline_key IN (1, 81, 101, 241, 201, 202)
                  AND mld_melding_status IN (2, 3, 4, 7, 0) -- 2-ingevoerd, 3-ingezien, 4-geaccepteerd, 7-uitgegeven, 0-pending
                                                           );

CREATE OR REPLACE VIEW demo_v_graph_vakgroep_afg
(
   fclt_xas_,
   fclt_yas_,
   fclt_url,
   fclt_3d_discipline_key
)
AS
     SELECT d.ins_discipline_omschrijving,
            COUNT (d.ins_discipline_omschrijving),
               'appl/mld/mld_search.asp?urole=fo'
            || '&'
            || 'autosearch=1'
            || '&'
            || 'disc_key_str=',
            d.ins_discipline_key
       FROM mld_melding m,
            mld_stdmelding std,
            ins_tab_discipline d,
            fac_tracking t
      WHERE     m.mld_stdmelding_key = std.mld_stdmelding_key
            AND std.mld_ins_discipline_key = d.ins_discipline_key
            AND d.ins_srtdiscipline_key IN (1, 81, 101, 241, 201, 202)
            AND t.fac_tracking_refkey = mld_melding_key
            AND t.fac_srtnotificatie_key = 22                        -- MLDAFM
            AND t.fac_tracking_datum > SYSDATE - 30
   GROUP BY d.ins_discipline_key, d.ins_discipline_omschrijving;

CREATE OR REPLACE VIEW demo_v_graph_vakgroep_open
(
   fclt_xas_,
   fclt_yas_,
   fclt_url,
   fclt_3d_discipline_key
)
AS
     SELECT lcl.x('ins_discipline_omschrijving', d.ins_discipline_key, d.ins_discipline_omschrijving),
            COUNT (d.ins_discipline_omschrijving),
               'appl/mld/mld_search.asp?urole=fo'
            || '&'
            || 'autosearch=1'
            || '&'
            || 'disc_key_str='
            || d.ins_discipline_key,
            d.ins_discipline_key
       FROM mld_melding m, mld_stdmelding std, ins_tab_discipline d
      WHERE     m.mld_stdmelding_key = std.mld_stdmelding_key
            AND std.mld_ins_discipline_key = d.ins_discipline_key
            AND mld_melding_status IN (2, 3, 4, 7, 0) -- 2-ingevoerd, 3-ingezien, 4-geaccepteerd, 7-uitgegeven, 0-pending
            AND d.ins_srtdiscipline_key IN (1, 81, 101, 241, 201, 202)
   GROUP BY d.ins_discipline_key, d.ins_discipline_omschrijving
   ORDER BY COUNT (d.ins_discipline_omschrijving) DESC;


CREATE OR REPLACE VIEW demo_v_thema_ruimte_afd
(
   ALG_RUIMTE_KEY,
   WAARDE,
   WAARDE_KEY
)
AS
   SELECT x.alg_ruimte_key,
          DECODE (
             y.aantal,
             NULL,
             DECODE (x.verhuur, 0, '[Niet verhuurbaar]', '[GEEN DIVISIE!]'),
             1,
             DECODE (y.afd,
                     0, '[Geen afdeling toegewezen]',
                     SUBSTR (y.sp, 1, 60)),
             '[Meerdere afdelingen!]'),
          DECODE (y.aantal,
                  NULL, DECODE (x.verhuur, 0, -1, NULL),
                  1, DECODE (y.afd, 0, -1, y.sp_key),
                  NULL)
     FROM    (SELECT r.alg_ruimte_key,
                     COALESCE (sr.prs_verhuurbaar, 0) verhuur,
                     COALESCE (sr.prs_bevat_werkplek, 0) werkplek
                FROM alg_v_aanwezigruimte r, alg_srtruimte sr
               WHERE r.alg_srtruimte_key = sr.alg_srtruimte_key(+)) x
          LEFT JOIN
             (  SELECT ra.alg_ruimte_key,
                       MIN (a.prs_afdeling_naam1) sp,
                       MIN (a.prs_afdeling_key) sp_key,
                       COUNT (ra.prs_afdeling_key) aantal,
                       MAX (COALESCE (a.prs_afdeling_parentkey, 0)) afd
                  FROM prs_v_aanwezigruimteafdeling ra,
                       prs_v_aanwezigafdeling a
                 WHERE ra.prs_afdeling_key = a.prs_afdeling_key
              GROUP BY ra.alg_ruimte_key) y
          ON x.alg_ruimte_key = y.alg_ruimte_key
   UNION ALL
   SELECT NULL, a.prs_afdeling_naam1, a.prs_afdeling_key
     FROM prs_v_aanwezigafdeling a
    WHERE NOT EXISTS (SELECT ra.prs_afdeling_key
                        FROM prs_v_aanwezigruimteafdeling ra
                       WHERE ra.prs_afdeling_key = a.prs_afdeling_key)
   UNION ALL
   SELECT DISTINCT
          NULL, a.prs_afdeling_naam1 waarde, a.prs_afdeling_key waarde_key
     FROM (SELECT DISTINCT ra.prs_afdeling_key
             FROM prs_v_aanwezigruimteafdeling ra
           MINUS
           SELECT DISTINCT ra.prs_afdeling_key
             FROM prs_v_aanwezigruimteafdeling ra, alg_v_aanwezigruimte r
            WHERE ra.alg_ruimte_key IN (SELECT alg_ruimte_key
                                          FROM (  SELECT alg_ruimte_key,
                                                         COUNT ( * ) aantal
                                                    FROM prs_v_aanwezigruimteafdeling
                                                GROUP BY alg_ruimte_key)
                                         WHERE aantal = 1)
                  AND ra.alg_ruimte_key = r.alg_ruimte_key) x,
          prs_v_aanwezigafdeling a
    WHERE x.prs_afdeling_key = a.prs_afdeling_key;


CREATE OR REPLACE VIEW demo_v_rap_voorraad
(
   HIDE_F_EXTERN_DISKEY,
   HIDE_F_SRTGROEP_OMSCHRIJVING,
   FCLT_F_CATALOGUS,
   ARTIKEL_NR,
   ARTIKEL_OMSCHRIJVING,
   ARTIKEL_PRIJS,
   MAGAZIJN,
   MIN_VOORRAAD,
   MAX_VOORRAAD,
   INKOOP_GELEVERD,
   INTERN_BESTELD,
   VOORRAAD,
   INKOOP_BESTELD,
   INKOOP_LEVERDATUM,
   INKOOP_GEWENST
)
AS
   SELECT extern.dkey,
          COALESCE (intern.bes_srtgroep_omschrijving,
                    extern.bes_srtgroep_omschrijving),
          COALESCE (intern.ins_discipline_omschrijving,
                    extern.ins_discipline_omschrijving),
          extern.bes_srtdeel_nr,
          COALESCE (intern.bes_srtdeel_omschrijving,
                    extern.bes_srtdeel_omschrijving),
          COALESCE (intern.srtdeel_prijs, extern.srtdeel_prijs),
          intern.magazijn,
          extern.vmin,
          extern.vmax,
          extern.geleverd,
          intern.besteld,
          extern.geleverd - COALESCE (intern.besteld, 0) voorraad,
          extern.besteld,
          TO_CHAR(extern.leverdatum, 'dd-mm-yyyy'),
          CASE
             WHEN ( (COALESCE (extern.besteld, 0)
                     + COALESCE (extern.geleverd, 0))
                   - COALESCE (intern.besteld, 0)) < extern.vmin
             THEN
                extern.vmax
                - ( (COALESCE (extern.besteld, 0)
                     + COALESCE (extern.geleverd, 0))
                   - COALESCE (intern.besteld, 0))
             ELSE
                NULL
          END
             extern_gewenst
     FROM    (SELECT bd.ins_discipline_key dkey,                 -- INKOOP-key
                     g.bes_srtgroep_omschrijving,
                     sd.bes_srtdeel_nr,                      -- ext. artikelnr
                     sd.bes_srtdeel_omschrijving,
                     bes.getsrtdeelprijs (sd.bes_srtdeel_key, NULL)
                        srtdeel_prijs,
                     bd.ins_discipline_omschrijving,     -- ext. catalogusnaam
                     sd.bes_srtdeel_voorraadmin vmin,      -- ext. voorraadmin
                     sd.bes_srtdeel_voorraadmax vmax,      -- ext. voorraadmax
                     (SELECT SUM (coalesce(boi.bes_bestelopdr_item_aantal, bi.bes_bestelling_item_aantal)-COALESCE(boi.bes_bestelopdr_item_aantalontv,0))
                        FROM bes_bestelling b, bes_bestelling_item bi, bes_bestelopdr_item boi
                       WHERE     boi.bes_bestelopdr_item_key(+) = bi.bes_bestelopdr_item_key
                             AND bi.bes_bestelling_item_status IN (2, 3, 4, 5)
                             AND b.bes_bestelling_key = bi.bes_bestelling_key
                             AND bi.bes_srtdeel_key = sd.bes_srtdeel_key)
                        besteld,
                     (SELECT MIN (b.bes_bestelling_leverdatum)
                        FROM bes_bestelling b, bes_bestelling_item bi, bes_bestelopdr_item boi
                       WHERE     boi.bes_bestelopdr_item_key(+) = bi.bes_bestelopdr_item_key
                             AND bi.bes_bestelling_item_status IN (2, 3, 4, 5)
                             AND COALESCE(bes_bestelopdr_item_aantal, bi.bes_bestelling_item_aantal) <> COALESCE(bes_bestelopdr_item_aantalontv, 0)
                             AND b.bes_bestelling_key = bi.bes_bestelling_key
                             AND bi.bes_srtdeel_key = sd.bes_srtdeel_key)
                        leverdatum,
                     (SELECT SUM (boi.bes_bestelopdr_item_aantalontv)
                        FROM bes_bestelling b, bes_bestelling_item bi, bes_bestelopdr_item boi
                       WHERE  --   boi.bes_bestelopdr_item_status in (6,7) AND
                                 b.bes_bestelling_key = bi.bes_bestelling_key
                             AND boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key
                             AND bi.bes_srtdeel_key = sd.bes_srtdeel_key)
                        geleverd
                FROM bes_srtdeel sd,
                     bes_srtgroep g,
                     bes_discipline bd,
                     bes_disc_params dp
               WHERE     sd.bes_srtdeel_verwijder IS NULL
                     AND sd.bes_srtgroep_key = g.bes_srtgroep_key
                     AND g.ins_discipline_key = bd.ins_discipline_key
                     AND bd.ins_discipline_key = dp.bes_ins_discipline_key
                     AND dp.bes_ins_discipline_key_inkoop IS NULL
                     AND bd.ins_discipline_key IN
                              (SELECT bes_ins_discipline_key_inkoop
                                 FROM bes_disc_params
                                WHERE bes_ins_discipline_key_inkoop IS NOT NULL))
             extern                 -- Inkoop artikelen uit externe catalogus!
          FULL JOIN
             (SELECT dp.bes_ins_discipline_key_inkoop dkey,      -- INKOOP-key
                     g.bes_srtgroep_omschrijving,
                     sd.bes_srtdeel_nr,                      -- int. artikelnr
                     sd.bes_srtdeel_omschrijving,
                     sd.bes_srtdeel_notitie magazijn,
                     bes.getsrtdeelprijs (sd.bes_srtdeel_key, NULL)
                        srtdeel_prijs,
                     bd.ins_discipline_omschrijving,     -- int. catalogusnaam
                     (SELECT SUM (COALESCE(boi.bes_bestelopdr_item_aantal, bi.bes_bestelling_item_aantal))
                        FROM bes_bestelling b, bes_bestelling_item bi, bes_bestelopdr_item boi
                       WHERE boi.bes_bestelopdr_item_key(+) = bi.bes_bestelopdr_item_key
                             AND b.bes_bestelling_key = bi.bes_bestelling_key
                             AND bi.bes_srtdeel_key = sd.bes_srtdeel_key)
                        besteld
                FROM bes_srtdeel sd,
                     bes_srtgroep g,
                     bes_discipline bd,
                     bes_disc_params dp
               WHERE     sd.bes_srtdeel_verwijder IS NULL
                     AND sd.bes_srtgroep_key = g.bes_srtgroep_key
                     AND g.ins_discipline_key = bd.ins_discipline_key
                     AND bd.ins_discipline_key = dp.bes_ins_discipline_key
                     AND dp.bes_ins_discipline_key_inkoop IS NOT NULL) intern -- Verkoop artikelen uit interne catalogus!
          ON extern.dkey = intern.dkey
             AND extern.bes_srtdeel_nr = intern.bes_srtdeel_nr;

CREATE OR REPLACE VIEW demo_v_rap_dienstrapport
AS
   SELECT TO_CHAR(m.mld_melding_datum, 'yyyymmddhh24') hide_f_srt,
          TO_CHAR(m.mld_melding_datum, 'dd-mm-yyyy') fclt_d_datum,
          sd.ins_srtdiscipline_prefix||m.mld_melding_key dienstrapport,
          pf.prs_perslid_naam_full persoon,
          '<a class="details" onclick=''FcltMgr.openDetail("appl/mld/mld_opdr_xml.asp?mld_key='
             || m.mld_melding_key || '")''>'
             || 'Print dienstrapport '||sd.ins_srtdiscipline_prefix||m.mld_melding_key || '</a>' html_print
     FROM ins_srtdiscipline sd,
          mld_discipline d,
          mld_stdmelding s,
          mld_melding m,
          prs_v_perslid_fullnames pf
    WHERE m.mld_stdmelding_key = 1241
      AND s.mld_stdmelding_key = m.mld_stdmelding_key
      AND d.ins_discipline_key = s.mld_ins_discipline_key
      AND sd.ins_srtdiscipline_key = d.ins_srtdiscipline_key
      AND pf.prs_perslid_key = m.prs_perslid_key;

-- Overzicht aanschafdata ICT-middelen, gegroepeerd per jaar ('geleend' van HPJI)
CREATE OR REPLACE VIEW demo_v_rap_it_inventaris_jaar
(
   hide_f_regel,
   fclt_f_organisatie,
   fclt_f_categorie,
   fclt_f_aanschafjaar,
   aantal
)
AS
     SELECT   grid.onderdeel || '-' || grid.rubriek regel,
              grid.onderdeel,
              grid.rubriek,
              grid.jaar,
              COALESCE (x.aantal, 0)
       FROM      (SELECT   a.prs_afdeling_key onderdeel_key,
                           sd.ins_srtdeel_key rubriek_key,
                           j.jaar jaar,
                           a.prs_afdeling_omschrijving onderdeel,
                           sd.ins_srtdeel_omschrijving rubriek
                    FROM   (SELECT   prs_afdeling_key,
                                     prs_afdeling_omschrijving
                              FROM   prs_v_aanwezigafdeling
                             WHERE   prs_afdeling_parentkey IS NULL
                            UNION ALL
                            SELECT   -1 prs_afdeling_key,
                                     'Onbekend' prs_afdeling_omschrijving
                              FROM   DUAL) a,
                           ins_v_aanwezigsrtdeel sd,
                           ins_v_aanwezigsrtgroep sg,
                           (SELECT   DISTINCT
                                     TO_CHAR (
                                        fac.safe_to_date (
                                           ins_kenmerkdeel_waarde,
                                           'dd-mm-yyyy'
                                        ),
                                        'yyyy'
                                     )
                                        jaar
                              FROM   ins_v_aanwezigkenmerkdeel
                             WHERE   ins_kenmerk_key = 761) j -- Aanschafdatum
                   WHERE   sd.ins_srtgroep_key = sg.ins_srtgroep_key
                           AND sg.ins_discipline_key = 896) grid   -- Hardware
              LEFT JOIN
                 (  SELECT   asd.prs_afdeling_key1 onderdeel_key,
                             asd.ins_srtdeel_key rubriek_key,
                             j.jaar jaar,
                             COUNT ( * ) aantal
                      FROM      (SELECT   DECODE (ra.aantal,
                                                  1, ab.prs_afdeling_key1,
                                                  -1)
                                             prs_afdeling_key1,
                                          d.ins_srtdeel_key,
                                          d.ins_deel_key
                                   FROM   ins_v_aanwezigdeel d,
                                          alg_v_allonrgoed_gegevens aog,
                                          (  SELECT   alg_ruimte_key,
                                                      MAX (prs_afdeling_key)
                                                         prs_afdeling_key,
                                                      COUNT ( * ) aantal
                                               FROM   prs_ruimteafdeling
                                           GROUP BY   alg_ruimte_key) ra,
                                          prs_v_afdeling_boom ab
                                  WHERE   d.ins_alg_ruimte_type NOT IN
                                                ('A', 'P', 'W')
                                          AND d.ins_alg_ruimte_key =
                                                aog.alg_onroerendgoed_keys
                                          AND aog.alg_ruimte_key =
                                                ra.alg_ruimte_key
                                          AND ra.prs_afdeling_key =
                                                ab.prs_afdeling_key
                                 UNION ALL
                                 SELECT   -1 prs_afdeling_key1,
                                          d.ins_srtdeel_key,
                                          d.ins_deel_key
                                   FROM   ins_v_aanwezigdeel d,
                                          alg_v_allonrgoed_gegevens aog
                                  WHERE   d.ins_alg_ruimte_type NOT IN
                                                ('A', 'P', 'W')
                                          AND d.ins_alg_ruimte_key =
                                                aog.alg_onroerendgoed_keys
                                          AND (aog.alg_ruimte_key IS NULL
                                               OR NOT EXISTS
                                                    (SELECT   1
                                                       FROM   prs_ruimteafdeling ra
                                                      WHERE   ra.alg_ruimte_key =
                                                                 aog.alg_ruimte_key))
                                 UNION ALL
                                 SELECT   ab.prs_afdeling_key1,
                                          d.ins_srtdeel_key,
                                          d.ins_deel_key
                                   FROM   ins_v_aanwezigdeel d,
                                          prs_v_afdeling_boom ab
                                  WHERE   d.ins_alg_ruimte_type = 'A'
                                          AND d.ins_alg_ruimte_key =
                                                ab.prs_afdeling_key
                                 UNION ALL
                                 SELECT   ab.prs_afdeling_key1,
                                          d.ins_srtdeel_key,
                                          d.ins_deel_key
                                   FROM   ins_v_aanwezigdeel d,
                                          prs_perslid p,
                                          prs_v_afdeling_boom ab
                                  WHERE   d.ins_alg_ruimte_type = 'P'
                                          AND d.ins_alg_ruimte_key =
                                                p.prs_perslid_key
                                          AND p.prs_afdeling_key =
                                                ab.prs_afdeling_key
                                 UNION ALL
                                 SELECT   DECODE (ra.aantal,
                                                  1, ab.prs_afdeling_key1,
                                                  -1)
                                             prs_afdeling_key1,
                                          d.ins_srtdeel_key,
                                          d.ins_deel_key
                                   FROM   ins_v_aanwezigdeel d,
                                          prs_werkplek w,
                                          (  SELECT   alg_ruimte_key,
                                                      MAX (prs_afdeling_key)
                                                         prs_afdeling_key,
                                                      COUNT ( * ) aantal
                                               FROM   prs_ruimteafdeling
                                           GROUP BY   alg_ruimte_key) ra,
                                          prs_v_afdeling_boom ab
                                  WHERE   d.ins_alg_ruimte_type = 'W'
                                          AND d.ins_alg_ruimte_key =
                                                w.prs_werkplek_key
                                          AND w.prs_alg_ruimte_key =
                                                ra.alg_ruimte_key
                                          AND ra.prs_afdeling_key =
                                                ab.prs_afdeling_key
                                 UNION ALL
                                 SELECT   -1 prs_afdeling_key1,
                                          d.ins_srtdeel_key,
                                          d.ins_deel_key
                                   FROM   ins_v_aanwezigdeel d, prs_werkplek w
                                  WHERE   d.ins_alg_ruimte_type = 'W'
                                          AND d.ins_alg_ruimte_key =
                                                w.prs_werkplek_key
                                          AND NOT EXISTS
                                                (SELECT   1
                                                   FROM   prs_ruimteafdeling ra
                                                  WHERE   ra.alg_ruimte_key =
                                                             w.prs_alg_ruimte_key))
                                asd
                             LEFT JOIN
                                (SELECT   ins_deel_key,
                                          TO_CHAR (
                                             fac.safe_to_date (
                                                ins_kenmerkdeel_waarde,
                                                'dd-mm-yyyy'
                                             ),
                                             'yyyy'
                                          )
                                             jaar
                                   FROM   ins_v_aanwezigkenmerkdeel
                                  WHERE   ins_kenmerk_key = 761) j -- Aanschafdatum
                             ON asd.ins_deel_key = j.ins_deel_key
                  GROUP BY   asd.prs_afdeling_key1, asd.ins_srtdeel_key, j.jaar)
                 x
              ON     grid.onderdeel_key = x.onderdeel_key
                 AND grid.rubriek_key = x.rubriek_key
                 AND grid.jaar = x.jaar;

-- Overzicht aanschafdata ICT-middelen ('geleend' van HPJI)
CREATE OR REPLACE VIEW demo_v_rap_it_inventaris_stuk
(
   fclt_f_organisatie,
   fclt_f_categorie,
   html_obj_id,
   fclt_x_obj_id,
   fclt_f_merk,
   fclt_f_type,
   fclt_d_aanschafdatum,
   fclt_f_locatie,
   ruimte_nr,
   ruimte_oms
)
AS
   SELECT   a.prs_afdeling_omschrijving,
            sd.ins_srtdeel_omschrijving,
            '<a class="details" onclick=''FcltMgr.openDetail("appl/ins/ins_deel.asp?urole=bo&'||'autosearch=1&'||'ins_key='
             || asd.ins_deel_key || '")''>'
             || htf.escape_sc(asd.ins_deel_omschrijving) || '</a>'
               html_obj_id,
            asd.ins_deel_omschrijving,
            x.merk,
            y.model,
            TO_CHAR (z.datum, 'dd-mm-yyyy'),
            asd.vestiging,
            asd.ruimte_nr,
            asd.ruimte_oms
     FROM   (SELECT   d.ins_srtdeel_key,
                      d.ins_deel_key,
                      d.ins_deel_omschrijving,
                      DECODE (rv.aantal, 1, rv.prs_afdeling_key1, -1)
                         prs_afdeling_key1,
                      aog.alg_gebouw_code || ' - ' || aog.alg_gebouw_naam
                         vestiging,
                      aog.alg_ruimte_nr ruimte_nr,
                      aog.alg_ruimte_omschrijving ruimte_oms
               FROM   ins_v_aanwezigdeel d,
                      alg_v_allonrgoed_gegevens aog,
                      (  SELECT   alg_ruimte_key,
                                  MAX (prs_afdeling_key1) prs_afdeling_key1,
                                  COUNT ( * ) aantal
                           FROM   prs_ruimteafdeling ra, prs_v_afdeling_boom ab
                          WHERE   ra.prs_afdeling_key = ab.prs_afdeling_key
                       GROUP BY   ra.alg_ruimte_key) rv
              WHERE       d.ins_alg_ruimte_type NOT IN ('A', 'P', 'W')
                      AND d.ins_alg_ruimte_key = aog.alg_onroerendgoed_keys
                      AND aog.alg_ruimte_key = rv.alg_ruimte_key
             UNION ALL
             SELECT   d.ins_srtdeel_key,
                      d.ins_deel_key,
                      d.ins_deel_omschrijving,
                      -1 prs_afdeling_key1,
                      aog.alg_gebouw_code || ' - ' || aog.alg_gebouw_naam
                         vestiging,
                      aog.alg_ruimte_nr ruimte_nr,
                      aog.alg_ruimte_omschrijving ruimte_oms
               FROM   ins_v_aanwezigdeel d, alg_v_allonrgoed_gegevens aog
              WHERE   d.ins_alg_ruimte_type NOT IN ('A', 'P', 'W')
                      AND d.ins_alg_ruimte_key = aog.alg_onroerendgoed_keys
                      AND (aog.alg_ruimte_key IS NULL
                           OR NOT EXISTS
                                (SELECT   1
                                   FROM   prs_ruimteafdeling ra
                                  WHERE   ra.alg_ruimte_key =
                                             aog.alg_ruimte_key))
             UNION ALL
             SELECT   d.ins_srtdeel_key,
                      d.ins_deel_key,
                      d.ins_deel_omschrijving,
                      ab.prs_afdeling_key1,
                      'Onbekend',
                      NULL ruimte_nr,
                      NULL ruimte_oms
               FROM   ins_v_aanwezigdeel d, prs_v_afdeling_boom ab
              WHERE   d.ins_alg_ruimte_type = 'A'
                      AND d.ins_alg_ruimte_key = ab.prs_afdeling_key
             UNION ALL
             SELECT   d.ins_srtdeel_key,
                      d.ins_deel_key,
                      d.ins_deel_omschrijving,
                      ab.prs_afdeling_key1,
                      'Onbekend',
                      NULL ruimte_nr,
                      NULL ruimte_oms
               FROM   ins_v_aanwezigdeel d,
                      prs_perslid p,
                      prs_v_afdeling_boom ab
              WHERE       d.ins_alg_ruimte_type = 'P'
                      AND d.ins_alg_ruimte_key = p.prs_perslid_key
                      AND p.prs_afdeling_key = ab.prs_afdeling_key
             UNION ALL
             SELECT   d.ins_srtdeel_key,
                      d.ins_deel_key,
                      d.ins_deel_omschrijving,
                      DECODE (rv.aantal, 1, rv.prs_afdeling_key1, -1)
                         prs_afdeling_key1,
                      aog.alg_gebouw_code || ' - ' || aog.alg_gebouw_naam
                         vestiging,
                      aog.alg_ruimte_nr ruimte_nr,
                      aog.alg_ruimte_omschrijving ruimte_oms
               FROM   ins_v_aanwezigdeel d,
                      prs_werkplek w,
                      (  SELECT   alg_ruimte_key,
                                  MAX (prs_afdeling_key1) prs_afdeling_key1,
                                  COUNT ( * ) aantal
                           FROM   prs_ruimteafdeling ra, prs_v_afdeling_boom ab
                          WHERE   ra.prs_afdeling_key = ab.prs_afdeling_key
                       GROUP BY   ra.alg_ruimte_key) rv,
                      alg_v_allonrgoed_gegevens aog
              WHERE       d.ins_alg_ruimte_type = 'W'
                      AND d.ins_alg_ruimte_key = w.prs_werkplek_key
                      AND w.prs_alg_ruimte_key = rv.alg_ruimte_key
                      AND rv.alg_ruimte_key = aog.alg_ruimte_key
             UNION ALL
             SELECT   d.ins_srtdeel_key,
                      d.ins_deel_key,
                      d.ins_deel_omschrijving,
                      -1 prs_afdeling_key1,
                      aog.alg_gebouw_code || ' - ' || aog.alg_gebouw_naam
                         vestiging,
                      aog.alg_ruimte_nr ruimte_nr,
                      aog.alg_ruimte_omschrijving ruimte_oms
               FROM   ins_v_aanwezigdeel d,
                      prs_werkplek w,
                      alg_v_allonrgoed_gegevens aog
              WHERE   d.ins_alg_ruimte_type = 'W'
                      AND d.ins_alg_ruimte_key = w.prs_werkplek_key
                      AND NOT EXISTS
                            (SELECT   1
                               FROM   prs_ruimteafdeling ra
                              WHERE   ra.alg_ruimte_key =
                                         w.prs_alg_ruimte_key)
                      AND w.prs_alg_ruimte_key = aog.alg_ruimte_key) asd,
            ins_srtdeel sd,
            ins_srtgroep sg,
            (SELECT   prs_afdeling_key, prs_afdeling_omschrijving
               FROM   prs_v_aanwezigafdeling
              WHERE   prs_afdeling_parentkey IS NULL
             UNION ALL
             SELECT   -1 prs_afdeling_key,
                      'Onbekend' prs_afdeling_omschrijving
               FROM   DUAL) a,
            (SELECT   ins_deel_key, ins_kenmerkdeel_waarde merk
               FROM   ins_v_aanwezigkenmerkdeel kd, ins_kenmerk k
              WHERE   kd.ins_kenmerk_key = k.ins_kenmerk_key
                      AND k.ins_srtkenmerk_key = 42) x,                -- Merk
            (SELECT   ins_deel_key, ins_kenmerkdeel_waarde model
               FROM   ins_v_aanwezigkenmerkdeel kd, ins_kenmerk k
              WHERE   kd.ins_kenmerk_key = k.ins_kenmerk_key
                      AND k.ins_srtkenmerk_key = 41) y,               -- Type
            (SELECT   ins_deel_key,
                      fac.safe_to_date (ins_kenmerkdeel_waarde, 'dd-mm-yyyy')
                         datum
               FROM   ins_v_aanwezigkenmerkdeel
              WHERE   ins_kenmerk_key = 761) z                -- Aanschafdatum
    WHERE       asd.ins_srtdeel_key = sd.ins_srtdeel_key
            AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
            AND sg.ins_discipline_key = 896                        -- Hardware
            AND asd.prs_afdeling_key1 = a.prs_afdeling_key
            AND asd.ins_deel_key = x.ins_deel_key(+)
            AND asd.ins_deel_key = y.ins_deel_key(+)
            AND asd.ins_deel_key = z.ins_deel_key(+);


BEGIN adm.systrackscriptId('$Id$', 0); END;
/
BEGIN fac.registercustversion('DEMO', 0); END;
/
commit;



--- CAPACITATIEVE PLANNING, 'GELEEND' VAN ARAI ---------------------------------

-- Alle (potentiele) uitvoerders met de disciplines waarvoor ze uitvoerder kunnen zijn.
CREATE OR REPLACE VIEW demo_v_uitvoerders
AS
   SELECT   DISTINCT p.prs_perslid_key,
            pf.prs_perslid_naam_full,
            p.prs_perslid_naam,
            p.prs_perslid_voornaam,
            p.prs_perslid_voorletters,
            p.prs_perslid_dienstverband,
            sp.prs_srtperslid_omschrijving,
            p.prs_afdeling_key,
            a.prs_afdeling_omschrijving,
            d.ins_discipline_key,
            d.ins_discipline_omschrijving
     FROM   prs_perslid p, prs_srtperslid sp, prs_afdeling a, mld_discipline d, fac_groeprechten gr, fac_gebruikersgroep gg, fac_functie f, prs_v_perslid_fullnames pf
    WHERE       p.prs_perslid_key = gg.prs_perslid_key
            AND p.prs_perslid_key = pf.prs_perslid_key
            AND p.prs_srtperslid_key = sp.prs_srtperslid_key
            AND p.prs_afdeling_key = a.prs_afdeling_key
            AND gr.fac_groep_key = gg.fac_groep_key
            AND gr.ins_discipline_key = d.ins_discipline_key
            AND gr.fac_functie_key = f.fac_functie_key
            AND f.fac_functie_code = 'WEB_MLDORD';

CREATE OR REPLACE VIEW demo_v_uitvoerders_full
AS SELECT DISTINCT prs_perslid_key, prs_perslid_naam_full FROM demo_v_uitvoerders;

-- Teamlid welke nu (!), op dit moment (!) een (of meer) lopende opdracht(en) heeft.
-- Alle uitvoerders met alle opdrachten in de tijd uitgezet.
CREATE OR REPLACE VIEW demo_v_opdr_uitvoerders
AS
   SELECT   p.prs_perslid_key,
            pf.prs_perslid_naam_full,
            p.prs_perslid_naam,
            p.prs_perslid_voornaam,
            p.prs_perslid_voorletters,
            p.prs_perslid_dienstverband,
            p.prs_afdeling_key,
            a.prs_afdeling_omschrijving,
            o.mld_melding_key,
            o.mld_opdr_key,
            o.mld_opdr_datumbegin,
            o.mld_opdr_einddatum,
            o.mld_opdr_uren,
            o.mld_statusopdr_key,
            s.mld_statusopdr_omschrijving
     FROM   prs_perslid p, mld_opdr o, mld_statusopdr s, prs_afdeling a, prs_v_perslid_fullnames pf
    WHERE   p.prs_perslid_key = o.mld_uitvoerende_keys
      AND   p.prs_perslid_key = pf.prs_perslid_key
      AND   o.mld_statusopdr_key = s.mld_statusopdr_key
      AND   p.prs_afdeling_key = a.prs_afdeling_key;

CREATE OR REPLACE VIEW demo_v_opdr_uitvoerders_all
AS
    SELECT  prs_perslid_key,
            prs_perslid_naam_full,
            prs_perslid_naam,
            prs_perslid_voornaam,
            prs_perslid_voorletters,
            prs_perslid_dienstverband,
            prs_afdeling_key,
            prs_afdeling_omschrijving,
            mld_melding_key,
            mld_opdr_key,
            mld_opdr_datumbegin,
            mld_opdr_einddatum,
            mld_opdr_uren,
            mld_statusopdr_omschrijving
    FROM demo_v_opdr_uitvoerders
    WHERE mld_statusopdr_key IN (5,8)
    UNION
    SELECT  DISTINCT prs_perslid_key,
            prs_perslid_naam_full,
            prs_perslid_naam,
            prs_perslid_voornaam,
            prs_perslid_voorletters,
            prs_perslid_dienstverband,
            prs_afdeling_key,
            prs_afdeling_omschrijving,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL
    FROM demo_v_uitvoerders p WHERE NOT EXISTS (SELECT 'x' FROM demo_v_opdr_uitvoerders u WHERE u.prs_perslid_key = p.prs_perslid_key);

CREATE OR REPLACE VIEW demo_v_opdr_uitvoerders_grp
(  prs_perslid_key,
   prs_perslid_naam_full,
   prs_perslid_naam,
   prs_perslid_voornaam,
   prs_perslid_voorletters,
   prs_perslid_dienstverband_uren,
   prs_afdeling_key,
   prs_afdeling_omschrijving,
   aantal_opdrachten,
   som_mld_opdr_uren,
   url)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full,
            prs_perslid_naam,
            prs_perslid_voornaam,
            prs_perslid_voorletters,
            COALESCE(40*prs_perslid_dienstverband/100,0),
            prs_afdeling_key,
            prs_afdeling_omschrijving,
            COUNT(mld_opdr_key),
            COALESCE(SUM(mld_opdr_uren),0),
            'appl/mld/opdr_search.asp?urole=bo' || '&' || 'autosearch=1' || '&' || 'handler_key=' || prs_perslid_key
       FROM demo_v_opdr_uitvoerders_all
   GROUP BY prs_perslid_key,
            prs_perslid_naam_full,
            prs_perslid_naam,
            prs_perslid_voornaam,
            prs_perslid_voorletters,
            prs_perslid_dienstverband,
            prs_afdeling_key,
            prs_afdeling_omschrijving;

CREATE OR REPLACE VIEW demo_v_opdr_afdeling_grp
(  prs_afdeling_key,
   prs_afdeling_omschrijving,
   aantal_opdrachten,
   som_mld_opdr_uren,
   url)
AS
    SELECT  prs_afdeling_key,
            prs_afdeling_omschrijving,
            COUNT(mld_opdr_key),
            COALESCE(SUM(mld_opdr_uren),0),
            NULL
       FROM demo_v_opdr_uitvoerders_all
   GROUP BY prs_afdeling_key,
            prs_afdeling_omschrijving;

-- Dienstverband uren van medewerkers bij volle week, dus b.v. 40, 32, 30 etc
-- Beschikbare_uren_groen: normaal dienstverband, maar als ergen midden in de week, dan dienstverband - aantal voorbije dagen * # uren bij medewerker - # uren van vandaag gerekend vanaf 9 uur smorgens
-- Opdracht_uren_rood: opdrachturen bij medewerker, maar niet meer dan Beschikbare_uren_groen
CREATE OR REPLACE VIEW demo_v_opdr_uitvoerders_wk0
(
   prs_perslid_key,
   prs_afdeling_key,
   prs_perslid_naam_full,
   prs_perslid_dienstverband_uren,
   beschikbare_uren_groen,
   opdracht_uren_rood,
   url
)
AS
  SELECT prs_perslid_key,
         prs_afdeling_key,
         prs_perslid_naam_full,
         prs_perslid_dienstverband_uren,
         prs_perslid_dienstverband_uren -
         ( GREATEST( (TO_CHAR(SYSDATE,'D')-2),0)*(prs_perslid_dienstverband_uren/5) + (TO_CHAR(SYSDATE,'HH24') - 9) )  beschikbare_uren_groen,
         LEAST(som_mld_opdr_uren, prs_perslid_dienstverband_uren - (GREATEST((TO_CHAR(SYSDATE,'D')-2),0)*(prs_perslid_dienstverband_uren/5) + (TO_CHAR(SYSDATE,'HH24') - 9) ) ) opdracht_uren_rood,
         url
    FROM demo_v_opdr_uitvoerders_grp;

CREATE OR REPLACE VIEW demo_v_graph_capac_mdw_week_0
(
   prs_perslid_key,
   FCLT_XAS_UITVOERDER,
   FCLT_YAS_UREN,
   FCLT_YAS2_UREN,
   FCLT_URL
)
AS
  SELECT prs_perslid_key,
         prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || beschikbare_uren_groen || ')',
         opdracht_uren_rood,
         beschikbare_uren_groen - opdracht_uren_rood,
         url
    FROM demo_v_opdr_uitvoerders_wk0;

CREATE OR REPLACE VIEW demo_v_opdr_uitvoerders_wk1
(
   prs_perslid_key,
   prs_afdeling_key,
   prs_perslid_naam_full,
   prs_perslid_dienstverband_uren,
   beschikbare_uren_groen,
   opdracht_uren_rood,
   url
)
AS
  SELECT g1.prs_perslid_key,
         g1.prs_afdeling_key,
         g1.prs_perslid_naam,
         g1.prs_perslid_dienstverband_uren,
         g1.prs_perslid_dienstverband_uren - LEAST(g1.som_mld_opdr_uren - w0.opdracht_uren_rood , g1.prs_perslid_dienstverband_uren) beschikbare_uren_groen,
         LEAST(g1.som_mld_opdr_uren - w0.opdracht_uren_rood , g1.prs_perslid_dienstverband_uren) opdracht_uren_rood,
         g1.url
    FROM demo_v_opdr_uitvoerders_grp g1, demo_v_opdr_uitvoerders_wk0 w0
   WHERE g1.prs_perslid_key = w0.prs_perslid_key;

CREATE OR REPLACE VIEW demo_v_graph_capac_mdw_week_1
(
   prs_perslid_key,
   FCLT_XAS_UITVOERDER,
   FCLT_YAS_UREN,
   FCLT_YAS2_UREN,
   FCLT_URL
)
AS
  SELECT prs_perslid_key,
         prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || prs_perslid_dienstverband_uren || ')',
         opdracht_uren_rood,
         beschikbare_uren_groen,
         url
    FROM demo_v_opdr_uitvoerders_wk1;

CREATE OR REPLACE VIEW demo_v_opdr_uitvoerders_wk2
(
   prs_perslid_key,
   prs_afdeling_key,
   prs_perslid_naam_full,
   prs_perslid_dienstverband_uren,
   beschikbare_uren_groen,
   opdracht_uren_rood,
   url
)
AS
  SELECT g1.prs_perslid_key,
         g1.prs_afdeling_key,
         g1.prs_perslid_naam,
         g1.prs_perslid_dienstverband_uren,
         g1.prs_perslid_dienstverband_uren - LEAST(g1.som_mld_opdr_uren - w0.opdracht_uren_rood - w1.opdracht_uren_rood, g1.prs_perslid_dienstverband_uren) beschikbare_uren_groen,
         LEAST(g1.som_mld_opdr_uren - w0.opdracht_uren_rood - w1.opdracht_uren_rood , g1.prs_perslid_dienstverband_uren) opdracht_uren_rood,
         g1.url
    FROM demo_v_opdr_uitvoerders_grp g1, demo_v_opdr_uitvoerders_wk0 w0, demo_v_opdr_uitvoerders_wk1 w1
   WHERE g1.prs_perslid_key = w0.prs_perslid_key
     AND g1.prs_perslid_key = w1.prs_perslid_key;

CREATE OR REPLACE VIEW demo_v_graph_capac_mdw_week_2
(
   prs_perslid_key,
   FCLT_XAS_UITVOERDER,
   FCLT_YAS_UREN,
   FCLT_YAS2_UREN,
   FCLT_URL
)
AS
  SELECT prs_perslid_key,
         prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || prs_perslid_dienstverband_uren || ')',
         opdracht_uren_rood,
         beschikbare_uren_groen,
         url
    FROM demo_v_opdr_uitvoerders_wk2;

CREATE OR REPLACE VIEW demo_v_graph_capac_TD_week_0
(
   prs_perslid_key,
   FCLT_XAS_UITVOERDER,
   FCLT_YAS_UREN,
   FCLT_YAS2_UREN,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || beschikbare_uren_groen || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen - opdracht_uren_rood,
            url
       FROM demo_v_opdr_uitvoerders_wk0
       WHERE prs_afdeling_key = 630;

-- Grafiek van de medewerkers Technische Dienst Electra (key = 98)
CREATE OR REPLACE VIEW demo_v_graph_capac_ELE_week_0
(
   prs_perslid_key,
   FCLT_XAS_UITVOERDER,
   FCLT_YAS_,
   FCLT_YAS2_,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || beschikbare_uren_groen || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen - opdracht_uren_rood,
            url
       FROM demo_v_opdr_uitvoerders_wk0
       WHERE prs_afdeling_key = 31481;

-- Grafiek van de medewerkers Technische Dienst Werktuigbouw (key = 99)
CREATE OR REPLACE VIEW demo_v_graph_capac_WTB_week_0
(
   prs_perslid_key,
   FCLT_XAS_UITVOERDER,
   FCLT_YAS_,
   FCLT_YAS2_,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || beschikbare_uren_groen || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen - opdracht_uren_rood,
            url
       FROM demo_v_opdr_uitvoerders_wk0
       WHERE prs_afdeling_key = 31482;

-- Grafiek van de medewerkers Technische Dienst (key = 97)
CREATE OR REPLACE VIEW demo_v_graph_capac_TD_week_1
(
   prs_perslid_key,
   FCLT_XAS_,
   FCLT_YAS_UREN,
   FCLT_YAS2_UREN,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || prs_perslid_dienstverband_uren || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen,
            url
       FROM demo_v_opdr_uitvoerders_wk1
       WHERE prs_afdeling_key = 630;

-- Grafiek van de medewerkers Technische Dienst Electra (key = 98)
CREATE OR REPLACE VIEW demo_v_graph_capac_ELE_week_1
(
   prs_perslid_key,
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || prs_perslid_dienstverband_uren || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen,
            url
       FROM demo_v_opdr_uitvoerders_wk1
       WHERE prs_afdeling_key = 31481;

-- Grafiek van de medewerkers Technische Dienst Werktuigbouw (key = 99)
CREATE OR REPLACE VIEW demo_v_graph_capac_WTB_week_1
(
   prs_perslid_key,
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || prs_perslid_dienstverband_uren || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen,
            url
       FROM demo_v_opdr_uitvoerders_wk1
       WHERE prs_afdeling_key = 31482;

CREATE OR REPLACE VIEW demo_v_graph_capac_TD_week_2
(
   prs_perslid_key,
   FCLT_XAS_,
   FCLT_YAS_UREN,
   FCLT_YAS2_UREN,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || prs_perslid_dienstverband_uren || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen,
            url
       FROM demo_v_opdr_uitvoerders_wk2
       WHERE prs_afdeling_key = 630;

CREATE OR REPLACE VIEW demo_v_graph_capac_ELE_week_2
(
   prs_perslid_key,
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || prs_perslid_dienstverband_uren || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen,
            url
       FROM demo_v_opdr_uitvoerders_wk2
       WHERE prs_afdeling_key = 31481;

CREATE OR REPLACE VIEW demo_v_graph_capac_WTB_week_2
(
   prs_perslid_key,
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || prs_perslid_dienstverband_uren || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen,
            url
       FROM demo_v_opdr_uitvoerders_wk2
       WHERE prs_afdeling_key = 31482;


CREATE OR REPLACE VIEW demo_v_capac_mdw_max_weeknr
(max_weeknr)
AS
   SELECT ROUND(COALESCE(MAX(som_mld_opdr_uren), 0) / 40 ) + 2
     FROM demo_v_opdr_uitvoerders_grp;

CREATE OR REPLACE VIEW demo_v_graph_capac_mdw_all
(
   prs_perslid_key,
   prs_perslid_naam_full,
   prs_perslid_dienstverband_uren,
   beschikbare_uren_groen,
   opdracht_uren_rood,
   url
)
AS
    SELECT prs_perslid_key,
        prs_perslid_naam_full,
        prs_perslid_dienstverband_uren,
        40 * max_weeknr,
        ROUND(som_mld_opdr_uren * (prs_perslid_dienstverband_uren / 40)),
        url
    FROM  demo_v_opdr_uitvoerders_grp, demo_v_capac_mdw_max_weeknr;

CREATE OR REPLACE VIEW demo_v_graph_capac_mdw_totaal
(
   prs_perslid_key,
   FCLT_XAS_UITVOERDER,
   FCLT_YAS_UREN,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  prs_perslid_dienstverband_uren || ')',
            opdracht_uren_rood,
            url
       FROM demo_v_graph_capac_mdw_all;

CREATE OR REPLACE VIEW demo_v_graph_aantopdr_mdw_all
(
   prs_perslid_key,
   FCLT_XAS_UITVOERDER,
   FCLT_YAS_AANTAL,
   FCLT_URL
)
AS
    SELECT  prs_perslid_key,
            prs_perslid_naam_full,
            aantal_opdrachten,
            url
    FROM  demo_v_opdr_uitvoerders_grp;



CREATE OR REPLACE VIEW demo_v_graph_capac_afd_totaal
(
   prs_afdeling_key,
   FCLT_XAS_AFDELING,
   FCLT_YAS_UREN,
   FCLT_URL
)
AS
     SELECT prs_afdeling_key,
            prs_afdeling_omschrijving,
            som_MLD_OPDR_UREN,
            url
       FROM demo_v_opdr_afdeling_grp;

CREATE OR REPLACE VIEW demo_v_graph_aantopdr_afd_all
(
   prs_afdeling_key,
   FCLT_XAS_AFDELING,
   FCLT_YAS_AANTAL,
   FCLT_URL
)
AS
     SELECT prs_afdeling_key,
            prs_afdeling_omschrijving,
            aantal_opdrachten,
            url
       FROM demo_v_opdr_afdeling_grp;

--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-
--------- MeerJarenonderhoudsBegroting (MJB) en InvesteringsBegroting (IB) à la LUDE ---------------
--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-

-- Rapportage "Begrotingsoverzicht"
-- Toont alle meldingen in vakgroeptype "Investeringsbegroting", plus alle opdrachten-met-kosten
-- bij reguliere meldingen op een investeringsbegroting-projectkostenplaats
CREATE OR REPLACE VIEW demo_v_rap_invbegr
AS
   SELECT hide_f_sort,
          fclt_f_jaar,
          fclt_f_locatie,
          budget fclt_x_budget,
          prs_kostenplaats_limiet hide_f_limiet,
          DECODE( INSTR(budget, fclt_f_jaar),
                 0, '<font style="font-weight:bold;color:#f00">'||budget||'</font><br/>(gepland: '||gepland||')',
                 budget)
             html_budget,
          html_nummer,
          omschrijving,
          fac.safe_to_number(
             DECODE (fclt_f_substatus,
                     'Geannuleerd', NULL,
                     'Afgewezen', NULL,
                     geraamd) )
             fclt_c_geraamd,
          fac.safe_to_number(
             DECODE (fclt_f_substatus,
                     'Geannuleerd', NULL,
                     'Afgewezen', NULL,
                     toegekend) )
             fclt_c_toegekend,
          fac.safe_to_number(
             DECODE(besteed,
                    0, NULL,
                    besteed) )
             fclt_c_besteed,
          fclt_f_substatus,
          fclt_f_status
     FROM (
      SELECT TO_CHAR(m.mld_melding_einddatum, 'YYYY')||LPAD(TO_CHAR(m.mld_melding_key), 6, '0') hide_f_sort,
             TO_CHAR(m.mld_melding_einddatum, 'YYYY') fclt_f_jaar,
             TO_CHAR(m.mld_melding_einddatum, 'DD-MM-YYYY') gepland,
             l.alg_locatie_omschrijving fclt_f_locatie,
             REPLACE(htf.escape_sc(km.prs_kostenplaats_omschrijving), '&'||'amp;', '&') budget,
             km.prs_kostenplaats_limiet,
                '<a class="details" onclick=''FcltMgr.openDetail("'
             || 'appl/MLD/mld_melding.asp?urole=fo&'||'mld_key='||m.mld_melding_key
             || '")''>'
             || htf.escape_sc(vt.ins_srtdiscipline_prefix||m.mld_melding_key)
             || '</a>'
                html_nummer,
             m.mld_melding_omschrijving omschrijving,
             fac.safe_to_number(geraamd.mld_kenmerkmelding_waarde) geraamd,
             fac.safe_to_number(toegekend.mld_kenmerkmelding_waarde) toegekend,
             COALESCE(o_open.mld_opdr_kosten,0) + COALESCE(o_klaar.mld_opdr_kosten,0) besteed,
             CASE
               WHEN status.mld_melding_key IS NOT NULL
                  THEN ud_status.fac_usrdata_omschr
               WHEN status.mld_melding_key IS NULL
                  THEN
                     CASE
                        WHEN m.mld_melding_status IN (0,2,3,4,7,99)
                           THEN
                              CASE
                                 WHEN COALESCE(o_open.mld_opdr_kosten,0) > 0
                                    THEN 'Uitgegeven'
                                 WHEN COALESCE(o_klaar.mld_opdr_kosten,0) > 0
                                    THEN 'Niet opgelost'
                                 WHEN toegekend.mld_melding_key IS NOT NULL
                                    THEN 'Toegekend'
                                 WHEN geraamd.mld_melding_key IS NOT NULL
                                    THEN 'Geraamd'
                                 ELSE
                                    'Aangevraagd'
                              END
                        ELSE
                           'Afgerond'
                     END
             END
                fclt_f_substatus,
             CASE
                WHEN m.mld_melding_status IN (0,2,3,4,7,99)
                THEN 'Open'
                ELSE 'Gesloten'
             END
                fclt_f_status
        FROM mld_melding m,
             mld_stdmelding sm,
             mld_discipline vg,
             ins_srtdiscipline vt,
             alg_locatie l,
             prs_kostenplaats km,
             -- Opdrachten die al klaar zijn (met kosten)
             (SELECT mld_melding_key,
                     SUM(mld_opdr_kosten) mld_opdr_kosten
                FROM mld_opdr
               WHERE mld_statusopdr_key NOT IN (1,2,3,4,5,8,10)
                 AND mld_opdr_kosten > 0
              GROUP BY mld_melding_key) o_klaar,
             -- Opdrachten die nog lopen (met kosten)
             (SELECT mld_melding_key,
                     SUM(mld_opdr_kosten) mld_opdr_kosten
                FROM mld_opdr
               WHERE mld_statusopdr_key NOT IN (1,2,6,7,9)
                 AND mld_opdr_kosten > 0
              GROUP BY mld_melding_key) o_open,
             (SELECT km.* FROM mld_kenmerkmelding km, mld_kenmerk k
               WHERE k.mld_kenmerk_key = km.mld_kenmerk_key
                 AND k.mld_srtkenmerk_key = 2480
                 AND km.mld_kenmerkmelding_verwijder IS NULL) geraamd,
             (SELECT km.* FROM mld_kenmerkmelding km, mld_kenmerk k
               WHERE k.mld_kenmerk_key = km.mld_kenmerk_key
                 AND k.mld_srtkenmerk_key = 2481
                 AND km.mld_kenmerkmelding_verwijder IS NULL) toegekend,
             (SELECT km.* FROM mld_kenmerkmelding km, mld_kenmerk k
               WHERE k.mld_kenmerk_key = km.mld_kenmerk_key
                 AND k.mld_srtkenmerk_key = 2483
                 AND km.mld_kenmerkmelding_verwijder IS NULL) status,
             (SELECT * FROM fac_usrdata
               WHERE fac_usrtab_key = 1) ud_status
       WHERE m.mld_melding_status != 1
         -- Afgemelde meldingen alleen meenemen als er geldige opdrachten mét kosten bij zitten
         AND NOT (    m.mld_melding_status IN (5,6)
                  AND NOT EXISTS (SELECT 1 FROM mld_opdr
                                   WHERE mld_melding_key = m.mld_melding_key
                                     AND mld_opdr_kosten > 0
                                     AND mld_statusopdr_key NOT IN (1,2) ) )
         AND sm.mld_stdmelding_key = m.mld_stdmelding_key
         AND vg.ins_discipline_key = sm.mld_ins_discipline_key
         AND vt.ins_srtdiscipline_key = vg.ins_srtdiscipline_key
         AND vt.ins_srtdiscipline_key = 521
         AND km.prs_kostenplaats_key = m.prs_kostenplaats_key
         AND geraamd.mld_melding_key(+) = m.mld_melding_key
         AND toegekend.mld_melding_key(+) = m.mld_melding_key
         AND status.mld_melding_key(+) = m.mld_melding_key
         AND ud_status.fac_usrdata_key(+) = fac.safe_to_number(status.mld_kenmerkmelding_waarde)
         AND l.alg_locatie_key = m.mld_alg_locatie_key
         AND o_open.mld_melding_key(+) = m.mld_melding_key
         AND o_klaar.mld_melding_key(+) = m.mld_melding_key
      UNION ALL
      SELECT TO_CHAR(m.mld_melding_einddatum, 'YYYY')||LPAD(TO_CHAR(m.mld_melding_key), 6, '0') hide_f_sort,
             TO_CHAR(m.mld_melding_einddatum, 'YYYY') fclt_f_jaar,
             TO_CHAR(m.mld_melding_einddatum, 'DD-MM-YYYY') gepland,
             l.alg_locatie_omschrijving fclt_f_locatie,
             htf.escape_sc(k.prs_kostenplaats_omschrijving) budget,
             k.prs_kostenplaats_limiet,
                '<a class="details" onclick=''FcltMgr.openDetail("'
             || 'appl/MLD/mld_melding.asp?urole=fo&'||'mld_key='||m.mld_melding_key
             || '")''>'
             || htf.escape_sc(vt.ins_srtdiscipline_prefix||m.mld_melding_key)
             || '</a>'
                html_nummer,
             m.mld_melding_omschrijving omschrijving,
             NULL geraamd,
             NULL toegekend,
             o.mld_opdr_kosten besteed,
             CASE
             WHEN m.mld_melding_status IN (0,2,3,4,7,99)
                THEN
                   CASE
                      WHEN o.mld_opdr_key IS NOT NULL AND o.mld_statusopdr_key IN (3,4,5,8,10)
                         THEN 'Uitgegeven'
                      WHEN o.mld_opdr_key IS NOT NULL AND o.mld_statusopdr_key IN (6,7,9)
                         THEN 'Niet opgelost'
                      ELSE 'Aangevraagd'
                   END
             ELSE
                'Afgemeld'
             END
                fclt_f_substatus,
             CASE
                WHEN m.mld_melding_status IN (0,2,3,4,7,99)
                THEN 'Open'
                ELSE 'Gesloten'
             END
                fclt_f_status
        FROM mld_opdr o,
             mld_melding m,
             mld_stdmelding sm,
             mld_discipline vg,
             ins_srtdiscipline vt,
             alg_locatie l,
             prs_kostenplaats k
       WHERE m.mld_melding_key = o.mld_melding_key
         AND m.mld_melding_status != 1
         AND sm.mld_stdmelding_key = m.mld_stdmelding_key
         AND vg.ins_discipline_key = sm.mld_ins_discipline_key
         AND vt.ins_srtdiscipline_key = vg.ins_srtdiscipline_key
         AND vt.ins_srtdiscipline_key != 521
         AND l.alg_locatie_key = m.mld_alg_locatie_key
         AND k.prs_kostenplaats_key = o.prs_kostenplaats_key
         AND k.prs_kostenplaats_module = 'PRJ'
         AND o.mld_opdr_kosten > 0);

-- Rapportage "Budget per locatie"
-- Sommeert bovenstaande rapportage per budget en locatie
CREATE OR REPLACE VIEW demo_v_rap_invbegr_budg_loc
AS
   SELECT fclt_f_locatie||fclt_f_jaar||fclt_x_budget hide_f_sort,
          fclt_f_jaar, fclt_f_locatie,
          fclt_x_budget, html_budget,
          hide_f_limiet,
          SUM(fclt_c_toegekend) fclt_c_toegekend,
          SUM(DECODE(fclt_f_status,
                     'Open', fclt_c_besteed) )
             fclt_c_openstaand,
          SUM(DECODE(fclt_f_status,
                     'Gesloten', fclt_c_besteed) )
             fclt_c_uitgevoerd,
          SUM(fclt_c_besteed) fclt_c_besteed,
          SUM( COALESCE(fclt_c_besteed, fclt_c_toegekend) )
             fclt_c_prognose
     FROM demo_v_rap_invbegr
    WHERE fclt_f_substatus NOT IN ('Geannuleerd', 'Afgewezen')
   GROUP BY fclt_f_jaar, fclt_f_locatie, hide_f_limiet, fclt_x_budget, html_budget;

-- Rapportage "Budgetuitnuttig"
-- Beschikbaar budget per kostenplaats (categorie), uitgezet uitnutting.
-- Uitnutting = toegekend bedrag voor lopende meldingen, besteed bedrag voor afgesloten meldingen.
CREATE OR REPLACE VIEW demo_v_rap_invbegr_budg_uitnut
AS
   SELECT fclt_f_jaar,
          fclt_x_budget fclt_x_categorie,
          html_budget html_categorie,
          hide_f_limiet fclt_c_budget,
          SUM(fclt_c_toegekend) fclt_c_toegekend,
          SUM(fclt_c_openstaand) fclt_c_openstaand,
          SUM(fclt_c_uitgevoerd) fclt_c_uitgevoerd,
          SUM(fclt_c_besteed) fclt_c_besteed,
          SUM(fclt_c_prognose) fclt_c_prognose
     FROM demo_v_rap_invbegr_budg_loc
   GROUP BY fclt_f_jaar, hide_f_limiet, fclt_x_budget, html_budget;


---------------------------------------------------------------------------------
--   MJB (MeerJarenonderhoudsBegroting)                                        --
---------------------------------------------------------------------------------

-- Element = inspectie op MJB-object (component).
-- Elementen definieren met welke frequentie gebouwen/inventaris/apparatuur/... moeten
-- worden onderhouden/vervangen/...
-- Deze view levert alle inspecties op objectsoorten/-groepen in discipline "MJB", inclusief
-- periode, eenheidsprijs, eenheid, groep (categorie), verantwoordelijke (huurder/eigenaar)
-- en toelichting.
-- ins_discipline          MJB            2689
CREATE OR REPLACE VIEW demo_v_mjb_elementen
AS
   SELECT ins_srtcontrole_key,
          sd.ins_srtdeel_key,
          sc.ins_srtcontrole_groep categorie,
          sdg.ins_srtdeel_omschrijving objectsoort,
          sc.ins_srtcontrole_omschrijving element,
          sc.ins_srtcontrole_kosten eenheidsprijs,
          sd.ins_srtdeel_eenheid eenheid,
          sc.ins_srtcontrole_periode periode,
          sc.ins_srtcontrole_opmerking verantwoordelijke,
          sc.ins_srtcontrole_info toelichting
     FROM ins_srtcontrole sc,
          ins_v_srtdeel_gegevens sdg,
          ins_srtdeel sd
    WHERE sc.ins_srtinstallatie_key =
                DECODE(sc.ins_srtcontrole_niveau,
                       'S', sdg.ins_srtdeel_key,
                       'G', sdg.ins_srtgroep_key,
                       'D', sdg.ins_discipline_key)
      AND sdg.ins_discipline_key = 2689
      AND sd.ins_srtdeel_key = sdg.ins_srtdeel_key;

-- Rapportage met alle elementen
CREATE OR REPLACE VIEW demo_v_rap_mjb_elementen
AS
   SELECT categorie fclt_f_categorie,
          objectsoort fclt_f_objectsoort,
          element fclt_f_element,
          eenheidsprijs fclt_c_eenheidsprijs,
          eenheid,
          periode,
          verantwoordelijke fclt_f_verantwoordelijke,
          toelichting
     FROM demo_v_mjb_elementen;

-- Component = MJB-object met inspectie(s).
-- Componenten zijn bulkobjecten ("30 TL-armaturen") waarmee vastgelegd wordt wanneer
-- bepaalde zaken op lokaties zijn aangeschaft. M.b.v. de elementen wordt dan bepaald
-- wanneer ze vervangen/onderhouden moeten worden en wat dat naar verwachting gaat kosten.
-- Daarbij kan per inspectieresultaat de prijs overruled worden. Uitstel is mogelijk.
-- ins_discipline          MJB                      2689
-- ins_kenmerk             Aantal                    961
-- ins_kenmerk             Uplift                    962
-- ins_srtkenmerk          Werkelijke eenh.prijs     681
CREATE OR REPLACE VIEW demo_v_mjb_componenten
AS
   SELECT alg_locatie_key,
          locatie,
          categorie,
          ins_srtdeel_key,
          objectsoort,
          e.ins_deel_key,
          element,
          aantal,
          COALESCE(werkelijk, eenheidsprijs) eenheidsprijs,
          eenheid,
          uplift,
          aantal * COALESCE(werkelijk, eenheidsprijs) * (1 + COALESCE(uplift, 0) / 100) totaalprijs,
          werkelijk,
          aanschaf,
          laatste,
          uitstel,
          periode,
          COALESCE(uitstel, COALESCE(laatste, aanschaf) + periode ) vervangingsjaar
--         ,verantwoordelijke
     FROM (
      SELECT l.alg_locatie_key,
             l.alg_locatie_omschrijving locatie,
             el.categorie categorie,
             sd.ins_srtdeel_key,
             sd.ins_srtdeel_omschrijving objectsoort,
             el.ins_srtcontrole_key,
             el.element element,
             d.ins_deel_key,
             fac.safe_to_number(aantal.ins_kenmerkdeel_waarde) aantal,
             el.eenheidsprijs eenheidsprijs,
             sd.ins_srtdeel_eenheid eenheid,
             fac.safe_to_number(uplift.ins_kenmerkdeel_waarde) uplift,
             fac.safe_to_number(TO_CHAR(d.ins_deel_aanmaak, 'YYYY')) aanschaf,
             el.periode periode,
             el.verantwoordelijke verantwoordelijke
        FROM ins_deel d,
             ins_srtdeel sd,
             ins_srtgroep sg,
             demo_v_mjb_elementen el,
             ins_v_alg_onroerendgoed og,
             alg_locatie l,
             (SELECT * FROM ins_kenmerkdeel
               WHERE ins_kenmerk_key = 961
                 AND ins_kenmerkdeel_verwijder IS NULL) aantal,
             (SELECT * FROM ins_kenmerkdeel
               WHERE ins_kenmerk_key = 962
                 AND ins_kenmerkdeel_verwijder IS NULL) uplift
       WHERE d.ins_deel_verwijder IS NULL
         AND sd.ins_srtdeel_key = d.ins_srtdeel_key
         AND sg.ins_srtgroep_key = sd.ins_srtgroep_key
         AND sg.ins_discipline_key = 2689
         AND og.alg_onrgoed_type = d.ins_alg_ruimte_type
         AND og.alg_onrgoed_keys = d.ins_alg_ruimte_key
         AND l.alg_locatie_key = og.alg_locatie_key
         AND el.ins_srtdeel_key(+) = sd.ins_srtdeel_key
         AND aantal.ins_deel_key = d.ins_deel_key
         AND uplift.ins_deel_key(+) = d.ins_deel_key ) e
   LEFT OUTER JOIN (
      SELECT dsc.ins_srtcontrole_key, dsc.ins_deel_key,
             fac.safe_to_number(TO_CHAR(dsc.ins_deelsrtcontrole_datum, 'YYYY')) laatste,
             NULL uitstel,
             fac.safe_to_number(ins_kmdeelsrtcontr_waarde) werkelijk
        FROM ins_deelsrtcontrole dsc,
             ins_srtcontroledl_xcp xcp,
             (SELECT kdsc.* FROM ins_kmdeelsrtcontr kdsc, ins_kenmerk k
               WHERE k.ins_kenmerk_key = kdsc.ins_kenmerk_key
                 AND k.ins_srtkenmerk_key = 681
                 AND kdsc.ins_kmdeelsrtcontr_verwijder IS NULL) werkelijk
       WHERE werkelijk.ins_deelsrtcontrole_key(+) = dsc.ins_deelsrtcontrole_key
         AND xcp.ins_srtcontrole_key(+) = dsc.ins_srtcontrole_key
         AND xcp.ins_deel_key(+) = dsc.ins_deel_key
         AND dsc.ins_deelsrtcontrole_key =
                (SELECT MAX(ins_deelsrtcontrole_key) FROM ins_deelsrtcontrole
                  WHERE ins_deel_key = dsc.ins_deel_key
                    AND ins_srtcontrole_key = dsc.ins_srtcontrole_key) ) c
   ON     e.ins_deel_key = c.ins_deel_key
      AND e.ins_srtcontrole_key = c.ins_srtcontrole_key;

-- Rapportage met alle componenten
CREATE OR REPLACE VIEW demo_v_rap_mjb_componenten
AS
   SELECT locatie||COALESCE(categorie,'_')||objectsoort||vervangingsjaar hide_f_sort,
          locatie fclt_f_locatie,
          categorie fclt_f_categorie,
          objectsoort fclt_x_objectsoort,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/INS/ins_deel.asp?urole=bo&'||'ins_key='||ins_deel_key
          || '")''>'
          || htf.escape_sc(objectsoort)
          || '</a>'
             html_object,
          element fclt_f_element,
          aantal,
          eenheidsprijs,
          'p/ '||eenheid eenheid,
          uplift,
          totaalprijs fclt_c_totaalprijs,
          TO_CHAR(aanschaf) aanschaf,
          TO_CHAR(laatste) uitgevoerd,
          TO_CHAR(periode) periode,
          TO_CHAR(uitstel) uitstel,
          TO_CHAR(vervangingsjaar) fclt_f_vervangingsjaar
--         ,verantwoordelijke
     FROM demo_v_mjb_componenten;

-- Gestylede rapportage die per jaar/locatie/categorie aangeeft hoeveel kiloeuro er
-- begroot moet worden voor MJB
CREATE OR REPLACE VIEW demo_v_rap_mjb_grid
AS
   SELECT grid.locatie || '-' || grid.categorie hide_f_regel,
          grid.locatie fclt_f_locatie,
          grid.categorie fclt_f_categorie,
          TO_CHAR(grid.jaar) fclt_f_aanschafjaar,
          COALESCE (comp.totaalprijs, 0) bedrag
     FROM (
         SELECT DISTINCT a.alg_locatie_key,
                j.jaar,
                a.alg_locatie_omschrijving locatie,
                e.categorie
           FROM (SELECT   alg_locatie_key,
                          alg_locatie_omschrijving
                   FROM   alg_v_aanweziglocatie
                 UNION ALL
                 SELECT   -1 alg_gebouw_key,
                          'Onbekend' alg_locatie_omschrijving
                   FROM   DUAL) a,
                ins_v_aanwezigdeel d,
                demo_v_mjb_elementen e,
                (SELECT n jaar
                   FROM (SELECT ROWNUM n FROM DUAL
                         CONNECT BY LEVEL <= TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY'))+12)
                  WHERE n >= TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY'))-2) j
          WHERE e.ins_srtdeel_key = d.ins_srtdeel_key
            ORDER BY locatie, jaar
   ) grid
   LEFT OUTER JOIN (
      SELECT alg_locatie_key,
             categorie,
             SUM(totaalprijs/1000) totaalprijs,
             vervangingsjaar
        FROM demo_v_mjb_componenten
       WHERE vervangingsjaar IS NOT NULL
      GROUP BY alg_locatie_key, categorie, vervangingsjaar, periode
      UNION ALL
      SELECT alg_locatie_key,
             categorie,
             SUM(totaalprijs/1000) totaalprijs,
             vervangingsjaar + periode vervangingsjaar
        FROM demo_v_mjb_componenten
       WHERE vervangingsjaar IS NOT NULL
      GROUP BY alg_locatie_key, categorie, (vervangingsjaar +   periode)
      UNION ALL
      SELECT alg_locatie_key,
             categorie,
             SUM(totaalprijs/1000) totaalprijs,
             vervangingsjaar + 2*periode vervangingsjaar
        FROM demo_v_mjb_componenten
       WHERE vervangingsjaar IS NOT NULL
      GROUP BY alg_locatie_key, categorie, (vervangingsjaar + 2*periode)
      UNION ALL
      SELECT alg_locatie_key,
             categorie,
             SUM(totaalprijs/1000) totaalprijs,
             vervangingsjaar + 3*periode vervangingsjaar
        FROM demo_v_mjb_componenten
       WHERE vervangingsjaar IS NOT NULL
      GROUP BY alg_locatie_key, categorie, (vervangingsjaar + 3*periode)
   ) comp
   ON     comp.alg_locatie_key = grid.alg_locatie_key
      AND comp.categorie = grid.categorie
      AND comp.vervangingsjaar = grid.jaar
;

-- Alle opgeroepen bezoekers, dat is:
-- * bezoeker is binnen en opgeroepen, maar nog niet vertrokken
-- * bezoeker is aangemeld voor vandaag
-- * bij de afspraak hoort een oproep-actie (geen ophaal-actie)
-- * badgenummer is gevuld
-- Filtering via de API kan op gebouw, verdieping en wachtzone (groep), dus die ook ophalen
CREATE OR REPLACE VIEW demo_v_api_bez_oproep
AS
   SELECT TO_CHAR(b.bez_bezoekers_oproep, 'YYYY-MM-DD HH24:MI:SS') oproep_tijd,
          rr.res_ruimte_nr ruimtenr,
          COALESCE(rr.res_ruimte_groep, ' ') groep,
          b.bez_bezoekers_pasnr oproep_nummer,
          b.bez_bezoekers_key bezoeker_key,
          g.alg_gebouw_code gebouw_code,
          g.alg_gebouw_key gebouw_key,
          v.alg_verdieping_code verdieping_code,
          v.alg_verdieping_key verdieping_key
     FROM bez_bezoekers b,
          bez_afspraak a,
          bez_actie ac,
          res_rsv_ruimte rrr,
          res_ruimte_opstelling ro,
          res_ruimte rr,
          res_alg_ruimte rar,
          alg_ruimte r,
          alg_verdieping v,
          alg_gebouw g
    WHERE rrr.res_rsv_ruimte_van BETWEEN TRUNC(SYSDATE) AND TRUNC(SYSDATE) + 1
      AND a.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
      AND ac.bez_actie_key = a.bez_actie_key
      AND BITAND(ac.bez_actie_flags, 1) = 1
      AND b.bez_afspraak_key = a.bez_afspraak_key
      AND b.bez_bezoekers_done IS NOT NULL
      AND b.bez_bezoekers_oproep IS NOT NULL
      AND b.bez_bezoekers_out IS NULL
      AND b.bez_bezoekers_pasnr IS NOT NULL
      AND ro.res_ruimte_opstel_key = rrr.res_ruimte_opstel_key
      AND rr.res_ruimte_key = ro.res_ruimte_key
      AND rar.res_ruimte_key = rr.res_ruimte_key
      AND r.alg_ruimte_key = rar.alg_ruimte_key
      AND v.alg_verdieping_key = r.alg_verdieping_key
      AND g.alg_gebouw_key = v.alg_gebouw_key
    ORDER BY 1 DESC;

-- Rapportage t.b.v. voorbeeld oproepscherm (= gestylede rapportage)
CREATE OR REPLACE VIEW demo_v_rap_bez_oproep
AS
   SELECT oproep_tijd hide_f_oproeptijd,
          gebouw_code fclt_f_gebouwcode,
          verdieping_code fclt_f_verdiepingcode,
          groep fclt_f_wachtzonde,
          ruimtenr fclt_f_ruimtenr,
          oproep_nummer oproepnr
     FROM demo_v_api_bez_oproep
   ORDER BY oproep_tijd DESC;

CREATE OR REPLACE VIEW demo_v_leverancier
AS
   SELECT *
     FROM prs_bedrijf
    WHERE prs_bedrijf_leverancier = 1;

CREATE OR REPLACE VIEW demo_v_rap_fin_bijtelling
AS
   SELECT p.prs_perslid_nr personeelsnummer,
          DECODE (
             pfa.prs_perslid_key,
             NULL, 'POOL',
                '<a class="details" onclick=''FcltMgr.openDetail("'
             || 'appl/prs/prs_perslid.asp?key='
             || pfa.prs_perslid_key
             || '")''>'
             || HTF.escape_sc (pfa.prs_perslid_naam_full)
             || '</a>')
             html_berijder,
          COALESCE (pfa.prs_perslid_naam_full, 'POOL') fclt_x_berijder,
          ad.ins_deel_omschrijving fclt_f_voertuig,
          c.cnt_contract_nummer_intern fclt_x_contract,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/cnt/cnt_contract.asp?urole=bo&'
          || 'cnt_key='
          || c.cnt_contract_key
          || '")''>'
          || HTF.escape_sc (c.cnt_contract_nummer_intern)
          || '</a>'
             html_contract,
          b.prs_bedrijf_naam fclt_f_bedrijf,
          DECODE (
             c.ins_discipline_key,
             2789,
             'huur',
             TO_CHAR (
                ROUND (MONTHS_BETWEEN (c.cnt_contract_looptijd_tot, c.cnt_contract_looptijd_van))))
             looptijd,
          ROUND(demo.getAantalDagenInPeriode (c.cnt_contract_looptijd_van,
                                              c.cnt_contract_looptijd_tot,
                                              TRUNC (SYSDATE, 'MM'))
                * CAST (TO_CHAR (LAST_DAY (SYSDATE), 'DD') AS INT))
             aantal_dagen,
          ROUND (
             c.cnt_contract_termijnkosten
             * demo.getAantalDagenInPeriode (c.cnt_contract_looptijd_van,
                                             c.cnt_contract_looptijd_tot,
                                             TRUNC (SYSDATE, 'MM')),
             2)
             fclt_c_kosten,
          fisc.waarde fclt_c_fiscale_waarde,
          DECODE (bij.fac_usrdata_prijs, NULL, NULL, TO_CHAR (bij.fac_usrdata_prijs) || '%')
             percentage,
          ROUND (
             fisc.waarde * bij.fac_usrdata_prijs / 1200
             * demo.getAantalDagenInPeriode (c.cnt_contract_looptijd_van,
                                             c.cnt_contract_looptijd_tot,
                                             TRUNC (SYSDATE, 'MM')),
             2)
             fclt_c_bruto_bijtelling
     FROM cnt_contract c,
          cnt_contract_object co,
          ins_v_aanwezigdeel ad,
          prs_perslid p,
          prs_v_perslid_fullnames_all pfa,
          prs_bedrijf b,
          (SELECT kd.ins_deel_key, ud.fac_usrdata_prijs
             FROM ins_kenmerkdeel kd, ins_kenmerk k, fac_usrdata ud
            WHERE     kd.ins_kenmerk_key = k.ins_kenmerk_key
                  AND kd.ins_kenmerkdeel_verwijder IS NULL
                  AND k.ins_srtkenmerk_key = 749
                  AND k.ins_kenmerk_verwijder IS NULL
                  AND ud.fac_usrtab_key = 884
                  AND fac.safe_to_number (kd.ins_kenmerkdeel_waarde) = ud.fac_usrdata_key) bij,
          (SELECT kd.ins_deel_key, fac.safe_to_number (kd.ins_kenmerkdeel_waarde) waarde
             FROM ins_kenmerkdeel kd, ins_kenmerk k
            WHERE     kd.ins_kenmerk_key = k.ins_kenmerk_key
                  AND kd.ins_kenmerkdeel_verwijder IS NULL
                  AND k.ins_srtkenmerk_key = 747
                  AND k.ins_kenmerk_verwijder IS NULL) fisc
    WHERE     c.ins_discipline_key IN (2788, 2789)
          AND c.cnt_contract_looptijd_van <= LAST_DAY (SYSDATE)
          AND c.cnt_contract_looptijd_tot >= TRUNC (SYSDATE, 'MM')
          AND co.cnt_contract_key = c.cnt_contract_key
          AND ad.ins_deel_key = co.cnt_ins_deel_key
          AND p.prs_perslid_key(+) = ad.ins_alg_ruimte_key
          AND pfa.prs_perslid_key(+) = p.prs_perslid_key
          AND b.prs_bedrijf_key = c.cnt_prs_bedrijf_key
          AND bij.ins_deel_key(+) = ad.ins_deel_key
          AND fisc.ins_deel_key(+) = ad.ins_deel_key;

----- KPI's --------------------------------------------------------------------

CREATE OR REPLACE VIEW demo_v_rap_kpi_definitie
AS
   SELECT * FROM kpi_definitie;

----- Views voor berekenen KPI's -----------------------------------------------

-- Views voor berekening (genormeerde) KPI-scores o.b.v. handmatig/automatisch ingevulde KPI-meldingen.
-- Eén view per melding. Nummering is gelijk aan die van de de standaardmeldingen.

-- mld_stdmelding Budget en Kosten                 1542  A
-- mld_kenmerk    Catering^
-- mld_kenmerk    Werkelijke kosten                2319  A
-- mld_kenmerk    Extra kosten                     2295  A
-- mld_kenmerk    Receptie^
-- mld_kenmerk    Werkelijke kosten                2320  A
-- mld_kenmerk    Extra kosten                     2296  A
-- mld_kenmerk    Schoonmaak^
-- mld_kenmerk    Werkelijke kosten                2321  A
-- mld_kenmerk    Extra kosten                     2297  A
-- mld_kenmerk    Documentmanagement^
-- mld_kenmerk    Werkelijke kosten                2322  A
-- mld_kenmerk    Extra kosten                     2298  A
CREATE OR REPLACE VIEW demo_v_kpi1
AS
   WITH normen AS
        (SELECT kpi_definitie_key,
                kpi_definitie_code kpi_code,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code IN ('CK1','RK11','RK12','SK23','SK25','DK33')),
        kosten AS
        (SELECT mld_melding_key,
                alg_locatie_key,
                periode,
                (cat_kost + cat_extra) / cat_kost cat_score,
                (rec_kost + rec_extra) / rec_kost rec_score,
                (sch_kost + sch_extra) / sch_kost sch_score,
                (doc_kost + doc_extra) / doc_kost doc_score,
                rec_extra / (rec_kost + rec_extra) rec_onvoorz_score,
                sch_extra / (sch_kost + sch_extra) sch_regie_score
           FROM (
               SELECT m.mld_melding_key,
                      dloc.alg_locatie_key alg_locatie_key,
                      TRUNC(m.mld_melding_datum, 'MM') periode,
                      fac.safe_to_number(cat_kost.mld_kenmerkmelding_waarde)  cat_kost,
                      fac.safe_to_number(cat_extra.mld_kenmerkmelding_waarde) cat_extra,
                      fac.safe_to_number(rec_kost.mld_kenmerkmelding_waarde)  rec_kost,
                      fac.safe_to_number(rec_extra.mld_kenmerkmelding_waarde) rec_extra,
                      fac.safe_to_number(sch_kost.mld_kenmerkmelding_waarde)  sch_kost,
                      fac.safe_to_number(sch_extra.mld_kenmerkmelding_waarde) sch_extra,
                      fac.safe_to_number(doc_kost.mld_kenmerkmelding_waarde)  doc_kost,
                      fac.safe_to_number(doc_extra.mld_kenmerkmelding_waarde) doc_extra
                 FROM mld_melding m,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2319) cat_kost,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2295) cat_extra,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2320) rec_kost,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2296) rec_extra,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2321) sch_kost,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2297) sch_extra,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2322) doc_kost,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2298) doc_extra,
                      alg_locatie dloc
                WHERE m.mld_stdmelding_key = 1542
--                  AND m.mld_melding_status IN (5)
                  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
                  AND cat_kost.mld_melding_key = m.mld_melding_key
                  AND cat_extra.mld_melding_key(+) = m.mld_melding_key
                  AND rec_kost.mld_melding_key = m.mld_melding_key
                  AND rec_extra.mld_melding_key(+) = m.mld_melding_key
                  AND sch_kost.mld_melding_key = m.mld_melding_key
                  AND sch_extra.mld_melding_key(+) = m.mld_melding_key
                  AND doc_kost.mld_melding_key = m.mld_melding_key
                  AND doc_extra.mld_melding_key(+) = m.mld_melding_key) )
   SELECT kpi_definitie_key, periode kpi_score_datum, alg_locatie_key,
          'melding' kpi_score_xmlnode, mld_melding_key kpi_score_refkey,
          kpi.getNormScore(score, n000, n070, n090, n100) kpi_score_score,
          normscores  kpi_score_norm_score,
          SUBSTR( TO_CHAR(score), 1, 20) kpi_score_drempels
     FROM (
         SELECT n.kpi_definitie_key, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key,
                k.periode,
                DECODE(SUBSTR(n.kpi_code, 1, 1),
                       'R', 'Receptie',
                       'S', 'Schoonmaak',
                       'D', 'Documentmanagement',
                       'C', 'Catering') proces,
                'Kosten' onderdeel,
                DECODE(n.kpi_code,
                       'CK1',  cat_score,
                       'RK11', rec_score,
                       'RK12', rec_onvoorz_score,
                       'SK23', sch_regie_score,
                       'SK25', sch_score,
                       'DK33', doc_score) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, kosten k) m
;

-- mld_stdmelding Audit Catering                   1541
-- mld_kenmerk    Wachttijden bij kassa^
-- mld_kenmerk    Tijdstip1
-- mld_kenmerk    Aantal bezoekers                 2281  A
-- mld_kenmerk    Aantal op tijd                   2285  A
-- mld_kenmerk    Tijdstip2
-- mld_kenmerk    Aantal bezoekers                 2282  A
-- mld_kenmerk    Aantal op tijd                   2286  A
-- mld_kenmerk    Tijdstip3
-- mld_kenmerk    Aantal bezoekers                 2283  A
-- mld_kenmerk    Aantal op tijd                   2287  A
-- mld_kenmerk    Opmerking
-- mld_kenmerk    Assortimentsaanbod^
-- mld_kenmerk    Aantal producten assortiment     2289  A
-- mld_kenmerk    Aantal producten aanwezig        2288  A
-- mld_kenmerk    Opmerking
-- mld_kenmerk    HACCP controle^
-- mld_kenmerk    Totaal aantal HACCP punten       2317  A
-- mld_kenmerk    Aantal goede HACCP punten        2284  A
CREATE OR REPLACE VIEW demo_v_kpi2
AS
   WITH normen AS
        (SELECT kpi_definitie_key,
                kpi_definitie_code kpi_code,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code IN ('CK2', 'CK3', 'CK4')),
        audits AS
        (SELECT mld_melding_key,
                alg_locatie_key,
                periode,
                (tijdig1 + tijdig2 + tijdig3) / (num_bez1 + num_bez2 + num_bez3) wachttijd_score,
                aanw_prod / num_prod assortiment_score,
                goed_haccp / num_haccp haccp_score
           FROM (
               SELECT m.mld_melding_key,
                      dloc.alg_locatie_key alg_locatie_key,
                      TRUNC(m.mld_melding_datum, 'MM') periode,
                      fac.safe_to_number(num_bez1.mld_kenmerkmelding_waarde)   num_bez1,
                      fac.safe_to_number(tijdig1.mld_kenmerkmelding_waarde)    tijdig1,
                      fac.safe_to_number(num_bez2.mld_kenmerkmelding_waarde)   num_bez2,
                      fac.safe_to_number(tijdig2.mld_kenmerkmelding_waarde)    tijdig2,
                      fac.safe_to_number(num_bez3.mld_kenmerkmelding_waarde)   num_bez3,
                      fac.safe_to_number(tijdig3.mld_kenmerkmelding_waarde)    tijdig3,
                      fac.safe_to_number(num_prod.mld_kenmerkmelding_waarde)   num_prod,
                      fac.safe_to_number(aanw_prod.mld_kenmerkmelding_waarde)  aanw_prod,
                      fac.safe_to_number(num_haccp.mld_kenmerkmelding_waarde)  num_haccp,
                      fac.safe_to_number(goed_haccp.mld_kenmerkmelding_waarde) goed_haccp
                 FROM mld_melding m,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2281) num_bez1,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2285) tijdig1,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2282) num_bez2,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2286) tijdig2,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2283) num_bez3,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2287) tijdig3,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2289) num_prod,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2288) aanw_prod,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2317) num_haccp,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2284) goed_haccp,
                      alg_locatie dloc
                WHERE m.mld_stdmelding_key = 1541
--                  AND m.mld_melding_status IN (5)
                  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
                  AND num_bez1.mld_melding_key(+) = m.mld_melding_key
                  AND tijdig1.mld_melding_key(+) = m.mld_melding_key
                  AND num_bez2.mld_melding_key(+) = m.mld_melding_key
                  AND tijdig2.mld_melding_key(+) = m.mld_melding_key
                  AND num_bez3.mld_melding_key(+) = m.mld_melding_key
                  AND tijdig3.mld_melding_key(+) = m.mld_melding_key
                  AND num_prod.mld_melding_key(+) = m.mld_melding_key
                  AND aanw_prod.mld_melding_key(+) = m.mld_melding_key
                  AND num_haccp.mld_melding_key(+) = m.mld_melding_key
                  AND goed_haccp.mld_melding_key(+) = m.mld_melding_key) )
   SELECT kpi_definitie_key, periode kpi_score_datum, alg_locatie_key,
          'melding' kpi_score_xmlnode, mld_melding_key kpi_score_refkey,
          kpi.getNormScore(score, n000, n070, n090, n100) kpi_score_score,
          normscores  kpi_score_norm_score,
          SUBSTR( TO_CHAR(score), 1, 20) kpi_score_drempels
     FROM (
         SELECT n.kpi_definitie_key, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key,
                k.periode,
                'Catering' proces,
                'Kwaliteit' onderdeel,
                DECODE(n.kpi_code,
                       'CK2', wachttijd_score,
                       'CK3', assortiment_score,
                       'CK4', haccp_score) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, audits k) m
;

-- mld_stdmelding KTO Receptie                     1544  A
-- mld_srtkenmerk Cijfer                           2647  A
-- mld_srtkenmerk Opmerking
-- TODO: divide-by-zero voorkomen
CREATE OR REPLACE VIEW demo_v_kpi3
AS
   WITH normen AS
        (SELECT kpi_definitie_key,
                kpi_definitie_code kpi_code,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code IN ('RT19')), --('CT6','RT19','RT20','ST30','DT40')),
        kto AS
        (SELECT MIN(mld_melding_key) mld_melding_key,
                alg_locatie_key,
                periode,
                mld_stdmelding_key, SUM(cijfer) / COUNT(*) avg_score
           FROM (
               SELECT m.mld_melding_key,
                      dloc.alg_locatie_key alg_locatie_key,
                      TRUNC(m.mld_melding_datum, 'MM') periode,
                      m.mld_stdmelding_key,
                      fac.safe_to_number(cijfer.mld_kenmerkmelding_waarde) cijfer
                 FROM mld_melding m,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL
                          AND mld_kenmerk_key IN (SELECT mld_kenmerk_key FROM mld_kenmerk
                                                   WHERE mld_kenmerk_verwijder IS NULL
                                                     AND mld_srtkenmerk_key = 2647) ) cijfer,
                      alg_locatie dloc,
                      fac_usrdata dperiode
                WHERE m.mld_stdmelding_key IN (1544)
--                  AND m.mld_melding_status IN (5)
                  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
                  AND cijfer.mld_melding_key = m.mld_melding_key)
         GROUP BY alg_locatie_key, periode, mld_stdmelding_key)
   SELECT kpi_definitie_key, periode kpi_score_datum, alg_locatie_key,
          'melding' kpi_score_xmlnode, mld_melding_key kpi_score_refkey,
          kpi.getNormScore(score, n000, n070, n090, n100) kpi_score_score,
          normscores  kpi_score_norm_score,
          SUBSTR( TO_CHAR(score), 1, 20) kpi_score_drempels
     FROM (
         SELECT n.kpi_definitie_key, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key,
                k.periode,
                DECODE(SUBSTR(n.kpi_code, 1, 1),
                       'R', 'Receptie',
                       'S', 'Schoonmaak',
                       'D', 'Documentmanagement',
                       'C', 'Catering') proces,
                'Tevredenheid' onderdeel,
                avg_score score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, kto k
          WHERE k.mld_stdmelding_key = DECODE(n.kpi_code,
                                              'RT19', 1544)) m
;

-- mld_stdmelding Duurzaamheid en derving Catering          1543
-- mld_kenmerk    Gebruik biologische producten^
-- mld_kenmerk    Percentage Biologisch                     2310  A
-- mld_kenmerk    Opmerking
-- mld_kenmerk    Derving^
-- mld_kenmerk    Percentage derving                        2311  A
-- mld_kenmerk    Opmerking
CREATE OR REPLACE VIEW demo_v_kpi4
AS
   WITH normen AS
        (SELECT kpi_definitie_key,
                kpi_definitie_code kpi_code,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code IN ('CD7', 'CD8')),
        audits AS
        (SELECT mld_melding_key,
                alg_locatie_key,
                periode,
                perc_bio  / 100 bio_score,
                perc_derv / 100 derving_score
           FROM (
               SELECT m.mld_melding_key,
                      dloc.alg_locatie_key alg_locatie_key,
                      TRUNC(m.mld_melding_datum, 'MM') periode,
                      fac.safe_to_number(perc_bio.mld_kenmerkmelding_waarde) perc_bio,
                      fac.safe_to_number(perc_derv.mld_kenmerkmelding_waarde)  perc_derv
                 FROM mld_melding m,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2310) perc_bio,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2311) perc_derv,
                      alg_locatie dloc
                WHERE m.mld_stdmelding_key = 1543
--                  AND m.mld_melding_status IN (5)
                  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
                  AND perc_bio.mld_melding_key(+) = m.mld_melding_key
                  AND perc_derv.mld_melding_key(+) = m.mld_melding_key ) )
   SELECT kpi_definitie_key, periode kpi_score_datum, alg_locatie_key,
          'melding' kpi_score_xmlnode, mld_melding_key kpi_score_refkey,
          kpi.getNormScore(score, n000, n070, n090, n100) kpi_score_score,
          normscores  kpi_score_norm_score,
          SUBSTR( TO_CHAR(score), 1, 20) kpi_score_drempels
     FROM (
         SELECT n.kpi_definitie_key, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key,
                k.periode,
                'Catering' proces,
                'Duurzaamheid' onderdeel,
                DECODE(n.kpi_code,
                       'CD7', bio_score,
                       'CD8', derving_score) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, audits k) m
;


CREATE OR REPLACE VIEW demo_v_kpi_all
AS
   SELECT * FROM demo_v_kpi1
   UNION ALL
   SELECT * FROM demo_v_kpi2
   UNION ALL
   SELECT * FROM demo_v_kpi3
   UNION ALL
   SELECT * FROM demo_v_kpi4;

CREATE OR REPLACE PACKAGE demo
AS
   FUNCTION  getAantalDagenInPeriode(p_van            IN DATE,
                                     p_tot            IN DATE,
                                     p_periode_van    IN DATE,
                                     p_periode_tot    IN DATE := NULL)
   RETURN NUMBER;
   PROCEDURE refreshscore(pUserKey IN NUMBER);
END;
/

CREATE OR REPLACE PACKAGE BODY demo
AS
   -- Bepaal aantal dagen in begin- of eindperiode waarvoor huur betaald moet worden
   -- Periode moet binnen dezelfde kalendermaand liggen.
   -- Als p_periode_tot leeg is, gaan we uit van het einde van de maand
   -- Als p_van en/of p_tot leeg zijn, dan zetten we die op begin resp. eind van de periode
   FUNCTION getAantalDagenInPeriode(p_van            IN DATE,
                                    p_tot            IN DATE,
                                    p_periode_van    IN DATE,
                                    p_periode_tot    IN DATE := NULL)
   RETURN NUMBER
   IS
      o_aantal_dagen       NUMBER(4);
      v_periode_tot        DATE;
      v_van                DATE;
      v_tot                DATE;
   BEGIN
      -- Einddatum van de periode die we beschouwen.
      -- Als geen einddatum, dan einde van de maand (startdatum zou dan eerste dag van de maand moeten zijn)
      v_periode_tot :=  COALESCE( p_periode_tot, LAST_DAY(p_periode_van) );

      -- Valt periode (p_van - p_tot) geheel buiten (p_periode_van - p_periode_tot)? Dan nul dagen overlap!
      IF (   p_tot < p_periode_van
          OR p_van > p_periode_tot)
      THEN
         RETURN 0;
      END IF;

      -- Aantal dagen is maximaal de hele periode
      o_aantal_dagen :=   CAST( TO_CHAR(v_periode_tot, 'DD') AS INT)
                        - CAST( TO_CHAR(p_periode_van, 'DD') AS INT)
                        + 1;

      v_van := p_van;
      v_tot := p_tot;

      -- Als geen van/tot datum opgegeven, of als van/tot datum buiten periode valt,
      -- dan zet op begin-/einddatum van de periode (periode)
      IF (v_van IS NULL OR v_van < p_periode_van)
      THEN
         v_van := p_periode_van;
      END IF;
      IF (v_tot IS NULL OR v_tot > v_periode_tot)
      THEN
         v_tot := v_periode_tot;
      END IF;

      -- Beslaat het contract de volledige periode, of beginnen/eindigen we halverwege?
      -- DAN:
      --  - ingangsmaand is hetzelfde als van huidige periode
      --  - ingangsdag is later dan de eerste dag van de periode
      -- EN/OF:
      --  - eindmaand is hetzelfde als van huidige periode
      --  - einddag is eerder dan de laatste dag van de periode
      IF (   (    TRUNC(v_van, 'MM') = TRUNC(p_periode_van, 'MM')
              AND TRUNC(v_van, 'DD') > p_periode_van )
          OR (    TRUNC(v_tot, 'MM') = TRUNC(v_periode_tot, 'MM')
              AND TRUNC(v_tot, 'DD') < v_periode_tot ) )
      THEN
         -- prijsfactor = aantal_dagen_gehuurd / aantal_dagen_in_deze_periode
         --             = einddag - begindag + 1 / aantal_dagen_in_deze_periode
         o_aantal_dagen :=   (   CAST( TO_CHAR(v_tot, 'DD') AS INT)
                               - CAST( TO_CHAR(v_van, 'DD') AS INT)
                               + 1 );
      END IF;

      RETURN o_aantal_dagen;
   END;

   PROCEDURE refreshscore(pUserKey IN NUMBER)
   AS
   BEGIN
     -- Waarden van de huidige periode(s) verwijderen.
     -- TODO: tricky met KPI's op basis van storingsmeldingen, klachten etc; daar kan voor een
     -- periode maar zo een extra melding afgemeld worden, waardoor de score opnieuw berekend wordt
     DELETE kpi_score
      WHERE (kpi_definitie_key, kpi_score_datum, alg_locatie_key) IN (
         SELECT DISTINCT kpi_definitie_key, kpi_score_datum, alg_locatie_key
           FROM demo_v_kpi_all);

     -- Opnieuw genereren van KPI scores
      INSERT INTO kpi_score (
         kpi_definitie_key,
         kpi_score_datum,
         alg_locatie_key,
         kpi_score_xmlnode,
         kpi_score_refkey,
         kpi_score_score,
         kpi_score_norm_score,
         kpi_score_drempels)
      SELECT * FROM demo_v_kpi_all;

      COMMIT;
   END;
END;
/

------------------------------------------

CREATE OR REPLACE VIEW demo_v_mld_inkoopaanvraag
AS
   SELECT mld_melding_key,
          'A' || mld_melding_key mld_melding_nr,
          CASE
            WHEN mld_melding_status IN (2, 3, 4, 7)
               THEN NULL
            ELSE SYSDATE-1
          END vervallen
     FROM mld_melding
    WHERE mld_stdmelding_key = 922;

CREATE OR REPLACE  VIEW demo_v_mld_changes
AS
   SELECT mld_melding_key,
          mld_melding_omschrijving,
             t.ins_srtdiscipline_prefix
          || m.mld_melding_key || ' '
          || m.mld_melding_omschrijving
             aanduiding,
          CASE
            WHEN m.mld_melding_status IN (0, 2, 3, 4, 7, 99)
               THEN NULL
            ELSE SYSDATE -1
          END vervallen
     FROM mld_melding m,
          mld_stdmelding s,
          mld_discipline d,
          ins_srtdiscipline t
    WHERE     s.mld_stdmelding_key = m.mld_stdmelding_key
          AND d.ins_discipline_key = s.mld_ins_discipline_key
          AND d.ins_discipline_key IN (2468, 2848)
          AND t.ins_srtdiscipline_key = d.ins_srtdiscipline_key;

CREATE OR REPLACE  VIEW demo_v_mld_problems
AS
   SELECT m.mld_melding_key,
          m.mld_melding_omschrijving,
             t.ins_srtdiscipline_prefix
          || m.mld_melding_key || ' '
          || m.mld_melding_omschrijving
             aanduiding,
          eig.prs_perslid_key eig_key,
          eig.prs_perslid_naam_full eigenaar,
          coord.prs_perslid_key coord_key,
          coord.prs_perslid_naam_full coordinator,
          CASE
            WHEN m.mld_melding_status IN (0, 2, 3, 4, 7, 99)
               THEN NULL
            ELSE SYSDATE -1
          END vervallen
     FROM mld_melding m,
          mld_stdmelding s,
          mld_discipline d,
          ins_srtdiscipline t,
          mld_kenmerkmelding kme,
          mld_kenmerkmelding kmc,
          prs_v_perslid_fullnames_all eig,
          prs_v_perslid_fullnames_all coord
    WHERE     s.mld_stdmelding_key = m.mld_stdmelding_key
          AND d.ins_discipline_key = s.mld_ins_discipline_key
          AND d.ins_discipline_key IN (2472)
          AND t.ins_srtdiscipline_key = d.ins_srtdiscipline_key
          AND kme.mld_melding_key = m.mld_melding_key
          AND kmc.mld_melding_key = m.mld_melding_key
          AND kme.mld_kenmerk_key = 1923
          AND kmc.mld_kenmerk_key = 2181
          AND kme.mld_kenmerkmelding_verwijder IS NULL
          AND kmc.mld_kenmerkmelding_verwijder IS NULL
          AND eig.prs_perslid_key = fac.safe_to_number (kme.mld_kenmerkmelding_waarde)
          AND coord.prs_perslid_key = fac.safe_to_number (kmc.mld_kenmerkmelding_waarde);

CREATE OR REPLACE VIEW demo_v_mob_reserveernu
AS
   SELECT res_ruimte_nr hide_f_sort,
          res_ruimte_nr fclt_f_ruimte,
          res_ruimte_key hide_f_ruimte_key,
          DECODE( lcl.getuserlanguage(),
                  'NL', 'Vrij tot ',
                  'EN', 'Available until ',
                  'DE', 'Verfügbar bis ',
                  'FR', 'Disponible avant ')
          || DECODE (van,
                     NULL, TO_CHAR (TRUNC (SYSDATE) + res_ruimte_eindtijd / 24, 'HH24:MI'),
                     TO_CHAR (van, 'HH24:MI'))
             vrij_tot,
             '<img src="../../cust/demo/photos/'
          || res_ruimte_image
          || '" width="100" style="float:left; margin-right: 10px;"/>'
             html_,
          info
     FROM (SELECT ruimte.res_ruimte_key,
                  lcl.xl ('res_ruimte_nr', ruimte.res_ruimte_key,
                          ruimte.res_ruimte_nr, lcl.getuserlanguage() ) res_ruimte_nr,
                  ruimte.res_ruimte_eindtijd,
                  ruimte.res_ruimte_image,
                  ruimte.omsteltijd,
                  CASE WHEN omsteltijd < 0.5 THEN van - 1 / 48 ELSE van - (omsteltijd / 24) END
                     drempel,
                  van.van - (omsteltijd / 24) van,
                  tot.tot,
                  SUBSTR (lcl.xl ('res_ruimte_omschrijving', ruimte.res_ruimte_key,
                                  ruimte.res_ruimte_omschrijving, lcl.getuserlanguage() ),
                          1, 100) || '...' info
             FROM (SELECT rr.*, dp.res_disc_params_preposttime omsteltijd
                     FROM res_ruimte rr, res_disc_params dp
                    WHERE     res_ruimte_verwijder IS NULL
                          AND res_discipline_key IN (281, 2268, 784)
                          AND TRUNC (SYSDATE) + res_ruimte_eindtijd / 24 > SYSDATE + 1 / 24
                          AND dp.res_ins_discipline_key = rr.res_discipline_key) ruimte
                  LEFT OUTER JOIN (  SELECT res_ruimte_key, MIN (res_rsv_ruimte_van) van
                                       FROM res_rsv_ruimte rr, res_ruimte_opstelling ro
                                      WHERE     res_rsv_ruimte_verwijder IS NULL
                                            AND rr.res_ruimte_opstel_key IS NOT NULL
                                            AND TRUNC (res_rsv_ruimte_van) = TRUNC (SYSDATE)
                                            AND res_rsv_ruimte_van > SYSDATE
                                            AND ro.res_ruimte_opstel_key = rr.res_ruimte_opstel_key
                                   GROUP BY res_ruimte_key) van
                     ON van.res_ruimte_key = ruimte.res_ruimte_key
                  LEFT OUTER JOIN (  SELECT res_ruimte_key, MAX (res_rsv_ruimte_tot) tot
                                       FROM res_rsv_ruimte rr, res_ruimte_opstelling ro
                                      WHERE     res_rsv_ruimte_verwijder IS NULL
                                            AND rr.res_ruimte_opstel_key IS NOT NULL
                                            AND TRUNC (res_rsv_ruimte_tot) = TRUNC (SYSDATE)
                                            AND SYSDATE BETWEEN res_rsv_ruimte_van
                                                            AND  res_rsv_ruimte_tot
                                            AND ro.res_ruimte_opstel_key = rr.res_ruimte_opstel_key
                                   GROUP BY res_ruimte_key) tot
                     ON tot.res_ruimte_key = ruimte.res_ruimte_key)
    WHERE tot IS NULL OR (SYSDATE BETWEEN tot AND drempel);

-- procedure om ontvangen emails te processen. De klant specifieke eigenschappen, keys e.d. moeten
-- in de aanroep meegegeven worden.
CREATE OR REPLACE PROCEDURE demo_processemail (
   pfrom        IN VARCHAR2,
   pto          IN VARCHAR2,
   psubject     IN VARCHAR2,
   pbody        IN VARCHAR2,
   psessionid   IN VARCHAR2,
   puserkey     IN NUMBER DEFAULT NULL)
AS
   sender_key         prs_perslid.prs_perslid_key%TYPE;
   melder_key         prs_perslid.prs_perslid_key%TYPE;
   kostenplaats_key   prs_afdeling.prs_kostenplaats_key%TYPE;
   mldkey             mld_melding.mld_melding_key%TYPE;
   opdrkey            mld_opdr.mld_opdr_key%TYPE;
   stdmelding         mld_stdmelding.mld_stdmelding_key%TYPE;
   subject_regexp     fac_setting.fac_setting_default%TYPE;
   kkey               mld_kenmerk.mld_kenmerk_key%TYPE;
   errormsg           fac_result.fac_result_waarde%TYPE;
   behandelaar_key    mld_melding.mld_melding_behandelaar_key%TYPE;
   typeopdrkey        mld_typeopdr.mld_typeopdr_key%TYPE;
   mldnum             VARCHAR2 (4000);
   opdrnum            VARCHAR2 (4000);
   opdrvolgnr         NUMBER (10);
   srtdisc            VARCHAR2 (4000);
   cnt                NUMBER (10);
   v_flag_on_fenote   NUMBER (10);
   v_flag_on_bonote   NUMBER (10);
   v_from             VARCHAR2 (4000);
   v_body             VARCHAR2 (4000);
   v_subject          VARCHAR2 (1000);
   v_pos              NUMBER;
   v_factuur_key      fin_factuur.fin_factuur_key%TYPE;
BEGIN
   errormsg := '(0x143)';

   -- de mailberichten worden doorgestuurd vanuit de AAFM exchange omgeving. Hierbij
   -- is het niet mogelijk de afzender te laten staan. Daarom wordt de afzender in het subject
   -- van de mail geplaatst. Scheidingsteken in de ';'.
   v_from := SUBSTR (psubject, 1, INSTR (psubject, ';') - 1);
   v_subject := SUBSTR (psubject, INSTR (psubject, ';') + 1);

   -- Verwijder de Bounce Address Tag Validation
   IF v_from LIKE 'prvs=%'
   THEN
      v_from := SUBSTR (v_from, INSTR (v_from, '=', -1) + 1);
   END IF;


   v_body :=
      v_from || ': ' || CHR (13) || CHR (10)
      || SUBSTR (
            v_subject || CHR (13) || CHR (10)
            || REPLACE (SUBSTR (pbody, 1, 3900 - (LENGTH (v_subject) + 2)),
                        CHR (13) || CHR (10) || CHR (13) || CHR (10),
                        CHR (13) || CHR (10)),
            1,
            3900);                             -- verwijder onnodige witregels

   --   DBMS_OUTPUT.PUT_LINE('v_from: '||v_from);

   -- Valideer de sender in pfrom: kennen we deze?
   SELECT MIN (prs_perslid_key), MIN (d.prs_kostenplaats_key)
     INTO sender_key, kostenplaats_key
     FROM prs_perslid p, prs_afdeling d
    WHERE p.prs_afdeling_key = d.prs_afdeling_key
      AND prs_perslid_verwijder IS NULL
      AND UPPER (prs_perslid_email) = UPPER (v_from);

   IF sender_key IS NULL
   THEN
      sender_key := 11;                -- prs_perslid_key onbekend mail adres.

      SELECT d.prs_kostenplaats_key
        INTO kostenplaats_key
        FROM prs_perslid p, prs_afdeling d
       WHERE p.prs_afdeling_key = d.prs_afdeling_key
         AND prs_perslid_verwijder IS NULL
         AND p.prs_perslid_key = sender_key;
   END IF;

   CASE
      WHEN UPPER (pto) LIKE 'INVOICE@%'
      THEN
         INSERT INTO fin_factuur (fin_factuur_statuses_key,
                                  fin_factuur_datum,
                                  fin_factuur_totaal_btw,
                                  fin_factuur_nr)
             VALUES (3,
                     SYSDATE,
                     0,
                     ' ')
          RETURNING fin_factuur_key
               INTO v_factuur_key;

         -- vul het kenmerk voor de bijlage
         INSERT INTO fac_result (fac_result_sessionid,
                                 fac_result_naam,
                                 fac_result_waarde)
             VALUES (psessionid,
                     'kenmerkpath',
                        'FIN\F'
                     || TO_CHAR (TRUNC (v_factuur_key / 1000), 'FM0000')
                     || '___\F'
                     || v_factuur_key
                     || '\'
                     || 21
                     || '\');
      WHEN UPPER (pto) LIKE 'SERVICEDESK@%'
      THEN
         errormsg := '(0x145)';

         -- append (as a note?) to an existing melding if #key is found in the subject
         -- Alternatief was: scannen van fac_srtnotificatie_oms maar dat voelt ook niet echt lekker
         -- subject_regexp := fac.getsetting ('mld_reply_subject_regexp'); -- [[:alpha:]]*[[:digit:]]{3,}

         -- hebben we een referentie naar een opdracht of naar een melding?
         subject_regexp := '[[:digit:]]{3,}/[[:digit:]]*';
         opdrnum :=
            REGEXP_SUBSTR (v_subject,
                           subject_regexp,
                           1,
                           1,
                           'i');                                    -- MA12345

         DBMS_OUTPUT.put_line ('opdrnum: ' || opdrnum);

         IF opdrnum IS NOT NULL
         THEN
            opdrvolgnr :=
               fac.safe_to_number (
                  SUBSTR (opdrnum, INSTR (opdrnum, '/') + 1));
            DBMS_OUTPUT.put_line ('opdrvolgnr: ' || opdrvolgnr);

            mldkey :=
               fac.safe_to_number (
                  SUBSTR (opdrnum, 1, INSTR (opdrnum, '/') - 1));
            DBMS_OUTPUT.put_line ('mldkey: ' || mldkey);
         ELSE
            subject_regexp := '[[:alpha:]]*[[:digit:]]{3,}';
            mldnum :=
               REGEXP_SUBSTR (v_subject,
                              subject_regexp,
                              1,
                              1,
                              'i');                                 -- MA12345
            srtdisc :=
               REGEXP_SUBSTR (mldnum,
                              '[[:alpha:]]*',
                              1,
                              1,
                              'i');                                      -- MA
            mldkey :=
               fac.safe_to_number (SUBSTR (mldnum, LENGTH (srtdisc) + 1));
         END IF;

         DBMS_OUTPUT.put_line ('mldnum: ' || mldnum);
         DBMS_OUTPUT.put_line ('srtdisc: ' || srtdisc);
         DBMS_OUTPUT.put_line ('mldkey: ' || mldkey);

         -- We eisen
         --   - Goed meldingnummer
         --   - Goede srtdiscipline
         --   - Afzender is degene voor wie de melding was
         -- suggested extensions: ook collega's toestaan?
         SELECT MIN (mm.mld_stdmelding_key), MIN (prs_perslid_key_voor)
           INTO stdmelding, melder_key
           FROM mld_melding mm,
                mld_stdmelding msm,
                ins_tab_discipline insd,
                ins_srtdiscipline isd
          WHERE mm.mld_melding_key = mldkey
            AND mm.mld_stdmelding_key = msm.mld_stdmelding_key
            AND msm.mld_ins_discipline_key = insd.ins_discipline_key
            AND insd.ins_srtdiscipline_key = isd.ins_srtdiscipline_key;

         -- Controle op srtdisc werkt niet goed. Mails worden na binnenkomst namelijk doorgezet
         -- naar de definitieve stdmelding(/discipline/srtdiscpline) en daarmee verandert de
         -- prefix letter
         --AND isd.ins_srtdiscipline_prefix = srtdisc
         --AND mm.prs_perslid_key_voor = sender;  -- Mogen anderen ook reageren?

         DBMS_OUTPUT.put_line (
            'mld_stdmelding_key: ' || TO_CHAR (stdmelding));

         -- kijk of de referentie naar de opdracht wel correct is:
         IF opdrvolgnr IS NOT NULL
         THEN
            BEGIN
               SELECT mld_opdr_key, mld_typeopdr_key
                 INTO opdrkey, typeopdrkey
                 FROM mld_opdr
                WHERE mld_melding_key = mldkey
                  AND mld_opdr_bedrijfopdr_volgnr = opdrvolgnr;
            EXCEPTION
               WHEN OTHERS
               THEN
                  opdrkey := NULL;
            END;
         END IF;

         BEGIN
            IF opdrkey IS NOT NULL
            THEN
               SELECT o.prs_perslid_key
                 INTO behandelaar_key
                 FROM mld_opdr o, prs_perslid p
                WHERE o.mld_opdr_key = opdrkey
                  AND o.prs_perslid_key = p.prs_perslid_key
                  AND p.prs_perslid_email IS NOT NULL
                  AND p.prs_perslid_verwijder IS NULL;
            ELSE
               SELECT mld_melding_behandelaar_key
                 INTO behandelaar_key
                 FROM mld_melding m, prs_perslid p
                WHERE mld_melding_key = mldkey
                  AND mld_melding_behandelaar_key = p.prs_perslid_key
                  AND p.prs_perslid_email IS NOT NULL
                  AND p.prs_perslid_verwijder IS NULL;
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               behandelaar_key := NULL;
         END;

         IF (stdmelding IS NOT NULL)
         THEN                                           -- Bestaande opdracht.
            IF opdrkey IS NOT NULL
            THEN
               INSERT INTO mld_opdr_note (mld_opdr_key,
                                          mld_opdr_note_omschrijving,
                                          prs_perslid_key)
                   VALUES (opdrkey, v_body, sender_key);

               fac.trackaction ('ORDUPD',
                                opdrkey,
                                sender_key,
                                NULL,
                                '#Notitie toegevoegd vanuit e-mail'); -- # voorkomt notificatie
               DBMS_OUTPUT.put_line ('Notitie toegevoegd.');
            ELSE
               INSERT INTO mld_melding_note (mld_melding_key,
                                             mld_melding_note_omschrijving,
                                             prs_perslid_key,
                                             mld_melding_note_flag)
                   VALUES (mldkey,
                           v_body,
                           sender_key,
                           DECODE (sender_key, melder_key, 1, 0)); -- 1 is zichtbaar FE want zelf ingevoerd.

               fac.trackaction ('MLDNOT',
                                mldkey,
                                sender_key,
                                NULL,
                                '#Notitie toegevoegd vanuit e-mail'); -- # voorkomt notificatie
               DBMS_OUTPUT.put_line ('Notitie toegevoegd.');

               INSERT INTO fac_result (fac_result_sessionid,
                                       fac_result_naam,
                                       fac_result_waarde)
                   VALUES (psessionid,
                           'maillog',
                           'Als notitie toegevoegd aan melding ' || mldkey);

               IF behandelaar_key IS NOT NULL
               THEN
                  -- Notificatie naar behandelaar
                  fac.putnotificationsrtprio (
                     NULL,
                     behandelaar_key,
                     'MLDNOB',
                     mldkey,
                     'Melding ' || mldkey || ' is door de klant aangepast.',
                     2,
                     NULL,
                     NULL,
                     NULL,
                     2,
                     NULL);
               END IF;
            END IF;

            -- Vlaggetjes zetten zoals mld_edit_note.asp dat doet
            BEGIN
               IF fac.getdbversion() >= 'DB36' -- DB36 forward compatible
               THEN
                  IF fac.getsetting('mld_melding_actiecode') = 1
                  THEN
                     UPDATE mld_melding
                        SET mld_melding_actiecode = 1+128 -- Backoffice + Attentie
                      WHERE mld_melding_key = mldkey;
                  END IF;
               ELSE
                  v_flag_on_fenote := fac.getsetting ('mld_flag_on_fenote');
                  v_flag_on_bonote := fac.getsetting ('mld_flag_on_bonote');
   
                  IF v_flag_on_fenote <> 0 AND v_flag_on_fenote IS NOT NULL
                  THEN
                     UPDATE mld_melding
                        SET mld_melding_flag =
                               DECODE (opdrkey,
                                       NULL, v_flag_on_fenote,
                                       v_flag_on_bonote)
                      WHERE mld_melding_key = mldkey
                        AND ( (mld_melding_flag = v_flag_on_bonote)
                         OR (mld_melding_flag = 0 OR mld_melding_flag IS NULL));
   
                     DBMS_OUTPUT.put_line ('Flag gezet.');
                  END IF;
               END IF;
            EXCEPTION
               WHEN OTHERS
               THEN
                  DBMS_OUTPUT.put_line(   'Niet gelukt om flag '
                                       || v_flag_on_fenote
                                       || ' te zetten.');
            END;
         ELSE
            -- suggested extensions:
            -- check for MLDUSE-write autorisations
            -- parse the subject to find an appropriate stdmelding, if uniquely possible
            errormsg := '(0x148)';

            BEGIN
               stdmelding :=
                  fac.safe_to_number (fac.getsetting ('defaultstdmelding'));

               INSERT INTO mld_melding (mld_melding_module,
                                        mld_meldbron_key,
                                        mld_melding_datum,
                                        mld_melding_omschrijving,
                                        mld_melding_status,
                                        mld_melding_t_uitvoertijd,
                                        mld_stdmelding_key,
                                        prs_perslid_key,
                                        prs_perslid_key_voor,
                                        prs_kostenplaats_key,
                                        mld_melding_spoed)
                   VALUES ('MLD',
                           4,                                         -- email
                           SYSDATE,
                           v_body,
                           NULL,
                           mld_t_uitvoertijd (2, 'D'),
                           stdmelding,
                           sender_key,
                           sender_key,
                           kostenplaats_key,
                           3)
                RETURNING mld_melding_key
                     INTO mldkey;

               --                DBMS_OUTPUT.PUT_LINE('Melding toegevoegd: ' || mldkey);
               errormsg := '(0x165)';
               mld.setmeldingstatus (mldkey, 2, sender_key);

               INSERT INTO fac_result (fac_result_sessionid,
                                       fac_result_naam,
                                       fac_result_waarde)
                   VALUES (psessionid,
                           'maillog',
                           'Geregistreerd onder melding ' || mldkey);
            END;
         END IF;

         IF opdrkey IS NULL
         THEN
            -- Zoek het laagste bijlagen kenmerk key (AAEN#34590) om de bijlagen onder te stoppen
            errormsg := '(0x151)';

            SELECT MIN (mld_kenmerk_key)
              INTO kkey
              FROM mld_kenmerk k,
                   mld_srtkenmerk sk,
                   mld_stdmelding std,
                   ins_tab_discipline d
             WHERE mld_srtkenmerk_kenmerktype = 'M'
               AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
               AND std.mld_stdmelding_key = stdmelding
               AND std.mld_ins_discipline_key = d.ins_discipline_key
               AND ( (k.mld_stdmelding_key = std.mld_stdmelding_key
                  AND k.mld_kenmerk_niveau = 'S')
                 OR (k.mld_stdmelding_key = d.ins_discipline_key
                 AND k.mld_kenmerk_niveau = 'D')
                 OR (k.mld_stdmelding_key = d.ins_srtdiscipline_key
                 AND k.mld_kenmerk_niveau = 'T'))
               AND k.mld_kenmerk_verwijder IS NULL
               AND NOT EXISTS
                      (SELECT mld_kenmerk_volgnummer
                         FROM mld_kenmerk k1,
                              mld_srtkenmerk sk1,
                              mld_stdmelding std1,
                              ins_tab_discipline d1
                        WHERE sk1.mld_srtkenmerk_kenmerktype = 'M'
                          AND sk1.mld_srtkenmerk_key = k1.mld_srtkenmerk_key
                          AND std1.mld_stdmelding_key = stdmelding
                          AND std1.mld_ins_discipline_key =
                                 d1.ins_discipline_key
                          AND ( (k1.mld_stdmelding_key =
                                    std1.mld_stdmelding_key
                             AND k1.mld_kenmerk_niveau = 'S')
                            OR (k1.mld_stdmelding_key = d1.ins_discipline_key
                            AND k1.mld_kenmerk_niveau = 'D')
                            OR (k1.mld_stdmelding_key =
                                   d1.ins_srtdiscipline_key
                            AND k1.mld_kenmerk_niveau = 'T'))
                          AND k1.mld_kenmerk_verwijder IS NULL
                          AND k1.mld_kenmerk_key < k.mld_kenmerk_key);

            errormsg := '(0x153)';

            IF kkey IS NOT NULL
            THEN
               --               DBMS_OUTPUT.PUT_LINE('Bijlagen kenmerk: ' || kkey);
               errormsg := '(0x157)';

               INSERT INTO fac_result (fac_result_sessionid,
                                       fac_result_naam,
                                       fac_result_waarde)
                   VALUES (psessionid,
                           'kenmerkpath',
                              'MLD\M'
                           || TO_CHAR (TRUNC (mldkey / 1000), 'FM0000')
                           || '___\M'
                           || mldkey
                           || '\'
                           || kkey
                           || '\');
            END IF;
         ELSE
            -- Zoek het laagste bijlagen kenmerk om de bijlagen onder te stoppen
            errormsg := '(0x152)';

            SELECT MIN (mld_kenmerk_key)
              INTO kkey
              FROM mld_kenmerk k, mld_srtkenmerk sk
             WHERE sk.mld_srtkenmerk_kenmerktype = 'M'
               AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
               AND k.mld_typeopdr_key = typeopdrkey
               AND k.mld_kenmerk_niveau = 'O'
               AND k.mld_kenmerk_verwijder IS NULL
               AND NOT EXISTS
                      (SELECT mld_kenmerk_volgnummer
                         FROM mld_kenmerk k1, mld_srtkenmerk sk1
                        WHERE sk1.mld_srtkenmerk_kenmerktype = 'M'
                          AND sk1.mld_srtkenmerk_key = k1.mld_srtkenmerk_key
                          AND k1.mld_typeopdr_key = typeopdrkey
                          AND k1.mld_kenmerk_niveau = 'O'
                          AND k1.mld_kenmerk_verwijder IS NULL
                          AND k1.mld_kenmerk_volgnummer <
                                 k.mld_kenmerk_volgnummer);

            errormsg := '(0x154)';

            IF kkey IS NOT NULL
            THEN
               --               DBMS_OUTPUT.PUT_LINE('Bijlagen kenmerk: ' || kkey);
               errormsg := '(0x157)';

               INSERT INTO fac_result (fac_result_sessionid,
                                       fac_result_naam,
                                       fac_result_waarde)
                   VALUES (psessionid,
                           'kenmerkpath',
                              'MLD\O'
                           || TO_CHAR (TRUNC (opdrkey / 1000), 'FM0000')
                           || '___\O'
                           || opdrkey
                           || '\'
                           || kkey
                           || '\');
            END IF;
         END IF;
      ELSE
         errormsg := '(0x188)';

         INSERT INTO fac_result (fac_result_sessionid,
                                 fac_result_naam,
                                 fac_result_waarde)
             VALUES (psessionid,
                     'errormsg',
                     'Database fout - Neem contact op met uw systeembeheerder '
                     || errormsg);
   END CASE;
EXCEPTION
   WHEN OTHERS
   THEN
      --      DBMS_OUTPUT.PUT_LINE('Mail niet geaccepteerd: ' || 'OTHERS (error ' ||  SQLCODE  || '/' || SUBSTR (SQLERRM, 1, 100) || ')');
      INSERT INTO fac_result (fac_result_sessionid,
                              fac_result_naam,
                              fac_result_waarde)
          VALUES (psessionid,
                  'errormsg',
                  'Database fout - Neem contact op met uw systeembeheerder '
                  || errormsg);

      fac.writelog (
         'PROCESSEMAIL',
         'E',
            'Mail kon niet ingelezen worden afzender:'
         || v_from
         || '['
         || errormsg
         || ']'
         || psubject,
            'OTHERS (error '
         || SQLCODE
         || '/'
         || SUBSTR (SQLERRM, 1, 100)
         || ')');
END;
/

-- Klantoverzicht voor CRM-demo
CREATE OR REPLACE VIEW demo_v_rap_klantoverzicht
AS
     SELECT prs_bedrijf_naam fclt_x_klant,
               '<a class="details" onclick=''FcltMgr.openDetail("'
            || 'appl/prs/prs_bedrijf.asp?bedrijf_key='
            || prs_bedrijf_key
            || '&'
            || 'intern=1'
            || '")''>'
            || HTF.escape_sc (prs_bedrijf_naam)
            || '</a>'
               html_klant,
               '<a class="details" onclick=''FcltMgr.openDetail("'
            || 'appl/prs/prs_perslid_search.asp?dis_key='
            || d.alg_district_key
            || '&'
            || 'autosearch=1'
            || '","Contactpersonen '
            || prs_bedrijf_naam
            || '")''>'
            || 'Contactpersonen'
            || '</a>'
               html_contactpersonen,
               '<a class="details" onclick=''FcltMgr.openDetail("'
            || 'appl/cnt/cnt_search.asp?urole=bo&'
            || 'comp_key='
            || prs_bedrijf_key
            || '&'
            || 'search=1'
            || '","Contracten '
            || prs_bedrijf_naam
            || '")''>'
            || 'Contracten'
            || '</a>'
               html_contracten,
               '<a class="details" onclick=''FcltMgr.openDetail("'
            || 'appl/mld/mld_search.asp?urole=fo&'
            || 'comp_key='
            || prs_bedrijf_key
            || '&'
            || 'autosearch=1'
            || '","Meldingen '
            || prs_bedrijf_naam
            || '")''>'
            || 'Meldingen'
            || '</a>'
               html_meldingen,
               '<a class="details" onclick=''FcltMgr.openDetail("'
            || 'appl/mld/mld_search.asp?urole=bo&'
            || 'districtkey='
            || d.alg_district_key
            || '&'
            || 'srtdisc=481&'
            || 'autosearch=1'
            || '","Taken '
            || prs_bedrijf_naam
            || '")''>'
            || 'Taken'
            || '</a>'
               html_taken,
               '<a class="details" onclick=''FcltMgr.openDetail("'
            || 'appl/mld/mld_melding.asp?urole=fe&'
            || 'loc_key='
            || MIN (l.alg_locatie_key)
            || '&'
            || 'srtdisc=481&'
            || '","Nieuwe taak '
            || prs_bedrijf_naam
            || '")''>'
            || 'Nieuwe taak'
            || '</a>'
               html_nieuwe_taak
       FROM prs_v_aanwezigbedrijf b, alg_district d, alg_locatie l
      WHERE     b.prs_bedrijf_huurder = 1
            AND b.prs_bedrijf_intern = 1
            AND d.alg_district_upper = b.prs_bedrijf_naam_upper
            AND l.alg_district_key = d.alg_district_key
   GROUP BY b.prs_bedrijf_key, b.prs_bedrijf_naam, d.alg_district_key;

/* Origineel - Pre-beurs 2019
CREATE OR REPLACE FORCE VIEW DEMO.DEMO_V_THEMA_DEEL_RES_PVH
(
   INS_DEEL_KEY,
   INS_ALG_RUIMTE_KEY,
   WAARDE
)
AS
     SELECT r.ins_deel_key,
            ins_alg_ruimte_key,
            DECODE (k.ins_kenmerkdeel_waarde,
                    NULL,
                    COALESCE (MIN (TRUNC (tijdvrij * 24 * 60) - 1), 999999),
                    1)
               waarde                               -- MIN want perssimistisch
       FROM    (SELECT res_ins_deel_key ins_deel_key,
                       ins_alg_ruimte_key,
                       res_rsv_deel_van - SYSDATE tijdvrij
                  FROM res_v_aanwezigdeel r,
                       ins_deel d,
                       (SELECT res_deel_key, res_rsv_deel_van, res_rsv_deel_tot
                          FROM res_v_aanwezigrsv_deel rrd
                         WHERE SYSDATE BETWEEN TRUNC (res_rsv_deel_van)
                                           AND  res_rsv_deel_tot) blokkerend -- vandaag en nog niet afgelopen
                 WHERE r.res_deel_key = blokkerend.res_deel_key(+)
                       AND d.ins_deel_key = r.res_ins_deel_key) r
            LEFT OUTER JOIN
               (SELECT ins_deel_key, ins_kenmerkdeel_waarde
                  FROM ins_kenmerkdeel
                 WHERE ins_kenmerk_key = 1141
                       AND ins_kenmerkdeel_verwijder IS NULL) k
            ON k.ins_deel_key = r.ins_deel_key
   GROUP BY r.ins_deel_key, ins_alg_ruimte_key, k.ins_kenmerkdeel_waarde;
*/
CREATE OR REPLACE VIEW DEMO_V_THEMA_DEEL_RES_PVH
(
   INS_DEEL_KEY,
   INS_ALG_RUIMTE_KEY,
   WAARDE
)
AS
     SELECT r.ins_deel_key,
            r.ins_alg_ruimte_key,
            DECODE (r.status,
                    0,
                    COALESCE (MIN (TRUNC (r.tijdvrij * 24 * 60) - 1), 999999),
                    1)
               waarde                                -- MIN want pessimistisch
       FROM    (SELECT r.res_ins_deel_key ins_deel_key,
                       d.ins_alg_ruimte_key,
                       blokkerend.res_rsv_deel_van - SYSDATE tijdvrij,
                       DECODE (INITCAP (d.ins_deel_state),
                               '0', -- Als de sensor uit is kijken we naar de reservering
                               DECODE (blokkerend.res_deel_key,
                                       NULL,
                                       0, -- Als er geen reservering loopt, dan is de status uit
                                       1),                       -- Anders aan
                               1)
                          status
                  FROM res_v_aanwezigdeel r,
                       ins_deel d,
                       (SELECT res_deel_key, res_rsv_deel_van, res_rsv_deel_tot
                          FROM res_v_aanwezigrsv_deel
                         WHERE SYSDATE BETWEEN TRUNC (res_rsv_deel_van)
                                           AND res_rsv_deel_tot) blokkerend -- Vandaag en nog niet afgelopen
                 WHERE r.res_ins_deel_key = d.ins_deel_key
                       AND d.ins_alg_ruimte_type = 'R'
                       AND r.res_deel_key = blokkerend.res_deel_key(+)) r
            LEFT JOIN -- Waarom dit kenmerk en bezetting niet op basis van reservering?
               (SELECT ins_deel_key, ins_kenmerkdeel_waarde
                  FROM ins_v_aanwezigkenmerkdeel
                 WHERE ins_kenmerk_key = 1141) k                 -- Bezet door
            ON r.ins_deel_key = k.ins_deel_key
      WHERE r.ins_deel_key IN (26486, 26506)           -- LeftClick puck+slof!
   GROUP BY r.ins_deel_key, ins_alg_ruimte_key, r.status
   UNION ALL                    -- En dan de reserveerbare delen zonder sensor
     SELECT r.ins_deel_key,
            r.ins_alg_ruimte_key,
            DECODE (k.ins_kenmerkdeel_waarde,
                    NULL,
                    COALESCE (MIN (TRUNC (r.tijdvrij * 24 * 60) - 1), 999999),
                    1)
               waarde                                -- MIN want pessimistisch
       FROM    (SELECT r.res_ins_deel_key ins_deel_key,
                       d.ins_alg_ruimte_key,
                       blokkerend.res_rsv_deel_van - SYSDATE tijdvrij
                  FROM res_v_aanwezigdeel r,
                       ins_deel d,
                       (SELECT res_deel_key, res_rsv_deel_van, res_rsv_deel_tot
                          FROM res_v_aanwezigrsv_deel
                         WHERE SYSDATE BETWEEN TRUNC (res_rsv_deel_van)
                                           AND res_rsv_deel_tot) blokkerend -- Vandaag en nog niet afgelopen
                 WHERE r.res_ins_deel_key = d.ins_deel_key
                       AND d.ins_alg_ruimte_type = 'R'
                       AND r.res_deel_key = blokkerend.res_deel_key(+)) r
            LEFT JOIN -- Waarom dit kenmerk en bezetting niet op basis van reservering?
               (SELECT ins_deel_key, ins_kenmerkdeel_waarde
                  FROM ins_v_aanwezigkenmerkdeel
                 WHERE ins_kenmerk_key = 1141) k                 -- Bezet door
            ON r.ins_deel_key = k.ins_deel_key
      WHERE r.ins_deel_key NOT IN (26486, 26506)       -- LeftClick puck+slof!
   GROUP BY r.ins_deel_key, r.ins_alg_ruimte_key, k.ins_kenmerkdeel_waarde;


------ 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
