#ifdef CAD // 22-05-1998 KTH
/* CAD_VIE.SRC
 * $Revision$
 * $Id$
 */

CREATE_VIEW(cad_v_cad_aanwezigtekening,0) AS
  SELECT * FROM cad_tekening C_T
  WHERE cad_tekening_verwijder IS NULL
    AND (C_T.ins_discipline_key IN (SELECT ins_discipline_key
                                   FROM ins_discipline)
     OR C_T.ins_discipline_key IS NULL);

/* mapping van labels in tekening met ruimtenr in database
 * let op: de applicatie kan van een specifieke variant gebruikmaken
 * deze heet dan XXXX_V_SYNC..
 */
CREATE_VIEW(cad_v_sync_alg_ruimte,0)
  (alg_ruimte_key,
   alg_verdieping_key,
   cadlabel
) AS
 SELECT R.alg_ruimte_key,
        R.alg_verdieping_key,
        R.alg_ruimte_nr
 FROM alg_v_aanwezigruimte R;

CREATE_VIEW(cad_v_sync_alg_terrein,0)
  (alg_terreinsector_key,
   alg_locatie_key,
   cadlabel
) AS
SELECT
   t.alg_terreinsector_key,
   t.alg_locatie_key,
   t.alg_terreinsector_code
  FROM alg_v_aanwezigterreinsector t;

/* Standard thema/label views */
//  Zowel label-views als thema-views hebben de kolommen alg_ruimte_key en waarde
//  Feature: Sommige thema views kunnen updatable zijn!
//  In dat geval moet de kolom waarde_key ook aanwezig zijn, en zal de code met
//  een UPDATE (drop) of een INSERT (shift-drop) opereren. Om die te ondersteunen
//  zal meestal een INSTEAD OF trigger moeten worden gedefinieerd, dat moet
//  dan ook hier gebeuren. Let op de naamgevingsconventies: cad_v_thema_x
//  heeft trigger cad_t_thema_x_i_iu (of _i_i resp _i_u)


-- FSN#14942: afdelingen zijn geen bewoners meer
CREATE_VIEW(cad_v_label_bewoner, 0)
     (alg_ruimte_key, waarde)
AS
    SELECT prs_w.prs_alg_ruimte_key,
              prs_p.prs_perslid_naam_friendly
      FROM prs_werkplek prs_w, prs_perslidwerkplek prs_pw, prs_v_perslid_fullnames prs_p
     WHERE     prs_w.prs_werkplek_key = prs_pw.prs_werkplek_key
           AND prs_pw.prs_perslid_key IS NOT NULL
           AND prs_pw.prs_perslid_key = prs_p.prs_perslid_key
           AND prs_w.prs_werkplek_virtueel = 0
    UNION
    SELECT prs_w.prs_alg_ruimte_key, '['||lcl.l('lcl_free')||']'
      FROM prs_werkplek prs_w, prs_v_werkplek_bezetting prs_wb
     WHERE     prs_w.prs_werkplek_key = prs_wb.prs_werkplek_key
           AND prs_w.prs_werkplek_virtueel = 0
           AND prs_wb.prs_werkplek_bezetting < 100;

-- Toont alle afdelingen die aan een ruimte gekoppeld zijn
CREATE_VIEW(cad_v_label_afdelingen, 0)
     (alg_ruimte_key, waarde)
AS
SELECT alg_ruimte_key, prs_afdeling_naam
  FROM prs_ruimteafdeling ra, prs_v_afdeling d
 WHERE ra.prs_afdeling_key = d.prs_afdeling_key;

-- Toont de afdeling die aan een ruimte gekoppeld is, en Meerdere! indien meerdere.
CREATE_VIEW(cad_v_thema_afdelingen, 0)
   (alg_ruimte_key, waarde, waarde_key)
AS
   SELECT x.alg_ruimte_key,
          DECODE (x.aantal,
             1, SUBSTR (x.sp, 1, 60),
             'Meerdere!'),
          DECODE (x.aantal, 1, x.sp_key, NULL)
   FROM (SELECT ra.alg_ruimte_key,
                MIN (d.prs_afdeling_naam) sp,
                MIN (d.prs_afdeling_key) sp_key,
                COUNT (ra.prs_afdeling_key) aantal
         FROM prs_v_aanwezigruimteafdeling ra, prs_v_aanwezigafdeling d
         WHERE ra.prs_afdeling_key = d.prs_afdeling_key
         GROUP BY ra.alg_ruimte_key) x;

-- Update is: oude situatie weg, nieuwe wordt gedefinieerd.
-- Insert is: toevoegen aan oude situatie
CREATE_TRIGGER(cad_t_thema_afdelingen_i_iu)
   INSTEAD OF INSERT OR UPDATE
   ON cad_v_thema_afdelingen
BEGIN
   IF UPDATING  -- oude weggooien
   THEN
      DELETE FROM   prs_ruimteafdeling
            WHERE   alg_ruimte_key = :new.alg_ruimte_key
                AND prs_afdeling_key <> :new.waarde_key;
   END IF;
   BEGIN
      INSERT INTO prs_ruimteafdeling (alg_ruimte_key, prs_afdeling_key)
        VALUES   (:new.alg_ruimte_key, :new.waarde_key);
   EXCEPTION
      WHEN DUP_VAL_ON_INDEX -- Hij was al aanwezig
      THEN
         NULL;
   END;
END;
/

// De afdelingsbezetting maar dan gebaseerd op de afdelingen
// van de de personen die op de werkplekken zitten
CREATE_VIEW(cad_v_thema_prsafdelingen, 0)
(alg_ruimte_key, waarde)
AS
SELECT wp.prs_alg_ruimte_key, d.prs_afdeling_naam
  FROM prs_werkplek wp, prs_perslidwerkplek pwp, prs_perslid p, prs_afdeling d
 WHERE d.prs_afdeling_key = p.prs_afdeling_key
   AND pwp.prs_perslid_key = p.prs_perslid_key
   AND pwp.prs_werkplek_key = wp.prs_werkplek_key;

CREATE_VIEW(cad_v_label_bewonerwp, 0) (alg_ruimte_key,waarde)
AS
    SELECT DISTINCT prs_alg_ruimte_key, waarde
      FROM (SELECT prs_w.prs_alg_ruimte_key,
                      CHR (1)
                   || prs_w.prs_werkplek_volgnr
                   || ' '
                   || prs_p.prs_perslid_naam_friendly
                   || ' '
                   || TO_CHAR (NVL (prs_pw.prs_perslidwerkplek_bezetting, 0))
                   || '%'
                       waarde
              FROM prs_werkplek prs_w, prs_perslidwerkplek prs_pw, prs_v_perslid_fullnames prs_p
             WHERE     prs_w.prs_werkplek_key = prs_pw.prs_werkplek_key
                   AND prs_pw.prs_perslid_key IS NOT NULL
                   AND prs_pw.prs_perslid_key = prs_p.prs_perslid_key
            UNION
              SELECT prs_w.prs_alg_ruimte_key,
                        CHR (1)
                     || prs_w.prs_werkplek_volgnr
                     || ' '|| initcap(lcl.l('lcl_free'))||' '
                     || TO_CHAR (100 - NVL (SUM (prs_wb.prs_perslidwerkplek_bezetting), 0))
                     || '%'
                FROM prs_werkplek prs_w, prs_perslidwerkplek prs_wb
               WHERE prs_w.prs_werkplek_key = prs_wb.prs_werkplek_key(+)
            GROUP BY prs_w.prs_alg_ruimte_key, prs_w.prs_werkplek_key, prs_w.prs_werkplek_volgnr
              HAVING SUM (NVL (prs_wb.prs_perslidwerkplek_bezetting, 0)) < 100) data;

CREATE_VIEW(CAD_V_THEMA_AANTALWP, 0) (ALG_RUIMTE_KEY, WAARDE)
AS
SELECT   wp.prs_alg_ruimte_key, COUNT (*)
       FROM PRS_WERKPLEK wp
   GROUP BY prs_alg_ruimte_key;
/

CREATE_VIEW(cad_v_label_werkplekken,0)
    (alg_ruimte_key, waarde, highlight)
AS
    SELECT prs_alg_ruimte_key,
              CHR (1)
           || prs_werkplek_volgnr
           || ' ('
           || TO_CHAR (wpopp, 'FM9990.0')
           || ' m2'
           || DECODE (bez, 100, '', ' '||TO_CHAR (bez) || '%')
           || ')'
               waarde,
           DECODE (SIGN (bez - 100), 1, 2, 0) highlight
      FROM (  SELECT prs_w.prs_alg_ruimte_key,
                     prs_w.prs_werkplek_volgnr,
                     SUM (NVL (prs_pw.prs_perslidwerkplek_bezetting, 0)) bez,
                     wpopp
                FROM prs_werkplek prs_w,
                     prs_v_werkplek_oppervlakte pwo,
                     prs_perslidwerkplek prs_pw
               WHERE     prs_w.prs_werkplek_key = prs_pw.prs_werkplek_key(+)
                     AND pwo.prs_werkplek_key(+) = prs_w.prs_werkplek_key
            GROUP BY prs_w.prs_alg_ruimte_key,
                     prs_w.prs_werkplek_volgnr,
                     'prs_werkplek',
                     prs_w.prs_werkplek_key,
                     wpopp);

CREATE_VIEW(CAD_V_THEMA_WPOPP, 0)
(alg_ruimte_key, waarde)
AS
SELECT wp.prs_alg_ruimte_key, r.alg_ruimte_bruto_vloeropp / COUNT (prs_werkplek_key)
     FROM PRS_WERKPLEK wp, ALG_RUIMTE r
    WHERE wp.prs_alg_ruimte_key = r.alg_ruimte_key
 GROUP BY wp.prs_alg_ruimte_key, r.alg_ruimte_bruto_vloeropp
/

CREATE_VIEW(cad_v_thema_bezetmismatch, 0)
(alg_ruimte_key, waarde)
AS
SELECT ra.alg_ruimte_key, 'mismatch'
  FROM prs_ruimteafdeling ra, prs_werkplek wp, prs_perslidwerkplek pwp, prs_perslid p
 WHERE pwp.prs_perslid_key = p.prs_perslid_key
   AND pwp.prs_werkplek_key = wp.prs_werkplek_key
   AND wp.prs_alg_ruimte_key = ra.alg_ruimte_key
   AND ra.prs_afdeling_key <> p.prs_afdeling_key;

CREATE_VIEW(cad_v_label_srtruimteopp,0)
     (alg_ruimte_key, waarde)
AS
    SELECT r.alg_ruimte_key,
              lcl.x ('alg_srtruimte_omschrijving',
                     sr.alg_srtruimte_key,
                     sr.alg_srtruimte_omschrijving)
           || DECODE (r.alg_ruimte_bruto_vloeropp,
                      NULL, '',
                      ' (' || r.alg_ruimte_bruto_vloeropp || ' m2)')
      FROM alg_v_aanwezigruimte r, alg_srtruimte sr
     WHERE r.alg_srtruimte_key = sr.alg_srtruimte_key;

-- Ruimtesoort
CREATE_VIEW(cad_v_thema_srtruimte, 0)
     (alg_ruimte_key, waarde, waarde_key)
AS
  SELECT r.alg_ruimte_key,
        sr.alg_srtruimte_omschrijving,  // deze moet niet vertaald worden, dat regelt de programmatuur
        r.alg_srtruimte_key
  FROM alg_v_aanwezigruimte r, alg_srtruimte sr
 WHERE r.alg_srtruimte_key = sr.alg_srtruimte_key(+);

CREATE_TRIGGER(cad_t_thema_srtruimte_i_iu)
INSTEAD OF INSERT OR UPDATE ON cad_v_thema_srtruimte
FOR EACH ROW
BEGIN
   UPDATE alg_ruimte
   SET alg_srtruimte_key = :new.waarde_key
   WHERE alg_ruimte_key = :new.alg_ruimte_key;
END;
/

-- Bezetting
-- Afdelingen

CREATE_VIEW(cad_v_thema_vloerafwerking, 0)
     (alg_ruimte_key, waarde)
AS
   SELECT r.alg_ruimte_key,
          va.fac_usrdata_omschr
     FROM alg_ruimte r,
          (SELECT rr.alg_ruimte_key, ud.fac_usrdata_omschr
             FROM alg_onrgoedkenmerk ok,
                  fac_usrdata ud,
                  fac_kenmerkdomein rk,
                  alg_kenmerk k,
                  alg_v_aanwezigruimte rr
            WHERE rk.fac_usrtab_key = ud.fac_usrtab_key
              AND k.fac_kenmerkdomein_key = rk.fac_kenmerkdomein_key
              AND TO_CHAR (ud.fac_usrdata_key) = ok.alg_onrgoedkenmerk_waarde
              AND k.alg_kenmerk_key = 2
              AND rr.alg_ruimte_key = ok.alg_onrgoed_key) va
    WHERE va.alg_ruimte_key = r.alg_ruimte_key;

--Meldingen
CREATE_VIEW(cad_v_thema_openmeldingen,0)
     (alg_ruimte_key, waarde)
AS
   SELECT   r.alg_ruimte_key, COUNT (mld_melding_key)
       FROM alg_ruimte r, mld_melding m
      WHERE m.mld_alg_onroerendgoed_keys = r.alg_ruimte_key
            AND m.mld_melding_status IN (2, 3, 4, 7)
   GROUP BY r.alg_ruimte_key;

CREATE_VIEW(cad_v_label_bewoner2,0) (alg_ruimte_key, waarde)
AS
    SELECT alg_ruimte_key,
              pf.prs_perslid_naam_friendly
           || '-'
           || CASE
                  WHEN aantalwp > 1 AND norm_verband IS NOT NULL THEN norm_verband || '/'
                  ELSE ''
              END
           || CASE
                  WHEN p.prs_perslid_dienstverband IS NOT NULL
                  THEN
                      p.prs_perslid_dienstverband || '%'
                  ELSE
                      ''
              END
      FROM prs_v_perslid_fullnames pf, prs_perslid p, prs_v_norm_verband pnv
     WHERE     pf.prs_perslid_key = p.prs_perslid_key
           AND pnv.prs_perslid_key = p.prs_perslid_key
           AND p.prs_perslid_verwijder IS NULL;

CREATE OR REPLACE FORCE VIEW PRJ_V_CAD_LABEL_BEWONERWPE
(
   PRJ_WERKPLEK_KEY,
   WAARDE,
   HIGHLIGHT
)
AS
    SELECT DISTINCT prj_werkplek_key, waarde, DECODE (prj_selectie_key, NULL, 0, 1)
      FROM (SELECT prj_r.prj_scenario_key,
                   prs_w.prj_werkplek_key,
                      prs_p.prs_perslid_naam_friendly
                   || ': '
                   || TO_CHAR (NVL (prs_pw.prj_perslidwerkplek_bezetting, 0))
                   || '%'
                       waarde,
                   'PRJ_WERKPLEK'
                       label_soort,
                   prs_pw.prj_werkplek_key
                       label_key
              FROM prj_ruimte               prj_r,
                   prj_werkplek             prs_w,
                   (SELECT *
                      FROM prj_perslidwerkplek
                     WHERE prj_perslidwerkplek_verwijder IS NULL) prs_pw,
                   prs_v_perslid_fullnames  prs_p
             WHERE     prs_w.prj_werkplek_key = prs_pw.prj_werkplek_key
                   AND prs_pw.prs_perslid_key IS NOT NULL
                   AND prs_pw.prs_perslid_key = prs_p.prs_perslid_key
                   AND prs_w.prj_ruimte_key = prj_r.prj_ruimte_key
            UNION
              SELECT -1,
                     prs_w.prj_werkplek_key,
                        ' Vrij: '
                     || TO_CHAR (100 - NVL (SUM (prs_wb.prj_perslidwerkplek_bezetting), 0))
                     || '%',
                     'PRJ_WERKPLEK',
                     prs_w.prj_werkplek_key
                FROM prj_werkplek prs_w,
                     (SELECT *
                        FROM prj_perslidwerkplek
                       WHERE prj_perslidwerkplek_verwijder IS NULL) prs_wb
               WHERE     prs_w.prj_werkplek_key = prs_wb.prj_werkplek_key(+)
                     AND prj_werkplek_verwijder IS NULL
            GROUP BY prs_w.prj_werkplek_key, prs_w.prj_werkplek_key, prs_w.prj_werkplek_volgnr
              HAVING SUM (NVL (prs_wb.prj_perslidwerkplek_bezetting, 0)) < 100) data,
           prj_selectie  ps
     WHERE     ps.prj_scenario_key(+) = data.prj_scenario_key
           AND ps.prj_selectie_tabelnaam(+) = label_soort
           AND ps.prj_selectie_tabelkey(+) = label_key;

/* Lijstje met (ALGCAD) wijzigingen op een ruimte
   Kolom FAC_TRACKING_DATUM om een klantspecifieke beperking mogelijk te maken
 */
CREATE_VIEW(cad_v_label_track_algcad, 0)
(
   ALG_RUIMTE_KEY,
   WAARDE,
   FAC_TRACKING_DATUM
)
AS
     SELECT fac_tracking_refkey,
               TO_CHAR (fac_tracking_datum, 'YYYY-MM')
            || ' '
            || fac_tracking_oms
            || CHR (10)
            || '[s10][i][cd0d0d0]'
            || TO_CHAR (fac_tracking_datum, 'YYYY-MM-DD HH24:MI:SS')
            || ' '
            || PP.PRS_PERSLID_NAAM_FULL,
            fac_tracking_datum
       FROM fac_srtnotificatie fs,
            fac_tracking fn,
            prs_v_perslid_fullnames_all pp
      WHERE     fac_srtnotificatie_code = 'ALGCAD'
            AND fs.fac_srtnotificatie_key = fn.fac_srtnotificatie_key
            AND fn.prs_perslid_key = pp.prs_perslid_key(+)
   ORDER BY fac_tracking_refkey, fac_tracking_datum DESC;

-- Nog wat basis views voor flexplekthemas
CREATE_VIEW(cad_v_thema_flexplekken_totaal, 0) AS select alg_ruimte_key, vrij+bezet waarde from prs_v_flexplekken;
CREATE_VIEW(cad_v_thema_flexplekken_bezet, 0) AS select alg_ruimte_key, bezet waarde from prs_v_flexplekken;
-- met -1=ruimte zonder wp en -2=ruimte met wp en n=aantal beschikbare flexplekken
CREATE_VIEW(cad_v_thema_flexplekken_vrij, 0)
AS
   SELECT alg_ruimte_key, vrij waarde FROM prs_v_flexplekken
   UNION
   SELECT alg_ruimte_key, -1
     FROM alg_ruimte
    WHERE NOT EXISTS
             (SELECT ''
                FROM prs_werkplek
               WHERE prs_alg_ruimte_key = alg_ruimte_key)
   UNION
   SELECT DISTINCT prs_alg_ruimte_key, -2
     FROM prs_werkplek;

CREATE_VIEW(cad_v_label_flexwerkers, 0)
(
   alg_ruimte_key,
   waarde
)
AS
   SELECT   prs_alg_ruimte_key alg_ruimte_key, prs_perslid_naam_full waarde
     FROM   prs_werkplek wp, prs_perslidwerkplek pwp, prs_v_perslid_fullnames pf
    WHERE       pwp.prs_perslid_key = pf.prs_perslid_key
            AND wp.prs_werkplek_key = pwp.prs_werkplek_key
            AND wp.prs_werkplek_type = 1;

-- Een werkplekkleurenthema, flex/vast/vrij/bezet
CREATE_VIEW(cad_v_thema_flexwp, 0)
(
   prs_werkplek_key,
   waarde
)
AS
     SELECT   wp.prs_werkplek_key prs_werkplek_key,
              MAX (CASE
                      WHEN wp.prs_werkplek_type = 1 AND pwp.prs_perslid_key IS NULL THEN 0
                      WHEN wp.prs_werkplek_type = 1 AND pwp.prs_perslid_key IS NOT NULL THEN 1
                      WHEN wp.prs_werkplek_type = 0 AND pwp.prs_perslid_key IS NOT NULL THEN 2
                      WHEN wp.prs_werkplek_type = 0 AND pwp.prs_perslid_key IS NULL THEN 3
                   END)
                 status
       FROM   prs_werkplek wp, prs_perslidwerkplek pwp
      WHERE       wp.prs_werkplek_virtueel = 0
              AND pwp.prs_werkplek_key(+) = wp.prs_werkplek_key
   GROUP BY   wp.prs_werkplek_key;

-- Werkplekthema met de bezetter(s) ervan
CREATE_VIEW(cad_v_label_wp_bewoner, 0)
(
   prs_werkplek_key,
   waarde
)
AS
    SELECT DISTINCT
           prs_w.prs_werkplek_key,
              prs_p.prs_perslid_naam_friendly
           || CASE
                  WHEN prs_pw.prs_perslidwerkplek_bezetting < 100
                  THEN
                      ' (' || TO_CHAR (NVL (prs_pw.prs_perslidwerkplek_bezetting, 0)) || '%)'
              END
               waarde
      FROM prs_werkplek prs_w, prs_perslidwerkplek prs_pw, prs_v_perslid_fullnames prs_p
     WHERE     prs_w.prs_werkplek_key = prs_pw.prs_werkplek_key
           AND prs_pw.prs_perslid_key IS NOT NULL
           AND prs_pw.prs_perslid_key = prs_p.prs_perslid_key;

-- Reserveerbare ruimtes kleurenthema (waarde = aantal minuten nog vrij)
CREATE_VIEW(cad_v_thema_ruimte_reservering,0)
(ALG_RUIMTE_KEY, WAARDE)
AS
  SELECT alg_ruimte_key alg_ruimte_key,
         COALESCE (MIN (TRUNC ( (tijdvrij) * 24 * 60) - 1), 999999) waarde -- MIN want pessimistisch
    FROM (SELECT rar.alg_ruimte_key, res_rsv_ruimte_van - SYSDATE tijdvrij
            FROM res_ruimte_opstelling rro,
                 res_ruimte rr,
                 res_alg_ruimte rar,
                 res_opstelling ro,
                 (SELECT res_ruimte_opstel_key, res_rsv_ruimte_van
                    FROM res_v_aanwezigrsv_ruimte rrr
                   WHERE SYSDATE BETWEEN TRUNC (res_rsv_ruimte_van)
                                     AND  res_rsv_ruimte_tot) blokkerend -- vandaag en nog niet afgelopen
           WHERE     rro.res_ruimte_key = rr.res_ruimte_key
                 AND rro.res_opstelling_key = ro.res_opstelling_key
                 AND rar.res_alg_ruimte_verwijder IS NULL
                 AND rar.res_ruimte_key = rr.res_ruimte_key
                 AND rro.res_ruimte_opstel_key =
                       blokkerend.res_ruimte_opstel_key(+))
    GROUP BY alg_ruimte_key;

-- Reserveerbare ruimtes label thema, toont de ruimtenaam van
-- ruimtes die reserveerbaar zijn, hetzij door een reservering,
-- hetzij door een sensor
-- DEZE VIEW WORDT STANDAARD GEBRUIKT ALS DEFAULT THEMA VOOR HET INFOBORD
CREATE_VIEW(cad_v_label_bezetbareruimtes, 0)
(
    alg_ruimte_key,
    waarde
)
AS
      SELECT rar.alg_ruimte_key, MIN (COALESCE(res_ruimte_friendlyname, res_ruimte_nr)) waarde
        FROM res_ruimte_opstelling rro, res_ruimte rr, res_alg_ruimte rar
       WHERE     rro.res_ruimte_key = rr.res_ruimte_key
             AND rar.res_ruimte_key = rr.res_ruimte_key
             AND rar.res_alg_ruimte_verwijder IS NULL
    GROUP BY rar.alg_ruimte_key
    UNION
    SELECT alg_ruimte_key, alg_ruimte_nr
      FROM alg_ruimte r, ins_deel d, ins_srtdeel sd
     WHERE     d.ins_alg_ruimte_key = r.alg_ruimte_key
           AND d.ins_alg_ruimte_type = 'R'
           AND d.ins_deel_state IS NOT NULL
           AND d.ins_srtdeel_key = sd.ins_srtdeel_key
           AND sd.ins_srtgroep_key = fac.getSetting('ins_occupationsensors_srtgroep_key')
           AND NOT EXISTS (SELECT ''
                             FROM res_alg_ruimte
                            WHERE alg_ruimte_key = r.alg_ruimte_key);

-- Reserveerbare ruimtes label thema
-- Let op: Toont *eerstvolgende* reservering als die binnen een uur begint
CREATE_VIEW(cad_v_label_ruimte_reservering,0)
(ALG_RUIMTE_KEY, WAARDE)
AS
     SELECT rar.alg_ruimte_key, MAX (COALESCE(res_ruimte_friendlyname, res_ruimte_nr) || res_info.tekst) waarde
       FROM res_ruimte_opstelling rro,
            res_ruimte rr,
            res_alg_ruimte rar,
            res_opstelling ro,
            (  SELECT res_ruimte_opstel_key,
                      MAX(   '[br]'
                          || TO_CHAR (res_rsv_ruimte_van, 'HH24:MI')
                          || '-'
                          || TO_CHAR (res_rsv_ruimte_tot, 'HH24:MI')
                          || '[br][s50]'
                          || prs_perslid_naam_full
                          || '[br][s80][b]'
                          || res_rsv_ruimte_omschrijving)
                         tekst
                 FROM res_v_aanwezigrsv_ruimte rrr, prs_v_perslid_fullnames pp
                WHERE pp.prs_perslid_key = res_rsv_ruimte_host_key
                      AND SYSDATE BETWEEN res_rsv_ruimte_van - (1 / 24)
                                      AND  res_rsv_ruimte_tot
             GROUP BY res_ruimte_opstel_key) res_info
      WHERE     res_info.res_ruimte_opstel_key(+) = rro.res_ruimte_opstel_key
            AND rro.res_ruimte_key = rr.res_ruimte_key
            AND rro.res_opstelling_key = ro.res_opstelling_key
            AND rar.res_ruimte_key = rr.res_ruimte_key
            AND rar.res_alg_ruimte_verwijder IS NULL
   GROUP BY rar.alg_ruimte_key;

-- Reserveerbare delen kleurenthema (waarde = aantal minuten nog vrij)
CREATE_VIEW(cad_v_thema_deel_reservering,0)
(
   INS_DEEL_KEY,
   WAARDE
)
AS
     SELECT ins_deel_key,
            COALESCE (MIN (TRUNC (tijdvrij * 24 * 60)-1), 999999) waarde -- MIN want perssimistisch
       FROM (SELECT res_ins_deel_key ins_deel_key,
                    res_rsv_deel_van - SYSDATE tijdvrij
               FROM res_v_aanwezigdeel r,
                    (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(+))
   GROUP BY ins_deel_key;

-- Reserveerbare delen label thema
CREATE_VIEW(cad_v_label_deel_reservering,0)
(
   INS_DEEL_KEY,
   WAARDE
)
AS
   SELECT ins_deel_key, prs_perslid_naam_full
     FROM ins_v_aanwezigdeel isd,
          (SELECT res_ins_deel_key, prs_perslid_naam_full
             FROM res_v_aanwezigdeel r,
                  res_v_aanwezigrsv_deel rrd,
                  res_rsv_ruimte rrr,
                  prs_v_perslid_fullnames p
            WHERE     r.res_deel_key = rrd.res_deel_key
                  AND rrd.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
                  AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
                  AND SYSDATE BETWEEN res_rsv_deel_van - 1 / 24 / 60
                                  AND  res_rsv_deel_tot - 1 / 24 / 60) res -- NU bezig
    WHERE isd.ins_deel_key = res.res_ins_deel_key(+);

-- Deze core-view wordt direct als label-thema (13) gebruikt, maar kan ook als basis voor een alternatief via
-- create view myview (fclt_f_datum, ins_deel_key, waarde) as select fclt_f_datum, ins_deel_key, waarde3 from cad_v_label_deel_res_datum.
-- Kijkt nu hard maximaal 42 dagen tov van nu vooruit, wat hopelijk even genoeg is voor alle situaties
-- De verschillende waardevarianten zijn presentatie alternatieven, evt meerdere regels onder elkaar
-- Merk op dat waarde_html ook een class meeneemt, waarmee in CSS gestyld kan worden
-- Voor 2d
-- waarde1: Naam (van-tot)
-- waarde: van Naam [default]
-- waarde3: Naam
-- Voor 3d
-- waarde_html: van Naam [default]
-- waarde_html2: Naam

CREATE_VIEW(cad_v_label_deel_res_datum, 0)
(
    fclt_f_datum,
    ins_deel_key,
    res_deel_omschrijving,
    waarde1,
    waarde,
    waarde3,
    waarde_html,
    waarde_html2
)
AS
    WITH
        datums
        AS
            (    SELECT TRUNC (SYSDATE) + LEVEL - 1 datum
                   FROM DUAL
             CONNECT BY LEVEL <= 42)
      SELECT datums.datum
                 fclt_f_datum,
             isd.res_ins_deel_key
                 ins_deel_key,
             res_deel_omschrijving,
                CHR (10)
             || LISTAGG (
                    DECODE (
                        naam,
                        NULL, '',
                           '[s40]'
                        || naam
                        || ' ('
                        || TO_CHAR (res_rsv_deel_van, 'HH24:MI')
                        || '-'
                        || DECODE (TRUNC (res_rsv_deel_tot),
                                   TRUNC (res_rsv_deel_van), TO_CHAR (res_rsv_deel_tot, 'HH24:MI'),
                                   TO_CHAR (res_rsv_deel_tot, 'DD-MM-YYYY HH24:MI'))
                        || ')'),
                    CHR (10))
                    WITHIN GROUP (ORDER BY res_rsv_deel_van)
                 waarde1,
                CHR (10)
             || LISTAGG (
                    DECODE (naam,
                            NULL, '',
                            '[s40]' || TO_CHAR (res_rsv_deel_van, 'HH24:MI') || ' ' || naam),
                    CHR (10))
                    WITHIN GROUP (ORDER BY res_rsv_deel_van)
                 waarde2,
                CHR (10)
             || LISTAGG (DECODE (naam, NULL, '', '[s40]' || naam), CHR (10))
                    WITHIN GROUP (ORDER BY res_rsv_deel_van)
                 waarde3,
             LISTAGG (
                 DECODE (
                     naam,
                     NULL, '',
                        '<span class="body">'
                     || TO_CHAR (res_rsv_deel_van, 'HH24:MI')
                     || ' '
                     || naam
                     || '</span>'),
                 '<br>')
                 WITHIN GROUP (ORDER BY res_rsv_deel_van)
                 waarde_html,
             LISTAGG (DECODE (naam, NULL, '', '<span class="body">' || naam || '</span>'), '<br>')
                 WITHIN GROUP (ORDER BY res_rsv_deel_van)
                 waarde_html2
        FROM res_v_aanwezigdeel isd,
             datums,
             (SELECT datum,
                     res_ins_deel_key,
                     DECODE (p.prs_perslid_visibility,
                             1, pf.prs_perslid_naam_friendly,
                             a.prs_afdeling_omschrijving)
                         naam,
                     res_rsv_deel_van,
                     res_rsv_deel_tot
                FROM res_v_aanwezigdeel     r,
                     res_v_aanwezigrsv_deel rrd,
                     res_rsv_ruimte         rrr,
                     prs_v_perslid_fullnames pf,
                     prs_perslid            p,
                     prs_afdeling           a,
                     datums
               WHERE     r.res_deel_key = rrd.res_deel_key
                     AND rrd.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
                     AND rrr.res_rsv_ruimte_host_key = pf.prs_perslid_key
                     AND pf.prs_perslid_key = p.prs_perslid_key
                     AND p.prs_afdeling_key = a.prs_afdeling_key
                     AND datum + 1 >= res_rsv_deel_van
                     AND datum < res_rsv_deel_tot ) res                          -- Bezet
       WHERE isd.res_ins_deel_key = res.res_ins_deel_key(+) AND datums.datum = res.datum(+)
    GROUP BY datums.datum, isd.res_ins_deel_key, res_deel_omschrijving;


--
-- Thema's gebaseerd op objectstatus van objecten binnen ruimte/werkplek (typisch sensoren)
--
CREATE_VIEW(cad_v_thema_ruimtesensor,0)
(
    alg_ruimte_key,
    waarde
)
AS
    SELECT r.alg_ruimte_key alg_ruimte_key, initcap(d.ins_deel_state) status
      FROM alg_ruimte r, ins_deel d, ins_srtdeel sd
     WHERE     r.alg_ruimte_verwijder IS NULL
           AND d.ins_deel_verwijder IS NULL
           AND d.ins_alg_ruimte_type = 'R'
           AND d.ins_alg_ruimte_key = r.alg_ruimte_key
           AND d.ins_srtdeel_key = sd.ins_srtdeel_key
           AND sd.ins_srtgroep_key = fac.getSetting('ins_occupationsensors_srtgroep_key')
           AND d.ins_deel_state IS NOT NULL;

-- Kleurenthema dat reserveringen en actuele bezetting weergeeft
-- Geeft van de overige ruimte de ruimtesoort terug
-- DEZE VIEW WORDT STANDAARD GEBRUIKT ALS DEFAULT THEMA VOOR HET INFOBORD
CREATE_VIEW(cad_v_thema_srtruimtesensor, 0)
(
   alg_ruimte_key,
   waarde
)
AS
   -- zalen met een sensor
   SELECT alg_ruimte_key, DECODE (MAX (status), 0, 'Uit', 2, 'Aan', 'NoShow')
     FROM ( SELECT r.alg_ruimte_key,
                   DECODE (
                      INITCAP (d.ins_deel_state),
                      '0',                      -- als de sensor uit is kijken we naar de reservering
                      DECODE (r2a.res_reservering_key,
                              NULL, 0,        -- als er geen reservering gescheduled staat is de status uit
                              DECODE (eerste10min, 1, 2, 1)),  --  in de eerste 10 minuten v/d reservering melden we nog geen noshow(1) aan(2)
                      2)
                      status
              FROM alg_ruimte r,
                   ins_deel d,
                   ins_srtdeel sd,
                   (SELECT rr2a.res_reservering_key,
                           rr2a.alg_ruimte_key,
                           CASE WHEN (SYSDATE - res_rsv_ruimte_van > 10 / 1440)
                                THEN 0
                                ELSE 1
                           END eerste10min
                      FROM res_v_rsv_ruimte_2_alg_ruimte rr2a
                     WHERE res_rsv_ruimte_dirtlevel = 0
                       AND rr2a.res_alg_ruimte_verwijder IS NULL
                       AND rr2a.res_rsv_ruimte_van BETWEEN TRUNC(SYSDATE) AND SYSDATE -- Voorkennis: geen meerdaagse ruimtereserveringen
                       AND rr2a.res_rsv_ruimte_tot BETWEEN SYSDATE AND TRUNC(SYSDATE + 1)) r2a
             WHERE r.alg_ruimte_verwijder IS NULL
               AND d.ins_deel_verwijder IS NULL
               AND d.ins_alg_ruimte_type = 'R'
               AND d.ins_alg_ruimte_key = r.alg_ruimte_key
               AND d.ins_srtdeel_key = sd.ins_srtdeel_key
               AND sd.ins_srtgroep_key = fac.getSetting('ins_occupationsensors_srtgroep_key')
               AND d.ins_deel_state IS NOT NULL
               AND r.alg_ruimte_key = r2a.alg_ruimte_key(+))
    GROUP BY alg_ruimte_key
   UNION ALL               -- en dan de ruimten zonder sensor
   SELECT r.alg_ruimte_key,
          DECODE (rr.res_ruimte_key,  -- is dit een vergaderruimte?
                  NULL, '*' || sr.alg_srtruimte_omschrijving,
                  DECODE (r2a.res_reservering_key, NULL, 'Uit', 'Aan'))        -- 0 uit / 1 noshow / 2 aan
     FROM alg_v_aanwezigruimte r,
          alg_srtruimte sr,
          (SELECT rr2a.res_reservering_key, rr2a.alg_ruimte_key
             FROM res_v_rsv_ruimte_2_alg_ruimte rr2a
            WHERE res_rsv_ruimte_dirtlevel = 0
              AND rr2a.res_alg_ruimte_verwijder IS NULL
              AND rr2a.res_rsv_ruimte_van BETWEEN TRUNC(SYSDATE) AND SYSDATE
              AND rr2a.res_rsv_ruimte_tot BETWEEN SYSDATE AND TRUNC(SYSDATE + 1)) r2a,
          (  SELECT alg_ruimte_key, MAX (res_ruimte_key) res_ruimte_key
               FROM res_alg_ruimte
              WHERE res_alg_ruimte_verwijder IS NULL
           GROUP BY alg_ruimte_key) rr
    WHERE r.alg_srtruimte_key = sr.alg_srtruimte_key(+)
      AND r.alg_ruimte_key = r2a.alg_ruimte_key(+)
      AND r.alg_ruimte_key = rr.alg_ruimte_key(+)
      AND NOT EXISTS
             (SELECT r.alg_ruimte_key
                FROM ins_deel d, ins_srtdeel sd
               WHERE d.ins_deel_verwijder IS NULL
                 AND d.ins_alg_ruimte_type = 'R'
                 AND d.ins_alg_ruimte_key = r.alg_ruimte_key
                 AND d.ins_srtdeel_key = sd.ins_srtdeel_key
                 AND sd.ins_srtgroep_key = fac.getSetting('ins_occupationsensors_srtgroep_key')
                 AND d.ins_deel_state IS NOT NULL);

CREATE_VIEW(cad_v_thema_wpsensor,0)
(
    prs_werkplek_key,
    waarde
)
AS
    SELECT wp.prs_werkplek_key prs_werkplek_key, initcap(d.ins_deel_state) status
      FROM prs_werkplek wp, ins_deel d, ins_srtdeel sd
     WHERE     d.ins_deel_verwijder IS NULL
           AND wp.prs_werkplek_virtueel = 0
           AND d.ins_alg_ruimte_type = 'W'
           AND d.ins_alg_ruimte_key = wp.prs_werkplek_key
           AND d.ins_srtdeel_key = sd.ins_srtdeel_key
           AND sd.ins_srtgroep_key = fac.getSetting('ins_occupationsensors_srtgroep_key')
           AND d.ins_deel_state IS NOT NULL;

-- View voor reserveerbare (werkplek)OBJECTEN, het default thema met key 13
-- Deze core-view wordt direct als kleur-objecten-thema gebruikt, maar kan ook als basis voor een alternatief via worden gebruikt
-- Kijkt nu hard maximaal 42 dagen tov van nu vooruit, wat hopelijk even genoeg is voor alle situaties
-- De verschillende waardevarianten zijn presentatie alternatieven, evt meerdere regels onder elkaar
-- waarde1: Voor hele dagen: Vrij(0) of Bezet (3)
-- waarde: Voor halve dagen: Vrij(0), Ochtendbezet(1), MiddagBezet(2), Helemaalbezet(3)
-- waarde3: Voor tellen: Het aantal reservering op de dag, met 0 is dus Vrij

CREATE_VIEW(cad_v_thema_deel_res_datum,0)
(
    fclt_f_datum,
    ins_deel_key,
    min_van,
    max_tot,
    waarde1,
    waarde,
    waarde3
)
AS
    WITH
        datums
        AS
            (    SELECT TRUNC (SYSDATE) + LEVEL - 1 datum
                   FROM DUAL
             CONNECT BY LEVEL <= 42)
      SELECT datum
                 fclt_f_datum,
             ins_deel_key,
             MIN (res_rsv_deel_van)
                 min_van,
             MAX (res_rsv_deel_tot)
                 max_tot,
             CASE WHEN MAX (res_rsv_deel_tot) IS NULL THEN 0 ELSE 3                      -- hele dag
                                                                    END
                 waarde1,
             CASE
                 WHEN MAX (res_rsv_deel_tot) IS NULL THEN 0
                 WHEN TO_CHAR (MAX (res_rsv_deel_tot), 'HH24') <= 13 THEN 1               -- ochtend
                 WHEN TO_CHAR (MIN (res_rsv_deel_van), 'HH24') >= 12 THEN 2                -- middag
                 ELSE 3                                                                  -- hele dag
             END
                 waarde,
             COUNT (res_rsv_deel_tot)                                 -- aantal reservering deze dag
                 waarde3
        FROM (SELECT datums.datum,
                     res_ins_deel_key ins_deel_key,
                     res_rsv_deel_van,
                     res_rsv_deel_tot
                FROM res_v_aanwezigdeel r,
                     ins_deel          d,
                     datums,
                     (SELECT datum,
                             res_deel_key,
                             res_rsv_deel_van,
                             res_rsv_deel_tot
                        FROM datums, res_v_aanwezigrsv_deel rrd
                       WHERE     res_rsv_deel_van > TRUNC(SYSDATE) - 1        -- negeer alle irrelevante historie sowieso
                             AND datum + 1 >= res_rsv_deel_van
                             AND datum < res_rsv_deel_tot) blokkerend -- vandaag en nog niet afgelopen
               WHERE     r.res_deel_key = blokkerend.res_deel_key(+)
                     AND datums.datum = blokkerend.datum(+)
                     AND (r.res_deel_vervaldatum IS NULL or r.res_deel_vervaldatum > datums.datum)
                     AND d.ins_deel_key = r.res_ins_deel_key)
    GROUP BY datum, ins_deel_key
    ORDER BY datum, ins_deel_key;


-- Paar views om de populariteit van reserveerbare objecten te kunnen illustreren
-- Basisview, met aantal per datum
CREATE_VIEW(cad_v_thema_deel_gereserveerd,0)
AS
      SELECT TRUNC (rrd.res_rsv_deel_van) datum,
             rd.res_ins_deel_key        ins_deel_key,
             rd.res_deel_omschrijving,
             COUNT (*)                  aantal
        FROM res_rsv_deel rrd, res_deel rd
       WHERE rrd.res_deel_key = rd.res_deel_key
    GROUP BY TRUNC (rrd.res_rsv_deel_van), rd.res_ins_deel_key, rd.res_deel_omschrijving;
    
-- Totaal gereserveerde dagen of delen daarvan in de afgelopen 1, 4 resp 8 wkn
CREATE_VIEW(cad_v_thema_deel_populair_1wkn,0)
AS
      SELECT ins_deel_key, res_deel_omschrijving, COUNT (*) waarde
        FROM cad_v_thema_deel_gereserveerd
       WHERE datum BETWEEN SYSDATE - 8 AND SYSDATE
    GROUP BY ins_deel_key, res_deel_omschrijving;

CREATE_VIEW(cad_v_thema_deel_populair_4wkn,0)
AS
      SELECT ins_deel_key, res_deel_omschrijving, COUNT (*) waarde
        FROM cad_v_thema_deel_gereserveerd
       WHERE datum BETWEEN SYSDATE - 29 AND SYSDATE
    GROUP BY ins_deel_key, res_deel_omschrijving;

CREATE_VIEW(cad_v_thema_deel_populair_8wkn,0)
AS
      SELECT ins_deel_key, res_deel_omschrijving, COUNT (*) waarde
        FROM cad_v_thema_deel_gereserveerd
       WHERE datum BETWEEN SYSDATE - 57 AND SYSDATE
    GROUP BY ins_deel_key, res_deel_omschrijving;

-- Toekomstig populair
CREATE_VIEW(cad_v_thema_deel_populair_futu,0)
AS
      SELECT ins_deel_key, res_deel_omschrijving, COUNT (*) waarde
        FROM cad_v_thema_deel_gereserveerd
       WHERE datum > SYSDATE
    GROUP BY ins_deel_key, res_deel_omschrijving;


REGISTERRUN('$Id$')

#endif // CAD
