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

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

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

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

CREATE OR REPLACE PROCEDURE bssc_import_perslid (p_import_key IN NUMBER)
AS
   v_errormsg        VARCHAR2 (1000) := '-';
   v_errorhint       VARCHAR2 (1000) := '-';
   oracle_err_num    NUMBER;
   oracle_err_mes    VARCHAR2 (200);
BEGIN
   v_errorhint := 'Generieke import ' || TO_CHAR (p_import_key);

   -- Afdelingscode-kolom hard op 'XxX' indien leeg (want verplicht)!
   UPDATE fac_imp_file
      SET fac_imp_file_line =
                SUBSTR (fac_imp_file_line, 1, INSTR (fac_imp_file_line, ';', 1, 2))
             || 'XxX'
             || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 3))
    WHERE fac_import_key = p_import_key AND fac_imp_file_index > 1
          AND SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 2)
                                            + 1,   INSTR (fac_imp_file_line, ';', 1, 3)
                                                 - INSTR (fac_imp_file_line, ';', 1, 2)
                                                 - 1) IS NULL;

   COMMIT;

   -- Functie-kolom negeren en hard op 'Medewerker' (want verplicht)!
   UPDATE fac_imp_file i
      SET fac_imp_file_line =
                SUBSTR (fac_imp_file_line, 1, INSTR (fac_imp_file_line, ';', 1, 10))
             || 'Medewerker'
             || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 11))
    WHERE fac_import_key = p_import_key AND fac_imp_file_index > 1;

   COMMIT;

   -- De sequence array staat beschreven in PRS_PAC.SRC bij de import_perslid-PROCEDURE.
   prs.import_perslid (
      p_import_key,
         '0;0;0;0;0;0;3;4;5;6;'
      || '0;0;0;0;10;7;8;9;0;0;'
      || '11;1;2;0;0;0;12;13;14;15;'
      || '16;17;0;0;0;0;0;0;0;0;'
      || '0;0;0;0;0;0',
      'Loginnaam;Wachtwoord;Afdelingscode;Achternaam;Tussenvoegsel;Voornaam;Telefoon;Mobiel;Email;Geslacht;Functie;Taal;SSC FOBO;SSC Digireceptiemedewerker;SSC Huurderadministrator;SSC Bezoekersparkeerplaats;SSC Etage 4%');

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

CREATE OR REPLACE PROCEDURE bssc_update_perslid (p_import_key IN NUMBER)
AS
   -- Verwijderen personen niet in import voor afdelingen wel in import!
   CURSOR c_del
   IS
        SELECT p.prs_perslid_key
          FROM prs_v_aanwezigperslid p, prs_afdeling a
         WHERE (p.prs_perslid_oslogin IS NULL OR p.prs_perslid_oslogin NOT LIKE '\_%' ESCAPE '\') -- ' tbv. opmaak
               AND p.prs_perslid_oslogin2 IS NULL
               AND p.prs_afdeling_key = a.prs_afdeling_key
               AND EXISTS
                     (SELECT 1
                        FROM fac_imp_perslid i
                       WHERE UPPER (i.prs_afdeling_naam) = a.prs_afdeling_upper)
               AND NOT EXISTS
                     (SELECT 1
                        FROM fac_imp_perslid i
                       WHERE UPPER (i.prs_perslid_oslogin) = UPPER (p.prs_perslid_oslogin))
      ORDER BY 1;

   -- Bijwerken werkplek van personen naar '_' (als nog geen werkplek)!
   CURSOR c_wp
   IS
        SELECT p.prs_perslid_key
          FROM prs_v_aanwezigperslid p, prs_afdeling a, fac_imp_perslid i
         WHERE p.prs_afdeling_key = a.prs_afdeling_key
               AND a.prs_afdeling_upper = UPPER (i.prs_afdeling_naam)
               AND UPPER (p.prs_perslid_oslogin) = UPPER (i.prs_perslid_oslogin)
               AND NOT EXISTS
                     (SELECT 1
                        FROM prs_perslidwerkplek pw
                       WHERE pw.prs_perslid_key = p.prs_perslid_key)
      ORDER BY 1;

   -- Bijwerken language van personen naar 'EN' (volgens importbestand)!
   CURSOR c_lang
   IS
        SELECT p.prs_perslid_key, DECODE (i.prs_kenmerk1, 'EN', 'EN', 'NL') lang
          FROM prs_v_aanwezigperslid p, prs_afdeling a, fac_imp_perslid i
         WHERE p.prs_afdeling_key = a.prs_afdeling_key
               AND a.prs_afdeling_upper = UPPER (i.prs_afdeling_naam)
               AND UPPER (p.prs_perslid_oslogin) = UPPER (i.prs_perslid_oslogin)
      ORDER BY 1;

   -- Bijwerken autorisatiegroepen van personen (volgens importbestand)!
   CURSOR c_rol (
      p_ssc_fobo_key     IN            NUMBER,
      p_ssc_dmedew_key   IN            NUMBER,
      p_ssc_hadmin_key   IN            NUMBER,
      p_ssc_bezprk_key   IN            NUMBER,
      p_ssc_etage4_key   IN            NUMBER)
   IS
      SELECT p.prs_perslid_key, DECODE (UPPER (i.prs_kenmerk2), 'J', 1, 'Y', 1, 0) aanuit, p_ssc_fobo_key fac_groep_key
        FROM prs_v_aanwezigperslid p, prs_afdeling a, fac_imp_perslid i
       WHERE p.prs_afdeling_key = a.prs_afdeling_key
             AND a.prs_afdeling_upper = UPPER (i.prs_afdeling_naam)
             AND UPPER (p.prs_perslid_oslogin) = UPPER (i.prs_perslid_oslogin)
      UNION ALL
      SELECT p.prs_perslid_key, DECODE (UPPER (i.prs_kenmerk3), 'J', 1, 'Y', 1, 0) aanuit, p_ssc_dmedew_key fac_groep_key
        FROM prs_v_aanwezigperslid p, prs_afdeling a, fac_imp_perslid i
       WHERE p.prs_afdeling_key = a.prs_afdeling_key
             AND a.prs_afdeling_upper = UPPER (i.prs_afdeling_naam)
             AND UPPER (p.prs_perslid_oslogin) = UPPER (i.prs_perslid_oslogin)
      UNION ALL
      SELECT p.prs_perslid_key, DECODE (UPPER (i.prs_kenmerk4), 'J', 1, 'Y', 1, 0) aanuit, p_ssc_hadmin_key fac_groep_key
        FROM prs_v_aanwezigperslid p, prs_afdeling a, fac_imp_perslid i
       WHERE p.prs_afdeling_key = a.prs_afdeling_key
             AND a.prs_afdeling_upper = UPPER (i.prs_afdeling_naam)
             AND UPPER (p.prs_perslid_oslogin) = UPPER (i.prs_perslid_oslogin)
      UNION ALL
      SELECT p.prs_perslid_key, DECODE (UPPER (i.prs_kenmerk5), 'J', 1, 'Y', 1, 0) aanuit, p_ssc_bezprk_key fac_groep_key
        FROM prs_v_aanwezigperslid p, prs_afdeling a, fac_imp_perslid i
       WHERE p.prs_afdeling_key = a.prs_afdeling_key
             AND a.prs_afdeling_upper = UPPER (i.prs_afdeling_naam)
             AND UPPER (p.prs_perslid_oslogin) = UPPER (i.prs_perslid_oslogin)
      UNION ALL
      SELECT p.prs_perslid_key, DECODE (UPPER (i.prs_kenmerk6), 'J', 1, 'Y', 1, 0) aanuit, p_ssc_etage4_key fac_groep_key
        FROM prs_v_aanwezigperslid p, prs_afdeling a, fac_imp_perslid i
       WHERE p.prs_afdeling_key = a.prs_afdeling_key
             AND a.prs_afdeling_upper = UPPER (i.prs_afdeling_naam)
             AND UPPER (p.prs_perslid_oslogin) = UPPER (i.prs_perslid_oslogin)
      UNION ALL                                            -- Afnemen _Default
      SELECT p.prs_perslid_key, 0 aanuit, 1 fac_groep_key          -- _Default
        FROM prs_v_aanwezigperslid p, prs_afdeling a, fac_imp_perslid i
       WHERE p.prs_afdeling_key = a.prs_afdeling_key
             AND a.prs_afdeling_upper = UPPER (i.prs_afdeling_naam)
             AND UPPER (p.prs_perslid_oslogin) = UPPER (i.prs_perslid_oslogin)
      UNION ALL                                            -- Toewijzen SSC FE
      SELECT p.prs_perslid_key, 1 aanuit, 321 fac_groep_key          -- SSC FE
        FROM prs_v_aanwezigperslid p, prs_afdeling a, fac_imp_perslid i
       WHERE p.prs_afdeling_key = a.prs_afdeling_key
             AND a.prs_afdeling_upper = UPPER (i.prs_afdeling_naam)
             AND UPPER (p.prs_perslid_oslogin) = UPPER (i.prs_perslid_oslogin)
      ORDER BY 1, 3;

   -- Toekennen VLAN-autorisatiegroep (volgens eigen tabel met key=481)!
   CURSOR c_vlan
   IS
        SELECT p.prs_perslid_key, fac.safe_to_number (ud.fac_usrdata_upper) fac_groep_key
          FROM prs_v_aanwezigperslid p, prs_afdeling a, fac_imp_perslid i, (SELECT * FROM fac_v_aanwezigusrdata WHERE fac_usrtab_key = 481) ud
         WHERE p.prs_afdeling_key = a.prs_afdeling_key
               AND UPPER (p.prs_perslid_oslogin) = UPPER (i.prs_perslid_oslogin)
               AND a.prs_afdeling_upper = UPPER (i.prs_afdeling_naam)
               AND a.prs_afdeling_upper = UPPER (ud.fac_usrdata_omschr)
               AND EXISTS (SELECT 1 FROM fac_groep WHERE fac_groep_key = fac.safe_to_number (ud.fac_usrdata_code))
      ORDER BY 1;

   c_ruimte_key       NUMBER := 2204;       -- Fictieve ruimte op SSCH-locatie
   c_ssc_fobo_key     NUMBER := 341;                               -- SSC FOBO
   c_ssc_dmedew_key   NUMBER := 361;             -- SSC Digireceptiemedewerker
   c_ssc_hadmin_key   NUMBER := 362;               -- SSC Huurderadministrator
   c_ssc_bezprk_key   NUMBER := 1721;            -- SSC Bezoekersparkeerplaats
   c_ssc_etage4_key   NUMBER := 1481;                           -- SSC Etage 4
   v_bedrijf_key      NUMBER (10) := -1;
   v_afdeling_naam    VARCHAR2 (15) := '';
BEGIN
   -- Als import door Huurderadministrator, dan Afdelingscode-kolom negeren en hard op Afdeling-1 van Huurderadministrator!
   SELECT ab.prs_bedrijf_key, a.prs_afdeling_naam
     INTO v_bedrijf_key, v_afdeling_naam
     FROM fac_import i, prs_v_aanwezigperslid p, prs_afdeling a, prs_v_afdeling_boom ab
    WHERE     i.fac_import_key = p_import_key
          AND i.prs_perslid_key = p.prs_perslid_key
          AND p.prs_afdeling_key = a.prs_afdeling_key
          AND a.prs_afdeling_key = ab.prs_afdeling_key;

   IF v_bedrijf_key = 2442                            -- Huurders SSC-bedrijf!
   THEN                                   -- Import door Huurderadministrator!
      UPDATE fac_imp_perslid
         SET prs_afdeling_naam = v_afdeling_naam;
   ELSE                                   -- Import door andere administrator!
      UPDATE fac_imp_perslid
         SET prs_afdeling_naam = NULL
       WHERE prs_afdeling_naam = 'XxX';
   END IF;

   COMMIT;

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

   -- Verwijderen personen niet in import voor afdelingen wel in import!
   FOR rec IN c_del
   LOOP
      prs.delete_perslid (p_import_key, rec.prs_perslid_key);
   END LOOP;

   COMMIT;

   -- Toekennen fictieve werkplek op SSCH-locatie (voor wie daar nog niet een
   -- werkplek heeft)!
   -- Bijwerken werkplek van personen naar '_' (als nog geen werkplek)!
   FOR rec IN c_wp
   LOOP
      prs.movetoruimte (rec.prs_perslid_key, c_ruimte_key, NULL);
   END LOOP;

   COMMIT;

   -- Bijwerken language van personen naar 'EN' (volgens importbestand)!
   FOR rec IN c_lang
   LOOP
      UPDATE prs_perslid
         SET prs_perslid_lang = rec.lang
       WHERE prs_perslid_key = rec.prs_perslid_key;
   END LOOP;

   COMMIT;

   -- Bijwerken autorisatiegroepen van personen (volgens importbestand)!
   FOR rec IN c_rol (c_ssc_fobo_key, c_ssc_dmedew_key, c_ssc_hadmin_key, c_ssc_bezprk_key, c_ssc_etage4_key)
   LOOP
      IF rec.aanuit = 1
      THEN
         INSERT INTO fac_gebruikersgroep (fac_groep_key, prs_perslid_key)
            SELECT rec.fac_groep_key, rec.prs_perslid_key
              FROM DUAL
             WHERE NOT EXISTS
                      (SELECT 1
                         FROM fac_gebruikersgroep
                        WHERE fac_groep_key = rec.fac_groep_key
                              AND prs_perslid_key = rec.prs_perslid_key);
      ELSE
         DELETE FROM fac_gebruikersgroep
               WHERE fac_groep_key = rec.fac_groep_key
                     AND prs_perslid_key = rec.prs_perslid_key;
      END IF;
   END LOOP;

   -- Toekennen VLAN-autorisatiegroep (volgens eigen tabel met key=481)!
   -- NB. VLAN-autorisatiegroep wordt nooit automatisch afgenomen!
   FOR rec IN c_vlan
   LOOP
      INSERT INTO fac_gebruikersgroep (fac_groep_key, prs_perslid_key)
         SELECT rec.fac_groep_key, rec.prs_perslid_key
           FROM DUAL
          WHERE NOT EXISTS
                   (SELECT 1
                      FROM fac_gebruikersgroep
                     WHERE fac_groep_key = rec.fac_groep_key
                           AND prs_perslid_key = rec.prs_perslid_key);
   END LOOP;
END bssc_update_perslid;
/

CREATE OR REPLACE VIEW bssc_v_autorisatiegroepen
(
   fac_groep_key,
   fac_groep_oms
)
AS
   SELECT fac_groep_key, fac_groep_omschrijving
     FROM fac_groep
    WHERE fac_groep_omschrijving LIKE 'SSC%';

CREATE OR REPLACE VIEW bssc_v_externe_relaties
(
   prs_bedrijf_key,
   prs_bedrijf_naam,
   prs_bedrijf_verwijder
)
AS
   SELECT prs_bedrijf_key, prs_bedrijf_naam || ' [' || prs_overeenkomst_nr || ']', prs_bedrijf_verwijder
     FROM prs_bedrijf
    WHERE prs_bedrijf_ingids = 1;

CREATE OR REPLACE VIEW bssc_v_rap_ssc_cat_looplijst
(
   resnr,
   activiteit,
   --locatie,
   ruimte,
   datum,
   van,
   tot,
   reslev,
   organisatie,
   gastheer,
   kostenplaats,
   --costcenter,
   omschrijving,
   aantal,
   artikelnr,
   artikeloms,
   horeca_details,
   deelnemers
)
AS
   SELECT x.res_reservering_key || '/' || x.res_rsv_ruimte_volgnr || DECODE (res_rsv_ruimte_dirtlevel, 0, '', ' [ongeldig]') resnr,
          x.res_activiteit_omschrijving activiteit,
          --NULL locatie,
          COALESCE (rr.res_ruimte_nr, rg.alg_ruimte_omschrijving) ruimte,
          x.res_rsv_ruimte_van,
          x.res_rsv_ruimte_van,
          x.res_rsv_ruimte_tot,
          x.reslev,
          (SELECT prs_afdeling_omschrijving
             FROM prs_afdeling
            WHERE prs_afdeling_key = x.prs_afdeling_key)
             organisatie,
          x.prs_perslid_naam_full gastheer,
          x.prs_kostenplaats_omschrijving kostenplaats,
          --(SELECT MAX (kw.res_kenmerkreservering_waarde)
          --   FROM res_kenmerkwaarde kw, res_kenmerk rk
          --  WHERE kw.res_rsv_ruimte_key = x.res_rsv_ruimte_key
          --        AND kw.res_kenmerkwaarde_verwijder IS NULL
          --        AND kw.res_kenmerk_key = rk.res_kenmerk_key
          --        AND rk.res_srtkenmerk_key = 1)
          --   costcenter,
          x.res_rsv_ruimte_omschrijving omschrijving,
          x.res_rsv_artikel_aantal,
          x.res_artikel_nr,
          x.res_artikel_omschrijving,
          (select res_kenmerkreservering_waarde
             from res_kenmerkwaarde rkw, res_kenmerk k
            where     rkw.res_kenmerk_key = k.res_kenmerk_key
                  and k.res_srtkenmerk_key = 142
                  and x.res_rsv_ruimte_key = rkw.res_rsv_ruimte_key) horeca_details,
          x.res_rsv_ruimte_bezoekers
     FROM (SELECT rrr.res_rsv_ruimte_key,
                  rrr.res_reservering_key,
                  rrr.res_rsv_ruimte_volgnr,
                  act.res_activiteit_omschrijving,
                  COALESCE (rar1.res_ruimte_key, rar2.res_ruimte_key) res_ruimte_key,
                  COALESCE (rar1.alg_ruimte_key, rar2.alg_ruimte_key, rrr.alg_ruimte_key) alg_ruimte_key,
                  rrr.res_rsv_ruimte_van,
                  rrr.res_rsv_ruimte_tot,
                  rra.res_rsv_artikel_levering reslev,
                  COALESCE (ab.prs_afdeling_key2, ab.prs_afdeling_key) prs_afdeling_key,
                  pf.prs_perslid_naam_full,
                  kp.prs_kostenplaats_nr,
                  kp.prs_kostenplaats_omschrijving,
                  kl.prs_kenmerklink_waarde,
                  rrr.res_rsv_ruimte_omschrijving,
                  rra.res_rsv_artikel_aantal,
                  ra.res_artikel_nr,
                  ra.res_artikel_omschrijving,
                  rrr.res_rsv_ruimte_bezoekers,
                  rrr.res_rsv_ruimte_dirtlevel
             FROM res_rsv_ruimte rrr,
                  res_activiteit act,
                  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,
                  prs_v_perslid_fullnames_all pf,
                  prs_kostenplaats kp,
                  prs_perslid p,
                  prs_v_afdeling_boom ab,
                  prs_kenmerklink kl,
                  res_v_aanwezigrsv_artikel rra,
                  res_artikel ra
            WHERE rrr.res_activiteit_key = act.res_activiteit_key
                  AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)
                  AND rro.res_ruimte_key = rar1.res_ruimte_key(+)
                  AND rro.res_ruimte_key = rar2.res_ruimte_key(+)
                  AND COALESCE (rar1.alg_ruimte_key, rar2.alg_ruimte_key, rrr.alg_ruimte_key) = aog.alg_ruimte_key
                  AND aog.alg_locatie_key = 21                          -- SSC
                  AND rrr.res_rsv_ruimte_host_key = pf.prs_perslid_key
                  AND rrr.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
                  AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
                  AND p.prs_afdeling_key = ab.prs_afdeling_key
                  AND COALESCE (ab.prs_afdeling_key2, ab.prs_afdeling_key) = kl.prs_link_key(+)
                  AND kl.prs_kenmerklink_niveau(+) = 'A'
                  AND kl.prs_kenmerk_key(+) = 1001           -- Debiteurnummer
                  AND rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
                  AND rra.res_artikel_key = ra.res_artikel_key
                  AND rra.res_rsv_artikel_dirtlevel = 0
                  AND rrr.res_status_fo_key != 4                     -- vervallen
                  AND rra.res_rsv_artikel_levering > TO_DATE ('20171101', 'yyyymmdd')
                  AND rra.res_rsv_artikel_levering < TRUNC (SYSDATE, 'IW') + 21) x
          LEFT JOIN res_ruimte rr
             ON x.res_ruimte_key = rr.res_ruimte_key
          LEFT JOIN alg_v_ruimte_gegevens_all rg
             ON x.alg_ruimte_key = rg.alg_ruimte_key;

CREATE OR REPLACE VIEW bssc_v_rap_ssc_cat_factlijst
(
   resnr,
   datum,
   organisatie,
   gastheer,
   kostenplaats,
   --costcenter,
   omschrijving,
   totaal
)
AS                                     -- Catering gegroepeerd per reservering
     SELECT res_id,
            TRUNC (reslev),
            prs_afdeling_omschrijving organisatie,
            prs_perslid_naam_full gastheer,
            prs_kostenplaats_omschrijving kostenplaats,
            --(SELECT MAX (kw.res_kenmerkreservering_waarde)
            --   FROM res_kenmerkwaarde kw, res_kenmerk rk
            --  WHERE kw.res_rsv_ruimte_key = res_rsv_ruimte_key
            --        AND kw.res_kenmerkwaarde_verwijder IS NULL
            --        AND kw.res_kenmerk_key = rk.res_kenmerk_key
            --        AND rk.res_srtkenmerk_key = 1)
            --   costcenter,
            res_rsv_ruimte_omschrijving omschrijving,
            SUM (COALESCE (verw_prijs, prijs))
       FROM (SELECT rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr res_id,
                    rra.res_rsv_artikel_levering reslev,
                    a.prs_afdeling_omschrijving,
                    pf.prs_perslid_naam_full,
                    kp.prs_kostenplaats_nr,
                    kp.prs_kostenplaats_omschrijving,
                    rrr.res_rsv_ruimte_omschrijving,
                    rra.res_rsv_artikel_prijs verw_prijs,
                    rra.res_rsv_artikel_aantal * ra.res_artikel_prijs prijs
               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,
                    prs_perslid p,
                    prs_afdeling a,
                    prs_v_perslid_fullnames_all pf,
                    prs_kostenplaats kp,
                    res_v_aanwezigrsv_artikel rra,
                    res_artikel ra,
                    res_discipline rd,
                    res_disc_params dp,
                    prs_bedrijf b,
                    prs_kostensoort ks
              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 aog.alg_locatie_key = 21                        -- SSC
                    AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
                    AND p.prs_perslid_key = a.prs_afdeling_key
                    AND rrr.res_rsv_ruimte_host_key = pf.prs_perslid_key
                    AND rrr.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
                    AND rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
                    AND rra.res_artikel_key = ra.res_artikel_key
                    AND ra.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 rd.prs_kostensoort_key = ks.prs_kostensoort_key(+)
                    --AND rra.res_rsv_artikel_verwerkt IS NULL
                    AND rra.res_rsv_artikel_dirtlevel = 0
                    AND rra.res_rsv_artikel_levering > TO_DATE ('20171101', 'yyyymmdd')
                    AND rra.res_rsv_artikel_levering < SYSDATE)
   GROUP BY res_id,
            TRUNC (reslev),
            prs_afdeling_omschrijving,
            prs_perslid_naam_full,
            prs_kostenplaats_omschrijving,
            res_rsv_ruimte_omschrijving;

CREATE OR REPLACE VIEW bssc_v_rap_parkres_bez
(
   afspraak_key,                                             -- appointment_id
   bezoekers_key,                                                -- visitor_id
   afspraak_datum,
   afspraak_eind,
   afspraak_oms,
   bez_achternaam,
   bez_mail,
   bez_telnr,
   bez_kenteken,
   bez_bedrijf,
   cp_naam,
   cp_mail,
   cp_telnr,
   cp_bedrijf,
   bez_voor,
   bez_actie,
   laatste_mut
)
AS
   SELECT t.fac_tracking_refkey,
          x.bez_bezoekers_key,
          x.bez_afspraak_datum,
          x.bez_afspraak_eind,
          x.bez_afspraak_opmerking,
          x.bez_afspraak_naam,
          email.bez_kenmerkwaarde_waarde,
          telnr.bez_kenmerkwaarde_waarde,
          kntkn.bez_kenmerkwaarde_waarde,
          x.bez_afspraak_bedrijf,
          x.prs_perslid_naam_full,
          x.prs_perslid_email,
          COALESCE (x.prs_perslid_telefoonnr, x.prs_perslid_mobiel) cp_telnr,
          x.prs_afdeling_omschrijving,
          x.bez_afspraak_gastheer,
          x.bez_actie_omschrijving,
          t.tracking_datum
     FROM (SELECT a.bez_afspraak_key,
                  b.bez_bezoekers_key,
                  a.bez_afspraak_datum,
                  a.bez_afspraak_eind,
                  a.bez_afspraak_opmerking,
                  b.bez_afspraak_naam,
                  b.bez_afspraak_bedrijf,
                  cpf.prs_perslid_naam_full,
                  cp.prs_perslid_email,
                  cp.prs_perslid_telefoonnr,
                  cp.prs_perslid_mobiel,
                  afd.prs_afdeling_omschrijving,
                  a.bez_afspraak_gastheer,
                  ba.bez_actie_omschrijving
             FROM bez_afspraak a,
                  bez_bezoekers b,
                  prs_perslid cp,
                  prs_v_perslid_fullnames cpf,
                  prs_v_afdeling_boom ab,
                  prs_afdeling afd,
                  bez_actie ba
            WHERE a.bez_afspraak_datum > TRUNC (SYSDATE)
                  AND a.bez_afspraak_key = b.bez_afspraak_key
                  AND a.bez_afspraak_contact_key = cp.prs_perslid_key
                  AND cp.prs_perslid_key = cpf.prs_perslid_key
                  AND cp.prs_afdeling_key = ab.prs_afdeling_key
                  AND ab.prs_afdeling_key1 = afd.prs_afdeling_key
                  AND a.bez_actie_key = ba.bez_actie_key
                  AND EXISTS (SELECT 1
                                FROM res_rsv_deel
                               WHERE bez_bezoekers_key = b.bez_bezoekers_key)) x
          LEFT JOIN bez_kenmerkwaarde email
             ON x.bez_bezoekers_key = email.bez_bezoekers_key
                AND email.bez_kenmerkwaarde_verwijder IS NULL
                AND email.bez_kenmerk_key = 1000               -- E-mail adres
          LEFT JOIN bez_kenmerkwaarde telnr
             ON x.bez_bezoekers_key = telnr.bez_bezoekers_key
                AND telnr.bez_kenmerkwaarde_verwijder IS NULL
                AND telnr.bez_kenmerk_key = 1060             -- Telefoonnummer
          LEFT JOIN bez_kenmerkwaarde kntkn
             ON x.bez_bezoekers_key = kntkn.bez_bezoekers_key
                AND kntkn.bez_kenmerkwaarde_verwijder IS NULL
                AND kntkn.bez_kenmerk_key = 1100                   -- Kenteken
          LEFT JOIN (  SELECT fac_tracking_refkey, MAX (fac_tracking_datum) tracking_datum
                         FROM fac_tracking
                        WHERE fac_srtnotificatie_key IN (26, 27) -- BEZMUT/BEZUPD
                     GROUP BY fac_tracking_refkey) t
             ON x.bez_afspraak_key = t.fac_tracking_refkey;

-- BSSC#55692: Facturatie verhuur (M2 en meer)!
CREATE OR REPLACE VIEW bssc_v_fact_actual
AS
   WITH lopendeperiode AS (SELECT COALESCE (MAX (TO_CHAR (LAST_DAY (fac.safe_to_date (fin_verkoopfactuur_maand, 'yyyymm')) + 1, 'yyyymm')), '201905') maand
                             FROM fin_verkoopfactuur)
     SELECT '*CONCEPT*' fin_verkoopfactuur_id,                        -- Huur!
            'CHV' || TRIM (x.cnt_contract_nummer) po_nr,           -- Regulier
            'CHV' || TRIM (x.cnt_contract_nummer) cnt_contract_nummer,   -- PO
            '0000' || TO_CHAR (x.ins_discipline_key) sortering, -- Sorteren op (eigen) discipline_key; 8 posities!
            'CHV - ' || TRIM (SUBSTR (tar.fac_usrdata_omschr, 1, INSTR (tar.fac_usrdata_omschr, '-') - 1)) regel, -- Huur
            TO_CHAR (SYSDATE, 'dd-mm-yyyy') factuurdatum, TO_CHAR (SYSDATE + 30, 'dd-mm-yyyy') vervaldatum,
            x.cnt_contract_key, x.cnt_contract_nummer_intern, x.cnt_contract_versie, x.lv,
            --x.cnt_contract_korting,                               -- Korting %
            x.prs_bedrijf_key, x.prs_bedrijf_naam prs_debiteur_naam, TRIM (x.prs_overeenkomst_nr) debiteur_nr,
            btwnr.prs_kenmerklink_waarde btw_nr,
            --(SELECT MIN (TRIM (prs_contactpersoon_voorletters || ' ' || TRIM (prs_contactpersoon_tussenv || ' ' || prs_contactpersoon_naam)))
            --   FROM prs_contactpersoon
            --  WHERE prs_contactpersoon_verwijder IS NULL
            --        AND prs_contactpersoon_titel = '*' -- Contactpersoon op facturen
            --        AND prs_bedrijf_key = x.prs_bedrijf_key)
            NULL contactpersoon,
            x.adres, x.postcode, x.plaats, x.land,
            x.prs_kostenplaats_key, x.prs_kostenplaats_nr, x.prs_kostenplaats_omschrijving, x.prs_kostenplaatsgrp_oms,
            --x.prs_kostensoort_oms, x.prs_kostensoort_opmerking, x.prs_kostensoort_refcode, x.prs_kostensoortgrp_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'V', DECODE (verv_toeslag.fac_usrdata_key, 1001, 'H', '0')) fin_btwtabelwaarde_code,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'Verlegd', DECODE (verv_toeslag.fac_usrdata_key, 1001, 'Hoog', 'Nul')) fin_btwtabelwaarde_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, DECODE (verv_toeslag.fac_usrdata_key, 1001, 21, 0)) fin_btwtabelwaarde_perc,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 1, TO_NUMBER (NULL)) fin_btwtabelwaarde_verlegd,
            x.maand,
            TO_CHAR (TO_DATE (x.maand, 'yyyymm'), 'dd-mm-yyyy') mndbegin,
            TO_CHAR (LAST_DAY (TO_DATE (x.maand, 'yyyymm')), 'dd-mm-yyyy') mndeinde,
            TO_CHAR (GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')), 'dd-mm-yyyy') dagbegin,
            TO_CHAR (LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))), 'dd-mm-yyyy') dageinde,
            LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1 mndbes, -- Beschikbaar
            LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1 mndbez, -- Bezet
            rxo.alg_ruimte_opp_alt1 aantal,                             -- VVO
            tar.fac_usrdata_prijs tarief,                 -- Jaartarief per m2
            vvo_toeslag.fac_usrdata_prijs vvo_toeslag,     -- VVO toeslagperc.
            --korting_pct.fac_usrdata_prijs korting_pct,        -- Kortingsperc.
            verv_toeslag.fac_usrdata_prijs verv_toeslag, -- Vervangend toeslagperc.
            fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde) korting_pm2, -- Korting per m2 Huur
            pa.alg_onroerendgoed_type,
            pa.alg_onroerendgoed_keys,
            pa.alg_plaatsaanduiding,
            ROUND (((LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1) / (LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1)) *
                   --((100 - COALESCE (x.cnt_contract_korting, 0)) / 100) *
                   COALESCE (rxo.alg_ruimte_opp_alt1, 0) *
                   COALESCE (verv_toeslag.fac_usrdata_prijs, 0) *
                   COALESCE (vvo_toeslag.fac_usrdata_prijs, 0) *
                   --(COALESCE (tar.fac_usrdata_prijs, 0) - COALESCE (fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde), 0)) *
                   DECODE (tar.fac_usrdata_prijs, NULL, 0, tar.fac_usrdata_prijs - COALESCE (fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde), 0)) *
                   --korting_pct.fac_usrdata_prijs *
                   1/12, 2)
               mndnet,         -- Netto maandbedrag (incl. kortingspercentage)
            ROUND (((LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1) / (LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1)) *
                   --((100 - COALESCE (x.cnt_contract_korting, 0)) / 100) *
                   COALESCE (rxo.alg_ruimte_opp_alt1, 0) *
                   COALESCE (verv_toeslag.fac_usrdata_prijs, 0) *
                   COALESCE (vvo_toeslag.fac_usrdata_prijs, 0) *
                   --(COALESCE (tar.fac_usrdata_prijs, 0) - COALESCE (fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde), 0)) *
                   DECODE (tar.fac_usrdata_prijs, NULL, 0, tar.fac_usrdata_prijs - COALESCE (fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde), 0)) *
                   --korting_pct.fac_usrdata_prijs *
                   DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, DECODE (verv_toeslag.fac_usrdata_key, 1001, 0.21, 0)) *
                   1/12, 2)
               mndbtw,                                      -- BTW maandbedrag
            --TRIM (DECODE (biss_kc1.cnt_kenmerkcontract_waarde, '986', '8110', DECODE (biss_kc2.cnt_kenmerkcontract_waarde, '989', '8110', SUBSTR (tar.fac_usrdata_code, 1, INSTR (tar.fac_usrdata_code, '/') - 1)))) grtboekrek,
            DECODE (verv_toeslag.fac_usrdata_key, 1001, SUBSTR (tar.fac_usrdata_code, 1, INSTR (tar.fac_usrdata_code, '/') - 1), '8110') grtboekrek,
            TO_NUMBER (NULL) mld_melding_key,          -- Correctiemelding-key
            NULL mld_melding_omschrijving
       FROM (SELECT c.ins_discipline_key,
                    c.cnt_contract_key,
                    c.cnt_contract_nummer_intern, c.cnt_contract_versie,
                    c.cnt_contract_nummer,
                    c.cnt_contract_looptijd_van lv, c.cnt_contract_looptijd_tot lt,
                    c.cnt_contract_korting,
                    b.prs_bedrijf_key, b.prs_bedrijf_naam, b.prs_overeenkomst_nr,
                    --0.21 btw,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_adres, b.prs_bedrijf_post_adres) adres,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_postcode, b.prs_bedrijf_post_postcode) postcode,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_plaats, b.prs_bedrijf_post_plaats) plaats,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_land, b.prs_bedrijf_post_land) land,
                    kp.prs_kostenplaats_key, kp.prs_kostenplaats_nr, kp.prs_kostenplaats_omschrijving, kpg.prs_kostenplaatsgrp_oms,
                    c.maand
               FROM (SELECT lp.maand, c.*
                       FROM lopendeperiode lp, cnt_v_aanwezigcontract c
                      WHERE c.ins_discipline_key = 2001            -- Huur CHV
                            AND c.cnt_contract_status = 0     -- NIET Gesloten
                            AND TRUNC (c.cnt_contract_looptijd_van) < LAST_DAY (TO_DATE (lp.maand || '01', 'yyyymmdd')) -- Van-datum < einde te factureren maand
                            AND c.cnt_contract_looptijd_tot > TO_DATE (lp.maand || '01', 'yyyymmdd') -- Tot-datum > begin te factureren maand
                     UNION ALL -- Soms 2 maanden factureren (of 1 maand achteraf?)!
                     SELECT TO_CHAR (TO_DATE (lp.maand || '01', 'yyyymmdd') - 1, 'yyyymm') maand, c.*
                       FROM lopendeperiode lp, cnt_v_aanwezigcontract c
                      WHERE c.ins_discipline_key = 2001            -- Huur CHV
                            AND c.cnt_contract_status = 0     -- NIET Gesloten
                            AND c.cnt_contract_aanmaak > ADD_MONTHS (TO_DATE (lp.maand || '01', 'yyyymmdd'), -1) -- Na begin voorgaande maand aangemaakt!
                            AND TRUNC (c.cnt_contract_looptijd_van) BETWEEN ADD_MONTHS (TO_DATE (lp.maand || '01', 'yyyymmdd'), -1) AND TO_DATE (lp.maand || '01', 'yyyymmdd') -- Van-datum in voorgaande maand!
                            AND NOT EXISTS -- Voorgaande maand nog niet gefactureerd!
                                  (SELECT 1
                                     FROM fin_verkoopfactuur
                                    WHERE fin_verkoopfactuur_maand = TO_CHAR (TO_DATE (lp.maand || '01', 'yyyymmdd') - 1, 'yyyymm') -- Voorgaande maand!
                                          AND fin_verkoopfactuur_xmlnode = 'contract'
                                          AND fin_verkoopfactuur_refkey = c.cnt_contract_key)) c,
                    prs_bedrijf b,
                    prs_kostenplaats kp,
                    prs_kostenplaatsgrp kpg
              WHERE c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
                    AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
                    AND kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)) x
            LEFT JOIN prs_kenmerklink btwnr
               ON x.prs_bedrijf_key = btwnr.prs_link_key
                  AND btwnr.prs_kenmerklink_verwijder IS NULL
                  AND btwnr.prs_kenmerk_key = -1            -- BTW-nummer (NL)
            LEFT JOIN prs_kenmerklink btwvl
               ON x.prs_bedrijf_key = btwvl.prs_link_key
                  AND btwvl.prs_kenmerklink_verwijder IS NULL
                  AND btwvl.prs_kenmerk_key = -1                -- BTW verlegd
            LEFT JOIN cnt_kenmerkcontract vsov_kc
               ON x.cnt_contract_key = vsov_kc.cnt_contract_key
                  AND vsov_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND vsov_kc.cnt_kenmerk_key = -1                     -- VSOV
            LEFT JOIN cnt_v_aanwezigcontract_plaats ccp
               ON x.cnt_contract_key = ccp.cnt_contract_key
                  AND ccp.cnt_alg_plaats_code = 'R'   -- Alleen Scope-ruimten!
            LEFT JOIN alg_v_plaatsaanduiding_all pa
               ON ccp.cnt_alg_plaats_key = pa.alg_onroerendgoed_keys
            LEFT JOIN alg_v_aanwezigruimte rxo
               ON ccp.cnt_alg_plaats_key = rxo.alg_ruimte_key
            LEFT JOIN cnt_kenmerkcontract tt_kc
               ON x.cnt_contract_key = tt_kc.cnt_contract_key
                  AND tt_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND tt_kc.cnt_kenmerk_key = 401               -- Tarieftabel
            LEFT JOIN fac_v_aanwezigusrdata tt_ud
               ON fac.safe_to_number (tt_kc.cnt_kenmerkcontract_waarde) = tt_ud.fac_usrdata_key
            LEFT JOIN fac_v_aanwezigusrdata tar
               ON fac.safe_to_number (tt_ud.fac_usrdata_code) = tar.fac_usrtab_key
                  AND SUBSTR (tar.fac_usrdata_code, INSTR (tar.fac_usrdata_code, '/') + 1, 4) = 'Huur' -- Huur-tarief
            LEFT JOIN cnt_kenmerkcontract verv_toeslag_kc
               ON x.cnt_contract_key = verv_toeslag_kc.cnt_contract_key
                  AND verv_toeslag_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND verv_toeslag_kc.cnt_kenmerk_key = 642 -- Vervangend toeslagperc.
            LEFT JOIN fac_v_aanwezigusrdata verv_toeslag
               ON fac.safe_to_number (verv_toeslag_kc.cnt_kenmerkcontract_waarde) = verv_toeslag.fac_usrdata_key
            LEFT JOIN cnt_kenmerkcontract vvo_toeslag_kc
               ON x.cnt_contract_key = vvo_toeslag_kc.cnt_contract_key
                  AND vvo_toeslag_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND vvo_toeslag_kc.cnt_kenmerk_key = 402 -- VVO toeslagperc.
            LEFT JOIN fac_v_aanwezigusrdata vvo_toeslag
               ON fac.safe_to_number (vvo_toeslag_kc.cnt_kenmerkcontract_waarde) = vvo_toeslag.fac_usrdata_key
            --LEFT JOIN cnt_kenmerkcontract korting_pct_kc
            --   ON x.cnt_contract_key = korting_pct_kc.cnt_contract_key
            --      AND korting_pct_kc.cnt_kenmerkcontract_verwijder IS NULL
            --      AND korting_pct_kc.cnt_kenmerk_key = 403    -- Kortingsperc.
            --LEFT JOIN fac_v_aanwezigusrdata korting_pct
            --   ON fac.safe_to_number (korting_pct_kc.cnt_kenmerkcontract_waarde) = korting_pct.fac_usrdata_key
            LEFT JOIN cnt_kenmerkcontract korting_pm2
               ON x.cnt_contract_key = korting_pm2.cnt_contract_key
                  AND korting_pm2.cnt_kenmerkcontract_verwijder IS NULL
                  AND korting_pm2.cnt_kenmerk_key = 404      -- Korting per m2
            --LEFT JOIN cnt_kenmerkcontract biss_kc1
            --   ON x.cnt_contract_key = biss_kc1.cnt_contract_key
            --      AND biss_kc1.cnt_kenmerkcontract_verwijder IS NULL
            --      AND biss_kc1.cnt_kenmerk_key = 645     -- Facilitaire kosten
            --LEFT JOIN cnt_kenmerkcontract biss_kc2
            --   ON x.cnt_contract_key = biss_kc2.cnt_contract_key
            --      AND biss_kc2.cnt_kenmerkcontract_verwijder IS NULL
            --      AND biss_kc2.cnt_kenmerk_key = 647          -- Servicekosten
     UNION ALL                                                -- M2 correctie!
     SELECT '*CONCEPT*' fin_verkoopfactuur_id,                        -- Huur!
            'CHV' || TRIM (x.cnt_contract_nummer) po_nr,           -- Regulier
            'CHV' || TRIM (x.cnt_contract_nummer) cnt_contract_nummer,   -- PO
            '0000' || TO_CHAR (x.ins_discipline_key) sortering, -- Sorteren op (eigen) discipline_key; 8 posities!
            'CHV - ' || TRIM (SUBSTR (tar.fac_usrdata_omschr, 1, INSTR (tar.fac_usrdata_omschr, '-') - 1)) regel, -- Huur
            TO_CHAR (SYSDATE, 'dd-mm-yyyy') factuurdatum, TO_CHAR (SYSDATE + 30, 'dd-mm-yyyy') vervaldatum,
            x.cnt_contract_key, x.cnt_contract_nummer_intern, x.cnt_contract_versie, x.lv,
            --x.cnt_contract_korting,                               -- Korting %
            x.prs_bedrijf_key, x.prs_bedrijf_naam prs_debiteur_naam, TRIM (x.prs_overeenkomst_nr) debiteur_nr,
            btwnr.prs_kenmerklink_waarde btw_nr,
            --(SELECT MIN (TRIM (prs_contactpersoon_voorletters || ' ' || TRIM (prs_contactpersoon_tussenv || ' ' || prs_contactpersoon_naam)))
            --   FROM prs_contactpersoon
            --  WHERE prs_contactpersoon_verwijder IS NULL
            --        AND prs_contactpersoon_titel = '*' -- Contactpersoon op facturen
            --        AND prs_bedrijf_key = x.prs_bedrijf_key)
            NULL contactpersoon,
            x.adres, x.postcode, x.plaats, x.land,
            x.prs_kostenplaats_key, x.prs_kostenplaats_nr, x.prs_kostenplaats_omschrijving, x.prs_kostenplaatsgrp_oms,
            --x.prs_kostensoort_oms, x.prs_kostensoort_opmerking, x.prs_kostensoort_refcode, x.prs_kostensoortgrp_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'V', DECODE (verv_toeslag.fac_usrdata_key, 1001, 'H', '0')) fin_btwtabelwaarde_code,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'Verlegd', DECODE (verv_toeslag.fac_usrdata_key, 1001, 'Hoog', 'Nul')) fin_btwtabelwaarde_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, DECODE (verv_toeslag.fac_usrdata_key, 1001, 21, 0)) fin_btwtabelwaarde_perc,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 1, TO_NUMBER (NULL)) fin_btwtabelwaarde_verlegd,
            x.maand,
            TO_CHAR (TO_DATE (x.maand, 'yyyymm'), 'dd-mm-yyyy') mndbegin,
            TO_CHAR (LAST_DAY (TO_DATE (x.maand, 'yyyymm')), 'dd-mm-yyyy') mndeinde,
            TO_CHAR (GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')), 'dd-mm-yyyy') dagbegin,
            TO_CHAR (LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))), 'dd-mm-yyyy') dageinde,
            LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1 mndbes, -- Beschikbaar
            LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1 mndbez, -- Bezet
            fac.safe_to_number (correctie_m2.cnt_kenmerkcontract_waarde) aantal, -- VVO-correctie
            tar.fac_usrdata_prijs tarief,                 -- Jaartarief per m2
            vvo_toeslag.fac_usrdata_prijs vvo_toeslag,     -- VVO toeslagperc.
            --korting_pct.fac_usrdata_prijs korting_pct,        -- Kortingsperc.
            verv_toeslag.fac_usrdata_prijs verv_toeslag, -- Vervangend toeslagperc.
            fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde) korting_pm2, -- Korting per m2 Huur
            'C' alg_onroerendgoed_type,
            -1 alg_onroerendgoed_keys,
            'Correctie' alg_plaatsaanduiding,
            ROUND (((LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1) / (LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1)) *
                   --((100 - COALESCE (x.cnt_contract_korting, 0)) / 100) *
                   COALESCE (fac.safe_to_number (correctie_m2.cnt_kenmerkcontract_waarde), 0) *
                   COALESCE (verv_toeslag.fac_usrdata_prijs, 0) *
                   COALESCE (vvo_toeslag.fac_usrdata_prijs, 0) *
                   --(COALESCE (tar.fac_usrdata_prijs, 0) - COALESCE (fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde), 0)) *
                   DECODE (tar.fac_usrdata_prijs, NULL, 0, tar.fac_usrdata_prijs - COALESCE (fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde), 0)) *
                   --korting_pct.fac_usrdata_prijs *
                   1/12, 2)
               mndnet,         -- Netto maandbedrag (incl. kortingspercentage)
            ROUND (((LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1) / (LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1)) *
                   --((100 - COALESCE (x.cnt_contract_korting, 0)) / 100) *
                   COALESCE (fac.safe_to_number (correctie_m2.cnt_kenmerkcontract_waarde), 0) *
                   COALESCE (verv_toeslag.fac_usrdata_prijs, 0) *
                   COALESCE (vvo_toeslag.fac_usrdata_prijs, 0) *
                   --(COALESCE (tar.fac_usrdata_prijs, 0) - COALESCE (fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde), 0)) *
                   DECODE (tar.fac_usrdata_prijs, NULL, 0, tar.fac_usrdata_prijs - COALESCE (fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde), 0)) *
                   --korting_pct.fac_usrdata_prijs *
                   DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, DECODE (verv_toeslag.fac_usrdata_key, 1001, 0.21, 0)) *
                   1/12, 2)
               mndbtw,                                      -- BTW maandbedrag
            --TRIM (DECODE (biss_kc1.cnt_kenmerkcontract_waarde, '986', '8110', DECODE (biss_kc2.cnt_kenmerkcontract_waarde, '989', '8110', SUBSTR (tar.fac_usrdata_code, 1, INSTR (tar.fac_usrdata_code, '/') - 1)))) grtboekrek,
            DECODE (verv_toeslag.fac_usrdata_key, 1001, SUBSTR (tar.fac_usrdata_code, 1, INSTR (tar.fac_usrdata_code, '/') - 1), '8110') grtboekrek,
            TO_NUMBER (NULL) mld_melding_key,          -- Correctiemelding-key
            NULL mld_melding_omschrijving
       FROM (SELECT c.ins_discipline_key,
                    c.cnt_contract_key,
                    c.cnt_contract_nummer_intern, c.cnt_contract_versie,
                    c.cnt_contract_nummer,
                    c.cnt_contract_looptijd_van lv, c.cnt_contract_looptijd_tot lt,
                    c.cnt_contract_korting,
                    b.prs_bedrijf_key, b.prs_bedrijf_naam, b.prs_overeenkomst_nr,
                    --0.21 btw,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_adres, b.prs_bedrijf_post_adres) adres,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_postcode, b.prs_bedrijf_post_postcode) postcode,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_plaats, b.prs_bedrijf_post_plaats) plaats,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_land, b.prs_bedrijf_post_land) land,
                    kp.prs_kostenplaats_key, kp.prs_kostenplaats_nr, kp.prs_kostenplaats_omschrijving, kpg.prs_kostenplaatsgrp_oms,
                    c.maand
               FROM (SELECT lp.maand, c.*
                       FROM lopendeperiode lp, cnt_v_aanwezigcontract c
                      WHERE c.ins_discipline_key = 2001            -- Huur CHV
                            AND c.cnt_contract_status = 0     -- NIET Gesloten
                            AND TRUNC (c.cnt_contract_looptijd_van) < LAST_DAY (TO_DATE (lp.maand || '01', 'yyyymmdd')) -- Van-datum < einde te factureren maand
                            AND c.cnt_contract_looptijd_tot > TO_DATE (lp.maand || '01', 'yyyymmdd') -- Tot-datum > begin te factureren maand
                     UNION ALL -- Soms 2 maanden factureren (of 1 maand achteraf?)!
                     SELECT TO_CHAR (TO_DATE (lp.maand || '01', 'yyyymmdd') - 1, 'yyyymm') maand, c.*
                       FROM lopendeperiode lp, cnt_v_aanwezigcontract c
                      WHERE c.ins_discipline_key = 2001            -- Huur CHV
                            AND c.cnt_contract_status = 0     -- NIET Gesloten
                            AND c.cnt_contract_aanmaak > ADD_MONTHS (TO_DATE (lp.maand || '01', 'yyyymmdd'), -1) -- Na begin voorgaande maand aangemaakt!
                            AND TRUNC (c.cnt_contract_looptijd_van) BETWEEN ADD_MONTHS (TO_DATE (lp.maand || '01', 'yyyymmdd'), -1) AND TO_DATE (lp.maand || '01', 'yyyymmdd') -- Van-datum in voorgaande maand!
                            AND NOT EXISTS -- Voorgaande maand nog niet gefactureerd!
                                  (SELECT 1
                                     FROM fin_verkoopfactuur
                                    WHERE fin_verkoopfactuur_maand = TO_CHAR (TO_DATE (lp.maand || '01', 'yyyymmdd') - 1, 'yyyymm') -- Voorgaande maand!
                                          AND fin_verkoopfactuur_xmlnode = 'contract'
                                          AND fin_verkoopfactuur_refkey = c.cnt_contract_key)) c,
                    prs_bedrijf b,
                    prs_kostenplaats kp,
                    prs_kostenplaatsgrp kpg
              WHERE c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
                    AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
                    AND kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)) x
            LEFT JOIN prs_kenmerklink btwnr
               ON x.prs_bedrijf_key = btwnr.prs_link_key
                  AND btwnr.prs_kenmerklink_verwijder IS NULL
                  AND btwnr.prs_kenmerk_key = -1            -- BTW-nummer (NL)
            LEFT JOIN prs_kenmerklink btwvl
               ON x.prs_bedrijf_key = btwvl.prs_link_key
                  AND btwvl.prs_kenmerklink_verwijder IS NULL
                  AND btwvl.prs_kenmerk_key = -1                -- BTW verlegd
            LEFT JOIN cnt_kenmerkcontract vsov_kc
               ON x.cnt_contract_key = vsov_kc.cnt_contract_key
                  AND vsov_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND vsov_kc.cnt_kenmerk_key = -1                     -- VSOV
            --LEFT JOIN cnt_v_aanwezigcontract_plaats ccp
            --   ON x.cnt_contract_key = ccp.cnt_contract_key
            --      AND ccp.cnt_alg_plaats_code = 'R'   -- Alleen Scope-ruimten!
            --LEFT JOIN alg_v_plaatsaanduiding_all pa
            --   ON ccp.cnt_alg_plaats_key = pa.alg_onroerendgoed_keys
            --LEFT JOIN alg_v_aanwezigruimte rxo
            --   ON ccp.cnt_alg_plaats_key = rxo.alg_ruimte_key
            LEFT JOIN cnt_kenmerkcontract correctie_m2
               ON x.cnt_contract_key = correctie_m2.cnt_contract_key
                  AND correctie_m2.cnt_kenmerkcontract_verwijder IS NULL
                  AND correctie_m2.cnt_kenmerk_key = 701       -- Correctie m2
            LEFT JOIN cnt_kenmerkcontract tt_kc
               ON x.cnt_contract_key = tt_kc.cnt_contract_key
                  AND tt_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND tt_kc.cnt_kenmerk_key = 401               -- Tarieftabel
            LEFT JOIN fac_v_aanwezigusrdata tt_ud
               ON fac.safe_to_number (tt_kc.cnt_kenmerkcontract_waarde) = tt_ud.fac_usrdata_key
            LEFT JOIN fac_v_aanwezigusrdata tar
               ON fac.safe_to_number (tt_ud.fac_usrdata_code) = tar.fac_usrtab_key
                  AND SUBSTR (tar.fac_usrdata_code, INSTR (tar.fac_usrdata_code, '/') + 1, 4) = 'Huur' -- Huur-tarief
            LEFT JOIN cnt_kenmerkcontract verv_toeslag_kc
               ON x.cnt_contract_key = verv_toeslag_kc.cnt_contract_key
                  AND verv_toeslag_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND verv_toeslag_kc.cnt_kenmerk_key = 642 -- Vervangend toeslagperc.
            LEFT JOIN fac_v_aanwezigusrdata verv_toeslag
               ON fac.safe_to_number (verv_toeslag_kc.cnt_kenmerkcontract_waarde) = verv_toeslag.fac_usrdata_key
            LEFT JOIN cnt_kenmerkcontract vvo_toeslag_kc
               ON x.cnt_contract_key = vvo_toeslag_kc.cnt_contract_key
                  AND vvo_toeslag_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND vvo_toeslag_kc.cnt_kenmerk_key = 402 -- VVO toeslagperc.
            LEFT JOIN fac_v_aanwezigusrdata vvo_toeslag
               ON fac.safe_to_number (vvo_toeslag_kc.cnt_kenmerkcontract_waarde) = vvo_toeslag.fac_usrdata_key
            --LEFT JOIN cnt_kenmerkcontract korting_pct_kc
            --   ON x.cnt_contract_key = korting_pct_kc.cnt_contract_key
            --      AND korting_pct_kc.cnt_kenmerkcontract_verwijder IS NULL
            --      AND korting_pct_kc.cnt_kenmerk_key = 403    -- Kortingsperc.
            --LEFT JOIN fac_v_aanwezigusrdata korting_pct
            --   ON fac.safe_to_number (korting_pct_kc.cnt_kenmerkcontract_waarde) = korting_pct.fac_usrdata_key
            LEFT JOIN cnt_kenmerkcontract korting_pm2
               ON x.cnt_contract_key = korting_pm2.cnt_contract_key
                  AND korting_pm2.cnt_kenmerkcontract_verwijder IS NULL
                  AND korting_pm2.cnt_kenmerk_key = 404      -- Korting per m2
            --LEFT JOIN cnt_kenmerkcontract biss_kc1
            --   ON x.cnt_contract_key = biss_kc1.cnt_contract_key
            --      AND biss_kc1.cnt_kenmerkcontract_verwijder IS NULL
            --      AND biss_kc1.cnt_kenmerk_key = 645     -- Facilitaire kosten
            --LEFT JOIN cnt_kenmerkcontract biss_kc2
            --   ON x.cnt_contract_key = biss_kc2.cnt_contract_key
            --      AND biss_kc2.cnt_kenmerkcontract_verwijder IS NULL
            --      AND biss_kc2.cnt_kenmerk_key = 647          -- Servicekosten
      WHERE correctie_m2.cnt_kenmerkcontract_waarde IS NOT NULL
     UNION ALL                              -- Bedrag per Kosten-listbox gezet!
     SELECT '*CONCEPT*' fin_verkoopfactuur_id,
            'CHV' || TRIM (x.cnt_contract_nummer) po_nr,           -- Regulier
            'CHV' || TRIM (x.cnt_contract_nummer) cnt_contract_nummer,   -- PO
            SUBSTR ('0' || TO_CHAR (x.cnt_kenmerk_key), -4) || TO_CHAR (x.ins_discipline_key) sortering, -- Sorteren op (eigen) discipline_key; 8 posities!
            'CHV - ' || TRIM (SUBSTR (tar.fac_usrdata_omschr, 1, INSTR (tar.fac_usrdata_omschr, '-') - 1)) regel, -- ICT/Facilitair/Service/Schoonmaak
            TO_CHAR (SYSDATE, 'dd-mm-yyyy') factuurdatum, TO_CHAR (SYSDATE + 30, 'dd-mm-yyyy') vervaldatum,
            x.cnt_contract_key, x.cnt_contract_nummer_intern, x.cnt_contract_versie, x.lv,
            --x.cnt_contract_korting,                               -- Korting %
            x.prs_bedrijf_key, x.prs_bedrijf_naam prs_debiteur_naam, TRIM (x.prs_overeenkomst_nr) debiteur_nr,
            btwnr.prs_kenmerklink_waarde btw_nr,
            --(SELECT MIN (TRIM (prs_contactpersoon_voorletters || ' ' || TRIM (prs_contactpersoon_tussenv || ' ' || prs_contactpersoon_naam)))
            --   FROM prs_contactpersoon
            --  WHERE prs_contactpersoon_verwijder IS NULL
            --        AND prs_contactpersoon_titel = '*' -- Contactpersoon op facturen
            --        AND prs_bedrijf_key = x.prs_bedrijf_key)
            NULL contactpersoon,
            x.adres, x.postcode, x.plaats, x.land,
            x.prs_kostenplaats_key, x.prs_kostenplaats_nr, x.prs_kostenplaats_omschrijving, x.prs_kostenplaatsgrp_oms,
            --x.prs_kostensoort_oms, x.prs_kostensoort_opmerking, x.prs_kostensoort_refcode, x.prs_kostensoortgrp_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'V', DECODE (x.btw, 0, '0', 'H')) fin_btwtabelwaarde_code,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'Verlegd', DECODE (x.btw, 0, 'Nul', 'Hoog')) fin_btwtabelwaarde_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, DECODE (x.btw, 0, 0, 21)) fin_btwtabelwaarde_perc,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 1, TO_NUMBER (NULL)) fin_btwtabelwaarde_verlegd,
            x.maand,
            TO_CHAR (TO_DATE (x.maand, 'yyyymm'), 'dd-mm-yyyy') mndbegin,
            TO_CHAR (LAST_DAY (TO_DATE (x.maand, 'yyyymm')), 'dd-mm-yyyy') mndeinde,
            TO_CHAR (GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')), 'dd-mm-yyyy') dagbegin,
            TO_CHAR (LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))), 'dd-mm-yyyy') dageinde,
            LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1 mndbes, -- Beschikbaar
            LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1 mndbez, -- Bezet
            rxo.alg_ruimte_opp_alt1 aantal,                             -- VVO
            tar.fac_usrdata_prijs tarief,                 -- Jaartarief per m2
            DECODE (TRIM (SUBSTR (tar.fac_usrdata_code, 1, INSTR (tar.fac_usrdata_code, '/') - 1)), '8604', 1, COALESCE (vvo_toeslag.fac_usrdata_prijs, 0)) vvo_toeslag, -- VVO toeslagperc. (behalve igv. 8604=Schoonmaak)
            --1 korting_pct,                                    -- Kortingsperc.
            1 verv_toeslag,                           -- Vervangend toeslagperc.
            fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde) korting_pm2, -- Korting per m2 ICT/Facilitair/Service/Schoonmaak
            pa.alg_onroerendgoed_type,
            pa.alg_onroerendgoed_keys,
            pa.alg_plaatsaanduiding,
            ROUND (((LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1) / (LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1)) *
                   --((100 - COALESCE (x.cnt_contract_korting, 0)) / 100) *
                   COALESCE (rxo.alg_ruimte_opp_alt1, 0) *
                   DECODE (TRIM (SUBSTR (tar.fac_usrdata_code, 1, INSTR (tar.fac_usrdata_code, '/') - 1)), '8604', 1, COALESCE (vvo_toeslag.fac_usrdata_prijs, 0)) * -- VVO toeslagperc. (behalve igv. 8604=Schoonmaak)
                   --(COALESCE (tar.fac_usrdata_prijs, 0) - COALESCE (fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde), 0)) *
                   DECODE (tar.fac_usrdata_prijs, NULL, 0, tar.fac_usrdata_prijs - COALESCE (fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde), 0)) *
                   1/12, 2)
               mndnet,         -- Netto maandbedrag (incl. kortingspercentage)
            ROUND (((LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1) / (LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1)) *
                   --((100 - COALESCE (x.cnt_contract_korting, 0)) / 100) *
                   COALESCE (rxo.alg_ruimte_opp_alt1, 0) *
                   DECODE (TRIM (SUBSTR (tar.fac_usrdata_code, 1, INSTR (tar.fac_usrdata_code, '/') - 1)), '8604', 1, COALESCE (vvo_toeslag.fac_usrdata_prijs, 0)) * -- VVO toeslagperc. (behalve igv. 8604=Schoonmaak)
                   --(COALESCE (tar.fac_usrdata_prijs, 0) - COALESCE (fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde), 0)) *
                   DECODE (tar.fac_usrdata_prijs, NULL, 0, tar.fac_usrdata_prijs - COALESCE (fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde), 0)) *
                   DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, x.btw) *
                   1/12, 2)
               mndbtw,                                      -- BTW maandbedrag
            TRIM (SUBSTR (tar.fac_usrdata_code, 1, INSTR (tar.fac_usrdata_code, '/') - 1)) grtboekrek,
            TO_NUMBER (NULL) mld_melding_key,          -- Correctiemelding-key
            NULL mld_melding_omschrijving
       FROM (SELECT c.ins_discipline_key,
                    c.cnt_contract_key,
                    c.cnt_contract_nummer_intern, c.cnt_contract_versie,
                    c.cnt_contract_nummer,
                    c.cnt_contract_looptijd_van lv, c.cnt_contract_looptijd_tot lt,
                    c.cnt_contract_korting,
                    b.prs_bedrijf_key, b.prs_bedrijf_naam, b.prs_overeenkomst_nr,
                    0.21 btw,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_adres, b.prs_bedrijf_post_adres) adres,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_postcode, b.prs_bedrijf_post_postcode) postcode,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_plaats, b.prs_bedrijf_post_plaats) plaats,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_land, b.prs_bedrijf_post_land) land,
                    kp.prs_kostenplaats_key, kp.prs_kostenplaats_nr, kp.prs_kostenplaats_omschrijving, kpg.prs_kostenplaatsgrp_oms,
                    c.maand,
                    k.cnt_kenmerk_key,
                    ud.fac_usrdata_code
               FROM (SELECT lp.maand, c.*
                       FROM lopendeperiode lp, cnt_v_aanwezigcontract c
                      WHERE c.ins_discipline_key = 2001            -- Huur CHV
                            AND c.cnt_contract_status = 0     -- NIET Gesloten
                            AND TRUNC (c.cnt_contract_looptijd_van) < LAST_DAY (TO_DATE (lp.maand || '01', 'yyyymmdd')) -- Van-datum < einde te factureren maand
                            AND c.cnt_contract_looptijd_tot > TO_DATE (lp.maand || '01', 'yyyymmdd') -- Tot-datum > begin te factureren maand
                     UNION ALL -- Soms 2 maanden factureren (of 1 maand achteraf?)!
                     SELECT TO_CHAR (TO_DATE (lp.maand || '01', 'yyyymmdd') - 1, 'yyyymm') maand, c.*
                       FROM lopendeperiode lp, cnt_v_aanwezigcontract c
                      WHERE c.ins_discipline_key = 2001            -- Huur CHV
                            AND c.cnt_contract_status = 0     -- NIET Gesloten
                            AND c.cnt_contract_aanmaak > ADD_MONTHS (TO_DATE (lp.maand || '01', 'yyyymmdd'), -1) -- Na begin voorgaande maand aangemaakt!
                            AND TRUNC (c.cnt_contract_looptijd_van) BETWEEN ADD_MONTHS (TO_DATE (lp.maand || '01', 'yyyymmdd'), -1) AND TO_DATE (lp.maand || '01', 'yyyymmdd') -- Van-datum in voorgaande maand!
                            AND NOT EXISTS -- Voorgaande maand nog niet gefactureerd!
                                  (SELECT 1
                                     FROM fin_verkoopfactuur
                                    WHERE fin_verkoopfactuur_maand = TO_CHAR (TO_DATE (lp.maand || '01', 'yyyymmdd') - 1, 'yyyymm') -- Voorgaande maand!
                                          AND fin_verkoopfactuur_xmlnode = 'contract'
                                          AND fin_verkoopfactuur_refkey = c.cnt_contract_key)) c,
                    prs_bedrijf b,
                    prs_kostenplaats kp,
                    prs_kostenplaatsgrp kpg,
                    cnt_kenmerkcontract kc,
                    cnt_kenmerk k,
                    fac_usrdata ud
              WHERE c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
                    AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
                    AND kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)
                    AND c.cnt_contract_key = kc.cnt_contract_key
                    AND kc.cnt_kenmerkcontract_verwijder IS NULL
                    AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                    AND k.cnt_kenmerk_verwijder IS NULL
                    AND k.cnt_kenmerk_key IN (643, 645, 647, 649) -- ICT/Facilitair/Service/Schoonmaak
                    AND fac.safe_to_number (kc.cnt_kenmerkcontract_waarde) = ud.fac_usrdata_key
                    AND ud.fac_usrdata_key NOT IN (981, 984, 987, 990)) x -- Nvt.
            LEFT JOIN prs_kenmerklink btwnr
               ON x.prs_bedrijf_key = btwnr.prs_link_key
                  AND btwnr.prs_kenmerklink_verwijder IS NULL
                  AND btwnr.prs_kenmerk_key = -1            -- BTW-nummer (NL)
            LEFT JOIN prs_kenmerklink btwvl
               ON x.prs_bedrijf_key = btwvl.prs_link_key
                  AND btwvl.prs_kenmerklink_verwijder IS NULL
                  AND btwvl.prs_kenmerk_key = -1                -- BTW verlegd
            LEFT JOIN cnt_kenmerkcontract vsov_kc
               ON x.cnt_contract_key = vsov_kc.cnt_contract_key
                  AND vsov_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND vsov_kc.cnt_kenmerk_key = -1                     -- VSOV
            LEFT JOIN cnt_v_aanwezigcontract_plaats ccp
               ON x.cnt_contract_key = ccp.cnt_contract_key
                  AND ccp.cnt_alg_plaats_code = 'R'   -- Alleen Scope-ruimten!
            LEFT JOIN alg_v_plaatsaanduiding_all pa
               ON ccp.cnt_alg_plaats_key = pa.alg_onroerendgoed_keys
            LEFT JOIN alg_v_aanwezigruimte rxo
               ON ccp.cnt_alg_plaats_key = rxo.alg_ruimte_key
            LEFT JOIN cnt_kenmerkcontract tt_kc
               ON x.cnt_contract_key = tt_kc.cnt_contract_key
                  AND tt_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND tt_kc.cnt_kenmerk_key = 401               -- Tarieftabel
            LEFT JOIN fac_v_aanwezigusrdata tt_ud
               ON fac.safe_to_number (tt_kc.cnt_kenmerkcontract_waarde) = tt_ud.fac_usrdata_key
            LEFT JOIN fac_v_aanwezigusrdata tar
               ON fac.safe_to_number (tt_ud.fac_usrdata_code) = tar.fac_usrtab_key
                  AND UPPER (SUBSTR (tar.fac_usrdata_code, INSTR (tar.fac_usrdata_code, '/') + 1)) = UPPER (x.fac_usrdata_code)
            LEFT JOIN cnt_kenmerkcontract vvo_toeslag_kc
               ON x.cnt_contract_key = vvo_toeslag_kc.cnt_contract_key
                  AND vvo_toeslag_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND vvo_toeslag_kc.cnt_kenmerk_key = 402 -- VVO toeslagperc.
            LEFT JOIN fac_v_aanwezigusrdata vvo_toeslag
               ON fac.safe_to_number (vvo_toeslag_kc.cnt_kenmerkcontract_waarde) = vvo_toeslag.fac_usrdata_key
            --LEFT JOIN cnt_kenmerkcontract korting_pct_kc
            --   ON x.cnt_contract_key = korting_pct_kc.cnt_contract_key
            --      AND korting_pct_kc.cnt_kenmerkcontract_verwijder IS NULL
            --      AND korting_pct_kc.cnt_kenmerk_key = 403    -- Kortingsperc.
            --LEFT JOIN fac_v_aanwezigusrdata korting_pct
            --   ON fac.safe_to_number (korting_pct_kc.cnt_kenmerkcontract_waarde) = korting_pct.fac_usrdata_key
            LEFT JOIN cnt_kenmerkcontract korting_pm2
               ON x.cnt_contract_key = korting_pm2.cnt_contract_key
                  AND x.cnt_kenmerk_key + 1 = korting_pm2.cnt_kenmerk_key
                  AND korting_pm2.cnt_kenmerkcontract_verwijder IS NULL
                  AND korting_pm2.cnt_kenmerk_key IN (644, 646, 648, 650) -- Korting per m2 (ICT/Facilitair/Service/Schoonmaak)
     UNION ALL                       -- M2 correctie per Kosten-listbox gezet!
     SELECT '*CONCEPT*' fin_verkoopfactuur_id,
            'CHV' || TRIM (x.cnt_contract_nummer) po_nr,           -- Regulier
            'CHV' || TRIM (x.cnt_contract_nummer) cnt_contract_nummer,   -- PO
            SUBSTR ('0' || TO_CHAR (x.cnt_kenmerk_key), -4) || TO_CHAR (x.ins_discipline_key) sortering, -- Sorteren op (eigen) discipline_key; 8 posities!
            'CHV - ' || TRIM (SUBSTR (tar.fac_usrdata_omschr, 1, INSTR (tar.fac_usrdata_omschr, '-') - 1)) regel, -- ICT/Facilitair/Service/Schoonmaak
            TO_CHAR (SYSDATE, 'dd-mm-yyyy') factuurdatum, TO_CHAR (SYSDATE + 30, 'dd-mm-yyyy') vervaldatum,
            x.cnt_contract_key, x.cnt_contract_nummer_intern, x.cnt_contract_versie, x.lv,
            --x.cnt_contract_korting,                               -- Korting %
            x.prs_bedrijf_key, x.prs_bedrijf_naam prs_debiteur_naam, TRIM (x.prs_overeenkomst_nr) debiteur_nr,
            btwnr.prs_kenmerklink_waarde btw_nr,
            --(SELECT MIN (TRIM (prs_contactpersoon_voorletters || ' ' || TRIM (prs_contactpersoon_tussenv || ' ' || prs_contactpersoon_naam)))
            --   FROM prs_contactpersoon
            --  WHERE prs_contactpersoon_verwijder IS NULL
            --        AND prs_contactpersoon_titel = '*' -- Contactpersoon op facturen
            --        AND prs_bedrijf_key = x.prs_bedrijf_key)
            NULL contactpersoon,
            x.adres, x.postcode, x.plaats, x.land,
            x.prs_kostenplaats_key, x.prs_kostenplaats_nr, x.prs_kostenplaats_omschrijving, x.prs_kostenplaatsgrp_oms,
            --x.prs_kostensoort_oms, x.prs_kostensoort_opmerking, x.prs_kostensoort_refcode, x.prs_kostensoortgrp_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'V', DECODE (x.btw, 0, '0', 'H')) fin_btwtabelwaarde_code,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'Verlegd', DECODE (x.btw, 0, 'Nul', 'Hoog')) fin_btwtabelwaarde_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, DECODE (x.btw, 0, 0, 21)) fin_btwtabelwaarde_perc,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 1, TO_NUMBER (NULL)) fin_btwtabelwaarde_verlegd,
            x.maand,
            TO_CHAR (TO_DATE (x.maand, 'yyyymm'), 'dd-mm-yyyy') mndbegin,
            TO_CHAR (LAST_DAY (TO_DATE (x.maand, 'yyyymm')), 'dd-mm-yyyy') mndeinde,
            TO_CHAR (GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')), 'dd-mm-yyyy') dagbegin,
            TO_CHAR (LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))), 'dd-mm-yyyy') dageinde,
            LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1 mndbes, -- Beschikbaar
            LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1 mndbez, -- Bezet
            fac.safe_to_number (correctie_m2.cnt_kenmerkcontract_waarde) aantal, -- VVO-correctie
            tar.fac_usrdata_prijs tarief,                 -- Jaartarief per m2
            DECODE (TRIM (SUBSTR (tar.fac_usrdata_code, 1, INSTR (tar.fac_usrdata_code, '/') - 1)), '8604', 1, COALESCE (vvo_toeslag.fac_usrdata_prijs, 0)) vvo_toeslag, -- VVO toeslagperc. (behalve igv. 8604=Schoonmaak)
            --1 korting_pct,                                    -- Kortingsperc.
            1 verv_toeslag,                           -- Vervangend toeslagperc.
            fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde) korting_pm2, -- Korting per m2 ICT/Facilitair/Service/Schoonmaak
            'C' alg_onroerendgoed_type,
            -1 alg_onroerendgoed_keys,
            'Correctie' alg_plaatsaanduiding,
            ROUND (((LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1) / (LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1)) *
                   --((100 - COALESCE (x.cnt_contract_korting, 0)) / 100) *
                   COALESCE (fac.safe_to_number (correctie_m2.cnt_kenmerkcontract_waarde), 0) *
                   DECODE (TRIM (SUBSTR (tar.fac_usrdata_code, 1, INSTR (tar.fac_usrdata_code, '/') - 1)), '8604', 1, COALESCE (vvo_toeslag.fac_usrdata_prijs, 0)) * -- VVO toeslagperc. (behalve igv. 8604=Schoonmaak)
                   --(COALESCE (tar.fac_usrdata_prijs, 0) - COALESCE (fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde), 0)) *
                   DECODE (tar.fac_usrdata_prijs, NULL, 0, tar.fac_usrdata_prijs - COALESCE (fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde), 0)) *
                   1/12, 2)
               mndnet,         -- Netto maandbedrag (incl. kortingspercentage)
            ROUND (((LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1) / (LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1)) *
                   --((100 - COALESCE (x.cnt_contract_korting, 0)) / 100) *
                   COALESCE (fac.safe_to_number (correctie_m2.cnt_kenmerkcontract_waarde), 0) *
                   DECODE (TRIM (SUBSTR (tar.fac_usrdata_code, 1, INSTR (tar.fac_usrdata_code, '/') - 1)), '8604', 1, COALESCE (vvo_toeslag.fac_usrdata_prijs, 0)) * -- VVO toeslagperc. (behalve igv. 8604=Schoonmaak)
                   --(COALESCE (tar.fac_usrdata_prijs, 0) - COALESCE (fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde), 0)) *
                   DECODE (tar.fac_usrdata_prijs, NULL, 0, tar.fac_usrdata_prijs - COALESCE (fac.safe_to_number (korting_pm2.cnt_kenmerkcontract_waarde), 0)) *
                   DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, x.btw) *
                   1/12, 2)
               mndbtw,                                      -- BTW maandbedrag
            TRIM (SUBSTR (tar.fac_usrdata_code, 1, INSTR (tar.fac_usrdata_code, '/') - 1)) grtboekrek,
            TO_NUMBER (NULL) mld_melding_key,          -- Correctiemelding-key
            NULL mld_melding_omschrijving
       FROM (SELECT c.ins_discipline_key,
                    c.cnt_contract_key,
                    c.cnt_contract_nummer_intern, c.cnt_contract_versie,
                    c.cnt_contract_nummer,
                    c.cnt_contract_looptijd_van lv, c.cnt_contract_looptijd_tot lt,
                    c.cnt_contract_korting,
                    b.prs_bedrijf_key, b.prs_bedrijf_naam, b.prs_overeenkomst_nr,
                    0.21 btw,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_adres, b.prs_bedrijf_post_adres) adres,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_postcode, b.prs_bedrijf_post_postcode) postcode,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_plaats, b.prs_bedrijf_post_plaats) plaats,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_land, b.prs_bedrijf_post_land) land,
                    kp.prs_kostenplaats_key, kp.prs_kostenplaats_nr, kp.prs_kostenplaats_omschrijving, kpg.prs_kostenplaatsgrp_oms,
                    c.maand,
                    k.cnt_kenmerk_key,
                    ud.fac_usrdata_code
               FROM (SELECT lp.maand, c.*
                       FROM lopendeperiode lp, cnt_v_aanwezigcontract c
                      WHERE c.ins_discipline_key = 2001            -- Huur CHV
                            AND c.cnt_contract_status = 0     -- NIET Gesloten
                            AND TRUNC (c.cnt_contract_looptijd_van) < LAST_DAY (TO_DATE (lp.maand || '01', 'yyyymmdd')) -- Van-datum < einde te factureren maand
                            AND c.cnt_contract_looptijd_tot > TO_DATE (lp.maand || '01', 'yyyymmdd') -- Tot-datum > begin te factureren maand
                     UNION ALL -- Soms 2 maanden factureren (of 1 maand achteraf?)!
                     SELECT TO_CHAR (TO_DATE (lp.maand || '01', 'yyyymmdd') - 1, 'yyyymm') maand, c.*
                       FROM lopendeperiode lp, cnt_v_aanwezigcontract c
                      WHERE c.ins_discipline_key = 2001            -- Huur CHV
                            AND c.cnt_contract_status = 0     -- NIET Gesloten
                            AND c.cnt_contract_aanmaak > ADD_MONTHS (TO_DATE (lp.maand || '01', 'yyyymmdd'), -1) -- Na begin voorgaande maand aangemaakt!
                            AND TRUNC (c.cnt_contract_looptijd_van) BETWEEN ADD_MONTHS (TO_DATE (lp.maand || '01', 'yyyymmdd'), -1) AND TO_DATE (lp.maand || '01', 'yyyymmdd') -- Van-datum in voorgaande maand!
                            AND NOT EXISTS -- Voorgaande maand nog niet gefactureerd!
                                  (SELECT 1
                                     FROM fin_verkoopfactuur
                                    WHERE fin_verkoopfactuur_maand = TO_CHAR (TO_DATE (lp.maand || '01', 'yyyymmdd') - 1, 'yyyymm') -- Voorgaande maand!
                                          AND fin_verkoopfactuur_xmlnode = 'contract'
                                          AND fin_verkoopfactuur_refkey = c.cnt_contract_key)) c,
                    prs_bedrijf b,
                    prs_kostenplaats kp,
                    prs_kostenplaatsgrp kpg,
                    cnt_kenmerkcontract kc,
                    cnt_kenmerk k,
                    fac_usrdata ud
              WHERE c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
                    AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
                    AND kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)
                    AND c.cnt_contract_key = kc.cnt_contract_key
                    AND kc.cnt_kenmerkcontract_verwijder IS NULL
                    AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                    AND k.cnt_kenmerk_verwijder IS NULL
                    AND k.cnt_kenmerk_key IN (643, 645, 647, 649) -- ICT/Facilitair/Service/Schoonmaak
                    AND fac.safe_to_number (kc.cnt_kenmerkcontract_waarde) = ud.fac_usrdata_key
                    AND ud.fac_usrdata_key NOT IN (981, 984, 987, 990)) x -- Nvt.
            LEFT JOIN prs_kenmerklink btwnr
               ON x.prs_bedrijf_key = btwnr.prs_link_key
                  AND btwnr.prs_kenmerklink_verwijder IS NULL
                  AND btwnr.prs_kenmerk_key = -1            -- BTW-nummer (NL)
            LEFT JOIN prs_kenmerklink btwvl
               ON x.prs_bedrijf_key = btwvl.prs_link_key
                  AND btwvl.prs_kenmerklink_verwijder IS NULL
                  AND btwvl.prs_kenmerk_key = -1                -- BTW verlegd
            LEFT JOIN cnt_kenmerkcontract vsov_kc
               ON x.cnt_contract_key = vsov_kc.cnt_contract_key
                  AND vsov_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND vsov_kc.cnt_kenmerk_key = -1                     -- VSOV
            --LEFT JOIN cnt_v_aanwezigcontract_plaats ccp
            --   ON x.cnt_contract_key = ccp.cnt_contract_key
            --      AND ccp.cnt_alg_plaats_code = 'R'   -- Alleen Scope-ruimten!
            --LEFT JOIN alg_v_plaatsaanduiding_all pa
            --   ON ccp.cnt_alg_plaats_key = pa.alg_onroerendgoed_keys
            --LEFT JOIN alg_v_aanwezigruimte rxo
            --   ON ccp.cnt_alg_plaats_key = rxo.alg_ruimte_key
            LEFT JOIN cnt_kenmerkcontract correctie_m2
               ON x.cnt_contract_key = correctie_m2.cnt_contract_key
                  AND correctie_m2.cnt_kenmerkcontract_verwijder IS NULL
                  AND correctie_m2.cnt_kenmerk_key = 701       -- Correctie m2
            LEFT JOIN cnt_kenmerkcontract tt_kc
               ON x.cnt_contract_key = tt_kc.cnt_contract_key
                  AND tt_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND tt_kc.cnt_kenmerk_key = 401               -- Tarieftabel
            LEFT JOIN fac_v_aanwezigusrdata tt_ud
               ON fac.safe_to_number (tt_kc.cnt_kenmerkcontract_waarde) = tt_ud.fac_usrdata_key
            LEFT JOIN fac_v_aanwezigusrdata tar
               ON fac.safe_to_number (tt_ud.fac_usrdata_code) = tar.fac_usrtab_key
                  AND UPPER (SUBSTR (tar.fac_usrdata_code, INSTR (tar.fac_usrdata_code, '/') + 1)) = UPPER (x.fac_usrdata_code)
            LEFT JOIN cnt_kenmerkcontract vvo_toeslag_kc
               ON x.cnt_contract_key = vvo_toeslag_kc.cnt_contract_key
                  AND vvo_toeslag_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND vvo_toeslag_kc.cnt_kenmerk_key = 402 -- VVO toeslagperc.
            LEFT JOIN fac_v_aanwezigusrdata vvo_toeslag
               ON fac.safe_to_number (vvo_toeslag_kc.cnt_kenmerkcontract_waarde) = vvo_toeslag.fac_usrdata_key
            --LEFT JOIN cnt_kenmerkcontract korting_pct_kc
            --   ON x.cnt_contract_key = korting_pct_kc.cnt_contract_key
            --      AND korting_pct_kc.cnt_kenmerkcontract_verwijder IS NULL
            --      AND korting_pct_kc.cnt_kenmerk_key = 403    -- Kortingsperc.
            --LEFT JOIN fac_v_aanwezigusrdata korting_pct
            --   ON fac.safe_to_number (korting_pct_kc.cnt_kenmerkcontract_waarde) = korting_pct.fac_usrdata_key
            LEFT JOIN cnt_kenmerkcontract korting_pm2
               ON x.cnt_contract_key = korting_pm2.cnt_contract_key
                  AND x.cnt_kenmerk_key + 1 = korting_pm2.cnt_kenmerk_key
                  AND korting_pm2.cnt_kenmerkcontract_verwijder IS NULL
                  AND korting_pm2.cnt_kenmerk_key IN (644, 646, 648, 650) -- Korting per m2 (ICT/Facilitair/Service/Schoonmaak)
      WHERE correctie_m2.cnt_kenmerkcontract_waarde IS NOT NULL
     UNION ALL                                          -- Absolute correctie!
     SELECT '*CONCEPT*' fin_verkoopfactuur_id,
            'CHV' || TRIM (x.cnt_contract_nummer) po_nr,           -- Regulier
            'CHV' || TRIM (x.cnt_contract_nummer) cnt_contract_nummer,   -- PO
            --'9999' || TO_CHAR (x.ins_discipline_key) sortering, -- Sorteren op (eigen) discipline_key; 8 posities!
            --'CHV - ' || x.cnt_srtkenmerk_omschrijving regel,
            '0000' || TO_CHAR (x.ins_discipline_key) sortering, -- Sorteren op (eigen) discipline_key; 8 posities!
            'CHV - Huur' regel,       -- Absolute correctie verrekenen in Huur
            TO_CHAR (SYSDATE, 'dd-mm-yyyy') factuurdatum, TO_CHAR (SYSDATE + 30, 'dd-mm-yyyy') vervaldatum,
            x.cnt_contract_key, x.cnt_contract_nummer_intern, x.cnt_contract_versie, x.lv,
            --x.cnt_contract_korting,                               -- Korting %
            x.prs_bedrijf_key, x.prs_bedrijf_naam prs_debiteur_naam, TRIM (x.prs_overeenkomst_nr) debiteur_nr,
            btwnr.prs_kenmerklink_waarde btw_nr,
            --(SELECT MIN (TRIM (prs_contactpersoon_voorletters || ' ' || TRIM (prs_contactpersoon_tussenv || ' ' || prs_contactpersoon_naam)))
            --   FROM prs_contactpersoon
            --  WHERE prs_contactpersoon_verwijder IS NULL
            --        AND prs_contactpersoon_titel = '*' -- Contactpersoon op facturen
            --        AND prs_bedrijf_key = x.prs_bedrijf_key)
            NULL contactpersoon,
            x.adres, x.postcode, x.plaats, x.land,
            x.prs_kostenplaats_key, x.prs_kostenplaats_nr, x.prs_kostenplaats_omschrijving, x.prs_kostenplaatsgrp_oms,
            --x.prs_kostensoort_oms, x.prs_kostensoort_opmerking, x.prs_kostensoort_refcode, x.prs_kostensoortgrp_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'V', DECODE (verv_toeslag.fac_usrdata_key, 1001, 'H', '0')) fin_btwtabelwaarde_code,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'Verlegd', DECODE (verv_toeslag.fac_usrdata_key, 1001, 'Hoog', 'Nul')) fin_btwtabelwaarde_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, DECODE (verv_toeslag.fac_usrdata_key, 1001, 21, 0)) fin_btwtabelwaarde_perc,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 1, TO_NUMBER (NULL)) fin_btwtabelwaarde_verlegd,
            x.maand,
            TO_CHAR (TO_DATE (x.maand, 'yyyymm'), 'dd-mm-yyyy') mndbegin,
            TO_CHAR (LAST_DAY (TO_DATE (x.maand, 'yyyymm')), 'dd-mm-yyyy') mndeinde,
            TO_CHAR (GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')), 'dd-mm-yyyy') dagbegin,
            TO_CHAR (LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))), 'dd-mm-yyyy') dageinde,
            LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1 mndbes, -- Beschikbaar
            LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1 mndbez, -- Bezet
            1 aantal,                                            -- Don't care
            -1 * fac.safe_to_number (x.cnt_kenmerkcontract_waarde) tarief, -- Jaartarief per m2
            1 vvo_toeslag,                                 -- VVO toeslagperc.
            --1 korting_pct,                                    -- Kortingsperc.
            1 verv_toeslag,                         -- Vervangend toeslagperc.
            0 korting_pm2,                                   -- Korting per m2
            NULL alg_onroerendgoed_type,
            NULL alg_onroerendgoed_keys,
            NULL alg_plaatsaanduiding,
            ROUND (((LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1) / (LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1)) *
                   --((100 - COALESCE (x.cnt_contract_korting, 0)) / 100) *
                   fac.safe_to_number (x.cnt_kenmerkcontract_waarde) *
                   1/12, 2)
               mndnet,         -- Netto maandbedrag (incl. kortingspercentage)
            ROUND (((LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1) / (LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1)) *
                   --((100 - COALESCE (x.cnt_contract_korting, 0)) / 100) *
                   fac.safe_to_number (x.cnt_kenmerkcontract_waarde) *
                   DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, DECODE (verv_toeslag.fac_usrdata_key, 1001, 0.21, 0)) *
                   1/12, 2)
               mndbtw,                                      -- BTW maandbedrag
            --TRIM (SUBSTR (tar.fac_usrdata_code, 1, INSTR (tar.fac_usrdata_code, '/') - 1)) grtboekrek,
            --TRIM (DECODE (biss_kc1.cnt_kenmerkcontract_waarde, '986', '8110', DECODE (biss_kc2.cnt_kenmerkcontract_waarde, '989', '8110', SUBSTR (tar.fac_usrdata_code, 1, INSTR (tar.fac_usrdata_code, '/') - 1)))) grtboekrek,
            DECODE (verv_toeslag.fac_usrdata_key, 1001, SUBSTR (tar.fac_usrdata_code, 1, INSTR (tar.fac_usrdata_code, '/') - 1), '8110') grtboekrek,
            TO_NUMBER (NULL) mld_melding_key,          -- Correctiemelding-key
            NULL mld_melding_omschrijving
       FROM (SELECT c.ins_discipline_key,
                    c.cnt_contract_key,
                    c.cnt_contract_nummer_intern, c.cnt_contract_versie,
                    c.cnt_contract_nummer,
                    c.cnt_contract_looptijd_van lv, c.cnt_contract_looptijd_tot lt,
                    c.cnt_contract_korting,
                    b.prs_bedrijf_key, b.prs_bedrijf_naam, b.prs_overeenkomst_nr,
                    --0.21 btw,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_adres, b.prs_bedrijf_post_adres) adres,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_postcode, b.prs_bedrijf_post_postcode) postcode,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_plaats, b.prs_bedrijf_post_plaats) plaats,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_land, b.prs_bedrijf_post_land) land,
                    kp.prs_kostenplaats_key, kp.prs_kostenplaats_nr, kp.prs_kostenplaats_omschrijving, kpg.prs_kostenplaatsgrp_oms,
                    c.maand,
                    sk.cnt_srtkenmerk_omschrijving,
                    kc.cnt_kenmerkcontract_waarde
               FROM (SELECT lp.maand, c.*
                       FROM lopendeperiode lp, cnt_v_aanwezigcontract c
                      WHERE c.ins_discipline_key = 2001            -- Huur CHV
                            AND c.cnt_contract_status = 0     -- NIET Gesloten
                            AND TRUNC (c.cnt_contract_looptijd_van) < LAST_DAY (TO_DATE (lp.maand || '01', 'yyyymmdd')) -- Van-datum < einde te factureren maand
                            AND c.cnt_contract_looptijd_tot > TO_DATE (lp.maand || '01', 'yyyymmdd') -- Tot-datum > begin te factureren maand
                     UNION ALL -- Soms 2 maanden factureren (of 1 maand achteraf?)!
                     SELECT TO_CHAR (TO_DATE (lp.maand || '01', 'yyyymmdd') - 1, 'yyyymm') maand, c.*
                       FROM lopendeperiode lp, cnt_v_aanwezigcontract c
                      WHERE c.ins_discipline_key = 2001            -- Huur CHV
                            AND c.cnt_contract_status = 0     -- NIET Gesloten
                            AND c.cnt_contract_aanmaak > ADD_MONTHS (TO_DATE (lp.maand || '01', 'yyyymmdd'), -1) -- Na begin voorgaande maand aangemaakt!
                            AND TRUNC (c.cnt_contract_looptijd_van) BETWEEN ADD_MONTHS (TO_DATE (lp.maand || '01', 'yyyymmdd'), -1) AND TO_DATE (lp.maand || '01', 'yyyymmdd') -- Van-datum in voorgaande maand!
                            AND NOT EXISTS -- Voorgaande maand nog niet gefactureerd!
                                  (SELECT 1
                                     FROM fin_verkoopfactuur
                                    WHERE fin_verkoopfactuur_maand = TO_CHAR (TO_DATE (lp.maand || '01', 'yyyymmdd') - 1, 'yyyymm') -- Voorgaande maand!
                                          AND fin_verkoopfactuur_xmlnode = 'contract'
                                          AND fin_verkoopfactuur_refkey = c.cnt_contract_key)) c,
                    prs_bedrijf b,
                    prs_kostenplaats kp,
                    prs_kostenplaatsgrp kpg,
                    cnt_kenmerkcontract kc,
                    cnt_kenmerk k,
                    cnt_srtkenmerk sk
              WHERE c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
                    AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
                    AND kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)
                    AND c.cnt_contract_key = kc.cnt_contract_key
                    AND kc.cnt_kenmerkcontract_verwijder IS NULL
                    AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                    AND k.cnt_kenmerk_verwijder IS NULL
                    AND k.cnt_kenmerk_key = 405         -- Absolute correctie!
                    AND k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key) x
            LEFT JOIN prs_kenmerklink btwnr
               ON x.prs_bedrijf_key = btwnr.prs_link_key
                  AND btwnr.prs_kenmerklink_verwijder IS NULL
                  AND btwnr.prs_kenmerk_key = -1            -- BTW-nummer (NL)
            LEFT JOIN prs_kenmerklink btwvl
               ON x.prs_bedrijf_key = btwvl.prs_link_key
                  AND btwvl.prs_kenmerklink_verwijder IS NULL
                  AND btwvl.prs_kenmerk_key = -1                -- BTW verlegd
            LEFT JOIN cnt_kenmerkcontract vsov_kc
               ON x.cnt_contract_key = vsov_kc.cnt_contract_key
                  AND vsov_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND vsov_kc.cnt_kenmerk_key = -1                     -- VSOV
            LEFT JOIN cnt_kenmerkcontract tt_kc
               ON x.cnt_contract_key = tt_kc.cnt_contract_key
                  AND tt_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND tt_kc.cnt_kenmerk_key = 401               -- Tarieftabel
            LEFT JOIN fac_v_aanwezigusrdata tt_ud
               ON fac.safe_to_number (tt_kc.cnt_kenmerkcontract_waarde) = tt_ud.fac_usrdata_key
            LEFT JOIN fac_v_aanwezigusrdata tar
               ON fac.safe_to_number (tt_ud.fac_usrdata_code) = tar.fac_usrtab_key
                  AND SUBSTR (tar.fac_usrdata_code, INSTR (tar.fac_usrdata_code, '/') + 1, 4) = 'Huur' -- Huur-tarief
            LEFT JOIN cnt_kenmerkcontract verv_toeslag_kc
               ON x.cnt_contract_key = verv_toeslag_kc.cnt_contract_key
                  AND verv_toeslag_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND verv_toeslag_kc.cnt_kenmerk_key = 642 -- Vervangend toeslagperc.
            LEFT JOIN fac_v_aanwezigusrdata verv_toeslag
               ON fac.safe_to_number (verv_toeslag_kc.cnt_kenmerkcontract_waarde) = verv_toeslag.fac_usrdata_key
            --LEFT JOIN cnt_kenmerkcontract biss_kc1
            --   ON x.cnt_contract_key = biss_kc1.cnt_contract_key
            --      AND biss_kc1.cnt_kenmerkcontract_verwijder IS NULL
            --      AND biss_kc1.cnt_kenmerk_key = 645     -- Facilitaire kosten
            --LEFT JOIN cnt_kenmerkcontract biss_kc2
            --   ON x.cnt_contract_key = biss_kc2.cnt_contract_key
            --      AND biss_kc2.cnt_kenmerkcontract_verwijder IS NULL
            --      AND biss_kc2.cnt_kenmerk_key = 647          -- Servicekosten
      WHERE COALESCE (fac.safe_to_number (x.cnt_kenmerkcontract_waarde), 0) != 0
     UNION ALL    -- Borg CHV (eenmalig factureren, liefst op eerste factuur)!
     SELECT '*CONCEPT*' fin_verkoopfactuur_id,
            'CHV' || TRIM (x.cnt_contract_nummer) po_nr,           -- Regulier
            'CHV' || TRIM (x.cnt_contract_nummer) cnt_contract_nummer,   -- PO
            '9999' || TO_CHAR (x.ins_discipline_key) sortering, -- Sorteren op (eigen) discipline_key; 8 posities!
            COALESCE (ks.prs_kostensoort_refcode, ks.prs_kostensoort_opmerking) regel, -- Borg CHV
            TO_CHAR (SYSDATE, 'dd-mm-yyyy') factuurdatum, TO_CHAR (SYSDATE + 30, 'dd-mm-yyyy') vervaldatum,
            x.cnt_contract_key, x.cnt_contract_nummer_intern, x.cnt_contract_versie, x.lv,
            --x.cnt_contract_korting,                               -- Korting %
            x.prs_bedrijf_key, x.prs_bedrijf_naam prs_debiteur_naam, TRIM (x.prs_overeenkomst_nr) debiteur_nr,
            btwnr.prs_kenmerklink_waarde btw_nr,
            --(SELECT MIN (TRIM (prs_contactpersoon_voorletters || ' ' || TRIM (prs_contactpersoon_tussenv || ' ' || prs_contactpersoon_naam)))
            --   FROM prs_contactpersoon
            --  WHERE prs_contactpersoon_verwijder IS NULL
            --        AND prs_contactpersoon_titel = '*' -- Contactpersoon op facturen
            --        AND prs_bedrijf_key = x.prs_bedrijf_key)
            NULL contactpersoon,
            x.adres, x.postcode, x.plaats, x.land,
            x.prs_kostenplaats_key, x.prs_kostenplaats_nr, x.prs_kostenplaats_omschrijving, x.prs_kostenplaatsgrp_oms,
            --x.prs_kostensoort_oms, x.prs_kostensoort_opmerking, x.prs_kostensoort_refcode, x.prs_kostensoortgrp_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'V', DECODE (x.btw, 0, '0', 'H')) fin_btwtabelwaarde_code,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'Verlegd', DECODE (x.btw, 0, 'Nul', 'Hoog')) fin_btwtabelwaarde_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, DECODE (x.btw, 0, 0, 21)) fin_btwtabelwaarde_perc,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 1, TO_NUMBER (NULL)) fin_btwtabelwaarde_verlegd,
            x.maand,
            TO_CHAR (TO_DATE (x.maand, 'yyyymm'), 'dd-mm-yyyy') mndbegin,
            TO_CHAR (LAST_DAY (TO_DATE (x.maand, 'yyyymm')), 'dd-mm-yyyy') mndeinde,
            TO_CHAR (GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')), 'dd-mm-yyyy') dagbegin,
            TO_CHAR (LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))), 'dd-mm-yyyy') dageinde,
            LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1 mndbes, -- Beschikbaar
            LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1 mndbez, -- Bezet
            fac.safe_to_number (aantal.cnt_kenmerkcontract_waarde) aantal,
            fac.safe_to_number (bedrag.cnt_kenmerkcontract_waarde) tarief,
            1 vvo_toeslag,                                 -- VVO toeslagperc.
            --1 korting_pct,                                    -- Kortingsperc.
            1 verv_toeslag,                         -- Vervangend toeslagperc.
            0 korting_pm2,                                   -- Korting per m2
            NULL alg_onroerendgoed_type,
            NULL alg_onroerendgoed_keys,
            NULL alg_plaatsaanduiding,
            ROUND (((LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1) / (LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1)) *
                   --((100 - COALESCE (x.cnt_contract_korting, 0)) / 100) *
                   fac.safe_to_number (aantal.cnt_kenmerkcontract_waarde) *
                   fac.safe_to_number (bedrag.cnt_kenmerkcontract_waarde) *
                   1/12, 2)
               mndnet,         -- Netto maandbedrag (incl. kortingspercentage)
            ROUND (((LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1) / (LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1)) *
                   --((100 - COALESCE (x.cnt_contract_korting, 0)) / 100) *
                   fac.safe_to_number (aantal.cnt_kenmerkcontract_waarde) *
                   fac.safe_to_number (bedrag.cnt_kenmerkcontract_waarde) *
                   DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, x.btw) *
                   1/12, 2)
               mndbtw,                                      -- BTW maandbedrag
            TRIM (ks.prs_kostensoort_oms) grtboekrek,
            TO_NUMBER (NULL) mld_melding_key,          -- Correctiemelding-key
            NULL mld_melding_omschrijving
       FROM (SELECT c.ins_discipline_key,
                    c.cnt_contract_key,
                    c.cnt_contract_nummer_intern, c.cnt_contract_versie,
                    c.cnt_contract_nummer,
                    c.cnt_contract_looptijd_van lv, c.cnt_contract_looptijd_tot lt,
                    c.cnt_contract_korting,
                    b.prs_bedrijf_key, b.prs_bedrijf_naam, b.prs_overeenkomst_nr,
                    0.21 btw,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_adres, b.prs_bedrijf_post_adres) adres,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_postcode, b.prs_bedrijf_post_postcode) postcode,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_plaats, b.prs_bedrijf_post_plaats) plaats,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_land, b.prs_bedrijf_post_land) land,
                    kp.prs_kostenplaats_key, kp.prs_kostenplaats_nr, kp.prs_kostenplaats_omschrijving, kpg.prs_kostenplaatsgrp_oms,
                    lp.maand
               FROM lopendeperiode lp,
                    cnt_v_aanwezigcontract c,
                    prs_bedrijf b,
                    prs_kostenplaats kp,
                    prs_kostenplaatsgrp kpg
              WHERE c.ins_discipline_key = 2002                    -- Borg CHV
                    AND c.cnt_contract_status = 0             -- NIET Gesloten
                    AND c.cnt_contract_aanmaak > ADD_MONTHS (TO_DATE (lp.maand || '01', 'yyyymmdd'), -1) -- Voorgaande maand aangemaakt!
                    AND TRUNC (c.cnt_contract_looptijd_van) >= ADD_MONTHS (TO_DATE (lp.maand || '01', 'yyyymmdd'), -1) -- Van-datum in voorgaande maand!
                    AND NOT EXISTS   -- Borg-contract niet eerder gefactureerd!
                          (SELECT 1
                             FROM fin_verkoopfactuur
                            WHERE fin_verkoopfactuur_xmlnode = 'contract'
                                  AND fin_verkoopfactuur_refkey = c.cnt_contract_key)
                    AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
                    AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
                    AND kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)) x
            LEFT JOIN prs_kenmerklink btwnr
               ON x.prs_bedrijf_key = btwnr.prs_link_key
                  AND btwnr.prs_kenmerklink_verwijder IS NULL
                  AND btwnr.prs_kenmerk_key = -1            -- BTW-nummer (NL)
            LEFT JOIN prs_kenmerklink btwvl
               ON x.prs_bedrijf_key = btwvl.prs_link_key
                  AND btwvl.prs_kenmerklink_verwijder IS NULL
                  AND btwvl.prs_kenmerk_key = -1                -- BTW verlegd
            LEFT JOIN cnt_kenmerkcontract vsov_kc
               ON x.cnt_contract_key = vsov_kc.cnt_contract_key
                  AND vsov_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND vsov_kc.cnt_kenmerk_key = -1                     -- VSOV
            LEFT JOIN cnt_discipline cd
               ON x.ins_discipline_key = cd.ins_discipline_key
            LEFT JOIN prs_kostensoort ks
               ON cd.prs_kostensoort_key = ks.prs_kostensoort_key
            LEFT JOIN cnt_kenmerkcontract aantal
               ON x.cnt_contract_key = aantal.cnt_contract_key
                  AND aantal.cnt_kenmerkcontract_verwijder IS NULL
                  AND aantal.cnt_kenmerk_key = 413                   -- Aantal
            LEFT JOIN cnt_kenmerkcontract bedrag
               ON x.cnt_contract_key = bedrag.cnt_contract_key
                  AND bedrag.cnt_kenmerkcontract_verwijder IS NULL
                  AND bedrag.cnt_kenmerk_key = 414                   -- Bedrag
     UNION ALL                                   -- Parkeren CHV/Parkeren CMD!
     SELECT '*CONCEPT*' fin_verkoopfactuur_id,
            DECODE (x.ins_discipline_key, 2004, 'CMD', 'CHV') || TRIM (x.cnt_contract_nummer) po_nr, -- Regulier
            DECODE (x.ins_discipline_key, 2004, 'CMD', 'CHV') || TRIM (x.cnt_contract_nummer) cnt_contract_nummer, -- PO
            '9999' || TO_CHAR (x.ins_discipline_key) sortering, -- Sorteren op (eigen) discipline_key; 8 posities!
            COALESCE (ks.prs_kostensoort_refcode, ks.prs_kostensoort_opmerking) regel, -- Parkeren CHV/Parkeren CMD
            TO_CHAR (SYSDATE, 'dd-mm-yyyy') factuurdatum, TO_CHAR (SYSDATE + 30, 'dd-mm-yyyy') vervaldatum,
            x.cnt_contract_key, x.cnt_contract_nummer_intern, x.cnt_contract_versie, x.lv,
            --x.cnt_contract_korting,                               -- Korting %
            x.prs_bedrijf_key, x.prs_bedrijf_naam prs_debiteur_naam, TRIM (x.prs_overeenkomst_nr) debiteur_nr,
            btwnr.prs_kenmerklink_waarde btw_nr,
            --(SELECT MIN (TRIM (prs_contactpersoon_voorletters || ' ' || TRIM (prs_contactpersoon_tussenv || ' ' || prs_contactpersoon_naam)))
            --   FROM prs_contactpersoon
            --  WHERE prs_contactpersoon_verwijder IS NULL
            --        AND prs_contactpersoon_titel = '*' -- Contactpersoon op facturen
            --        AND prs_bedrijf_key = x.prs_bedrijf_key)
            NULL contactpersoon,
            x.adres, x.postcode, x.plaats, x.land,
            x.prs_kostenplaats_key, x.prs_kostenplaats_nr, x.prs_kostenplaats_omschrijving, x.prs_kostenplaatsgrp_oms,
            --x.prs_kostensoort_oms, x.prs_kostensoort_opmerking, x.prs_kostensoort_refcode, x.prs_kostensoortgrp_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'V', DECODE (x.btw, 0, '0', 'H')) fin_btwtabelwaarde_code,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'Verlegd', DECODE (x.btw, 0, 'Nul', 'Hoog')) fin_btwtabelwaarde_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, DECODE (x.btw, 0, 0, 21)) fin_btwtabelwaarde_perc,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 1, TO_NUMBER (NULL)) fin_btwtabelwaarde_verlegd,
            x.maand,
            TO_CHAR (TO_DATE (x.maand, 'yyyymm'), 'dd-mm-yyyy') mndbegin,
            TO_CHAR (LAST_DAY (TO_DATE (x.maand, 'yyyymm')), 'dd-mm-yyyy') mndeinde,
            TO_CHAR (GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')), 'dd-mm-yyyy') dagbegin,
            TO_CHAR (LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))), 'dd-mm-yyyy') dageinde,
            LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1 mndbes, -- Beschikbaar
            LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1 mndbez, -- Bezet
            fac.safe_to_number (aantal.cnt_kenmerkcontract_waarde) aantal,
            fac.safe_to_number (bedrag.cnt_kenmerkcontract_waarde) tarief,
            1 vvo_toeslag,                                 -- VVO toeslagperc.
            --1 korting_pct,                                    -- Kortingsperc.
            1 verv_toeslag,                         -- Vervangend toeslagperc.
            0 korting_pm2,                                   -- Korting per m2
            NULL alg_onroerendgoed_type,
            NULL alg_onroerendgoed_keys,
            NULL alg_plaatsaanduiding,
            ROUND (((LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1) / (LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1)) *
                   --((100 - COALESCE (x.cnt_contract_korting, 0)) / 100) *
                   fac.safe_to_number (aantal.cnt_kenmerkcontract_waarde) *
                   fac.safe_to_number (bedrag.cnt_kenmerkcontract_waarde) *
                   1/12, 2)
               mndnet,         -- Netto maandbedrag (incl. kortingspercentage)
            ROUND (((LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1) / (LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1)) *
                   --((100 - COALESCE (x.cnt_contract_korting, 0)) / 100) *
                   fac.safe_to_number (aantal.cnt_kenmerkcontract_waarde) *
                   fac.safe_to_number (bedrag.cnt_kenmerkcontract_waarde) *
                   DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, x.btw) *
                   1/12, 2)
               mndbtw,                                      -- BTW maandbedrag
            TRIM (ks.prs_kostensoort_oms) grtboekrek,
            TO_NUMBER (NULL) mld_melding_key,          -- Correctiemelding-key
            NULL mld_melding_omschrijving
       FROM (SELECT c.ins_discipline_key,
                    c.cnt_contract_key,
                    c.cnt_contract_nummer_intern, c.cnt_contract_versie,
                    c.cnt_contract_nummer,
                    c.cnt_contract_looptijd_van lv, c.cnt_contract_looptijd_tot lt,
                    c.cnt_contract_korting,
                    b.prs_bedrijf_key, b.prs_bedrijf_naam, b.prs_overeenkomst_nr,
                    0.21 btw,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_adres, b.prs_bedrijf_post_adres) adres,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_postcode, b.prs_bedrijf_post_postcode) postcode,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_plaats, b.prs_bedrijf_post_plaats) plaats,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_land, b.prs_bedrijf_post_land) land,
                    kp.prs_kostenplaats_key, kp.prs_kostenplaats_nr, kp.prs_kostenplaats_omschrijving, kpg.prs_kostenplaatsgrp_oms,
                    c.maand
               FROM (SELECT lp.maand, c.*
                       FROM lopendeperiode lp, cnt_v_aanwezigcontract c
                      WHERE c.ins_discipline_key IN (2003, 2004) -- Parkeren CHV/Parkeren CMD
                            AND c.cnt_contract_status = 0     -- NIET Gesloten
                            AND TRUNC (c.cnt_contract_looptijd_van) < LAST_DAY (TO_DATE (lp.maand || '01', 'yyyymmdd')) -- Van-datum < einde te factureren maand
                            AND c.cnt_contract_looptijd_tot > TO_DATE (lp.maand || '01', 'yyyymmdd') -- Tot-datum > begin te factureren maand
                     UNION ALL -- Soms 2 maanden factureren (of 1 maand achteraf?)!
                     SELECT TO_CHAR (TO_DATE (lp.maand || '01', 'yyyymmdd') - 1, 'yyyymm') maand, c.*
                       FROM lopendeperiode lp, cnt_v_aanwezigcontract c
                      WHERE c.ins_discipline_key IN (2003, 2004) -- Parkeren CHV/Parkeren CMD
                            AND c.cnt_contract_status = 0     -- NIET Gesloten
                            AND c.cnt_contract_aanmaak > ADD_MONTHS (TO_DATE (lp.maand || '01', 'yyyymmdd'), -1) -- Na begin voorgaande maand aangemaakt!
                            AND TRUNC (c.cnt_contract_looptijd_van) BETWEEN ADD_MONTHS (TO_DATE (lp.maand || '01', 'yyyymmdd'), -1) AND TO_DATE (lp.maand || '01', 'yyyymmdd') -- Van-datum in voorgaande maand!
                            AND NOT EXISTS -- Voorgaande maand nog niet gefactureerd!
                                  (SELECT 1
                                     FROM fin_verkoopfactuur
                                    WHERE fin_verkoopfactuur_maand = TO_CHAR (TO_DATE (lp.maand || '01', 'yyyymmdd') - 1, 'yyyymm') -- Voorgaande maand!
                                          AND fin_verkoopfactuur_xmlnode = 'contract'
                                          AND fin_verkoopfactuur_refkey = c.cnt_contract_key)) c,
                    prs_bedrijf b,
                    prs_kostenplaats kp,
                    prs_kostenplaatsgrp kpg
              WHERE c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
                    AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
                    AND kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)) x
            LEFT JOIN prs_kenmerklink btwnr
               ON x.prs_bedrijf_key = btwnr.prs_link_key
                  AND btwnr.prs_kenmerklink_verwijder IS NULL
                  AND btwnr.prs_kenmerk_key = -1            -- BTW-nummer (NL)
            LEFT JOIN prs_kenmerklink btwvl
               ON x.prs_bedrijf_key = btwvl.prs_link_key
                  AND btwvl.prs_kenmerklink_verwijder IS NULL
                  AND btwvl.prs_kenmerk_key = -1                -- BTW verlegd
            LEFT JOIN cnt_kenmerkcontract vsov_kc
               ON x.cnt_contract_key = vsov_kc.cnt_contract_key
                  AND vsov_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND vsov_kc.cnt_kenmerk_key = -1                     -- VSOV
            LEFT JOIN cnt_discipline cd
               ON x.ins_discipline_key = cd.ins_discipline_key
            LEFT JOIN prs_kostensoort ks
               ON cd.prs_kostensoort_key = ks.prs_kostensoort_key
            LEFT JOIN cnt_kenmerkcontract aantal
               ON x.cnt_contract_key = aantal.cnt_contract_key
                  AND aantal.cnt_kenmerkcontract_verwijder IS NULL
                  AND aantal.cnt_kenmerk_key IN (415, 417)           -- Aantal
            LEFT JOIN cnt_kenmerkcontract bedrag
               ON x.cnt_contract_key = bedrag.cnt_contract_key
                  AND bedrag.cnt_kenmerkcontract_verwijder IS NULL
                  AND bedrag.cnt_kenmerk_key IN (416, 418)           -- Bedrag
     UNION ALL                                              -- Deelnemers CMD!
     SELECT '*CONCEPT*' fin_verkoopfactuur_id,
            'CMD' || TRIM (x.cnt_contract_nummer) po_nr,           -- Regulier
            'CMD' || TRIM (x.cnt_contract_nummer) cnt_contract_nummer,   -- PO
            '9999' || TO_CHAR (x.ins_discipline_key) sortering, -- Sorteren op (eigen) discipline_key; 8 posities!
            'CMD - ' || sd_ud.fac_usrdata_omschr regel,      -- Deelnemers CMD
            TO_CHAR (SYSDATE, 'dd-mm-yyyy') factuurdatum, TO_CHAR (SYSDATE + 30, 'dd-mm-yyyy') vervaldatum,
            x.cnt_contract_key, x.cnt_contract_nummer_intern, x.cnt_contract_versie, x.lv,
            --x.cnt_contract_korting,                               -- Korting %
            x.prs_bedrijf_key, x.prs_bedrijf_naam prs_debiteur_naam, TRIM (x.prs_overeenkomst_nr) debiteur_nr,
            btwnr.prs_kenmerklink_waarde btw_nr,
            --(SELECT MIN (TRIM (prs_contactpersoon_voorletters || ' ' || TRIM (prs_contactpersoon_tussenv || ' ' || prs_contactpersoon_naam)))
            --   FROM prs_contactpersoon
            --  WHERE prs_contactpersoon_verwijder IS NULL
            --        AND prs_contactpersoon_titel = '*' -- Contactpersoon op facturen
            --        AND prs_bedrijf_key = x.prs_bedrijf_key)
            NULL contactpersoon,
            x.adres, x.postcode, x.plaats, x.land,
            x.prs_kostenplaats_key, x.prs_kostenplaats_nr, x.prs_kostenplaats_omschrijving, x.prs_kostenplaatsgrp_oms,
            --x.prs_kostensoort_oms, x.prs_kostensoort_opmerking, x.prs_kostensoort_refcode, x.prs_kostensoortgrp_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'V', DECODE (x.btw, 0, '0', 'H')) fin_btwtabelwaarde_code,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'Verlegd', DECODE (x.btw, 0, 'Nul', 'Hoog')) fin_btwtabelwaarde_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, DECODE (x.btw, 0, 0, 21)) fin_btwtabelwaarde_perc,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 1, TO_NUMBER (NULL)) fin_btwtabelwaarde_verlegd,
            x.maand,
            TO_CHAR (TO_DATE (x.maand, 'yyyymm'), 'dd-mm-yyyy') mndbegin,
            TO_CHAR (LAST_DAY (TO_DATE (x.maand, 'yyyymm')), 'dd-mm-yyyy') mndeinde,
            TO_CHAR (GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')), 'dd-mm-yyyy') dagbegin,
            TO_CHAR (LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))), 'dd-mm-yyyy') dageinde,
            LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1 mndbes, -- Beschikbaar
            LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1 mndbez, -- Bezet
            fac.safe_to_number (aantal.cnt_kenmerkcontract_waarde) aantal,
            fac.safe_to_number (bedrag.cnt_kenmerkcontract_waarde) tarief,
            1 vvo_toeslag,                                 -- VVO toeslagperc.
            --1 korting_pct,                                    -- Kortingsperc.
            1 verv_toeslag,                         -- Vervangend toeslagperc.
            0 korting_pm2,                                   -- Korting per m2
            NULL alg_onroerendgoed_type,
            NULL alg_onroerendgoed_keys,
            NULL alg_plaatsaanduiding,
            ROUND (((LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1) / (LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1)) *
                   --((100 - COALESCE (x.cnt_contract_korting, 0)) / 100) *
                   fac.safe_to_number (aantal.cnt_kenmerkcontract_waarde) *
                   fac.safe_to_number (bedrag.cnt_kenmerkcontract_waarde) *
                   1/12, 2)
               mndnet,         -- Netto maandbedrag (incl. kortingspercentage)
            ROUND (((LEAST (TRUNC (x.lt), LAST_DAY (TO_DATE (x.maand, 'yyyymm'))) - GREATEST (TRUNC (x.lv), TO_DATE (x.maand, 'yyyymm')) + 1) / (LAST_DAY (TO_DATE (x.maand, 'yyyymm')) - TO_DATE (x.maand, 'yyyymm') + 1)) *
                   --((100 - COALESCE (x.cnt_contract_korting, 0)) / 100) *
                   fac.safe_to_number (aantal.cnt_kenmerkcontract_waarde) *
                   fac.safe_to_number (bedrag.cnt_kenmerkcontract_waarde) *
                   DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, x.btw) *
                   1/12, 2)
               mndbtw,                                      -- BTW maandbedrag
            TRIM (SUBSTR (sd_ud.fac_usrdata_code, 1, INSTR (sd_ud.fac_usrdata_code, '/') - 1)) grtboekrek,
            TO_NUMBER (NULL) mld_melding_key,          -- Correctiemelding-key
            NULL mld_melding_omschrijving
       FROM (SELECT c.ins_discipline_key,
                    c.cnt_contract_key,
                    c.cnt_contract_nummer_intern, c.cnt_contract_versie,
                    c.cnt_contract_nummer,
                    c.cnt_contract_looptijd_van lv, c.cnt_contract_looptijd_tot lt,
                    c.cnt_contract_korting,
                    b.prs_bedrijf_key, b.prs_bedrijf_naam, b.prs_overeenkomst_nr,
                    0.21 btw,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_adres, b.prs_bedrijf_post_adres) adres,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_postcode, b.prs_bedrijf_post_postcode) postcode,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_plaats, b.prs_bedrijf_post_plaats) plaats,
                    DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_land, b.prs_bedrijf_post_land) land,
                    kp.prs_kostenplaats_key, kp.prs_kostenplaats_nr, kp.prs_kostenplaats_omschrijving, kpg.prs_kostenplaatsgrp_oms,
                    c.maand
               FROM (SELECT lp.maand, c.*
                       FROM lopendeperiode lp, cnt_v_aanwezigcontract c
                      WHERE c.ins_discipline_key = 2005      -- Deelnemers CMD
                            AND c.cnt_contract_status = 0     -- NIET Gesloten
                            AND TRUNC (c.cnt_contract_looptijd_van) < LAST_DAY (TO_DATE (lp.maand || '01', 'yyyymmdd')) -- Van-datum < einde te factureren maand
                            AND c.cnt_contract_looptijd_tot > TO_DATE (lp.maand || '01', 'yyyymmdd') -- Tot-datum > begin te factureren maand
                     UNION ALL -- Soms 2 maanden factureren (of 1 maand achteraf?)!
                     SELECT TO_CHAR (TO_DATE (lp.maand || '01', 'yyyymmdd') - 1, 'yyyymm') maand, c.*
                       FROM lopendeperiode lp, cnt_v_aanwezigcontract c
                      WHERE c.ins_discipline_key = 2005      -- Deelnemers CMD
                            AND c.cnt_contract_status = 0     -- NIET Gesloten
                            AND c.cnt_contract_aanmaak > ADD_MONTHS (TO_DATE (lp.maand || '01', 'yyyymmdd'), -1) -- Na begin voorgaande maand aangemaakt!
                            AND TRUNC (c.cnt_contract_looptijd_van) BETWEEN ADD_MONTHS (TO_DATE (lp.maand || '01', 'yyyymmdd'), -1) AND TO_DATE (lp.maand || '01', 'yyyymmdd') -- Van-datum in voorgaande maand!
                            AND NOT EXISTS -- Voorgaande maand nog niet gefactureerd!
                                  (SELECT 1
                                     FROM fin_verkoopfactuur
                                    WHERE fin_verkoopfactuur_maand = TO_CHAR (TO_DATE (lp.maand || '01', 'yyyymmdd') - 1, 'yyyymm') -- Voorgaande maand!
                                          AND fin_verkoopfactuur_xmlnode = 'contract'
                                          AND fin_verkoopfactuur_refkey = c.cnt_contract_key)) c,
                    prs_bedrijf b,
                    prs_kostenplaats kp,
                    prs_kostenplaatsgrp kpg
              WHERE c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
                    AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
                    AND kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)) x
            LEFT JOIN prs_kenmerklink btwnr
               ON x.prs_bedrijf_key = btwnr.prs_link_key
                  AND btwnr.prs_kenmerklink_verwijder IS NULL
                  AND btwnr.prs_kenmerk_key = -1            -- BTW-nummer (NL)
            LEFT JOIN prs_kenmerklink btwvl
               ON x.prs_bedrijf_key = btwvl.prs_link_key
                  AND btwvl.prs_kenmerklink_verwijder IS NULL
                  AND btwvl.prs_kenmerk_key = -1                -- BTW verlegd
            LEFT JOIN cnt_kenmerkcontract vsov_kc
               ON x.cnt_contract_key = vsov_kc.cnt_contract_key
                  AND vsov_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND vsov_kc.cnt_kenmerk_key = -1                     -- VSOV
            LEFT JOIN cnt_discipline cd
               ON x.ins_discipline_key = cd.ins_discipline_key
            LEFT JOIN prs_kostensoort ks
               ON cd.prs_kostensoort_key = ks.prs_kostensoort_key
            LEFT JOIN cnt_kenmerkcontract aantal
               ON x.cnt_contract_key = aantal.cnt_contract_key
                  AND aantal.cnt_kenmerkcontract_verwijder IS NULL
                  AND aantal.cnt_kenmerk_key = 419                   -- Aantal
            LEFT JOIN cnt_kenmerkcontract bedrag
               ON x.cnt_contract_key = bedrag.cnt_contract_key
                  AND bedrag.cnt_kenmerkcontract_verwijder IS NULL
                  AND bedrag.cnt_kenmerk_key = 420                   -- Bedrag
            LEFT JOIN cnt_kenmerkcontract sd_kc
               ON x.cnt_contract_key = sd_kc.cnt_contract_key
                  AND sd_kc.cnt_kenmerkcontract_verwijder IS NULL
                  AND sd_kc.cnt_kenmerk_key = 421           -- Soort deelnemer
            LEFT JOIN fac_v_aanwezigusrdata sd_ud
               ON fac.safe_to_number (sd_kc.cnt_kenmerkcontract_waarde) = sd_ud.fac_usrdata_key
     UNION ALL -- Alle correctiemeldingen (ook als contract inmiddels verlopen)!
     SELECT '*CONCEPT*' fin_verkoopfactuur_id,
            DECODE (cd.ins_discipline_key, 2004, 'CMD', 2005, 'CMD', 'CHV') || TRIM (c.cnt_contract_nummer) po_nr, -- Correctie
            DECODE (cd.ins_discipline_key, 2004, 'CMD', 2005, 'CMD', 'CHV') || TRIM (c.cnt_contract_nummer) cnt_contract_nummer, -- PO
            '9999' || SUBSTR ('999' || fr.sortering, -4) sortering, -- Correctieregels onderaan (in dezelfde volgorde als de "echte" regels); 8 posities!
            'Correctie ' || fr.factuurregel || ' ' || pv.periode_van || ' - ' || pt.periode_tot regel, -- Zou consistent moeten zijn met contract!
            TO_CHAR (SYSDATE, 'dd-mm-yyyy') factuurdatum, TO_CHAR (SYSDATE + 30, 'dd-mm-yyyy') vervaldatum,
            c.cnt_contract_key, c.cnt_contract_nummer_intern, c.cnt_contract_versie, c.cnt_contract_looptijd_tot lv,
            --x.cnt_contract_korting,                               -- Korting %
            b.prs_bedrijf_key, b.prs_bedrijf_naam prs_debiteur_naam, TRIM (b.prs_overeenkomst_nr) debiteur_nr,
            btwnr.prs_kenmerklink_waarde btw_nr,
            --(SELECT MIN (TRIM (prs_contactpersoon_voorletters || ' ' || TRIM (prs_contactpersoon_tussenv || ' ' || prs_contactpersoon_naam)))
            --   FROM prs_contactpersoon
            --  WHERE prs_contactpersoon_verwijder IS NULL
            --        AND prs_contactpersoon_titel = '*' -- Contactpersoon op facturen
            --        AND prs_bedrijf_key = b.prs_bedrijf_key)
            NULL contactpersoon,
            DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_adres, b.prs_bedrijf_post_adres) adres,
            DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_postcode, b.prs_bedrijf_post_postcode) postcode,
            DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_plaats, b.prs_bedrijf_post_plaats) plaats,
            DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_land, b.prs_bedrijf_post_land) land,
            kp.prs_kostenplaats_key, kp.prs_kostenplaats_nr, kp.prs_kostenplaats_omschrijving, kpg.prs_kostenplaatsgrp_oms,
            --ks.prs_kostensoort_oms, ks.prs_kostensoort_opmerking, ks.prs_kostensoort_refcode, ksg.prs_kostensoortgrp_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'V', DECODE (oh.cnt_kenmerkcontract_waarde, '921', '0', 'H')) fin_btwtabelwaarde_code, -- TODO:BTW hangt van de correctie af?
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'Verlegd', DECODE (oh.cnt_kenmerkcontract_waarde, '921', 'Nul', 'Hoog')) fin_btwtabelwaarde_oms, -- TODO:BTW hangt van de correctie af?
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, DECODE (oh.cnt_kenmerkcontract_waarde, '921', 0, 21)) fin_btwtabelwaarde_perc, -- TODO:BTW hangt van de correctie af?
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 1, TO_NUMBER (NULL)) fin_btwtabelwaarde_verlegd,
            lp.maand,
            TO_CHAR (TO_DATE (lp.maand, 'yyyymm'), 'dd-mm-yyyy') mndbegin,
            TO_CHAR (LAST_DAY (TO_DATE (lp.maand, 'yyyymm')), 'dd-mm-yyyy') mndeinde,
            TO_CHAR (GREATEST (TRUNC (c.cnt_contract_looptijd_van), TO_DATE (lp.maand, 'yyyymm')), 'dd-mm-yyyy') dagbegin,
            TO_CHAR (LEAST (TRUNC (c.cnt_contract_looptijd_tot), LAST_DAY (TO_DATE (lp.maand, 'yyyymm'))), 'dd-mm-yyyy') dageinde,
            LAST_DAY (TO_DATE (lp.maand, 'yyyymm')) - TO_DATE (lp.maand, 'yyyymm') + 1 mndbes, -- Beschikbaar
            LEAST (TRUNC (c.cnt_contract_looptijd_tot), LAST_DAY (TO_DATE (lp.maand, 'yyyymm'))) - GREATEST (TRUNC (c.cnt_contract_looptijd_van), TO_DATE (lp.maand, 'yyyymm')) + 1 mndbez, -- Bezet
            1 aantal,                                            -- Don't care
            cb.correctiebedrag tarief,
            1 vvo_toeslag,                                 -- VVO toeslagperc.
            --1 korting_pct,                                    -- Kortingsperc.
            1 verv_toeslag,                         -- Vervangend toeslagperc.
            0 korting_pm2,                                   -- Korting per m2
            NULL alg_onroerendgoed_type,
            NULL alg_onroerendgoed_keys,
            NULL alg_plaatsaanduiding,
            ROUND (cb.correctiebedrag, 2)
               mndnet,                                -- Netto correctiebedrag
            ROUND (DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, DECODE (oh.cnt_kenmerkcontract_waarde, '921', 0, 0.21)) * cb.correctiebedrag, 2)
               mndbtw,                                  -- BTW correctiebedrag
            DECODE (cd.ins_discipline_key,
                   2001, TRIM (DECODE (biss_kc1.cnt_kenmerkcontract_waarde, '986', '8110', DECODE (biss_kc2.cnt_kenmerkcontract_waarde, '989', '8110', SUBSTR (ht_ud.fac_usrdata_code, 1, INSTR (ht_ud.fac_usrdata_code, '/') - 1)))),
                   2005, TRIM (SUBSTR (sd_ud.fac_usrdata_code, 1, INSTR (sd_ud.fac_usrdata_code, '/') - 1)),
                   TRIM (ks.prs_kostensoort_oms))
               grtboekrek,
            m.mld_melding_key,                         -- Correctiemelding-key
            TRIM (m.mld_melding_omschrijving) mld_melding_omschrijving
       FROM lopendeperiode lp,
            mld_melding m,
            mld_v_aanwezigkenmerkmelding km,
            cnt_contract c,
            prs_bedrijf b,
            prs_kostenplaats kp,
            prs_kostenplaatsgrp kpg,
            cnt_discipline cd,
            prs_kostensoort ks,
            (SELECT prs_link_key, prs_kenmerklink_waarde
               FROM prs_kenmerklink
              WHERE prs_kenmerklink_verwijder IS NULL AND prs_kenmerk_key = -1) btwnr, -- BTW-nummer (NL)
            (SELECT prs_link_key, prs_kenmerklink_waarde
               FROM prs_kenmerklink
              WHERE prs_kenmerklink_verwijder IS NULL AND prs_kenmerk_key = -1) btwvl, -- BTW verlegd
            (SELECT cnt_contract_key, cnt_kenmerkcontract_waarde
               FROM cnt_kenmerkcontract
              WHERE cnt_kenmerkcontract_verwijder IS NULL
                    AND cnt_kenmerk_key = 401) tt_kc,           -- Tarieftabel
            (SELECT tt_ud.fac_usrdata_key, tar.fac_usrdata_code -- Alleen de Huur-regels uit de Tarieftabellen!
               FROM fac_v_aanwezigusrdata tt_ud, fac_v_aanwezigusrdata tar
              WHERE tt_ud.fac_usrtab_key = 521                  -- Tarieftabel
                    AND fac.safe_to_number (tt_ud.fac_usrdata_code) = tar.fac_usrtab_key
                    AND SUBSTR (tar.fac_usrdata_code, INSTR (tar.fac_usrdata_code, '/') + 1, 4) = 'Huur') ht_ud,
            (SELECT cnt_contract_key, cnt_kenmerkcontract_waarde
               FROM cnt_kenmerkcontract
              WHERE cnt_kenmerkcontract_verwijder IS NULL
                    AND cnt_kenmerk_key = 641) oh,        -- Onbelaste huurder
            (SELECT cnt_contract_key, cnt_kenmerkcontract_waarde
               FROM cnt_kenmerkcontract
              WHERE cnt_kenmerkcontract_verwijder IS NULL
                    AND cnt_kenmerk_key = 645) biss_kc1, -- Facilitaire kosten
            (SELECT cnt_contract_key, cnt_kenmerkcontract_waarde
               FROM cnt_kenmerkcontract
              WHERE cnt_kenmerkcontract_verwijder IS NULL
                    AND cnt_kenmerk_key = 647) biss_kc2,      -- Servicekosten
            (SELECT cnt_contract_key, cnt_kenmerkcontract_waarde
               FROM cnt_kenmerkcontract
              WHERE cnt_kenmerkcontract_verwijder IS NULL
                    AND cnt_kenmerk_key = 421) sd_kc,       -- Soort deelnemer
            (SELECT fac_usrdata_key, fac_usrdata_code
               FROM fac_v_aanwezigusrdata
              WHERE fac_usrtab_key = 522) sd_ud,            -- Soort deelnemer
            (SELECT km.mld_melding_key, ud.fac_usrdata_code sortering, ud.fac_usrdata_omschr factuurregel
               FROM mld_v_aanwezigkenmerkmelding km, fac_usrdata ud
              WHERE km.mld_kenmerk_key = -1   -- TODO:Factuurregel(groepering)
                AND fac.safe_to_number (km.mld_kenmerkmelding_waarde) = ud.fac_usrdata_key) fr,
            (SELECT mld_melding_key, mld_kenmerkmelding_waarde periode_van
               FROM mld_v_aanwezigkenmerkmelding
              WHERE mld_kenmerk_key = -1) pv,              -- TODO:Periode van
            (SELECT mld_melding_key, mld_kenmerkmelding_waarde periode_tot
               FROM mld_v_aanwezigkenmerkmelding
              WHERE mld_kenmerk_key = -1) pt,              -- TODO:Periode tot
            (SELECT mld_melding_key, fac.safe_to_number (mld_kenmerkmelding_waarde) correctiebedrag
               FROM mld_v_aanwezigkenmerkmelding
              WHERE mld_kenmerk_key = -1) cb           -- TODO:Correctiebedrag
      WHERE m.mld_stdmelding_key = -1             -- TODO:Financiële correctie
            AND m.mld_melding_status IN (4, 5)        -- Geaccepteerd/Afgemeld
            AND m.mld_melding_key = km.mld_melding_key
            AND km.mld_kenmerk_key = -1             -- TODO:Contractreferentie
            AND fac.safe_to_number (km.mld_kenmerkmelding_waarde) = c.cnt_contract_key
            AND c.cnt_contract_status = 0                     -- NIET Gesloten
            --AND TRUNC (c.cnt_contract_looptijd_van) < LAST_DAY (TO_DATE (lp.maand || '01', 'yyyymmdd')) -- Van-datum < einde te factureren maand
            --AND c.cnt_contract_looptijd_tot > TO_DATE (lp.maand || '01', 'yyyymmdd') -- Tot-datum > begin te factureren maand
            AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
            AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
            AND kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)
            AND c.ins_discipline_key = cd.ins_discipline_key
            AND cd.prs_kostensoort_key = ks.prs_kostensoort_key(+)
            AND c.cnt_prs_bedrijf_key = btwnr.prs_link_key(+)
            AND c.cnt_prs_bedrijf_key = btwvl.prs_link_key(+)
            AND c.cnt_contract_key = tt_kc.cnt_contract_key(+)
            AND fac.safe_to_number (tt_kc.cnt_kenmerkcontract_waarde) = ht_ud.fac_usrdata_key(+)
            AND c.cnt_contract_key = oh.cnt_contract_key(+)
            AND c.cnt_contract_key = biss_kc1.cnt_contract_key(+)
            AND c.cnt_contract_key = biss_kc2.cnt_contract_key(+)
            AND c.cnt_contract_key = sd_kc.cnt_contract_key(+)
            AND fac.safe_to_number (sd_kc.cnt_kenmerkcontract_waarde) = sd_ud.fac_usrdata_key(+)
            AND m.mld_melding_key = fr.mld_melding_key
            AND m.mld_melding_key = pv.mld_melding_key
            AND m.mld_melding_key = pt.mld_melding_key
            AND m.mld_melding_key = cb.mld_melding_key
   ORDER BY prs_bedrijf_key, 1, 2, 3, 4, alg_onroerendgoed_type, alg_plaatsaanduiding
;

CREATE OR REPLACE VIEW bssc_v_fact_frozen
AS
     SELECT vf.fin_verkoopfactuur_id,
            --TRIM (SUBSTR (vf.fin_verkoopfactuur_omschr, 1, INSTR (vf.fin_verkoopfactuur_omschr, '/') - 1)) po_nr,
            SUBSTR (vf.fin_verkoopfactuur_omschr, 1, INSTR (vf.fin_verkoopfactuur_omschr, '/=', -1) - 1) po_nr,
            SUBSTR (vf.fin_verkoopfactuur_omschr, 1, INSTR (vf.fin_verkoopfactuur_omschr, '/=', -1) - 1) cnt_contract_nummer,
            SUBSTR (vf.fin_verkoopfactuur_omschr, INSTR (vf.fin_verkoopfactuur_omschr, '/=', -1) + 2, 10) sortering,
            SUBSTR (vf.fin_verkoopfactuur_omschr, INSTR (vf.fin_verkoopfactuur_omschr, '/=', -1) + 9) regel,
            TO_CHAR (vf.fin_verkoopfactuur_datum, 'dd-mm-yyyy') factuurdatum, TO_CHAR (vf.fin_verkoopfactuur_d1, 'dd-mm-yyyy') vervaldatum,
            vf.fin_verkoopfactuur_refkey cnt_contract_key,
            c.cnt_contract_nummer_intern,          -- Niet historisch bewaard!
            c.cnt_contract_versie,                 -- Niet historisch bewaard!
            c.cnt_contract_looptijd_tot lv,        -- Niet historisch bewaard!
            --vf.fin_verkoopfactuur_n1 cnt_contract_korting,        -- Korting %
            vf.prs_bedrijf_key, vf.prs_debiteur_naam,
            SUBSTR (vf.fin_verkoopfactuur_c7, 1, INSTR (vf.fin_verkoopfactuur_c7, '=') - 1) debiteur_nr,
            SUBSTR (vf.fin_verkoopfactuur_c7, INSTR (vf.fin_verkoopfactuur_c7, '=') + 1) btw_nr,
            NULL contactpersoon,
            DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_adres, b.prs_bedrijf_post_adres) adres, -- Niet historisch bewaard!
            DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_postcode, b.prs_bedrijf_post_postcode) postcode, -- Niet historisch bewaard!
            DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_plaats, b.prs_bedrijf_post_plaats) plaats, -- Niet historisch bewaard!
            DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_land, b.prs_bedrijf_post_land) land, -- Niet historisch bewaard!
            vf.prs_kostenplaats_key, vf.prs_kostenplaats_nr, vf.prs_kostenplaats_omschrijving, vf.prs_kostenplaatsgrp_oms,
            --vf.prs_kostensoort_oms, vf.prs_kostensoort_opmerking, vf.prs_kostensoort_refcode, vf.prs_kostensoortgrp_oms,
            vf.fin_btwtabelwaarde_code,
            vf.fin_btwtabelwaarde_oms,
            vf.fin_btwtabelwaarde_perc,
            vf.fin_btwtabelwaarde_verlegd,
            vf.fin_verkoopfactuur_maand maand,
            TO_CHAR (vf.fin_verkoopfactuur_d2, 'dd-mm-yyyy') mndbegin,
            TO_CHAR (vf.fin_verkoopfactuur_d3, 'dd-mm-yyyy') mndeinde,
            TO_CHAR (vf.fin_verkoopfactuur_d4, 'dd-mm-yyyy') dagbegin,
            TO_CHAR (vf.fin_verkoopfactuur_d5, 'dd-mm-yyyy') dageinde,
            LAST_DAY (TO_DATE (vf.fin_verkoopfactuur_maand, 'yyyymm')) - TO_DATE (vf.fin_verkoopfactuur_maand, 'yyyymm') + 1 mndbes, -- Beschikbaar
            vf.fin_verkoopfactuur_d5 - vf.fin_verkoopfactuur_d4 + 1 mndbez, -- Bezet
            fac.safe_to_number (vf.fin_verkoopfactuur_c1) aantal,
            fac.safe_to_number (vf.fin_verkoopfactuur_c2) tarief,
            fac.safe_to_number (vf.fin_verkoopfactuur_c3) vvo_toeslag,
            fac.safe_to_number (vf.fin_verkoopfactuur_c4) verv_toeslag,
            fac.safe_to_number (vf.fin_verkoopfactuur_c5) korting_pm2,
            SUBSTR (vf.fin_verkoopfactuur_c6, 1, 1) alg_onroerendgoed_type,
            fac.safe_to_number (SUBSTR (vf.fin_verkoopfactuur_c6, 2, INSTR (vf.fin_verkoopfactuur_c6, '=') - 1)) alg_onroerendgoed_keys,
            SUBSTR (vf.fin_verkoopfactuur_c6, INSTR (vf.fin_verkoopfactuur_c6, '=') + 1) alg_plaatsaanduiding,
            vf.fin_verkoopfactuur_bedrag mndnet,          -- Netto maandbedrag
            vf.fin_verkoopfactuur_btw mndbtw,               -- BTW maandbedrag
            vf.prs_kostensoort_oms grtboekrek,
            vf.fin_verkoopfactuur_n2 mld_melding_key,
            vf.fin_verkoopfactuur_c8 mld_melding_omschrijving
       FROM fin_verkoopfactuur vf,
            cnt_contract c,
            prs_bedrijf b
      WHERE SUBSTR (vf.fin_verkoopfactuur_id, 1, 1) = '?' -- TODO:Of andere conditie?
            AND vf.fin_verkoopfactuur_refkey = c.cnt_contract_key
            AND vf.prs_bedrijf_key = b.prs_bedrijf_key
   ORDER BY vf.prs_bedrijf_key, 1, 2, 3, 4, SUBSTR (vf.fin_verkoopfactuur_c6, 1, 1), SUBSTR (vf.fin_verkoopfactuur_c6, INSTR (vf.fin_verkoopfactuur_c6, '=') + 1);

CREATE OR REPLACE VIEW bssc_v_rap_export_fact
(
   hide_f_sortering,
   fclt_x_maand,
   code,
   valuta,
   factuurdatum,
   periode,
   factuurnummer,
   vervaldatum,
   nummer,
   grtboekrek,
   rel_kpl,
   prj_activa,
   bedrag,
   debitcredit,
   omschrijving,
   btwcode
)
AS
   SELECT ROWNUM,
          REPLACE (periode, '/', '-') periode,
          code,
          valuta,
          factuurdatum,
          periode,
          factuurnummer,
          vervaldatum,
          nummer,
          grtboekrek,
          rel_kpl,
          prj_activa,
          bedrag,
          debitcredit,
          omschrijving,
          btwcode
     FROM (  SELECT v.fin_verkoopfactuur_id || '0000' sortering,
                    'VRK' code,                               -- Hard op 'VRK'
                    'EUR' valuta,                             -- Hard op 'EUR'
                    v.factuurdatum,
                    SUBSTR (v.maand, 1, 4) || '/' || SUBSTR (v.maand, -2) periode,
                    v.fin_verkoopfactuur_id factuurnummer,   -- Boekstuknummer
                    v.vervaldatum,
                    '1' nummer,                                 -- Hard op '1'
                    '1300' grtboekrek,                  -- TODO:Hard op '1300'
                    v.debiteur_nr rel_kpl,
                    NULL prj_activa,                           -- Hard op NULL
                    SUM (v.mndnet + v.mndbtw) bedrag, -- Totaalbedrag incl. BTW gegroepeerd over andere kolommen!
                    'debit' debitcredit,
                    'Total' omschrijving,                   -- Hard op 'Total'
                    NULL btwcode                               -- Hard op NULL
               FROM bssc_v_fact_frozen v
              WHERE v.maand >= TO_CHAR (ADD_MONTHS (SYSDATE, -12), 'yyyy') || '01'
           GROUP BY v.fin_verkoopfactuur_id || '0000',
                    'VRK',
                    'EUR',
                    v.factuurdatum,
                    SUBSTR (v.maand, 1, 4) || '/' || SUBSTR (v.maand, -2),
                    v.fin_verkoopfactuur_id,
                    v.vervaldatum,
                    '1',
                    '1300',
                    v.debiteur_nr,
                    NULL,
                    'debit',
                    'Total',
                    NULL
           UNION ALL
             SELECT v.fin_verkoopfactuur_id || COALESCE (v.grtboekrek, '???') sortering,
                    'VRK' code,                               -- Hard op 'VRK'
                    'EUR' valuta,                             -- Hard op 'EUR'
                    v.factuurdatum,
                    SUBSTR (v.maand, 1, 4) || '/' || SUBSTR (v.maand, -2) periode,
                    v.fin_verkoopfactuur_id factuurnummer,   -- Boekstuknummer
                    v.vervaldatum,
                    '1' nummer,                                 -- Hard op '1'
                    v.grtboekrek,
                    kp.prs_kostenplaats_nr rel_kpl,
                    NULL prj_activa,                           -- Hard op NULL
                    SUM (v.mndnet) bedrag, -- Totaalbedrag excl. BTW gegroepeerd over andere kolommen!
                    'credit' debitcredit, -- TODO:Altijd 'credit' (ook negatieve bedragen)???
                    v.regel omschrijving,
                    DECODE (fin_btwtabelwaarde_code, 'H', 'VH', 'L', 'VL', 'V', 'VBINEU_VERL', 'VN') btwcode
               FROM bssc_v_fact_frozen v, cnt_contract c, prs_kostenplaats kp
              WHERE v.maand >= TO_CHAR (ADD_MONTHS (SYSDATE, -12), 'yyyy') || '01'
                    AND v.cnt_contract_key = c.cnt_contract_key
                    AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
           GROUP BY v.fin_verkoopfactuur_id || COALESCE (v.grtboekrek, '???'),
                    'VRK',
                    'EUR',
                    v.factuurdatum,
                    SUBSTR (v.maand, 1, 4) || '/' || SUBSTR (v.maand, -2),
                    v.fin_verkoopfactuur_id,
                    v.vervaldatum,
                    '1',
                    v.grtboekrek,
                    kp.prs_kostenplaats_nr,
                    NULL,
                    'credit',
                    v.regel,
                    DECODE (fin_btwtabelwaarde_code, 'H', 'VH', 'L', 'VL', 'V', 'VBINEU_VERL', 'VN')
           ORDER BY 1);

CREATE OR REPLACE VIEW bssc_v_export_fact
(
   result,
   result_order
)
AS        -- View bevat alleen inhoud op de dag na de 1e werkdag van de maand!
   SELECT    'code'
          || ';valuta'
          || ';factuurdatum'
          || ';periode'
          || ';factuurnummer'
          || ';vervaldatum'
          || ';nummer'
          || ';grtboekrek'
          || ';rel/kpl'
          || ';prj/activa'
          || ';bedrag'
          || ';debitcredit'
          || ';omschrijving'
          || ';btwcode',
          0
     FROM DUAL
    WHERE FAC.count_work_days (TRUNC (SYSDATE, 'mm') - 1, SYSDATE - 1) = 1 -- Nacht na 1e werkdag!
          AND TO_CHAR (SYSDATE - 1, 'd') BETWEEN '2' AND '6'
          AND NOT EXISTS
                (SELECT 1
                   FROM mld_vrije_dagen
                  WHERE TRUNC (mld_vrije_dagen_datum) = TRUNC (SYSDATE - 1))
   UNION ALL
   SELECT    code
          || ';'
          || valuta
          || ';'
          || factuurdatum
          || ';'
          || periode
          || ';'
          || factuurnummer
          || ';'
          || vervaldatum
          || ';'
          || nummer
          || ';'
          || grtboekrek
          || ';'
          || rel_kpl
          || ';'
          || prj_activa
          || ';'
          || bedrag
          || ';'
          || debitcredit
          || ';'
          || omschrijving
          || ';'
          || btwcode,
          ROWNUM
     FROM bssc_v_rap_export_fact
    WHERE fclt_x_maand = TO_CHAR (ADD_MONTHS (SYSDATE, 1), 'yyyy-mm')
          AND FAC.count_work_days (TRUNC (SYSDATE, 'mm') - 1, SYSDATE - 1) = 1 -- Nacht na 1e werkdag!
          AND TO_CHAR (SYSDATE - 1, 'd') BETWEEN '2' AND '6'
          AND NOT EXISTS
                (SELECT 1
                   FROM mld_vrije_dagen
                  WHERE TRUNC (mld_vrije_dagen_datum) = TRUNC (SYSDATE - 1))
   ORDER BY 2;

CREATE OR REPLACE PROCEDURE bssc_select_fact (p_applname   IN VARCHAR2,
                                              p_applrun    IN VARCHAR2)
AS
   -- Factureer/bevries verhuurcontractkosten en verwerk=AV alle eventuele correctiemeldingen!
   CURSOR c1
   IS
        SELECT '[' || v.cnt_contract_nummer_intern || '.' || COALESCE (v.cnt_contract_versie, '0') || '|' || v.prs_debiteur_naam || '|' || v.regel || '] ' aanduiding,
               v.*, m.mld_melding_status
          FROM bssc_v_fact_actual v, mld_melding m
         WHERE v.mld_melding_key = m.mld_melding_key(+)
      ORDER BY v.prs_bedrijf_key, v.po_nr, v.sortering, v.regel, v.alg_plaatsaanduiding;

   -- Verstuur verkoopfactuur naar huurder.
   CURSOR c2
   IS
        SELECT DISTINCT '[' || vf.fin_verkoopfactuur_id || '|' || vf.fin_verkoopfactuur_maand || '|' || vf.prs_debiteur_naam || '] ' aanduiding,
               vf.fin_verkoopfactuur_id, vf.fin_verkoopfactuur_maand, vf.prs_debiteur_naam,
               vfk.fin_verkoopfactuurkop_key, vfk.fin_verkoopfactuurkop_id,
               b.prs_bedrijf_email
          FROM fin_verkoopfactuur vf, fin_verkoopfactuurkop vfk, prs_bedrijf b
         WHERE SUBSTR (vf.fin_verkoopfactuur_id, 5, 1) = '1' -- TODO:vf.fin_verkoopfactuur_xmlnode = 'contract'
           AND vf.fin_verkoopfactuur_maand = TO_CHAR (ADD_MONTHS (SYSDATE, 1), 'yyyymm')
           AND vf.fin_verkoopfactuurkop_key = vfk.fin_verkoopfactuurkop_key
           AND vf.prs_bedrijf_key = b.prs_bedrijf_key
      ORDER BY vf.fin_verkoopfactuur_id;

   v_errormsg                VARCHAR2 (1000);
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   v_holiday                 NUMBER;
   v_fact_count              NUMBER;
   v_amount_sum              NUMBER (10, 2);
   v_old_bedrijf_key         NUMBER (10);
   v_old_po_nr               VARCHAR2 (50);
   v_year_offset             NUMBER (10);
   v_factuur_id              VARCHAR2 (30);
   v_factkop_id              VARCHAR2 (30);
   v_verkoopfactuurkop_key   NUMBER (10);
   v_count                   NUMBER;
BEGIN
   -- Eerst opruiming
   DELETE FROM imp_log
         WHERE imp_log_applicatie = p_applname;

   SELECT COUNT ( * )
     INTO v_holiday
     FROM mld_vrije_dagen
    WHERE TRUNC (mld_vrije_dagen_datum) = TRUNC (SYSDATE - 1);

   -- LET OP: Twinfield-export van verhuurcontracten (= boekingsgangen) draait
   -- dagelijks na middernacht (begin van dag) en de verkoop wordt maandelijks
   -- alleen in de nacht na 10e werkdag van de maand doorgezet.
   -- IF nacht na 10e werkdag van de maand (én geen weekend én geen vrije dag)!
   -- count_work_days (d1,d2) bepaalt het #werkdagen van d1 tot d2 (als d1=d2,
   -- dan return 0); daarom bepalen tov. laatste dag van vorige maand!
   IF     FAC.count_work_days (TRUNC (SYSDATE, 'mm') - 1, SYSDATE - 1) = 1 -- Nacht na 1e werkdag!
      AND TO_CHAR (SYSDATE - 1, 'd') BETWEEN '2' AND '6'
      AND v_holiday = 0
   THEN
      v_fact_count := 0;
      v_amount_sum := 0;
      v_old_bedrijf_key := -1;
      v_old_po_nr := '';

      -- Factureer/bevries verhuurcontractkosten en verwerk=AV alle eventuele
      -- correctiemeldingen.
      FOR rec IN c1
      LOOP
         BEGIN
            IF rec.prs_bedrijf_key != v_old_bedrijf_key OR rec.po_nr != v_old_po_nr
            THEN
               -- TODO:Afhankelijk van boekstuknummer-methodiek!
               -- Bepaal max. sequence t/m voorgaande jaar (= aantal entries in
               -- fin_verkoopfactuurkop-tabel).
               SELECT COUNT ( * )
                 INTO v_year_offset
                 FROM fin_verkoopfactuurkop vfk
                WHERE SUBSTR (vfk.fin_verkoopfactuurkop_id, 5, 1) = '1' -- Boekstuknummers in formaat <yyyy>1!
                      AND SUBSTR (vfk.fin_verkoopfactuurkop_id, 1, 4) < TO_CHAR (ADD_MONTHS (SYSDATE, 1), 'yyyy');

               -- Bepaal fin_verkoopfactuur_id=boekstuknr. tbv. BCC-verkoopboek
               -- obv. sequence '01' en begin elk nieuw jaar weer bij 1 door te
               -- corrigeren met de hierboven bepaalde offset.
               SELECT fac_s_user01.NEXTVAL - v_year_offset INTO v_count FROM DUAL;

               v_factuur_id := TO_CHAR (ADD_MONTHS (SYSDATE, 1), 'YYYY') || '1' || SUBSTR ('0000' || TO_CHAR (v_count), -4);
               v_factkop_id := v_factuur_id || '_' || SUBSTR (rec.maand, 1, 4) || '-' || SUBSTR (rec.maand, -2) || '_' || rec.debiteur_nr;

               INSERT INTO fin_verkoopfactuurkop (fin_verkoopfactuurkop_id)
                   VALUES (v_factkop_id)
                RETURNING fin_verkoopfactuurkop_key
                     INTO v_verkoopfactuurkop_key;
               COMMIT;

               v_old_bedrijf_key := rec.prs_bedrijf_key;
               v_old_po_nr := rec.po_nr;
            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_kostenplaats_key,
                                            prs_kostenplaats_nr,
                                            prs_kostenplaats_omschrijving,
                                            prs_kostenplaatsgrp_oms,
                                            prs_kostensoort_oms,
                                            prs_kostensoort_opmerking,
                                            prs_kostensoort_refcode,
                                            prs_bedrijf_key,
                                            prs_debiteur_naam,
                                            prs_kostensoortgrp_oms,
                                            fin_verkoopfactuur_bedrag,
                                            fin_verkoopfactuur_btw,
                                            fin_btwtabelwaarde_code,
                                            fin_btwtabelwaarde_oms,
                                            fin_btwtabelwaarde_perc,
                                            fin_btwtabelwaarde_verlegd,
                                            fin_verkoopfactuur_maand,
                                            fin_verkoopfactuur_n1,
                                            fin_verkoopfactuur_n2,
                                            fin_verkoopfactuur_n3,
                                            fin_verkoopfactuur_n4,
                                            fin_verkoopfactuur_n5,
                                            fin_verkoopfactuur_c1,
                                            fin_verkoopfactuur_c2,
                                            fin_verkoopfactuur_c3,
                                            fin_verkoopfactuur_c4,
                                            fin_verkoopfactuur_c5,
                                            fin_verkoopfactuur_c6,
                                            fin_verkoopfactuur_c7,
                                            fin_verkoopfactuur_c8,
                                            fin_verkoopfactuur_d1,
                                            fin_verkoopfactuur_d2,
                                            fin_verkoopfactuur_d3,
                                            fin_verkoopfactuur_d4,
                                            fin_verkoopfactuur_d5)
                VALUES (v_verkoopfactuurkop_key,
                        v_factuur_id,
                        TO_DATE (rec.factuurdatum, 'dd-mm-yyyy'),
                        rec.cnt_contract_nummer || '/=' || rec.sortering || rec.regel,
                        'contract',
                        rec.cnt_contract_key,
                        rec.prs_kostenplaats_key,
                        rec.prs_kostenplaats_nr,
                        rec.prs_kostenplaats_omschrijving,
                        rec.prs_kostenplaatsgrp_oms,
                        rec.grtboekrek,
                        rec.grtboekrek,
                        rec.grtboekrek,
                        rec.prs_bedrijf_key,
                        rec.prs_debiteur_naam,
                        NULL,
                        rec.mndnet,
                        rec.mndbtw,
                        rec.fin_btwtabelwaarde_code,
                        rec.fin_btwtabelwaarde_oms,
                        rec.fin_btwtabelwaarde_perc,
                        rec.fin_btwtabelwaarde_verlegd,
                        rec.maand,
                        --rec.cnt_contract_korting,     -- n1/kortingspercentage
                        TO_NUMBER (NULL),                                -- n1
                        rec.mld_melding_key,            -- n2/correctiemelding
                        TO_NUMBER (NULL),                                -- n3
                        TO_NUMBER (NULL),                                -- n4
                        TO_NUMBER (NULL),                                -- n5
                        TO_CHAR (rec.aantal),                     -- c1/aantal
                        TO_CHAR (rec.tarief),                     -- c2/tarief
                        TO_CHAR (rec.vvo_toeslag),           -- c3/vvo_toeslag
                        TO_CHAR (rec.verv_toeslag),         -- c4/verv_toeslag
                        TO_CHAR (rec.korting_pm2),           -- c5/korting_pm2
                        rec.alg_onroerendgoed_type || rec.alg_onroerendgoed_keys || '=' || rec.alg_plaatsaanduiding, -- c6
                        rec.debiteur_nr || '=' || rec.btw_nr,            -- c7
                        rec.mld_melding_omschrijving,                    -- c8
                        TO_DATE (rec.vervaldatum, 'dd-mm-yyyy'),         -- d1
                        TO_DATE (rec.mndbegin, 'dd-mm-yyyy'),            -- d2
                        TO_DATE (rec.mndeinde, 'dd-mm-yyyy'),            -- d3
                        TO_DATE (rec.dagbegin, 'dd-mm-yyyy'),            -- d4
                        TO_DATE (rec.dageinde, 'dd-mm-yyyy'));           -- d5
            COMMIT;

            v_fact_count := v_fact_count + 1;
            v_amount_sum := v_amount_sum + rec.mndnet;

            IF (rec.mld_melding_key IS NOT NULL)          -- Correctiemelding?
            THEN
               v_errormsg := 'Fout verwerken correctiemelding';

               -- Overgang van Geaccepteerd naar Verwerkt niet mogelijk, dus
               -- eerst afmelden (als nog niet Afgemeld)!
               IF (rec.mld_melding_status = 4)                          -- ACP
               THEN
                  MLD.setmeldingstatus (rec.mld_melding_key, 5, NULL);  -- AFM
               END IF;
               MLD.setmeldingstatus (rec.mld_melding_key, 6, NULL);     -- VER
               COMMIT;
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
               fac.writelog (p_applname, 'E', rec.aanduiding || v_errormsg, 'FACT-freeze');
               COMMIT;
         END;
      END LOOP;

      fac.writelog (p_applname, 'S', 'FACT-verkoop/#regels: ' || TO_CHAR (v_fact_count), TO_CHAR (v_amount_sum));

      -- Verstuur verkoopfactuur naar huurder.
      FOR rec IN c2
      LOOP
         BEGIN
            v_errormsg := 'Fout toevoegen CUST01-noti';

            INSERT INTO fac_notificatie (fac_srtnotificatie_key,
                                         fac_notificatie_status,
                                         fac_notificatie_receiver_email,
                                         fac_notificatie_oms,
                                         fac_notificatie_refkey,
                                         fac_notificatie_prioriteit,
                                         fac_notificatie_datum,
                                         fac_notificatie_sender_email,
                                         fac_notificatie_attachments)
                VALUES (281,                                    -- CUST01-noti
                        2,                                             -- Mail
                        DECODE (                                   -- To-adres
                           rec.prs_bedrijf_email,
                           NULL, 'finance.smartservices@brightlands.com',
                           rec.prs_bedrijf_email || ';finance.smartservices@brightlands.com'),
                        'Factuur ' || rec.fin_verkoopfactuur_id || ' ' || rec.fin_verkoopfactuur_maand || ' ' || rec.prs_debiteur_naam,
                        rec.fin_verkoopfactuurkop_key,
                        2,                                       -- Prioriteit
                        TRUNC (SYSDATE) + (7 / 24),
                        'finance.smartservices@brightlands.com',
                        '/../../Fplace5i/CUST/BSSC/export/PDF/' || rec.fin_verkoopfactuurkop_id || '.pdf');
         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', rec.aanduiding || v_errormsg, 'FACT-noti');
               COMMIT;
         END;
      END LOOP;
   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, 'E', v_errormsg, 'FACT-export afgebroken!');
END;
/

--  30 Vergadering/2,00 Ruimte
--  50 Events/8,00 Ruimte
--  90 Roomservice/0,50 Voorzieningen
-- 170 Huurders Events/4,00 Ruimte
-- 190 Projectruimtes Etage 4/8,00 Ruimte
CREATE OR REPLACE VIEW bssc_v_addd_actual
AS
   WITH lopendeperiode AS (SELECT TO_CHAR (add_months (SYSDATE, -1), 'yyyymm') maand
                             FROM dual)
     SELECT '*CONCEPT*' fin_verkoopfactuur_id,
            TRIM (COALESCE (x.en, '-')) po_nr,
            NULL contract_id,
            '1' || TO_CHAR (x.reslev, 'yyyymmdd') || SUBSTR ('0000' || TO_CHAR (res_rsv_ruimte_key), -7) || TO_CHAR (volgnr) || x.prs_kostensoort_refcode || x.res_voorziening sortering,
            'Reservering ' || x.res_id regel,
            'R' || x.res_id regel_id,
            DECODE (x.volgnr, 0, x.res_voorziening || ' [' || TO_CHAR (ROUND (x.aantal, 2)) || ' uur]', 2, TO_CHAR (x.aantal) || 'x ' || x.res_voorziening, x.res_voorziening) regel_oms,
            TO_CHAR (SYSDATE, 'dd-mm-yyyy') factuurdatum, TO_CHAR (SYSDATE + 30, 'dd-mm-yyyy') vervaldatum,
            'reservering' xmlnode,
            x.res_rsv_ruimte_key refkey,
            x.prs_bedrijf_key, x.prs_bedrijf_naam prs_debiteur_naam, TRIM (x.debiteur_nr) debiteur_nr,
            x.btw_nr,
            x.cp contactpersoon,
            x.adres, x.postcode, x.plaats, x.land,
            x.prs_perslid_naam_full aanvrager,
            x.prs_kostenplaats_key, x.prs_kostenplaats_nr, x.prs_kostenplaats_omschrijving, x.prs_kostenplaatsgrp_oms,
            DECODE (x.btw_vl, '1', 'V', DECODE (x.btw, 'VL', 'L', 'H')) fin_btwtabelwaarde_code,
            DECODE (x.btw_vl, '1', 'Verlegd', DECODE (x.btw, 'VL', 'Laag', 'Hoog')) fin_btwtabelwaarde_oms,
            DECODE (x.btw_vl, '1', 0, DECODE (x.btw, 'VL', 9, 21)) fin_btwtabelwaarde_perc,
            DECODE (x.btw_vl, '1', 1, TO_NUMBER (NULL)) fin_btwtabelwaarde_verlegd,
            x.maand,
            TO_CHAR (TO_DATE (x.maand, 'yyyymm'), 'dd-mm-yyyy') mndbegin,
            TO_CHAR (LAST_DAY (TO_DATE (x.maand, 'yyyymm')), 'dd-mm-yyyy') mndeinde,
            SUM (COALESCE (verw_prijs, prijs, 0)) mndnet,      -- Netto bedrag
            SUM (ROUND (DECODE (x.btw_vl, '1', 0, DECODE (x.btw, 'VL', 0.09, 0.21)) * COALESCE (verw_prijs, prijs, 0), 2)) mndbtw, -- BTW bedrag
            x.prs_kostensoort_refcode grtboekrek,
            x.prs_kostensoort_altcode grtboekrek_oms,
            TO_NUMBER (NULL) mld_melding_key           -- Correctiemelding-key
       FROM (SELECT rrr.res_rsv_ruimte_key,                    -- Ruimte-regel
                    rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr res_id,
                    TRIM (h.prs_overeenkomst_nr) debiteur_nr,
                    ks.prs_kostensoort_refcode,
                    ks.prs_kostensoort_altcode,
                    0 volgnr,
                    (rrr.res_rsv_ruimte_tot - rrr.res_rsv_ruimte_van) * 24 aantal, -- Duur in uren
                    rr.res_ruimte_nr || ' [' || TO_CHAR (res_rsv_ruimte_van, 'dd-mm-yyyy') || ']' res_voorziening,
                    rrr.res_rsv_ruimte_van reslev,
                    rrr.res_rsv_ruimte_prijs verw_prijs,
                    res.getruimteprijs (rrr.res_rsv_ruimte_key) prijs,
                    'VH' btw,                                      -- Hard 21%
                    NULL, --c.cnt_contract_key,
                    NULL, --c.cnt_contract_nummer,
                    NULL, --c.ins_discipline_key,
                    h.prs_bedrijf_key,
                    h.prs_bedrijf_naam,
                    cpk.res_kenmerkreservering_waarde cp,
                    enk.res_kenmerkreservering_waarde en,
                    DECODE (h.prs_bedrijf_post_adres, NULL, h.prs_bedrijf_bezoek_adres, h.prs_bedrijf_post_adres) adres,
                    DECODE (h.prs_bedrijf_post_adres, NULL, h.prs_bedrijf_bezoek_postcode, h.prs_bedrijf_post_postcode) postcode,
                    DECODE (h.prs_bedrijf_post_adres, NULL, h.prs_bedrijf_bezoek_plaats, h.prs_bedrijf_post_plaats) plaats,
                    DECODE (h.prs_bedrijf_post_adres, NULL, h.prs_bedrijf_bezoek_land, h.prs_bedrijf_post_land) land,
                    btwnr.prs_kenmerklink_waarde btw_nr,
                    btwvl.prs_kenmerklink_waarde btw_vl,
                    cp.contactpersoon,
                    pf.prs_perslid_naam_full,
                    kp.prs_kostenplaats_key, kp.prs_kostenplaats_nr, kp.prs_kostenplaats_omschrijving, kpg.prs_kostenplaatsgrp_oms,
                    lp.maand
               FROM lopendeperiode lp,
                    res_v_aanwezigrsv_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 kw.res_rsv_ruimte_key, fac.safe_to_number (kw.res_kenmerkreservering_waarde) prs_bedrijf_key
                       FROM res_v_aanwezigkenmerkwaarde kw, res_kenmerk k
                      WHERE kw.res_kenmerk_key = k.res_kenmerk_key AND k.res_srtkenmerk_key = 161) rh, -- Relatiegegevens
                    (SELECT kw.res_rsv_ruimte_key, kw.res_kenmerkreservering_waarde
                       FROM res_v_aanwezigkenmerkwaarde kw, res_kenmerk k
                      WHERE kw.res_kenmerk_key = k.res_kenmerk_key AND k.res_srtkenmerk_key = 181) cpk, -- Contactpersoon
                    (SELECT kw.res_rsv_ruimte_key, kw.res_kenmerkreservering_waarde
                       FROM res_v_aanwezigkenmerkwaarde kw, res_kenmerk k
                      WHERE kw.res_kenmerk_key = k.res_kenmerk_key AND k.res_srtkenmerk_key = 148) enk, -- Extern nummer
                    prs_v_aanwezigbedrijf h,
                    (SELECT prs_link_key, prs_kenmerklink_waarde
                       FROM prs_kenmerklink
                      WHERE prs_kenmerklink_verwijder IS NULL AND prs_kenmerk_key = -1) btwnr, -- BTW-nummer (NL)
                    (SELECT prs_link_key, prs_kenmerklink_waarde
                       FROM prs_kenmerklink
                      WHERE prs_kenmerklink_verwijder IS NULL AND prs_kenmerk_key = -1) btwvl, -- BTW verlegd
                    (  SELECT prs_bedrijf_key, MIN (TRIM (prs_contactpersoon_voorletters || ' ' || TRIM (prs_contactpersoon_tussenv || ' ' || prs_contactpersoon_naam))) contactpersoon
                         FROM prs_contactpersoon
                        WHERE prs_contactpersoon_verwijder IS NULL AND prs_contactpersoon_titel = '*' -- Contactpersoon op facturen
                     GROUP BY prs_bedrijf_key) cp,
                    prs_perslid p,
                    prs_v_perslid_fullnames_all pf,
                    --prs_v_afdeling_boom ab,
                    --prs_kenmerklink kl,
                    prs_kostenplaats kp,
                    prs_kostenplaatsgrp kpg,
                    res_ruimte rr,
                    res_discipline rd,
                    prs_kostensoort ks
              WHERE rrr.res_activiteit_key != -1         -- Alle activiteiten!
                    AND rrr.res_rsv_ruimte_van > TO_DATE ('20190301', 'yyyymmdd')
                    AND rrr.res_rsv_ruimte_van < TRUNC (SYSDATE, 'mm')
                    --AND rrr.res_status_bo_key = 5                  -- Afgemeld
                    AND rrr.res_rsv_ruimte_dirtlevel = 0
                    AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key -- Alleen Ruimte-reserveringen!
                    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 = rh.res_rsv_ruimte_key(+)
                    AND rrr.res_rsv_ruimte_key = cpk.res_rsv_ruimte_key(+)
                    AND rrr.res_rsv_ruimte_key = enk.res_rsv_ruimte_key(+)
                    AND rh.prs_bedrijf_key = h.prs_bedrijf_key(+)
                    AND h.prs_bedrijf_key = btwnr.prs_link_key(+)
                    AND h.prs_bedrijf_key = btwvl.prs_link_key(+)
                    AND h.prs_bedrijf_key = cp.prs_bedrijf_key(+)
                    AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
                    AND p.prs_perslid_key = pf.prs_perslid_key
                    --AND p.prs_afdeling_key = ab.prs_afdeling_key
                    --AND ab.prs_bedrijf_key = 2442 -- Huurders Smart Services Campus
                    --AND ab.prs_afdeling_key1 != 561 -- Geen factuur naar Campus Management & Development!
                    --AND ab.prs_afdeling_key1 = kl.prs_link_key(+)
                    --AND kl.prs_kenmerklink_niveau(+) = 'A'
                    --AND kl.prs_kenmerk_key(+) = -1           -- Debiteurnummer
                    --AND kl.prs_kenmerklink_waarde = h.prs_overeenkomst_nr(+)
                    AND rrr.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
                    AND kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)
                    AND COALESCE (rar1.res_ruimte_key, rar2.res_ruimte_key) = rr.res_ruimte_key
                    AND rr.res_discipline_key = rd.ins_discipline_key
                    AND rd.prs_kostensoort_key = ks.prs_kostensoort_key(+)
             UNION ALL                                        -- Korting-regel
             SELECT rrr.res_rsv_ruimte_key,
                    rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr res_id,
                    TRIM (h.prs_overeenkomst_nr) debiteur_nr,
                    ks.prs_kostensoort_refcode,
                    ks.prs_kostensoort_altcode,
                    1 volgnr,
                    1 aantal,
                    'Korting' || ' [' || TO_CHAR (res_rsv_ruimte_van, 'dd-mm-yyyy') || ']' res_voorziening,
                    rrr.res_rsv_ruimte_van reslev,
                    -1 * COALESCE (rrr.res_rsv_ruimte_korting, 0) verw_prijs,
                    -1 * COALESCE (rrr.res_rsv_ruimte_korting, 0) prijs,
                    'VH' btw,                                      -- Hard 21%
                    NULL, --c.cnt_contract_key,
                    NULL, --c.cnt_contract_nummer,
                    NULL, --c.ins_discipline_key,
                    h.prs_bedrijf_key,
                    h.prs_bedrijf_naam,
                    cpk.res_kenmerkreservering_waarde cp,
                    enk.res_kenmerkreservering_waarde en,
                    DECODE (h.prs_bedrijf_post_adres, NULL, h.prs_bedrijf_bezoek_adres, h.prs_bedrijf_post_adres) adres,
                    DECODE (h.prs_bedrijf_post_adres, NULL, h.prs_bedrijf_bezoek_postcode, h.prs_bedrijf_post_postcode) postcode,
                    DECODE (h.prs_bedrijf_post_adres, NULL, h.prs_bedrijf_bezoek_plaats, h.prs_bedrijf_post_plaats) plaats,
                    DECODE (h.prs_bedrijf_post_adres, NULL, h.prs_bedrijf_bezoek_land, h.prs_bedrijf_post_land) land,
                    btwnr.prs_kenmerklink_waarde btw_nr,
                    btwvl.prs_kenmerklink_waarde btw_vl,
                    cp.contactpersoon,
                    pf.prs_perslid_naam_full,
                    kp.prs_kostenplaats_key, kp.prs_kostenplaats_nr, kp.prs_kostenplaats_omschrijving, kpg.prs_kostenplaatsgrp_oms,
                    lp.maand
               FROM lopendeperiode lp,
                    res_v_aanwezigrsv_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 kw.res_rsv_ruimte_key, fac.safe_to_number (kw.res_kenmerkreservering_waarde) prs_bedrijf_key
                       FROM res_v_aanwezigkenmerkwaarde kw, res_kenmerk k
                      WHERE kw.res_kenmerk_key = k.res_kenmerk_key AND k.res_srtkenmerk_key = 161) rh, -- Relatiegegevens
                    (SELECT kw.res_rsv_ruimte_key, kw.res_kenmerkreservering_waarde
                       FROM res_v_aanwezigkenmerkwaarde kw, res_kenmerk k
                      WHERE kw.res_kenmerk_key = k.res_kenmerk_key AND k.res_srtkenmerk_key = 181) cpk, -- Contactpersoon
                    (SELECT kw.res_rsv_ruimte_key, kw.res_kenmerkreservering_waarde
                       FROM res_v_aanwezigkenmerkwaarde kw, res_kenmerk k
                      WHERE kw.res_kenmerk_key = k.res_kenmerk_key AND k.res_srtkenmerk_key = 148) enk, -- Extern nummer
                    prs_v_aanwezigbedrijf h,
                    (SELECT prs_link_key, prs_kenmerklink_waarde
                       FROM prs_kenmerklink
                      WHERE prs_kenmerklink_verwijder IS NULL AND prs_kenmerk_key = -1) btwnr, -- BTW-nummer (NL)
                    (SELECT prs_link_key, prs_kenmerklink_waarde
                       FROM prs_kenmerklink
                      WHERE prs_kenmerklink_verwijder IS NULL AND prs_kenmerk_key = -1) btwvl, -- BTW verlegd
                    (  SELECT prs_bedrijf_key, MIN (TRIM (prs_contactpersoon_voorletters || ' ' || TRIM (prs_contactpersoon_tussenv || ' ' || prs_contactpersoon_naam))) contactpersoon
                         FROM prs_contactpersoon
                        WHERE prs_contactpersoon_verwijder IS NULL AND prs_contactpersoon_titel = '*' -- Contactpersoon op facturen
                     GROUP BY prs_bedrijf_key) cp,
                    prs_perslid p,
                    prs_v_perslid_fullnames_all pf,
                    --prs_v_afdeling_boom ab,
                    --prs_kenmerklink kl,
                    prs_kostenplaats kp,
                    prs_kostenplaatsgrp kpg,
                    res_ruimte rr,
                    res_discipline rd,
                    prs_kostensoort ks
              WHERE rrr.res_activiteit_key != -1         -- Alle activiteiten!
                    AND rrr.res_rsv_ruimte_van > TO_DATE ('20190301', 'yyyymmdd')
                    AND rrr.res_rsv_ruimte_van < TRUNC (SYSDATE, 'mm')
                    --AND rrr.res_status_bo_key = 5                  -- Afgemeld
                    AND rrr.res_rsv_ruimte_dirtlevel = 0
                    AND COALESCE (rrr.res_rsv_ruimte_korting, 0) != 0
                    AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key -- Alleen Ruimte-reserveringen!
                    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 = rh.res_rsv_ruimte_key(+)
                    AND rrr.res_rsv_ruimte_key = cpk.res_rsv_ruimte_key(+)
                    AND rrr.res_rsv_ruimte_key = enk.res_rsv_ruimte_key(+)
                    AND rh.prs_bedrijf_key = h.prs_bedrijf_key(+)
                    AND h.prs_bedrijf_key = btwnr.prs_link_key(+)
                    AND h.prs_bedrijf_key = btwvl.prs_link_key(+)
                    AND h.prs_bedrijf_key = cp.prs_bedrijf_key(+)
                    AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
                    AND p.prs_perslid_key = pf.prs_perslid_key
                    --AND p.prs_afdeling_key = ab.prs_afdeling_key
                    --AND ab.prs_bedrijf_key = 2442 -- Huurders Smart Services Campus
                    --AND ab.prs_afdeling_key1 != 561 -- Geen factuur naar Campus Management & Development!
                    --AND ab.prs_afdeling_key1 = kl.prs_link_key(+)
                    --AND kl.prs_kenmerklink_niveau(+) = 'A'
                    --AND kl.prs_kenmerk_key(+) = -1           -- Debiteurnummer
                    --AND kl.prs_kenmerklink_waarde = h.prs_overeenkomst_nr(+)
                    AND rrr.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
                    AND kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)
                    AND COALESCE (rar1.res_ruimte_key, rar2.res_ruimte_key) = rr.res_ruimte_key
                    AND rr.res_discipline_key = rd.ins_discipline_key
                    AND rd.prs_kostensoort_key = ks.prs_kostensoort_key(+)
             UNION ALL                                      -- Catering-regels
             SELECT rrr.res_rsv_ruimte_key,
                    rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr res_id,
                    TRIM (h.prs_overeenkomst_nr) debiteur_nr,
                    ks.prs_kostensoort_refcode,
                    ks.prs_kostensoort_altcode,
                    2 volgnr,
                    rra.res_rsv_artikel_aantal 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,
                    NULL, --c.cnt_contract_key,
                    NULL, --c.cnt_contract_nummer,
                    NULL, --c.ins_discipline_key,
                    h.prs_bedrijf_key,
                    h.prs_bedrijf_naam,
                    cpk.res_kenmerkreservering_waarde cp,
                    enk.res_kenmerkreservering_waarde en,
                    DECODE (h.prs_bedrijf_post_adres, NULL, h.prs_bedrijf_bezoek_adres, h.prs_bedrijf_post_adres) adres,
                    DECODE (h.prs_bedrijf_post_adres, NULL, h.prs_bedrijf_bezoek_postcode, h.prs_bedrijf_post_postcode) postcode,
                    DECODE (h.prs_bedrijf_post_adres, NULL, h.prs_bedrijf_bezoek_plaats, h.prs_bedrijf_post_plaats) plaats,
                    DECODE (h.prs_bedrijf_post_adres, NULL, h.prs_bedrijf_bezoek_land, h.prs_bedrijf_post_land) land,
                    btwnr.prs_kenmerklink_waarde btw_nr,
                    btwvl.prs_kenmerklink_waarde btw_vl,
                    cp.contactpersoon,
                    pf.prs_perslid_naam_full,
                    kp.prs_kostenplaats_key, kp.prs_kostenplaats_nr, kp.prs_kostenplaats_omschrijving, kpg.prs_kostenplaatsgrp_oms,
                    lp.maand
               FROM lopendeperiode lp,
                    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 kw.res_rsv_ruimte_key, fac.safe_to_number (kw.res_kenmerkreservering_waarde) prs_bedrijf_key
                       FROM res_v_aanwezigkenmerkwaarde kw, res_kenmerk k
                      WHERE kw.res_kenmerk_key = k.res_kenmerk_key AND k.res_srtkenmerk_key = 161) rh, -- Relatiegegevens
                    (SELECT kw.res_rsv_ruimte_key, kw.res_kenmerkreservering_waarde
                       FROM res_v_aanwezigkenmerkwaarde kw, res_kenmerk k
                      WHERE kw.res_kenmerk_key = k.res_kenmerk_key AND k.res_srtkenmerk_key = 181) cpk, -- Contactpersoon
                    (SELECT kw.res_rsv_ruimte_key, kw.res_kenmerkreservering_waarde
                       FROM res_v_aanwezigkenmerkwaarde kw, res_kenmerk k
                      WHERE kw.res_kenmerk_key = k.res_kenmerk_key AND k.res_srtkenmerk_key = 148) enk, -- Extern nummer
                    prs_v_aanwezigbedrijf h,
                    (SELECT prs_link_key, prs_kenmerklink_waarde
                       FROM prs_kenmerklink
                      WHERE prs_kenmerklink_verwijder IS NULL AND prs_kenmerk_key = -1) btwnr, -- BTW-nummer (NL)
                    (SELECT prs_link_key, prs_kenmerklink_waarde
                       FROM prs_kenmerklink
                      WHERE prs_kenmerklink_verwijder IS NULL AND prs_kenmerk_key = -1) btwvl, -- BTW verlegd
                    (  SELECT prs_bedrijf_key, MIN (TRIM (prs_contactpersoon_voorletters || ' ' || TRIM (prs_contactpersoon_tussenv || ' ' || prs_contactpersoon_naam))) contactpersoon
                         FROM prs_contactpersoon
                        WHERE prs_contactpersoon_verwijder IS NULL AND prs_contactpersoon_titel = '*' -- Contactpersoon op facturen
                     GROUP BY prs_bedrijf_key) cp,
                    prs_perslid p,
                    prs_v_perslid_fullnames_all pf,
                    --prs_v_afdeling_boom ab,
                    --prs_kenmerklink kl,
                    prs_kostenplaats kp,
                    prs_kostenplaatsgrp kpg,
                    (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_levering > TO_DATE ('20190301', 'yyyymmdd')
                            AND rra.res_rsv_artikel_levering < TRUNC (SYSDATE, 'mm')
                            --AND rra.res_status_bo_key = 5          -- Afgemeld
                            AND rra.res_rsv_artikel_dirtlevel = 0
                            AND rra.res_artikel_key = ra.res_artikel_key) rra,
                    res_discipline rd,
                    prs_kostensoort ks
              WHERE rrr.res_activiteit_key != -1         -- Alle activiteiten!
                    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 = rh.res_rsv_ruimte_key(+)
                    AND rrr.res_rsv_ruimte_key = cpk.res_rsv_ruimte_key(+)
                    AND rrr.res_rsv_ruimte_key = enk.res_rsv_ruimte_key(+)
                    AND rh.prs_bedrijf_key = h.prs_bedrijf_key(+)
                    AND h.prs_bedrijf_key = btwnr.prs_link_key(+)
                    AND h.prs_bedrijf_key = btwvl.prs_link_key(+)
                    AND h.prs_bedrijf_key = cp.prs_bedrijf_key(+)
                    AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
                    AND p.prs_perslid_key = pf.prs_perslid_key
                    --AND p.prs_afdeling_key = ab.prs_afdeling_key
                    --AND ab.prs_bedrijf_key = 2442 -- Huurders Smart Services Campus
                    --AND ab.prs_afdeling_key1 != 561 -- Geen factuur naar Campus Management & Development!
                    --AND ab.prs_afdeling_key1 = kl.prs_link_key(+)
                    --AND kl.prs_kenmerklink_niveau(+) = 'A'
                    --AND kl.prs_kenmerk_key(+) = -1           -- Debiteurnummer
                    --AND kl.prs_kenmerklink_waarde = h.prs_overeenkomst_nr(+)
                    AND rrr.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
                    AND kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)
                    AND rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
                    AND rra.res_discipline_key = rd.ins_discipline_key
                    AND rd.prs_kostensoort_key = ks.prs_kostensoort_key(+)) x
   GROUP BY '*CONCEPT*',
            TRIM (COALESCE (x.en, '-')),
            NULL,
            '1' || TO_CHAR (x.reslev, 'yyyymmdd') || SUBSTR ('0000' || TO_CHAR (res_rsv_ruimte_key), -7) || TO_CHAR (volgnr) || x.prs_kostensoort_refcode || x.res_voorziening,
            'Reservering ' || x.res_id,
            'R' || x.res_id,
            DECODE (x.volgnr, 0, x.res_voorziening || ' [' || TO_CHAR (ROUND (x.aantal, 2)) || ' uur]', 2, TO_CHAR (x.aantal) || 'x ' || x.res_voorziening, x.res_voorziening),
            TO_CHAR (SYSDATE, 'dd-mm-yyyy'), TO_CHAR (SYSDATE + 30, 'dd-mm-yyyy'),
            'reservering',
            x.res_rsv_ruimte_key,
            x.prs_bedrijf_key, x.prs_bedrijf_naam, TRIM (x.debiteur_nr),
            x.btw_nr,
            x.cp,
            x.adres, x.postcode, x.plaats, x.land,
            x.prs_perslid_naam_full,
            x.prs_kostenplaats_key, x.prs_kostenplaats_nr, x.prs_kostenplaats_omschrijving, x.prs_kostenplaatsgrp_oms,
            DECODE (x.btw_vl, '1', 'V', DECODE (x.btw, 'VL', 'L', 'H')),
            DECODE (x.btw_vl, '1', 'Verlegd', DECODE (x.btw, 'VL', 'Laag', 'Hoog')),
            DECODE (x.btw_vl, '1', 0, DECODE (x.btw, 'VL', 9, 21)),
            DECODE (x.btw_vl, '1', 1, TO_NUMBER (NULL)),
            x.maand,
            TO_CHAR (TO_DATE (x.maand, 'yyyymm'), 'dd-mm-yyyy'),
            TO_CHAR (LAST_DAY (TO_DATE (x.maand, 'yyyymm')), 'dd-mm-yyyy'),
            x.prs_kostensoort_refcode,
            x.prs_kostensoort_altcode,
            TO_NUMBER (NULL)
   UNION ALL                                              -- TODO:Klantwensen!
     SELECT '*CONCEPT*' fin_verkoopfactuur_id,
            TRIM (COALESCE (km.mld_kenmerkmelding_waarde, '-')) po_nr,
            NULL contract_id,
            '2' || SUBSTR ('0000' || TO_CHAR (o.mld_melding_key), -7) || '/' || SUBSTR ('00' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr), -3) sortering,
            'Klantwens ' || sd.ins_srtdiscipline_prefix || TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr) regel,
            sd.ins_srtdiscipline_prefix || TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr) regel_id,
            --td.ins_discipline_omschrijving || '/' || sm.mld_stdmelding_omschrijving regel_oms,
            DECODE (m.mld_melding_onderwerp, NULL, '', 'Onderwerp: ' || TRIM (m.mld_melding_onderwerp) || CHR (13) || CHR (10)) || 'Omschrijving: ' || COALESCE (SUBSTR (TRIM (m.mld_melding_omschrijving), 1, 2000), '-')
               regel_oms,
            TO_CHAR (SYSDATE, 'dd-mm-yyyy') factuurdatum, TO_CHAR (SYSDATE + 30, 'dd-mm-yyyy') vervaldatum,
            'opdracht' xmlnode,
            o.mld_opdr_key refkey,
            h.prs_bedrijf_key, h.prs_bedrijf_naam prs_debiteur_naam, TRIM (kl.prs_kenmerklink_waarde) debiteur_nr,
            btwnr.prs_kenmerklink_waarde btw_nr,
            NULL contactpersoon,
            DECODE (h.prs_bedrijf_post_adres, NULL, h.prs_bedrijf_bezoek_adres, h.prs_bedrijf_post_adres) adres,
            DECODE (h.prs_bedrijf_post_adres, NULL, h.prs_bedrijf_bezoek_postcode, h.prs_bedrijf_post_postcode) postcode,
            DECODE (h.prs_bedrijf_post_adres, NULL, h.prs_bedrijf_bezoek_plaats, h.prs_bedrijf_post_plaats) plaats,
            DECODE (h.prs_bedrijf_post_adres, NULL, h.prs_bedrijf_bezoek_land, h.prs_bedrijf_post_land) land,
            pf.prs_perslid_naam_full aanvrager,
            kp.prs_kostenplaats_key, kp.prs_kostenplaats_nr, kp.prs_kostenplaats_omschrijving, kpg.prs_kostenplaatsgrp_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'V', 'H') fin_btwtabelwaarde_code,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 'Verlegd', 'Hoog') fin_btwtabelwaarde_oms,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, 21) fin_btwtabelwaarde_perc,
            DECODE (btwvl.prs_kenmerklink_waarde, '1', 1, TO_NUMBER (NULL)) fin_btwtabelwaarde_verlegd,
            lp.maand,
            TO_CHAR (TO_DATE (lp.maand, 'yyyymm'), 'dd-mm-yyyy') mndbegin,
            TO_CHAR (LAST_DAY (TO_DATE (lp.maand, 'yyyymm')), 'dd-mm-yyyy') mndeinde,
            ROUND (COALESCE (o.mld_opdr_kosten, 0), 2) mndnet, -- Netto bedrag
            ROUND (DECODE (btwvl.prs_kenmerklink_waarde, '1', 0, 0.21) * COALESCE (o.mld_opdr_kosten, 0), 2) mndbtw, -- BTW bedrag
            COALESCE (ksm.prs_kostensoort_refcode, ksv.prs_kostensoort_refcode) grtboekrek,
            COALESCE (ksm.prs_kostensoort_altcode, ksv.prs_kostensoort_altcode) grtboekrek_oms,
            TO_NUMBER (NULL) mld_melding_key           -- Correctiemelding-key
       FROM lopendeperiode lp,
            mld_opdr o,
            mld_melding m,
            (SELECT km.mld_melding_key, km.mld_kenmerkmelding_waarde
               FROM mld_v_aanwezigkenmerkmelding km, mld_kenmerk k
              WHERE km.mld_kenmerk_key = k.mld_kenmerk_key AND k.mld_srtkenmerk_key = -1) km, -- Extern nummer
            prs_perslid p,
            prs_v_perslid_fullnames_all pf,
            prs_v_afdeling_boom ab,
            prs_kenmerklink kl,
            prs_v_aanwezigbedrijf h,
            (SELECT prs_link_key, prs_kenmerklink_waarde
               FROM prs_kenmerklink
              WHERE prs_kenmerklink_verwijder IS NULL AND prs_kenmerk_key = -1) btwnr, -- BTW-nummer (NL)
            (SELECT prs_link_key, prs_kenmerklink_waarde
               FROM prs_kenmerklink
              WHERE prs_kenmerklink_verwijder IS NULL AND prs_kenmerk_key = -1) btwvl, -- BTW verlegd
            (  SELECT prs_bedrijf_key, MIN (TRIM (prs_contactpersoon_voorletters || ' ' || TRIM (prs_contactpersoon_tussenv || ' ' || prs_contactpersoon_naam))) contactpersoon
                 FROM prs_contactpersoon
                WHERE prs_contactpersoon_verwijder IS NULL AND prs_contactpersoon_titel = '*' -- Contactpersoon op facturen
             GROUP BY prs_bedrijf_key) cp,
            alg_v_allonrgoed_gegevens og,
            prs_kostenplaats kp,
            prs_kostenplaatsgrp kpg,
            mld_stdmelding sm,
            ins_tab_discipline td,
            ins_srtdiscipline sd,
            prs_kostensoort ksm,
            prs_kostensoort ksv
      WHERE o.mld_statusopdr_key = 9                               -- Afgerond
            AND o.mld_opdr_ordernr <= TO_CHAR (SYSDATE, 'yyyy-mm') || '-01'
            AND o.mld_typeopdr_key IN (-1)        -- TODO:Welke opdrachttypen?
            AND o.mld_melding_key = m.mld_melding_key
            AND m.mld_melding_key = km.mld_melding_key(+)
            AND m.prs_perslid_key_voor = p.prs_perslid_key
            AND p.prs_perslid_key = pf.prs_perslid_key
            AND p.prs_afdeling_key = ab.prs_afdeling_key
            AND ab.prs_bedrijf_key = 2442    -- Huurders Smart Services Campus
            AND ab.prs_afdeling_key1 = kl.prs_link_key(+)
            AND kl.prs_kenmerklink_niveau(+) = 'A'
            AND kl.prs_kenmerk_key(+) = -1                   -- Debiteurnummer
            AND kl.prs_kenmerklink_waarde = h.prs_overeenkomst_nr(+)
            AND h.prs_bedrijf_key = btwnr.prs_link_key(+)
            AND h.prs_bedrijf_key = btwvl.prs_link_key(+)
            AND h.prs_bedrijf_key = cp.prs_bedrijf_key(+)
            AND m.mld_alg_onroerendgoed_keys = og.alg_onroerendgoed_keys
            AND o.prs_kostenplaats_key = kp.prs_kostenplaats_key
            --AND SUBSTR (kp.prs_kostenplaats_upper, 1, 5) = '50900'
            AND kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key
            AND m.mld_stdmelding_key = sm.mld_stdmelding_key
            AND sm.mld_ins_discipline_key = td.ins_discipline_key
            AND td.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
            AND sm.prs_kostensoort_key = ksm.prs_kostensoort_key(+)
            AND td.prs_kostensoort_key = ksv.prs_kostensoort_key(+);

CREATE OR REPLACE VIEW bssc_v_addd_frozen
AS
     SELECT vf.fin_verkoopfactuur_id,
            vf.fin_verkoopfactuur_c1 po_nr,
            vf.fin_verkoopfactuur_c2 contract_id,
            vf.fin_verkoopfactuur_c3 sortering,
            SUBSTR (vf.fin_verkoopfactuur_omschr, 1, INSTR (vf.fin_verkoopfactuur_omschr, '=') - 1) regel,
            SUBSTR (vf.fin_verkoopfactuur_omschr, INSTR (vf.fin_verkoopfactuur_omschr, '=') + 1) regel_id,
            vf.fin_verkoopfactuur_c8 regel_oms,
            TO_CHAR (vf.fin_verkoopfactuur_datum, 'dd-mm-yyyy') factuurdatum, TO_CHAR (vf.fin_verkoopfactuur_d1, 'dd-mm-yyyy') vervaldatum,
            vf.fin_verkoopfactuur_xmlnode xmlnode,
            vf.fin_verkoopfactuur_refkey refkey,
            vf.prs_bedrijf_key, vf.prs_debiteur_naam,
            SUBSTR (vf.fin_verkoopfactuur_c7, 1, INSTR (vf.fin_verkoopfactuur_c7, '=') - 1) debiteur_nr,
            SUBSTR (vf.fin_verkoopfactuur_c7, INSTR (vf.fin_verkoopfactuur_c7, '=') + 1) btw_nr,
            vf.fin_verkoopfactuur_c4 contactpersoon,
            DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_adres, b.prs_bedrijf_post_adres) adres, -- Niet historisch bewaard!
            DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_postcode, b.prs_bedrijf_post_postcode) postcode, -- Niet historisch bewaard!
            DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_plaats, b.prs_bedrijf_post_plaats) plaats, -- Niet historisch bewaard!
            DECODE (b.prs_bedrijf_post_adres, NULL, b.prs_bedrijf_bezoek_land, b.prs_bedrijf_post_land) land, -- Niet historisch bewaard!
            vf.fin_verkoopfactuur_c5 aanvrager,
            vf.prs_kostenplaats_key, vf.prs_kostenplaats_nr, vf.prs_kostenplaats_omschrijving, vf.prs_kostenplaatsgrp_oms,
            vf.fin_btwtabelwaarde_code,
            vf.fin_btwtabelwaarde_oms,
            vf.fin_btwtabelwaarde_perc,
            vf.fin_btwtabelwaarde_verlegd,
            vf.fin_verkoopfactuur_maand maand,
            TO_CHAR (vf.fin_verkoopfactuur_d2, 'dd-mm-yyyy') mndbegin,
            TO_CHAR (vf.fin_verkoopfactuur_d3, 'dd-mm-yyyy') mndeinde,
            vf.fin_verkoopfactuur_bedrag mndnet,               -- Netto bedrag
            vf.fin_verkoopfactuur_btw mndbtw,                    -- BTW bedrag
            vf.prs_kostensoort_refcode grtboekrek,
            vf.prs_kostensoort_oms grtboekrek_oms,
            vf.fin_verkoopfactuur_n1 mld_melding_key
       FROM fin_verkoopfactuur vf, prs_bedrijf b
      WHERE SUBSTR (vf.fin_verkoopfactuur_id, 1, 1) = '?' -- TODO:Of andere conditie?
            AND vf.prs_bedrijf_key = b.prs_bedrijf_key
   ORDER BY vf.prs_bedrijf_key, 1, 2, 3, 4;

-- TODO:Kostensoorten, etc.!
CREATE OR REPLACE VIEW bssc_v_rap_export_addd
(
   hide_f_sortering,
   fclt_x_maand,
   code,
   valuta,
   factuurdatum,
   periode,
   factuurnummer,
   vervaldatum,
   nummer,
   grtboekrek,
   rel_kpl,
   prj_activa,
   bedrag,
   debitcredit,
   omschrijving,
   btwcode
)
AS
   SELECT ROWNUM,
          REPLACE (periode, '/', '-') periode,
          code,
          valuta,
          factuurdatum,
          periode,
          factuurnummer,
          vervaldatum,
          nummer,
          grtboekrek,
          rel_kpl,
          prj_activa,
          bedrag,
          debitcredit,
          omschrijving,
          btwcode
     FROM (SELECT fin_verkoopfactuur_id || '0000' || debiteur_nr sortering,
                  'VRK' code,                                 -- Hard op 'VRK'
                  'EUR' valuta,                               -- Hard op 'EUR'
                  factuurdatum,
                  --SUBSTR (maand, 1, 4) || '/' || SUBSTR (maand, -2) periode,
                  SUBSTR (factuurdatum, 7, 4) || '/' || SUBSTR (factuurdatum, 4, 2) periode,
                  fin_verkoopfactuur_id factuurnummer,       -- Boekstuknummer
                  vervaldatum,
                  '1' nummer,                                   -- Hard op '1'
                  '1300' grtboekrek,                    -- TODO:Hard op '1300'
                  debiteur_nr rel_kpl,
                  NULL prj_activa,                             -- Hard op NULL
                  netsum + btwsum + (0.065 * netsum) + (0.21 * 0.065 * netsum) bedrag, -- Totaalbedrag incl. BTW gegroepeerd over andere kolommen!
                  'debit' debitcredit,
                  'Total' omschrijving,                     -- Hard op 'Total'
                  NULL btwcode                                 -- Hard op NULL
             FROM (  SELECT fin_verkoopfactuur_id, debiteur_nr, factuurdatum, maand, vervaldatum,
                            SUM (mndnet) netsum, SUM (mndbtw) btwsum
                       FROM bssc_v_addd_frozen
                      --WHERE maand >= TO_CHAR (ADD_MONTHS (SYSDATE, -12), 'yyyy') || '01'
                   GROUP BY fin_verkoopfactuur_id, debiteur_nr, factuurdatum, maand, vervaldatum)
           UNION ALL
             SELECT fin_verkoopfactuur_id || debiteur_nr || DECODE (grtboekrek, '812x', DECODE (fin_btwtabelwaarde_code, 'H', '8120', '8121'), grtboekrek) sortering,
                    'VRK' code,                               -- Hard op 'VRK'
                    'EUR' valuta,                             -- Hard op 'EUR'
                    factuurdatum,
                    --SUBSTR (maand, 1, 4) || '/' || SUBSTR (maand, -2) periode,
                    SUBSTR (factuurdatum, 7, 4) || '/' || SUBSTR (factuurdatum, 4, 2) periode,
                    fin_verkoopfactuur_id factuurnummer,     -- Boekstuknummer
                    vervaldatum,
                    '1' nummer,                                 -- Hard op '1'
                    DECODE (grtboekrek, '812x', DECODE (fin_btwtabelwaarde_code, 'H', '8120', '8121'), grtboekrek) grtboekrek,
                    --prs_kostenplaats_nr rel_kpl,
                    --DECODE (SUBSTR (prs_kostenplaats_nr, 1, 5), '50900', '50900', prs_kostenplaats_nr) rel_kpl,
                    '50900',
                    NULL prj_activa,                           -- Hard op NULL
                    SUM (mndnet) bedrag, -- Totaalbedrag excl. BTW gegroepeerd over andere kolommen!
                    'credit' debitcredit, -- TODO:Altijd 'credit' (ook negatieve bedragen)???
                    DECODE (grtboekrek, '812x', grtboekrek_oms || DECODE (fin_btwtabelwaarde_code, 'H', ' high', ' low'), '8130', regel, grtboekrek_oms) omschrijving,
                    DECODE (fin_btwtabelwaarde_code, 'H', 'VH', 'L', 'VL', 'V', 'VBINEU_VERL', 'VN') btwcode
               FROM bssc_v_addd_frozen
              --WHERE maand >= TO_CHAR (ADD_MONTHS (SYSDATE, -12), 'yyyy') || '01'
           GROUP BY fin_verkoopfactuur_id || debiteur_nr || DECODE (grtboekrek, '812x', DECODE (fin_btwtabelwaarde_code, 'H', '8120', '8121'), grtboekrek),
                    'VRK',
                    'EUR',
                    factuurdatum,
                    SUBSTR (factuurdatum, 7, 4) || '/' || SUBSTR (factuurdatum, 4, 2),
                    fin_verkoopfactuur_id,
                    vervaldatum,
                    '1',
                    DECODE (grtboekrek, '812x', DECODE (fin_btwtabelwaarde_code, 'H', '8120', '8121'), grtboekrek),
                    --prs_kostenplaats_nr rel_kpl,
                    --DECODE (SUBSTR (prs_kostenplaats_nr, 1, 5), '50900', '50900', prs_kostenplaats_nr),
                    '50900',
                    NULL,
                    'credit',
                    DECODE (grtboekrek, '812x', grtboekrek_oms || DECODE (fin_btwtabelwaarde_code, 'H', ' high', ' low'), '8130', regel, grtboekrek_oms),
                    DECODE (fin_btwtabelwaarde_code, 'H', 'VH', 'L', 'VL', 'V', 'VBINEU_VERL', 'VN')
           UNION ALL
             SELECT fin_verkoopfactuur_id || debiteur_nr || '8136' sortering,
                    'VRK' code,                               -- Hard op 'VRK'
                    'EUR' valuta,                             -- Hard op 'EUR'
                    factuurdatum,
                    --SUBSTR (maand, 1, 4) || '/' || SUBSTR (maand, -2) periode,
                    SUBSTR (factuurdatum, 7, 4) || '/' || SUBSTR (factuurdatum, 4, 2) periode,
                    fin_verkoopfactuur_id factuurnummer,     -- Boekstuknummer
                    vervaldatum,
                    '1' nummer,                                 -- Hard op '1'
                    '8136',                                    -- Handling fee
                    --prs_kostenplaats_nr rel_kpl,
                    --DECODE (SUBSTR (prs_kostenplaats_nr, 1, 5), '50900', '50900', prs_kostenplaats_nr) rel_kpl,
                    '50900',
                    NULL prj_activa,                           -- Hard op NULL
                    SUM (0.065 * mndnet) bedrag, -- Totaalbedrag excl. BTW gegroepeerd over andere kolommen!
                    'credit' debitcredit, -- TODO:Altijd 'credit' (ook negatieve bedragen)???
                    'Handling fee' omschrijving,
                    'VH' btwcode
               FROM bssc_v_addd_frozen
              --WHERE maand >= TO_CHAR (ADD_MONTHS (SYSDATE, -12), 'yyyy') || '01'
           GROUP BY fin_verkoopfactuur_id || debiteur_nr || '8136',
                    'VRK',
                    'EUR',
                    factuurdatum,
                    SUBSTR (factuurdatum, 7, 4) || '/' || SUBSTR (factuurdatum, 4, 2),
                    fin_verkoopfactuur_id,
                    vervaldatum,
                    '1',
                    '8136',
                    --prs_kostenplaats_nr,
                    --DECODE (SUBSTR (prs_kostenplaats_nr, 1, 5), '50900', '50900', prs_kostenplaats_nr),
                    '50900',
                    NULL,
                    'credit',
                    'Handling fee',
                    'VH'
           ORDER BY 1);

CREATE OR REPLACE VIEW bssc_v_export_addd
(
   result,
   result_order
)
AS        -- View bevat alleen inhoud op de dag na de 10e werkdag van de maand!
   SELECT    'code'
          || ';valuta'
          || ';factuurdatum'
          || ';periode'
          || ';factuurnummer'
          || ';vervaldatum'
          || ';nummer'
          || ';grtboekrek'
          || ';rel/kpl'
          || ';prj/activa'
          || ';bedrag'
          || ';debitcredit'
          || ';omschrijving'
          || ';btwcode',
          0
     FROM DUAL
    WHERE FAC.count_work_days (TRUNC (SYSDATE, 'mm') - 1, SYSDATE - 1) = 10 -- Nacht na 10e werkdag!
          AND TO_CHAR (SYSDATE - 1, 'd') BETWEEN '2' AND '6'
          AND NOT EXISTS
                (SELECT 1
                   FROM mld_vrije_dagen
                  WHERE TRUNC (mld_vrije_dagen_datum) = TRUNC (SYSDATE - 1))
   UNION ALL
   SELECT    code
          || ';'
          || valuta
          || ';'
          || factuurdatum
          || ';'
          || periode
          || ';'
          || factuurnummer
          || ';'
          || vervaldatum
          || ';'
          || nummer
          || ';'
          || grtboekrek
          || ';'
          || rel_kpl
          || ';'
          || prj_activa
          || ';'
          || bedrag
          || ';'
          || debitcredit
          || ';'
          || omschrijving
          || ';'
          || btwcode,
          ROWNUM
     FROM bssc_v_rap_export_addd
    WHERE fclt_x_maand = TO_CHAR (SYSDATE, 'yyyy-mm')
          AND FAC.count_work_days (TRUNC (SYSDATE, 'mm') - 1, SYSDATE - 1) = 10 -- Nacht na 10e werkdag!
          AND TO_CHAR (SYSDATE - 1, 'd') BETWEEN '2' AND '6'
          AND NOT EXISTS
                (SELECT 1
                   FROM mld_vrije_dagen
                  WHERE TRUNC (mld_vrije_dagen_datum) = TRUNC (SYSDATE - 1))
   ORDER BY 2;

CREATE OR REPLACE PROCEDURE bssc_select_addd (p_applname   IN VARCHAR2,
                                              p_applrun    IN VARCHAR2)
AS
   -- Factureer/bevries kosten van additionele diensten en verwerk=AV alle
   -- aanwezige klantwens-opdrachten en correctie-meldingen (1 regel in view)!
   CURSOR c1
   IS
        SELECT '[' || v.regel_id || '|' || v.prs_debiteur_naam || '] ' aanduiding,
               v.*, o.mld_statusopdr_key, m.mld_melding_status
          FROM (SELECT *
                  FROM bssc_v_addd_actual) v
               LEFT JOIN mld_opdr o
                  ON v.xmlnode = 'opdracht' AND v.refkey = o.mld_opdr_key
               LEFT JOIN mld_melding m
                  ON v.mld_melding_key = m.mld_melding_key
      ORDER BY v.prs_bedrijf_key, v.po_nr, v.sortering;

   -- Verstuur verkoopfactuur naar huurder.
   CURSOR c2
   IS
        SELECT DISTINCT '[' || vf.fin_verkoopfactuur_id || '|' || vf.fin_verkoopfactuur_maand || '|' || vf.prs_debiteur_naam || '] ' aanduiding,
               vf.fin_verkoopfactuur_id, vf.fin_verkoopfactuur_maand, vf.prs_debiteur_naam,
               vfk.fin_verkoopfactuurkop_key, vfk.fin_verkoopfactuurkop_id,
               b.prs_bedrijf_email
          FROM fin_verkoopfactuur vf, fin_verkoopfactuurkop vfk, prs_bedrijf b
         WHERE SUBSTR (vf.fin_verkoopfactuur_id, 1, 1) = '?' -- vf.fin_verkoopfactuur_xmlnode != 'contract'
           AND vf.fin_verkoopfactuur_maand = TO_CHAR (ADD_MONTHS (SYSDATE, -1), 'yyyymm')
           AND vf.fin_verkoopfactuurkop_key = vfk.fin_verkoopfactuurkop_key
           AND vf.prs_bedrijf_key = b.prs_bedrijf_key
      ORDER BY vf.fin_verkoopfactuur_id;

   -- Verwerk reserveringen (in juiste volgorde)!
   CURSOR c3
   IS
        SELECT DISTINCT '[' || TO_CHAR (rra.res_rsv_ruimte_key) || '|' || TO_CHAR (rra.res_rsv_artikel_key) || '] ' aanduiding,
               rra.res_rsv_ruimte_key,
               rra.res_rsv_artikel_key,
               rra.res_status_bo_key,
               rra.res_artikel_key
          FROM fin_verkoopfactuur vf, res_v_aanwezigrsv_artikel rra
         WHERE SUBSTR (vf.fin_verkoopfactuur_id, 1, 1) = '?' -- vf.fin_verkoopfactuur_xmlnode != 'contract'
               AND vf.fin_verkoopfactuur_maand = TO_CHAR (ADD_MONTHS (SYSDATE, -1), 'yyyymm')
               AND vf.fin_verkoopfactuur_xmlnode = 'reservering'
               AND vf.fin_verkoopfactuur_refkey = rra.res_rsv_ruimte_key
        UNION ALL
        SELECT DISTINCT '[' || TO_CHAR (rrr.res_rsv_ruimte_key) || '] ' aanduiding,
               rrr.res_rsv_ruimte_key,
               NULL res_rsv_artikel_key,
               rrr.res_status_bo_key,
               NULL res_artikel_key
          FROM fin_verkoopfactuur vf, res_v_aanwezigrsv_ruimte rrr
         WHERE SUBSTR (vf.fin_verkoopfactuur_id, 1, 1) = '?' -- vf.fin_verkoopfactuur_xmlnode != 'contract'
               AND vf.fin_verkoopfactuur_maand = TO_CHAR (ADD_MONTHS (SYSDATE, -1), 'yyyymm')
               AND vf.fin_verkoopfactuur_xmlnode = 'reservering'
               AND vf.fin_verkoopfactuur_refkey = rrr.res_rsv_ruimte_key
      ORDER BY 3, 2;

   v_errormsg                VARCHAR2 (1000);
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   v_holiday                 NUMBER;
   v_fact_count              NUMBER;
   v_amount_sum              NUMBER (10, 2);
   v_old_bedrijf_key         NUMBER (10);
   v_old_po_nr               VARCHAR2 (50);
   v_factuur_id              VARCHAR2 (30);
   v_factkop_id              VARCHAR2 (30);
   v_verkoopfactuurkop_key   NUMBER (10);
   v_count                   NUMBER;
   v_prijs                   NUMBER (9, 2);
BEGIN
   -- Eerst opruiming
   DELETE FROM imp_log
         WHERE imp_log_applicatie = p_applname;

   SELECT COUNT ( * )
     INTO v_holiday
     FROM mld_vrije_dagen
    WHERE TRUNC (mld_vrije_dagen_datum) = TRUNC (SYSDATE - 1);

   -- LET OP: Twinfield-export van additionele diensten (= boekingsgangen)
   -- draait dagelijks na middernacht (begin van dag) en de verkoop wordt
   -- maandelijks alleen in de nacht na 10e werkdag van de maand doorgezet.
   -- IF nacht na 10e werkdag van de maand (én geen weekend én geen vrije dag)!
   -- count_work_days (d1,d2) bepaalt het #werkdagen van d1 tot d2 (als d1=d2,
   -- dan return 0); daarom bepalen tov. laatste dag van vorige maand!
   IF     FAC.count_work_days (TRUNC (SYSDATE, 'mm') - 1, SYSDATE - 1) = 10 -- Nacht na 10e werkdag!
      AND TO_CHAR (SYSDATE - 1, 'd') BETWEEN '2' AND '6'
      AND v_holiday = 0
   THEN
      v_fact_count := 0;
      v_amount_sum := 0;
      v_old_bedrijf_key := -1;
      v_old_po_nr := '';

      -- Factureer/bevries kosten van additionele diensten en verwerk=AV alle
      -- eventuele correctiemeldingen.
      FOR rec IN c1
      LOOP
         BEGIN
            IF rec.mndnet != 0 AND (rec.prs_bedrijf_key != v_old_bedrijf_key OR rec.po_nr != v_old_po_nr)
            THEN
               SELECT fac_s_user02.NEXTVAL INTO v_count FROM DUAL;

               v_factuur_id := '3' || SUBSTR ('00000000' || TO_CHAR (v_count), -8);
               v_factkop_id := v_factuur_id || '_' || SUBSTR (rec.maand, 1, 4) || '-' || SUBSTR (rec.maand, -2) || '_' || rec.debiteur_nr;

               INSERT INTO fin_verkoopfactuurkop (fin_verkoopfactuurkop_id)
                   VALUES (v_factkop_id)
                RETURNING fin_verkoopfactuurkop_key
                     INTO v_verkoopfactuurkop_key;
               COMMIT;

               v_old_bedrijf_key := rec.prs_bedrijf_key;
               v_old_po_nr := rec.po_nr;
            END IF;

            IF rec.mndnet != 0
            THEN
               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_kostenplaats_key,
                                               prs_kostenplaats_nr,
                                               prs_kostenplaats_omschrijving,
                                               prs_kostenplaatsgrp_oms,
                                               prs_kostensoort_oms,
                                               prs_kostensoort_opmerking,
                                               prs_kostensoort_refcode,
                                               prs_bedrijf_key,
                                               prs_debiteur_naam,
                                               prs_kostensoortgrp_oms,
                                               fin_verkoopfactuur_bedrag,
                                               fin_verkoopfactuur_btw,
                                               fin_btwtabelwaarde_code,
                                               fin_btwtabelwaarde_oms,
                                               fin_btwtabelwaarde_perc,
                                               fin_btwtabelwaarde_verlegd,
                                               fin_verkoopfactuur_maand,
                                               fin_verkoopfactuur_n1,
                                               fin_verkoopfactuur_n2,
                                               fin_verkoopfactuur_n3,
                                               fin_verkoopfactuur_n4,
                                               fin_verkoopfactuur_n5,
                                               fin_verkoopfactuur_c1,
                                               fin_verkoopfactuur_c2,
                                               fin_verkoopfactuur_c3,
                                               fin_verkoopfactuur_c4,
                                               fin_verkoopfactuur_c5,
                                               fin_verkoopfactuur_c6,
                                               fin_verkoopfactuur_c7,
                                               fin_verkoopfactuur_c8,
                                               fin_verkoopfactuur_d1,
                                               fin_verkoopfactuur_d2,
                                               fin_verkoopfactuur_d3,
                                               fin_verkoopfactuur_d4,
                                               fin_verkoopfactuur_d5)
                   VALUES (v_verkoopfactuurkop_key,
                           v_factuur_id,
                           TO_DATE (rec.factuurdatum, 'dd-mm-yyyy'),
                           rec.regel || '=' || rec.regel_id,
                           rec.xmlnode,
                           rec.refkey,
                           rec.prs_kostenplaats_key,
                           rec.prs_kostenplaats_nr,
                           rec.prs_kostenplaats_omschrijving,
                           rec.prs_kostenplaatsgrp_oms,
                           rec.grtboekrek_oms,
                           rec.grtboekrek,
                           rec.grtboekrek,
                           rec.prs_bedrijf_key,
                           rec.prs_debiteur_naam,
                           NULL,
                           rec.mndnet,
                           rec.mndbtw,
                           rec.fin_btwtabelwaarde_code,
                           rec.fin_btwtabelwaarde_oms,
                           rec.fin_btwtabelwaarde_perc,
                           rec.fin_btwtabelwaarde_verlegd,
                           rec.maand,
                           rec.mld_melding_key,         -- n1/correctiemelding
                           TO_NUMBER (NULL),                             -- n2
                           TO_NUMBER (NULL),                             -- n3
                           TO_NUMBER (NULL),                             -- n4
                           TO_NUMBER (NULL),                             -- n5
                           rec.po_nr,                                    -- c1
                           rec.contract_id,                              -- c2
                           rec.sortering,                                -- c3
                           rec.contactpersoon,                           -- c4
                           rec.aanvrager,                                -- c5
                           NULL,                                         -- c6
                           rec.debiteur_nr || '=' || rec.btw_nr,         -- c7
                           rec.regel_oms,                                -- c8
                           TO_DATE (rec.vervaldatum, 'dd-mm-yyyy'),      -- d1
                           TO_DATE (rec.mndbegin, 'dd-mm-yyyy'),         -- d2
                           TO_DATE (rec.mndeinde, 'dd-mm-yyyy'),         -- d3
                           TO_DATE (NULL),                               -- d4
                           TO_DATE (NULL));                              -- d5
               COMMIT;

               v_fact_count := v_fact_count + 1;
               v_amount_sum := v_amount_sum + rec.mndnet;
            END IF;

            IF rec.xmlnode = 'opdracht'
            THEN
               v_errormsg := 'Fout verwerken opdrachtkosten';

               MLD.setopdrachtstatus (rec.refkey, 7, NULL);
            END IF;

            IF rec.mld_melding_key IS NOT NULL            -- Correctiemelding?
            THEN
               v_errormsg := 'Fout verwerken correctiemelding';

               -- Overgang van Geaccepteerd naar Verwerkt niet mogelijk, dus
               -- eerst afmelden (als nog niet Afgemeld)!
               IF rec.mld_melding_status = 4                            -- ACP
               THEN
                  MLD.setmeldingstatus (rec.mld_melding_key, 5, NULL);  -- AFM
               END IF;
               MLD.setmeldingstatus (rec.mld_melding_key, 6, NULL);     -- VER
            END IF;
            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', rec.aanduiding || v_errormsg, 'ADDD-freeze');
               COMMIT;
         END;
      END LOOP;

      fac.writelog (p_applname, 'S', 'ADDD-verkoop/#regels: ' || TO_CHAR (v_fact_count), TO_CHAR (v_amount_sum));

      -- Verstuur verkoopfactuur naar huurder.
      FOR rec IN c2
      LOOP
         BEGIN
            v_errormsg := 'Fout toevoegen CUST02-noti';

            INSERT INTO fac_notificatie (fac_srtnotificatie_key,
                                         fac_notificatie_status,
                                         fac_notificatie_receiver_email,
                                         fac_notificatie_oms,
                                         fac_notificatie_refkey,
                                         fac_notificatie_prioriteit,
                                         fac_notificatie_datum,
                                         fac_notificatie_sender_email,
                                         fac_notificatie_attachments)
                VALUES (341,                                    -- CUST02-noti
                        2,                                             -- Mail
                        DECODE (                                   -- To-adres
                           rec.prs_bedrijf_email,
                           NULL, 'finance.smartservices@brightlands.com',
                           rec.prs_bedrijf_email || ';finance.smartservices@brightlands.com'),
                        'Factuur ' || rec.fin_verkoopfactuur_id || ' ' || rec.fin_verkoopfactuur_maand || ' ' || rec.prs_debiteur_naam,
                        rec.fin_verkoopfactuurkop_key,
                        2,                                       -- Prioriteit
                        TRUNC (SYSDATE) + (7 / 24),
                        'finance.smartservices@brightlands.com',
                        '/../../Fplace5i/CUST/BSSC/export/PDF/' || rec.fin_verkoopfactuurkop_id || '.pdf');
         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', rec.aanduiding || v_errormsg, 'ADDD-noti');
               COMMIT;
         END;
      END LOOP;

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

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

                  fac.trackaction ('RESVER', rec.res_rsv_ruimte_key, NULL, NULL, 'Catering verwerkt');
               END IF;
            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';

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

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

                  UPDATE res_rsv_ruimte
                     SET res_status_bo_key = 6                           -- AV
                   WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

                  v_errormsg := 'Fout tracken verwerking';

                  fac.trackaction ('RESVER', rec.res_rsv_ruimte_key, NULL, NULL, NULL);
               END IF;
            END IF;
            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, 'W', rec.aanduiding || v_errormsg, 'ADDD-AV');
               COMMIT;
         END;
      END LOOP;
   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, 'E', v_errormsg, 'ADDD-export afgebroken!');
END;
/

-- Export om een BAT-bestand aan te maken dat de PDF-bestanden genereert. Deze
-- export moet voor 5:00 worden gedraaid, daarna (7:00) worden de notificaties
-- vanuit putOrders verstuurd.
CREATE OR REPLACE VIEW bssc_v_export_pdf_att
(
   result,
   result_order
)
AS                                                          -- Facturatie huur
   SELECT    'CALL GENEREER1FIN_VK_PDF.BAT '
          || TO_CHAR (vfk.fin_verkoopfactuurkop_key)
          || ' '
          || vfk.fin_verkoopfactuurkop_id,
          vfk.fin_verkoopfactuurkop_key
     FROM fac_notificatie n, fin_verkoopfactuurkop vfk
    WHERE n.fac_srtnotificatie_key = 281                        -- CUST01-noti
          AND n.fac_notificatie_refkey = vfk.fin_verkoopfactuurkop_key
   UNION ALL                                -- Facturatie additionele diensten
   SELECT    'CALL GENEREER1FIN_VK_PDF.BAT '
          || TO_CHAR (vfk.fin_verkoopfactuurkop_key)
          || ' '
          || vfk.fin_verkoopfactuurkop_id,
          vfk.fin_verkoopfactuurkop_key
     FROM fac_notificatie n, fin_verkoopfactuurkop vfk
    WHERE n.fac_srtnotificatie_key = 341                        -- CUST02-noti
          AND n.fac_notificatie_refkey = vfk.fin_verkoopfactuurkop_key;
/*
CREATE OR REPLACE VIEW bssc_v_rap_fact_controle
(
   fclt_x_stroom,
   fclt_f_controle,
   controle_ref
)
AS
   WITH periodegeg AS (SELECT * FROM bssc_v_fact_actual)
   SELECT DISTINCT 'Verhuur', 'BCC Huurcontract niet gekoppeld aan FIN-plaats',
          v.cnt_contract_nummer_intern || DECODE (v.cnt_contract_versie, NULL, '', '.' || v.cnt_contract_versie)
     FROM periodegeg v, cnt_contract c
    WHERE v.mld_melding_key IS NULL
          AND v.cnt_contract_key = c.cnt_contract_key
          AND c.ins_discipline_key = 621                     -- Huurcontracten
          AND v.alg_plaatsaanduiding NOT LIKE '%FIN%'
   UNION ALL
   SELECT DISTINCT 'Verhuur', 'BCC Huurcontract oppervlakte = 0',
          xref
     FROM (  SELECT v.cnt_contract_nummer_intern || DECODE (v.cnt_contract_versie, NULL, '', '.' || v.cnt_contract_versie) || ' [' || v.regel || ']' xref,
                    SUM (COALESCE (l_opp, 0) + COALESCE (h_opp, 0) + COALESCE (k_opp, 0) + COALESCE (o_opp, 0) + COALESCE (t_opp, 0) ) oppervlakte
               FROM periodegeg v, cnt_contract c
              WHERE v.mld_melding_key IS NULL
                AND v.cnt_contract_key = c.cnt_contract_key
                AND c.ins_discipline_key = 621               -- Huurcontracten
           GROUP BY v.cnt_contract_nummer_intern || DECODE (v.cnt_contract_versie, NULL, '', '.' || v.cnt_contract_versie) || ' [' || v.regel || ']')
    WHERE oppervlakte = 0
   UNION ALL
   SELECT DISTINCT 'Verhuur', 'Contract(regel) bedrag = 0',
          xref
     FROM (  SELECT v.cnt_contract_nummer_intern || DECODE (v.cnt_contract_versie, NULL, '', '.' || v.cnt_contract_versie) || ' [' || v.regel || ']' xref,
                    SUM (v.mndnet) bedrag
               FROM periodegeg v
              WHERE v.mld_melding_key IS NULL
           GROUP BY v.cnt_contract_nummer_intern || DECODE (v.cnt_contract_versie, NULL, '', '.' || v.cnt_contract_versie) || ' [' || v.regel || ']')
    WHERE bedrag = 0
   UNION ALL
   SELECT DISTINCT 'Verhuur', 'Contract(regel) bedrag < 0',
          xref
     FROM (  SELECT v.cnt_contract_nummer_intern || DECODE (v.cnt_contract_versie, NULL, '', '.' || v.cnt_contract_versie) || ' [' || v.regel || ']' xref,
                    SUM (v.mndnet) bedrag
               FROM periodegeg v
              WHERE v.mld_melding_key IS NULL
                    AND v.regel NOT LIKE 'CFF%'
           GROUP BY v.cnt_contract_nummer_intern || DECODE (v.cnt_contract_versie, NULL, '', '.' || v.cnt_contract_versie) || ' [' || v.regel || ']')
    WHERE bedrag < 0
   UNION ALL
   SELECT DISTINCT 'Verhuur', 'Contractkorting >= 100%',
          v.cnt_contract_nummer_intern || DECODE (v.cnt_contract_versie, NULL, '', '.' || v.cnt_contract_versie)
     FROM periodegeg v
    WHERE v.mld_melding_key IS NULL
          AND v.cnt_contract_korting >= 100
   UNION ALL
   SELECT DISTINCT 'Verhuur', 'Contract met GVR-overlap?',
          v.cnt_contract_nummer_intern || DECODE (v.cnt_contract_versie, NULL, '', '.' || v.cnt_contract_versie)
     FROM periodegeg v, alg_v_allonroerendgoed aog
    WHERE v.mld_melding_key IS NULL
          AND v.alg_onroerendgoed_type IN ('G', 'V', 'R')
          AND v.alg_onroerendgoed_keys = aog.alg_onroerendgoed_keys
          AND EXISTS (SELECT 1
                        FROM periodegeg v1, alg_v_allonroerendgoed aog1
                       WHERE v1.alg_onroerendgoed_type IN ('G', 'V', 'R')
                         AND v1.alg_onroerendgoed_keys = aog1.alg_onroerendgoed_keys
                         AND v1.cnt_contract_key = v.cnt_contract_key -- Hetzelfde contract
                         AND aog1.alg_gebouw_key = aog.alg_gebouw_key -- Hetzelfde gebouw
                         AND v1.alg_onroerendgoed_type != v.alg_onroerendgoed_type -- Ander type
                         AND v1.alg_onroerendgoed_keys != v.alg_onroerendgoed_keys) -- Andere regel
   UNION ALL
   SELECT DISTINCT 'Verhuur', 'Dezelfde plaats gekoppeld aan meer contracten',
          v.alg_plaatsaanduiding
     FROM periodegeg v
    WHERE v.mld_melding_key IS NULL
          AND v.alg_onroerendgoed_type IN ('G', 'V', 'R')
          AND EXISTS (SELECT 1
                        FROM periodegeg v1
                       WHERE v1.alg_onroerendgoed_type IN ('G', 'V', 'R')
                         AND v1.alg_onroerendgoed_keys = v.alg_onroerendgoed_keys -- Dezelfde plaats
                         AND v1.cnt_contract_key != v.cnt_contract_key) -- Ander contract
   UNION ALL
   SELECT DISTINCT 'Verhuur', 'E-mail adres van debiteur onbekend',
          v.prs_debiteur_naam
     FROM periodegeg v, prs_bedrijf b
    WHERE v.prs_bedrijf_key = b.prs_bedrijf_key
          AND b.prs_bedrijf_email IS NULL
   UNION ALL
   SELECT DISTINCT 'Verhuur', 'Factuuradres van debiteur onbekend/onvolledig',
          v.prs_debiteur_naam
     FROM periodegeg v
    WHERE v.mld_melding_key IS NULL
          AND (v.adres IS NULL OR v.postcode IS NULL OR v.plaats IS NULL OR v.land IS NULL)
   UNION ALL
   SELECT DISTINCT 'Verhuur', 'Correctiebedrag = 0',
          TO_CHAR (v.mld_melding_key)
     FROM periodegeg v
    WHERE v.mld_melding_key IS NOT NULL
      AND v.mndnet = 0
   UNION ALL
   SELECT DISTINCT 'Verhuur', 'Correctiemelding nog niet in conceptfactuur',
          TO_CHAR (m.mld_melding_key)
     FROM mld_melding m
    WHERE m.mld_stdmelding_key = 482                   -- Financiële correctie
      AND m.mld_melding_status IN (0, 2, 3)      -- Pending/Ingevoerd/Ingezien
   UNION ALL
   SELECT DISTINCT 'Verhuur', 'Contract gekoppeld aan locatie',
          v.cnt_contract_nummer_intern || DECODE (v.cnt_contract_versie, NULL, '', '.' || v.cnt_contract_versie)
     FROM periodegeg v
    WHERE v.mld_melding_key IS NULL
          AND v.alg_onroerendgoed_type = 'L'
   UNION ALL
   SELECT DISTINCT 'Verhuur', 'Debiteurnummer onbekend',
          v.prs_debiteur_naam
     FROM periodegeg v, prs_bedrijf b
    WHERE v.prs_bedrijf_key = b.prs_bedrijf_key
          AND b.prs_overeenkomst_nr IS NULL
   UNION ALL
   SELECT 'Verhuur', 'Aantal factuurregels > max. #regels (zoals geconfigureerd)',
          x.prs_debiteur_naam || ' / ' || x.po_nr
     FROM (  SELECT prs_debiteur_naam, po_nr, COUNT (*) factuurregels
               FROM bssc_v_fact_actual
           GROUP BY prs_debiteur_naam, po_nr) x
    WHERE x.factuurregels > fac.getsetting ('res_xml_max_rsv_ruimte')
   UNION ALL
   SELECT 'Add. Diensten', 'H-afdeling leeg', a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving
     FROM prs_afdeling a
    WHERE a.prs_afdeling_verwijder IS NULL
          AND a.prs_bedrijf_key = 22                               -- Huurders
          AND a.prs_afdeling_parentkey IS NULL
          AND NOT EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid p
                  WHERE p.prs_afdeling_key = a.prs_afdeling_key)
   UNION ALL
   SELECT 'Add. Diensten', 'H-afdeling zonder logins', a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving
     FROM prs_afdeling a
    WHERE a.prs_afdeling_verwijder IS NULL
          AND a.prs_bedrijf_key = 22                               -- Huurders
          AND a.prs_afdeling_parentkey IS NULL
          AND EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid p
                  WHERE p.prs_afdeling_key = a.prs_afdeling_key)
          AND NOT EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid p
                  WHERE COALESCE (p.prs_perslid_oslogin, p.prs_perslid_oslogin2) IS NOT NULL
                        AND p.prs_afdeling_key = a.prs_afdeling_key)
   UNION ALL
   SELECT DISTINCT 'Add. Diensten', 'H-afdeling op ander dan niveau-1', a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving
     FROM prs_afdeling a
    WHERE a.prs_afdeling_verwijder IS NULL
          AND EXISTS
                (SELECT 1
                   FROM prs_v_afdeling_boom ab
                  WHERE ab.prs_bedrijf_key = 22                    -- Huurders
                        AND COALESCE (ab.prs_afdeling_key2, ab.prs_afdeling_key3, ab.prs_afdeling_key4, ab.prs_afdeling_key5) IS NOT NULL
                        AND ab.prs_afdeling_key = a.prs_afdeling_key)
   UNION ALL
   SELECT DISTINCT 'Add. Diensten', 'H-afdeling niet gelinkt aan H-relatie', a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving
     FROM prs_afdeling a--, prs_v_aanwezigperslid ap
    WHERE a.prs_afdeling_verwijder IS NULL
          AND a.prs_bedrijf_key = 22                               -- Huurders
          AND a.prs_afdeling_parentkey IS NULL
          --AND a.prs_afdeling_key = ap.prs_afdeling_key
          --AND COALESCE (ap.prs_perslid_oslogin, ap.prs_perslid_oslogin2) IS NOT NULL
          AND NOT EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigkenmerklink kl, prs_v_aanwezigbedrijf b
                  WHERE kl.prs_kenmerklink_niveau = 'A'
                        AND kl.prs_kenmerk_key = 1001        -- Debiteurnummer
                        AND kl.prs_kenmerklink_waarde = b.prs_overeenkomst_nr
                        AND kl.prs_link_key = a.prs_afdeling_key)
   UNION ALL
   SELECT DISTINCT 'Add. Diensten', 'H-afdeling niet gelinkt aan actief AD-contract', a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving
     FROM prs_afdeling a--, prs_v_aanwezigperslid ap
    WHERE a.prs_afdeling_verwijder IS NULL
          AND a.prs_bedrijf_key = 22                               -- Huurders
          AND a.prs_afdeling_parentkey IS NULL
          --AND a.prs_afdeling_key = ap.prs_afdeling_key
          --AND COALESCE (ap.prs_perslid_oslogin, ap.prs_perslid_oslogin2) IS NOT NULL
          AND NOT EXISTS
                (SELECT 1
                   FROM cnt_v_aanwezigcontract c
                  WHERE c.ins_discipline_key IN (1841, 1842)
                    AND c.cnt_contract_status = 0             -- NIET Gesloten
                    AND TRUNC (c.cnt_contract_looptijd_van) < LAST_DAY (SYSDATE) -- Van-datum < einde te factureren maand
                    AND c.cnt_contract_looptijd_tot > TRUNC (SYSDATE, 'mm') -- Tot-datum > begin te factureren maand
                    AND c.prs_afdeling_key_eig = a.prs_afdeling_key)
   UNION ALL
   SELECT DISTINCT 'Add. Diensten', 'H-afdeling gelinkt aan >1 actief AD-contract', a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving
     FROM prs_afdeling a, cnt_v_aanwezigcontract c1
    WHERE a.prs_afdeling_verwijder IS NULL
          AND a.prs_bedrijf_key = 22                               -- Huurders
          AND a.prs_afdeling_parentkey IS NULL
          AND a.prs_afdeling_key = c1.prs_afdeling_key_eig
          AND c1.ins_discipline_key IN (1841, 1842)
          AND TRUNC (c1.cnt_contract_looptijd_van) < LAST_DAY (SYSDATE) -- Van-datum < einde te factureren maand
          AND c1.cnt_contract_looptijd_tot > TRUNC (SYSDATE, 'mm') -- Tot-datum > begin te factureren maand
          AND c1.cnt_contract_status = 0                      -- NIET Gesloten
          AND EXISTS
                (SELECT 1
                   FROM cnt_v_aanwezigcontract c2
                  WHERE c2.ins_discipline_key IN (1841, 1842)
                        AND TRUNC (c2.cnt_contract_looptijd_van) < LAST_DAY (SYSDATE) -- Van-datum < einde te factureren maand
                        AND c2.cnt_contract_looptijd_tot > TRUNC (SYSDATE, 'mm') -- Tot-datum > begin te factureren maand
                        AND c2.cnt_contract_status = 0        -- NIET Gesloten
                        AND c2.ins_discipline_key = c1.ins_discipline_key
                        AND c2.prs_afdeling_key_eig = c1.prs_afdeling_key_eig
                        AND c2.cnt_contract_key != c1.cnt_contract_key)
   UNION ALL
   SELECT DISTINCT 'Add. Diensten', 'H-relatie niet gelinkt aan H-afdeling', b.prs_bedrijf_naam
     FROM prs_v_aanwezigbedrijf b
    WHERE b.prs_overeenkomst_nr IS NOT NULL
          AND NOT EXISTS
                (SELECT 1
                   FROM prs_afdeling a, prs_v_aanwezigkenmerklink kl
                  WHERE a.prs_afdeling_verwijder IS NULL
                        AND a.prs_bedrijf_key = 22                 -- Huurders
                        AND a.prs_afdeling_parentkey IS NULL
                        AND a.prs_afdeling_key = kl.prs_link_key
                        AND kl.prs_kenmerklink_niveau = 'A'
                        AND kl.prs_kenmerk_key = 1001        -- Debiteurnummer
                        AND kl.prs_kenmerklink_waarde = b.prs_overeenkomst_nr)
   UNION ALL
   SELECT DISTINCT 'Add. Diensten', 'H-relatie niet gelinkt aan actief AD-contract', b.prs_bedrijf_naam
     FROM prs_v_aanwezigbedrijf b
    WHERE EXISTS
                (SELECT 1
                   FROM prs_afdeling a, prs_v_aanwezigkenmerklink kl
                  WHERE a.prs_afdeling_verwijder IS NULL
                        AND a.prs_bedrijf_key = 22                 -- Huurders
                        AND a.prs_afdeling_parentkey IS NULL
                        AND a.prs_afdeling_key = kl.prs_link_key
                        AND kl.prs_kenmerklink_niveau = 'A'
                        AND kl.prs_kenmerk_key = 1001        -- Debiteurnummer
                        AND kl.prs_kenmerklink_waarde = b.prs_overeenkomst_nr)
          AND NOT EXISTS
                (SELECT 1
                   FROM cnt_v_aanwezigcontract c
                  WHERE c.ins_discipline_key IN (1841, 1842)
                    AND c.cnt_contract_status = 0             -- NIET Gesloten
                    AND TRUNC (c.cnt_contract_looptijd_van) < LAST_DAY (SYSDATE) -- Van-datum < einde te factureren maand
                    AND c.cnt_contract_looptijd_tot > TRUNC (SYSDATE, 'mm') -- Tot-datum > begin te factureren maand
                    AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key)
   UNION ALL
   SELECT DISTINCT 'Add. Diensten', 'H-relatie gelinkt aan >1 actief AD-contract', b.prs_bedrijf_naam
     FROM prs_v_aanwezigbedrijf b, cnt_v_aanwezigcontract c1
    WHERE b.prs_bedrijf_key = c1.cnt_prs_bedrijf_key
          AND c1.ins_discipline_key IN (1841, 1842)
          AND TRUNC (c1.cnt_contract_looptijd_van) < LAST_DAY (SYSDATE) -- Van-datum < einde te factureren maand
          AND c1.cnt_contract_looptijd_tot > TRUNC (SYSDATE, 'mm') -- Tot-datum > begin te factureren maand
          AND c1.cnt_contract_status = 0                      -- NIET Gesloten
          AND EXISTS
                (SELECT 1
                   FROM prs_afdeling a, prs_v_aanwezigkenmerklink kl
                  WHERE a.prs_afdeling_verwijder IS NULL
                        AND a.prs_bedrijf_key = 22                 -- Huurders
                        AND a.prs_afdeling_parentkey IS NULL
                        AND a.prs_afdeling_key = kl.prs_link_key
                        AND kl.prs_kenmerklink_niveau = 'A'
                        AND kl.prs_kenmerk_key = 1001        -- Debiteurnummer
                        AND kl.prs_kenmerklink_waarde = b.prs_overeenkomst_nr)
          AND EXISTS
                (SELECT 1
                   FROM cnt_v_aanwezigcontract c2
                  WHERE c2.ins_discipline_key IN (1841, 1842)
                        AND TRUNC (c2.cnt_contract_looptijd_van) < LAST_DAY (SYSDATE) -- Van-datum < einde te factureren maand
                        AND c2.cnt_contract_looptijd_tot > TRUNC (SYSDATE, 'mm') -- Tot-datum > begin te factureren maand
                        AND c2.cnt_contract_status = 0        -- NIET Gesloten
                        AND c2.ins_discipline_key = c1.ins_discipline_key
                        AND c2.prs_afdeling_key_eig = c1.prs_afdeling_key_eig
                        AND c2.cnt_contract_key != c1.cnt_contract_key)
   UNION ALL
   SELECT DISTINCT 'Add. Diensten', 'Actief AD-contract incorrect gelinkt aan huurder', c.cnt_contract_nummer_intern || DECODE (c.cnt_contract_versie, NULL, '', '.' || c.cnt_contract_versie)
     FROM cnt_v_aanwezigcontract c, prs_v_afdeling_boom ab, prs_v_aanwezigkenmerklink kl, prs_bedrijf b
    WHERE c.ins_discipline_key IN (1841, 1842)
          AND c.cnt_contract_status = 0                       -- NIET Gesloten
          AND TRUNC (c.cnt_contract_looptijd_van) < LAST_DAY (SYSDATE) -- Van-datum < einde te factureren maand
          AND c.cnt_contract_looptijd_tot > TRUNC (SYSDATE, 'mm') -- Tot-datum > begin te factureren maand
          AND c.prs_afdeling_key_eig = ab.prs_afdeling_key(+)
          AND ab.prs_bedrijf_key(+) = 22                           -- Huurders
          AND c.prs_afdeling_key_eig = kl.prs_link_key(+)
          AND kl.prs_kenmerklink_niveau(+) = 'A'
          AND kl.prs_kenmerk_key(+) = 1001                   -- Debiteurnummer
          AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key(+)
          AND kl.prs_kenmerklink_waarde != b.prs_overeenkomst_nr
   UNION ALL
   SELECT DISTINCT 'Add. Diensten', 'H-afdeling niet dezelfde naam als gelinkte H-relatie', a.prs_afdeling_omschrijving || ' <> ' || b.prs_bedrijf_naam
     FROM prs_afdeling a, prs_v_aanwezigkenmerklink kl, prs_v_aanwezigbedrijf b
    WHERE a.prs_afdeling_verwijder IS NULL
          AND a.prs_bedrijf_key = 22                               -- Huurders
          AND a.prs_afdeling_parentkey IS NULL
          AND a.prs_afdeling_key = kl.prs_link_key(+)
          AND kl.prs_kenmerklink_niveau = 'A'
          AND kl.prs_kenmerk_key = 1001                      -- Debiteurnummer
          AND kl.prs_kenmerklink_waarde = b.prs_overeenkomst_nr
          AND UPPER (a.prs_afdeling_omschrijving) != TRIM (b.prs_bedrijf_naam_upper)
   UNION ALL
   SELECT 'Uitvoerenden', 'UV-afdeling leeg', a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving
     FROM prs_afdeling a
    WHERE a.prs_afdeling_verwijder IS NULL
          AND a.prs_afdeling_parentkey = 23                             -- UV
          AND NOT EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid p
                  WHERE p.prs_afdeling_key = a.prs_afdeling_key)
   UNION ALL
   SELECT 'Uitvoerenden', 'UV-afdeling zonder logins', a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving
     FROM prs_afdeling a
    WHERE a.prs_afdeling_verwijder IS NULL
          AND a.prs_afdeling_parentkey = 23                             -- UV
          AND EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid p
                  WHERE p.prs_afdeling_key = a.prs_afdeling_key)
          AND NOT EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid p
                  WHERE COALESCE (p.prs_perslid_oslogin, p.prs_perslid_oslogin2) IS NOT NULL
                        AND p.prs_afdeling_key = a.prs_afdeling_key)
   UNION ALL
   SELECT DISTINCT 'Uitvoerenden', 'UV-afdeling met logins niet gelinkt aan UV-relatie', a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving
     FROM prs_afdeling a, prs_v_aanwezigperslid ap
    WHERE a.prs_afdeling_verwijder IS NULL
          AND a.prs_afdeling_parentkey = 23                             -- UV
          AND a.prs_afdeling_key = ap.prs_afdeling_key
          AND COALESCE (ap.prs_perslid_oslogin, ap.prs_perslid_oslogin2) IS NOT NULL
          AND NOT EXISTS
                (SELECT 1
                   FROM prs_contactpersoon cp, prs_bedrijf b, prs_perslid p
                  WHERE cp.prs_contactpersoon_verwijder IS NULL
                        AND cp.prs_bedrijf_key = b.prs_bedrijf_key
                        AND b.prs_bedrijf_verwijder IS NULL
                        AND cp.prs_perslid_key = p.prs_perslid_key
                        AND p.prs_afdeling_key = ap.prs_afdeling_key)
   UNION ALL
   SELECT DISTINCT 'Uitvoerenden', 'UV-afdeling gelinkt aan UV-relatie via persoon zonder login', a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving || '/' || p.prs_perslid_naam
     FROM prs_afdeling a, prs_v_aanwezigperslid p
    WHERE a.prs_afdeling_verwijder IS NULL
          AND a.prs_afdeling_parentkey = 23                             -- UV
          AND a.prs_afdeling_key = p.prs_afdeling_key
          AND COALESCE (p.prs_perslid_oslogin, p.prs_perslid_oslogin2) IS NULL
          AND EXISTS
                (SELECT 1
                   FROM prs_contactpersoon cp, prs_bedrijf b
                  WHERE cp.prs_contactpersoon_verwijder IS NULL
                        AND cp.prs_bedrijf_key = b.prs_bedrijf_key
                        AND b.prs_bedrijf_verwijder IS NULL
                        AND cp.prs_perslid_key = p.prs_perslid_key)
   UNION ALL
   SELECT DISTINCT 'Uitvoerenden', 'UV-relatie gelinkt aan UV-afdeling via verwijderde persoon', a.prs_afdeling_naam || '-' || a.prs_afdeling_omschrijving || '/' || cp.prs_contactpersoon_naam
     FROM prs_afdeling a, prs_perslid p, prs_contactpersoon cp, prs_bedrijf b
    WHERE a.prs_afdeling_verwijder IS NULL
          AND a.prs_afdeling_parentkey = 23                             -- UV
          AND a.prs_afdeling_key = p.prs_afdeling_key
          AND p.prs_perslid_verwijder IS NOT NULL
          AND p.prs_perslid_key = cp.prs_perslid_key
          AND cp.prs_contactpersoon_verwijder IS NULL
          AND cp.prs_bedrijf_key = b.prs_bedrijf_key
          AND b.prs_bedrijf_verwijder IS NULL
   UNION ALL
   SELECT DISTINCT 'Uitvoerenden', 'UV-afdeling niet dezelfde naam als gelinkte UV-relatie', a.prs_afdeling_omschrijving || ' <> ' || b.prs_bedrijf_naam
     FROM prs_afdeling a, prs_perslid p, prs_contactpersoon cp, prs_bedrijf b
    WHERE a.prs_afdeling_verwijder IS NULL
          AND a.prs_afdeling_parentkey = 23                             -- UV
          AND a.prs_afdeling_key = p.prs_afdeling_key
          AND p.prs_perslid_key = cp.prs_perslid_key
          AND cp.prs_contactpersoon_verwijder IS NULL
          AND cp.prs_bedrijf_key = b.prs_bedrijf_key
          AND b.prs_bedrijf_verwijder IS NULL
          AND UPPER (a.prs_afdeling_omschrijving) != TRIM (b.prs_bedrijf_naam_upper)
;
*/
------ 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
