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

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 PACKAGE KFSG
AS
    PROCEDURE set_werkplek;

    FUNCTION get_kenmerk (p_module        IN VARCHAR2,
                          p_kenmerk_key   IN NUMBER,
                          p_link_key      IN NUMBER)
        RETURN VARCHAR2;

    FUNCTION get_kenmerkwaarde (p_kenmerk_type         VARCHAR2,
                                p_kenmerkdomein_key    NUMBER,
                                p_kenmerk_waarde       VARCHAR2)
        RETURN VARCHAR2;
END;
/

CREATE OR REPLACE PACKAGE BODY KFSG
AS
    -- Geef alle mensen een werkplek in het Schiphol gebouw (key
    PROCEDURE set_werkplek
    AS
        CURSOR c
        IS
            SELECT *
              FROM prs_perslid p
             WHERE     NOT EXISTS
                           (SELECT prs_perslidwerkplek_key
                              FROM prs_perslidwerkplek pwp
                             WHERE pwp.prs_perslid_key = p.prs_perslid_key)
                   AND SUBSTR (prs_perslid_oslogin, 1, 1) <> '_';
    BEGIN
        FOR rec IN c
        LOOP
            PRS.movetoruimte (rec.prs_perslid_key,
                              4963,
                              'R',
                              0);
        END LOOP;

        COMMIT;
    END;

    FUNCTION get_kenmerk (p_module        IN VARCHAR2,
                          p_kenmerk_key   IN NUMBER,
                          p_link_key      IN NUMBER)
        RETURN VARCHAR2
    AS
        v_kenmerk_type        mld_srtkenmerk.mld_srtkenmerk_kenmerktype%TYPE;
        v_kenmerk_waarde      mld_kenmerkmelding.mld_kenmerkmelding_waarde%TYPE;
        v_kenmerkdomein_key   fac_kenmerkdomein.fac_kenmerkdomein_key%TYPE;
        v_kenmerk_niveau      ins_kenmerk.ins_kenmerk_niveau%TYPE;
    BEGIN
        CASE p_module
            WHEN 'MLD'
            THEN
                SELECT mld_srtkenmerk_kenmerktype,
                       sk.fac_kenmerkdomein_key,
                       km.mld_kenmerkmelding_waarde
                  INTO v_kenmerk_type, v_kenmerkdomein_key, v_kenmerk_waarde
                  FROM mld_v_aanwezigkenmerkmelding  km,
                       mld_kenmerk                   k,
                       mld_srtkenmerk                sk
                 WHERE     km.mld_melding_key = p_link_key
                       AND km.mld_kenmerk_key = p_kenmerk_key
                       AND km.mld_kenmerk_key = k.mld_kenmerk_key
                       AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key;
            WHEN 'CNT'
            THEN
                SELECT cnt_srtkenmerk_kenmerktype,
                       sk.fac_kenmerkdomein_key,
                       kc.cnt_kenmerkcontract_waarde
                  INTO v_kenmerk_type, v_kenmerkdomein_key, v_kenmerk_waarde
                  FROM cnt_kenmerkcontract  kc,
                       cnt_kenmerk          k,
                       cnt_srtkenmerk       sk
                 WHERE     kc.cnt_contract_key = p_link_key
                       AND kc.cnt_kenmerk_key = p_kenmerk_key
                       AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                       AND k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key;
            WHEN 'ALG'
            THEN
                SELECT alg_kenmerk_kenmerktype,
                       k.fac_kenmerkdomein_key,
                       aogk.alg_onrgoedkenmerk_waarde
                  INTO v_kenmerk_type, v_kenmerkdomein_key, v_kenmerk_waarde
                  FROM alg_onrgoedkenmerk aogk, alg_kenmerk k
                 WHERE     aogk.alg_onrgoed_key = p_link_key
                       AND aogk.alg_kenmerk_key = p_kenmerk_key
                       AND aogk.alg_kenmerk_key = k.alg_kenmerk_key;
            WHEN 'INS'
            THEN
                SELECT k.ins_kenmerk_niveau
                  INTO v_kenmerk_niveau
                  FROM ins_kenmerk k
                 WHERE ins_kenmerk_key = p_kenmerk_key;

                IF v_kenmerk_niveau = 'C'
                THEN
                    SELECT sk.ins_srtkenmerk_kenmerktype,
                           sk.fac_kenmerkdomein_key,
                           ikds.ins_kmdeelsrtcontr_waarde
                      INTO v_kenmerk_type,
                           v_kenmerkdomein_key,
                           v_kenmerk_waarde
                      FROM ins_kmdeelsrtcontr  ikds,
                           ins_kenmerk         k,
                           ins_srtkenmerk      sk
                     WHERE     ikds.ins_kmdeelsrtcontr_key = p_link_key
                           AND ikds.ins_kmdeelsrtcontr_verwijder IS NULL
                           AND ikds.ins_kenmerk_key = p_kenmerk_key
                           AND ikds.ins_kenmerk_key = k.ins_kenmerk_key
                           AND k.ins_srtkenmerk_key = sk.ins_srtkenmerk_key;
                ELSE
                    SELECT sk.ins_srtkenmerk_kenmerktype,
                           sk.fac_kenmerkdomein_key,
                           ikd.ins_kenmerkdeel_waarde
                      INTO v_kenmerk_type,
                           v_kenmerkdomein_key,
                           v_kenmerk_waarde
                      FROM ins_kenmerkdeel  ikd,
                           ins_kenmerk      k,
                           ins_srtkenmerk   sk
                     WHERE     ikd.ins_deel_key = p_link_key
                           AND ikd.ins_kenmerkdeel_verwijder IS NULL
                           AND ikd.ins_kenmerk_key = p_kenmerk_key
                           AND ikd.ins_kenmerk_key = k.ins_kenmerk_key
                           AND k.ins_srtkenmerk_key = sk.ins_srtkenmerk_key;
                END IF;
        END CASE;

        RETURN kfsg.get_kenmerkwaarde (v_kenmerk_type,
                                       v_kenmerkdomein_key,
                                       v_kenmerk_waarde);
    END;



    FUNCTION get_kenmerkwaarde (p_kenmerk_type         VARCHAR2,
                                p_kenmerkdomein_key    NUMBER,
                                p_kenmerk_waarde       VARCHAR2)
        RETURN VARCHAR2
    AS
        v_result   VARCHAR2 (4000);
    BEGIN
        IF p_kenmerk_type = 'R' OR p_kenmerk_type = 'S'
        THEN
            v_result :=
                fac.getdomeinwaarde (p_kenmerkdomein_key, p_kenmerk_waarde);
        ELSIF p_kenmerk_type = 'D'
        THEN
            v_result :=
                TO_CHAR (fac.safe_to_date (p_kenmerk_waarde, 'dd-mm-yyyy'),
                         'yyyy-mm-dd');
        ELSE
            v_result := p_kenmerk_waarde;
        END IF;

        RETURN v_result;
    END;
END;
/

CREATE OR REPLACE PROCEDURE kfsg_export_daily_task (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2)
AS
BEGIN
   KFSG.set_werkplek();
END;
/

-- Notificatie om catering wijzigingen te notificeren.
CREATE OR REPLACE VIEW KFSG_V_NOTI_CATERING
(
   sender,
   receiver,
   text,
   code,
   fac_srtnotificatie_key,
   key,
   xkey,
   xemail,
   xmobile
)
AS
  SELECT NULL sender,
         NULL receiver,                                 --Catering1@schiphol.nl
            'Catering bij reservering '
         || rrr.res_reservering_key
         || '/'
         || rrr.res_rsv_ruimte_volgnr
         || ' is aangemaakt/gewijzigd '
             text,
         'RESINF' code,
         NULL fac_srtnotificatie_key,
         rrr.res_reservering_key key,
         rrr.res_rsv_ruimte_key xkey,
         'Catering1@schiphol.nl' xemail,
         NULL xmobile
    FROM res_rsv_artikel rra, res_rsv_ruimte rrr, res_artikel ra
   WHERE     rra.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
         AND rra.res_artikel_key = ra.res_artikel_key
         --AND ra.res_discipline_key IN (165, 162, 167)
         AND ra.res_discipline_key IN (821, 822, 823, 862, 1242) -- KFSG#56898
         AND rra.res_rsv_artikel_levering > SYSDATE
         AND GREATEST (COALESCE (res_rsv_artikel_mutatie, SYSDATE - 100),
                       COALESCE (res_rsv_artikel_verwijder, SYSDATE - 100),
                       COALESCE (res_rsv_artikel_aanmaak, SYSDATE - 100)) >
             (SELECT   fac_notificatie_job_nextrun
                     - fac_notificatie_job_interval / 24
                FROM fac_notificatie_job
               WHERE fac_notificatie_job_view = 'KFSG_V_NOTI_CATERING')
         AND GREATEST (COALESCE (res_rsv_artikel_mutatie, SYSDATE - 100),
                       COALESCE (res_rsv_artikel_verwijder, SYSDATE - 100),
                       COALESCE (res_rsv_artikel_aanmaak, SYSDATE - 100)) <
             (SELECT fac_notificatie_job_nextrun
                FROM fac_notificatie_job
               WHERE fac_notificatie_job_view = 'KFSG_V_NOTI_CATERING')
GROUP BY rrr.res_rsv_ruimte_key,
         rrr.res_reservering_key,
         rrr.res_rsv_ruimte_volgnr
   UNION ALL
  SELECT NULL sender,
         NULL receiver,                                 --Catering1@schiphol.nl
            'Reservering '
         || rrr.res_reservering_key
         || '/'
         || rrr.res_rsv_ruimte_volgnr
         || ' is aangemaakt/gewijzigd '
             text,
         'RESINF' code,
         NULL fac_srtnotificatie_key,
         rrr.res_reservering_key key,
         rrr.res_rsv_ruimte_key xkey,
         'Catering1@schiphol.nl' xemail,
         NULL xmobile
    FROM fac_tracking           t,
         res_rsv_ruimte         rrr,
         res_ruimte_opstelling  ro,
         res_ruimte             rr
   WHERE     fac_srtnotificatie_key IN (88, 89)                -- resnew, resupd
         AND t.fac_tracking_refkey = rrr.res_rsv_ruimte_key
         AND rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
         AND ro.res_ruimte_key = rr.res_ruimte_key
         AND rr.res_discipline_key = 142                                  -- FSP
         AND t.fac_tracking_datum >
             (SELECT   fac_notificatie_job_nextrun
                     - fac_notificatie_job_interval / 24
                FROM fac_notificatie_job
               WHERE fac_notificatie_job_view = 'KFSG_V_NOTI_CATERING')
         AND t.fac_tracking_datum <
             (SELECT fac_notificatie_job_nextrun
                FROM fac_notificatie_job
               WHERE fac_notificatie_job_view = 'KFSG_V_NOTI_CATERING')
GROUP BY rrr.res_rsv_ruimte_key,
         rrr.res_reservering_key,
         rrr.res_rsv_ruimte_volgnr;

-- rapport met mensen die via de interface inactief gemaakt zijn en nog lopende verplichtingen hebben te tonen.
CREATE OR REPLACE VIEW kfsg_v_rap_prs_inactief
AS
      SELECT prs_perslid_inactief - SYSDATE hide_f_volgorde,
             pf.prs_perslid_naam_full,
             p.prs_perslid_key,
             COUNT (item)                 aantal,
             prs_perslid_inactief + 90    einddatum
        FROM prs_perslid p, prs_v_perslid_fullnames pf, prs_v_verplichting v
       WHERE     prs_perslid_inactief IS NOT NULL
             AND prs_perslid_verwijder IS NULL
             AND p.prs_perslid_key = v.prs_perslid_key
             AND p.prs_perslid_key = pf.prs_perslid_key(+)
    GROUP BY p.prs_perslid_key, prs_perslid_inactief, prs_perslid_naam_full;

CREATE OR REPLACE VIEW kfsg_v_noti_resreminder
(
   code,
   sender,
   receiver,
   text,
   key,
   xkey
)
AS
   SELECT 'RESINF',
          NULL,
          rsvr.res_rsv_ruimte_host_key,
             'Reservering '
          || res.res_reservering_key
          || ': U heeft op '
          || TO_CHAR (rsvr.res_rsv_ruimte_van, 'DD-MM')
          || ' van '
          || TO_CHAR (rsvr.res_rsv_ruimte_van, 'HH24:MI')
          || ' tot '
          || TO_CHAR (rsvr.res_rsv_ruimte_tot, 'HH24:MI')
          || ' ruimte '
          || r.res_ruimte_nr
          || ' gereserveerd.',
          res.res_reservering_key,
          rsvr.res_rsv_ruimte_key
     FROM res_v_aanwezigreservering res,
          res_v_aanwezigrsv_ruimte rsvr,
          res_ruimte_opstelling opst,
          res_disc_params rdp,
          res_ruimte r
    WHERE     r.res_discipline_key = rdp.res_ins_discipline_key
          AND rdp.res_disc_params_noti_dagen IS NOT NULL
          AND res.res_reservering_key = rsvr.res_reservering_key
          AND opst.res_ruimte_opstel_key = rsvr.res_ruimte_opstel_key
          AND opst.res_ruimte_key = r.res_ruimte_key
          AND rsvr.res_status_fo_key <= 5
          AND rsvr.res_rsv_ruimte_van BETWEEN fac.datumtijdplusuitvoertijd (
                                                 SYSDATE,
                                                 res_disc_params_noti_dagen,
                                                 'DAGEN')
                                          AND  fac.datumtijdplusuitvoertijd (
                                                  SYSDATE,
                                                  res_disc_params_noti_dagen
                                                  + 1,
                                                  'DAGEN')
          AND fac.getweekdaynum (SYSDATE) NOT IN (1, 7)
          AND rsvr.res_rsv_ruimte_van >= SYSDATE
   UNION ALL
     SELECT 'RESINF',
            NULL,
            res_rsv_ruimte_host_key,
               'Reservering '
            || res_reservering_key
            || ': U heeft op '
            || TO_CHAR (MIN (van), 'dd-mm')
            || DECODE (
                  MIN (van),
                  MAX (tot),
                  ' om ' || TO_CHAR (MIN (van), 'hh24:mi'),
                     ' van '
                  || TO_CHAR (MIN (van), 'hh24:mi')
                  || ' tot '
                  || TO_CHAR (MAX (tot), 'hh24:mi'))
            || ' in ruimte ('
            || (SELECT    alg_gebouw_code
                       || '-'
                       || alg_verdieping_code
                       || '-'
                       || alg_ruimte_nr
                  FROM alg_v_onroerendgoed_gegevens arg
                 WHERE arg.alg_ruimte_key = ruimte_key)
            || ') '
            || COUNT (res_reservering_key)
            || ' voorziening(en) gereserveerd.',
            res_reservering_key,
            res_rsv_ruimte_key
       FROM (SELECT rsvr.res_rsv_ruimte_host_key,
                    res.res_reservering_key,
                    rsvd.res_rsv_deel_van van,
                    rsvd.res_rsv_deel_tot tot,
                    rsvr.res_rsv_ruimte_key,
                    rsvr.alg_ruimte_key ruimte_key
               FROM res_v_aanwezigreservering res,
                    res_v_aanwezigrsv_ruimte rsvr,
                    res_disc_params rdp,
                    res_rsv_deel rsvd,
                    res_deel rd
              WHERE     rsvd.res_rsv_ruimte_key = rsvr.res_rsv_ruimte_key
                    AND rd.res_deel_key = rsvd.res_deel_key
                    AND rd.res_discipline_key = rdp.res_ins_discipline_key
                    AND rdp.res_disc_params_noti_dagen IS NOT NULL
                    AND res.res_reservering_key = rsvr.res_reservering_key
                    AND rsvr.res_ruimte_opstel_key IS NULL
                    AND rsvr.res_status_fo_key <= 5
                    AND rsvd.res_rsv_deel_verwijder IS NULL
                    AND rsvd.res_rsv_deel_van BETWEEN fac.datumtijdplusuitvoertijd (
                                                         SYSDATE,
                                                         res_disc_params_noti_dagen,
                                                         'DAGEN')
                                                  AND  fac.datumtijdplusuitvoertijd (
                                                          SYSDATE,
                                                          res_disc_params_noti_dagen
                                                          + 1,
                                                          'DAGEN')
                    AND fac.getweekdaynum (SYSDATE) NOT IN (1, 7)
                    AND rsvd.res_rsv_deel_van >= SYSDATE
             UNION ALL
             SELECT rsvr.res_rsv_ruimte_host_key,
                    res.res_reservering_key,
                    rsva.res_rsv_artikel_levering van,
                    rsva.res_rsv_artikel_levering tot,
                    rsvr.res_rsv_ruimte_key,
                    rsvr.alg_ruimte_key ruimte_key
               FROM res_v_aanwezigreservering res,
                    res_v_aanwezigrsv_ruimte rsvr,
                    res_disc_params rdp,
                    res_rsv_artikel rsva,
                    res_artikel ra
              WHERE     rsva.res_rsv_ruimte_key = rsvr.res_rsv_ruimte_key
                    AND ra.res_discipline_key = rdp.res_ins_discipline_key
                    AND rsva.res_artikel_key = ra.res_artikel_key
                    AND rdp.res_disc_params_noti_dagen IS NOT NULL
                    AND res.res_reservering_key = rsvr.res_reservering_key
                    AND rsvr.res_ruimte_opstel_key IS NULL
                    AND rsvr.res_status_fo_key <= 5
                    AND rsva.res_rsv_artikel_verwijder IS NULL
                    AND rsva.res_rsv_artikel_levering BETWEEN fac.datumtijdplusuitvoertijd (
                                                                 SYSDATE,
                                                                 res_disc_params_noti_dagen,
                                                                 'DAGEN')
                                                          AND  fac.datumtijdplusuitvoertijd (
                                                                  SYSDATE,
                                                                  res_disc_params_noti_dagen
                                                                  + 1,
                                                                  'DAGEN')
                    AND fac.getweekdaynum (SYSDATE) NOT IN (1, 7)
                    AND rsva.res_rsv_artikel_levering >= SYSDATE)
   GROUP BY res_rsv_ruimte_host_key,
            res_reservering_key,
            res_rsv_ruimte_key,
            ruimte_key;

CREATE OR REPLACE VIEW kfsg_v_resruimte_qrc
(
   district,
   locatie,
   gebouw,
   catalogus,
   ruimte_nr,
   ruimte_omschrijving,
   res_ruimte_key,
   fac_bookmark_naam,
   fac_bookmark_id
)
AS
   SELECT DISTINCT alg_district_omschrijving,
                   alg_locatie_omschrijving,
                   alg_gebouw_omschrijving,
                   ins_discipline_omschrijving,
                   res_ruimte_nr,
                   res_ruimte_omschrijving,
                   rr.res_ruimte_key,
                   fac_bookmark_naam,
                   fac_bookmark_id
     FROM res_ruimte rr,
          res_discipline rd,
          fac_bookmark bk,
          (SELECT rag.res_ruimte_key,
                  alg_district_omschrijving,
                  alg_locatie_omschrijving,
                  alg_gebouw_omschrijving
             FROM res_alg_ruimte rag,
                  alg_v_onroerendgoed aor,
                  alg_gebouw g,
                  alg_locatie l,
                  alg_district d
            WHERE     rag.alg_ruimte_key = aor.alg_onroerendgoed_keys
                  AND aor.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) res_alg
    WHERE     res_ruimte_verwijder IS NULL
          AND rd.ins_discipline_key = rr.res_discipline_key
          AND rr.res_ruimte_key = res_alg.res_ruimte_key(+)
          AND bk.fac_bookmark_naam LIKE '%QRC_RES_RUIMTE%';


-- Kostenrapportage met de kosten van alle onderdelen KFSG#52740
/* Formatted on 16/7/2018 9:23:43 (QP5 v5.313) */
CREATE OR REPLACE VIEW kfsg_v_kostenrapportage
AS
    SELECT nummer,
           kostentype,
           datum,
           COALESCE (k.prs_kostenplaats_omschrijving,
                     ka.prs_kostenplaats_omschrijving)
               kostenplaats,
           aantal,
           omschrijving,
           prijs,
           ins_discipline_omschrijving
               catalogus
      FROM (SELECT res_reservering_key || '/' || res_rsv_ruimte_volgnr
                       nummer,
                   'artikel'
                       kostentype,
                   res_rsv_ruimte_van
                       datum,
                   prs_kostenplaats_key,
                   res_rsv_ruimte_host_key
                       prs_perslid_key,
                   res_rsv_artikel_aantal
                       aantal,
                   ra.res_artikel_omschrijving
                       omschrijving,
                   RES.getartikelprijs (res_rsv_artikel_key)
                       prijs,
                   ra.res_discipline_key
                       ins_discipline_key
              FROM res_rsv_ruimte rrr, res_rsv_artikel rra, res_artikel ra
             WHERE     rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
                   AND rra.res_artikel_key = ra.res_artikel_key
                   AND rra.res_rsv_artikel_verwijder IS NULL
            UNION ALL
            SELECT res_reservering_key || '/' || res_rsv_ruimte_volgnr
                       nummer,
                   'deel',
                   res_rsv_ruimte_van,
                   rrr.prs_kostenplaats_key,
                   res_rsv_ruimte_host_key
                       prs_perslid_key,
                   1,
                   res_deel_omschrijving,
                   RES.getdeelprijs (res_rsv_deel_key),
                   rd.res_discipline_key
              FROM res_rsv_ruimte rrr, res_rsv_deel rrd, res_deel rd
             WHERE     rrr.res_rsv_ruimte_key = rrd.res_rsv_ruimte_key
                   AND rrd.res_deel_key = rd.res_deel_key
                   AND rrd.res_rsv_deel_verwijder IS NULL
                   AND res_rsv_ruimte_van < SYSDATE
            UNION ALL
            SELECT TO_CHAR (b.bes_bestelling_key),
                   'bestelling',
                   b.bes_bestelling_datum,
                   b.prs_kostenplaats_key,
                   prs_perslid_key_voor,
                   bi.bes_bestelling_item_aantal,
                   sd.bes_srtdeel_omschrijving,
                   bi.bes_bestelling_item_aantal * bes_bestelling_item_prijs,
                   sg.ins_discipline_key
              FROM bes_bestelling       b,
                   bes_bestelling_item  bi,
                   bes_srtdeel          sd,
                   bes_srtgroep         sg
             WHERE     b.bes_bestelling_key = bi.bes_bestelling_key
                   AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
                   AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
            UNION ALL
              SELECT TO_CHAR (m.mld_melding_key),
                     'melding',
                     m.mld_melding_datum,
                     m.prs_kostenplaats_key,
                     m.prs_perslid_key_voor,
                     1,
                     std.mld_stdmelding_omschrijving,
                     SUM (o.mld_opdr_kosten),
                     std.mld_ins_discipline_key
                FROM mld_melding m, mld_opdr o, mld_stdmelding std
               WHERE     m.mld_melding_key = o.mld_melding_key
                     AND m.mld_stdmelding_key = std.mld_stdmelding_key
            GROUP BY m.mld_melding_datum,
                     m.prs_kostenplaats_key,
                     m.prs_perslid_key_voor,
                     1,
                     std.mld_stdmelding_omschrijving,
                     std.mld_ins_discipline_key,
                     m.mld_melding_key) geg,
           prs_kostenplaats    k,
           prs_kostenplaats    ka,
           prs_perslid         p,
           prs_afdeling        a,
           ins_tab_discipline  d
     WHERE     geg.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
           AND geg.ins_discipline_key = d.ins_discipline_key
           AND geg.prs_perslid_key = p.prs_perslid_key
           AND p.prs_afdeling_key = a.prs_afdeling_key
           AND a.prs_kostenplaats_key = ka.prs_kostenplaats_key
           AND geg.datum < SYSDATE;

-- KFSG#57062: Klachtenrapportage
CREATE OR REPLACE VIEW kfsg_v_rap_klachten
AS
    SELECT d.ins_discipline_omschrijving,
           m.mld_melding_onderwerp,
           aogk.alg_gebouw_naam,
           pf.prs_perslid_naam_full,
           m.mld_melding_datum,
           fac.gettrackingdate ('MLDAFM', m.mld_melding_key)
               melding_afgemeld,
           s.mld_statuses_omschrijving,
           m.mld_melding_opmerking,
           kfsg.get_kenmerk('MLD', 1401, m.mld_melding_key) verbeteractie,
           kfsg.get_kenmerk('MLD', 1423, m.mld_melding_key) verwijtbaar,
           kfsg.get_kenmerk('MLD', 1421, m.mld_melding_key) leverancier
      FROM mld_melding                  m,
           prs_v_perslid_fullnames_all  pf,
           alg_v_allonrgoed_gegevens    aogk,
           mld_statuses                 s,
           mld_stdmelding               std,
           ins_tab_discipline           d
     WHERE     m.mld_melding_status = mld_statuses_key
           AND m.prs_perslid_key = pf.prs_perslid_key
           AND m.mld_alg_onroerendgoed_keys = aogk.alg_onroerendgoed_keys
           AND m.mld_stdmelding_key = std.mld_stdmelding_key
           AND std.mld_ins_discipline_key = d.ins_discipline_key                                 -- klacht
           AND d.ins_srtdiscipline_key = 23;


-- KFSG#51990: Facturatieproces (reverse billing zoals bij NS)!
CREATE OR REPLACE VIEW kfsg_v_rap_actual_cost_tot
(
   fclt_3d_afdeling_key,                   -- Kunnen beperken per leverancier!
   maand,
   broc_flag,
   fclt_f_leverancier,
   contractnr,
   beschrijving,
   inkoopordernr,
   aantal,
   kosten
)
AS                              -- Vaste contractkosten over de ACTUAL termijn
   SELECT c.prs_afdeling_key,
          TO_CHAR (SYSDATE, 'yyyy-mm') maand, -- Deze maand volgende maand factureren (achteraf)
          'C' broc_flag,
          c.prs_bedrijf_naam bedrijf,
          c.cnt_contract_nummer_intern, -- Uit deze maand lopend contract, anders geen vaste kosten
          c.cnt_contract_omschrijving,
          c.cnt_contract_nummer,
          0 aantal,
          ROUND (
             DECODE (COALESCE (c.cnt_contract_termijnkosten, 0),
                     0, c.cnt_contract_kosten / 12,
                     c.cnt_contract_termijnkosten),
             2)
          + fac.safe_to_number (COALESCE (ce.cnt_kenmerkcontract_waarde, '0'))
          + fac.safe_to_number (COALESCE (bm.cnt_kenmerkcontract_waarde, '0'))
             kosten                                -- Wat als looptijd < jaar?
     FROM (SELECT b.prs_bedrijf_key,
                  b.prs_bedrijf_naam,
                  pcp.prs_afdeling_key,
                  pcp.prs_perslid_key,
                  DECODE (pcp.prs_perslid_geslacht, 0, 'Mevr. ', 1, 'Dhr. ', '')
                     cp_aanhef,
                  DECODE (
                     COALESCE (pcp.prs_perslid_voorletters,
                               SUBSTR (pcp.prs_perslid_voornaam, 1, 1)),
                     NULL, NULL,
                     COALESCE (
                        pcp.prs_perslid_voorletters,
                        SUBSTR (pcp.prs_perslid_voornaam, 1, 1) || '.')
                     || ' ')
                  || DECODE (pcp.prs_perslid_tussenvoegsel,
                             NULL, NULL,
                             pcp.prs_perslid_tussenvoegsel || ' ')
                  || pcp.prs_perslid_naam
                     cp_naam,
                  pcp.prs_perslid_email cp_email,
                  c.cnt_contract_key,
                  c.cnt_contract_nummer_intern,
                  c.cnt_contract_omschrijving,
                  c.cnt_contract_nummer,
                  c.cnt_contract_kosten,
                  c.cnt_contract_termijnkosten
             FROM cnt_v_aanwezigcontract c,
                  prs_bedrijf b,
                  cnt_contract mc,
                  prs_contactpersoon cp,
                  prs_perslid pcp
            WHERE c.ins_discipline_key = 522               -- Vaste contracten
                  --AND c.cnt_contract_status = 0               -- NIET Gesloten
                  AND TRUNC (c.cnt_contract_looptijd_van) < TRUNC (LAST_DAY (SYSDATE))
                  AND c.cnt_contract_looptijd_tot >= TRUNC (LAST_DAY (SYSDATE))
                  AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
                  AND c.cnt_contract_mantel_key = mc.cnt_contract_key(+)
                  AND mc.prs_contactpersoon_key = cp.prs_contactpersoon_key(+)
                  AND cp.prs_perslid_key = pcp.prs_perslid_key(+)) c
          LEFT JOIN cnt_kenmerkcontract ce
             ON ce.cnt_kenmerk_key = -1                 -- Credit/extra kosten
                AND c.cnt_contract_key = ce.cnt_contract_key
          LEFT JOIN cnt_kenmerkcontract bm
             ON bm.cnt_kenmerk_key = -1                         -- Bonus/malus
                AND c.cnt_contract_key = bm.cnt_contract_key
   UNION ALL                                           -- Bestelopdrachtkosten
     SELECT pcp.prs_afdeling_key,
            TO_CHAR (SYSDATE, 'yyyy-mm') maand, -- Deze maand volgende maand factureren (achteraf)
            'B' broc_flag,
            b.prs_bedrijf_naam bedrijf,
            c.cnt_contract_nummer_intern, -- Uit deze maand lopend contract, anders geen variabele kosten
            c.cnt_contract_omschrijving,
            c.cnt_contract_nummer,
            COUNT (DISTINCT bo.bes_bestelopdr_key) aantal,
            SUM ((boi.bes_bestelopdr_item_aantal * COALESCE (boi.bes_bestelopdr_item_inkprijs, boi.bes_bestelopdr_item_prijs)) +
                 COALESCE (bo.bes_bestelopdr_korting, 0) +
                 COALESCE (bo.bes_bestelopdr_levkosten, 0))
               kosten     -- Netto bedrag, want alle bedragen excl. BTW, toch?
       FROM bes_bestelopdr bo,
            bes_bestelopdr_item boi,
            prs_bedrijf b,
            cnt_v_aanwezigcontract c,
            cnt_contract mc,
            prs_contactpersoon cp,
            prs_perslid pcp
      WHERE bo.bes_bestelopdr_status = 6 -- Bestelopdracht Geleverd (en nog niet Verwerkt)
            AND fac.gettrackingdate ('BES2AF', bo.bes_bestelopdr_key) > TRUNC (SYSDATE, 'mm') -- Actual = Deze maand Geleverd (en nog niet Verwerkt)
            --fac.gettrackingdate ('BESOTV', bbi.bes_bestelling_key) > TRUNC (SYSDATE, 'mm') -- Actual = Deze maand Ontvangen (en nog niet Verwerkt?)
            AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key
            AND bo.prs_bedrijf_key = b.prs_bedrijf_key
            AND b.prs_bedrijf_key = c.cnt_prs_bedrijf_key
            AND c.ins_discipline_key = 523             -- Variabele contracten
            --AND c.cnt_contract_status = 0                     -- NIET Gesloten
            AND TRUNC (c.cnt_contract_looptijd_van) < TRUNC (LAST_DAY (SYSDATE))
            AND c.cnt_contract_looptijd_tot >= TRUNC (LAST_DAY (SYSDATE))
            AND c.cnt_contract_mantel_key = mc.cnt_contract_key(+)
            AND mc.prs_contactpersoon_key = cp.prs_contactpersoon_key(+)
            AND cp.prs_perslid_key = pcp.prs_perslid_key(+)
            AND NOT EXISTS
                  (SELECT 1
                     FROM cnt_v_aanwezigcontract
                    WHERE ins_discipline_key = 523     -- Variabele contracten
                          --AND cnt_contract_status = 0         -- NIET Gesloten
                          AND TRUNC (cnt_contract_looptijd_van) < TRUNC (SYSDATE, 'mm') - 1
                          AND cnt_contract_looptijd_tot >= TRUNC (SYSDATE, 'mm') - 1
                          AND cnt_prs_bedrijf_key = c.cnt_prs_bedrijf_key
                          AND cnt_contract_nummer_intern > c.cnt_contract_nummer_intern)
   GROUP BY pcp.prs_afdeling_key,
            TO_CHAR (SYSDATE, 'yyyy-mm'),
            'B',
            b.prs_bedrijf_naam,
            c.cnt_contract_nummer_intern, -- Uit deze maand lopend contract, anders geen variabele kosten
            c.cnt_contract_omschrijving,
            c.cnt_contract_nummer
   UNION ALL                                             -- Reserveringskosten
     SELECT x.prs_afdeling_key,
            TO_CHAR (SYSDATE, 'yyyy-mm') maand, -- Deze maand volgende maand factureren (achteraf)
            'R' broc_flag,
            x.prs_bedrijf_naam bedrijf,
            x.cnt_contract_nummer_intern, -- Uit deze maand lopend contract, anders geen variabele kosten
            x.cnt_contract_omschrijving,
            x.cnt_contract_nummer,
            COUNT (DISTINCT x.res_rsv_ruimte_key) aantal,
            SUM (COALESCE (verw_prijs, prijs, 0)) kosten -- Netto bedrag, want alle bedragen excl. BTW, toch?
       FROM (SELECT rrr.res_rsv_ruimte_key,
                    b.prs_bedrijf_naam,
                    pcp.prs_afdeling_key,
                    c.cnt_contract_nummer_intern, -- Uit deze maand lopend contract, anders geen variabele kosten
                    c.cnt_contract_omschrijving,
                    c.cnt_contract_nummer,
                    rra.res_rsv_artikel_prijs verw_prijs,
                    rra.res_rsv_artikel_aantal * rra.res_artikel_prijs prijs,
                    rra.btw
               FROM res_rsv_ruimte rrr,
                    res_ruimte_opstelling rro,
                    (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
                         FROM res_alg_ruimte
                        WHERE res_alg_ruimte_verwijder IS NULL
                     GROUP BY res_ruimte_key) rar1,
                    (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
                         FROM res_alg_ruimte
                        WHERE res_alg_ruimte_verwijder IS NOT NULL
                     GROUP BY res_ruimte_key) rar2,
                    alg_v_allonroerendgoed aog,
                    (SELECT rra.res_rsv_ruimte_key,
                            rra.res_rsv_artikel_levering,
                            rra.res_rsv_artikel_prijs,
                            rra.res_rsv_artikel_aantal,
                            ra.res_artikel_prijs,
                            DECODE (COALESCE (rra.res_rsv_artikel_btw, ra.res_artikel_btw),
                                    NULL, 'VH',
                                    21, 'VH',
                                   'VL')
                               btw,
                            ra.res_discipline_key,
                            ra.res_artikel_omschrijving,
                            ra.res_artikel_eenheid
                       FROM res_v_aanwezigrsv_artikel rra, res_artikel ra
                      WHERE rra.res_rsv_artikel_verwerkt IS NULL
                            AND rra.res_rsv_artikel_dirtlevel = 0
                            AND rra.res_rsv_artikel_levering BETWEEN TRUNC (SYSDATE, 'mm') AND TRUNC (SYSDATE + 1) -- Actual = Deze maand Geleverd (en nog niet Verwerkt)
                            AND rra.res_artikel_key = ra.res_artikel_key) rra,
                    res_v_aanwezigdiscipline rd,
                    res_disc_params dp,
                    prs_bedrijf b,
                    cnt_v_aanwezigcontract c,
                    cnt_contract mc,
                    prs_contactpersoon cp,
                    prs_perslid pcp
              WHERE rrr.res_rsv_ruimte_dirtlevel = 0
                    AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)
                    AND rro.res_ruimte_key = rar1.res_ruimte_key(+)
                    AND rro.res_ruimte_key = rar2.res_ruimte_key(+)
                    AND COALESCE (rar1.alg_ruimte_key, rar2.alg_ruimte_key, rrr.alg_ruimte_key) = aog.alg_ruimte_key
                    AND rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
                    AND rra.res_discipline_key = rd.ins_discipline_key
                    AND rd.ins_discipline_key = dp.res_ins_discipline_key
                    AND dp.prs_bedrijf_key = b.prs_bedrijf_key
                    AND b.prs_bedrijf_key = c.cnt_prs_bedrijf_key
                    AND c.ins_discipline_key = 523     -- Variabele contracten
                    --AND c.cnt_contract_status = 0             -- NIET Gesloten
                    AND TRUNC (c.cnt_contract_looptijd_van) < TRUNC (LAST_DAY (SYSDATE))
                    AND c.cnt_contract_looptijd_tot >= TRUNC (LAST_DAY (SYSDATE))
                    AND c.cnt_contract_mantel_key = mc.cnt_contract_key(+)
                    AND mc.prs_contactpersoon_key = cp.prs_contactpersoon_key(+)
                    AND cp.prs_perslid_key = pcp.prs_perslid_key(+)
                    AND NOT EXISTS
                          (SELECT 1
                             FROM cnt_v_aanwezigcontract
                            WHERE ins_discipline_key = 523 -- Variabele contracten
                                  --AND cnt_contract_status = 0 -- NIET Gesloten
                                  AND TRUNC (cnt_contract_looptijd_van) < TRUNC (SYSDATE, 'mm') - 1
                                  AND cnt_contract_looptijd_tot >= TRUNC (SYSDATE, 'mm') - 1
                                  AND cnt_prs_bedrijf_key = c.cnt_prs_bedrijf_key
                                  AND cnt_contract_nummer_intern > c.cnt_contract_nummer_intern)) x
   GROUP BY x.prs_afdeling_key,
            TO_CHAR (SYSDATE, 'yyyy-mm'),
            'R',
            x.prs_bedrijf_naam,
            x.cnt_contract_nummer_intern,
            x.cnt_contract_omschrijving,
            x.cnt_contract_nummer
   UNION ALL -- Variabele kosten uit ACTUAL opdrachten op variabele contracten
     SELECT pcp.prs_afdeling_key,
            TO_CHAR (SYSDATE, 'yyyy-mm') maand, -- Deze maand ORDAFR, volgende maand factureren (achteraf)
            'O' broc_flag,
            b.prs_bedrijf_naam,
            c.cnt_contract_nummer_intern,
            c.cnt_contract_omschrijving,
            COALESCE (nr.mld_kenmerkopdr_waarde, c.cnt_contract_nummer) cnt_contract_nummer,
            COUNT ( * ) aantal,
            SUM (o.mld_opdr_kosten) kosten -- Netto bedrag, want alle bedragen excl. BTW, toch?
       FROM mld_opdr o,
            --fac_tracking t,
            cnt_contract c,
            cnt_contract mc,
            prs_bedrijf b,
            prs_contactpersoon cp,
            prs_perslid pcp,
            (SELECT ko.mld_opdr_key, ko.mld_kenmerkopdr_waarde
               FROM mld_v_aanwezigkenmerkopdr ko, mld_kenmerk k
              WHERE ko.mld_kenmerk_key = k.mld_kenmerk_key
                    AND k.mld_srtkenmerk_key = 961) nr         -- Inkoopnummer
      WHERE o.mld_statusopdr_key = 9
            --AND o.mld_opdr_key = t.fac_tracking_refkey
            --AND t.fac_srtnotificatie_key = 76                        -- ORDAFR
            --AND t.fac_tracking_datum > TRUNC (SYSDATE, 'mm') -- Actual = deze maand Afgerond (en nog niet Verwerkt)
            AND fac.gettrackingdate ('ORDAFR', o.mld_opdr_key) > TRUNC (SYSDATE, 'mm') -- Actual = Deze maand Afgerond (en nog niet Verwerkt)
            AND NOT EXISTS                     -- Niet gemarkeerd als dispuut!
                  (SELECT 1
                     FROM mld_v_aanwezigkenmerkopdr ko, mld_kenmerk k
                    WHERE ko.mld_opdr_key = o.mld_opdr_key
                          AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                          AND k.mld_srtkenmerk_key = 141            -- Dispuut
                          AND ko.mld_kenmerkopdr_waarde = '1')   -- Aangevinkt
            AND o.cnt_contract_key = c.cnt_contract_key
            AND c.ins_discipline_key = 523             -- Variabele contracten
            AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
            AND c.cnt_contract_mantel_key = mc.cnt_contract_key(+)
            AND mc.prs_contactpersoon_key = cp.prs_contactpersoon_key(+)
            AND cp.prs_perslid_key = pcp.prs_perslid_key(+)
            AND o.mld_opdr_key = nr.mld_opdr_key(+)
   GROUP BY pcp.prs_afdeling_key,
            TO_CHAR (SYSDATE, 'yyyy-mm'),
            'O',
            b.prs_bedrijf_naam,
            c.cnt_contract_nummer_intern,
            c.cnt_contract_omschrijving,
            COALESCE (nr.mld_kenmerkopdr_waarde, c.cnt_contract_nummer);

-- Actual regels en basis voor oa. te exporteren/bevriezen regels op de 10e van
-- de maand; voor de output geldt:
-- Dat deze de actual vaste contractkosten toont (over afgelopen maand).
-- Dat deze de actual variabele bestelopdrachtkosten toont (voor 1e ORDAFR).
-- Dat deze de actual variabele reserveringskosten toont (over afgelopen maand).
-- Dat deze de actual variabele opdrachtkosten toont (voor 1e ORDAFR).
-- Dat deze tot de 10e van de huidige maand alleen nog door Yask wijzigbaar is.
CREATE OR REPLACE VIEW kfsg_v_actual_fact                 -- Tbv. FACT_EXPORT!
(
   prs_afdeling_key,
   maand,
   prs_bedrijf_key,
   prs_bedrijf_naam,
   cp_perslid_key,
   cp_aanhef,
   cp_naam,
   cp_email,
   cnt_contract_key,
   contractnr,
   beschrijving,
   inkoopordernr,
   cm_aanhef,
   cm_naam,
   bes_bestelopdr_key,
   res_rsv_ruimte_key,
   mld_opdr_key,
   bro_id,
   aantal,
   kosten
)
AS
   SELECT c.prs_afdeling_key,   -- Vaste contractkosten over de ACTUAL termijn
          TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm') maand, -- Afgelopen maand deze maand factureren (achteraf)
          c.prs_bedrijf_key,
          c.prs_bedrijf_naam,
          c.prs_perslid_key,
          c.cp_aanhef,
          c.cp_naam,
          c.cp_email,
          c.cnt_contract_key,
          c.cnt_contract_nummer_intern,
          c.cnt_contract_omschrijving,
          c.cnt_contract_nummer, -- Uit afgelopen maand lopend contract, anders geen vaste kosten
          c.cm_aanhef,
          c.cm_naam,
          NULL bes_bestelopdr_key,
          NULL res_rsv_ruimte_key,
          NULL mld_opdr_key,
          NULL bro_id,
          0 aantal,
          ROUND (
             DECODE (COALESCE (c.cnt_contract_termijnkosten, 0),
                     0, c.cnt_contract_kosten / 12,
                     c.cnt_contract_termijnkosten),
             2)
          + fac.safe_to_number (COALESCE (ce.cnt_kenmerkcontract_waarde, '0'))
          + fac.safe_to_number (COALESCE (bm.cnt_kenmerkcontract_waarde, '0'))
             kosten                                -- Wat als looptijd < jaar?
     FROM (SELECT b.prs_bedrijf_key,
                  b.prs_bedrijf_naam,
                  pcp.prs_afdeling_key,
                  pcp.prs_perslid_key,
                  DECODE (pcp.prs_perslid_geslacht,
                          0, 'Mevr. ',
                          1, 'Dhr. ',
                          '')
                     cp_aanhef,
                  DECODE (
                     COALESCE (pcp.prs_perslid_voorletters,
                               SUBSTR (pcp.prs_perslid_voornaam, 1, 1)),
                     NULL, NULL,
                     COALESCE (
                        pcp.prs_perslid_voorletters,
                        SUBSTR (pcp.prs_perslid_voornaam, 1, 1) || '.')
                     || ' ')
                  || DECODE (pcp.prs_perslid_tussenvoegsel,
                             NULL, NULL,
                             pcp.prs_perslid_tussenvoegsel || ' ')
                  || pcp.prs_perslid_naam
                     cp_naam,
                  pcp.prs_perslid_email cp_email,
                  c.cnt_contract_key,
                  c.cnt_contract_nummer_intern,
                  c.cnt_contract_omschrijving,
                  c.cnt_contract_nummer,
                  c.cnt_contract_kosten,
                  c.cnt_contract_termijnkosten,
                  DECODE (pcm.prs_perslid_geslacht,
                          0, 'Mevr. ',
                          1, 'Dhr. ',
                          '')
                     cm_aanhef,
                  DECODE (
                     COALESCE (pcm.prs_perslid_voorletters,
                               SUBSTR (pcm.prs_perslid_voornaam, 1, 1)),
                     NULL, NULL,
                     COALESCE (
                        pcm.prs_perslid_voorletters,
                        SUBSTR (pcm.prs_perslid_voornaam, 1, 1) || '.')
                     || ' ')
                  || DECODE (pcm.prs_perslid_tussenvoegsel,
                             NULL, NULL,
                             pcm.prs_perslid_tussenvoegsel || ' ')
                  || pcm.prs_perslid_naam
                     cm_naam
             FROM cnt_v_aanwezigcontract c,
                  prs_bedrijf b,
                  cnt_contract mc,
                  prs_contactpersoon cp,
                  prs_perslid pcp,
                  prs_perslid pcm
            WHERE c.ins_discipline_key = 522               -- Vaste contracten
                  --AND c.cnt_contract_status = 0               -- NIET Gesloten
                  AND TRUNC (c.cnt_contract_looptijd_van) < TRUNC (SYSDATE, 'mm') - 1
                  AND c.cnt_contract_looptijd_tot >= TRUNC (SYSDATE, 'mm') - 1
                  AND NOT EXISTS              -- Nog geen entry in eigen tabel
                        (SELECT 1
                           FROM fac_usrdata
                          WHERE fac_usrtab_key = 161         -- VasteKostenMnd
                                AND fac_usrdata_code = TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm') || '/' || c.cnt_contract_key)
                  AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
                  AND c.cnt_contract_mantel_key = mc.cnt_contract_key(+)
                  AND mc.prs_contactpersoon_key = cp.prs_contactpersoon_key(+)
                  AND cp.prs_perslid_key = pcp.prs_perslid_key(+)
                  AND c.prs_perslid_key_beh = pcm.prs_perslid_key) c
          LEFT JOIN cnt_kenmerkcontract ce
             ON ce.cnt_kenmerk_key = -1                 -- Credit/extra kosten
                AND c.cnt_contract_key = ce.cnt_contract_key
          LEFT JOIN cnt_kenmerkcontract bm
             ON bm.cnt_kenmerk_key = -1                         -- Bonus/malus
                AND c.cnt_contract_key = bm.cnt_contract_key
   UNION ALL                                           -- Bestelopdrachtkosten
     SELECT pcp.prs_afdeling_key,
            TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm') maand, -- Afgelopen maand deze maand factureren (achteraf)
            b.prs_bedrijf_key,
            b.prs_bedrijf_naam bedrijf,
            pcp.prs_perslid_key,
            DECODE (pcp.prs_perslid_geslacht,
                    0, 'Mevr. ',
                    1, 'Dhr. ',
                    '')
               cp_aanhef,
            DECODE (
               COALESCE (pcp.prs_perslid_voorletters,
                         SUBSTR (pcp.prs_perslid_voornaam, 1, 1)),
               NULL, NULL,
               COALESCE (
                  pcp.prs_perslid_voorletters,
                  SUBSTR (pcp.prs_perslid_voornaam, 1, 1) || '.')
               || ' ')
            || DECODE (pcp.prs_perslid_tussenvoegsel,
                       NULL, NULL,
                       pcp.prs_perslid_tussenvoegsel || ' ')
            || pcp.prs_perslid_naam
               cp_naam,
            pcp.prs_perslid_email cp_email,
            c.cnt_contract_key,
            c.cnt_contract_nummer_intern, -- Uit deze maand lopend contract, anders geen variabele kosten
            c.cnt_contract_omschrijving,
            c.cnt_contract_nummer,
            DECODE (pcm.prs_perslid_geslacht,
                    0, 'Mevr. ',
                    1, 'Dhr. ',
                    '')
               cm_aanhef,
            DECODE (
               COALESCE (pcm.prs_perslid_voorletters,
                         SUBSTR (pcm.prs_perslid_voornaam, 1, 1)),
               NULL, NULL,
               COALESCE (
                  pcm.prs_perslid_voorletters,
                  SUBSTR (pcm.prs_perslid_voornaam, 1, 1) || '.')
               || ' ')
            || DECODE (pcm.prs_perslid_tussenvoegsel,
                       NULL, NULL,
                       pcm.prs_perslid_tussenvoegsel || ' ')
            || pcm.prs_perslid_naam
               cm_naam,
            bo.bes_bestelopdr_key,
            NULL res_rsv_ruimte_key,
            NULL mld_opdr_key,
            bo.bes_bestelopdr_id bro_id,
            1 aantal,
            SUM ((boi.bes_bestelopdr_item_aantal * COALESCE (boi.bes_bestelopdr_item_inkprijs, boi.bes_bestelopdr_item_prijs)) +
                 COALESCE (bo.bes_bestelopdr_korting, 0) +
                 COALESCE (bo.bes_bestelopdr_levkosten, 0))
               kosten     -- Netto bedrag, want alle bedragen excl. BTW, toch?
       FROM bes_bestelopdr bo,
            bes_bestelopdr_item boi,
            bes_bestelling_item bbi,
            prs_bedrijf b,
            cnt_v_aanwezigcontract c,
            cnt_contract mc,
            prs_contactpersoon cp,
            prs_perslid pcp,
            prs_perslid pcm
      WHERE bo.bes_bestelopdr_status = 6 -- Bestelopdracht Geleverd (en nog niet Verwerkt)
            AND fac.gettrackingdate ('BES2AF', bo.bes_bestelopdr_key) BETWEEN TO_DATE ('20190101', 'yyyymmdd') AND TRUNC (SYSDATE, 'mm') -- Actual = Afgelopen maand Geleverd (en nog niet Verwerkt)
            --fac.gettrackingdate ('BESOTV', bbi.bes_bestelling_key) BETWEEN TO_DATE ('20190101', 'yyyymmdd') AND TRUNC (SYSDATE, 'mm') -- Actual = Afgelopen maand Ontvangen (en nog niet Verwerkt?)
            AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key
            AND boi.bes_bestelopdr_item_key = bbi.bes_bestelopdr_item_key
            AND bo.prs_bedrijf_key = b.prs_bedrijf_key
            AND b.prs_bedrijf_key = c.cnt_prs_bedrijf_key
            AND c.ins_discipline_key = 523             -- Variabele contracten
            --AND c.cnt_contract_status = 0                     -- NIET Gesloten
            AND TRUNC (c.cnt_contract_looptijd_van) < TRUNC (LAST_DAY (SYSDATE))
            AND c.cnt_contract_looptijd_tot >= TRUNC (LAST_DAY (SYSDATE))
            AND c.cnt_contract_mantel_key = mc.cnt_contract_key(+)
            AND mc.prs_contactpersoon_key = cp.prs_contactpersoon_key(+)
            AND cp.prs_perslid_key = pcp.prs_perslid_key(+)
            AND c.prs_perslid_key_beh = pcm.prs_perslid_key
            AND NOT EXISTS
                  (SELECT 1
                     FROM cnt_v_aanwezigcontract
                    WHERE ins_discipline_key = 523     -- Variabele contracten
                          --AND cnt_contract_status = 0         -- NIET Gesloten
                          AND TRUNC (cnt_contract_looptijd_van) < TRUNC (SYSDATE, 'mm') - 1
                          AND cnt_contract_looptijd_tot >= TRUNC (SYSDATE, 'mm') - 1
                          AND cnt_prs_bedrijf_key = c.cnt_prs_bedrijf_key
                          AND cnt_contract_nummer_intern > c.cnt_contract_nummer_intern)
   GROUP BY pcp.prs_afdeling_key,
            TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm'),
            b.prs_bedrijf_key,
            b.prs_bedrijf_naam,
            pcp.prs_perslid_key,
            DECODE (pcp.prs_perslid_geslacht,
                    0, 'Mevr. ',
                    1, 'Dhr. ',
                    ''),
            DECODE (
               COALESCE (pcp.prs_perslid_voorletters,
                         SUBSTR (pcp.prs_perslid_voornaam, 1, 1)),
               NULL, NULL,
               COALESCE (
                  pcp.prs_perslid_voorletters,
                  SUBSTR (pcp.prs_perslid_voornaam, 1, 1) || '.')
               || ' ')
            || DECODE (pcp.prs_perslid_tussenvoegsel,
                       NULL, NULL,
                       pcp.prs_perslid_tussenvoegsel || ' ')
            || pcp.prs_perslid_naam,
            pcp.prs_perslid_email,
            c.cnt_contract_key,
            c.cnt_contract_nummer_intern,
            c.cnt_contract_omschrijving,
            c.cnt_contract_nummer,
            DECODE (pcm.prs_perslid_geslacht,
                    0, 'Mevr. ',
                    1, 'Dhr. ',
                    ''),
            DECODE (
               COALESCE (pcm.prs_perslid_voorletters,
                         SUBSTR (pcm.prs_perslid_voornaam, 1, 1)),
               NULL, NULL,
               COALESCE (
                  pcm.prs_perslid_voorletters,
                  SUBSTR (pcm.prs_perslid_voornaam, 1, 1) || '.')
               || ' ')
            || DECODE (pcm.prs_perslid_tussenvoegsel,
                       NULL, NULL,
                       pcm.prs_perslid_tussenvoegsel || ' ')
            || pcm.prs_perslid_naam,
            bo.bes_bestelopdr_key,
            NULL,
            NULL,
            bo.bes_bestelopdr_id,
            1
   UNION ALL                                             -- Reserveringskosten
     SELECT x.prs_afdeling_key,
            TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm') maand, -- Afgelopen maand deze maand factureren (achteraf)
            x.prs_bedrijf_key,
            x.prs_bedrijf_naam bedrijf,
            x.prs_perslid_key,
            x.cp_aanhef,
            x.cp_naam,
            x.cp_email,
            x.cnt_contract_key,
            x.cnt_contract_nummer_intern, -- Uit deze maand lopend contract, anders geen variabele kosten
            x.cnt_contract_omschrijving,
            x.cnt_contract_nummer,
            x.cm_aanhef,
            x.cm_naam,
            NULL bes_bestelopdr_key,
            x.res_rsv_ruimte_key,
            NULL mld_opdr_key,
            TO_CHAR (x.res_reservering_key) || '/' || TO_CHAR (x.res_rsv_ruimte_volgnr) bro_id,
            1 aantal,
            SUM (COALESCE (verw_prijs, prijs, 0)) kosten -- Netto bedrag, want alle bedragen excl. BTW, toch?
       FROM (SELECT b.prs_bedrijf_key,
                    b.prs_bedrijf_naam,
                    pcp.prs_afdeling_key,
                    pcp.prs_perslid_key,
                    DECODE (pcp.prs_perslid_geslacht,
                            0, 'Mevr. ',
                            1, 'Dhr. ',
                            '')
                       cp_aanhef,
                    DECODE (
                       COALESCE (pcp.prs_perslid_voorletters,
                                 SUBSTR (pcp.prs_perslid_voornaam, 1, 1)),
                       NULL, NULL,
                       COALESCE (
                          pcp.prs_perslid_voorletters,
                          SUBSTR (pcp.prs_perslid_voornaam, 1, 1) || '.')
                       || ' ')
                    || DECODE (pcp.prs_perslid_tussenvoegsel,
                               NULL, NULL,
                               pcp.prs_perslid_tussenvoegsel || ' ')
                    || pcp.prs_perslid_naam
                       cp_naam,
                    pcp.prs_perslid_email cp_email,
                    c.cnt_contract_key,
                    c.cnt_contract_nummer_intern, -- Uit deze maand lopend contract, anders geen variabele kosten
                    c.cnt_contract_omschrijving,
                    c.cnt_contract_nummer,
                    DECODE (pcm.prs_perslid_geslacht,
                            0, 'Mevr. ',
                            1, 'Dhr. ',
                            '')
                       cm_aanhef,
                    DECODE (
                       COALESCE (pcm.prs_perslid_voorletters,
                                 SUBSTR (pcm.prs_perslid_voornaam, 1, 1)),
                       NULL, NULL,
                       COALESCE (
                          pcm.prs_perslid_voorletters,
                          SUBSTR (pcm.prs_perslid_voornaam, 1, 1) || '.')
                       || ' ')
                    || DECODE (pcm.prs_perslid_tussenvoegsel,
                               NULL, NULL,
                               pcm.prs_perslid_tussenvoegsel || ' ')
                    || pcm.prs_perslid_naam
                       cm_naam,
                    rrr.res_rsv_ruimte_key,
                    rrr.res_reservering_key,
                    rrr.res_rsv_ruimte_volgnr,
                    --rra.res_rsv_artikel_aantal res_aantal,
                    --LTRIM (rra.res_artikel_omschrijving) || ' [' || TO_CHAR (res_rsv_artikel_levering, 'dd-mm-yyyy') || ']' res_voorziening,
                    --rra.res_rsv_artikel_levering reslev,
                    rra.res_rsv_artikel_prijs verw_prijs,
                    rra.res_rsv_artikel_aantal * rra.res_artikel_prijs prijs,
                    rra.btw
               FROM res_rsv_ruimte rrr,
                    res_ruimte_opstelling rro,
                    (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
                         FROM res_alg_ruimte
                        WHERE res_alg_ruimte_verwijder IS NULL
                     GROUP BY res_ruimte_key) rar1,
                    (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
                         FROM res_alg_ruimte
                        WHERE res_alg_ruimte_verwijder IS NOT NULL
                     GROUP BY res_ruimte_key) rar2,
                    alg_v_allonroerendgoed aog,
                    (SELECT rra.res_rsv_ruimte_key,
                            rra.res_rsv_artikel_levering,
                            rra.res_rsv_artikel_prijs,
                            rra.res_rsv_artikel_aantal,
                            ra.res_artikel_prijs,
                            DECODE (COALESCE (rra.res_rsv_artikel_btw, ra.res_artikel_btw),
                                    NULL, 'VH',
                                    21, 'VH',
                                   'VL')
                               btw,
                            ra.res_discipline_key,
                            ra.res_artikel_omschrijving,
                            ra.res_artikel_eenheid
                       FROM res_v_aanwezigrsv_artikel rra, res_artikel ra
                      WHERE rra.res_rsv_artikel_verwerkt IS NULL
                            AND rra.res_rsv_artikel_dirtlevel = 0
                            AND rra.res_rsv_artikel_levering BETWEEN TO_DATE ('20190101', 'yyyymmdd') AND TRUNC (SYSDATE, 'mm') -- Actual = Afgelopen maand Geleverd (en nog niet Verwerkt)
                            AND rra.res_artikel_key = ra.res_artikel_key) rra,
                    res_v_aanwezigdiscipline rd,
                    res_disc_params dp,
                    prs_bedrijf b,
                    cnt_v_aanwezigcontract c,
                    cnt_contract mc,
                    prs_contactpersoon cp,
                    prs_perslid pcp,
                    prs_perslid pcm
              WHERE rrr.res_rsv_ruimte_dirtlevel = 0
                    AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)
                    AND rro.res_ruimte_key = rar1.res_ruimte_key(+)
                    AND rro.res_ruimte_key = rar2.res_ruimte_key(+)
                    AND COALESCE (rar1.alg_ruimte_key, rar2.alg_ruimte_key, rrr.alg_ruimte_key) = aog.alg_ruimte_key
                    AND rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
                    AND rra.res_discipline_key = rd.ins_discipline_key
                    AND rd.ins_discipline_key = dp.res_ins_discipline_key
                    AND dp.prs_bedrijf_key = b.prs_bedrijf_key
                    AND b.prs_bedrijf_key = c.cnt_prs_bedrijf_key
                    AND c.ins_discipline_key = 523       -- Variabele contracten
                    --AND c.cnt_contract_status = 0               -- NIET Gesloten
                    AND TRUNC (c.cnt_contract_looptijd_van) < TRUNC (SYSDATE, 'mm') - 1
                    AND c.cnt_contract_looptijd_tot >= TRUNC (SYSDATE, 'mm') - 1
                    AND c.cnt_contract_mantel_key = mc.cnt_contract_key(+)
                    AND mc.prs_contactpersoon_key = cp.prs_contactpersoon_key(+)
                    AND cp.prs_perslid_key = pcp.prs_perslid_key(+)
                    AND c.prs_perslid_key_beh = pcm.prs_perslid_key
                    AND NOT EXISTS
                          (SELECT 1
                             FROM cnt_v_aanwezigcontract
                            WHERE ins_discipline_key = 523 -- Variabele contracten
                                  --AND cnt_contract_status = 0     -- NIET Gesloten
                                  AND TRUNC (cnt_contract_looptijd_van) < TRUNC (SYSDATE, 'mm') - 1
                                  AND cnt_contract_looptijd_tot >= TRUNC (SYSDATE, 'mm') - 1
                                  AND cnt_prs_bedrijf_key = c.cnt_prs_bedrijf_key
                                  AND cnt_contract_nummer_intern > c.cnt_contract_nummer_intern)) x
   GROUP BY x.prs_afdeling_key,
            TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm'),
            x.prs_bedrijf_key,
            x.prs_bedrijf_naam,
            x.prs_perslid_key,
            x.cp_aanhef,
            x.cp_naam,
            x.cp_email,
            x.cnt_contract_key,
            x.cnt_contract_nummer_intern,
            x.cnt_contract_omschrijving,
            x.cnt_contract_nummer,
            x.cm_aanhef,
            x.cm_naam,
            x.res_rsv_ruimte_key,
            TO_CHAR (x.res_reservering_key) || '/' || TO_CHAR (x.res_rsv_ruimte_volgnr),
            1
   UNION ALL -- Variabele kosten uit ACTUAL opdrachten op variabele contracten
   SELECT pcp.prs_afdeling_key,
          TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm') maand, -- Voor 1e ORDAFR, deze maand factureren (achteraf)
          b.prs_bedrijf_key,
          b.prs_bedrijf_naam,
          pcp.prs_perslid_key,
          DECODE (pcp.prs_perslid_geslacht, 0, 'Mevr. ', 1, 'Dhr. ', '')
             cp_aanhef,
          DECODE (
             COALESCE (pcp.prs_perslid_voorletters,
                       SUBSTR (pcp.prs_perslid_voornaam, 1, 1)),
             NULL, NULL,
             COALESCE (pcp.prs_perslid_voorletters,
                       SUBSTR (pcp.prs_perslid_voornaam, 1, 1) || '.')
             || ' ')
          || DECODE (pcp.prs_perslid_tussenvoegsel,
                     NULL, NULL,
                     pcp.prs_perslid_tussenvoegsel || ' ')
          || pcp.prs_perslid_naam
             cp_naam,
          pcp.prs_perslid_email cp_email,
          c.cnt_contract_key,
          c.cnt_contract_nummer_intern,
          c.cnt_contract_omschrijving,
          COALESCE (nr.mld_kenmerkopdr_waarde, c.cnt_contract_nummer) cnt_contract_nummer,
          DECODE (pcm.prs_perslid_geslacht, 0, 'Mevr. ', 1, 'Dhr. ', '')
             cm_aanhef,
          DECODE (
             COALESCE (pcm.prs_perslid_voorletters,
                       SUBSTR (pcm.prs_perslid_voornaam, 1, 1)),
             NULL, NULL,
             COALESCE (pcm.prs_perslid_voorletters,
                       SUBSTR (pcm.prs_perslid_voornaam, 1, 1) || '.')
             || ' ')
          || DECODE (pcm.prs_perslid_tussenvoegsel,
                     NULL, NULL,
                     pcm.prs_perslid_tussenvoegsel || ' ')
          || pcm.prs_perslid_naam
             cm_naam,
          NULL bes_bestelopdr_key,
          NULL res_rsv_ruimte_key,
          o.mld_opdr_key,
          TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr) bro_id,
          1 aantal,
          o.mld_opdr_kosten kosten -- Netto bedrag, want alle bedragen excl. BTW, toch?
     FROM mld_opdr o,
          --fac_tracking t,
          cnt_contract c,
          prs_bedrijf b,
          cnt_contract mc,
          prs_contactpersoon cp,
          prs_perslid pcp,
          prs_perslid pcm,
          (SELECT ko.mld_opdr_key, ko.mld_kenmerkopdr_waarde
             FROM mld_v_aanwezigkenmerkopdr ko, mld_kenmerk k
            WHERE ko.mld_kenmerk_key = k.mld_kenmerk_key
                  AND k.mld_srtkenmerk_key = 961) nr           -- Inkoopnummer
    WHERE o.mld_statusopdr_key = 9
          --AND o.mld_opdr_key = t.fac_tracking_refkey
          --AND t.fac_srtnotificatie_key = 76                          -- ORDAFR
          --AND t.fac_tracking_datum > TO_DATE ('20190101', 'yyyymmdd')
          --AND t.fac_tracking_datum < TRUNC (SYSDATE, 'mm')
          AND fac.gettrackingdate ('ORDAFR', o.mld_opdr_key) BETWEEN TO_DATE ('20190101', 'yyyymmdd') AND TRUNC (SYSDATE, 'mm') -- Actual = Deze maand Afgerond (en nog niet Verwerkt)
          AND NOT EXISTS                       -- Niet gemarkeerd als dispuut!
                (SELECT 1
                   FROM mld_v_aanwezigkenmerkopdr ko, mld_kenmerk k
                  WHERE ko.mld_opdr_key = o.mld_opdr_key
                        AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                        AND k.mld_srtkenmerk_key = 141              -- Dispuut
                        AND ko.mld_kenmerkopdr_waarde = '1')     -- Aangevinkt
          AND o.cnt_contract_key = c.cnt_contract_key
          AND c.ins_discipline_key = 523               -- Variabele contracten
          AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
          AND c.cnt_contract_mantel_key = mc.cnt_contract_key(+)
          AND mc.prs_contactpersoon_key = cp.prs_contactpersoon_key(+)
          AND cp.prs_perslid_key = pcp.prs_perslid_key(+)
          AND c.prs_perslid_key_beh = pcm.prs_perslid_key
          AND o.mld_opdr_key = nr.mld_opdr_key(+)
   UNION ALL -- Variabele kosten uit ACTUAL opdrachten op variabele contracten-DISPUUT
   SELECT pcp.prs_afdeling_key,
          TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm') maand, -- Voor 1e ORDAFR, deze maand factureren (achteraf)
          b.prs_bedrijf_key,
          b.prs_bedrijf_naam,
          pcp.prs_perslid_key,
          DECODE (pcp.prs_perslid_geslacht, 0, 'Mevr. ', 1, 'Dhr. ', '')
             cp_aanhef,
          DECODE (
             COALESCE (pcp.prs_perslid_voorletters,
                       SUBSTR (pcp.prs_perslid_voornaam, 1, 1)),
             NULL, NULL,
             COALESCE (pcp.prs_perslid_voorletters,
                       SUBSTR (pcp.prs_perslid_voornaam, 1, 1) || '.')
             || ' ')
          || DECODE (pcp.prs_perslid_tussenvoegsel,
                     NULL, NULL,
                     pcp.prs_perslid_tussenvoegsel || ' ')
          || pcp.prs_perslid_naam
             cp_naam,
          pcp.prs_perslid_email cp_email,
          c.cnt_contract_key,
          COALESCE (c.cnt_contract_nummer_intern, '') || '/DISPUUT' cnt_contract_nummer_intern,
          c.cnt_contract_omschrijving,
          COALESCE (nr.mld_kenmerkopdr_waarde, c.cnt_contract_nummer) cnt_contract_nummer,
          DECODE (pcm.prs_perslid_geslacht, 0, 'Mevr. ', 1, 'Dhr. ', '')
             cm_aanhef,
          DECODE (
             COALESCE (pcm.prs_perslid_voorletters,
                       SUBSTR (pcm.prs_perslid_voornaam, 1, 1)),
             NULL, NULL,
             COALESCE (pcm.prs_perslid_voorletters,
                       SUBSTR (pcm.prs_perslid_voornaam, 1, 1) || '.')
             || ' ')
          || DECODE (pcm.prs_perslid_tussenvoegsel,
                     NULL, NULL,
                     pcm.prs_perslid_tussenvoegsel || ' ')
          || pcm.prs_perslid_naam
             cm_naam,
          NULL bes_bestelopdr_key,
          NULL res_rsv_ruimte_key,
          o.mld_opdr_key,
          TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr) bro_id,
          1 aantal,
          o.mld_opdr_kosten kosten -- Netto bedrag, want alle bedragen excl. BTW, toch?
     FROM mld_opdr o,
          cnt_contract c,
          prs_bedrijf b,
          cnt_contract mc,
          prs_contactpersoon cp,
          prs_perslid pcp,
          prs_perslid pcm,
          (SELECT ko.mld_opdr_key, ko.mld_kenmerkopdr_waarde
             FROM mld_v_aanwezigkenmerkopdr ko, mld_kenmerk k
            WHERE ko.mld_kenmerk_key = k.mld_kenmerk_key
                  AND k.mld_srtkenmerk_key = 961) nr           -- Inkoopnummer
    WHERE o.mld_statusopdr_key = 9
          AND fac.gettrackingdate ('ORDAFR', o.mld_opdr_key) BETWEEN TO_DATE ('20190101', 'yyyymmdd') AND TRUNC (SYSDATE, 'mm') -- Actual = Deze maand Afgerond (en nog niet Verwerkt)
          AND EXISTS                                -- Gemarkeerd als dispuut!
                (SELECT 1
                   FROM mld_v_aanwezigkenmerkopdr ko, mld_kenmerk k
                  WHERE ko.mld_opdr_key = o.mld_opdr_key
                        AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                        AND k.mld_srtkenmerk_key = 141              -- Dispuut
                        AND ko.mld_kenmerkopdr_waarde = '1')     -- Aangevinkt
          AND o.cnt_contract_key = c.cnt_contract_key
          AND c.ins_discipline_key = 523               -- Variabele contracten
          AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
          AND c.cnt_contract_mantel_key = mc.cnt_contract_key(+)
          AND mc.prs_contactpersoon_key = cp.prs_contactpersoon_key(+)
          AND cp.prs_perslid_key = pcp.prs_perslid_key(+)
          AND c.prs_perslid_key_beh = pcm.prs_perslid_key
          AND o.mld_opdr_key = nr.mld_opdr_key(+);

-- Te exporteren/bevriezen totalen over voorgaande maand (vast en variabel).
CREATE OR REPLACE VIEW kfsg_v_rap_actual_fact_tot
(
   fclt_3d_afdeling_key,                   -- Kunnen beperken per leverancier!
   maand,
   broc_flag,
   --hide_f_bedrijf_key,
   fclt_f_leverancier,
   --hide_f_contract_key,
   contractnr,
   beschrijving,
   inkoopordernr,
   aantal,
   kosten
)
AS
     SELECT prs_afdeling_key,
            maand,
            DECODE (bes_bestelopdr_key, NULL, DECODE (res_rsv_ruimte_key, NULL, DECODE (mld_opdr_key, NULL, 'C', 'O'), 'R'), 'B') broc_flag,
            --prs_bedrijf_key,
            prs_bedrijf_naam,
            --cnt_contract_key,
            contractnr,
            beschrijving,
            inkoopordernr,
            SUM (aantal),
            SUM (kosten)
       FROM kfsg_v_actual_fact
   GROUP BY prs_afdeling_key,
            maand,
            DECODE (bes_bestelopdr_key, NULL, DECODE (res_rsv_ruimte_key, NULL, DECODE (mld_opdr_key, NULL, 'C', 'O'), 'R'), 'B'),
            --prs_bedrijf_key,
            prs_bedrijf_naam,
            --cnt_contract_key,
            contractnr,
            beschrijving,
            inkoopordernr;

-- Te exporteren/bevriezen variabele bestelopdrachtkosten over voorgaande maand (details).
CREATE OR REPLACE VIEW kfsg_v_rap_actual_fact_bes
(
   fclt_3d_afdeling_key,                   -- Kunnen beperken per leverancier!
   maand,
   bes_bestelling_key,
   bes_bestelopdr_key,
   bes_id,
   plaats,
   ruimte,
   catalogus,
   besteldatum,
   leverdatum,
   bestellingstatus, -- Not used
   bestelopdrachtstatus,
   afhandeling, -- Not used
   fclt_f_leverancier,
   kosten,
   fclt_f_contractnr,
   fclt_f_inkoopordernr,
   fclt_x_district
)
AS
   SELECT v.prs_afdeling_key,
          v.maand,
          x.bes_bestelling_key,
          v.bes_bestelopdr_key,
          v.bro_id bes_id,
          COALESCE (l.alg_locatie_code, ma.mld_adres_naam) plaatsaanduiding,
          x.bes_bestelling_plaats ruimte,
          x.ins_discipline_omschrijving,
          bo.bes_bestelopdr_datum,
          bo.bes_bestelopdr_leverdatum,          -- Of uit FAC_TRACKING-tabel?
          bs.bes_bestellingstatuses_omschr, -- Status van onderliggende artikelen/delen betrekken?
          bos.bes_bestelopdrstatuses_omschr, -- Status van onderliggende artikelen/delen betrekken?
          COALESCE (bo.bes_bestelopdr_opmerking, bo.bes_bestelopdr_delivery_opmerk) afhandeling,
          v.prs_bedrijf_naam,
          v.kosten,
          v.contractnr,
          v.inkoopordernr,
          d.alg_district_omschrijving
     FROM kfsg_v_actual_fact v,
          bes_bestelopdr bo,
          (SELECT DISTINCT boi.bes_bestelopdr_key, b.bes_bestelling_key, b.mld_adres_key_lev, b.bes_bestelling_plaats, b.bes_bestelling_datum, b.bes_bestelling_status, td.ins_discipline_omschrijving
             FROM bes_bestelopdr_item boi, bes_bestelling_item bbi, bes_bestelling b, bes_srtdeel sd, bes_srtgroep sg, ins_tab_discipline td
            WHERE boi.bes_bestelopdr_item_key = bbi.bes_bestelopdr_item_key
                  AND bbi.bes_bestelling_key = b.bes_bestelling_key
                  AND bbi.bes_srtdeel_key = sd.bes_srtdeel_key
                  AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
                  AND sg.ins_discipline_key = td.ins_discipline_key) x,
          bes_bestellingstatuses bs,
          bes_bestelopdrstatuses bos,
          mld_adres ma,
          alg_locatie l,
          alg_district d
    WHERE v.bes_bestelopdr_key = bo.bes_bestelopdr_key
          AND bo.bes_bestelopdr_key = x.bes_bestelopdr_key
          AND x.bes_bestelling_status = bs.bes_bestellingstatuses_key(+)
          AND bo.bes_bestelopdr_status = bos.bes_bestelopdrstatuses_key(+)
          AND x.mld_adres_key_lev = ma.mld_adres_key(+)
          AND ma.alg_locatie_key = l.alg_locatie_key(+)
          AND l.alg_district_key = d.alg_district_key(+);

-- Te exporteren/bevriezen variabele reserveringskosten over voorgaande maand (details).
CREATE OR REPLACE VIEW kfsg_v_rap_actual_fact_res
(
   fclt_3d_afdeling_key,                   -- Kunnen beperken per leverancier!
   maand,
   res_reservering_key,
   res_rsv_ruimte_key,
   res_id,
   plaats,                                                           -- Gebouw
   ruimte,
   activiteit,
   omschrijving,
   van_datum, -- Not used
   van_tijd,
   tot_tijd,
   status,
   fclt_f_leverancier,
   kosten,
   fclt_f_contractnr,
   fclt_f_inkoopordernr,
   fclt_x_district
)
AS
   SELECT v.prs_afdeling_key,
          v.maand,
          rrr.res_reservering_key,
          v.res_rsv_ruimte_key,
          v.bro_id res_id,
          DECODE (
             og.alg_type,
             'R', og.alg_gebouw_code,
             'V', og.alg_gebouw_code,
             'G', og.alg_gebouw_code,
             'T', og.alg_terreinsector_code,
             l.alg_locatie_code)
             plaatsaanduiding,
          COALESCE ((SELECT res_ruimte_nr FROM res_ruimte WHERE res_ruimte_key = rro.res_ruimte_key), og.alg_plaatsaanduiding) ruimte,
          ra.res_activiteit_omschrijving,
          rrr.res_rsv_ruimte_omschrijving,
          rrr.res_rsv_ruimte_van,
          rrr.res_rsv_ruimte_van,
          rrr.res_rsv_ruimte_tot,
          rs.res_status_bo_omschrijving,
          v.prs_bedrijf_naam,
          v.kosten,
          v.contractnr,
          v.inkoopordernr,
          d.alg_district_omschrijving
     FROM kfsg_v_actual_fact v,
          res_rsv_ruimte rrr,
          res_activiteit ra,
          res_status_bo rs,
          res_ruimte_opstelling rro,
          (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
               FROM res_alg_ruimte
              WHERE res_alg_ruimte_verwijder IS NULL
           GROUP BY res_ruimte_key) rar1,
          (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
               FROM res_alg_ruimte
              WHERE res_alg_ruimte_verwijder IS NOT NULL
           GROUP BY res_ruimte_key) rar2,
          alg_v_onroerendgoed_gegevens og,
          alg_locatie l,
          alg_district d
    WHERE v.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
          AND rrr.res_activiteit_key = ra.res_activiteit_key
          AND rrr.res_status_bo_key = rs.res_status_bo_key(+) -- Status van onderliggende artikelen/delen betrekken?
          AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)
          AND rro.res_ruimte_key = rar1.res_ruimte_key(+)
          AND rro.res_ruimte_key = rar2.res_ruimte_key(+)
          AND COALESCE (rar1.alg_ruimte_key, rar2.alg_ruimte_key, rrr.alg_ruimte_key) = og.alg_ruimte_key
          AND og.alg_locatie_key = l.alg_locatie_key(+)
          AND l.alg_district_key = d.alg_district_key(+);

-- Te exporteren/bevriezen variabele opdrachtkosten over voorgaande maand (details).
CREATE OR REPLACE VIEW kfsg_v_rap_actual_fact_mld
(
   fclt_3d_afdeling_key,                   -- Kunnen beperken per leverancier!
   maand,
   prio,
   mld_melding_key,
   mld_opdr_key,
   opdr_id,
   plaats,                                                           -- Gebouw
   ruimte,
   mld_stdmelding_oms,
   opdrachttype,
   omschrijving,
   begindatum,
   einddatum,
   meldingstatus,
   opdrachtstatus,
   afhandeling,
   fclt_f_leverancier,
   kosten,
   fclt_f_contractnr,
   fclt_f_inkoopordernr,
   fclt_x_district
)
AS
   SELECT v.prs_afdeling_key,
          v.maand,
          TO_CHAR (m.mld_melding_spoed),
          m.mld_melding_key,
          o.mld_opdr_key,
          COALESCE (sd.ins_srtdiscipline_prefix, '') || v.bro_id opdr_id,
          DECODE (
             og.alg_type,
             'R', og.alg_gebouw_code,
             'V', og.alg_gebouw_code,
             'G', og.alg_gebouw_code,
             'T', og.alg_terreinsector_code,
             l.alg_locatie_code)
             plaatsaanduiding,
          DECODE (og.alg_type, 'R', og.alg_plaatsaanduiding, NULL) ruimte,
          sm.mld_stdmelding_omschrijving,
          ot.mld_typeopdr_omschrijving,
          o.mld_opdr_omschrijving,
          o.mld_opdr_datumbegin begindatum,
          --TO_CHAR (o.mld_opdr_einddatum, 'dd-mm-yyyy') einddatum,
          fac.gettrackingdate ('ORDAFM', o.mld_opdr_key) einddatum,
          ms.mld_statuses_omschrijving,
          os.mld_statusopdr_omschrijving,
          o.mld_opdr_opmerking,
          v.prs_bedrijf_naam,
          v.kosten,
          v.contractnr,
          v.inkoopordernr,
          d.alg_district_omschrijving
     FROM kfsg_v_actual_fact v,
          mld_opdr o,
          mld_statusopdr os,
          mld_typeopdr ot,
          mld_melding m,
          mld_statuses ms,
          mld_stdmelding sm,
          mld_discipline md,
          ins_srtdiscipline sd,
          alg_locatie l,
          alg_district d,
          alg_v_onroerendgoed_gegevens og
    WHERE v.mld_opdr_key = o.mld_opdr_key
          AND o.mld_statusopdr_key = os.mld_statusopdr_key
          AND o.mld_typeopdr_key = ot.mld_typeopdr_key
          AND o.mld_melding_key = m.mld_melding_key
          AND m.mld_melding_status = ms.mld_statuses_key
          AND m.mld_stdmelding_key = sm.mld_stdmelding_key
          AND sm.mld_ins_discipline_key = md.ins_discipline_key
          AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
          AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
          AND l.alg_district_key = d.alg_district_key(+)
          AND m.mld_alg_onroerendgoed_keys = og.alg_onroerendgoed_keys(+);

-- Frozen regels en basis voor oa. de notificatie op de 11e van de maand; voor
-- de output geldt:
-- Dat deze de frozen vaste contractkosten toont.
-- Dat deze de frozen variabele opdrachtkosten toont.
-- Dat deze de frozen variabele reserveringskosten toont.
-- Dat de laatst bevroren maand per bedrijf op de 11e wordt genotificeerd (via
-- extra_key-principe) met daarin de bedragen gegroepeerd per inkoopordernr.
CREATE OR REPLACE VIEW kfsg_v_frozen_fact
(
   prs_afdeling_key,
   maand,
   --prs_bedrijf_key,
   extra_key,                                                -- Moet zo heten!
   prs_bedrijf_naam,
   cp_perslid_key,
   cp_aanhef,
   cp_naam,
   cp_email,
   cnt_contract_key,
   contractnr,
   beschrijving,
   inkoopordernr,
   cm_aanhef,
   cm_naam,
   bes_bestelopdr_key,
   res_rsv_ruimte_key,
   mld_opdr_key,
   bro_id,
   factuur_naar_sg,
   aantal,
   kosten
)
AS
   SELECT pcp.prs_afdeling_key, -- Vaste contractkosten over de FROZEN termijnen
          SUBSTR (ud.fac_usrdata_code, 1, 7) maand,                 -- yyyy-mm
          b.prs_bedrijf_key,
          b.prs_bedrijf_naam,
          pcp.prs_perslid_key,
          DECODE (pcp.prs_perslid_geslacht, 0, 'Mevr. ', 1, 'Dhr. ', '')
             cp_aanhef,
          DECODE (
             COALESCE (pcp.prs_perslid_voorletters,
                       SUBSTR (pcp.prs_perslid_voornaam, 1, 1)),
             NULL, NULL,
             COALESCE (pcp.prs_perslid_voorletters,
                       SUBSTR (pcp.prs_perslid_voornaam, 1, 1) || '.')
             || ' ')
          || DECODE (pcp.prs_perslid_tussenvoegsel,
                     NULL, NULL,
                     pcp.prs_perslid_tussenvoegsel || ' ')
          || pcp.prs_perslid_naam
             cp_naam,
          pcp.prs_perslid_email,
          c.cnt_contract_key,
          c.cnt_contract_nummer_intern,
          c.cnt_contract_omschrijving,
          c.cnt_contract_nummer,
          DECODE (pcm.prs_perslid_geslacht, 0, 'Mevr. ', 1, 'Dhr. ', '')
             cm_aanhef,
          DECODE (
             COALESCE (pcm.prs_perslid_voorletters,
                       SUBSTR (pcm.prs_perslid_voornaam, 1, 1)),
             NULL, NULL,
             COALESCE (pcm.prs_perslid_voorletters,
                       SUBSTR (pcm.prs_perslid_voornaam, 1, 1) || '.')
             || ' ')
          || DECODE (pcm.prs_perslid_tussenvoegsel,
                     NULL, NULL,
                     pcm.prs_perslid_tussenvoegsel || ' ')
          || pcm.prs_perslid_naam
             cm_naam,
          NULL bes_bestelopdr_key,
          NULL res_rsv_ruimte_key,
          NULL mld_opdr_key,
          NULL bro_id,
          DECODE (kl.prs_kenmerklink_waarde, 1, 'Ja', 'Nee') fact2sg,
          0 aantal,
          ud.fac_usrdata_prijs kosten
     FROM fac_usrdata ud,
          cnt_contract c,
          prs_bedrijf b,
          cnt_contract mc,
          prs_contactpersoon cp,
          prs_perslid pcp,
          prs_perslid pcm,
          (SELECT *
             FROM prs_v_aanwezigkenmerklink
            WHERE prs_kenmerk_key = 1040) kl  -- Factuur rechtstreeks naar SG!
    WHERE ud.fac_usrtab_key = 161                            -- VasteKostenMnd
          AND SUBSTR (ud.fac_usrdata_code, INSTR (ud.fac_usrdata_code, '/') + 1) = TO_CHAR (c.cnt_contract_key)
          --AND SUBSTR (ud.fac_usrdata_omschr, 1, INSTR (ud.fac_usrdata_omschr, '/') - 1) =  TO_CHAR (b.prs_bedrijf_key)
          AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
          AND c.cnt_contract_mantel_key = mc.cnt_contract_key(+)
          AND mc.prs_contactpersoon_key = cp.prs_contactpersoon_key(+)
          AND cp.prs_perslid_key = pcp.prs_perslid_key(+)
          AND c.prs_perslid_key_beh = pcm.prs_perslid_key
          AND b.prs_bedrijf_key = kl.prs_link_key(+)
   UNION ALL -- Variabele kosten uit FROZEN bestelopdrachten op variabele contracten (via bes_bestelling_ordernr!)
     SELECT pcp.prs_afdeling_key,
            TO_CHAR (TRUNC (fac.gettrackingdate ('BES2VE', bo.bes_bestelopdr_key), 'mm') - 1, 'yyyy-mm') maand,
            b.prs_bedrijf_key,
            b.prs_bedrijf_naam bedrijf,
            pcp.prs_perslid_key,
            DECODE (pcp.prs_perslid_geslacht,
                    0, 'Mevr. ',
                    1, 'Dhr. ',
                    '')
               cp_aanhef,
            DECODE (
               COALESCE (pcp.prs_perslid_voorletters,
                         SUBSTR (pcp.prs_perslid_voornaam, 1, 1)),
               NULL, NULL,
               COALESCE (
                  pcp.prs_perslid_voorletters,
                  SUBSTR (pcp.prs_perslid_voornaam, 1, 1) || '.')
               || ' ')
            || DECODE (pcp.prs_perslid_tussenvoegsel,
                       NULL, NULL,
                       pcp.prs_perslid_tussenvoegsel || ' ')
            || pcp.prs_perslid_naam
               cp_naam,
            pcp.prs_perslid_email cp_email,
            c.cnt_contract_key,
            c.cnt_contract_nummer_intern, -- Uit deze maand lopend contract, anders geen variabele kosten
            c.cnt_contract_omschrijving,
            c.cnt_contract_nummer,
            DECODE (pcm.prs_perslid_geslacht,
                    0, 'Mevr. ',
                    1, 'Dhr. ',
                    '')
               cm_aanhef,
            DECODE (
               COALESCE (pcm.prs_perslid_voorletters,
                         SUBSTR (pcm.prs_perslid_voornaam, 1, 1)),
               NULL, NULL,
               COALESCE (
                  pcm.prs_perslid_voorletters,
                  SUBSTR (pcm.prs_perslid_voornaam, 1, 1) || '.')
               || ' ')
            || DECODE (pcm.prs_perslid_tussenvoegsel,
                       NULL, NULL,
                       pcm.prs_perslid_tussenvoegsel || ' ')
            || pcm.prs_perslid_naam
               cm_naam,
            bo.bes_bestelopdr_key,
            NULL res_rsv_ruimte_key,
            NULL mld_opdr_key,
            bo.bes_bestelopdr_id bro_id,
            DECODE (kl.prs_kenmerklink_waarde, 1, 'Ja', 'Nee') fact2sg,
            1 aantal,
            SUM ((boi.bes_bestelopdr_item_aantal * COALESCE (boi.bes_bestelopdr_item_inkprijs, boi.bes_bestelopdr_item_prijs)) +
                 COALESCE (bo.bes_bestelopdr_korting, 0) +
                 COALESCE (bo.bes_bestelopdr_levkosten, 0))
               kosten     -- Netto bedrag, want alle bedragen excl. BTW, toch?
       FROM bes_bestelling b,
            bes_bestelling_item bbi,
            bes_bestelopdr_item boi,
            bes_bestelopdr bo,
            cnt_v_aanwezigcontract c,
            prs_bedrijf b,
            cnt_contract mc,
            prs_contactpersoon cp,
            prs_perslid pcp,
            prs_perslid pcm,
            (SELECT *
               FROM prs_v_aanwezigkenmerklink
              WHERE prs_kenmerk_key = 1040) kl -- Factuur rechtstreeks naar SG!
      WHERE b.bes_bestelling_ordernr IS NOT NULL              -- Gefactureerd!
            AND b.bes_bestelling_key = bbi.bes_bestelling_key
            AND bbi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
            AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key
            AND bo.bes_bestelopdr_status = 7 -- Verwerkt (TODO: Soms >1 bestelopdrachten en niet allemaal Verwerkt???)
            --AND bo.prs_bedrijf_key = b.prs_bedrijf_key
            AND SUBSTR (b.bes_bestelling_ordernr, INSTR (b.bes_bestelling_ordernr, '/') + 1) = TO_CHAR (c.cnt_contract_key)
            --AND c.ins_discipline_key = 523 -- Variabele contracten (kan niet anders)
            AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
            AND c.cnt_contract_mantel_key = mc.cnt_contract_key(+)
            AND mc.prs_contactpersoon_key = cp.prs_contactpersoon_key(+)
            AND cp.prs_perslid_key = pcp.prs_perslid_key(+)
            AND c.prs_perslid_key_beh = pcm.prs_perslid_key
            AND b.prs_bedrijf_key = kl.prs_link_key(+)
   GROUP BY pcp.prs_afdeling_key,
            TO_CHAR (TRUNC (fac.gettrackingdate ('BES2VE', bo.bes_bestelopdr_key), 'mm') - 1, 'yyyy-mm'),
            b.prs_bedrijf_key,
            b.prs_bedrijf_naam,
            pcp.prs_perslid_key,
            DECODE (pcp.prs_perslid_geslacht,
                    0, 'Mevr. ',
                    1, 'Dhr. ',
                    ''),
            DECODE (
               COALESCE (pcp.prs_perslid_voorletters,
                         SUBSTR (pcp.prs_perslid_voornaam, 1, 1)),
               NULL, NULL,
               COALESCE (
                  pcp.prs_perslid_voorletters,
                  SUBSTR (pcp.prs_perslid_voornaam, 1, 1) || '.')
               || ' ')
            || DECODE (pcp.prs_perslid_tussenvoegsel,
                       NULL, NULL,
                       pcp.prs_perslid_tussenvoegsel || ' ')
            || pcp.prs_perslid_naam,
            pcp.prs_perslid_email,
            c.cnt_contract_key,
            c.cnt_contract_nummer_intern,
            c.cnt_contract_omschrijving,
            c.cnt_contract_nummer,
            DECODE (pcm.prs_perslid_geslacht,
                    0, 'Mevr. ',
                    1, 'Dhr. ',
                    ''),
            DECODE (
               COALESCE (pcm.prs_perslid_voorletters,
                         SUBSTR (pcm.prs_perslid_voornaam, 1, 1)),
               NULL, NULL,
               COALESCE (
                  pcm.prs_perslid_voorletters,
                  SUBSTR (pcm.prs_perslid_voornaam, 1, 1) || '.')
               || ' ')
            || DECODE (pcm.prs_perslid_tussenvoegsel,
                       NULL, NULL,
                       pcm.prs_perslid_tussenvoegsel || ' ')
            || pcm.prs_perslid_naam,
            bo.bes_bestelopdr_key,
            NULL,
            NULL,
            bo.bes_bestelopdr_id,
            DECODE (kl.prs_kenmerklink_waarde, 1, 'Ja', 'Nee'),
            1
   UNION ALL -- Variabele kosten uit FROZEN reserveringen op variabele contracten (via fin_verkoopfactuur_id!)
     SELECT x.prs_afdeling_key,
            SUBSTR (x.fin_verkoopfactuur_maand, 1, 4) || '-' || SUBSTR (x.fin_verkoopfactuur_maand, 5, 2) maand,
            x.prs_bedrijf_key,
            x.prs_bedrijf_naam bedrijf,
            x.prs_perslid_key,
            x.cp_aanhef,
            x.cp_naam,
            x.cp_email,
            x.cnt_contract_key,
            x.cnt_contract_nummer_intern,
            x.cnt_contract_omschrijving,
            x.cnt_contract_nummer,
            x.cm_aanhef,
            x.cm_naam,
            NULL bes_bestelopdr_key,
            x.res_rsv_ruimte_key,
            NULL mld_opdr_key,
            x.fin_verkoopfactuur_omschr bro_id,
            DECODE (x.prs_kenmerklink_waarde, 1, 'Ja', 'Nee') fact2sg,
            1 aantal,
            SUM (COALESCE (x.verw_prijs, x.prijs, 0)) kosten -- Netto bedrag, want alle bedragen excl. BTW, toch?
       FROM (SELECT pcp.prs_afdeling_key,
                    vf.fin_verkoopfactuur_maand,
                    b.prs_bedrijf_key,
                    b.prs_bedrijf_naam,
                    pcp.prs_perslid_key,
                    DECODE (pcp.prs_perslid_geslacht,
                            0, 'Mevr. ',
                            1, 'Dhr. ',
                            '')
                       cp_aanhef,
                    DECODE (
                       COALESCE (pcp.prs_perslid_voorletters,
                                 SUBSTR (pcp.prs_perslid_voornaam, 1, 1)),
                       NULL, NULL,
                       COALESCE (
                          pcp.prs_perslid_voorletters,
                          SUBSTR (pcp.prs_perslid_voornaam, 1, 1) || '.')
                       || ' ')
                    || DECODE (pcp.prs_perslid_tussenvoegsel,
                               NULL, NULL,
                               pcp.prs_perslid_tussenvoegsel || ' ')
                    || pcp.prs_perslid_naam
                       cp_naam,
                    pcp.prs_perslid_email cp_email,
                    c.cnt_contract_key,
                    c.cnt_contract_nummer_intern,
                    c.cnt_contract_omschrijving,
                    c.cnt_contract_nummer,
                    DECODE (pcm.prs_perslid_geslacht,
                            0, 'Mevr. ',
                            1, 'Dhr. ',
                            '')
                       cm_aanhef,
                    DECODE (
                       COALESCE (pcm.prs_perslid_voorletters,
                                 SUBSTR (pcm.prs_perslid_voornaam, 1, 1)),
                       NULL, NULL,
                       COALESCE (
                          pcm.prs_perslid_voorletters,
                          SUBSTR (pcm.prs_perslid_voornaam, 1, 1) || '.')
                       || ' ')
                    || DECODE (pcm.prs_perslid_tussenvoegsel,
                               NULL, NULL,
                               pcm.prs_perslid_tussenvoegsel || ' ')
                    || pcm.prs_perslid_naam
                       cm_naam,
                    rra.res_rsv_ruimte_key,
                    vf.fin_verkoopfactuur_omschr,
                    rra.res_rsv_artikel_prijs verw_prijs,
                    rra.res_rsv_artikel_aantal * ra.res_artikel_prijs prijs,
                    --DECODE (COALESCE (rra.res_rsv_artikel_btw, ra.res_artikel_btw), NULL, 'VH', 21, 'VH', 'VL')
                    --   btw,
                    kl.prs_kenmerklink_waarde
               FROM fin_verkoopfactuur vf,
                    res_v_aanwezigrsv_artikel rra,
                    res_artikel ra,
                    cnt_v_aanwezigcontract c,
                    prs_bedrijf b,
                    cnt_contract mc,
                    prs_contactpersoon cp,
                    prs_perslid pcp,
                    prs_perslid pcm,
                    (SELECT *
                       FROM prs_v_aanwezigkenmerklink
                      WHERE prs_kenmerk_key = 1040) kl -- Factuur rechtstreeks naar SG!
              WHERE vf.fin_verkoopfactuur_refkey = rra.res_rsv_artikel_key
                    --AND rra.res_status_bo_key = 6 -- Verwerkt (kan niet anders)
                    --AND rra.res_rsv_artikel_verwerkt IS NOT NULL -- Verwerkt (kan niet anders)
                    --AND rra.res_rsv_artikel_levering > TO_DATE ('20190101', 'yyyymmdd') -- Kan niet anders
                    AND rra.res_artikel_key = ra.res_artikel_key
                    AND fac.safe_to_number (vf.fin_verkoopfactuur_id) = c.cnt_contract_key
                    --AND c.ins_discipline_key = 523 -- Variabele contracten (kan niet anders)
                    AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
                    AND c.cnt_contract_mantel_key = mc.cnt_contract_key(+)
                    AND mc.prs_contactpersoon_key = cp.prs_contactpersoon_key(+)
                    AND cp.prs_perslid_key = pcp.prs_perslid_key(+)
                    AND c.prs_perslid_key_beh = pcm.prs_perslid_key
                    AND b.prs_bedrijf_key = kl.prs_link_key(+)) x
   GROUP BY x.prs_afdeling_key,
            SUBSTR (x.fin_verkoopfactuur_maand, 1, 4) || '-' || SUBSTR (x.fin_verkoopfactuur_maand, 5, 2),
            x.prs_bedrijf_key,
            x.prs_bedrijf_naam,
            x.prs_perslid_key,
            x.cp_aanhef,
            x.cp_naam,
            x.cp_email,
            x.cnt_contract_key,
            x.cnt_contract_nummer_intern,
            x.cnt_contract_omschrijving,
            x.cnt_contract_nummer,
            x.cm_aanhef,
            x.cm_naam,
            NULL,
            x.res_rsv_ruimte_key,
            NULL,
            x.fin_verkoopfactuur_omschr,
            DECODE (x.prs_kenmerklink_waarde, 1, 'Ja', 'Nee'),
            1
   UNION ALL -- Variabele kosten uit FROZEN opdrachten op variabele contracten
   SELECT pcp.prs_afdeling_key,
          o.mld_opdr_ordernr maand,
          b.prs_bedrijf_key,
          b.prs_bedrijf_naam,
          pcp.prs_perslid_key,
          DECODE (pcp.prs_perslid_geslacht, 0, 'Mevr. ', 1, 'Dhr. ', '')
             cp_aanhef,
          DECODE (
             COALESCE (pcp.prs_perslid_voorletters,
                       SUBSTR (pcp.prs_perslid_voornaam, 1, 1)),
             NULL,
             NULL,
             COALESCE (pcp.prs_perslid_voorletters,
                       SUBSTR (pcp.prs_perslid_voornaam, 1, 1) || '.')
             || ' ')
          || DECODE (pcp.prs_perslid_tussenvoegsel,
                     NULL, NULL,
                     pcp.prs_perslid_tussenvoegsel || ' ')
          || pcp.prs_perslid_naam
             cp_naam,
          pcp.prs_perslid_email,
          c.cnt_contract_key,
          c.cnt_contract_nummer_intern,
          c.cnt_contract_omschrijving,
          COALESCE (nr.mld_kenmerkopdr_waarde, c.cnt_contract_nummer) cnt_contract_nummer,
          DECODE (pcm.prs_perslid_geslacht, 0, 'Mevr. ', 1, 'Dhr. ', '')
             cm_aanhef,
          DECODE (
             COALESCE (pcm.prs_perslid_voorletters,
                       SUBSTR (pcm.prs_perslid_voornaam, 1, 1)),
             NULL, NULL,
             COALESCE (pcm.prs_perslid_voorletters,
                       SUBSTR (pcm.prs_perslid_voornaam, 1, 1) || '.')
             || ' ')
          || DECODE (pcm.prs_perslid_tussenvoegsel,
                     NULL, NULL,
                     pcm.prs_perslid_tussenvoegsel || ' ')
          || pcm.prs_perslid_naam
             cm_naam,
          NULL bes_bestelopdr_key,
          NULL res_rsv_ruimte_key,
          o.mld_opdr_key,
          TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr) bro_id,
          DECODE (kl.prs_kenmerklink_waarde, 1, 'Ja', 'Nee'),
          1 aantal,
          o.mld_opdr_kosten kosten -- Netto bedrag, want alle bedragen excl. BTW, toch?
     FROM mld_opdr o,
          cnt_contract c,
          prs_bedrijf b,
          cnt_contract mc,
          prs_contactpersoon cp,
          prs_perslid pcp,
          prs_perslid pcm,
          (SELECT ko.mld_opdr_key, ko.mld_kenmerkopdr_waarde
             FROM mld_v_aanwezigkenmerkopdr ko, mld_kenmerk k
            WHERE ko.mld_kenmerk_key = k.mld_kenmerk_key
                  AND k.mld_srtkenmerk_key = 961) nr,          -- Inkoopnummer
          (SELECT *
             FROM prs_v_aanwezigkenmerklink
            WHERE prs_kenmerk_key = 1040) kl  -- Factuur rechtstreeks naar SG!
    WHERE o.mld_opdr_ordernr IS NOT NULL                      -- Gefactureerd!
          --AND o.mld_statusopdr_key = 7           -- Verwerkt (kan niet anders)
          AND o.cnt_contract_key = c.cnt_contract_key
          --AND c.ins_discipline_key = 523 -- Variabele contracten (kan niet anders)
          AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
          AND c.cnt_contract_mantel_key = mc.cnt_contract_key(+)
          AND mc.prs_contactpersoon_key = cp.prs_contactpersoon_key(+)
          AND cp.prs_perslid_key = pcp.prs_perslid_key(+)
          AND c.prs_perslid_key_beh = pcm.prs_perslid_key
          AND o.mld_opdr_key = nr.mld_opdr_key(+)
          AND b.prs_bedrijf_key = kl.prs_link_key(+);

-- Geexporteerde/bevroren totalen over voorgaande maanden (vast en variabel).
CREATE OR REPLACE VIEW kfsg_v_rap_frozen_fact_tot
(
   fclt_3d_afdeling_key,                   -- Kunnen beperken per leverancier!
   maand,
   broc_flag,
   --hide_f_bedrijf_key,
   fclt_f_leverancier,
   --hide_f_contract_key,
   contractnr,
   beschrijving,
   inkoopordernr,
   aantal,
   kosten
)
AS                            -- Vaste contractkosten over de FROZEN termijnen
     SELECT prs_afdeling_key,
            maand,
            DECODE (bes_bestelopdr_key, NULL, DECODE (res_rsv_ruimte_key, NULL, DECODE (mld_opdr_key, NULL, 'C', 'O'), 'R'), 'B') broc_flag,
            --prs_bedrijf_key,
            prs_bedrijf_naam,
            --cnt_contract_key,
            contractnr,
            beschrijving,
            inkoopordernr,
            SUM (aantal),
            SUM (kosten)
       FROM kfsg_v_frozen_fact
   GROUP BY prs_afdeling_key,
            maand,
            DECODE (bes_bestelopdr_key, NULL, DECODE (res_rsv_ruimte_key, NULL, DECODE (mld_opdr_key, NULL, 'C', 'O'), 'R'), 'B'),
            --prs_bedrijf_key,
            prs_bedrijf_naam,
            --cnt_contract_key,
            contractnr,
            beschrijving,
            inkoopordernr;

-- Geexporteerde/bevroren variabele bestelopdrachtkosten over voorgaande maanden (details).
CREATE OR REPLACE VIEW kfsg_v_rap_frozen_fact_bes
(
   fclt_3d_afdeling_key,                   -- Kunnen beperken per leverancier!
   maand,
   bes_bestelling_key,
   bes_bestelopdr_key,
   bes_id,
   plaats,
   ruimte,
   catalogus,
   besteldatum,
   leverdatum,
   bestellingstatus, -- Not used
   bestelopdrachtstatus,
   afhandeling, -- Not used
   fclt_f_leverancier,
   kosten,
   fclt_f_contractnr,
   fclt_f_inkoopordernr,
   fclt_x_district
)
AS
   SELECT v.prs_afdeling_key,
          v.maand,
          x.bes_bestelling_key,
          v.bes_bestelopdr_key,
          v.bro_id bes_id,
          COALESCE (l.alg_locatie_code, ma.mld_adres_naam) plaatsaanduiding,
          x.bes_bestelling_plaats ruimte,
          x.ins_discipline_omschrijving,
          bo.bes_bestelopdr_datum,
          bo.bes_bestelopdr_leverdatum,          -- Of uit FAC_TRACKING-tabel?
          bs.bes_bestellingstatuses_omschr, -- Status van onderliggende artikelen/delen betrekken?
          bos.bes_bestelopdrstatuses_omschr, -- Status van onderliggende artikelen/delen betrekken?
          COALESCE (bo.bes_bestelopdr_opmerking, bo.bes_bestelopdr_delivery_opmerk) afhandeling,
          v.prs_bedrijf_naam,
          v.kosten,
          v.contractnr,
          v.inkoopordernr,
          d.alg_district_omschrijving
     FROM kfsg_v_frozen_fact v,
          bes_bestelopdr bo,
          (SELECT DISTINCT boi.bes_bestelopdr_key, b.bes_bestelling_key, b.mld_adres_key_lev, b.bes_bestelling_plaats, b.bes_bestelling_datum, b.bes_bestelling_status, td.ins_discipline_omschrijving
             FROM bes_bestelopdr_item boi, bes_bestelling_item bbi, bes_bestelling b, bes_srtdeel sd, bes_srtgroep sg, ins_tab_discipline td
            WHERE boi.bes_bestelopdr_item_key = bbi.bes_bestelopdr_item_key
                  AND bbi.bes_bestelling_key = b.bes_bestelling_key
                  AND bbi.bes_srtdeel_key = sd.bes_srtdeel_key
                  AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
                  AND sg.ins_discipline_key = td.ins_discipline_key) x,
          bes_bestellingstatuses bs,
          bes_bestelopdrstatuses bos,
          mld_adres ma,
          alg_locatie l,
          alg_district d
    WHERE v.bes_bestelopdr_key = bo.bes_bestelopdr_key
          AND bo.bes_bestelopdr_key = x.bes_bestelopdr_key
          AND x.bes_bestelling_status = bs.bes_bestellingstatuses_key(+)
          AND bo.bes_bestelopdr_status = bos.bes_bestelopdrstatuses_key(+)
          AND x.mld_adres_key_lev = ma.mld_adres_key(+)
          AND ma.alg_locatie_key = l.alg_locatie_key(+)
          AND l.alg_district_key = d.alg_district_key(+);

-- Geexporteerde/bevroren variabele reserveringskosten over voorgaande maanden (details).
CREATE OR REPLACE VIEW kfsg_v_rap_frozen_fact_res
(
   fclt_3d_afdeling_key,                   -- Kunnen beperken per leverancier!
   maand,
   res_reservering_key,
   res_rsv_ruimte_key,
   res_id,
   plaats,                                                           -- Gebouw
   ruimte,
   activiteit,
   omschrijving,
   van_datum, -- Not used
   van_tijd,
   tot_tijd,
   status,
   fclt_f_leverancier,
   kosten,
   fclt_f_contractnr,
   fclt_f_inkoopordernr,
   fclt_x_district
)
AS
   SELECT v.prs_afdeling_key,
          v.maand,
          rrr.res_reservering_key,
          v.res_rsv_ruimte_key,
          v.bro_id res_id,
          DECODE (
             og.alg_type,
             'R', og.alg_gebouw_code,
             'V', og.alg_gebouw_code,
             'G', og.alg_gebouw_code,
             'T', og.alg_terreinsector_code,
             l.alg_locatie_code)
             plaatsaanduiding,
          COALESCE ((SELECT res_ruimte_nr FROM res_ruimte WHERE res_ruimte_key = rro.res_ruimte_key), og.alg_plaatsaanduiding) ruimte,
          ra.res_activiteit_omschrijving,
          rrr.res_rsv_ruimte_omschrijving,
          rrr.res_rsv_ruimte_van,
          rrr.res_rsv_ruimte_van,
          rrr.res_rsv_ruimte_tot,
          rs.res_status_bo_omschrijving,
          v.prs_bedrijf_naam,
          v.kosten,
          v.contractnr,
          v.inkoopordernr,
          d.alg_district_omschrijving
     FROM kfsg_v_frozen_fact v,
          res_rsv_ruimte rrr,
          res_activiteit ra,
          res_status_bo rs,
          res_ruimte_opstelling rro,
          (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
               FROM res_alg_ruimte
              WHERE res_alg_ruimte_verwijder IS NULL
           GROUP BY res_ruimte_key) rar1,
          (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
               FROM res_alg_ruimte
              WHERE res_alg_ruimte_verwijder IS NOT NULL
           GROUP BY res_ruimte_key) rar2,
          alg_v_onroerendgoed_gegevens og,
          alg_locatie l,
          alg_district d
    WHERE v.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
          AND rrr.res_activiteit_key = ra.res_activiteit_key
          AND rrr.res_status_bo_key = rs.res_status_bo_key(+) -- Status van onderliggende artikelen/delen betrekken?
          AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)
          AND rro.res_ruimte_key = rar1.res_ruimte_key(+)
          AND rro.res_ruimte_key = rar2.res_ruimte_key(+)
          AND COALESCE (rar1.alg_ruimte_key, rar2.alg_ruimte_key, rrr.alg_ruimte_key) = og.alg_ruimte_key
          AND og.alg_locatie_key = l.alg_locatie_key(+)
          AND l.alg_district_key = d.alg_district_key(+);

-- Geexporteerde/bevroren variabele opdrachtkosten over voorgaande maanden (details).
CREATE OR REPLACE VIEW kfsg_v_rap_frozen_fact_mld
(
   fclt_3d_afdeling_key,                   -- Kunnen beperken per leverancier!
   maand,
   prio,
   mld_melding_key,
   mld_opdr_key,
   opdr_id,
   plaats,                                                           -- Gebouw
   ruimte,
   mld_stdmelding_oms,
   opdrachttype,
   omschrijving,
   begindatum,
   einddatum,
   meldingstatus,
   opdrachtstatus,
   afhandeling,
   fclt_f_leverancier,
   kosten,
   fclt_f_contractnr,
   fclt_f_inkoopordernr,
   fclt_x_district
)
AS
   SELECT v.prs_afdeling_key,
          v.maand,
          TO_CHAR (m.mld_melding_spoed),
          m.mld_melding_key,
          o.mld_opdr_key,
          COALESCE (sd.ins_srtdiscipline_prefix, '') || v.bro_id opdr_id,
          DECODE (
             og.alg_type,
             'R', og.alg_gebouw_code,
             'V', og.alg_gebouw_code,
             'G', og.alg_gebouw_code,
             'T', og.alg_terreinsector_code,
             l.alg_locatie_code)
             plaatsaanduiding,
          DECODE (og.alg_type, 'R', og.alg_plaatsaanduiding, NULL) ruimte,
          sm.mld_stdmelding_omschrijving,
          ot.mld_typeopdr_omschrijving,
          o.mld_opdr_omschrijving,
          o.mld_opdr_datumbegin begindatum,
          --TO_CHAR (o.mld_opdr_einddatum, 'dd-mm-yyyy') einddatum,
          fac.gettrackingdate ('ORDAFM', o.mld_opdr_key) einddatum,
          ms.mld_statuses_omschrijving,
          os.mld_statusopdr_omschrijving,
          o.mld_opdr_opmerking,
          v.prs_bedrijf_naam,
          o.mld_opdr_kosten,
          v.contractnr,
          v.inkoopordernr,
          d.alg_district_omschrijving
     FROM kfsg_v_frozen_fact v,
          mld_opdr o,
          mld_statusopdr os,
          mld_typeopdr ot,
          mld_melding m,
          mld_statuses ms,
          mld_stdmelding sm,
          mld_discipline md,
          ins_srtdiscipline sd,
          alg_locatie l,
          alg_district d,
          alg_v_onroerendgoed_gegevens og
    WHERE v.mld_opdr_key = o.mld_opdr_key
          AND o.mld_statusopdr_key = os.mld_statusopdr_key
          AND o.mld_typeopdr_key = ot.mld_typeopdr_key
          AND o.mld_melding_key = m.mld_melding_key
          AND m.mld_melding_status = ms.mld_statuses_key
          AND m.mld_stdmelding_key = sm.mld_stdmelding_key
          AND sm.mld_ins_discipline_key = md.ins_discipline_key
          AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
          AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
          AND l.alg_district_key = d.alg_district_key(+)
          AND m.mld_alg_onroerendgoed_keys = og.alg_onroerendgoed_keys(+);

CREATE OR REPLACE PROCEDURE kfsg_select_fact (p_applname   IN VARCHAR2,
                                              p_applrun    IN VARCHAR2)
AS
   -- Bevries vaste contractkosten in eigen tabel.
   CURSOR c1
   IS
        SELECT DISTINCT '[' || TO_CHAR (v.cnt_contract_key) || '] ' aanduiding,
               v.maand, v.cnt_contract_key, v.prs_bedrijf_key, v.inkoopordernr, v.kosten
          FROM kfsg_v_actual_fact v
         WHERE v.bes_bestelopdr_key IS NULL AND v.res_rsv_ruimte_key IS NULL AND v.mld_opdr_key IS NULL
      ORDER BY 3;

   -- Zet "variabele" BES-bestelopdrachten die voor de 1e zijn geleverd op AV.
   -- Alleen op variabele contracten.
   CURSOR c2
   IS
        SELECT DISTINCT '[' || TO_CHAR (v.bes_bestelopdr_key) || '|' || v.bro_id || '] ' aanduiding,
               v.maand, v.bes_bestelopdr_key, bbi.bes_bestelling_key, v.cnt_contract_key
          FROM kfsg_v_actual_fact v, bes_bestelopdr_item boi, bes_bestelling_item bbi
         WHERE v.bes_bestelopdr_key = boi.bes_bestelopdr_key
               AND boi.bes_bestelopdr_item_key = bbi.bes_bestelopdr_item_key
      ORDER BY 3;

   -- Zet "variabele" RES-cateringregels die voor de 1e hebben plaatsgevonden op AV
   -- en meld - zover niet al gebeurd - de deelreservering af (in juiste volgorde).
   -- Alleen op variabele contracten.
   CURSOR c3
   IS
        SELECT DISTINCT '[' || TO_CHAR (v.res_rsv_ruimte_key) || '|' || v.bro_id || '] ' aanduiding,
               v.maand, v.res_rsv_ruimte_key,
               rra.res_status_bo_key,
               rra.res_rsv_artikel_key, rra.res_artikel_key,
               v.cnt_contract_key, v.bro_id, v.prs_bedrijf_key, v.prs_bedrijf_naam
         FROM kfsg_v_actual_fact v, res_v_aanwezigrsv_artikel rra
         WHERE v.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
        UNION ALL
        SELECT DISTINCT '[' || TO_CHAR (v.res_rsv_ruimte_key) || '|' || v.bro_id || '] ' aanduiding,
               v.maand, v.res_rsv_ruimte_key,
               rrr.res_status_bo_key,
               NULL res_rsv_artikel_key, NULL res_artikel_key,
               v.cnt_contract_key, v.bro_id, v.prs_bedrijf_key, v.prs_bedrijf_naam
          FROM kfsg_v_actual_fact v, res_v_aanwezigrsv_ruimte rrr
         WHERE v.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
      ORDER BY 1, 5, 3;

   -- Zet "variabele" MLD-opdrachten die voor de 1e zijn afgerond op AV.
   -- Alleen op variabele contracten én geen dispuut.
   CURSOR c4
   IS
        SELECT DISTINCT '[' || TO_CHAR (v.mld_opdr_key) || '|' || v.bro_id || '] ' aanduiding,
               v.maand, v.mld_opdr_key
          FROM kfsg_v_actual_fact v
         WHERE v.mld_opdr_key IS NOT NULL
               AND v.contractnr NOT LIKE '%/DISPUUT'
      ORDER BY 3;

   -- Zet "inclusief" opdrachten die voor de 1e zijn gesloten op AV.
   -- Afgerond/kosten meerekenen op vaste contracten en geen dispuut
   -- Afgemeld/kosten niet meerekenen, geen offerteaanvraag en geen dispuut
   -- Afgerond/kosten niet meerekenen en geen dispuut (= geaccepteerde offerteaanvragen)
   CURSOR c5
   IS
      SELECT DISTINCT '[' || TO_CHAR (o.mld_opdr_key) || '] ' aanduiding,
             o.mld_opdr_key
        FROM mld_opdr o, mld_typeopdr ot, cnt_contract c
       WHERE o.mld_statusopdr_key = 9                                    -- KV
             AND o.mld_typeopdr_key = ot.mld_typeopdr_key
             AND ot.mld_typeopdr_kosten = 1            -- Kosten meerekenen=Ja
             AND o.cnt_contract_key = c.cnt_contract_key
             AND c.ins_discipline_key = 522                -- Vaste contracten
             AND NOT EXISTS                    -- Niet gemarkeerd als dispuut!
                   (SELECT 1
                      FROM mld_v_aanwezigkenmerkopdr ko, mld_kenmerk k
                     WHERE ko.mld_opdr_key = o.mld_opdr_key
                           AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                           AND k.mld_srtkenmerk_key = 141           -- Dispuut
                           AND ko.mld_kenmerkopdr_waarde = '1')  -- Aangevinkt
             AND fac.gettrackingdate ('ORDAFR', o.mld_opdr_key) BETWEEN TO_DATE ('20190101', 'yyyymmdd') AND TRUNC (SYSDATE, 'mm')
      UNION ALL
      SELECT DISTINCT '[' || TO_CHAR (o.mld_opdr_key) || '] ' aanduiding,
             o.mld_opdr_key
        FROM mld_opdr o, mld_typeopdr ot
       WHERE o.mld_statusopdr_key = 6                                    -- TV
             AND o.mld_typeopdr_key = ot.mld_typeopdr_key
             AND ot.mld_typeopdr_kosten = 0           -- Kosten meerekenen=Nee
             AND ot.mld_typeopdr_key != 220                 -- Offerteaanvraag
             AND NOT EXISTS                    -- Niet gemarkeerd als dispuut!
                   (SELECT 1
                      FROM mld_v_aanwezigkenmerkopdr ko, mld_kenmerk k
                     WHERE ko.mld_opdr_key = o.mld_opdr_key
                           AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                           AND k.mld_srtkenmerk_key = 141           -- Dispuut
                           AND ko.mld_kenmerkopdr_waarde = '1')  -- Aangevinkt
             AND fac.gettrackingdate ('ORDAFM', o.mld_opdr_key) BETWEEN TO_DATE ('20190101', 'yyyymmdd') AND TRUNC (SYSDATE, 'mm')
      UNION ALL
      SELECT DISTINCT '[' || TO_CHAR (o.mld_opdr_key) || '] ' aanduiding,
             o.mld_opdr_key
        FROM mld_opdr o, mld_typeopdr ot
       WHERE o.mld_statusopdr_key = 9 -- KV (ooit met kosten en Offerteaanvragen)
             AND o.mld_typeopdr_key = ot.mld_typeopdr_key
             AND ot.mld_typeopdr_kosten = 0           -- Kosten meerekenen=Nee
             AND NOT EXISTS                    -- Niet gemarkeerd als dispuut!
                   (SELECT 1
                      FROM mld_v_aanwezigkenmerkopdr ko, mld_kenmerk k
                     WHERE ko.mld_opdr_key = o.mld_opdr_key
                           AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                           AND k.mld_srtkenmerk_key = 141           -- Dispuut
                           AND ko.mld_kenmerkopdr_waarde = '1')  -- Aangevinkt
             AND (fac.gettrackingdate ('ORDAFR', o.mld_opdr_key) BETWEEN TO_DATE ('20190101', 'yyyymmdd') AND TRUNC (SYSDATE, 'mm')
                  OR fac.gettrackingdate ('ORDOOK', o.mld_opdr_key) BETWEEN TO_DATE ('20190101', 'yyyymmdd') AND TRUNC (SYSDATE, 'mm'))
      ORDER BY 2;

   v_errormsg                VARCHAR2 (1000);
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   v_count                   NUMBER (10);
   v_verkoopfactuurkop_key   NUMBER (10);
   v_prijs                   NUMBER (9, 2);
BEGIN
   -- Op 10e dag van de maand (via scheduled task):
   -- 1. Bevries vaste contractkosten in eigen tabel (incl. malus?).
   -- 2. Zet "variabele" bestelopdrachten die voor de 1e zijn geleverd op AV.
   -- 3. Zet "variabele" catering-reserveringen die voor de 1e hebben plaatsgevonden op AV.
   -- 4. Zet "variabele" opdrachten die voor de 1e zijn afgerond op AV.
   -- 5. Zet "inclusief" opdrachten die voor de 1e zijn gesloten op AV.
   -- x. Doe niets met afgewezen/geannuleerde opdrachten?

   v_count := 0;

   FOR rec IN c1
   LOOP
      BEGIN
         v_errormsg := 'Fout toevoegen vaste contractkosten';

         INSERT INTO fac_usrdata (fac_usrtab_key,
                                  fac_usrdata_code,
                                  fac_usrdata_omschr,
                                  fac_usrdata_aanmaak,
                                  fac_usrdata_vervaldatum,
                                  fac_usrdata_prijs)
             VALUES (161,                                    -- VasteKostenMnd
                     rec.maand || '/' || TO_CHAR (rec.cnt_contract_key),
                     TO_CHAR (rec.prs_bedrijf_key) || '/' || rec.inkoopordernr, -- TODO: Of weg?
                     SYSDATE,
                     NULL,
                     rec.kosten);

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

   fac.writelog (p_applname, 'S', '#Vaste contractkosten bevroren: ' || TO_CHAR (v_count), '');
   COMMIT;

   v_count := 0;

   FOR rec IN c2
   LOOP
      BEGIN
         v_errormsg := 'Fout bijwerken ordernummer (BES).';

         UPDATE bes_bestelling
            SET bes_bestelling_ordernr = rec.maand || '/' || TO_CHAR (rec.cnt_contract_key)
          WHERE bes_bestelling_key = rec.bes_bestelling_key;

         v_errormsg := 'Fout bijwerken status (BES).';

         BES.setbestelopdrstatus (rec.bes_bestelopdr_key, 7, 3);
         BES.setbestellingstatus (rec.bes_bestelling_key, 7, 3); -- TODO: Soms >1 bestelopdrachten???

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

   fac.writelog (p_applname, 'S', '#Variabele bestelopdrachten bevroren: ' || TO_CHAR (v_count), '');
   COMMIT;

   -- Maak elke factuurrun voor elke reverse te billen res_rsv_xxx-regel een
   -- fin_verkoopfactuur-regel aan onder dezelfde fin_verkoopfactuurkop (één
   -- kop per maand)!
   INSERT INTO fin_verkoopfactuurkop (fin_verkoopfactuurkop_id)
       VALUES ('RES-billing' || TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm'))
    RETURNING fin_verkoopfactuurkop_key
         INTO v_verkoopfactuurkop_key;
   COMMIT;

   v_count := 0;

   FOR rec IN c3
   LOOP
      BEGIN
         IF rec.res_rsv_artikel_key IS NOT NULL
         THEN                                                -- Catering-regel
            IF rec.res_status_bo_key = 2
            THEN
               v_errormsg := 'Fout bepalen res_rsv_artikel_prijs';

               SELECT res.getartikelprijs (rec.res_rsv_artikel_key)
                 INTO v_prijs
                 FROM DUAL;

               v_errormsg := 'Fout afmelden res_rsv_artikel';

               UPDATE res_rsv_artikel
                  SET res_status_bo_key = 5,
                      res_rsv_artikel_prijs = v_prijs,
                      res_rsv_artikel_inkoopprijs =
                         (SELECT res_artikel_inkoopprijs
                            FROM res_artikel
                           WHERE res_artikel_key = rec.res_artikel_key),
                      res_rsv_artikel_btw =
                         (SELECT res_artikel_btw
                            FROM res_artikel
                           WHERE res_artikel_key = rec.res_artikel_key)
                WHERE res_rsv_artikel_key = rec.res_rsv_artikel_key;

               v_errormsg := 'Fout tracken afmelding catering';

               fac.trackaction ('RESAFM', rec.res_rsv_ruimte_key, NULL, NULL, 'Catering afgemeld');
            END IF;

            IF rec.res_status_bo_key != 6
            THEN
               v_errormsg := 'Fout verwerken res_rsv_artikel';

               UPDATE res_rsv_artikel
                  SET res_status_bo_key = 6   -- AV (en zet ook Verwerkt-date)
                WHERE res_rsv_artikel_key = rec.res_rsv_artikel_key;

               v_errormsg := 'Fout tracken verwerking catering';

               fac.trackaction ('RESVER', rec.res_rsv_ruimte_key, NULL, NULL, 'Catering verwerkt');
            END IF;

            v_errormsg := 'Fout toevoegen verkoopfactuur';

            INSERT INTO fin_verkoopfactuur (fin_verkoopfactuurkop_key,
                                            fin_verkoopfactuur_id,
                                            fin_verkoopfactuur_datum,
                                            fin_verkoopfactuur_omschr,
                                            fin_verkoopfactuur_xmlnode,
                                            fin_verkoopfactuur_refkey,
                                            prs_bedrijf_key,
                                            prs_debiteur_naam,
                                            fin_verkoopfactuur_bedrag,
                                            fin_verkoopfactuur_maand)
                VALUES (v_verkoopfactuurkop_key,
                        TO_CHAR (rec.cnt_contract_key),            -- Contract
                        SYSDATE,
                        rec.bro_id,
                        '',  -- Er bestaat geen xml-node voor res_rsv_artikel!
                        rec.res_rsv_artikel_key,
                        rec.prs_bedrijf_key,    -- Leverancier-key (crediteur)
                        rec.prs_bedrijf_naam,  -- Leverancier-naam (crediteur)
                        v_prijs, -- Netto bedrag, want alle bedragen excl. BTW, toch?
                        SUBSTR (rec.maand, 1, 4) || SUBSTR (rec.maand, 6, 2));

            v_count := v_count + 1;
            COMMIT;
         ELSE                                                  -- Ruimte-regel
            IF rec.res_status_bo_key = 2
            THEN
               v_errormsg := 'Fout bepalen res_rsv_ruimte_prijs';

               SELECT res.getruimteprijs (rec.res_rsv_ruimte_key)
                 INTO v_prijs
                 FROM DUAL;

               v_errormsg := 'Fout afmelden res_rsv_ruimte';

               UPDATE res_rsv_ruimte
                  SET res_status_bo_key = 5,
                      res_rsv_ruimte_prijs = v_prijs
                WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

               v_errormsg := 'Fout tracken afmelding ruimte';

               fac.trackaction ('RESAFM', rec.res_rsv_ruimte_key, NULL, NULL, NULL);
            END IF;

            -- Contract kan niet via RES-ordernr historisch worden opgeslagen,
            -- want onder één res_rsv_ruimte kunnen de artikelen per catalogus
            -- worden gefactureerd aan een verschillende leverancier!
            --v_errormsg := 'Fout bijwerken ordernummer (RES).';

            --UPDATE res_rsv_ruimte
            --   SET res_rsv_ruimte_ordernr = TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm') || '/' || TO_CHAR (rec.cnt_contract_key)
            -- WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key;
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
            fac.writelog (p_applname, 'W', rec.aanduiding || v_errormsg, 'FACT-RAV');
            COMMIT;
      END;
   END LOOP;

   fac.writelog (p_applname, 'S', '#Variabele cateringregels bevroren: ' || TO_CHAR (v_count), '');
   COMMIT;

   v_count := 0;

   FOR rec IN c4
   LOOP
      BEGIN
         v_errormsg := 'Fout bijwerken ordernummer (MLD).';

         UPDATE mld_opdr
            SET mld_opdr_ordernr = rec.maand
          WHERE mld_opdr_key = rec.mld_opdr_key;

         v_errormsg := 'Fout bijwerken status (MLD).';

         MLD.setopdrachtstatus (rec.mld_opdr_key, 7, 3);

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

   fac.writelog (p_applname, 'S', '#Variabele opdrachten bevroren: ' || TO_CHAR (v_count), '');
   COMMIT;

   v_count := 0;

   FOR rec IN c5
   LOOP
      BEGIN
         v_errormsg := 'Fout bijwerken status (inclusief opdrachten).';

         MLD.setopdrachtstatus (rec.mld_opdr_key, 7, 3);

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

   fac.writelog (p_applname, 'S', '#Inclusief opdrachten bevroren: ' || TO_CHAR (v_count), '');
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.writelog (p_applname, 'E', v_errormsg, 'Proces FACT_EXPORT afgebroken!');
      COMMIT;
END;
/

CREATE OR REPLACE VIEW kfsg_v_noti_te_factureren
(
   code,
   sender,
   receiver,
   text,
   key,
   xkey
)
AS
   WITH cp
           AS (SELECT cp1.prs_bedrijf_key, p1.prs_perslid_key
                 FROM prs_v_aanwezigkenmerklink kl1, prs_contactpersoon cp1, prs_v_aanwezigperslid p1
                WHERE kl1.prs_kenmerk_key = 1020 -- Contactpersoon factuurnotificatie!
                      AND kl1.prs_link_key = cp1.prs_contactpersoon_key
                      AND cp1.prs_contactpersoon_verwijder IS NULL
                      AND cp1.prs_perslid_key = p1.prs_perslid_key)
   SELECT DISTINCT sn.fac_srtnotificatie_code,
          NULL,
          --cp.prs_perslid_key, -- Leverancier-contactpersonen (met noti-vinkje)
          63681,                                          -- Maartje Vreijling
          REPLACE (REPLACE (sn.fac_srtnotificatie_oms, '##LEV##', v.prs_bedrijf_naam), '##MND##', v.maand),
          r.fac_usrrap_key,
          v.extra_key
     FROM kfsg_v_frozen_fact v,
          cp cp,
          fac_usrrap r,
          fac_srtnotificatie sn
    WHERE TO_CHAR (SYSDATE, 'dd') = '11' -- Op de ochtend na 10e van de maand!
          AND v.maand = TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm')
          AND v.extra_key = cp.prs_bedrijf_key
          AND UPPER (r.fac_usrrap_view_name) = 'KFSG_V_FROZEN_FACT'
          AND sn.fac_srtnotificatie_code = 'CUST01'
   UNION ALL
   SELECT DISTINCT sn.fac_srtnotificatie_code,
          NULL,
          gg.prs_perslid_key,                      -- Schiphol-contactpersonen
          REPLACE (sn.fac_srtnotificatie_oms, '##MND##', v.maand),
          r.fac_usrrap_key,
          NULL                      -- Geen extra_key, dus de hele rapportage!
     FROM kfsg_v_frozen_fact v,
          fac_gebruikersgroep gg,
          fac_usrrap r,
          fac_srtnotificatie sn
    WHERE TO_CHAR (SYSDATE, 'dd') = '11' -- Op de ochtend na 10e van de maand!
          AND v.maand = TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm')
          AND gg.fac_groep_key = 281               -- Schiphol Finance/Control
          AND UPPER (r.fac_usrrap_view_name) = 'KFSG_V_FROZEN_FACT'
          AND sn.fac_srtnotificatie_code = 'CUST02';

-- Kostenoverzicht
CREATE OR REPLACE VIEW kfsg_v_rap_costs_suppl_dep
AS
    SELECT pf.prs_perslid_naam_full naam,
           m.mld_melding_onderwerp omschrijving,
           a.prs_afdeling_omschrijving
               afdeling,
           prs_kostenplaats_nr kostenplaats,
           m.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr
               referentie,
           'opdracht'
               typekosten,
           COALESCE (SUBSTR (a.prs_afdeling_omschrijving,
                             1,
                               INSTR (a.prs_afdeling_omschrijving,
                                      '/',
                                      1,
                                      2)
                             - 1),
                     a.prs_afdeling_omschrijving)
               afdeling2,
           d.prs_dienst_omschrijving dienst,
           NULL toelichting,
           b.prs_bedrijf_naam
               bedrijf,
           FAC.gettrackingdate ('ORDNEW',mld_opdr_key) datum_aanmaak,
           mld_opdr_datumbegin datum_levering,
           FAC.gettrackingdate ('ORDAFR',mld_opdr_key) datum_afmeld,
           mld_opdr_kosten
               kosten
      FROM mld_opdr      o,
           mld_melding   m,
           prs_perslid   p,
           prs_afdeling  a,
           prs_kostenplaats k,
           prs_bedrijf   b,
           prs_dienst    d,
           mld_stdmelding std,
           prs_v_perslid_fullnames pf
     WHERE     o.mld_melding_key = m.mld_melding_key
           AND m.mld_stdmelding_key = std.mld_stdmelding_key
           AND std.prs_dienst_key = d.prs_dienst_key(+)
           AND m.prs_perslid_key = p.prs_perslid_key
           AND p.prs_afdeling_key = a.prs_afdeling_key
           AND a.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
           AND o.mld_typeopdr_key IN (521,
                                      218,
                                      219,
                                      961) -- opdr type = 521 adm opdr, 218 mandaatopdr, 219 offerteopdr, 961 offertopdr
           AND o.mld_statusopdr_key IN (6, 7, 9) -- afgemeld, verwerkt en afgerond.
           AND o.mld_uitvoerende_keys = b.prs_bedrijf_key
           AND p.prs_perslid_key = pf.prs_perslid_key
    UNION ALL
    SELECT pf.prs_perslid_naam_full, bes_srtdeel_omschrijving ,
           a.prs_afdeling_omschrijving,
           k.prs_kostenplaats_nr,
           TO_CHAR (b.bes_bestelling_key),
           'bestelling',
           COALESCE (SUBSTR (a.prs_afdeling_omschrijving,
                             1,
                               INSTR (a.prs_afdeling_omschrijving,
                                      '/',
                                      1,
                                      2)
                             - 1),
                     a.prs_afdeling_omschrijving)
               afd2,
           bd.ins_discipline_omschrijving,
           NULL toelichting,
           l.prs_bedrijf_naam,
           FAC.gettrackingdate ('BES2NE',bo.bes_bestelopdr_key) datum_aanmaak,
           bes_bestelling_leverdatum datum_levering,
           FAC.gettrackingdate ('BES2AF',bo.bes_bestelopdr_key) datum_geleverd,
           bi.bes_bestelling_item_prijs * bi.bes_bestelling_item_aantal
               kosten
      FROM bes_bestelopdr       bo,
           bes_bestelopdr_item  boi,
           bes_bestelling_item  bi,
           bes_bestelling       b,
           prs_perslid          p,
           prs_afdeling         a,
           prs_kostenplaats     k,
           bes_srtdeel          bsd,
           bes_srtgroep         bsg,
           bes_discipline       bd,
           prs_bedrijf          l,
           prs_v_perslid_fullnames pf
     WHERE     bo.prs_bedrijf_key = l.prs_bedrijf_key
           AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key
           AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
           AND bi.bes_bestelling_key = b.bes_bestelling_key
           AND b.prs_perslid_key = p.prs_perslid_key
           AND p.prs_afdeling_key = a.prs_afdeling_key
           AND a.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
           AND bi.bes_srtdeel_key = bsd.bes_srtdeel_key
           AND bsd.bes_srtgroep_key = bsg.bes_srtgroep_key
           AND bsg.ins_discipline_key = bd.ins_discipline_key
           AND p.prs_perslid_key = pf.prs_perslid_key
    UNION ALL
    SELECT pf.prs_perslid_naam_full,
           res_artikel_omschrijving,
           a.prs_afdeling_omschrijving,
           k.prs_kostenplaats_nr,
           res_reservering_key || '/' || res_rsv_ruimte_volgnr,
           'reservering',
           COALESCE (SUBSTR (a.prs_afdeling_omschrijving,
                             1,
                               INSTR (a.prs_afdeling_omschrijving,
                                      '/',
                                      1,
                                      2)
                             - 1),
                     a.prs_afdeling_omschrijving)
               afd2,
           rd.ins_discipline_omschrijving,
           rrr.res_rsv_ruimte_omschrijving toelichting,
           b.prs_bedrijf_naam,
           res_rsv_artikel_aanmaak,
           res_rsv_artikel_levering,
           res_rsv_artikel_afgemeld,
           res_rsv_artikel_prijs
               bedrag
      FROM res_rsv_artikel  rsv,
           res_rsv_ruimte   rrr,
           res_artikel      ra,
           res_discipline   rd,
           res_disc_params  dp,
           prs_bedrijf      b,
           prs_perslid      p,
           prs_afdeling     a,
           prs_kostenplaats k,
           prs_v_perslid_fullnames pf
     WHERE     rsv.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
           AND rsv.res_artikel_key = ra.res_artikel_key
           AND ra.res_discipline_key = rd.ins_discipline_key
           AND dp.prs_bedrijf_key = b.prs_bedrijf_key(+)
           AND rd.ins_discipline_key = dp.res_ins_discipline_key
           AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
           AND p.prs_afdeling_key = a.prs_afdeling_key
           AND a.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
           AND p.prs_perslid_key = pf.prs_perslid_key;

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

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

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