--
-- $Id$
--
-- Script containing customer specific db-configuration for VENR.

DEFINE thisfile = 'VENR.SQL'
DEFINE dbuser   = '^VENR'
DEFINE custid   = 'VENR'

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 venr_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);

-- Export naar UNIT4
/* Formatted on 3-9-2014 15:52:25 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW venr_v_u4_supplier
(
   prs_bedrijf_key,
   supplierid,
   suppliergroupid,
   name,
   shortname,
   street1,
   street2,
   zipcode,
   city,
   person,
   telephone,
   fax,
   email,
   vatnumber,
   paymentconditionid,
   cocregistration,
   combineinvoices      -- Afkorting van 'combineinvoicesforelectronicbanking'
)
AS
   SELECT x.prs_bedrijf_key,
          7000000 + x.prs_bedrijf_key,
          0,
          x.prs_bedrijf_naam,
          SUBSTR (x.prs_bedrijf_naam, 1, 8),
          naamstraat.prs_kenmerklink_waarde,
          x.prs_bedrijf_post_adres,
          x.prs_bedrijf_post_postcode,
          x.prs_bedrijf_post_plaats,
          x.prs_bedrijf_contact_persoon,
          x.prs_bedrijf_telefoon,
          x.prs_bedrijf_fax,
          x.prs_bedrijf_email,
          NULL,                           --TODO btwnr.prs_kenmerklink_waarde,
          (SELECT fac_usrdata_code
             FROM fac_v_aanwezigusrdata
            WHERE fac_usrdata_key =
                     fac.safe_to_number (bc.prs_kenmerklink_waarde)),
          kvknr.prs_kenmerklink_waarde,
          'true'
     FROM (SELECT *
             FROM prs_v_aanwezigbedrijf
            WHERE COALESCE (prs_bedrijf_intern, 0) = 0) x
          LEFT JOIN prs_v_aanwezigkenmerklink btwnr
             ON btwnr.prs_kenmerk_key = 1021                      --BTW-nummer
                AND btwnr.prs_link_key = x.prs_bedrijf_key
          LEFT JOIN prs_v_aanwezigkenmerklink bc
             ON bc.prs_kenmerk_key = 1023                  --Betalingsconditie
                AND bc.prs_link_key = x.prs_bedrijf_key
          LEFT JOIN prs_v_aanwezigkenmerklink kvknr
             ON kvknr.prs_kenmerk_key = 1024                      --KvK-nummer
                AND kvknr.prs_link_key = x.prs_bedrijf_key
          LEFT JOIN prs_v_aanwezigkenmerklink naamstraat
             ON naamstraat.prs_kenmerk_key = 1080                 --NaamStraat
                AND naamstraat.prs_link_key = x.prs_bedrijf_key;

CREATE OR REPLACE VIEW venr_v_u4_customer
(
   prs_bedrijf_key,
   customerid,
   customergroupid,
   name,
   shortname,
   street1,
   street2,
   zipcode,
   city,
   person,
   telephone,
   fax,
   email,
   vatnumber,
   paymentconditionid,
   chargevattypeid,
   cocregistration,
   creditsqueezeid
)
AS
   SELECT x.prs_bedrijf_key,
          7000000 + x.prs_bedrijf_key,
          0,
          x.prs_bedrijf_naam,
          SUBSTR (x.prs_bedrijf_naam, 1, 8),
          naamstraat.prs_kenmerklink_waarde,
          x.prs_bedrijf_post_adres,
          x.prs_bedrijf_post_postcode,
          x.prs_bedrijf_post_plaats,
          x.prs_bedrijf_contact_persoon,
          x.prs_bedrijf_telefoon,
          x.prs_bedrijf_fax,
          x.prs_bedrijf_email,
          NULL,                           --TODO btwnr.prs_kenmerklink_waarde,
          (SELECT fac_usrdata_code
             FROM fac_v_aanwezigusrdata
            WHERE fac_usrdata_key =
                     fac.safe_to_number (bc.prs_kenmerklink_waarde)),
          DECODE (
             btwtype.prs_kenmerklink_waarde,
             NULL,
             1,                 -- Niet gevuld in FACILITOR, dan default 'Ja'?
             (SELECT fac_usrdata_code
                FROM fac_v_aanwezigusrdata
               WHERE fac_usrdata_key =
                        fac.safe_to_number (btwtype.prs_kenmerklink_waarde))),
          kvknr.prs_kenmerklink_waarde,
          0
     FROM (SELECT *
             FROM prs_v_aanwezigbedrijf
            WHERE COALESCE (prs_bedrijf_intern, 0) = 1) x
          LEFT JOIN prs_v_aanwezigkenmerklink btwnr
             ON btwnr.prs_kenmerk_key = 1021                      --BTW-nummer
                AND btwnr.prs_link_key = x.prs_bedrijf_key
          LEFT JOIN prs_v_aanwezigkenmerklink btwtype
             ON btwtype.prs_kenmerk_key = 1022                      --BTW-type
                AND btwtype.prs_link_key = x.prs_bedrijf_key
          LEFT JOIN prs_v_aanwezigkenmerklink bc
             ON bc.prs_kenmerk_key = 1023                  --Betalingsconditie
                AND bc.prs_link_key = x.prs_bedrijf_key
          LEFT JOIN prs_v_aanwezigkenmerklink kvknr
             ON kvknr.prs_kenmerk_key = 1024                      --KvK-nummer
                AND kvknr.prs_link_key = x.prs_bedrijf_key
          LEFT JOIN prs_v_aanwezigkenmerklink naamstraat
             ON naamstraat.prs_kenmerk_key = 1080                 --NaamStraat
                AND naamstraat.prs_link_key = x.prs_bedrijf_key;

/* MAG WEG -> U4 doet hier niets mee!
CREATE OR REPLACE VIEW venr_v_u4_address
(
   supcusid,          -- SupplierId of CustomerId; mappen naar OrganizationId!
   --customergroupid,
   --name,
   addresstype,
   street1,
   postcode,
   city,
   --countryid,
   telephone,
   --mobilephone,
   fax,
   email
)
AS
   SELECT COALESCE (u4nr.prs_kenmerklink_waarde,
                    'F' || TO_CHAR (b.prs_bedrijf_key)),
          --0,
          --prs_bedrijf_naam,
          0,              -- Bezoekadres in FACILITOR => Afleveradres in UNIT4
          b.prs_bedrijf_bezoek_adres,
          b.prs_bedrijf_bezoek_postcode,
          b.prs_bedrijf_bezoek_plaats,
          --prs_bedrijf_bezoek_land,
          b.prs_bedrijf_telefoon,
          b.prs_bedrijf_fax,
          b.prs_bedrijf_email
     FROM prs_v_aanwezigbedrijf b,
          (SELECT *
             FROM prs_v_aanwezigkenmerklink
            WHERE prs_kenmerklink_verwijder IS NULL
                  AND prs_kenmerk_key = 1040) u4nr
    WHERE     b.prs_bedrijf_bezoek_adres IS NOT NULL
          AND b.prs_bedrijf_bezoek_plaats IS NOT NULL
          AND b.prs_bedrijf_key = u4nr.prs_link_key(+)
   UNION ALL
   SELECT COALESCE (u4nr.prs_kenmerklink_waarde,
                    'F' || TO_CHAR (b.prs_bedrijf_key)),
          --0,
          --prs_bedrijf_naam,
          1,                -- Postadres in FACILITOR => Factuuradres in UNIT4
          b.prs_bedrijf_post_adres,
          b.prs_bedrijf_post_postcode,
          b.prs_bedrijf_post_plaats,
          --prs_bedrijf_post_land,
          b.prs_bedrijf_telefoon,
          b.prs_bedrijf_fax,
          b.prs_bedrijf_email
     FROM prs_v_aanwezigbedrijf b,
          (SELECT *
             FROM prs_v_aanwezigkenmerklink
            WHERE prs_kenmerklink_verwijder IS NULL
                  AND prs_kenmerk_key = 1040) u4nr
    WHERE b.prs_bedrijf_post_adres IS NOT NULL
          AND b.prs_bedrijf_post_plaats IS NOT NULL;
*/

/* Formatted on 26-8-2014 9:24:42 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW venr_v_u4_bankaccount
(
   prs_bedrijf_key,
   supcusid,          -- SupplierId of CustomerId; mappen naar OrganizationId!
   accountholdername,
   banktypeid,
   accountnumber,
   bic,
   iban,
   preferred
)
AS
   SELECT x.prs_bedrijf_key,
          7000000 + x.prs_bedrijf_key,
          x.prs_bedrijf_naam,
          'B',                                       -- Altijd 'B' (afgestemd)
          banknr.prs_kenmerklink_waarde,
          --bic.prs_kenmerklink_waarde,
          DECODE (SUBSTR (UPPER (iban.prs_kenmerklink_waarde), 5, 4),
                  'ABNA', 'ABNANL2A',
                  'AEGO', 'AEGONL2U',
                  'ASNB', 'ASNBNL21',
                  'ASRB', 'ASRBNL2R',
                  'BNGH', 'BNGHNL2G',
                  'BNPA', 'BNPANL2A',
                  'BOFS', 'BOFSNL21002',
                  'DEUT', 'DEUTNL2N',
                  'FRBK', 'FRBKNL2L',
                  'FVLB', 'FVLBNL22',
                  'GILL', 'GILLNL2A',
                  'INGB', 'INGBNL2A',
                  'KASA', 'KASANL2A',
                  'KNAB', 'KNABNL2H',
                  'RABO', 'RABONL2U',
                  'RBOS', 'RBOSNL2A',
                  'RBRB', 'RBRBNL21',
                  'SNSB', 'SNSBNL2A',
                  'STAL', 'STALNL2G',
                  'TRIO', 'TRIONL2U',
                  bic.prs_kenmerklink_waarde),
          UPPER (iban.prs_kenmerklink_waarde),
          'true'
     FROM (SELECT * FROM prs_v_aanwezigbedrijf) x
          LEFT JOIN prs_v_aanwezigkenmerklink banknr
             ON banknr.prs_kenmerk_key = 1028     -- Bankrekening (don't care)
                AND banknr.prs_link_key = x.prs_bedrijf_key
          LEFT JOIN prs_v_aanwezigkenmerklink bic
             ON bic.prs_kenmerk_key = 1029     -- BIC-code (don't care unless)
                AND bic.prs_link_key = x.prs_bedrijf_key
          JOIN prs_v_aanwezigkenmerklink iban
             ON iban.prs_kenmerk_key = 1030                      -- Ibannummer
                AND iban.prs_link_key = x.prs_bedrijf_key;


/* Formatted on 1-9-2014 10:50:10 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW venr_v_u4_supplierinvoice
(
   fin_factuur_key,                                                  -- Intern
   mld_opdr_key,                                                     -- Intern
   cnt_contract_key,                                                 -- Intern
   grootboekprefix,                                                  -- Intern
   administratie,                              -- '0829' (OCI) of '0861' (SSD)
   invoiceid,
   invoicedate,
   supplierid,
   paymentconditionid,
   paymentreference,
   vatoninvoice,
   journalid,
   periodnumber,
   reference,
   fiscalyear,
   journaltransaction,
   invoiceexpirationdate,
   rebateexpirationdate
)
AS
   WITH last_exp    -- Tijdstip laatste succesvolle U4-export uit eigen tabel!
           AS (SELECT fac.safe_to_date (fac_usrdata_code,
                                        'dd-mm-yyyy hh24:mi:ss')
                         datum
                 FROM fac_v_aanwezigusrdata
                WHERE fac_usrtab_key = 24 AND fac_usrdata_key = 51),
        bet_cond
           AS (SELECT *
                 FROM prs_v_aanwezigkenmerklink
                WHERE prs_kenmerklink_niveau = 'B' AND prs_kenmerk_key = 1023)
   SELECT f.fin_factuur_key,  -- Initial Main-contract invoices/opdracht=regie
          f.mld_opdr_key mld_opdr_key,
          NULL cnt_contract_key,
          '70' grootboekprefix,                -- TODO: Configureerbaar maken?
          'MVL008' || SUBSTR (kf.fin_kenmerkfactuur_waarde, 3, 2)
             administratie,
          kf.fin_kenmerkfactuur_waarde, -- Boekstuknr-kenmerk gegenereerd door FACILITOR (ook initieel?)
          TO_CHAR (f.fin_factuur_datum, 'DD-MM-YYYY'),
          7000000 + o.mld_uitvoerende_keys,
          COALESCE (udbc.fac_usrdata_code, '60A'),      -- Initiele/A-variant!
          SUBSTR (f.fin_factuur_nr, 1, 16),    -- Factuurnummer in U4 max. 16!
          DECODE (f.fin_factuur_totaal_btw, 0, 'false', 'true'),
          'I',                                     -- Dagboekcode hard op 'I'!
          TO_CHAR (TO_DATE (f.fin_factuur_boekmaand, 'YYYY-MM'), 'MM'),
             TO_CHAR (o.mld_melding_key)
          || '/'
          || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr),
          TO_CHAR (f.fin_factuur_datum, 'YYYY'),
          0,
          TO_CHAR (f.fin_factuur_datum + 60, 'DD-MM-YYYY'),
          TO_CHAR (f.fin_factuur_datum + 60, 'DD-MM-YYYY')
     FROM fin_factuur f,
          fin_kenmerkfactuur kf,
          (  SELECT fac_tracking_refkey,
                    MIN (fac_tracking_datum) fac_tracking_datum
               FROM fac_tracking
              WHERE fac_srtnotificatie_key = 116                     -- FINNEW
           GROUP BY fac_tracking_refkey) finnew,
          last_exp le,
          mld_opdr o,
          bet_cond klbc,
          fac_usrdata udbc,                                -- OOK VERWIJDERDE!
          mld_melding m,
          alg_locatie l,
          alg_district d,
          prs_v_aanwezigkenmerklink kl1,
          prs_v_aanwezigkenmerklink kl2
    WHERE     f.fin_factuur_verwijder IS NULL
          AND f.fin_factuur_statuses_key != 3 -- Skippen als Incompleet (kan niet voorkomen?)
          AND f.fin_factuur_statuses_key != 7 -- Skippen als Akkoord (niet dubbel genereren!)
          AND kf.fin_kenmerkfactuur_verwijder IS NULL
          AND kf.fin_kenmerk_key = 41                    -- Hidden boekstuknr!
          AND f.fin_factuur_key = kf.fin_factuur_key
          AND f.fin_factuur_key = finnew.fac_tracking_refkey
          AND finnew.fac_tracking_datum > le.datum -- Te exporteren initiele invoices
          AND f.mld_opdr_key = o.mld_opdr_key
          AND o.mld_uitvoerende_keys = klbc.prs_link_key(+)
          --AND udbc.fac_usrtab_key = 2                -- Betalingsconditie-waarden
          AND (MOD (fac.safe_to_number (klbc.prs_kenmerklink_waarde), 10)
               + 10) = udbc.fac_usrdata_key(+)
          AND o.mld_melding_key = m.mld_melding_key
          AND m.mld_alg_locatie_key = l.alg_locatie_key
          AND l.alg_district_key = d.alg_district_key
          AND kl1.prs_kenmerklink_niveau = 'B'
          AND kl1.prs_kenmerk_key = 1064 -- Klant->Regio (of bedrijfnaam=regio?)
          AND d.alg_regio_key =
                fac.safe_to_number (kl1.prs_kenmerklink_waarde)
          AND kl2.prs_kenmerklink_niveau = 'B'
          AND kl2.prs_kenmerk_key = 1061               -- Klant->Exportvariant
          AND kl1.prs_link_key = kl2.prs_link_key
          AND kl2.prs_kenmerklink_waarde = '31'    -- Export als Main-contract
   UNION ALL              -- Initial Main-contract invoices/contract=catering?
   SELECT f.fin_factuur_key,
          NULL mld_opdr_key,
          c.cnt_contract_key,
          '70' grootboekprefix,                -- TODO: Configureerbaar maken?
          'MVL008' || SUBSTR (kf.fin_kenmerkfactuur_waarde, 3, 2)
             administratie,
          kf.fin_kenmerkfactuur_waarde, -- Boekstuknr-kenmerk gegenereerd door FACILITOR (ook initieel?)
          TO_CHAR (f.fin_factuur_datum, 'DD-MM-YYYY'),
          7000000 + c.cnt_prs_bedrijf_key,
          COALESCE (udbc.fac_usrdata_code, '60A'),      -- Initiele/A-variant!
          SUBSTR (f.fin_factuur_nr, 1, 16),    -- Factuurnummer in U4 max. 16!
          DECODE (f.fin_factuur_totaal_btw, 0, 'false', 'true'),
          'I',                                     -- Dagboekcode hard op 'I'!
          TO_CHAR (TO_DATE (f.fin_factuur_boekmaand, 'YYYY-MM'), 'MM'),
          c.cnt_contract_nummer_intern,
          TO_CHAR (f.fin_factuur_datum, 'YYYY'),
          0,
          TO_CHAR (f.fin_factuur_datum + 60, 'DD-MM-YYYY'),
          TO_CHAR (f.fin_factuur_datum + 60, 'DD-MM-YYYY')
     FROM fin_factuur f,
          fin_kenmerkfactuur kf,
          (  SELECT fac_tracking_refkey,
                    MIN (fac_tracking_datum) fac_tracking_datum
               FROM fac_tracking
              WHERE fac_srtnotificatie_key = 116                     -- FINNEW
           GROUP BY fac_tracking_refkey) finnew,
          last_exp le,
          cnt_v_aanwezigcontract c,
          bet_cond klbc,
          fac_usrdata udbc,                                -- OOK VERWIJDERDE!
          prs_v_afdeling_boom ab,
          prs_v_aanwezigkenmerklink kl
    WHERE     f.fin_factuur_verwijder IS NULL
          AND f.fin_factuur_statuses_key != 3 -- Skippen als Incompleet (kan niet voorkomen?)
          AND f.fin_factuur_statuses_key != 7 -- Skippen als Akkoord (niet dubbel genereren!)
          AND kf.fin_kenmerkfactuur_verwijder IS NULL
          AND kf.fin_kenmerk_key = 41                    -- Hidden boekstuknr!
          AND f.fin_factuur_key = kf.fin_factuur_key
          AND f.fin_factuur_key = finnew.fac_tracking_refkey
          AND finnew.fac_tracking_datum > le.datum -- Te exporteren initiele invoices
          AND f.cnt_contract_key = c.cnt_contract_key
          AND c.cnt_prs_bedrijf_key = klbc.prs_link_key(+)
          --AND udbc.fac_usrtab_key = 2                -- Betalingsconditie-waarden
          AND (MOD (fac.safe_to_number (klbc.prs_kenmerklink_waarde), 10)
               + 10) = udbc.fac_usrdata_key(+)
          AND c.prs_afdeling_key_eig = ab.prs_afdeling_key
          AND kl.prs_kenmerklink_niveau = 'B'
          AND kl.prs_kenmerk_key = 1061                -- Klant->Exportvariant
          AND ab.prs_bedrijf_key = kl.prs_link_key
          AND kl.prs_kenmerklink_waarde = '31'     -- Export als Main-contract
   UNION ALL                   -- Frozen Main-contract invoices/opdracht=regie
   SELECT f.fin_factuur_key,
          f.mld_opdr_key mld_opdr_key,
          NULL cnt_contract_key,
          '70' grootboekprefix,                -- TODO: Configureerbaar maken?
          'MVL008' || SUBSTR (kf.fin_kenmerkfactuur_waarde, 3, 2)
             administratie,
          kf.fin_kenmerkfactuur_waarde, -- Boekstuknr-kenmerk gegenereerd door FACILITOR
          TO_CHAR (f.fin_factuur_datum, 'DD-MM-YYYY'),
          7000000 + o.mld_uitvoerende_keys,
          COALESCE (udbc.fac_usrdata_code, '60'),      -- Definitieve variant!
          SUBSTR (f.fin_factuur_nr, 1, 16),    -- Factuurnummer in U4 max. 16!
          DECODE (f.fin_factuur_totaal_btw, 0, 'false', 'true'),
          'I',                                     -- Dagboekcode hard op 'I'!
          TO_CHAR (TO_DATE (f.fin_factuur_boekmaand, 'YYYY-MM'), 'MM'),
             TO_CHAR (o.mld_melding_key)
          || '/'
          || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr),
          TO_CHAR (f.fin_factuur_datum, 'YYYY'),
          0,
          TO_CHAR (f.fin_factuur_datum + 60, 'DD-MM-YYYY'),
          TO_CHAR (f.fin_factuur_datum + 60, 'DD-MM-YYYY')
     FROM fin_factuur f,
          fin_kenmerkfactuur kf,
          (  SELECT fac_tracking_refkey,
                    MIN (fac_tracking_datum) fac_tracking_datum
               FROM fac_tracking
              WHERE fac_srtnotificatie_key = 121                     -- FINVER
           GROUP BY fac_tracking_refkey) finver,
          last_exp le,
          mld_opdr o,
          bet_cond klbc,
          fac_usrdata udbc,                                -- OOK VERWIJDERDE!
          mld_melding m,
          alg_locatie l,
          alg_district d,
          prs_v_aanwezigkenmerklink kl1,
          prs_v_aanwezigkenmerklink kl2
    WHERE     f.fin_factuur_verwijder IS NULL
          AND f.fin_factuur_statuses_key = 7                       -- Verwerkt
          AND kf.fin_kenmerkfactuur_verwijder IS NULL
          AND kf.fin_kenmerk_key = 41                    -- Hidden boekstuknr!
          AND f.fin_factuur_key = kf.fin_factuur_key
          AND f.fin_factuur_key = finver.fac_tracking_refkey
          AND finver.fac_tracking_datum > le.datum -- Te exporteren definitieve invoices
          AND f.mld_opdr_key = o.mld_opdr_key
          AND o.mld_uitvoerende_keys = klbc.prs_link_key(+)
          --AND udbc.fac_usrtab_key = 2                -- Betalingsconditie-waarden
          AND MOD (fac.safe_to_number (klbc.prs_kenmerklink_waarde), 10) =
                udbc.fac_usrdata_key(+)
          AND o.mld_melding_key = m.mld_melding_key
          AND m.mld_alg_locatie_key = l.alg_locatie_key
          AND l.alg_district_key = d.alg_district_key
          AND kl1.prs_kenmerklink_niveau = 'B'
          AND kl1.prs_kenmerk_key = 1064 -- Klant->Regio (of bedrijfnaam=regio?)
          AND d.alg_regio_key =
                fac.safe_to_number (kl1.prs_kenmerklink_waarde)
          AND kl2.prs_kenmerklink_niveau = 'B'
          AND kl2.prs_kenmerk_key = 1061               -- Klant->Exportvariant
          AND kl1.prs_link_key = kl2.prs_link_key
          AND kl2.prs_kenmerklink_waarde = '31'    -- Export als Main-contract
   UNION ALL               -- Frozen Main-contract invoices/contract=catering?
   SELECT f.fin_factuur_key,
          NULL mld_opdr_key,
          c.cnt_contract_key,
          '70' grootboekprefix,                -- TODO: Configureerbaar maken?
          'MVL008' || SUBSTR (kf.fin_kenmerkfactuur_waarde, 3, 2)
             administratie,
          kf.fin_kenmerkfactuur_waarde, -- Boekstuknr-kenmerk gegenereerd door FACILITOR
          TO_CHAR (f.fin_factuur_datum, 'DD-MM-YYYY'),
          7000000 + c.cnt_prs_bedrijf_key,
          COALESCE (udbc.fac_usrdata_code, '60'),      -- Definitieve variant!
          SUBSTR (f.fin_factuur_nr, 1, 16),    -- Factuurnummer in U4 max. 16!
          DECODE (f.fin_factuur_totaal_btw, 0, 'false', 'true'),
          'I',                                     -- Dagboekcode hard op 'I'!
          TO_CHAR (TO_DATE (f.fin_factuur_boekmaand, 'YYYY-MM'), 'MM'),
          c.cnt_contract_nummer_intern,
          TO_CHAR (f.fin_factuur_datum, 'YYYY'),
          0,
          TO_CHAR (f.fin_factuur_datum + 60, 'DD-MM-YYYY'),
          TO_CHAR (f.fin_factuur_datum + 60, 'DD-MM-YYYY')
     FROM fin_factuur f,
          fin_kenmerkfactuur kf,
          (  SELECT fac_tracking_refkey,
                    MIN (fac_tracking_datum) fac_tracking_datum
               FROM fac_tracking
              WHERE fac_srtnotificatie_key = 121                     -- FINVER
           GROUP BY fac_tracking_refkey) finver,
          last_exp le,
          cnt_v_aanwezigcontract c,
          bet_cond klbc,
          fac_usrdata udbc,                                -- OOK VERWIJDERDE!
          prs_v_afdeling_boom ab,
          prs_v_aanwezigkenmerklink kl
    WHERE     f.fin_factuur_verwijder IS NULL
          AND f.fin_factuur_statuses_key = 7                       -- Verwerkt
          AND kf.fin_kenmerkfactuur_verwijder IS NULL
          AND kf.fin_kenmerk_key = 41                    -- Hidden boekstuknr!
          AND f.fin_factuur_key = kf.fin_factuur_key
          AND f.fin_factuur_key = finver.fac_tracking_refkey
          AND finver.fac_tracking_datum > le.datum -- Te exporteren definitieve invoices
          AND f.cnt_contract_key = c.cnt_contract_key
          AND c.cnt_prs_bedrijf_key = klbc.prs_link_key(+)
          --AND udbc.fac_usrtab_key = 2                -- Betalingsconditie-waarden
          AND MOD (fac.safe_to_number (klbc.prs_kenmerklink_waarde), 10) =
                udbc.fac_usrdata_key(+)
          AND c.prs_afdeling_key_eig = ab.prs_afdeling_key
          AND kl.prs_kenmerklink_niveau = 'B'
          AND kl.prs_kenmerk_key = 1061                -- Klant->Exportvariant
          AND ab.prs_bedrijf_key = kl.prs_link_key
          AND kl.prs_kenmerklink_waarde = '31'     -- Export als Main-contract
   UNION ALL                  -- Frozen SSD invoices/exceptions-opdracht=regie
   SELECT f.fin_factuur_key,
          f.mld_opdr_key mld_opdr_key,
          NULL cnt_contract_key,
          '71' grootboekprefix,                -- TODO: Configureerbaar maken?
          'MVL008' || SUBSTR (kf.fin_kenmerkfactuur_waarde, 3, 2)
             administratie,
          kf.fin_kenmerkfactuur_waarde, -- Boekstuknr-kenmerk gegenereerd door FACILITOR (ook exceptions?)
          TO_CHAR (f.fin_factuur_datum, 'DD-MM-YYYY'),
          7000000 + o.mld_uitvoerende_keys,
          COALESCE (udbc.fac_usrdata_code, '60'),      -- Definitieve variant!
          SUBSTR (f.fin_factuur_nr, 1, 16),    -- Factuurnummer in U4 max. 16!
          DECODE (f.fin_factuur_totaal_btw, 0, 'false', 'true'),
          'I',                                     -- Dagboekcode hard op 'I'!
          TO_CHAR (TO_DATE (f.fin_factuur_boekmaand, 'YYYY-MM'), 'MM'),
             TO_CHAR (o.mld_melding_key)
          || '/'
          || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr),
          TO_CHAR (f.fin_factuur_datum, 'YYYY'),
          0,
          TO_CHAR (f.fin_factuur_datum + 60, 'DD-MM-YYYY'),
          TO_CHAR (f.fin_factuur_datum + 60, 'DD-MM-YYYY')
     FROM fin_factuur f,
          fin_kenmerkfactuur kf,
          (  SELECT fac_tracking_refkey,
                    MIN (fac_tracking_datum) fac_tracking_datum
               FROM fac_tracking
              WHERE fac_srtnotificatie_key = 121                     -- FINVER
           GROUP BY fac_tracking_refkey) finver,
          last_exp le,
          mld_opdr o,
          bet_cond klbc,
          fac_usrdata udbc,                                -- OOK VERWIJDERDE!
          mld_melding m,
          alg_locatie l,
          alg_district d,
          prs_v_aanwezigkenmerklink kl1,
          prs_v_aanwezigkenmerklink kl2
    WHERE f.fin_factuur_verwijder IS NULL AND f.fin_factuur_statuses_key = 7 -- Verwerkt
          AND EXISTS                          -- WEL gemarkeerd als exception!
                (SELECT 1
                   FROM fin_kenmerkfactuur
                  WHERE     fin_kenmerkfactuur_verwijder IS NULL
                        AND fin_kenmerk_key = 43      -- Specifiek exporteren!
                        AND fin_factuur_key = f.fin_factuur_key)
          AND kf.fin_kenmerkfactuur_verwijder IS NULL
          AND kf.fin_kenmerk_key = 41                    -- Hidden boekstuknr!
          AND f.fin_factuur_key = kf.fin_factuur_key
          AND f.fin_factuur_key = finver.fac_tracking_refkey
          AND finver.fac_tracking_datum > le.datum -- Te exporteren exception-invoices
          AND f.mld_opdr_key = o.mld_opdr_key
          AND o.mld_uitvoerende_keys = klbc.prs_link_key(+)
          --AND udbc.fac_usrtab_key = 2                -- Betalingsconditie-waarden
          AND MOD (fac.safe_to_number (klbc.prs_kenmerklink_waarde), 10) =
                udbc.fac_usrdata_key(+)
          AND o.mld_melding_key = m.mld_melding_key
          AND m.mld_alg_locatie_key = l.alg_locatie_key
          AND l.alg_district_key = d.alg_district_key
          AND kl1.prs_kenmerklink_niveau = 'B'
          AND kl1.prs_kenmerk_key = 1064 -- Klant->Regio (of bedrijfnaam=regio?)
          AND d.alg_regio_key =
                fac.safe_to_number (kl1.prs_kenmerklink_waarde)
          AND kl2.prs_kenmerklink_niveau = 'B'
          AND kl2.prs_kenmerk_key = 1061               -- Klant->Exportvariant
          AND kl1.prs_link_key = kl2.prs_link_key
          AND kl2.prs_kenmerklink_waarde = '32'              -- Export als SSD
   UNION ALL              -- Frozen SSD invoices/exceptions-contract=catering?
   SELECT f.fin_factuur_key,
          NULL mld_opdr_key,
          c.cnt_contract_key,
          '71' grootboekprefix,                -- TODO: Configureerbaar maken?
          'MVL008' || SUBSTR (kf.fin_kenmerkfactuur_waarde, 3, 2)
             administratie,
          kf.fin_kenmerkfactuur_waarde, -- Boekstuknr-kenmerk gegenereerd door FACILITOR (ook exceptions?)
          TO_CHAR (f.fin_factuur_datum, 'DD-MM-YYYY'),
          7000000 + c.cnt_prs_bedrijf_key,
          COALESCE (udbc.fac_usrdata_code, '60'),      -- Definitieve variant!
          SUBSTR (f.fin_factuur_nr, 1, 16),    -- Factuurnummer in U4 max. 16!
          DECODE (f.fin_factuur_totaal_btw, 0, 'false', 'true'),
          'I',                                     -- Dagboekcode hard op 'I'!
          TO_CHAR (TO_DATE (f.fin_factuur_boekmaand, 'YYYY-MM'), 'MM'),
          c.cnt_contract_nummer_intern,
          TO_CHAR (f.fin_factuur_datum, 'YYYY'),
          0,
          TO_CHAR (f.fin_factuur_datum + 60, 'DD-MM-YYYY'),
          TO_CHAR (f.fin_factuur_datum + 60, 'DD-MM-YYYY')
     FROM fin_factuur f,
          fin_kenmerkfactuur kf,
          (  SELECT fac_tracking_refkey,
                    MIN (fac_tracking_datum) fac_tracking_datum
               FROM fac_tracking
              WHERE fac_srtnotificatie_key = 121                     -- FINVER
           GROUP BY fac_tracking_refkey) finver,
          last_exp le,
          cnt_v_aanwezigcontract c,
          bet_cond klbc,
          fac_usrdata udbc,                                -- OOK VERWIJDERDE!
          prs_v_afdeling_boom ab,
          prs_v_aanwezigkenmerklink kl
    WHERE f.fin_factuur_verwijder IS NULL AND f.fin_factuur_statuses_key = 7 -- Verwerkt
          AND EXISTS                          -- WEL gemarkeerd als exception!
                (SELECT 1
                   FROM fin_kenmerkfactuur
                  WHERE     fin_kenmerkfactuur_verwijder IS NULL
                        AND fin_kenmerk_key = 43      -- Specifiek exporteren!
                        AND fin_factuur_key = f.fin_factuur_key)
          AND kf.fin_kenmerkfactuur_verwijder IS NULL
          AND kf.fin_kenmerk_key = 41                    -- Hidden boekstuknr!
          AND f.fin_factuur_key = kf.fin_factuur_key
          AND f.fin_factuur_key = finver.fac_tracking_refkey
          AND finver.fac_tracking_datum > le.datum -- Te exporteren exception-invoices
          AND f.cnt_contract_key = c.cnt_contract_key
          AND c.cnt_prs_bedrijf_key = klbc.prs_link_key(+)
          --AND udbc.fac_usrtab_key = 2                -- Betalingsconditie-waarden
          AND MOD (fac.safe_to_number (klbc.prs_kenmerklink_waarde), 10) =
                udbc.fac_usrdata_key(+)
          AND c.prs_afdeling_key_eig = ab.prs_afdeling_key
          AND kl.prs_kenmerklink_niveau = 'B'
          AND kl.prs_kenmerk_key = 1061                -- Klant->Exportvariant
          AND ab.prs_bedrijf_key = kl.prs_link_key
          AND kl.prs_kenmerklink_waarde = '32'               -- Export als SSD
   UNION ALL                  -- Frozen SSD invoices/underlying-opdracht=regie
   SELECT f.fin_factuur_key,
          f.mld_opdr_key,
          NULL cnt_contract_key,
          '71' grootboekprefix,                -- TODO: Configureerbaar maken?
          'MVL008' || SUBSTR (kf1.fin_kenmerkfactuur_waarde, 3, 2)
             administratie,
          kf1.fin_kenmerkfactuur_waarde, -- Boekstuknr-kenmerk gegenereerd door FACILITOR
          TO_CHAR (f.fin_factuur_datum, 'DD-MM-YYYY'),
          7000000 + o.mld_uitvoerende_keys,
          COALESCE (udbc.fac_usrdata_code, '60'),      -- Definitieve variant!
          SUBSTR (f.fin_factuur_nr, 1, 16),    -- Factuurnummer in U4 max. 16!
          DECODE (f.fin_factuur_totaal_btw, 0, 'false', 'true'),
          'I',                                     -- Dagboekcode hard op 'I'!
          TO_CHAR (TO_DATE (f.fin_factuur_boekmaand, 'YYYY-MM'), 'MM'),
             TO_CHAR (o.mld_melding_key)
          || '/'
          || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr),
          TO_CHAR (f.fin_factuur_datum, 'YYYY'),
          0,
          TO_CHAR (f.fin_factuur_datum + 60, 'DD-MM-YYYY'),
          TO_CHAR (f.fin_factuur_datum + 60, 'DD-MM-YYYY')
     FROM fin_factuur f,
          fin_kenmerkfactuur kf1,
          fin_kenmerkfactuur kf2,
          (  SELECT fac_usrdata_code ordernr,
                    MIN (fac_usrdata_vervaldatum) datum       -- Request-datum
               FROM fac_v_aanwezigusrdata
              WHERE fac_usrtab_key = 25
           GROUP BY fac_usrdata_code) ssdreq,
          last_exp le,
          mld_opdr o,
          bet_cond klbc,
          fac_usrdata udbc,                                -- OOK VERWIJDERDE!
          mld_melding m,
          alg_locatie l,
          alg_district d,
          prs_v_aanwezigkenmerklink kl1,
          prs_v_aanwezigkenmerklink kl2
    WHERE f.fin_factuur_verwijder IS NULL AND f.fin_factuur_statuses_key = 7 -- Verwerkt
          AND NOT EXISTS                     -- NIET gemarkeerd als exception!
                (SELECT 1
                   FROM fin_kenmerkfactuur
                  WHERE     fin_kenmerkfactuur_verwijder IS NULL
                        AND fin_kenmerk_key = 43      -- Specifiek exporteren!
                        AND fin_factuur_key = f.fin_factuur_key)
          AND kf1.fin_kenmerkfactuur_verwijder IS NULL
          AND kf1.fin_kenmerk_key = 41                   -- Hidden boekstuknr!
          AND f.fin_factuur_key = kf1.fin_factuur_key
          AND kf2.fin_kenmerkfactuur_verwijder IS NULL
          AND kf2.fin_kenmerk_key = 42                      -- Hidden ordernr!
          AND f.fin_factuur_key = kf2.fin_factuur_key
          AND kf2.fin_kenmerkfactuur_waarde = ssdreq.ordernr
          AND ssdreq.datum > le.datum     -- Te exporteren underlying-invoices
          AND f.mld_opdr_key = o.mld_opdr_key
          AND o.mld_uitvoerende_keys = klbc.prs_link_key(+)
          --AND udbc.fac_usrtab_key = 2                -- Betalingsconditie-waarden
          AND MOD (fac.safe_to_number (klbc.prs_kenmerklink_waarde), 10) =
                udbc.fac_usrdata_key(+)
          AND o.mld_melding_key = m.mld_melding_key
          AND m.mld_alg_locatie_key = l.alg_locatie_key
          AND l.alg_district_key = d.alg_district_key
          AND kl1.prs_kenmerklink_niveau = 'B'
          AND kl1.prs_kenmerk_key = 1064 -- Klant->Regio (of bedrijfnaam=regio?)
          AND d.alg_regio_key =
                fac.safe_to_number (kl1.prs_kenmerklink_waarde)
          AND kl2.prs_kenmerklink_niveau = 'B'
          AND kl2.prs_kenmerk_key = 1061               -- Klant->Exportvariant
          AND kl1.prs_link_key = kl2.prs_link_key
          AND kl2.prs_kenmerklink_waarde = '32'              -- Export als SSD
   UNION ALL              -- Frozen SSD invoices/underlying-contract=catering?
   SELECT f.fin_factuur_key,
          NULL mld_opdr_key,
          c.cnt_contract_key,
          '71' grootboekprefix,                -- TODO: Configureerbaar maken?
          'MVL008' || SUBSTR (kf1.fin_kenmerkfactuur_waarde, 3, 2)
             administratie,
          kf1.fin_kenmerkfactuur_waarde, -- Boekstuknr-kenmerk gegenereerd door FACILITOR
          TO_CHAR (f.fin_factuur_datum, 'DD-MM-YYYY'),
          7000000 + c.cnt_prs_bedrijf_key,
          COALESCE (udbc.fac_usrdata_code, '60'),      -- Definitieve variant!
          SUBSTR (f.fin_factuur_nr, 1, 16),    -- Factuurnummer in U4 max. 16!
          DECODE (f.fin_factuur_totaal_btw, 0, 'false', 'true'),
          'I',                                     -- Dagboekcode hard op 'I'!
          TO_CHAR (TO_DATE (f.fin_factuur_boekmaand, 'YYYY-MM'), 'MM'),
          c.cnt_contract_nummer_intern,
          TO_CHAR (f.fin_factuur_datum, 'YYYY'),
          0,
          TO_CHAR (f.fin_factuur_datum + 60, 'DD-MM-YYYY'),
          TO_CHAR (f.fin_factuur_datum + 60, 'DD-MM-YYYY')
     FROM fin_factuur f,
          fin_kenmerkfactuur kf1,
          fin_kenmerkfactuur kf2,
          (  SELECT fac_usrdata_code ordernr,
                    MIN (fac_usrdata_vervaldatum) datum       -- Request-datum
               FROM fac_v_aanwezigusrdata
              WHERE fac_usrtab_key = 25
           GROUP BY fac_usrdata_code) ssdreq,
          last_exp le,
          cnt_v_aanwezigcontract c,
          bet_cond klbc,
          fac_usrdata udbc,                                -- OOK VERWIJDERDE!
          prs_v_afdeling_boom ab,
          prs_v_aanwezigkenmerklink kl
    WHERE f.fin_factuur_verwijder IS NULL AND f.fin_factuur_statuses_key = 7 -- Verwerkt
          AND NOT EXISTS                     -- NIET gemarkeerd als exception!
                (SELECT 1
                   FROM fin_kenmerkfactuur
                  WHERE     fin_kenmerkfactuur_verwijder IS NULL
                        AND fin_kenmerk_key = 43      -- Specifiek exporteren!
                        AND fin_factuur_key = f.fin_factuur_key)
          AND kf1.fin_kenmerkfactuur_verwijder IS NULL
          AND kf1.fin_kenmerk_key = 41                   -- Hidden boekstuknr!
          AND f.fin_factuur_key = kf1.fin_factuur_key
          AND kf2.fin_kenmerkfactuur_verwijder IS NULL
          AND kf2.fin_kenmerk_key = 42                      -- Hidden ordernr!
          AND f.fin_factuur_key = kf2.fin_factuur_key
          AND kf2.fin_kenmerkfactuur_waarde = ssdreq.ordernr
          AND ssdreq.datum > le.datum     -- Te exporteren underlying-invoices
          AND f.cnt_contract_key = c.cnt_contract_key
          AND c.cnt_prs_bedrijf_key = klbc.prs_link_key(+)
          --AND udbc.fac_usrtab_key = 2                -- Betalingsconditie-waarden
          AND MOD (fac.safe_to_number (klbc.prs_kenmerklink_waarde), 10) =
                udbc.fac_usrdata_key(+)
          AND c.prs_afdeling_key_eig = ab.prs_afdeling_key
          AND kl.prs_kenmerklink_niveau = 'B'
          AND kl.prs_kenmerk_key = 1061                -- Klant->Exportvariant
          AND ab.prs_bedrijf_key = kl.prs_link_key
          AND kl.prs_kenmerklink_waarde = '32'               -- Export als SSD
;

CREATE OR REPLACE VIEW venr_v_u4_supplierinvoiceline
(
   fin_factuur_key,
   fin_factuurregel_nr,
   invoiceid,
   accountid,  -- Kostensoort volgens input Friso; AANNAME alles doorbelasten!
   description,                                   -- Factuurregel-omschrijving
   transactiondate,
   debitamountcur,
   vatcodeid                                       -- Geen=0, Laag=1 en Hoog=2
)
AS
   SELECT DISTINCT v.fin_factuur_key,
                   fr.fin_factuurregel_nr,
                   v.invoiceid,
                   grootboekprefix                            -- Prefix 70/71!
                   || COALESCE (ksfr.prs_kostensoort_opmerking,
                                ksf.prs_kostensoort_opmerking,
                                ksm.prs_kostensoort_opmerking,
                                ksv.prs_kostensoort_opmerking),
                   SUBSTR (fr.fin_factuurregel_omschrijving, 1, 30),
                   TO_CHAR (f.fin_factuur_datum, 'DD-MM-YYYY'),
                   fr.fin_factuurregel_totaal,                    -- Excl. BTW
                   DECODE (btw.fin_btwtabelwaarde_code, 'L', 1, 'H', 2, 0)
     FROM venr_v_u4_supplierinvoice v,
          fin_factuur f,
          prs_kostensoort ksf,
          fin_factuurregel fr,
          prs_kostensoort ksfr,
          fin_btwtabelwaarde btw,
          mld_opdr o,
          mld_melding m,
          mld_stdmelding sm,
          ins_tab_discipline td,
          prs_kostensoort ksm,
          prs_kostensoort ksv
    WHERE     v.fin_factuur_key = f.fin_factuur_key
          AND f.prs_kostensoort_key = ksf.prs_kostensoort_key(+)
          AND f.fin_factuur_key = fr.fin_factuur_key
          AND fr.prs_kostensoort_key = ksfr.prs_kostensoort_key(+)
          AND btw.fin_btwtabel_key = 1
          AND fr.fin_btwtabelwaarde_key = btw.fin_btwtabelwaarde_key
          AND v.mld_opdr_key = o.mld_opdr_key
          AND o.mld_melding_key = m.mld_melding_key
          AND m.mld_stdmelding_key = sm.mld_stdmelding_key
          AND sm.prs_kostensoort_key = ksm.prs_kostensoort_key(+)
          AND sm.mld_ins_discipline_key = td.ins_discipline_key
          AND td.prs_kostensoort_key = ksv.prs_kostensoort_key(+);

CREATE OR REPLACE VIEW venr_v_u4_vattransactionline
(
   fin_factuur_key,
   fin_factuurregel_nr,
   invoiceid,
   amountturnovercur,
   vatamountcur
)
AS
   SELECT DISTINCT v.fin_factuur_key,
                   fr.fin_factuurregel_nr,
                   v.invoiceid,
                   fr.fin_factuurregel_totaal,                    -- Excl. BTW
                   fr.fin_factuurregel_btw                       -- BTW-bedrag
     FROM venr_v_u4_supplierinvoice v,
          fin_factuurregel fr,
          fin_btwtabelwaarde btw
    WHERE     v.fin_factuur_key = fr.fin_factuur_key
          AND btw.fin_btwtabel_key = 1
          AND fr.fin_btwtabelwaarde_key = btw.fin_btwtabelwaarde_key;


--TODO: CNT-dimensie VENR-diensten afstemmen/afronden!
/* Formatted on 4-9-2014 10:02:28 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW venr_v_u4_order
(
   mld_opdr_key,                                -- Altijd NULL/Intern! => Weg?
   cnt_contract_key,    -- Alleen tbv. verkoopopdrachten zonder factuur/Intern
   grootboekprefix,                                                  -- Intern
   administratie,                              -- '0829' (OCI) of '0861' (SSD)
   orderid,
   orderdate,
   customerid,
   paymentconditionid,
   vatscenarioid,
   chargevattype,
   reference,
   deliveryaddress
)
AS
   WITH last_exp    -- Tijdstip laatste succesvolle U4-export uit eigen tabel!
           AS (SELECT fac.safe_to_date (fac_usrdata_code,
                                        'dd-mm-yyyy hh24:mi:ss')
                         datum
                 FROM fac_v_aanwezigusrdata
                WHERE fac_usrtab_key = 24 AND fac_usrdata_key = 51),
        bet_cond
           AS (SELECT *
                 FROM prs_v_aanwezigkenmerklink
                WHERE prs_kenmerklink_niveau = 'B' AND prs_kenmerk_key = 1023)
   SELECT NULL,                                 -- Frozen Main-contract orders
          NULL,
          '80' grootboekprefix,                -- TODO: Configureerbaar maken?
          'MVL008' || SUBSTR (ssdfrz.ordernr, 3, 2) administratie,
          ssdfrz.ordernr,
          TO_CHAR (ssdfrz.datum, 'DD-MM-YYYY'),
          7000000 + ssdfrz.bedrijf_key,           -- prs_bedrijf_key (via ET)!
          COALESCE (udbc.fac_usrdata_code, '60'),      -- Definitieve variant!
          6,                                                           -- Hard
          0,                                                           -- Hard
          DECODE (
             f.mld_opdr_key,
             NULL,
             'Contract '
             || (SELECT cnt_contract_nummer_intern
                   FROM cnt_contract
                  WHERE cnt_contract_key = f.cnt_contract_key),
             'Opdracht '
             || (SELECT    TO_CHAR (mld_melding_key)
                        || '/'
                        || TO_CHAR (mld_opdr_bedrijfopdr_volgnr)
                   FROM mld_opdr
                  WHERE mld_opdr_key = f.mld_opdr_key)),
          NULL
     FROM (  SELECT fac_usrdata_code ordernr,
                    fac.safe_to_number (fac_usrdata_omschr) bedrijf_key,
                    MIN (fac_usrdata_aanmaak) datum             -- Order-datum
               FROM fac_v_aanwezigusrdata
              WHERE fac_usrtab_key = 25
           GROUP BY fac_usrdata_code, fac_usrdata_omschr) ssdfrz,
          last_exp le,
          bet_cond klbc,
          fac_usrdata udbc,                                -- OOK VERWIJDERDE!
          prs_v_aanwezigkenmerklink kl,
          fin_kenmerkfactuur kf,
          fin_factuur f
    WHERE ssdfrz.datum > le.datum               -- Te exporteren uplift-orders
          AND ssdfrz.bedrijf_key = klbc.prs_link_key(+)
          --AND udbc.fac_usrtab_key = 2             -- Betalingsconditie-waarden
          AND MOD (fac.safe_to_number (klbc.prs_kenmerklink_waarde), 10) =
                udbc.fac_usrdata_key(+)
          AND kl.prs_kenmerklink_niveau = 'B'
          AND kl.prs_kenmerk_key = 1061                -- Klant->Exportvariant
          AND ssdfrz.bedrijf_key = kl.prs_link_key
          AND kl.prs_kenmerklink_waarde = '31'     -- Export als Main-contract
          AND kf.fin_kenmerkfactuur_verwijder IS NULL
          AND kf.fin_kenmerk_key = 42                       -- Hidden ordernr!
          AND ssdfrz.ordernr = kf.fin_kenmerkfactuur_waarde
          AND f.fin_factuur_verwijder IS NULL
          AND f.fin_factuur_statuses_key = 7              -- Verwerkt; altijd!
          AND kf.fin_factuur_key = f.fin_factuur_key
          AND (f.mld_opdr_key IS NOT NULL OR f.cnt_contract_key IS NOT NULL)
   UNION ALL                      -- Periodic Main-contract orders/no invoice!
   SELECT NULL,
          c.cnt_contract_key,
          '80' grootboekprefix,                -- TODO: Configureerbaar maken?
          'MVL008' || SUBSTR (ssdfrz.ordernr, 3, 2) administratie,
          ssdfrz.ordernr,
          TO_CHAR (ssdfrz.datum, 'DD-MM-YYYY'),
          7000000 + ssdfrz.bedrijf_key,           -- prs_bedrijf_key (via ET)!
          COALESCE (udbc.fac_usrdata_code, '60'),      -- Definitieve variant!
          6,                                                           -- Hard
          0,                                                           -- Hard
          'Contract ' || c.cnt_contract_nummer_intern,
          NULL
     FROM (  SELECT fac_usrdata_code ordernr,
                    fac.safe_to_number (fac_usrdata_omschr) bedrijf_key,
                    MIN (fac_usrdata_aanmaak) datum             -- Order-datum
               FROM fac_v_aanwezigusrdata
              WHERE fac_usrtab_key = 25
           GROUP BY fac_usrdata_code, fac_usrdata_omschr) ssdfrz,
          last_exp le,
          bet_cond klbc,
          fac_usrdata udbc,                                -- OOK VERWIJDERDE!
          prs_v_aanwezigkenmerklink kl,
          cnt_contract c
    WHERE ssdfrz.datum > le.datum               -- Te exporteren VENR-diensten
          AND ssdfrz.bedrijf_key = klbc.prs_link_key(+)
          --AND udbc.fac_usrtab_key = 2             -- Betalingsconditie-waarden
          AND MOD (fac.safe_to_number (klbc.prs_kenmerklink_waarde), 10) =
                udbc.fac_usrdata_key(+)
          AND kl.prs_kenmerklink_niveau = 'B'
          AND kl.prs_kenmerk_key = 1061                -- Klant->Exportvariant
          AND ssdfrz.bedrijf_key = kl.prs_link_key
          AND kl.prs_kenmerklink_waarde = '31'     -- Export als Main-contract
          AND NOT EXISTS
                (SELECT 1
                   FROM fin_kenmerkfactuur
                  WHERE fin_kenmerk_key = 42                 -- Hidden ordernr
                        AND fin_kenmerkfactuur_waarde = ssdfrz.ordernr)
          AND ssdfrz.bedrijf_key = c.cnt_prs_bedrijf_key
          AND EXISTS
                (SELECT 1
                   FROM cnt_kenmerkcontract
                  WHERE     cnt_kenmerkcontract_verwijder IS NULL
                        AND cnt_kenmerk_key = -1 -- TODO: Contract-doorbelasten
                        AND cnt_contract_key = c.cnt_contract_key)
   UNION ALL                                     -- Frozen SSD borderel-orders
   SELECT NULL,
          NULL,
          '81' grootboekprefix,                -- TODO: Configureerbaar maken?
          'MVL008' || SUBSTR (ssdfrz.ordernr, 3, 2) administratie,
          ssdfrz.ordernr,
          TO_CHAR (ssdfrz.datum, 'DD-MM-YYYY'),
          7000000 + ssdfrz.bedrijf_key,           -- prs_bedrijf_key (via ET)!
          COALESCE (udbc.fac_usrdata_code, '60'),      -- Definitieve variant!
          6,                                                           -- Hard
          0,                                                           -- Hard
          DECODE ( -- TODO: Toevoegen Regio/District/Locatie op basis van Exportbundeling (of Grootboekcode)?
             kl2.prs_kenmerklink_waarde,
             '42',                                                -- Wekelijks
             'Weekfactuur ' || TO_CHAR (ssdfrz.datum, 'IYYY-IW'),
             '43',                                          -- Halfmaandelijks
             'Halfmaandfactuur ' || TO_CHAR (ssdfrz.datum, 'YYYY-MM/DD'),
             '44',                                              -- Maandelijks
             'Maandfactuur ' || TO_CHAR (ssdfrz.datum, 'YYYY-MM'),
             '45',                                              -- Maandelijks
             'Maandfactuur ' || TO_CHAR (ssdfrz.datum, 'YYYY-MM'),
             'Periode ongeldig!'),
          COALESCE (o2da.deliveryaddress, 'Contract')      -- Listig stukje!!!
     FROM (  SELECT fac_usrdata_code ordernr,
                    fac.safe_to_number (fac_usrdata_omschr) bedrijf_key,
                    MIN (fac_usrdata_aanmaak) datum             -- Order-datum
               FROM fac_v_aanwezigusrdata
              WHERE fac_usrtab_key = 25
           GROUP BY fac_usrdata_code, fac_usrdata_omschr) ssdfrz,
          last_exp le,
          bet_cond klbc,
          fac_usrdata udbc,                                -- OOK VERWIJDERDE!
          prs_v_aanwezigkenmerklink kl1,
          prs_v_aanwezigkenmerklink kl2,
          (SELECT DISTINCT
                  kf.fin_kenmerkfactuur_waarde ordernr,
                  DECODE (kl2.prs_kenmerklink_waarde,
                          '48', r.alg_regio_omschrijving,
                          '49', d.alg_district_omschrijving,
                          l.alg_locatie_omschrijving)
                     deliveryaddress
             FROM fin_kenmerkfactuur kf,
                  fin_factuur f,
                  mld_opdr o,
                  mld_melding m,
                  alg_locatie l,
                  alg_district d,
                  alg_regio r,
                  prs_v_aanwezigkenmerklink kl1,
                  prs_v_aanwezigkenmerklink kl2
            WHERE     kf.fin_kenmerkfactuur_verwijder IS NULL
                  AND kf.fin_kenmerk_key = 42               -- Hidden ordernr!
                  AND kf.fin_factuur_key = f.fin_factuur_key
                  AND f.mld_opdr_key = o.mld_opdr_key
                  AND o.mld_melding_key = m.mld_melding_key
                  AND m.mld_alg_locatie_key = l.alg_locatie_key
                  AND l.alg_district_key = d.alg_district_key
                  AND d.alg_regio_key = r.alg_regio_key
                  AND kl1.prs_kenmerklink_niveau = 'B'
                  AND kl1.prs_kenmerk_key = 1064 -- Klant->Regio (of bedrijfnaam=regio?)
                  AND d.alg_regio_key =
                        fac.safe_to_number (kl1.prs_kenmerklink_waarde)
                  AND kl2.prs_kenmerklink_niveau = 'B'
                  AND kl2.prs_kenmerk_key = 1063     -- Klant->Exportbundeling
                  AND kl1.prs_link_key = kl2.prs_link_key) o2da -- Ordernr2DeliveryAddr.
    WHERE ssdfrz.datum > le.datum                   -- Te exporteren borderels
          AND ssdfrz.bedrijf_key = klbc.prs_link_key(+)
          --AND udbc.fac_usrtab_key = 2             -- Betalingsconditie-waarden
          AND MOD (fac.safe_to_number (klbc.prs_kenmerklink_waarde), 10) =
                udbc.fac_usrdata_key(+)
          AND kl1.prs_kenmerklink_niveau = 'B'
          AND kl1.prs_kenmerk_key = 1061               -- Klant->Exportvariant
          AND ssdfrz.bedrijf_key = kl1.prs_link_key
          AND kl1.prs_kenmerklink_waarde = '32'              -- Export als SSD
          AND kl2.prs_kenmerklink_niveau = 'B'
          AND kl2.prs_kenmerk_key = 1062               -- Klant->Exportperiode
          AND ssdfrz.bedrijf_key = kl2.prs_link_key
          AND ssdfrz.ordernr = o2da.ordernr(+);

/* Formatted on 9-1-2015 10:48:12 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW venr_v_u4_orderline
(
   orderid,                                                          -- Intern
   accountid,
   productid,
   description,
   quantityordered,
   quantitydelivered,
   price,
   priceper,
   vatcodeid
)
AS
     SELECT x.orderid,
            x.grootboekprefix || '000',                       -- Prefix 80/81!
            x.grootboekprefix || '000',                       -- Prefix 80/81!
            'Opdrachten/' || x.orderid || '/' || x.orderdate,
            DECODE (SIGN (SUM (x.fin_factuurregel_totaal)), -1, -1, 1), -- -1 als credit!
            DECODE (SIGN (SUM (x.fin_factuurregel_totaal)), -1, -1, 1), -- -1 als credit!
            ABS(SUM(x.fin_factuurregel_totaal
                    * (1 + COALESCE (ud.fac_usrdata_prijs, 0)))), -- Excl. BTW; price nooit negatief!
            'maal',                                                    -- Hard
            x.vatcodeid
       FROM    (SELECT v.orderid,
                       v.orderdate,
                       v.grootboekprefix,
                       COALESCE (ksfr.prs_kostensoort_opmerking,
                                 ksf.prs_kostensoort_opmerking,
                                 ksm.prs_kostensoort_opmerking,
                                 ksv.prs_kostensoort_opmerking)
                          accountid,
                       fr.fin_factuurregel_totaal,
                       DECODE (btw.fin_btwtabelwaarde_code, 'L', 1, 'H', 2, 0)
                          vatcodeid
                  FROM venr_v_u4_order v,
                       fin_kenmerkfactuur kf,
                       fin_factuur f,
                       prs_kostensoort ksf,
                       fin_factuurregel fr,
                       prs_kostensoort ksfr,
                       fin_btwtabelwaarde btw,
                       mld_opdr o,
                       mld_melding m,
                       mld_stdmelding sm,
                       ins_tab_discipline td,
                       prs_kostensoort ksm,
                       prs_kostensoort ksv
                 WHERE     kf.fin_kenmerkfactuur_verwijder IS NULL
                       AND kf.fin_kenmerk_key = 42          -- Hidden ordernr!
                       AND v.orderid = kf.fin_kenmerkfactuur_waarde
                       AND f.fin_factuur_verwijder IS NULL
                       AND kf.fin_factuur_key = f.fin_factuur_key
                       AND f.prs_kostensoort_key = ksf.prs_kostensoort_key(+)
                       AND f.fin_factuur_key = fr.fin_factuur_key
                       AND fr.prs_kostensoort_key = ksfr.prs_kostensoort_key(+)
                       AND btw.fin_btwtabel_key = 1
                       AND fr.fin_btwtabelwaarde_key = btw.fin_btwtabelwaarde_key
                       AND f.mld_opdr_key = o.mld_opdr_key
                       AND o.mld_melding_key = m.mld_melding_key
                       AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                       AND sm.prs_kostensoort_key = ksm.prs_kostensoort_key(+)
                       AND sm.mld_ins_discipline_key = td.ins_discipline_key
                       AND td.prs_kostensoort_key = ksv.prs_kostensoort_key(+))
               x
            LEFT JOIN
               fac_v_aanwezigusrdata ud
            ON ud.fac_usrtab_key = 26 AND x.accountid = ud.fac_usrdata_code
   GROUP BY x.orderid,
            x.grootboekprefix || '000',                       -- Prefix 80/81!
            x.grootboekprefix || '000',                       -- Prefix 80/81!
            'Opdrachten/' || x.orderid || '/' || x.orderdate,
            x.vatcodeid
   UNION ALL
     SELECT x.orderid,
            x.grootboekprefix || '000',                       -- Prefix 80/81!
            x.grootboekprefix || '000',                       -- Prefix 80/81!
            'Contracten/' || x.orderid || '/' || x.orderdate,
            DECODE (SIGN (SUM (x.fin_factuurregel_totaal)), -1, -1, 1), -- -1 als credit!
            DECODE (SIGN (SUM (x.fin_factuurregel_totaal)), -1, -1, 1), -- -1 als credit!
            ABS(SUM(x.fin_factuurregel_totaal
                    * (1 + COALESCE (ud.fac_usrdata_prijs, 0)))), -- Excl. BTW; price nooit negatief!
            'maal',                                                    -- Hard
            x.vatcodeid
       FROM    (SELECT v.orderid,
                       v.orderdate,
                       v.grootboekprefix,
                       COALESCE (ksfr.prs_kostensoort_opmerking,
                                 ksf.prs_kostensoort_opmerking,
                                 ksc.prs_kostensoort_opmerking)
                          accountid,
                       fr.fin_factuurregel_totaal,
                       DECODE (btw.fin_btwtabelwaarde_code, 'L', 1, 'H', 2, 0)
                          vatcodeid
                  FROM venr_v_u4_order v,
                       fin_kenmerkfactuur kf,
                       fin_factuur f,
                       prs_kostensoort ksf,
                       fin_factuurregel fr,
                       prs_kostensoort ksfr,
                       fin_btwtabelwaarde btw,
                       cnt_contract c,
                       prs_kostensoort ksc
                 WHERE     kf.fin_kenmerkfactuur_verwijder IS NULL
                       AND kf.fin_kenmerk_key = 42          -- Hidden ordernr!
                       AND v.orderid = kf.fin_kenmerkfactuur_waarde
                       AND f.fin_factuur_verwijder IS NULL
                       AND kf.fin_factuur_key = f.fin_factuur_key
                       AND f.prs_kostensoort_key = ksf.prs_kostensoort_key(+)
                       AND f.fin_factuur_key = fr.fin_factuur_key
                       AND fr.prs_kostensoort_key = ksfr.prs_kostensoort_key(+)
                       AND btw.fin_btwtabel_key = 1
                       AND fr.fin_btwtabelwaarde_key = btw.fin_btwtabelwaarde_key
                       AND f.cnt_contract_key = c.cnt_contract_key
                       AND c.prs_kostensoort_key = ksc.prs_kostensoort_key(+))
               x
            LEFT JOIN
               fac_v_aanwezigusrdata ud
            ON ud.fac_usrtab_key = 26 AND x.accountid = ud.fac_usrdata_code
   GROUP BY x.orderid,
            x.grootboekprefix || '000',                       -- Prefix 80/81!
            x.grootboekprefix || '000',                       -- Prefix 80/81!
            'Contracten/' || x.orderid || '/' || x.orderdate,
            x.vatcodeid
   UNION ALL
     SELECT v.orderid,
            v.grootboekprefix || '000',                       -- Prefix 80/81!
            v.grootboekprefix || '000',                       -- Prefix 80/81!
            'Contracten' || v.orderid || '/' || v.orderdate,
            1,                                   -- Altijd 1 dus nooit credit!
            1,                                   -- Altijd 1 dus nooit credit!
            SUM (c.cnt_contract_termijnkosten),    -- Excl. BTW; TODO: Uplift?
            'maal',                                                    -- Hard
            DECODE (btw.fin_btwtabelwaarde_code, 'L', 1, 'H', 2, 0)
       FROM venr_v_u4_order v,
            cnt_contract c,
            prs_kostensoort ksc,
            fin_btwtabelwaarde btw,
            fac_v_aanwezigusrdata ud
      WHERE     v.cnt_contract_key = c.cnt_contract_key
            AND c.prs_kostensoort_key = ksc.prs_kostensoort_key(+)
            AND btw.fin_btwtabel_key = 1
            AND btw.fin_btwtabelwaarde_code = 'H'        -- TODO: Altijd hoog?
            AND ud.fac_usrtab_key = 26                            -- UpliftOCI
            AND ksc.prs_kostensoort_opmerking = ud.fac_usrdata_code
   GROUP BY v.orderid,
            grootboekprefix || '000',                         -- Prefix 80/81!
            grootboekprefix || '000',                         -- Prefix 80/81!
            'Contracten' || v.orderid || '/' || v.orderdate,
            DECODE (btw.fin_btwtabelwaarde_code, 'L', 1, 'H', 2, 0);


--TODO: CNT-dimensie VENR-diensten afstemmen/afronden!
/* Formatted on 2-9-2014 17:00:00 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW venr_v_u4_actual
(
   exportvariant,
   fin_factuur_key,
   mld_opdr_key,
   cnt_contract_key,
   prs_bedrijf_key,
   periode,
   bundeling
)
AS
   SELECT 'MC1', -- Aangemaakte O-facturen voor Main-contract (OCI) => Initiele MC-inkoopfacturen (zonder boekstuknr)
          f.fin_factuur_key,
          f.mld_opdr_key,
          NULL cnt_contract_key,
          o.mld_uitvoerende_keys,
          NULL periode,                        -- Periode niet van toepassing!
          NULL bundeling                     -- Bundeling niet van toepassing!
     FROM fin_factuur f,
          mld_opdr o,
          mld_melding m,
          alg_locatie l,
          alg_district d,
          prs_v_aanwezigkenmerklink kl1,
          prs_v_aanwezigkenmerklink kl2
    WHERE f.fin_factuur_verwijder IS NULL AND f.fin_factuur_statuses_key != 3 -- Skippen als Incompleet (kan niet voorkomen?)
          AND NOT EXISTS      -- Geen boekstuknr, dus nog initieel exporteren!
                (SELECT 1
                   FROM fin_kenmerkfactuur
                  WHERE     fin_kenmerkfactuur_verwijder IS NULL
                        AND fin_kenmerk_key = 41         -- Hidden boekstuknr!
                        AND fin_factuur_key = f.fin_factuur_key)
          AND f.mld_opdr_key = o.mld_opdr_key
          AND o.mld_melding_key = m.mld_melding_key
          AND m.mld_alg_locatie_key = l.alg_locatie_key
          AND l.alg_district_key = d.alg_district_key
          AND kl1.prs_kenmerklink_niveau = 'B'
          AND kl1.prs_kenmerk_key = 1064 -- Klant->Regio (of bedrijfnaam=regio?)
          AND d.alg_regio_key =
                fac.safe_to_number (kl1.prs_kenmerklink_waarde)
          AND kl2.prs_kenmerklink_niveau = 'B'
          AND kl2.prs_kenmerk_key = 1061               -- Klant->Exportvariant
          AND kl1.prs_link_key = kl2.prs_link_key
          AND kl2.prs_kenmerklink_waarde = '31'    -- Export als Main-contract
   UNION ALL -- Aangemaakte C-facturen voor Main-contract (OCI) => Initiele MC-inkoopfacturen (zonder boekstuknr)
   SELECT 'MC1', -- Aangemaakte O-facturen voor Main-contract (OCI) => Initiele MC-inkoopfacturen (zonder boekstuknr)
          f.fin_factuur_key,
          NULL mld_opdr_key,
          c.cnt_contract_key,
          c.cnt_prs_bedrijf_key,
          NULL periode,                        -- Periode niet van toepassing!
          NULL bundeling                     -- Bundeling niet van toepassing!
     FROM fin_factuur f,
          cnt_contract c,
          prs_v_afdeling_boom ab,
          prs_v_aanwezigkenmerklink kl
    WHERE f.fin_factuur_verwijder IS NULL AND f.fin_factuur_statuses_key != 3 -- Skippen als Incompleet (kan niet voorkomen?)
          AND NOT EXISTS      -- Geen boekstuknr, dus nog initieel exporteren!
                (SELECT 1
                   FROM fin_kenmerkfactuur
                  WHERE     fin_kenmerkfactuur_verwijder IS NULL
                        AND fin_kenmerk_key = 41         -- Hidden boekstuknr!
                        AND fin_factuur_key = f.fin_factuur_key)
          AND f.cnt_contract_key = c.cnt_contract_key
          AND c.prs_afdeling_key_eig = ab.prs_afdeling_key
          AND kl.prs_kenmerklink_niveau = 'B'
          AND kl.prs_kenmerk_key = 1061                -- Klant->Exportvariant
          AND ab.prs_bedrijf_key = kl.prs_link_key
          AND kl.prs_kenmerklink_waarde = '31'     -- Export als Main-contract
   UNION ALL -- Goedgekeurde O-facturen voor Main-contract (OCI) => Definitieve MC-inkoop/verkoop
   SELECT 'MC2',
          f.fin_factuur_key,
          f.mld_opdr_key,
          NULL cnt_contract_key,
          kl1.prs_link_key,
          NULL periode,                        -- Periode niet van toepassing!
          NULL bundeling                     -- Bundeling niet van toepassing!
     FROM fin_factuur f,
          mld_opdr o,
          mld_melding m,
          alg_locatie l,
          alg_district d,
          prs_v_aanwezigkenmerklink kl1,
          prs_v_aanwezigkenmerklink kl2
    WHERE     f.fin_factuur_verwijder IS NULL
          AND f.fin_factuur_statuses_key = 6                        -- Akkoord
          AND f.mld_opdr_key = o.mld_opdr_key
          AND o.mld_melding_key = m.mld_melding_key
          AND m.mld_alg_locatie_key = l.alg_locatie_key
          AND l.alg_district_key = d.alg_district_key
          AND kl1.prs_kenmerklink_niveau = 'B'
          AND kl1.prs_kenmerk_key = 1064 -- Klant->Regio (of bedrijfnaam=regio?)
          AND d.alg_regio_key =
                fac.safe_to_number (kl1.prs_kenmerklink_waarde)
          AND kl2.prs_kenmerklink_niveau = 'B'
          AND kl2.prs_kenmerk_key = 1061               -- Klant->Exportvariant
          AND kl1.prs_link_key = kl2.prs_link_key
          AND kl2.prs_kenmerklink_waarde = '31'    -- Export als Main-contract
   UNION ALL -- Goedgekeurde C-facturen voor Main-contract (OCI) => Definitieve MC-inkoopfacturen (met boekstuknr)
   SELECT 'MC2',
          f.fin_factuur_key,
          NULL mld_opdr_key,
          c.cnt_contract_key,
          ab.prs_bedrijf_key,
          NULL periode,                        -- Periode niet van toepassing!
          NULL bundeling                     -- Bundeling niet van toepassing!
     FROM fin_factuur f,
          cnt_contract c,
          prs_v_afdeling_boom ab,
          prs_v_aanwezigkenmerklink kl
    WHERE     f.fin_factuur_verwijder IS NULL
          AND f.fin_factuur_statuses_key = 6                        -- Akkoord
          AND f.cnt_contract_key = c.cnt_contract_key
          AND c.prs_afdeling_key_eig = ab.prs_afdeling_key
          AND kl.prs_kenmerklink_niveau = 'B'
          AND kl.prs_kenmerk_key = 1061                -- Klant->Exportvariant
          AND ab.prs_bedrijf_key = kl.prs_link_key
          AND kl.prs_kenmerklink_waarde = '31'     -- Export als Main-contract
   UNION ALL -- Gemarkeerde C-contracten voor Main-contract (OCI) => MC-verkoopopdrachten/VENR-diensten
   SELECT 'MC3',
          NULL fin_factuur_key,
          NULL mld_opdr_key,
          c.cnt_contract_key,
          c.cnt_prs_bedrijf_key,
          NULL periode,                        -- Periode niet van toepassing!
          NULL bundeling                     -- Bundeling niet van toepassing!
     FROM cnt_v_aanwezigcontract c, prs_v_aanwezigkenmerklink kl
    WHERE EXISTS
             (SELECT 1
                FROM cnt_kenmerkcontract
               WHERE     cnt_kenmerkcontract_verwijder IS NULL
                     AND cnt_kenmerk_key = -1   -- TODO: Contract-doorbelasten
                     AND cnt_contract_key = c.cnt_contract_key)
          AND kl.prs_kenmerklink_niveau = 'B'
          AND kl.prs_kenmerk_key = 1061                -- Klant->Exportvariant
          AND c.cnt_prs_bedrijf_key = kl.prs_link_key
          AND kl.prs_kenmerklink_waarde = '31'     -- Export als Main-contract
   UNION ALL -- Goedgekeurde ‚n gemarkeerde O-facturen voor SSD => SSD-exceptions
   SELECT 'SSD1',
          f.fin_factuur_key,
          f.mld_opdr_key,
          NULL cnt_contract_key,
          o.mld_uitvoerende_keys,
          NULL periode,                        -- Periode niet van toepassing!
          NULL bundeling                     -- Bundeling niet van toepassing!
     FROM fin_factuur f,
          mld_opdr o,
          mld_melding m,
          alg_locatie l,
          alg_district d,
          prs_v_aanwezigkenmerklink kl1,
          prs_v_aanwezigkenmerklink kl2
    WHERE f.fin_factuur_verwijder IS NULL AND f.fin_factuur_statuses_key = 6 -- Akkoord
          AND EXISTS        -- Gemarkeerd als exception, dan nu al exporteren!
                (SELECT 1
                   FROM fin_kenmerkfactuur
                  WHERE     fin_kenmerkfactuur_verwijder IS NULL
                        AND fin_kenmerk_key = 43      -- Specifiek exporteren!
                        AND fin_factuur_key = f.fin_factuur_key)
          AND f.mld_opdr_key = o.mld_opdr_key
          AND o.mld_melding_key = m.mld_melding_key
          AND m.mld_alg_locatie_key = l.alg_locatie_key
          AND l.alg_district_key = d.alg_district_key
          AND kl1.prs_kenmerklink_niveau = 'B'
          AND kl1.prs_kenmerk_key = 1064 -- Klant->Regio (of bedrijfnaam=regio?)
          AND d.alg_regio_key =
                fac.safe_to_number (kl1.prs_kenmerklink_waarde)
          AND kl2.prs_kenmerklink_niveau = 'B'
          AND kl2.prs_kenmerk_key = 1061               -- Klant->Exportvariant
          AND kl1.prs_link_key = kl2.prs_link_key
          AND kl2.prs_kenmerklink_waarde = '32'              -- Export als SSD
   UNION ALL -- Goedgekeurde ‚n gemarkeerde C-facturen voor SSD => SSD-exceptions
   SELECT 'SSD1',
          f.fin_factuur_key,
          NULL mld_opdr_key,
          c.cnt_contract_key,
          c.cnt_prs_bedrijf_key,
          NULL periode,                        -- Periode niet van toepassing!
          NULL bundeling                     -- Bundeling niet van toepassing!
     FROM fin_factuur f,
          cnt_contract c,
          prs_v_afdeling_boom ab,
          prs_v_aanwezigkenmerklink kl
    WHERE f.fin_factuur_verwijder IS NULL AND f.fin_factuur_statuses_key = 6 -- Akkoord
          AND EXISTS        -- Gemarkeerd als exception, dan nu al exporteren!
                (SELECT 1
                   FROM fin_kenmerkfactuur
                  WHERE     fin_kenmerkfactuur_verwijder IS NULL
                        AND fin_kenmerk_key = 43      -- Specifiek exporteren!
                        AND fin_factuur_key = f.fin_factuur_key)
          AND f.cnt_contract_key = c.cnt_contract_key
          AND c.prs_afdeling_key_eig = ab.prs_afdeling_key
          AND kl.prs_kenmerklink_niveau = 'B'
          AND kl.prs_kenmerk_key = 1061                -- Klant->Exportvariant
          AND ab.prs_bedrijf_key = kl.prs_link_key
          AND kl.prs_kenmerklink_waarde = '32'               -- Export als SSD
   UNION ALL -- Goedgekeurde of verwerkte OC-facturen per bundeling voor SSD => SSD-verkoopopdrachten/borderels
   SELECT 'SSD2',
          NULL fin_factuur_key,
          NULL mld_opdr_key,
          NULL cnt_contract_key,
          x.prs_bedrijf_key,
          x.periode,
          x.bundeling
     FROM (SELECT kl1.prs_link_key prs_bedrijf_key,
                  kl3.prs_kenmerklink_waarde periode,
                  DECODE (kl4.prs_kenmerklink_waarde,
                          '48', 'R' || TO_CHAR (d.alg_regio_key),
                          '49', 'D' || TO_CHAR (d.alg_district_key),
                          'L' || TO_CHAR (l.alg_locatie_key))
                     bundeling
             FROM fin_factuur f,
                  mld_opdr o,
                  mld_melding m,
                  alg_locatie l,
                  alg_district d,
                  prs_v_aanwezigkenmerklink kl1,
                  prs_v_aanwezigkenmerklink kl2,
                  prs_v_aanwezigkenmerklink kl3,
                  prs_v_aanwezigkenmerklink kl4
            WHERE f.fin_factuur_verwijder IS NULL
                  AND f.fin_factuur_statuses_key IN (6, 7) -- Akkoord/Verwerkt
                  AND NOT EXISTS -- Geen ordernr, dus nog exporteren als borderel!
                        (SELECT 1
                           FROM fin_kenmerkfactuur
                          WHERE     fin_kenmerkfactuur_verwijder IS NULL
                                AND fin_kenmerk_key = 42    -- Hidden ordernr!
                                AND fin_factuur_key = f.fin_factuur_key)
                  AND f.mld_opdr_key = o.mld_opdr_key
                  AND o.mld_melding_key = m.mld_melding_key
                  AND m.mld_alg_locatie_key = l.alg_locatie_key
                  AND l.alg_district_key = d.alg_district_key
                  AND kl1.prs_kenmerklink_niveau = 'B'
                  AND kl1.prs_kenmerk_key = 1064 -- Klant->Regio (of bedrijfnaam=regio?)
                  AND d.alg_regio_key =
                        fac.safe_to_number (kl1.prs_kenmerklink_waarde)
                  AND kl2.prs_kenmerklink_niveau = 'B'
                  AND kl2.prs_kenmerk_key = 1061       -- Klant->Exportvariant
                  AND kl1.prs_link_key = kl2.prs_link_key
                  AND kl2.prs_kenmerklink_waarde = '32'      -- Export als SSD
                  AND kl3.prs_kenmerklink_niveau = 'B'
                  AND kl3.prs_kenmerk_key = 1062       -- Klant->Exportperiode
                  AND kl1.prs_link_key = kl3.prs_link_key
                  AND kl4.prs_kenmerklink_niveau = 'B'
                  AND kl4.prs_kenmerk_key = 1063     -- Klant->Exportbundeling
                  AND kl1.prs_link_key = kl4.prs_link_key
           UNION
           SELECT ab.prs_bedrijf_key,
                  kl2.prs_kenmerklink_waarde periode,
                  DECODE (kl3.prs_kenmerklink_waarde,
                          '48', 'R0',
                          '49', 'D0',
                          'L0')
                     bundeling
             FROM fin_factuur f,
                  cnt_contract c,
                  prs_v_afdeling_boom ab,
                  prs_v_aanwezigkenmerklink kl1,
                  prs_v_aanwezigkenmerklink kl2,
                  prs_v_aanwezigkenmerklink kl3
            WHERE f.fin_factuur_verwijder IS NULL
                  AND f.fin_factuur_statuses_key IN (6, 7) -- Akkoord/Verwerkt
                  AND NOT EXISTS -- Geen ordernr, dus nog exporteren als borderel!
                        (SELECT 1
                           FROM fin_kenmerkfactuur
                          WHERE     fin_kenmerkfactuur_verwijder IS NULL
                                AND fin_kenmerk_key = 42    -- Hidden ordernr!
                                AND fin_factuur_key = f.fin_factuur_key)
                  AND f.cnt_contract_key = c.cnt_contract_key
                  AND c.prs_afdeling_key_eig = ab.prs_afdeling_key
                  AND kl1.prs_kenmerklink_niveau = 'B'
                  AND kl1.prs_kenmerk_key = 1061       -- Klant->Exportvariant
                  AND ab.prs_bedrijf_key = kl1.prs_link_key
                  AND kl1.prs_kenmerklink_waarde = '32'      -- Export als SSD
                  AND kl2.prs_kenmerklink_niveau = 'B'
                  AND kl2.prs_kenmerk_key = 1062       -- Klant->Exportperiode
                  AND ab.prs_bedrijf_key = kl2.prs_link_key
                  AND kl3.prs_kenmerklink_niveau = 'B'
                  AND kl3.prs_kenmerk_key = 1063     -- Klant->Exportbundeling
                  AND ab.prs_bedrijf_key = kl3.prs_link_key) x;

/* Formatted on 4-9-2014 13:38:22 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PROCEDURE venr_select_u4 (p_applname   IN VARCHAR2,
                                            p_applrun    IN VARCHAR2)
AS
   -- Cursor loopt over een view met daarin opgebouwd alle actuele (nog te
   -- te exporteren) regels; deze of een volgende run.
   CURSOR c1
   IS
        SELECT *
          FROM venr_v_u4_actual
      ORDER BY 1, 2;

   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   export_date      DATE := SYSDATE;
   regelnr          NUMBER := 0;
   v_count          NUMBER;
   v_boekstuknr     VARCHAR2 (20);
   v_ordernr        VARCHAR2 (20);
   v_freeze         NUMBER;
BEGIN
   -- Genereer boekstuknr(OCI+SSD)/ordernr(OCI) voor alle relevante facturen en
   -- bevries (AV=Verwerkt) deze!
   -- Tevens entry in Eigen Tabel met uplift voor OCI-verkoopopdrachten!
   FOR rec IN c1
   LOOP
      v_boekstuknr := NULL;
      v_ordernr := NULL;
      v_freeze := 0;

      IF (rec.exportvariant != 'SSD2')
      THEN
         -- Genereren/toevoegen boekstuknr of ordernr
         IF (rec.exportvariant = 'SSD1') -- SSD/Exception=>Genereren boekstuknr/freeze!
         THEN
            -- Sequence '01' voor boekstuknr tbv. SSD!
            SELECT fac_s_user01.NEXTVAL INTO v_count FROM DUAL;

            v_boekstuknr :=
                  TO_CHAR (export_date, 'Y')
               || '761'                        -- TODO: Configureerbaar maken?
               || SUBSTR ('0000' || TO_CHAR (v_count), -4);

            -- Toevoegen boekstuknr als hidden kenmerk op factuur!
            v_errormsg := 'Fout bij toevoegen boekstuknr/SSD';

            INSERT INTO fin_kenmerkfactuur (fin_factuur_key,
                                            fin_kenmerk_key,
                                            fin_kenmerkfactuur_waarde)
                VALUES (rec.fin_factuur_key, 41, v_boekstuknr);

            v_freeze := 1;
         ELSIF (rec.exportvariant = 'MC1') -- OCI/Initieel=>Genereren boekstuknr/no freeze!
         THEN
            -- Sequence '03' voor boekstuknr tbv. OCI!
            SELECT fac_s_user03.NEXTVAL INTO v_count FROM DUAL;

            v_boekstuknr :=
                  TO_CHAR (export_date, 'Y')
               || '729'                        -- TODO: Configureerbaar maken?
               || SUBSTR ('0000' || TO_CHAR (v_count), -4);

            -- Toevoegen boekstuknr als hidden kenmerk op factuur!
            v_errormsg := 'Fout bij toevoegen boekstuknr/MC';

            INSERT INTO fin_kenmerkfactuur (fin_factuur_key,
                                            fin_kenmerk_key,
                                            fin_kenmerkfactuur_waarde)
                VALUES (rec.fin_factuur_key, 41, v_boekstuknr);
         ELSIF (rec.exportvariant = 'MC2') -- OCI/Definitief=>Genereren ordernr/freeze!
         THEN
            -- Sequence '04' voor ordernr tbv. OCI!
            SELECT fac_s_user04.NEXTVAL INTO v_count FROM DUAL;

            v_ordernr :=
                  TO_CHAR (export_date, 'Y')
               || '629'                        -- TODO: Configureerbaar maken?
               || SUBSTR ('0000' || TO_CHAR (v_count), -4);

            -- Toevoegen ordernr als hidden kenmerk op factuur!
            v_errormsg := 'Fout bij toevoegen ordernr/MC';

            INSERT INTO fin_kenmerkfactuur (fin_factuur_key,
                                            fin_kenmerk_key,
                                            fin_kenmerkfactuur_waarde)
                VALUES (rec.fin_factuur_key, 42, v_ordernr);

            v_freeze := 1;
         ELSIF (rec.exportvariant = 'MC3') -- OCI/Direct definitief=>Genereren ordernr/freeze!
         THEN
            -- Sequence '04' voor ordernr tbv. OCI!
            SELECT fac_s_user04.NEXTVAL INTO v_count FROM DUAL;

            v_ordernr :=
                  TO_CHAR (export_date, 'Y')
               || '629'                        -- TODO: Configureerbaar maken?
               || SUBSTR ('0000' || TO_CHAR (v_count), -4);
         ELSE
            fac.writelog (p_applname,
                          'E',
                          'Exportvariant ongeldig!',
                          '');
         END IF;

         -- Bevriezen factuur
         IF (v_freeze = 1)
         THEN
            v_errormsg := 'Fout bij bevriezen factuur/MC';

            UPDATE fin_factuur f
               SET fin_factuur_statuses_key = 7                          -- AV
             WHERE f.fin_factuur_key = rec.fin_factuur_key;

            fac.trackaction ('FINVER',
                             rec.fin_factuur_key,
                             NULL,                                -- FACILITOR
                             NULL,
                             NULL);

            regelnr := regelnr + 1;
         END IF;

         -- Toevoegen meta-order als entry in eigen tabel (met/zonder uplift?)!
         IF (v_ordernr IS NOT NULL)              -- Alleen Main-contracts=OCI!
         THEN
            v_errormsg := 'Fout bij toevoegen meta-order/MC';

            INSERT INTO fac_usrdata (fac_usrtab_key,
                                     fac_usrdata_code,
                                     fac_usrdata_omschr,
                                     fac_usrdata_aanmaak,
                                     fac_usrdata_vervaldatum,
                                     fac_usrdata_prijs)
                VALUES (25,
                        v_ordernr,
                        TO_CHAR (rec.prs_bedrijf_key), -- OCI-prs_bedrijf_key!
                        export_date,
                        NULL,
                        NULL);                                -- TODO: uplift?
         END IF;
      ELSE                                                        -- Borderels
         -- Of wekelijks en woensdag
         -- Of halfmaandelijks en de 14e of de 'laatste-2' dag van de maand
         -- Of maandelijks en de 'laatste-2' dag van de maand
         -- Of maandelijks en de 5e dag van de maand
         IF ( (rec.periode = '42' AND TO_CHAR (SYSDATE, 'D') = 4)
             OR (rec.periode = '43' AND TO_CHAR (SYSDATE, 'DD') IN ('14', TO_CHAR (LAST_DAY (SYSDATE) - 2, 'DD')))
             OR (rec.periode = '44' AND TO_CHAR (SYSDATE, 'DD') = '05')
             OR (rec.periode = '45' AND TO_CHAR (SYSDATE, 'DD') = TO_CHAR (LAST_DAY (SYSDATE) - 2, 'DD')))
         THEN
            -- 1. Genereer ordernr
            -- 2. Loop over betreffende facturen:
            -- a. Toevoegen ordernr als hidden kenmerk
            -- b. Bevriezen
            -- 3. Toevoegen meta-order in eigen tabel
            -- Sequence '02' voor ordernr tbv. SSD!
            SELECT fac_s_user02.NEXTVAL INTO v_count FROM DUAL;

            v_ordernr :=
                  TO_CHAR (export_date, 'Y')
               || '661'                        -- TODO: Configureerbaar maken?
               || SUBSTR ('0000' || TO_CHAR (v_count), -4);

            FOR rcf
               IN (  SELECT x.fin_factuur_key,
                            x.fin_factuur_statuses_key,
                            x.prs_bedrijf_key
                       FROM (SELECT f.fin_factuur_key,
                                    f.fin_factuur_statuses_key,
                                    o.mld_uitvoerende_keys prs_bedrijf_key,
                                    DECODE (
                                       kl4.prs_kenmerklink_waarde,
                                       '48',
                                       'R' || TO_CHAR (d.alg_regio_key),
                                       '49',
                                       'D' || TO_CHAR (d.alg_district_key),
                                       'L' || TO_CHAR (l.alg_locatie_key))
                                       bundeling
                               FROM fin_factuur f,
                                    mld_opdr o,
                                    mld_melding m,
                                    alg_locatie l,
                                    alg_district d,
                                    prs_v_aanwezigkenmerklink kl1,
                                    prs_v_aanwezigkenmerklink kl2,
                                    --prs_v_aanwezigkenmerklink kl3,
                                    prs_v_aanwezigkenmerklink kl4
                              WHERE f.fin_factuur_verwijder IS NULL
                                    AND f.fin_factuur_statuses_key IN (6, 7) -- Akkoord/Verwerkt
                                    AND NOT EXISTS -- Geen ordernr, dus nog exporteren als borderel!
                                          (SELECT 1
                                             FROM fin_kenmerkfactuur
                                            WHERE fin_kenmerkfactuur_verwijder IS NULL
                                                  AND fin_kenmerk_key = 42 -- Hidden ordernr!
                                                  AND fin_factuur_key =
                                                        f.fin_factuur_key)
                                    AND f.mld_opdr_key = o.mld_opdr_key
                                    AND o.mld_melding_key = m.mld_melding_key
                                    AND m.mld_alg_locatie_key =
                                          l.alg_locatie_key
                                    AND l.alg_district_key = d.alg_district_key
                                    AND kl1.prs_kenmerklink_niveau = 'B'
                                    AND kl1.prs_kenmerk_key = 1064 -- Klant->Regio (of bedrijfnaam=regio?)
                                    AND d.alg_regio_key =
                                          fac.safe_to_number (
                                             kl1.prs_kenmerklink_waarde)
                                    AND kl2.prs_kenmerklink_niveau = 'B'
                                    AND kl2.prs_kenmerk_key = 1061 -- Klant->Exportvariant
                                    AND kl1.prs_link_key = kl2.prs_link_key
                                    AND kl2.prs_kenmerklink_waarde = '32' -- Export als SSD
                                    --AND kl3.prs_kenmerklink_niveau = 'B'
                                    --AND kl3.prs_kenmerk_key = 1062 -- Klant->Exportperiode
                                    --AND kl1.prs_link_key = kl3.prs_link_key
                                    --AND kl3.prs_kenmerklink_waarde =
                                    --      rec.periode
                                    AND kl4.prs_kenmerklink_niveau = 'B'
                                    AND kl4.prs_kenmerk_key = 1063 -- Klant->Exportbundeling
                                    AND kl1.prs_link_key = kl4.prs_link_key
                             UNION ALL
                             SELECT f.fin_factuur_key,
                                    f.fin_factuur_statuses_key,
                                    c.cnt_prs_bedrijf_key prs_bedrijf_key,
                                    DECODE (kl3.prs_kenmerklink_waarde,
                                            '48', 'R0',
                                            '49', 'D0',
                                            'L0')
                                       bundeling
                               FROM fin_factuur f,
                                    cnt_contract c,
                                    prs_v_afdeling_boom ab,
                                    prs_v_aanwezigkenmerklink kl1,
                                    --prs_v_aanwezigkenmerklink kl2,
                                    prs_v_aanwezigkenmerklink kl3
                              WHERE f.fin_factuur_verwijder IS NULL
                                    AND f.fin_factuur_statuses_key IN (6, 7) -- Akkoord/Verwerkt
                                    AND NOT EXISTS -- Geen ordernr, dus nog exporteren als borderel!
                                          (SELECT 1
                                             FROM fin_kenmerkfactuur
                                            WHERE fin_kenmerkfactuur_verwijder IS NULL
                                                  AND fin_kenmerk_key = 42 -- Hidden ordernr!
                                                  AND fin_factuur_key =
                                                        f.fin_factuur_key)
                                    AND f.cnt_contract_key = c.cnt_contract_key
                                    AND c.prs_afdeling_key_eig =
                                          ab.prs_afdeling_key
                                    AND kl1.prs_kenmerklink_niveau = 'B'
                                    AND kl1.prs_kenmerk_key = 1061 -- Klant->Exportvariant
                                    AND ab.prs_bedrijf_key = kl1.prs_link_key
                                    AND kl1.prs_kenmerklink_waarde = '32' -- Export als SSD
                                    --AND kl2.prs_kenmerklink_niveau = 'B'
                                    --AND kl2.prs_kenmerk_key = 1062 -- Klant->Exportperiode
                                    --AND ab.prs_bedrijf_key = kl2.prs_link_key
                                    --AND kl2.prs_kenmerklink_waarde =
                                    --      rec.periode
                                    AND kl3.prs_kenmerklink_niveau = 'B'
                                    AND kl3.prs_kenmerk_key = 1063 -- Klant->Exportbundeling
                                    AND ab.prs_bedrijf_key = kl3.prs_link_key)
                            x
                      WHERE x.bundeling = rec.bundeling
                   ORDER BY 1)
            LOOP
               -- Toevoegen ordernr als hidden kenmerk op factuur!
               v_errormsg := 'Fout bij toevoegen ordernr/SSD';

               INSERT INTO fin_kenmerkfactuur (fin_factuur_key,
                                               fin_kenmerk_key,
                                               fin_kenmerkfactuur_waarde)
                   VALUES (rcf.fin_factuur_key, 42, v_ordernr);

               IF (rcf.fin_factuur_statuses_key != 7)
               THEN
                  v_errormsg := 'Fout bij bevriezen factuur/SSD';

                  UPDATE fin_factuur f
                     SET fin_factuur_statuses_key = 7                    -- AV
                   WHERE f.fin_factuur_key = rcf.fin_factuur_key;

                  fac.trackaction ('FINVER',
                                   rcf.fin_factuur_key,
                                   NULL,                          -- FACILITOR
                                   NULL,
                                   NULL);

                  regelnr := regelnr + 1;
               END IF;
            END LOOP;

            v_errormsg := 'Fout bij toevoegen meta-order/SSD';

            INSERT INTO fac_usrdata (fac_usrtab_key,
                                     fac_usrdata_code,
                                     fac_usrdata_omschr,
                                     fac_usrdata_aanmaak,
                                     fac_usrdata_vervaldatum,
                                     fac_usrdata_prijs)
                VALUES (25,
                        v_ordernr,
                        TO_CHAR (rec.prs_bedrijf_key), -- SSD-prs_bedrijf_key!
                        export_date,
                        NULL,
                        NULL);
         END IF;
      END IF;
   --COMMIT; -- Geen tussentijdse COMMIT, dus alles of niets!
   END LOOP;

   COMMIT;

   -- Let op: 2e param is 'E' omdat deze regel (mede) is bedoeld als feedback
   --         tbv. applicatiebeheerders!
   fac.writelog (p_applname,
                 'E',
                 'Aantal bevroren facturen: ' || TO_CHAR (regelnr),
                 '');

   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',
                    'Proces U4_EXPORT afgebroken!',
                    v_errormsg);
      COMMIT;
END;
/


/* Formatted on 27-8-2014 15:16:44 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PACKAGE VENR
AS
   -- PACKAGES voor de VENR specifieke ondersteuning
   PROCEDURE finish_ssdinvoices (p_ordernr IN NUMBER);
END;
/

/* Formatted on 21-4-2015 10:24:36 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PACKAGE BODY VENR
AS
   PROCEDURE finish_ssdinvoices (p_ordernr IN NUMBER)
   AS
      -- Cursor loopt over nog niet geexporteerde invoices onder borderel met
      -- 'p_ordernr'; betreffende facturen krijgen een boekstuknr!
      CURSOR c1
      IS
           SELECT f.fin_factuur_key
             FROM fin_factuur f, fin_kenmerkfactuur kf
            WHERE     f.fin_factuur_verwijder IS NULL
                  AND f.fin_factuur_statuses_key = 7               -- Verwerkt
                  AND kf.fin_kenmerkfactuur_verwijder IS NULL
                  AND kf.fin_kenmerk_key = 42                       -- Ordernr
                  AND f.fin_factuur_key = kf.fin_factuur_key
                  AND kf.fin_kenmerkfactuur_waarde = TO_CHAR (p_ordernr)
                  AND NOT EXISTS -- GEEN boekstuknr (= NIET gemarkeerd als exception)!
                        (SELECT 1
                           FROM fin_kenmerkfactuur
                          WHERE     fin_kenmerkfactuur_verwijder IS NULL
                                AND fin_kenmerk_key = 41         -- Boekstuknr
                                AND fin_factuur_key = f.fin_factuur_key)
         ORDER BY 1;

      c_applname       VARCHAR2 (50) := 'FINISH_SSDINV';
      v_errormsg       VARCHAR2 (1000);
      oracle_err_num   NUMBER;
      oracle_err_mes   VARCHAR2 (200);
      v_aanduiding     VARCHAR2 (200) := '-';
      v_usrdata_key    NUMBER (10);
      v_boekstuknr     VARCHAR2 (20);
      v_update         NUMBER (10) := 0;
      v_count          NUMBER (10);
   BEGIN
      v_aanduiding := '[' || TO_CHAR (p_ordernr) || '] ';
      v_errormsg := 'Fout bij bepalen meta-order/SSD';

      SELECT fac_usrdata_key
        INTO v_usrdata_key
        FROM fac_v_aanwezigusrdata
       WHERE     fac_usrtab_key = 25
             AND fac_usrdata_vervaldatum IS NULL              -- Moet zo zijn!
             AND fac_usrdata_code = TO_CHAR (p_ordernr);

      -- Toevoegen boekstuknr-kenmerk op 1 of meer facturen!
      FOR rec IN c1
      LOOP
         BEGIN
            v_errormsg := 'Fout bij bepalen boekstuknr';

            -- Sequence '01' voor boekstuknr tbv. SSD
            SELECT fac_s_user01.NEXTVAL INTO v_count FROM DUAL;

            v_boekstuknr :=
                  TO_CHAR (SYSDATE, 'Y')
               || '761'                        -- TODO: Configureerbaar maken?
               || SUBSTR ('0000' || TO_CHAR (v_count), -4);

            v_errormsg := 'Fout bij toevoegen boekstuknr';

            INSERT INTO fin_kenmerkfactuur (fin_factuur_key,
                                            fin_kenmerk_key,
                                            fin_kenmerkfactuur_waarde)
                VALUES (rec.fin_factuur_key, 41, v_boekstuknr);

            v_update := v_update + 1;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     v_errormsg
                  || ' ORACLE (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.writelog (c_applname,
                             'W',
                             v_aanduiding || v_errormsg,
                             '');
         END;
      END LOOP;

      v_errormsg := 'Fout bij bijwerken vervaldatum';

      UPDATE fac_usrdata
         SET fac_usrdata_vervaldatum = SYSDATE
       WHERE fac_usrdata_key = v_usrdata_key;

      fac.writelog (
         c_applname,
         'S',
            'SSD-borderel '
         || TO_CHAR (p_ordernr)
         || '/#invoices: '
         || TO_CHAR (v_update),
         '');

      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 (c_applname,
                       'E',
                       'Procedure FINISH_SSDINV afgebroken!',
                       v_errormsg);
   END finish_ssdinvoices;
END;
/

/* Formatted on 17-9-2014 15:50:10 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW venr_v_rap_finish_ssdinvoices
(
   hide_f_bedrijf_key,
   fclt_f_bedrijf,
   ordernr,
   aantal,
   totaal_excl,
   totaal_incl
)
AS
     SELECT b.prs_bedrijf_key,
            b.prs_bedrijf_naam,
            ud.fac_usrdata_code,
            COUNT (DISTINCT f.fin_factuur_key),
            SUM (fr.fin_factuurregel_totaal),
            SUM (fr.fin_factuurregel_totaal + ROUND (fr.fin_factuurregel_btw, 2))
       FROM fac_v_aanwezigusrdata ud,
            prs_bedrijf b,
            fin_kenmerkfactuur kf,
            fin_factuur f,
            fin_factuurregel fr
      WHERE     ud.fac_usrtab_key = 25                    -- Verkoopopdrachten
            AND ud.fac_usrdata_vervaldatum IS NULL
            AND ud.fac_usrdata_code LIKE '_661%'     -- Prefix voor SSD-orders
            AND fac.safe_to_number (ud.fac_usrdata_omschr) = b.prs_bedrijf_key
            AND kf.fin_kenmerkfactuur_verwijder IS NULL
            AND kf.fin_kenmerk_key = 42                             -- Ordernr
            AND ud.fac_usrdata_code = kf.fin_kenmerkfactuur_waarde
            AND f.fin_factuur_statuses_key = 7     -- Verwerkt (moet zo zijn)!
            AND kf.fin_factuur_key = f.fin_factuur_key
            AND f.fin_factuur_key = fr.fin_factuur_key
   GROUP BY b.prs_bedrijf_key, b.prs_bedrijf_naam, ud.fac_usrdata_code;


/* Formatted on 5-9-2014 9:55:05 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW venr_v_rap_order2invoice_xref
(
   fclt_x_borderel,
   fclt_f_locatie,
   fclt_f_leverancier,
   extern_factuurnr,
   excl_btw,
   btw_hoog,
   btw_laag,
   kostenplaats,
   soort_onderhoud,
   meldingnummer,
   fclt_3d_afdeling_key
)
AS
     SELECT ud.fac_usrdata_code,
            DECODE (
               l.alg_locatie_key,
               NULL,
               'Contract',
               l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')'),
            uv.prs_bedrijf_naam,
            f.fin_factuur_nr,
            SUM (fr.fin_factuurregel_totaal),
            SUM(DECODE (fr.fin_btwtabelwaarde_key,
                        3, ROUND (fr.fin_factuurregel_btw, 2),
                        0)),
            SUM(DECODE (fr.fin_btwtabelwaarde_key,
                        2, ROUND (fr.fin_factuurregel_btw, 2),
                        0)),
            gbc.fin_kenmerkfactuur_waarde,
            DECODE (o.mld_typeopdr_key, NULL, NULL, 281, 'P', 'C'), -- 281=Preventief onderhoud
            TO_CHAR (o.mld_melding_key),
            b2a.prs_afdeling_key
       FROM fac_v_aanwezigusrdata ud,
            prs_bedrijf kl,
            (  SELECT prs_bedrijf_key, MIN (prs_afdeling_key1) prs_afdeling_key
                 FROM prs_v_afdeling_boom
             GROUP BY prs_bedrijf_key) b2a,
            fin_kenmerkfactuur kf,
            fin_factuur f,
            fin_factuurregel fr,
            mld_opdr o,
            mld_melding m,
            alg_locatie l,
            prs_bedrijf uv,
            (SELECT *
               FROM fin_kenmerkfactuur
              WHERE fin_kenmerkfactuur_verwijder IS NULL
                    AND fin_kenmerk_key = 61) gbc       -- Grootboekcode klant
      WHERE     ud.fac_usrtab_key = 25                    -- Verkoopopdrachten
            AND ud.fac_usrdata_vervaldatum IS NULL
            AND ud.fac_usrdata_code LIKE '_661%'     -- Prefix voor SSD-orders
            AND fac.safe_to_number (ud.fac_usrdata_omschr) = kl.prs_bedrijf_key
            AND kl.prs_bedrijf_key = b2a.prs_bedrijf_key
            AND kf.fin_kenmerkfactuur_verwijder IS NULL
            AND kf.fin_kenmerk_key = 42                             -- Ordernr
            AND ud.fac_usrdata_code = kf.fin_kenmerkfactuur_waarde
            --AND f.fin_factuur_statuses_key = 7     -- Verwerkt (moet zo zijn)!
            AND kf.fin_factuur_key = f.fin_factuur_key
            AND f.fin_factuur_key = fr.fin_factuur_key
            AND f.mld_opdr_key = o.mld_opdr_key(+)
            AND o.mld_melding_key = m.mld_melding_key(+)
            AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
            AND o.mld_uitvoerende_keys = uv.prs_bedrijf_key(+)
            AND f.fin_factuur_key = gbc.fin_factuur_key(+)
   GROUP BY ud.fac_usrdata_code,
            DECODE (
               l.alg_locatie_key,
               NULL,
               'Contract',
                  l.alg_locatie_omschrijving
               || ' ('
               || l.alg_locatie_code
               || ')'),
            uv.prs_bedrijf_naam,
            f.fin_factuur_nr,
            gbc.fin_kenmerkfactuur_waarde,
            DECODE (o.mld_typeopdr_key, NULL, NULL, 281, 'P', 'C'),
            TO_CHAR (o.mld_melding_key),
            b2a.prs_afdeling_key;

-- Import vanuit Strukton
/* Formatted on 22-5-2015 11:52:44 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PROCEDURE venr_import_opdrstat_strukton (p_import_key IN NUMBER)
AS
   c_delim                VARCHAR2 (1) := ';';
   v_newline              VARCHAR2 (4000);                       -- Input line
   v_errormsg             VARCHAR2 (1000);
   oracle_err_num         NUMBER;
   oracle_err_mes         VARCHAR2 (200);
   v_aanduiding           VARCHAR2 (1000) := '';
   header_is_valid        NUMBER := 0;
   v_count_tot            NUMBER (10) := 0;
   v_count_import         NUMBER (10) := 0;
   v_ongeldig             NUMBER (1) := 0;
   -- De importvelden
   v_mld_opdr_key_tekst   VARCHAR2 (100);
   v_mld_opdr_key         NUMBER (10);
   v_mld_opdr_opmerking   VARCHAR2 (4000);
   v_extern_nummer        VARCHAR2 (100);
   v_status_code          VARCHAR2 (100);
   v_status               NUMBER (10);
   v_datumtijd_tekst      VARCHAR2 (100);
   v_datumtijd            DATE;
   v_status_tekst         VARCHAR2 (100);
   v_opmerking            VARCHAR2 (4000);

   -- Overige velden:
   CURSOR c1
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   -- Eerst opruiming
   DELETE FROM venr_imp_opdrstat_strukton;

   COMMIT;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout bij opvragen importregel';
         v_aanduiding := '';
         v_ongeldig := 0;

         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_delim, v_mld_opdr_key_tekst);
         fac.imp_getfield (v_newline, c_delim, v_extern_nummer);
         fac.imp_getfield (v_newline, c_delim, v_status_code);       -- typeID
         fac.imp_getfield (v_newline, c_delim, v_datumtijd_tekst);
         fac.imp_getfield (v_newline, c_delim, v_status_tekst);
         fac.imp_getfield (v_newline, c_delim, v_opmerking);
         v_opmerking := SUBSTR (v_opmerking, 1, 1000);
         -- Verwijder de markering voor cr/lf die in stylesheet is toegevoegd.
         v_opmerking := REPLACE (v_opmerking, '@@', CHR (13));
         v_aanduiding :=
               '['
            || v_mld_opdr_key_tekst
            || '|'
            || v_extern_nummer
            || '|'
            || v_status_code
            || '|'
            || v_datumtijd_tekst
            || '|'
            || v_status_tekst
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF header_is_valid = 0
         THEN
            IF     UPPER (TRIM (v_mld_opdr_key_tekst)) = 'REFERENCEID'
               AND UPPER (TRIM (v_extern_nummer)) = 'SERVICEREQUESTID'
               AND UPPER (TRIM (v_status_code)) = 'TYPEID'
               AND UPPER (TRIM (v_datumtijd_tekst)) = 'DATETIME'
               AND UPPER (TRIM (v_opmerking)) = 'REMARKS'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errormsg := 'Fout bepalen opdracht';
            v_mld_opdr_key := TRIM (v_mld_opdr_key);

            BEGIN
               SELECT o.mld_opdr_key, o.mld_opdr_opmerking
                 INTO v_mld_opdr_key, v_mld_opdr_opmerking
                 FROM mld_opdr o,
                      mld_melding m,
                      mld_stdmelding sm,
                      ins_tab_discipline td,
                      ins_srtdiscipline sd
                WHERE     o.mld_melding_key = m.mld_melding_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   sd.ins_srtdiscipline_prefix
                         || m.mld_melding_key
                         || '/'
                         || o.mld_opdr_bedrijfopdr_volgnr =
                            v_mld_opdr_key_tekst;
            EXCEPTION
               WHEN OTHERS
               THEN
                  v_ongeldig := 1;
                  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_import_key,
                                'W',
                                v_aanduiding || v_errormsg,
                                '');
            END;

            IF v_ongeldig = 0
            THEN
               v_errormsg := 'Fout bepalen status';

               CASE
                  WHEN v_status_code = '5'
                  THEN
                     v_status := 5;                              -- uitgegeven
                  WHEN v_status_code = '10'
                  THEN
                     v_status := 8;                            -- geaccepteerd
                  WHEN v_status_code = '20'                  -- monteur gereed
                  THEN
                     v_status := 6;                                -- afgemeld
                  WHEN v_status_code = '25'               -- specialist gereed
                  THEN
                     v_status := 6;                                -- afgemeld
                  WHEN v_status_code = '30'                -- technisch gereed
                  THEN
                     v_status := 6;                                -- afgemeld
                  -- For future use
                  --WHEN v_status_code = '40'                     -- uitgeprijst
                  --THEN
                  --   v_status := 6;                                -- afgemeld
                  WHEN v_status_code = '70'
                  THEN
                     v_status := 1;                             -- geannuleerd
                  WHEN v_status_code = '80'
                  THEN
                     v_status := 1;                               -- afgewezen
                  ELSE
                     v_status := NULL;
                     v_ongeldig := 1;                         -- nog te bezien
               END CASE;
            END IF;

            IF v_ongeldig = 0
            THEN
               v_errormsg := 'Fout converteren datumtijd';

               IF INSTR (v_datumtijd_tekst, '.') > 0
               THEN
                  v_datumtijd :=
                     fac.safe_to_date (
                        REPLACE (
                           SUBSTR (v_datumtijd_tekst,
                                   1,
                                   INSTR (v_datumtijd_tekst, '.') - 1),
                           'T',
                           ' '),
                        'yyyy-mm-dd hh24:mi:ss');
               ELSE
                  v_datumtijd :=
                     fac.safe_to_date (v_datumtijd_tekst,
                                       'yyyy-mm-dd hh24:mi:ss');
               END IF;
            END IF;

            IF v_ongeldig = 0
            THEN
               v_errormsg := 'Fout aanvullen opmerking';

               -- controleer of de opmerking niet leeg is en of dezelfde opmerking al bij een eerdere statusovergang
               -- gemeld is.
               IF v_opmerking IS NOT NULL
                  AND INSTR (v_mld_opdr_opmerking, v_opmerking) = 0
               THEN
                  v_opmerking :=
                        '['
                     || v_datumtijd_tekst
                     || '] - '
                     || v_status_tekst
                     || CHR (13)
                     || CHR (10)
                     || v_opmerking;
               ELSE
                  v_opmerking :=
                     '[' || v_datumtijd_tekst || '] - ' || v_status_tekst;
               END IF;
            END IF;

            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               BEGIN
                  v_errormsg := 'Fout wegschrijven statusbericht';

                  INSERT INTO venr_imp_opdrstat_strukton (mld_opdr_key,
                                                          extern_nummer,
                                                          status,
                                                          datumtijd,
                                                          opmerking)
                      VALUES (v_mld_opdr_key,
                              v_extern_nummer,
                              v_status,
                              v_datumtijd,
                              v_opmerking);

                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                     v_errormsg :=
                           v_errormsg
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog (
                        p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        '');
               END;
            ELSE
               IF v_status_code <> '40' AND v_status_code <> '45'
               THEN
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_aanduiding || v_errormsg,
                                    '');
               END IF;
            END IF;
         END IF;
      END;
   END LOOP;

   IF header_is_valid = 0
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!');
   ELSE
      fac.imp_writelog (
         p_import_key,
         'S',
         'Inleesproces/#ingelezen statusberichten: ' || TO_CHAR (v_count_tot),
         '');
      fac.imp_writelog (
         p_import_key,
         'S',
         'Inleesproces/#ongeldige niet ingelezen statusberichten: '
         || TO_CHAR (v_count_tot - v_count_import),
         '');
   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.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Inleesproces statusberichten afgebroken!');
END;
/

CREATE OR REPLACE PROCEDURE venr_update_opdrstat_strukton (p_import_key IN NUMBER)
AS
   -- Cursor loopt - in volgorde! - over alle ingelezen statusberichten.
   CURSOR c1
   IS
        SELECT mld_opdr_key, extern_nummer, datumtijd, status, opmerking
          FROM venr_imp_opdrstat_strukton
      ORDER BY 1, 3;

   c_user_key              NUMBER (10) := 5;                 -- _STRUKTON-user
   c_refnr_srtkkey         NUMBER (10) := 141;           -- Refnr. Leverancier
   v_errormsg              VARCHAR2 (1000);
   oracle_err_num          NUMBER;
   oracle_err_mes          VARCHAR2 (200);
   v_aanduiding            VARCHAR2 (200);
   v_count_tot             NUMBER (10) := 0;
   v_count                 NUMBER (10) := 0;
   v_mld_key               NUMBER (10) := 0;
   v_opdr_key              NUMBER (10) := 0;
   v_opdr_status           NUMBER (10) := 0;
   v_mld_typeopdr_key      NUMBER (10);
   v_mld_kenmerk_key       NUMBER (10);
   v_mld_kenmerkopdr_key   NUMBER (10);
BEGIN
   -- Loop over alle ingelezen Strukton-statusberichten.
   FOR rec IN c1
   LOOP
      BEGIN
         v_aanduiding :=
               '['
            || rec.mld_opdr_key
            || '|'
            || SUBSTR (rec.opmerking, 1, 100)
            || '] ';
         v_count_tot := v_count_tot + 1;

         -- Key van melding/opdracht bepalen en Refnr. bij opdracht opslaan.
         IF rec.mld_opdr_key IS NOT NULL
         THEN
            v_errormsg := 'Fout bepalen opdracht.';

            SELECT mld_melding_key, mld_opdr_key, mld_statusopdr_key, mld_typeopdr_key
              INTO v_mld_key, v_opdr_key, v_opdr_status, v_mld_typeopdr_key
              FROM mld_opdr
             WHERE mld_opdr_key = rec.mld_opdr_key;

            v_errormsg := 'Fout bepalen Refnr-kenmerk.';

            SELECT k.mld_kenmerk_key
              INTO v_mld_kenmerk_key
              FROM mld_kenmerk k
             WHERE k.mld_srtkenmerk_key = c_refnr_srtkkey
                   AND k.mld_typeopdr_key = v_mld_typeopdr_key;

            v_errormsg := 'Fout bepalen Refnr-kenmerkopdracht.';

            SELECT MAX (ko.mld_kenmerkopdr_key)
              INTO v_mld_kenmerkopdr_key
              FROM mld_kenmerkopdr ko
             WHERE ko.mld_opdr_key = v_opdr_key
                   AND v_mld_kenmerk_key = ko.mld_kenmerk_key;

            IF v_mld_kenmerkopdr_key IS NULL
            THEN
               -- Kenmerk toevoegen
               v_errormsg := 'Fout toevoegen Refnr-kenmerkopdracht.';

               INSERT INTO mld_kenmerkopdr (mld_kenmerk_key,
                                            mld_opdr_key,
                                            mld_kenmerkopdr_waarde)
                   VALUES (v_mld_kenmerk_key, v_opdr_key, rec.extern_nummer);
            ELSE
               -- Kenmerk bijwerken
               v_errormsg := 'Fout bijwerken Refnr-kenmerkopdracht.';

               UPDATE mld_kenmerkopdr
                  SET mld_kenmerkopdr_waarde = rec.extern_nummer
                WHERE mld_kenmerkopdr_key = v_mld_kenmerkopdr_key;
            END IF;

            v_errormsg := 'Fout bijwerken Opmerking (opdracht).';

            v_count := LENGTH (rec.opmerking) + 5; -- Beetje speling qua lengte!

            UPDATE mld_opdr
               SET mld_opdr_opmerking =
                      DECODE (
                         mld_opdr_opmerking,
                         NULL,
                         rec.opmerking,
                            rec.opmerking
                         || CHR (13)
                         || CHR (10)
                         || SUBSTR (mld_opdr_opmerking, 1, (4000 - v_count)))
             WHERE mld_opdr_key = v_opdr_key;

            v_errormsg := 'Fout bijwerken Status.';

            IF v_opdr_status <> rec.status
            THEN
               IF rec.status = 8 AND v_opdr_status = 5
               THEN
                  -- Accepteer opdracht als de opdracht uitgegeven was
                  MLD.setopdrachtstatus (v_opdr_key, 8, c_user_key); -- Strukton
               ELSIF rec.status = 6 AND v_opdr_status = 5
               THEN
                  -- Meld de opdracht af als deze uitgegeven was
                  MLD.setopdrachtstatus (v_opdr_key, 8, c_user_key); -- Strukton, eerst accepteren
                  MLD.setopdrachtstatus (v_opdr_key, 6, c_user_key); -- Strukton
               ELSIF rec.status = 6 AND v_opdr_status = 8
               THEN
                  -- Meld de opdracht af als deze geaccepteerd was
                  MLD.setopdrachtstatus (v_opdr_key, 6, c_user_key); -- Strukton
               ELSIF rec.status = 1 AND v_opdr_status IN (5, 8)
               THEN
                  -- Wijs de opdracht af als deze niet/wel geaccepteerd was
                  MLD.setopdrachtstatus (v_opdr_key, 1, c_user_key); -- Strukton
                  MLD.updatemeldingstatusAV (v_mld_key, 0, c_user_key, 0);
               END IF;

               IF rec.status = 6 AND v_opdr_status <> 6
               THEN
-- KFNS#37965: Niet meer melding bijwerken (en afmelden was ook al niet meer)!
/*
                  v_errormsg := 'Fout bijwerken Opmerking (melding).';

                  UPDATE mld_melding m
                     SET mld_melding_opmerking =
                            DECODE (
                               mld_melding_opmerking,
                               NULL,
                               rec.opmerking,
                               rec.opmerking || CHR (13) || CHR (10)
                               || SUBSTR (mld_melding_opmerking,
                                          1,
                                          (4000 - v_count)))
                   WHERE mld_melding_key = v_mld_key
                         AND mld_melding_status IN (4, 7)
                         AND NOT EXISTS
                               ( -- Afhandeling in melding niet aanpassen voor projecten
                                SELECT  sm.mld_stdmelding_key
                                   FROM mld_stdmelding sm,
                                        ins_tab_discipline td,
                                        ins_srtdiscipline sd
                                  WHERE sm.mld_stdmelding_key = m.mld_stdmelding_key
                                        AND sm.mld_ins_discipline_key = td.ins_discipline_key
                                        AND td.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                                        AND sd.ins_srtdiscipline_prefix = 'QQQ');

                  v_errormsg := 'Fout sluiten melding.';

                  SELECT COUNT ( * )
                    INTO v_count
                    FROM (SELECT m.mld_melding_key,
                                 (SELECT COUNT ( * )
                                    FROM mld_opdr o
                                   WHERE mld_melding_key = m.mld_melding_key)
                                    aanw_opdr,
                                 (SELECT COUNT ( * )
                                    FROM mld_opdr o
                                   WHERE mld_melding_key = m.mld_melding_key
                                         AND o.mld_statusopdr_key NOT IN (1, 2, 6, 7, 9))
                                    open_opdr
                            FROM mld_melding m
                           WHERE m.mld_melding_key = v_mld_key
                                 AND m.mld_melding_status IN (4, 7))
                         niet_opgelost
                   WHERE aanw_opdr > 0 AND open_opdr = 0;
*/
                  -- Sinds AADO#30922 wordt de melding niet meer automatisch afgemeld.
                  MLD.updatemeldingstatusAV (v_mld_key, 0, c_user_key, 0);
               END IF;
            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.imp_writelog (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Statusbericht-loop');
      END;
   END LOOP;

   COMMIT;
END;
/


/* Formatted on 10-6-2016 17:02:58 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW venr_v_imp_prs_perslid_sync
(
   prs_afdeling_naam,
   prs_perslid_naam,
   prs_perslid_tussenvoegsel,
   prs_perslid_voorletters,
   prs_perslid_voornaam,
   prs_perslid_titel,
   prs_perslid_telefoonnr,
   prs_perslid_mobiel,
   prs_perslid_email,
   prs_perslid_apikey,
   prs_srtperslid_omschrijving,
   prs_perslid_nr,
   prs_perslid_oslogin,
   prs_perslid_oslogin2,
   prs_perslid_geslacht,
   prs_perslid_dienstverband
)
AS
   SELECT pg.prs_afdeling_naam,
          p.prs_perslid_naam,
          p.prs_perslid_tussenvoegsel,
          p.prs_perslid_voorletters,
          p.prs_perslid_voornaam,
          p.prs_perslid_titel,
          p.prs_perslid_telefoonnr,
          p.prs_perslid_mobiel,
          p.prs_perslid_email,
          p.prs_perslid_apikey,
          pg.prs_srtperslid_omschrijving,
          p.prs_perslid_nr,
          p.prs_perslid_oslogin,
          p.prs_perslid_oslogin2,
          p.prs_perslid_geslacht,
          p.prs_perslid_dienstverband
     FROM prs_perslid p, prs_v_perslid_gegevens pg, prs_v_afdeling a
    WHERE     p.prs_perslid_apikey IS NOT NULL     -- Alleen XD-users = APIKEY
          AND SUBSTR (p.prs_perslid_oslogin, 1, 1) != '_'     -- Selecteerbaar
          AND p.prs_perslid_key = pg.prs_perslid_key               -- Aanwezig
          AND p.prs_perslid_flags = 0                               -- Normaal
          AND p.prs_afdeling_key = a.prs_afdeling_key
          AND a.prs_bedrijf_key = fac.getsetting ('xd_primary_bedrijfkey');


-- VENR#39178: FIN-rapportages per klant/leverancier/contract.
/* Formatted on 24-2-2017 13:30:30 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW venr_v_rap_actual_cost_tot
(
   fclt_3d_afdeling_key,                   -- Kunnen beperken per leverancier!
   maand,
   fclt_f_klant,
   fclt_f_leverancier,
   contractnr,
   beschrijving,
   aantal,
   kosten_onderweg,
   kosten_afgerond,
   fclt_x_kostenplaats
)
AS                              -- Vaste contractkosten over de ACTUAL termijn
   SELECT b2a.prs_afdeling_key,
          TO_CHAR (SYSDATE, 'yyyy-mm'), -- Deze maand volgende maand factureren (achteraf)
          x.alg_district_omschrijving klant,
          b2a.prs_bedrijf_naam leverancier,
          x.cnt_contract_nummer_intern, -- Uit deze maand lopend contract, anders geen vaste kosten
          x.cnt_contract_omschrijving,
          0 aantal,
          ROUND (
             DECODE (COALESCE (x.cnt_contract_termijnkosten, 0),
                     0, x.cnt_contract_kosten / 12,
                     x.cnt_contract_termijnkosten),
             2)
             kosten_onderweg,
          TO_NUMBER (NULL) kosten_afgerond,
          x.prs_kostenplaats_nr || '-' || x.prs_kostenplaats_omschrijving
     FROM    (SELECT d.alg_district_omschrijving,                     -- Klant
                     --c.cnt_contract_key,
                     c.cnt_contract_nummer_intern,
                     c.cnt_contract_omschrijving,
                     c.cnt_prs_bedrijf_key,                     -- Leverancier
                     c.cnt_contract_kosten,
                     c.cnt_contract_termijnkosten,
                     kp.prs_kostenplaats_nr,
                     kp.prs_kostenplaats_omschrijving
                FROM cnt_v_aanwezigcontract c,
                     (SELECT cp.cnt_contract_key, g.alg_locatie_key
                        FROM cnt_contract_plaats cp, alg_gebouw g
                       WHERE cp.cnt_alg_plaats_code = 'G'
                             AND cp.cnt_alg_plaats_key = g.alg_gebouw_key
                      UNION ALL
                      SELECT cp.cnt_contract_key,
                             cp.cnt_alg_plaats_key alg_locatie_key
                        FROM cnt_contract_plaats cp
                       WHERE cp.cnt_alg_plaats_code = 'L') cl,
                     alg_locatie l,
                     alg_district d,
                     prs_kostenplaats kp
               WHERE EXISTS                    -- Gemarkeerd als vast contract
                        (SELECT 1
                           FROM cnt_kenmerkcontract kc, cnt_kenmerk k
                          WHERE kc.cnt_kenmerkcontract_verwijder IS NULL
                                AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                                AND k.cnt_srtkenmerk_key = 81 -- Vast contract
                                AND kc.cnt_kenmerkcontract_waarde = '1' -- Aangevinkt
                                AND kc.cnt_contract_key = c.cnt_contract_key)
                     --AND c.cnt_contract_status = 0            -- NIET Gesloten
                     AND TRUNC (c.cnt_contract_looptijd_van) < TRUNC (LAST_DAY (SYSDATE))
                     AND c.cnt_contract_looptijd_tot >= TRUNC (LAST_DAY (SYSDATE))
                     AND c.cnt_contract_key = cl.cnt_contract_key
                     AND cl.alg_locatie_key = l.alg_locatie_key
                     AND l.alg_district_key = d.alg_district_key
                     AND EXISTS    -- Geconfigureerd als te rapporteren klant!
                           (SELECT 1
                              FROM fac_v_aanwezigusrdata
                             WHERE fac_usrtab_key = 121       -- FinRapKlanten
                                   AND fac_usrdata_code = TO_CHAR (d.alg_district_key))
                     AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)) x
          LEFT JOIN
             (  SELECT b.prs_bedrijf_key, b.prs_bedrijf_naam,
                       MIN (p.prs_afdeling_key) prs_afdeling_key,
                       COUNT ( * ) aantal
                  FROM prs_bedrijf b, prs_contactpersoon cp, prs_perslid p
                 WHERE b.prs_bedrijf_key = cp.prs_bedrijf_key(+)
                       AND cp.prs_perslid_key = p.prs_perslid_key(+)
              GROUP BY b.prs_bedrijf_key, b.prs_bedrijf_naam) b2a
          ON x.cnt_prs_bedrijf_key = b2a.prs_bedrijf_key
   UNION ALL -- Variabele kosten uit ACTUAL opdrachten waarvoor Kosten meerekenen=Ja
     SELECT b2a.prs_afdeling_key,
            TO_CHAR (SYSDATE, 'yyyy-mm'), -- Deze maand ORDAFR, volgende maand factureren (achteraf)
            x.alg_district_omschrijving klant,
            COALESCE (b2a.prs_bedrijf_naam, pf.prs_perslid_naam_full) leverancier,
            x.cnt_contract_nummer_intern,
            x.cnt_contract_omschrijving,
            COUNT ( * ) aantal,
            SUM (DECODE (ordafr.fac_tracking_refkey, NULL, COALESCE (x.mld_opdr_kosten, 0), 0))
               kosten_onderweg,
            SUM (DECODE (ordafr.fac_tracking_refkey, NULL, 0, COALESCE (x.mld_opdr_kosten, 0)))
               kosten_afgerond,
            x.prs_kostenplaats_nr || '-' || x.prs_kostenplaats_omschrijving
       FROM (SELECT d.alg_district_omschrijving,                      -- Klant
                    o.mld_opdr_key,
                    --o.mld_melding_key,
                    --o.mld_opdr_bedrijfopdr_volgnr,
                    --o.mld_statusopdr_key,
                    o.mld_uitvoerende_keys,                     -- Leverancier
                    o.mld_opdr_kosten,
                    c.cnt_contract_nummer_intern,
                    c.cnt_contract_omschrijving,
                    kp.prs_kostenplaats_nr,
                    kp.prs_kostenplaats_omschrijving
               FROM mld_opdr o,
                    mld_typeopdr ot,
                    mld_melding m,
                    --prs_perslid p,
                    --prs_v_afdeling_boom ab,
                    --prs_bedrijf b,
                    alg_locatie l,
                    alg_district d,
                    cnt_contract c,
                    prs_kostenplaats kp
              WHERE o.mld_statusopdr_key NOT IN (1, 2, 7)  -- Nog niet gereed!
                    AND o.mld_typeopdr_key = ot.mld_typeopdr_key
                    AND ot.mld_typeopdr_kosten = 1     -- Kosten meerekenen=Ja
                    AND NOT EXISTS             -- Niet gemarkeerd als dispuut!
                          (SELECT 1
                             FROM mld_v_aanwezigkenmerkopdr ko, mld_kenmerk k
                            WHERE ko.mld_opdr_key = o.mld_opdr_key
                                  AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                                  AND k.mld_srtkenmerk_key = -1     -- Dispuut
                                  AND ko.mld_kenmerkopdr_waarde = '1') -- Aangevinkt
                    AND o.mld_melding_key = m.mld_melding_key
                    --AND m.prs_perslid_key = p.prs_perslid_key
                    --AND p.prs_afdeling_key = ab.prs_afdeling_key
                    --AND ab.prs_bedrijf_key = b.prs_bedrijf_key
                    AND m.mld_alg_locatie_key = l.alg_locatie_key
                    AND l.alg_district_key = d.alg_district_key
                    AND EXISTS     -- Geconfigureerd als te rapporteren klant!
                          (SELECT 1
                             FROM fac_v_aanwezigusrdata
                            WHERE fac_usrtab_key = 121        -- FinRapKlanten
                                  AND fac_usrdata_code = TO_CHAR (d.alg_district_key))
                    AND o.cnt_contract_key = c.cnt_contract_key(+)
                    AND o.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)) x
            LEFT JOIN fac_tracking ordafr
               ON ordafr.fac_srtnotificatie_key = 68                 -- ORDAFR
                  AND x.mld_opdr_key = ordafr.fac_tracking_refkey
            LEFT JOIN (  SELECT b.prs_bedrijf_key, b.prs_bedrijf_naam,
                                MIN (p.prs_afdeling_key) prs_afdeling_key,
                                COUNT ( * ) aantal
                           FROM prs_bedrijf b, prs_contactpersoon cp, prs_perslid p
                          WHERE b.prs_bedrijf_key = cp.prs_bedrijf_key(+)
                                AND cp.prs_perslid_key = p.prs_perslid_key(+)
                       GROUP BY b.prs_bedrijf_key, b.prs_bedrijf_naam) b2a
               ON x.mld_uitvoerende_keys = b2a.prs_bedrijf_key
            LEFT JOIN prs_v_perslid_fullnames_all pf
               ON x.mld_uitvoerende_keys = pf.prs_perslid_key
   GROUP BY b2a.prs_afdeling_key,
            x.alg_district_omschrijving,
            COALESCE (b2a.prs_bedrijf_naam, pf.prs_perslid_naam_full),
            x.cnt_contract_nummer_intern,
            x.cnt_contract_omschrijving,
            x.prs_kostenplaats_nr || '-' || x.prs_kostenplaats_omschrijving
   UNION ALL
     SELECT TO_NUMBER (NULL) prs_afdeling_key, -- TODO: prs_afdeling_key van AppŠl?
            TO_CHAR (SYSDATE, 'yyyy-mm'), -- Deze maand geboekt, volgende maand factureren (achteraf)
            x.alg_district_omschrijving klant,
            'Appèl' leverancier,
            TO_CHAR (NULL) cnt_contract_nummer_intern,
            'RES/Banqueting' cnt_contract_omschrijving,
            COUNT (DISTINCT x.res_rsv_ruimte_key) aantal,
            SUM (DECODE (resafm.fac_tracking_refkey, NULL, COALESCE (x.res_rsv_artikel_prijs, 0), 0))
               kosten_onderweg,
            SUM (DECODE (resafm.fac_tracking_refkey, NULL, 0, COALESCE (x.res_rsv_artikel_prijs, 0)))
               kosten_afgerond,
            x.prs_kostenplaats_nr || '-' || x.prs_kostenplaats_omschrijving
       FROM (SELECT d.alg_district_omschrijving,                      -- Klant
                    rrr.res_rsv_ruimte_key,
                    --rrr.res_reservering_key,
                    --rrr.res_rsv_ruimte_volgnr,
                    --rra.res_status_bo_key,
                    rra.res_rsv_artikel_prijs,
                    kp.prs_kostenplaats_nr,
                    kp.prs_kostenplaats_omschrijving
               FROM res_v_aanwezigrsv_ruimte rrr,
                    res_v_aanwezigrsv_artikel rra,
                    res_artikel ra,
                    --prs_perslid p,
                    --prs_v_afdeling_boom ab,
                    --prs_bedrijf b
                    res_ruimte_opstelling rro,
                    (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
                         FROM res_v_aanwezigalg_ruimte
                     GROUP BY res_ruimte_key) rar,
                    alg_v_onrgoed_boom aob,
                    alg_district d,
                    prs_kostenplaats kp
              WHERE rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
                    AND rra.res_status_bo_key != 6                  -- Niet AV
                    AND rra.res_rsv_artikel_dirtlevel = 0        -- Niet dirty
                    AND rra.res_artikel_key = ra.res_artikel_key
                    --AND rrr.res_rsv_ruimte_contact_key = p.prs_perslid_key
                    --AND p.prs_afdeling_key = ab.prs_afdeling_key
                    --AND ab.prs_bedrijf_key = b.prs_bedrijf_key
                    AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)
                    AND rro.res_ruimte_key = rar.res_ruimte_key(+)
                    AND COALESCE (rrr.alg_ruimte_key, rar.alg_ruimte_key) = aob.alg_ruimte_key
                    AND aob.alg_district_key = d.alg_district_key
                    AND EXISTS     -- Geconfigureerd als te rapporteren klant!
                          (SELECT 1
                             FROM fac_v_aanwezigusrdata
                            WHERE fac_usrtab_key = 121        -- FinRapKlanten
                                  AND fac_usrdata_code = TO_CHAR (d.alg_district_key))
                    AND rrr.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)) x
            LEFT JOIN fac_tracking resafm
               ON resafm.fac_srtnotificatie_key = 80                 -- RESAFM
                  AND x.res_rsv_ruimte_key = resafm.fac_tracking_refkey
   GROUP BY x.alg_district_omschrijving,
            x.prs_kostenplaats_nr || '-' || x.prs_kostenplaats_omschrijving;

-- Actual regels en basis voor oa. te exporteren/bevriezen regels op de 10e van
-- de maand; voor de output geldt:
-- Actual regels en basis voor oa. te exporteren/bevriezen regels in nacht na
-- de 1e werkdag van de maand; voor de output geldt:
-- Dat deze de actual opdrachten toont (voor 1e ORDAFR).
-- Dat deze de actual reserveringen toont (voor 1e RESAFM).
-- Dat deze tot nacht na 1e werkdag van de maand alleen door Kien wijzigbaar
-- is.
/* Formatted on 24-2-2017 14:10:50 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW venr_v_actual_fact                 -- Tbv. FACT_EXPORT!
(
   prs_afdeling_key,
   maand,
   klant_key,
   klant,
   leverancier_key,
   leverancier,
   cnt_contract_key,
   contractnr,
   beschrijving,
   ref_key,
   ref_id,
   aantal,
   kosten_afgerond,
   kostenplaats
)
AS                              -- Vaste contractkosten over de ACTUAL termijn
   SELECT b2a.prs_afdeling_key,
          TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm'), -- Afgelopen maand deze maand factureren (achteraf)
          x.alg_district_key klant_key,
          x.alg_district_omschrijving klant,
          b2a.prs_bedrijf_key leverancier_key,
          b2a.prs_bedrijf_naam leverancier,
          x.cnt_contract_key,
          x.cnt_contract_nummer_intern, -- Uit afgelopen maand lopend contract, anders geen vaste kosten
          x.cnt_contract_omschrijving,
          TO_NUMBER (NULL) ref_key,
          TO_CHAR (NULL) ref_id,
          0 aantal,
          ROUND (
             DECODE (COALESCE (x.cnt_contract_termijnkosten, 0),
                     0, x.cnt_contract_kosten / 12,
                     x.cnt_contract_termijnkosten),
             2)
             kosten_afgerond,
          x.prs_kostenplaats_nr || '-' || x.prs_kostenplaats_omschrijving
     FROM    (SELECT d.alg_district_key, d.alg_district_omschrijving, -- Klant
                     c.cnt_contract_key,
                     c.cnt_contract_nummer_intern,
                     c.cnt_contract_omschrijving,
                     c.cnt_prs_bedrijf_key,                     -- Leverancier
                     c.cnt_contract_kosten,
                     c.cnt_contract_termijnkosten,
                     kp.prs_kostenplaats_nr,
                     kp.prs_kostenplaats_omschrijving
                FROM cnt_v_aanwezigcontract c,
                     (SELECT cp.cnt_contract_key, g.alg_locatie_key
                        FROM cnt_contract_plaats cp, alg_gebouw g
                       WHERE cp.cnt_alg_plaats_code = 'G'
                             AND cp.cnt_alg_plaats_key = g.alg_gebouw_key
                      UNION ALL
                      SELECT cp.cnt_contract_key,
                             cp.cnt_alg_plaats_key alg_locatie_key
                        FROM cnt_contract_plaats cp
                       WHERE cp.cnt_alg_plaats_code = 'L') cl,
                     alg_locatie l,
                     alg_district d,
                     prs_kostenplaats kp
               WHERE EXISTS                    -- Gemarkeerd als vast contract
                        (SELECT 1
                           FROM cnt_kenmerkcontract kc, cnt_kenmerk k
                          WHERE kc.cnt_kenmerkcontract_verwijder IS NULL
                                AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                                AND k.cnt_srtkenmerk_key = 81 -- Vast contract
                                AND kc.cnt_kenmerkcontract_waarde = '1' -- Aangevinkt
                                AND kc.cnt_contract_key = c.cnt_contract_key)
                     --AND c.cnt_contract_status = 0            -- NIET Gesloten
                     AND TRUNC (c.cnt_contract_looptijd_van) < TRUNC (SYSDATE, 'mm') - 1
                     AND c.cnt_contract_looptijd_tot >= TRUNC (SYSDATE, 'mm') - 1
                     AND NOT EXISTS           -- Nog geen entry in eigen tabel
                           (SELECT 1
                              FROM fac_usrdata
                             WHERE fac_usrtab_key = 141      -- VasteKostenMnd
                                   AND fac_usrdata_code = TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm') || '/' || c.cnt_contract_key)
                     AND c.cnt_contract_key = cl.cnt_contract_key
                     AND cl.alg_locatie_key = l.alg_locatie_key
                     AND l.alg_district_key = d.alg_district_key
                     AND EXISTS    -- Geconfigureerd als te rapporteren klant!
                           (SELECT 1
                              FROM fac_v_aanwezigusrdata
                             WHERE fac_usrtab_key = 121       -- FinRapKlanten
                                   AND fac_usrdata_code = TO_CHAR (d.alg_district_key))
                     AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)) x
          LEFT JOIN
             (  SELECT b.prs_bedrijf_key, b.prs_bedrijf_naam,
                       MIN (p.prs_afdeling_key) prs_afdeling_key,
                       COUNT ( * ) aantal
                  FROM prs_bedrijf b, prs_contactpersoon cp, prs_perslid p
                 WHERE b.prs_bedrijf_key = cp.prs_bedrijf_key(+)
                       AND cp.prs_perslid_key = p.prs_perslid_key(+)
              GROUP BY b.prs_bedrijf_key, b.prs_bedrijf_naam) b2a
          ON x.cnt_prs_bedrijf_key = b2a.prs_bedrijf_key
   UNION ALL -- Variabele kosten uit ACTUAL opdrachten waarvoor Kosten meerekenen=Ja
   SELECT b2a.prs_afdeling_key,
          TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm'), -- Voor 1e ORDAFR, deze maand factureren (achteraf)
          x.alg_district_key klant_key,
          x.alg_district_omschrijving klant,
          b2a.prs_bedrijf_key leverancier_key,
          COALESCE (b2a.prs_bedrijf_naam, pf.prs_perslid_naam_full) leverancier,
          x.cnt_contract_key,
          x.cnt_contract_nummer_intern,
          x.cnt_contract_omschrijving,
          x.mld_opdr_key ref_key,
          TO_CHAR (x.mld_melding_key) || '/' || TO_CHAR (x.mld_opdr_bedrijfopdr_volgnr) ref_id,
          1 aantal,
          COALESCE (x.mld_opdr_kosten, 0) kosten_afgerond,
          x.prs_kostenplaats_nr || '-' || x.prs_kostenplaats_omschrijving
     FROM (SELECT d.alg_district_key, d.alg_district_omschrijving,    -- Klant
                  o.mld_opdr_key,
                  o.mld_melding_key,
                  o.mld_opdr_bedrijfopdr_volgnr,
                  o.mld_statusopdr_key,
                  o.mld_uitvoerende_keys,                       -- Leverancier
                  o.mld_opdr_kosten,
                  c.cnt_contract_key,
                  c.cnt_contract_nummer_intern,
                  c.cnt_contract_omschrijving,
                  kp.prs_kostenplaats_nr,
                  kp.prs_kostenplaats_omschrijving
             FROM mld_opdr o,
                  mld_typeopdr ot,
                  mld_melding m,
                  --prs_perslid p,
                  --prs_v_afdeling_boom ab,
                  --prs_bedrijf b,
                  alg_locatie l,
                  alg_district d,
                  cnt_contract c,
                  prs_kostenplaats kp
            WHERE o.mld_statusopdr_key NOT IN (1, 2, 7)    -- Nog niet gereed!
                  AND o.mld_typeopdr_key = ot.mld_typeopdr_key
                  AND ot.mld_typeopdr_kosten = 1       -- Kosten meerekenen=Ja
                  AND NOT EXISTS               -- Niet gemarkeerd als dispuut!
                     (SELECT 1
                        FROM mld_v_aanwezigkenmerkopdr ko, mld_kenmerk k
                       WHERE ko.mld_opdr_key = o.mld_opdr_key
                             AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                             AND k.mld_srtkenmerk_key = -1          -- Dispuut
                             AND ko.mld_kenmerkopdr_waarde = '1') -- Aangevinkt
                  AND o.mld_melding_key = m.mld_melding_key
                  --AND m.prs_perslid_key = p.prs_perslid_key
                  --AND p.prs_afdeling_key = ab.prs_afdeling_key
                  --AND ab.prs_bedrijf_key = b.prs_bedrijf_key
                  AND m.mld_alg_locatie_key = l.alg_locatie_key
                  AND l.alg_district_key = d.alg_district_key
                  AND EXISTS       -- Geconfigureerd als te rapporteren klant!
                        (SELECT 1
                           FROM fac_v_aanwezigusrdata
                          WHERE fac_usrtab_key = 121          -- FinRapKlanten
                                AND fac_usrdata_code = TO_CHAR (d.alg_district_key))
                  AND o.cnt_contract_key = c.cnt_contract_key(+)
                  AND o.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)) x
          LEFT JOIN fac_tracking ordafr
             ON ordafr.fac_srtnotificatie_key = 68                   -- ORDAFR
                AND x.mld_opdr_key = ordafr.fac_tracking_refkey
          LEFT JOIN (  SELECT b.prs_bedrijf_key, b.prs_bedrijf_naam,
                              MIN (p.prs_afdeling_key) prs_afdeling_key,
                              COUNT ( * ) aantal
                         FROM prs_bedrijf b, prs_contactpersoon cp, prs_perslid p
                        WHERE b.prs_bedrijf_key = cp.prs_bedrijf_key(+)
                              AND cp.prs_perslid_key = p.prs_perslid_key(+)
                     GROUP BY b.prs_bedrijf_key, b.prs_bedrijf_naam) b2a
             ON x.mld_uitvoerende_keys = b2a.prs_bedrijf_key
          LEFT JOIN prs_v_perslid_fullnames_all pf
             ON x.mld_uitvoerende_keys = pf.prs_perslid_key
    WHERE ordafr.fac_tracking_datum < TRUNC (SYSDATE, 'mm')
   UNION ALL
     SELECT TO_NUMBER (NULL) prs_afdeling_key, -- TODO: prs_afdeling_key van AppŠl?
            TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm'), -- Voor 1e RESAFM, deze maand factureren (achteraf)
            x.alg_district_key klant_key,
            x.alg_district_omschrijving klant,
            12633 leverancier_key,
            'Appèl' leverancier,
            TO_NUMBER (NULL) cnt_contract_key,
            TO_CHAR (NULL) cnt_contract_nummer_intern,
            'RES/Banqueting' cnt_contract_omschrijving,
            x.res_rsv_ruimte_key ref_key,
            TO_CHAR (x.res_reservering_key) || '/' || TO_CHAR (x.res_rsv_ruimte_volgnr) ref_id,
            1 aantal,
            SUM (x.res_rsv_artikel_prijs) kosten_afgerond,
            x.prs_kostenplaats_nr || '-' || x.prs_kostenplaats_omschrijving
       FROM (SELECT d.alg_district_key, d.alg_district_omschrijving,  -- Klant
                    rrr.res_rsv_ruimte_key,
                    rrr.res_reservering_key,
                    rrr.res_rsv_ruimte_volgnr,
                    rra.res_status_bo_key,
                    rra.res_rsv_artikel_prijs,
                    kp.prs_kostenplaats_nr,
                    kp.prs_kostenplaats_omschrijving
               FROM res_v_aanwezigrsv_ruimte rrr,
                    res_v_aanwezigrsv_artikel rra,
                    res_artikel ra,
                    --prs_perslid p,
                    --prs_v_afdeling_boom ab,
                    --prs_bedrijf b
                    res_ruimte_opstelling rro,
                    (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
                         FROM res_v_aanwezigalg_ruimte
                     GROUP BY res_ruimte_key) rar,
                    alg_v_onrgoed_boom aob,
                    alg_district d,
                    prs_kostenplaats kp
              WHERE rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
                    AND rra.res_status_bo_key != 6                  -- Niet AV
                    AND rra.res_rsv_artikel_dirtlevel = 0        -- Niet dirty
                    AND rra.res_artikel_key = ra.res_artikel_key
                    --AND rrr.res_rsv_ruimte_contact_key = p.prs_perslid_key
                    --AND p.prs_afdeling_key = ab.prs_afdeling_key
                    --AND ab.prs_bedrijf_key = b.prs_bedrijf_key
                    AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)
                    AND rro.res_ruimte_key = rar.res_ruimte_key(+)
                    AND COALESCE (rrr.alg_ruimte_key, rar.alg_ruimte_key) = aob.alg_ruimte_key
                    AND aob.alg_district_key = d.alg_district_key
                    AND EXISTS     -- Geconfigureerd als te rapporteren klant!
                          (SELECT 1
                             FROM fac_v_aanwezigusrdata
                            WHERE fac_usrtab_key = 121     -- FinRapKlanten
                                  AND fac_usrdata_code = TO_CHAR (d.alg_district_key))
                    AND rrr.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)) x
            LEFT JOIN fac_tracking resafm
               ON resafm.fac_srtnotificatie_key = 80                 -- RESAFM
                  AND x.res_rsv_ruimte_key = resafm.fac_tracking_refkey
      WHERE resafm.fac_tracking_datum < TRUNC (SYSDATE, 'mm')
   GROUP BY x.alg_district_key,
            x.alg_district_omschrijving,
            x.res_rsv_ruimte_key,
            TO_CHAR (x.res_reservering_key) || '/' || TO_CHAR (x.res_rsv_ruimte_volgnr),
            x.prs_kostenplaats_nr || '-' || x.prs_kostenplaats_omschrijving;

-- Te exporteren/bevriezen totalen over voorgaande maand (opdrachten en reserveringen).
CREATE OR REPLACE VIEW venr_v_rap_actual_fact_tot
(
   fclt_3d_afdeling_key,                   -- Kunnen beperken per leverancier!
   maand,
   fclt_f_klant,
   fclt_f_leverancier,
   contractnr,
   beschrijving,
   aantal,
   kosten_afgerond,
   fclt_x_kostenplaats
)
AS
     SELECT prs_afdeling_key,
            maand,
            klant,
            leverancier,
            contractnr,
            beschrijving,
            SUM (aantal),
            SUM (kosten_afgerond),
            kostenplaats
       FROM venr_v_actual_fact
   GROUP BY prs_afdeling_key,
            maand,
            klant,
            leverancier,
            contractnr,
            beschrijving,
            kostenplaats;

-- Frozen regels en basis voor oa. de notificatie op de 11e van de maand; voor
-- de output geldt:
-- Frozen regels en basis voor oa. de notificatie in nacht na 1e werkdag van
-- de maand; voor de output geldt:
-- Dat deze de frozen opdrachten toont.
-- Dat deze de frozen reserveringen toont.
-- Nog niet in scope:
-- Dat de laatst bevroren maand per leverancier in nacht na 1e werkdag van de
-- maand wordt genotificeerd (via extra_key-principe) met daarin de kosten
-- gegroepeerd per klant/contract.
/* Formatted on 24-2-2017 15:00:00 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW venr_v_frozen_fact
(
   prs_afdeling_key,
   maand,
   klant_key,
   klant,
   --leverancier_key,
   extra_key,                                                -- Moet zo heten!
   leverancier,
   cnt_contract_key,
   contractnr,
   beschrijving,
   ref_key,
   ref_id,
   aantal,
   kosten_afgerond,
   kostenplaats
)
AS                            -- Vaste contractkosten over de FROZEN termijnen
   SELECT b2a.prs_afdeling_key,
          SUBSTR (x.fac_usrdata_code, 1, 7) maand,                  -- yyyy-mm
          x.alg_district_key klant_key,
          x.alg_district_omschrijving klant,
          b2a.prs_bedrijf_key leverancier_key,
          b2a.prs_bedrijf_naam leverancier,
          x.cnt_contract_key,
          x.cnt_contract_nummer_intern,
          x.cnt_contract_omschrijving,
          TO_NUMBER (NULL) ref_key,
          TO_CHAR (NULL) ref_id,
          0 aantal,
          COALESCE (x.fac_usrdata_prijs, 0) kosten_afgerond,
          x.prs_kostenplaats_nr || '-' || x.prs_kostenplaats_omschrijving
     FROM    (SELECT d.alg_district_key, d.alg_district_omschrijving, -- Klant
                     c.cnt_contract_key,
                     c.cnt_contract_nummer_intern,
                     c.cnt_contract_omschrijving,
                     ud.fac_usrdata_code,                    -- Maand/Contract
                     c.cnt_prs_bedrijf_key,                     -- Leverancier
                     ud.fac_usrdata_prijs,
                     kp.prs_kostenplaats_nr,
                     kp.prs_kostenplaats_omschrijving
                FROM fac_usrdata ud,
                     cnt_contract c,
                     --prs_bedrijf b,
                     alg_district d,
                     prs_kostenplaats kp
               WHERE ud.fac_usrtab_key = 141                 -- VasteKostenMnd
                     AND SUBSTR (ud.fac_usrdata_code, INSTR (ud.fac_usrdata_code, '/') + 1) = TO_CHAR (c.cnt_contract_key)
                     --AND SUBSTR (ud.fac_usrdata_omschr, 1, INSTR (ud.fac_usrdata_omschr, '/') - 1) = TO_CHAR (b.prs_bedrijf_key)
                     AND SUBSTR (ud.fac_usrdata_omschr, INSTR (ud.fac_usrdata_omschr, '/') + 1) = TO_CHAR (d.alg_district_key)
                     AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)) x
          LEFT JOIN
             (  SELECT b.prs_bedrijf_key, b.prs_bedrijf_naam,
                       MIN (p.prs_afdeling_key) prs_afdeling_key,
                       COUNT ( * ) aantal
                  FROM prs_bedrijf b, prs_contactpersoon cp, prs_perslid p
                 WHERE b.prs_bedrijf_key = cp.prs_bedrijf_key(+)
                       AND cp.prs_perslid_key = p.prs_perslid_key(+)
              GROUP BY b.prs_bedrijf_key, b.prs_bedrijf_naam) b2a
          ON x.cnt_prs_bedrijf_key = b2a.prs_bedrijf_key
   UNION ALL -- Variabele kosten uit FROZEN opdrachten (waarvoor Kosten meerekenen=Ja)
   SELECT b2a.prs_afdeling_key,
          x.mld_opdr_ordernr maand,                                 -- yyyy-mm
          x.alg_district_key klant_key,
          x.alg_district_omschrijving klant,
          b2a.prs_bedrijf_key leverancier_key,
          COALESCE (b2a.prs_bedrijf_naam, pf.prs_perslid_naam_full) leverancier,
          x.cnt_contract_key,
          x.cnt_contract_nummer_intern,
          x.cnt_contract_omschrijving,
          x.mld_opdr_key ref_key,
          TO_CHAR (x.mld_melding_key) || '/' || TO_CHAR (x.mld_opdr_bedrijfopdr_volgnr) ref_id,
          1 aantal,
          COALESCE (x.mld_opdr_kosten, 0) kosten_afgerond,
          x.prs_kostenplaats_nr || '-' || x.prs_kostenplaats_omschrijving
     FROM    (SELECT d.alg_district_key, d.alg_district_omschrijving, -- Klant
                     o.mld_opdr_key,
                     o.mld_melding_key, o.mld_opdr_bedrijfopdr_volgnr,
                     o.mld_opdr_ordernr,
                     o.mld_uitvoerende_keys,                    -- Leverancier
                     o.mld_opdr_kosten,
                     c.cnt_contract_key,
                     c.cnt_contract_nummer_intern,
                     c.cnt_contract_omschrijving,
                     kp.prs_kostenplaats_nr,
                     kp.prs_kostenplaats_omschrijving
                FROM mld_opdr o,
                     mld_melding m,
                     --prs_perslid p,
                     --prs_v_afdeling_boom ab,
                     --prs_bedrijf b,
                     alg_locatie l,
                     alg_district d,
                     cnt_contract c,
                     prs_kostenplaats kp
               WHERE o.mld_statusopdr_key = 7
                     AND o.mld_opdr_ordernr IS NOT NULL
                     AND o.mld_melding_key = m.mld_melding_key
                     --AND m.prs_perslid_key = p.prs_perslid_key
                     --AND p.prs_afdeling_key = ab.prs_afdeling_key
                     --AND ab.prs_bedrijf_key = b.prs_bedrijf_key
                     AND m.mld_alg_locatie_key = l.alg_locatie_key
                     AND l.alg_district_key = d.alg_district_key
                     AND o.cnt_contract_key = c.cnt_contract_key(+)
                     AND o.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)) x
          LEFT JOIN
             (  SELECT b.prs_bedrijf_key, b.prs_bedrijf_naam,
                       MIN (p.prs_afdeling_key) prs_afdeling_key,
                       COUNT ( * ) aantal
                  FROM prs_bedrijf b, prs_contactpersoon cp, prs_perslid p
                 WHERE b.prs_bedrijf_key = cp.prs_bedrijf_key(+)
                       AND cp.prs_perslid_key = p.prs_perslid_key(+)
              GROUP BY b.prs_bedrijf_key, b.prs_bedrijf_naam) b2a
          ON x.mld_uitvoerende_keys = b2a.prs_bedrijf_key
          LEFT JOIN
             prs_v_perslid_fullnames_all pf
          ON x.mld_uitvoerende_keys = pf.prs_perslid_key
   UNION ALL
     SELECT TO_NUMBER (NULL) prs_afdeling_key, -- TODO: prs_afdeling_key van AppŠl?
            x.res_rsv_ruimte_ordernr maand,                         -- yyyy-mm
            x.alg_district_key klant_key,
            x.alg_district_omschrijving klant,
            12633 leverancier_key,
            'Appèl' leverancier,
            TO_NUMBER (NULL) cnt_contract_key,
            TO_CHAR (NULL) cnt_contract_nummer_intern,
            'RES/Banqueting' cnt_contract_omschrijving,
            x.res_rsv_ruimte_key ref_key,
            TO_CHAR (x.res_reservering_key) || '/' || TO_CHAR (x.res_rsv_ruimte_volgnr) ref_id,
            1 aantal,
            SUM (x.res_rsv_artikel_prijs) kosten_afgerond,
            x.prs_kostenplaats_nr || '-' || x.prs_kostenplaats_omschrijving
       FROM (SELECT d.alg_district_key, d.alg_district_omschrijving,  -- Klant
                    rrr.res_rsv_ruimte_key,
                    rrr.res_reservering_key, rrr.res_rsv_ruimte_volgnr,
                    rrr.res_rsv_ruimte_ordernr,
                    rra.res_rsv_artikel_prijs,
                    kp.prs_kostenplaats_nr,
                    kp.prs_kostenplaats_omschrijving
               FROM res_rsv_ruimte rrr,
                    res_rsv_artikel rra,
                    res_artikel ra,
                    --prs_perslid p,
                    --prs_v_afdeling_boom ab,
                    --prs_bedrijf b
                    res_ruimte_opstelling rro,
                    (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
                         FROM res_v_aanwezigalg_ruimte
                     GROUP BY res_ruimte_key) rar,
                    alg_v_onrgoed_boom aob,
                    alg_district d,
                    prs_kostenplaats kp
              WHERE rrr.res_rsv_ruimte_ordernr IS NOT NULL
                    AND rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
                    AND rra.res_status_bo_key = 6                        -- AV
                    AND rra.res_artikel_key = ra.res_artikel_key
                    --AND rrr.res_rsv_ruimte_contact_key = p.prs_perslid_key
                    --AND p.prs_afdeling_key = ab.prs_afdeling_key
                    --AND ab.prs_bedrijf_key = b.prs_bedrijf_key
                    AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)
                    AND rro.res_ruimte_key = rar.res_ruimte_key(+)
                    AND COALESCE (rrr.alg_ruimte_key, rar.alg_ruimte_key) = aob.alg_ruimte_key
                    AND aob.alg_district_key = d.alg_district_key
                    AND rrr.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)) x
   GROUP BY x.res_rsv_ruimte_ordernr,
            x.alg_district_key,
            x.alg_district_omschrijving,
            x.res_rsv_ruimte_key,
            TO_CHAR (x.res_reservering_key) || '/' || TO_CHAR (x.res_rsv_ruimte_volgnr),
            x.prs_kostenplaats_nr || '-' || x.prs_kostenplaats_omschrijving;

-- Geexporteerde/bevroren totalen over voorgaande maanden (opdrachten en reserveringen).
CREATE OR REPLACE VIEW venr_v_rap_frozen_fact_tot
(
   fclt_3d_afdeling_key,                   -- Kunnen beperken per leverancier!
   fclt_f_maand,
   fclt_f_klant,
   fclt_f_leverancier,
   contractnr,
   beschrijving,
   aantal,
   kosten_afgerond,
   fclt_x_kostenplaats
)
AS
     SELECT prs_afdeling_key,
            maand,
            klant,
            leverancier,
            contractnr,
            beschrijving,
            SUM (aantal),
            SUM (kosten_afgerond),
            kostenplaats
       FROM venr_v_frozen_fact
   GROUP BY prs_afdeling_key,
            maand,
            klant,
            leverancier,
            contractnr,
            beschrijving,
            kostenplaats;

/* Formatted on 24-2-2017 16:48:43 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PROCEDURE venr_select_fact (p_applname   IN VARCHAR2,
                                              p_applrun    IN VARCHAR2)
AS
   -- Bevries vaste contractkosten in eigen tabel.
   CURSOR c1
   IS
        SELECT '[' || TO_CHAR (cnt_contract_key) || '|' || contractnr || '] ' aanduiding,
               maand, cnt_contract_key, leverancier_key, klant_key, kosten_afgerond
          FROM venr_v_actual_fact
         WHERE aantal = 0
      ORDER BY 1;

   -- Zet "kosten" opdrachten die voor de 1e zijn afgerond op AV.
   CURSOR c2
   IS
        SELECT '[' || TO_CHAR (ref_key) || '|' || ref_id || '] ' aanduiding,
               ref_key mld_opdr_key
          FROM venr_v_actual_fact
         WHERE COALESCE (beschrijving, 'X') NOT LIKE 'RES/%'
      ORDER BY 1;

   -- Zet "kosten" banqueting die voor de 1e zijn afgerond op AV.
   CURSOR c3
   IS
        SELECT '[' || TO_CHAR (ref_key) || '|' || ref_id || '] ' aanduiding,
               ref_key res_rsv_ruimte_key
          FROM venr_v_actual_fact
         WHERE beschrijving LIKE 'RES/%'
      ORDER BY 1;

   -- Zet "inclusief" opdrachten die voor de 1e zijn gesloten op AV.
   -- Afgerond/kosten meerekenen en geen dispuut
   -- Afgemeld/kosten niet meerekenen, geen offerteaanvraag en geen dispuut
   -- Afgerond/kosten niet meerekenen en geen dispuut (= geaccepteerde offerteaanvragen)
/*
   CURSOR c4
   IS
      SELECT o.mld_opdr_key
        FROM mld_opdr o, mld_typeopdr ot, mld_melding m, alg_locatie l, alg_district d
       WHERE     o.mld_statusopdr_key = 9                                -- KV
             AND o.mld_typeopdr_key = ot.mld_typeopdr_key
             AND ot.mld_typeopdr_kosten = 1            -- Kosten meerekenen=Ja
             AND NOT EXISTS                    -- Niet gemarkeerd als dispuut!
                   (SELECT 1
                      FROM mld_v_aanwezigkenmerkopdr ko, mld_kenmerk k
                     WHERE ko.mld_opdr_key = o.mld_opdr_key
                           AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                           AND k.mld_srtkenmerk_key = -1            -- Dispuut
                           AND ko.mld_kenmerkopdr_waarde = '1')  -- Aangevinkt
             AND o.mld_melding_key = m.mld_melding_key
             --AND m.prs_perslid_key = p.prs_perslid_key
             --AND p.prs_afdeling_key = ab.prs_afdeling_key
             --AND ab.prs_bedrijf_key = b.prs_bedrijf_key
             AND m.mld_alg_locatie_key = l.alg_locatie_key
             AND l.alg_district_key = d.alg_district_key
             AND EXISTS            -- Geconfigureerd als te rapporteren klant!
                   (SELECT 1
                      FROM fac_v_aanwezigusrdata
                     WHERE fac_usrtab_key = 121               -- FinRapKlanten
                           AND fac_usrdata_code = TO_CHAR (d.alg_district_key))
             AND fac.gettrackingdate ('ORDAFR', o.mld_opdr_key) < TRUNC (SYSDATE, 'mm')
      UNION ALL
      SELECT o.mld_opdr_key
        FROM mld_opdr o, mld_typeopdr ot, mld_melding m, alg_locatie l, alg_district d
       WHERE     o.mld_statusopdr_key = 6                                -- TV
             AND o.mld_typeopdr_key = ot.mld_typeopdr_key
             AND ot.mld_typeopdr_kosten = 0           -- Kosten meerekenen=Nee
             AND ot.mld_typeopdr_key != 168                 -- Offerteaanvraag
             AND NOT EXISTS                    -- Niet gemarkeerd als dispuut!
                   (SELECT 1
                      FROM mld_v_aanwezigkenmerkopdr ko, mld_kenmerk k
                     WHERE ko.mld_opdr_key = o.mld_opdr_key
                           AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                           AND k.mld_srtkenmerk_key = -1            -- Dispuut
                           AND ko.mld_kenmerkopdr_waarde = '1')  -- Aangevinkt
             AND o.mld_melding_key = m.mld_melding_key
             --AND m.prs_perslid_key = p.prs_perslid_key
             --AND p.prs_afdeling_key = ab.prs_afdeling_key
             --AND ab.prs_bedrijf_key = b.prs_bedrijf_key
             AND m.mld_alg_locatie_key = l.alg_locatie_key
             AND l.alg_district_key = d.alg_district_key
             AND EXISTS            -- Geconfigureerd als te rapporteren klant!
                   (SELECT 1
                      FROM fac_v_aanwezigusrdata
                     WHERE fac_usrtab_key = 121               -- FinRapKlanten
                           AND fac_usrdata_code = TO_CHAR (d.alg_district_key))
             AND fac.gettrackingdate ('ORDAFM', o.mld_opdr_key) < TRUNC (SYSDATE, 'mm')
      UNION ALL
      SELECT o.mld_opdr_key
        FROM mld_opdr o, mld_typeopdr ot, mld_melding m, alg_locatie l, alg_district d
       WHERE     o.mld_statusopdr_key = 9 -- KV (ooit met kosten en Offerteaanvragen)
             AND o.mld_typeopdr_key = ot.mld_typeopdr_key
             AND ot.mld_typeopdr_kosten = 0           -- Kosten meerekenen=Nee
             AND NOT EXISTS                    -- Niet gemarkeerd als dispuut!
                   (SELECT 1
                      FROM mld_v_aanwezigkenmerkopdr ko, mld_kenmerk k
                     WHERE ko.mld_opdr_key = o.mld_opdr_key
                           AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                           AND k.mld_srtkenmerk_key = -1            -- Dispuut
                           AND ko.mld_kenmerkopdr_waarde = '1')  -- Aangevinkt
             AND o.mld_melding_key = m.mld_melding_key
             --AND m.prs_perslid_key = p.prs_perslid_key
             --AND p.prs_afdeling_key = ab.prs_afdeling_key
             --AND ab.prs_bedrijf_key = b.prs_bedrijf_key
             AND m.mld_alg_locatie_key = l.alg_locatie_key
             AND l.alg_district_key = d.alg_district_key
             AND EXISTS            -- Geconfigureerd als te rapporteren klant!
                   (SELECT 1
                      FROM fac_v_aanwezigusrdata
                     WHERE fac_usrtab_key = 121               -- FinRapKlanten
                           AND fac_usrdata_code = TO_CHAR (d.alg_district_key))
             AND (fac.gettrackingdate ('ORDAFR', o.mld_opdr_key) < TRUNC (SYSDATE, 'mm')
                  OR fac.gettrackingdate ('ORDOOK', o.mld_opdr_key) < TRUNC (SYSDATE, 'mm'))
      ORDER BY 1;
*/
   CURSOR c4
   IS
      SELECT o.mld_opdr_key
        FROM mld_opdr o, mld_typeopdr ot, mld_melding m, alg_locatie l, alg_district d
       WHERE     o.mld_statusopdr_key = 6                                -- TV
             AND o.mld_typeopdr_key = ot.mld_typeopdr_key
             AND ot.mld_typeopdr_kosten = 0           -- Kosten meerekenen=Nee
             AND ot.mld_typeopdr_key != 168                 -- Offerteaanvraag
             AND NOT EXISTS                    -- Niet gemarkeerd als dispuut!
                   (SELECT 1
                      FROM mld_v_aanwezigkenmerkopdr ko, mld_kenmerk k
                     WHERE ko.mld_opdr_key = o.mld_opdr_key
                           AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                           AND k.mld_srtkenmerk_key = -1            -- Dispuut
                           AND ko.mld_kenmerkopdr_waarde = '1')  -- Aangevinkt
             AND o.mld_melding_key = m.mld_melding_key
             --AND m.prs_perslid_key = p.prs_perslid_key
             --AND p.prs_afdeling_key = ab.prs_afdeling_key
             --AND ab.prs_bedrijf_key = b.prs_bedrijf_key
             AND m.mld_alg_locatie_key = l.alg_locatie_key
             AND l.alg_district_key = d.alg_district_key
             AND EXISTS            -- Geconfigureerd als te rapporteren klant!
                   (SELECT 1
                      FROM fac_v_aanwezigusrdata
                     WHERE fac_usrtab_key = 121               -- FinRapKlanten
                           AND fac_usrdata_code = TO_CHAR (d.alg_district_key))
             AND fac.gettrackingdate ('ORDAFM', o.mld_opdr_key) < TRUNC (SYSDATE, 'mm')
      UNION ALL
      SELECT o.mld_opdr_key
        FROM mld_opdr o, mld_typeopdr ot, mld_melding m, alg_locatie l, alg_district d
       WHERE     o.mld_statusopdr_key = 9 -- KV (ooit met kosten en Offerteaanvragen)
             AND o.mld_typeopdr_key = ot.mld_typeopdr_key
             AND ot.mld_typeopdr_kosten = 0           -- Kosten meerekenen=Nee
             AND NOT EXISTS                    -- Niet gemarkeerd als dispuut!
                   (SELECT 1
                      FROM mld_v_aanwezigkenmerkopdr ko, mld_kenmerk k
                     WHERE ko.mld_opdr_key = o.mld_opdr_key
                           AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                           AND k.mld_srtkenmerk_key = -1            -- Dispuut
                           AND ko.mld_kenmerkopdr_waarde = '1')  -- Aangevinkt
             AND o.mld_melding_key = m.mld_melding_key
             --AND m.prs_perslid_key = p.prs_perslid_key
             --AND p.prs_afdeling_key = ab.prs_afdeling_key
             --AND ab.prs_bedrijf_key = b.prs_bedrijf_key
             AND m.mld_alg_locatie_key = l.alg_locatie_key
             AND l.alg_district_key = d.alg_district_key
             AND EXISTS            -- Geconfigureerd als te rapporteren klant!
                   (SELECT 1
                      FROM fac_v_aanwezigusrdata
                     WHERE fac_usrtab_key = 121               -- FinRapKlanten
                           AND fac_usrdata_code = TO_CHAR (d.alg_district_key))
             AND (fac.gettrackingdate ('ORDAFR', o.mld_opdr_key) < TRUNC (SYSDATE, 'mm')
                  OR fac.gettrackingdate ('ORDOOK', o.mld_opdr_key) < TRUNC (SYSDATE, 'mm'))
      ORDER BY 1;

   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_holiday        NUMBER;
   v_count          NUMBER (10);
BEGIN
   -- In nacht na 1e werkdag van de maand (via scheduled task):
   -- 1. Bevries vaste contractkosten in eigen tabel.
   -- 2. Zet "kosten" opdrachten die voor de 1e zijn afgerond op AV.
   -- 3. Zet "kosten" banqueting die voor de 1e zijn afgemeld op AV.
   -- 4. Zet "inclusief" opdrachten die voor de 1e zijn gesloten op AV. => TODO???
   -- x. Doe niets met afgewezen/geannuleerde opdrachten?
   SELECT COUNT ( * )
     INTO v_holiday
     FROM mld_vrije_dagen
    WHERE TRUNC (mld_vrije_dagen_datum) = TRUNC (SYSDATE - 1);

   -- LET OP: FACT-export draait dagelijks na middernacht (begin van dag) en
   -- de "freeze" wordt maandelijks alleen in nacht na 1e werkdag van de maand
   -- uitgevoerd.
   -- IF nacht na 1e 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
      AND TO_CHAR (SYSDATE - 1, 'd') BETWEEN '2' AND '6'
      AND v_holiday = 0
   THEN
      v_count := 0;

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

            INSERT INTO fac_usrdata (fac_usrtab_key,
                                     fac_usrdata_code,
                                     fac_usrdata_omschr,
                                     fac_usrdata_aanmaak,
                                     fac_usrdata_vervaldatum,
                                     fac_usrdata_prijs)
                VALUES (141,                                 -- VasteKostenMnd
                        rec.maand || '/' || TO_CHAR (rec.cnt_contract_key),
                        TO_CHAR (rec.leverancier_key) || '/' || rec.klant_key,
                        SYSDATE,
                        NULL,
                        rec.kosten_afgerond);

            v_count := v_count + 1;

            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, 'Vaste contractkosten');
               COMMIT;
         END;
      END LOOP;

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

      v_count := 0;

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

            UPDATE mld_opdr
               SET mld_opdr_ordernr = TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm')
             WHERE mld_opdr_key = rec.mld_opdr_key;

            v_errormsg := 'Fout verwerken kosten-mld_opdr.';

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

            v_count := v_count + 1;

            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, 'Kosten opdrachten');
               COMMIT;
         END;
      END LOOP;

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

      v_count := 0;

      FOR rec IN c3
      LOOP
         BEGIN
            v_errormsg := 'Fout bijwerken ordernummer (kosten banqueting).';

            UPDATE res_rsv_ruimte
               SET res_rsv_ruimte_ordernr = TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm')
             WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

            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_dirtlevel = 0
                   AND res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

            v_errormsg := 'Fout tracken res_rsv_ruimte';

            fac.trackaction ('RESVER',
                             rec.res_rsv_ruimte_key,
                             NULL,
                             NULL,
                             'Banqueting verwerkt');

            v_count := v_count + 1;

            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, 'Kosten banqueting');
               COMMIT;
         END;
      END LOOP;

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

      v_count := 0;

      FOR rec IN c4
      LOOP
         v_errormsg := 'Fout verwerken inclusief-mld_opdr.';

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

         v_count := v_count + 1;

         COMMIT;
      END LOOP;

      fac.writelog (p_applname, 'S', '#Inclusief opdrachten bevroren: ' || TO_CHAR (v_count), '');
      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', v_errormsg, 'Proces FACT_EXPORT afgebroken!');
      COMMIT;
END;
/

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