-- $Id$
--
-- Script containing customer specific sql statements for the FACILITOR database

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

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 PROCEDURE wzuv_import_perslid (p_import_key IN NUMBER)
AS
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   v_errormsg         VARCHAR2 (400);
   v_errorhint        VARCHAR2 (400);
   v_aantal_in_FCLT   NUMBER;
BEGIN
   v_errorhint := 'Generieke update';
   -- de sequence array staat beschreven in PRS_PAC.SRC bij de prs.import_perslid proc
   prs.import_perslid (
      p_import_key,
         '0;0;0;0;0;0;6;12;11;8;'
      || '0;10;9;13;3;0;0;2;0;1;'
      || '7;0;0;0;0;0;0;0;0;0;'
      || '4;5;0;0;0;0;0;0;0;0;'
      || '0;0;0;0;0;0',
      '"Mdw.";"Email werk";"Geslacht";"Werklocatie";"Org. eenheid";"Kostpl.";"Functie";"Roepnaam";"Voorvoegsel partner";"Geb.naam partner";"Voorv. geb.naam";"Geboortenaam";"Naamgebruik code"%');

   COMMIT;

   -- De os_login kan worden afgeleid vanuit het email adres
   UPDATE FAC_IMP_PERSLID
      SET prs_perslid_oslogin =
             (TRIM(SUBSTR (prs_perslid_email,
                           1,
                           INSTR (prs_perslid_email, '@', 1) - 1)));
   
          
   --- overbodige tekens uit het perslidnummer vewijderen
   UPDATE FAC_IMP_PERSLID
      SET prs_perslid_nr = TRIM (prs_perslid_nr);

   --- de tab uit het perslidnummer verwijderen
   UPDATE FAC_IMP_PERSLID
      SET prs_perslid_nr = REPLACE (prs_perslid_nr, CHR (9));

  
   --- De afdelingnaam kan worden herleid worden obv de afdelingomschrijving
   UPDATE FAC_IMP_PERSLID I
      SET PRS_AFDELING_NAAM =
             (SELECT A.PRS_AFDELING_NAAM
                FROM PRS_AFDELING A
               WHERE A.PRS_AFDELING_OMSCHRIJVING = I.PRS_KENMERK6
                    AND A.PRS_AFDELING_VERWIJDER IS NULL
                     AND A.PRS_KOSTENPLAATS_KEY IS NOT NULL);



   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'Error ' || oracle_err_num || '/' || oracle_err_mes;
      fac.imp_writelog (p_import_key,
                        'E',
                        v_errormsg,
                        v_errorhint);
END wzuv_import_perslid;
/

CREATE OR REPLACE PROCEDURE wzuv_update_perslid (p_import_key IN NUMBER)
IS
   -- Alle medewerkers (bedrijf is WZU, key 41) verwijderen die niet meer in import bestand voorkomen.
   -- Match bij WZUV is personeelnummer, hieronder de query om alle personen te verwijderen die:
   -- a) niet meer in het importbestand staan, wel in Facilitor, en
   -- b) waarvan de persoon in Facilitor een gevulde personeelsnummer heeft (leeg personeelsnummer van af blijven, dit handmatig ingevoerde persleden)
   -- c) waarvan de persoon in Facilitor niet begint met een _ in de loginnaam (ook van af blijven)

   CURSOR c_del
   IS
        SELECT p.prs_perslid_key, p.prs_perslid_nr, pf.prs_perslid_naam_full
          FROM fac_imp_perslid i,
               prs_perslid p,
               prs_v_perslid_fullnames_all pf,
               prs_v_afdeling a
         WHERE     UPPER (p.prs_perslid_nr) = UPPER (i.prs_perslid_nr(+))
               AND p.prs_perslid_verwijder IS NULL
               AND SUBSTR (p.prs_perslid_oslogin, 1, 1) <> '_'
               AND p.prs_perslid_nr IS NOT NULL
               AND pf.prs_perslid_key = p.prs_perslid_key
               AND i.prs_perslid_nr IS NULL
               AND p.prs_afdeling_key = a.prs_afdeling_key
               AND a.prs_bedrijf_key = 41
      ORDER BY 2;

   v_count   NUMBER;
BEGIN
   -- generic update
   -- 'LOGIN' betekent dat op basis van Login wordt gematched.
   -- 'NR' betekent dat op basis van Personeelsnummer wordt gematched.
   -- 'A' betekent altijd alle (andere/overige) werkplekken verwijderen
   prs.update_perslid (p_import_key, 'NR', NULL);

 
    -- Verwijder personen die niet meer in de import voorkomen.
   FOR rec IN c_del
   LOOP
      BEGIN
         prs.delete_perslid (p_import_key, rec.prs_perslid_key);
      END;
   END LOOP;
   
-- we zetten de werklocatie goed op basis van de locatie in de importtabel
END wzuv_update_perslid;
/

CREATE OR REPLACE PROCEDURE wzuv_import_client (p_import_key IN NUMBER)
AS
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   v_errormsg         VARCHAR2 (400);
   v_errorhint        VARCHAR2 (400);
   v_aantal_in_FCLT   NUMBER;
BEGIN
   v_errorhint := 'Generieke update';

   UPDATE FAC_IMP_FILE
      SET fac_imp_file_line = REPLACE (fac_imp_file_line, ',', ';')
    WHERE fac_import_key = p_import_key;

   UPDATE FAC_IMP_FILE
      SET fac_imp_file_line = REPLACE (fac_imp_file_line, '"', '')
    WHERE fac_import_key = p_import_key;

   -- de sequence array staat beschreven in PRS_PAC.SRC bij de prs.import_perslid proc
   prs.import_perslid (
      p_import_key,
         '0;0;0;0;0;0;1;4;3;0;'
      || '2;6;5;8;7;0;0;0;0;1;'
      || '1;0;0;0;0;0;9;10;0;0;'
      || '0;0;0;0;0;0;0;0;0;0;'
      || '0;0;0;0;0;0',
      -- 'identificatie;voornaam;initialen;tussenvoegsel;achternaam eigen;tussenvoegsel partner;achternaam partner;geslacht;naamsamenstelling;geboortedatum;straat;huisnummer;huisnummertoevoeging;postcode;plaats;BSN;locatie naam;locatie id%');
      'identificatie;initialen;tussenvoegsel;achternaam eigen;tussenvoegsel partner;achternaam partner;geslacht;naamsamenstelling;locatie naam;locatie id%');

   --- De afdeling is altijd 'CLIENT'
   UPDATE FAC_IMP_PERSLID I
      SET PRS_AFDELING_NAAM = 'CLIENT';

   --- De functie is altijd 'Cliënt'
   UPDATE FAC_IMP_PERSLID I
      SET PRS_SRTPERSLID_OMSCHRIJVING = 'Cliënt';

   --- Om te voorkomen dat cliëntnummers identiek zijn aan personeelsnummers vullen we deze aan
   UPDATE FAC_IMP_PERSLID I
      SET PRS_PERSLID_NR = 'Nedap-' || prs_perslid_nr;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'Error ' || oracle_err_num || '/' || oracle_err_mes;
      fac.imp_writelog (p_import_key,
                        'E',
                        v_errormsg,
                        v_errorhint);
END wzuv_import_client;
/

CREATE OR REPLACE PROCEDURE wzuv_update_client (p_import_key IN NUMBER)
IS
   -- Alle cliënten (bedrijf is Cliënt, key 8393) verwijderen die niet meer in import bestand voorkomen.
   -- Match bij WZUV is personeelnummer, hieronder de query om alle personen te verwijderen die:
   -- a) niet meer in het importbestand staan, wel in Facilitor, en
   -- b) waarvan de persoon in Facilitor niet begint met een _ in de loginnaam (ook van af blijven)

   CURSOR c_del
   IS
        SELECT p.prs_perslid_key, p.prs_perslid_nr, pf.prs_perslid_naam_full
          FROM fac_imp_perslid i,
               prs_perslid p,
               prs_v_perslid_fullnames_all pf,
               prs_v_afdeling a
         WHERE     UPPER (p.prs_perslid_nr) = UPPER (i.prs_perslid_nr(+))
               AND p.prs_perslid_verwijder IS NULL
               AND SUBSTR (p.prs_perslid_oslogin, 1, 1) <> '_'
               AND pf.prs_perslid_key = p.prs_perslid_key
               AND i.prs_perslid_nr IS NULL
               AND p.prs_afdeling_key = a.prs_afdeling_key
               AND a.prs_bedrijf_key = 8393
      ORDER BY 2;

   v_count   NUMBER;
BEGIN
   -- generic update
   -- 'LOGIN' betekent dat op basis van Login wordt gematched.
   -- 'NR' betekent dat op basis van Personeelsnummer wordt gematched.
   -- 'A' betekent altijd alle (andere/overige) werkplekken verwijderen
   prs.update_perslid (p_import_key, 'NR', NULL);

   -- Verwijder personen die niet meer in de import voorkomen.
   FOR rec IN c_del
   LOOP
      BEGIN
         prs.delete_perslid (p_import_key, rec.prs_perslid_key);
      END;
   END LOOP;
END wzuv_update_client;
/

CREATE OR REPLACE FORCE VIEW WZUV_V_INS_QRC_RUIMTE
(
   FCLT_3D_LOCATIE_KEY,
   FCLT_F_LOCATIE,
   FCLT_F_GEBOUW,
   PLAATS,
   SOORTRUIMTE,
   INS_ALG_RUIMTE_TYPE,
   ALG_RUIMTE_OMSCHRIJVING,
   ALG_DISTRICT_KEY,
   ALG_RUIMTE_NR,
   ALG_RUIMTE_KEY,
   HIDE_F_BOOKMARK_ID
)
AS
   SELECT l.alg_locatie_key,
          l.alg_locatie_omschrijving,
          x.alg_gebouw_naam,
          SUBSTR (x.alg_plaatsaanduiding, 7) plaats,
          x.alg_ruimte_omschrijving soortruimte,
          sr.alg_srtruimte_omschrijving,
          r.alg_ruimte_omschrijving,
          l.alg_district_key,
          x.alg_plaatsaanduiding,
          r.alg_ruimte_key,
          b.fac_bookmark_id
     FROM ALG_V_ALLONRGOED_GEGEVENS x,
          alg_locatie l,
          alg_district di,
          fac_bookmark b,
          alg_ruimte r,
          alg_srtruimte sr
    WHERE     b.fac_bookmark_naam = 'QRC naar ruimte'
          AND X.ALG_RUIMTE_KEY = R.ALG_RUIMTE_KEY
          AND R.ALG_SRTRUIMTE_KEY = SR.ALG_SRTRUIMTE_KEY
          AND x.alg_locatie_key = L.ALG_LOCATIE_KEY
          AND l.alg_district_key = di.alg_district_key;

--8441 Huismeester
--1842 Huismeester/Technische dienst
--1786 Medewerker Facilitaire dienst
--1845 Assistent Technische dienst


CREATE OR REPLACE VIEW WZUV_V_HUISMEESTERS
(
   prs_perslid_key,
   naam,
   verwijder
)
AS
   SELECT prs_perslid_key,
             prs_perslid_naam
          || ', '
          || prs_perslid_tussenvoegsel
          || ' ('
          || prs_perslid_voornaam
          || ')'
             AS naam,
          prs_perslid_verwijder
     FROM prs_perslid
    WHERE prs_srtperslid_key IN (8441, 1842, 1786, 1845);

CREATE OR REPLACE VIEW WZUV_V_GEBOUW_KPL
(
   kpl_key,
   omschrijving
)
AS
   SELECT prs_kostenplaats_key,
          prs_kostenplaats_nr || ' ' || prs_kostenplaats_omschrijving
     FROM PRS_V_AANWEZIGKOSTENPLAATS
    WHERE prs_kostenplaats_module = 'ALG';

COMMIT;

-- alle ruimtereserveringen en catering met status 5 kan gefactureerd worden
-- en cateraar heeft aangegeven dat het geleverd is

CREATE OR REPLACE VIEW WZUV_V_RAP_RES
(
   PERSNR,
   RESERVERING,
   ARTIKELCODE,
   AANTAL,
   BEDRAG,
   FACTUURPERIODE,
   SOORT,
   OMSCHRIJVING,
   INT_EXT,
   KOSTENPLAATS,
   RES_RSV_RUIMTE_KEY,
   MAAND
)
AS
   SELECT CASE
             WHEN UPPER (p.prs_perslid_nr) LIKE 'NEDAP%'
             THEN
                SUBSTR (p.prs_perslid_nr, 7)
             ELSE
                p.prs_perslid_nr
          END
             AS persnr,
          rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr,
          TO_CHAR (ar.alg_ruimte_key),
          COALESCE ( (rrr.res_rsv_ruimte_tot - rrr.res_rsv_ruimte_van) * 24,
                    0)
             duur_ruimte,
          rrr.res_rsv_ruimte_prijs,
          TO_CHAR (rrr.res_rsv_ruimte_van, 'mm-yyyy') factuurperiode,
          'Ruimte',
             TO_CHAR (rrr.res_rsv_ruimte_van, 'month yyyy')
          || ' - Reserveringsnummer: '
          || rrr.res_reservering_key
          || '/'
          || rrr.res_rsv_ruimte_volgnr
          || ' - '
          || rr.res_ruimte_nr
             aanduiding,
          DECODE (prs_afdeling_key, 422, 'Cliënt', 'Intern') soort,
          kpl_ruimte.prs_kostenplaats_nr,
          rrr.res_rsv_ruimte_key,
          TO_CHAR (rrr.res_rsv_ruimte_van, 'mm')
     FROM res_rsv_ruimte rrr,
          prs_perslid p,
          prs_kostenplaats kp,
          res_v_rsv_ruimte_2_alg_ruimte ar,
          alg_v_allonroerendgoed aog,
          res_ruimte rr,
          (SELECT kpr.*, kpl.prs_kostenplaats_nr
             FROM alg_onrgoedkenmerk kpr, prs_kostenplaats kpl
            WHERE kpr.alg_kenmerk_key = 1061
                  AND kpr.alg_onrgoedkenmerk_waarde =
                        kpl.prs_kostenplaats_key) kpl_ruimte
    WHERE     rrr.res_status_bo_key = 5
          AND rrr.res_rsv_ruimte_dirtlevel = 0
          AND rrr.res_rsv_ruimte_verwijder IS NULL
          AND res_rsv_ruimte_host_key = p.prs_perslid_key
          AND rrr.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
          AND ar.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
          AND ar.res_ruimte_key = rr.res_ruimte_key
          AND ar.alg_ruimte_key = aog.alg_ruimte_key
          AND kpl_ruimte.alg_onrgoed_key(+) = aog.alg_gebouw_key
   UNION ALL
   SELECT CASE
             WHEN UPPER (p.prs_perslid_nr) LIKE 'NEDAP%'
             THEN
                SUBSTR (p.prs_perslid_nr, 7)
             ELSE
                p.prs_perslid_nr
          END
             AS persnr,
          rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr,
          a.res_artikel_nr,
          ra.res_rsv_artikel_aantal,
          ra.res_rsv_artikel_prijs,
          TO_CHAR (rrr.res_rsv_ruimte_van, 'mm-yyyy') factuurperiode,
          'Catering',
             TO_CHAR (rrr.res_rsv_ruimte_van, 'month yyyy')
          || ' - '
          || TO_CHAR (rrr.res_reservering_key)
          || '/'
          || TO_CHAR (rrr.res_rsv_ruimte_volgnr)
          || ' - '
          || TO_CHAR (a.res_artikel_omschrijving)
             aanduiding,
          DECODE (p.prs_afdeling_key, 422, 'Cliënt', 'Intern') soort,
          kpl_cat.prs_kostenplaats_nr,
          rrr.res_rsv_ruimte_key,
          TO_CHAR (rrr.res_rsv_ruimte_van, 'mm')
     FROM res_rsv_artikel ra,
          res_rsv_ruimte rrr,
          res_artikel a,
          prs_perslid p,
          prs_kostenplaats kp,
          res_v_rsv_ruimte_2_alg_ruimte ar,
          alg_v_allonroerendgoed aog,
          (SELECT kpr.*, kpl.prs_kostenplaats_nr
             FROM alg_onrgoedkenmerk kpr, prs_kostenplaats kpl
            WHERE kpr.alg_kenmerk_key = 1060
                  AND kpr.alg_onrgoedkenmerk_waarde =
                        kpl.prs_kostenplaats_key) kpl_cat
    WHERE     ra.res_status_bo_key = 5
          AND rrr.res_rsv_ruimte_flag = 2
          AND ra.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
          AND ra.res_artikel_key = a.res_artikel_key
          AND ra.res_rsv_artikel_dirtlevel = 0
          AND ra.res_rsv_artikel_verwijder IS NULL
          AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
          AND ar.res_rsv_ruimte_key(+) = rrr.res_rsv_ruimte_key
          AND rrr.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
          AND (aog.alg_ruimte_key = rrr.alg_ruimte_key
               OR aog.alg_ruimte_key = ar.alg_ruimte_key)
          AND kpl_cat.alg_onrgoed_key(+) = aog.alg_gebouw_key;

CREATE OR REPLACE VIEW WZUV_V_RUIMTES
AS
   SELECT alg_onroerendgoed_keys,
             alg_gebouw_code
          || ' - '
          || alg_verdieping_omschrijving
          || ' - '
          || alg_ruimte_nr
          || ' - '
          || alg_ruimte_omschrijving
             AS RUIMTE
     FROM alg_v_allonrgoed_gegevens
    WHERE alg_ruimte_key IS NOT NULL;

CREATE OR REPLACE VIEW WZUV_V_APPARTEMENTEN
AS
   SELECT r.alg_ruimte_key,
             og.alg_gebouw_code
          || '-'
          || og.alg_verdieping_code
          || '-'
          || og.alg_ruimte_omschrijving
             AS APPARTEMENT
     FROM alg_v_allonrgoed_gegevens og, alg_ruimte r
    WHERE     og.alg_type = 'R'
          AND r.alg_ruimte_key = og.alg_ruimte_key
          AND r.alg_srtruimte_key = 17;


CREATE OR REPLACE PROCEDURE wzuv_select_reservering (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2)
AS
   -- status is geregistreerd (2)
   -- de reservering ligt in het verleden
   -- dan kan de ruimte prijs berekend worden
   CURSOR cres
   IS
      SELECT res_rsv_ruimte_key,
             res_reservering_key || '/' || res_rsv_ruimte_volgnr aanduiding
        FROM res_rsv_ruimte rrr
       WHERE     rrr.res_status_bo_key = 2
             AND rrr.res_rsv_ruimte_dirtlevel = 0
             AND rrr.res_rsv_ruimte_verwijder IS NULL
             AND fac.count_work_days (res_rsv_ruimte_tot, SYSDATE) > 0;

   -- catering is geleverd (flag = 2)
   -- dan mag de catering berekend worden
   -- voor de zekerheid controleren we ook of de reservering in het verleden ligt
   CURSOR cart
   IS
      SELECT    TO_CHAR (rrr.res_reservering_key)
             || '/'
             || TO_CHAR (rrr.res_rsv_ruimte_volgnr)
             || ' - '
             || TO_CHAR (a.res_artikel_omschrijving)
                aanduiding,
             ra.res_rsv_ruimte_key,
             ra.res_rsv_artikel_key,
             ra.res_artikel_key,
             a.res_artikel_omschrijving
        FROM res_rsv_artikel ra, res_rsv_ruimte rrr, res_artikel a
       WHERE     ra.res_status_bo_key = 2
             AND ra.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
             AND ra.res_artikel_key = a.res_artikel_key
             AND ra.res_rsv_artikel_dirtlevel = 0
             AND ra.res_rsv_artikel_verwijder IS NULL
             AND fac.count_work_days (res_rsv_artikel_levering, SYSDATE) > 0
             AND rrr.res_rsv_ruimte_flag = 2;

   v_prijs          NUMBER (9, 2);
   v_errorhint      VARCHAR2 (1000);
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
BEGIN
   FOR rc IN cres
   LOOP
      BEGIN
         v_errorhint := 'Fout bij bepalen res_rsv_ruimte_prijs.';

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

         v_errorhint := 'Fout bij bijwerken res_rsv_ruimte_prijs.';

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

         fac.trackaction ('RESAFM',
                          rc.res_rsv_ruimte_key,
                          NULL,
                          NULL,
                          NULL);
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=
                  ' ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.writelog (p_applname,
                          'W',
                          rc.aanduiding || v_errormsg,
                          v_errorhint);
            COMMIT;
      END;
   END LOOP;

   FOR rc IN cart
   LOOP
      BEGIN
         v_errorhint := 'Fout bij bepalen res_rsv_artikel_prijs.';

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

         v_errorhint := 'Fout bij bijwerken res_rsv_artikel_prijs.';

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

         fac.trackaction (
            'RESAFM',
            rc.res_rsv_ruimte_key,
            NULL,
            NULL,
            'Catering ' || rc.res_artikel_omschrijving || ' afgemeld');
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=
                  ' ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.writelog (p_applname,
                          'W',
                          rc.aanduiding || v_errormsg,
                          v_errorhint);
            COMMIT;
      END;
   END LOOP;

   COMMIT;
END;
/

CREATE OR REPLACE PROCEDURE wzuv_export_reservering (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2,
   p_filedir    IN VARCHAR2,
   p_filename   IN VARCHAR2)
AS
   -- status is afgemeld
   -- de reservering ligt in het verleden
   -- dan kan de ruimte prijs berekend worden
   CURSOR cres
   IS
      SELECT res_rsv_ruimte_key,
             res_reservering_key || '/' || res_rsv_ruimte_volgnr aanduiding
        FROM res_rsv_ruimte rrr
       WHERE     rrr.res_status_bo_key = 5
             AND rrr.res_rsv_ruimte_dirtlevel = 0
             AND rrr.res_rsv_ruimte_verwijder IS NULL
             AND fac.count_work_days (res_rsv_ruimte_tot, SYSDATE) > 0;

   -- catering is geleverd (flag = 2)
   -- dan mag de catering berekend worden
   -- voor de zekerheid controleren we ook of de reservering in het verleden ligt
   -- status is afgemeld
   CURSOR cart
   IS
      SELECT    TO_CHAR (rrr.res_reservering_key)
             || '/'
             || TO_CHAR (rrr.res_rsv_ruimte_volgnr)
             || ' - '
             || TO_CHAR (a.res_artikel_omschrijving)
                aanduiding,
             ra.res_rsv_ruimte_key,
             ra.res_rsv_artikel_key,
             ra.res_artikel_key,
             a.res_artikel_omschrijving
        FROM res_rsv_artikel ra, res_rsv_ruimte rrr, res_artikel a
       WHERE     ra.res_status_bo_key = 5
             AND ra.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
             AND ra.res_artikel_key = a.res_artikel_key
             AND ra.res_rsv_artikel_dirtlevel = 0
             AND ra.res_rsv_artikel_verwijder IS NULL
             AND fac.count_work_days (res_rsv_artikel_levering, SYSDATE) > 0
             AND rrr.res_rsv_ruimte_flag = 2;

   --- wzuv_rap_res bevat alle reserveringen met status 5 - afgemeld
   --- al deze regels moeten uiteindelijk ook bij de reservering zichtbaar zijn vanuit de verkoopfactuurtabellen en krijgen dan status 6 - verwerkt
   --- tbv van de export worden deze ook in de fac_rapport tabel gezet
   CURSOR c
   IS
        SELECT *
          FROM WZUV_V_RAP_RES
      ORDER BY res_rsv_ruimte_key;

   v_ruimte_key_prev         NUMBER;
   v_verkoopfactuurkop_key   NUMBER;
   v_aanduiding              VARCHAR2 (200);
   v_errorhint               VARCHAR2 (1000);
   v_errormsg                VARCHAR2 (1000);
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
BEGIN
   v_ruimte_key_prev := 1;

   FOR rec IN c
   LOOP
      IF rec.res_rsv_ruimte_key <> v_ruimte_key_prev
      THEN
         v_ruimte_key_prev := rec.res_rsv_ruimte_key;

         INSERT INTO fin_verkoopfactuurkop (fin_verkoopfactuurkop_id)
             VALUES (rec.reservering)
          RETURNING fin_verkoopfactuurkop_key
               INTO v_verkoopfactuurkop_key;
      END IF;

      INSERT INTO fin_verkoopfactuur (fin_verkoopfactuurkop_key,
                                      fin_verkoopfactuur_id,
                                      fin_verkoopfactuur_datum,
                                      fin_verkoopfactuur_omschr,
                                      fin_verkoopfactuur_xmlnode,
                                      fin_verkoopfactuur_refkey,
                                      prs_kostenplaats_nr,
                                      prs_debiteur_naam,
                                      fin_verkoopfactuur_bedrag,
                                      fin_verkoopfactuur_maand,
                                      fin_verkoopfactuur_c1)
          VALUES (v_verkoopfactuurkop_key,                               --key
                  TO_CHAR (rec.factuurperiode),                          ---id
                  SYSDATE,                                            -- datum
                  rec.omschrijving,                                    --omsch
                  'reservering',                                        ---xml
                  rec.res_rsv_ruimte_key,                             --refkey
                  rec.kostenplaats,                              ---kostenplnr
                  rec.persnr,                                       -- debnaam
                  rec.bedrag,                                       --- bedrag
                  rec.maand,                                        ---- maand
                  rec.soort                                             --- c1
                           );

      COMMIT;
   END LOOP;

   FOR rc IN cres
   LOOP
      BEGIN
         UPDATE res_rsv_ruimte
            SET res_status_bo_key = 6
          WHERE res_rsv_ruimte_key = rc.res_rsv_ruimte_key;

         fac.trackaction ('RESVER',
                          rc.res_rsv_ruimte_key,
                          NULL,
                          NULL,
                          NULL);
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=
                  ' ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.writelog (p_applname,
                          'W',
                          rc.aanduiding || v_errormsg,
                          v_errorhint);
            COMMIT;
      END;
   END LOOP;

   FOR rc IN cart
   LOOP
      BEGIN
         UPDATE res_rsv_artikel
            SET res_status_bo_key = 6
          WHERE res_rsv_artikel_key = rc.res_rsv_artikel_key;

         fac.trackaction (
            'RESVER',
            rc.res_rsv_ruimte_key,
            NULL,
            NULL,
            'Catering ' || rc.res_artikel_omschrijving || ' verwerkt');
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=
                  ' ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.writelog (p_applname,
                          'W',
                          rc.aanduiding || v_errormsg,
                          v_errorhint);
            COMMIT;
      END;
   END LOOP;
END;
/

CREATE OR REPLACE VIEW WZUV_V_EXPORT_RESERVERING
(
   RESULT,
   RESULT_ORDER
)
AS
   SELECT    persnr
          || ';'
          || artikelcode
          || ';'
          || aantal
          || ';'
          || bedrag
          || ';'
          || omschrijving
          || ';'
          || kostenplaats,
          reservering
     FROM WZUV_V_RAP_RES r;

CREATE OR REPLACE VIEW WZUV_V_RAP_RES_DEF
(
   PERSNR,
   RESERVERING,
   ARTIKELCODE,
   AANTAL,
   BEDRAG,
   FACTUURPERIODE,
   SOORT,
   OMSCHRIJVING,
   INT_EXT,
   KOSTENPLAATS,
   RES_RSV_RUIMTE_KEY,
   MAAND
)
AS
   SELECT CASE
             WHEN UPPER (p.prs_perslid_nr) LIKE 'NEDAP%'
             THEN
                SUBSTR (p.prs_perslid_nr, 7)
             ELSE
                p.prs_perslid_nr
          END
             AS persnr,
          rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr,
          TO_CHAR (ar.alg_ruimte_key),
          COALESCE ( (rrr.res_rsv_ruimte_tot - rrr.res_rsv_ruimte_van) * 24,
                    0)
             duur_ruimte,
          rrr.res_rsv_ruimte_prijs,
          TO_CHAR (rrr.res_rsv_ruimte_van, 'mm-yyyy') factuurperiode,
          'Ruimte',
             TO_CHAR (rrr.res_rsv_ruimte_van, 'month yyyy')
          || ' - Reserveringsnummer: '
          || rrr.res_reservering_key
          || '/'
          || rrr.res_rsv_ruimte_volgnr
          || ' - '
          || rr.res_ruimte_nr
             aanduiding,
          DECODE (prs_afdeling_key, 422, 'Cliënt', 'Intern') soort,
          kpl_ruimte.prs_kostenplaats_nr,
          rrr.res_rsv_ruimte_key,
          TO_CHAR (rrr.res_rsv_ruimte_van, 'mm')
     FROM res_rsv_ruimte rrr,
          prs_perslid p,
          prs_kostenplaats kp,
          res_v_rsv_ruimte_2_alg_ruimte ar,
          alg_v_allonroerendgoed aog,
          res_ruimte rr,
          (SELECT kpr.*, kpl.prs_kostenplaats_nr
             FROM alg_onrgoedkenmerk kpr, prs_kostenplaats kpl
            WHERE kpr.alg_kenmerk_key = 1061
                  AND kpr.alg_onrgoedkenmerk_waarde =
                        kpl.prs_kostenplaats_key) kpl_ruimte
    WHERE     rrr.res_status_bo_key = 6
          AND rrr.res_rsv_ruimte_dirtlevel = 0
          AND rrr.res_rsv_ruimte_verwijder IS NULL
          AND res_rsv_ruimte_host_key = p.prs_perslid_key
          AND rrr.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
          AND ar.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
          AND ar.res_ruimte_key = rr.res_ruimte_key
          AND ar.alg_ruimte_key = aog.alg_ruimte_key
          AND kpl_ruimte.alg_onrgoed_key(+) = aog.alg_gebouw_key
   UNION ALL
   SELECT CASE
             WHEN UPPER (p.prs_perslid_nr) LIKE 'NEDAP%'
             THEN
                SUBSTR (p.prs_perslid_nr, 7)
             ELSE
                p.prs_perslid_nr
          END
             AS persnr,
          rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr,
          a.res_artikel_nr,
          ra.res_rsv_artikel_aantal,
          ra.res_rsv_artikel_prijs,
          TO_CHAR (rrr.res_rsv_ruimte_van, 'mm-yyyy') factuurperiode,
          'Catering',
             TO_CHAR (rrr.res_rsv_ruimte_van, 'month yyyy')
          || ' - '
          || TO_CHAR (rrr.res_reservering_key)
          || '/'
          || TO_CHAR (rrr.res_rsv_ruimte_volgnr)
          || ' - '
          || TO_CHAR (a.res_artikel_omschrijving)
             aanduiding,
          DECODE (p.prs_afdeling_key, 422, 'Cliënt', 'Intern') soort,
          kpl_cat.prs_kostenplaats_nr,
          rrr.res_rsv_ruimte_key,
          TO_CHAR (rrr.res_rsv_ruimte_van, 'mm')
     FROM res_rsv_artikel ra,
          res_rsv_ruimte rrr,
          res_artikel a,
          prs_perslid p,
          prs_kostenplaats kp,
          res_v_rsv_ruimte_2_alg_ruimte ar,
          alg_v_allonroerendgoed aog,
          (SELECT kpr.*, kpl.prs_kostenplaats_nr
             FROM alg_onrgoedkenmerk kpr, prs_kostenplaats kpl
            WHERE kpr.alg_kenmerk_key = 1060
                  AND kpr.alg_onrgoedkenmerk_waarde =
                        kpl.prs_kostenplaats_key) kpl_cat
    WHERE     ra.res_status_bo_key = 6
          AND rrr.res_rsv_ruimte_flag = 2
          AND ra.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
          AND ra.res_artikel_key = a.res_artikel_key
          AND ra.res_rsv_artikel_dirtlevel = 0
          AND ra.res_rsv_artikel_verwijder IS NULL
          AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
          AND ar.res_rsv_ruimte_key(+) = rrr.res_rsv_ruimte_key
          AND rrr.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
          AND (aog.alg_ruimte_key = rrr.alg_ruimte_key
               OR aog.alg_ruimte_key = ar.alg_ruimte_key)
          AND kpl_cat.alg_onrgoed_key(+) = aog.alg_gebouw_key;

CREATE OR REPLACE PROCEDURE wzuv_import_fin_fact_liander (
   p_import_key IN NUMBER)
AS
   v_seq_of_columns   VARCHAR (50);
BEGIN
   -- In de xsl factuurnr(1);factuurdatum(2);omschrijving(3);bedrag(4);btwperc(5);btwbedrag(6);periode_van(7);EAN nummer(8)
   --hulp voor pos      :  '1;2;3;4;5;6;7;8;9;0;1;2;3;14;15;16;7;8;9;0'
   v_seq_of_columns := '0;1;2;0;0;0;3;0;4;6;5;0;0;0;0;7;8;0;0;0';

   -- Variabelelijst
   -- v_leveranciernr: 1
   -- v_factuurnr: 2            (VERPLICHT, anders zet Facilitor '-' in factuurnr, en is status van factuur "Incompleet")
   -- v_factuurdatum: 3
   -- v_ordernr: 4              (VERPLICHT, anders is status van factuur "Incompleet")
   -- v_locatie: 5
   -- v_afleverdatum: 6
   -- v_omschrijving: 7
   -- v_aantal: 8
   -- v_kostprijs: 9            (VERPLICHT, anders is status van factuur "Incompleet")
   -- v_btw_bedrag: 10          (VERPLICHT, of anders veld 11, anders is status van factuur "Incompleet")
   -- v_btw: 11                 (VERPLICHT, of anders veld 10, anders is status van factuur "Incompleet")
   -- v_docid: 12
   -- v_debiteur_nr: 13
   -- v_opmerking: 14
   -- v_btw_verlegd: 15         (VERPLICHT, Ja/Nee/<leeg> waarbij leeg gelijk is aan Nee. Andere waarden leidt tot "Incompleet")
   -- v_kenmerk1: 16
   -- v_kenmerk1: 17
   -- v_kenmerk1: 18
   -- v_kenmerk1: 19
   -- v_kenmerk1: 20
   -- v_boekmaand: 21

   fac_import_factuur_body (p_import_key, v_seq_of_columns);

   -- Voeg prefix C toe aan het contractnummer van het actieve contract van Liander
   -- het juiste contract kan bepaald worden op basis van het EAN nummer dat in kenmerkveldje 2 staat
   UPDATE fac_imp_factuur f
      SET f.ordernr =
             (SELECT DECODE (
                        cnt_contract_versie,
                        NULL,
                        'C' || c.cnt_contract_nummer_intern,
                           'C'
                        || c.cnt_contract_nummer_intern
                        || '.'
                        || cnt_contract_versie)
                        AS orderid
                FROM cnt_kenmerkcontract kc,
                     cnt_kenmerk k,
                     cnt_srtkenmerk sk,
                     cnt_contract c,
                     prs_bedrijf b
               WHERE     kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                     AND k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                     AND kc.cnt_contract_key = c.cnt_contract_key
                     AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
                     AND b.prs_bedrijf_naam_upper LIKE '%LIANDER%'
                     AND UPPER (sk.cnt_srtkenmerk_omschrijving) LIKE '%EAN%'
                     AND cnt_kenmerkcontract_waarde = f.kenmerk2);

   -- de boekmaand is de maand waarover de factuur betrekking heeft
   -- het kenmerk veld bevat de begindatum van deze maand dus daar extraheren we het jaar en de maand uit
   UPDATE fac_imp_factuur f
      SET f.boekmaand = SUBSTR (kenmerk1, 1, 7)
    WHERE kenmerk1 IS NOT NULL;

   COMMIT;
END;
/

CREATE OR REPLACE PROCEDURE wzuv_update_fin_fact_liander (
   p_import_key IN NUMBER)
AS
BEGIN
   -- Standaard FCLT verwerk import facturen
   fac_update_factuur (p_import_key);
END;
/

CREATE OR REPLACE PROCEDURE wzuv_import_fin_fact_tu (p_import_key IN NUMBER)
AS
   v_seq_of_columns   VARCHAR (50);
BEGIN
   -- In de xsl bestelnr(1);factuurnr(2);factuurdatum(3);omschrijving(4);bedrag(5);btwperc(6);aantal(7)
   --hulp voor pos      :  '1;2;3;4;5;6;7;8;9;0;1;2;3;14;15;16;7;8;9;0'
   v_seq_of_columns := '0;2;3;1;0;0;4;7;5;0;6;0;0;0;0;0;0;0;0;0';

   -- Variabelelijst
   -- v_leveranciernr: 1
   -- v_factuurnr: 2            (VERPLICHT, anders zet Facilitor '-' in factuurnr, en is status van factuur "Incompleet")
   -- v_factuurdatum: 3
   -- v_ordernr: 4              (VERPLICHT, anders is status van factuur "Incompleet")
   -- v_locatie: 5
   -- v_afleverdatum: 6
   -- v_omschrijving: 7
   -- v_aantal: 8
   -- v_kostprijs: 9            (VERPLICHT, anders is status van factuur "Incompleet")
   -- v_btw_bedrag: 10          (VERPLICHT, of anders veld 11, anders is status van factuur "Incompleet")
   -- v_btw: 11                 (VERPLICHT, of anders veld 10, anders is status van factuur "Incompleet")
   -- v_docid: 12
   -- v_debiteur_nr: 13
   -- v_opmerking: 14
   -- v_btw_verlegd: 15         (VERPLICHT, Ja/Nee/<leeg> waarbij leeg gelijk is aan Nee. Andere waarden leidt tot "Incompleet")
   -- v_kenmerk1: 16
   -- v_kenmerk1: 17
   -- v_kenmerk1: 18
   -- v_kenmerk1: 19
   -- v_kenmerk1: 20
   -- v_boekmaand: 21

   fac_import_factuur_body (p_import_key, v_seq_of_columns);

   COMMIT;
END;
/


CREATE OR REPLACE PROCEDURE wzuv_update_fin_fact_tu (p_import_key IN NUMBER)
AS
BEGIN
   -- Standaard FCLT verwerk import facturen
   fac_update_factuur (p_import_key);
END;
/


-- ==========================================
-- VANAF HIER ALLE VIEWS EN PROCS VOOR DE EXACT KOPPELING
-- ==========================================
-- Kenmerk 21 is bijlage

CREATE OR REPLACE VIEW WZUV_V_FACTUUR_BESTAND
(
   FIN_FACTUUR_KEY,
   FIN_FACTUUR_BESTAND
)
AS
   SELECT kf.fin_factuur_key, kf.fin_kenmerkfactuur_waarde
     FROM fin_kenmerkfactuur kf
    WHERE kf.fin_kenmerkfactuur_verwijder IS NULL AND fin_kenmerk_key = 21;

--  Kenmerk 2 is betaalreferentie

CREATE OR REPLACE VIEW WZUV_V_FACTUUR_BETAALREF
(
   FIN_FACTUUR_KEY,
   FIN_FACTUUR_BETAALREF
)
AS
   SELECT kf.fin_factuur_key, kf.fin_kenmerkfactuur_waarde
     FROM fin_kenmerkfactuur kf
    WHERE kf.fin_kenmerkfactuur_verwijder IS NULL AND fin_kenmerk_key = 2;

--  Kenmerk 3 is omschrijving kopregel

CREATE OR REPLACE VIEW WZUV_V_FACTUUR_OMSCHR_KOPREGEL
(
   FIN_FACTUUR_KEY,
   FIN_FACTUUR_OMSCHR_KOPREGEL
)
AS
   SELECT kf.fin_factuur_key, kf.fin_kenmerkfactuur_waarde
     FROM fin_kenmerkfactuur kf
    WHERE kf.fin_kenmerkfactuur_verwijder IS NULL AND fin_kenmerk_key = 3;

--  Kenmerk 4 is omschrijving datum factuurregel

CREATE OR REPLACE VIEW WZUV_V_FACTUURREGEL_DATUM
(
   FIN_FACTUURREGEL_KEY,
   FIN_FACTUURREGEL_DATUM
)
AS
   SELECT kfr.fin_factuurregel_key, kfr.fin_kenmerkfactregel_waarde
     FROM fin_kenmerkfactregel kfr
    WHERE kfr.fin_kenmerkfactregel_verwijder IS NULL AND fin_kenmerk_key = 4;

--  Kenmerk 22 is de afwijkende kostenplaats

CREATE OR REPLACE FORCE VIEW WZUV_V_FACTUUR_AFW_KPL
(
   FIN_FACTUUR_KEY,
   FIN_FACTUUR_AFW_KPL
)
AS
   SELECT fin_factuur_key, prs_kostenplaats_nr 
     FROM fin_kenmerkfactuur kf, prs_kostenplaats kp
    WHERE kf.fin_kenmerkfactuur_verwijder IS NULL
    AND kf.fin_kenmerkfactuur_waarde = kp.prs_kostenplaats_key
    AND fin_kenmerk_key = 22;

CREATE OR REPLACE VIEW WZUV_V_FACTUUR_BES_GEGEVENS
(
   FIN_FACTUUR_KEY,
   OPDRACHT_ID,
   FIN_FACTUUR_DATUM,
   FIN_FACTUUR_BOEKMAAND,
   FIN_FACTUUR_NR,
   FIN_FACTUUR_BESTAND,
   PRS_BEDRIJF_KEY,
   FIN_FACTUURREGEL_TOTAAL,
   FIN_FACTUURREGEL_BTW,
   FIN_FACTUURREGEL_BTW_PERC,
   FIN_BTWTABELWAARDE_BTWCODE,
   FIN_FACTUURREGEL_NR,
   FIN_FACTUURREGEL_OMSCHRIJVING,
   FIN_FACTUURREGEL_DATUM,
   FIN_FACTUUR_DEBITEUR_NR,
   FIN_FACTUUR_BETAALREF,
   FIN_FACTUUR_OMSCHR_KOPREGEL,
   PROJECT_NUMMER,
   PRS_KOSTENSOORT_OMS,
   PRS_KOSTENSOORT_DOORBELASTEN,
   PRS_KOSTENPLAATS_NR,
   BES_OPDR_KEY,
   MLD_OPDR_KEY,
   CNT_CONTRACT_KEY,
   FIN_FACTUUR_STATUSES_KEY
)
AS
   SELECT DISTINCT
          f.fin_factuur_key,
          TO_CHAR (bo.bes_bestelopdr_id) opdracht_id,
          f.fin_factuur_datum,
          f.fin_factuur_boekmaand,
          f.fin_factuur_nr,
          fb.fin_factuur_bestand,
          b.prs_bedrijf_key,
          fr.fin_factuurregel_totaal,
          fr.fin_factuurregel_btw,
          btw.fin_btwtabelwaarde_perc,
          btw.fin_btwtabelwaarde_code,
          fr.fin_factuurregel_nr,
          fr.fin_factuurregel_omschrijving,
          frd.fin_factuurregel_datum,
          f.fin_factuur_debiteur_nr,
          fbr.fin_factuur_betaalref,
          fok.fin_factuur_omschr_kopregel,
          NULL projectnummer,
          COALESCE (ks_regel.prs_kostensoort_oms, ks.prs_kostensoort_oms),
          DECODE (ks_regel.prs_kostensoort_oms,
                  NULL, ks.prs_kostensoort_doorbelasten,
                  ks_regel.prs_kostensoort_doorbelasten),
          kp.prs_kostenplaats_nr,
          bo.bes_bestelopdr_key bes_opdr_key,
          NULL mld_opdr_key,
          NULL cnt_contract_key,
          f.fin_factuur_statuses_key
     FROM bes_bestelopdr bo,
          prs_bedrijf b,
          bes_bestelling bes,
          bes_bestelopdr_item boi,
          bes_bestelling_item bi,
          fin_factuur f,
          wzuv_v_factuur_bestand fb,
          wzuv_v_factuur_betaalref fbr,
          wzuv_v_factuur_omschr_kopregel fok,
          fin_factuurregel fr,
          wzuv_v_factuurregel_datum frd,
          fin_btwtabelwaarde btw,
          prs_kostensoort ks,
          prs_kostensoort ks_regel,
          prs_kostenplaats kp
    WHERE     b.prs_bedrijf_key = bo.prs_bedrijf_key
          AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key
          AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
          AND bes.bes_bestelling_key = bi.bes_bestelling_key
          AND kp.prs_kostenplaats_key = bes.prs_kostenplaats_key
          AND f.prs_kostensoort_key = ks.prs_kostensoort_key(+)
          AND fr.prs_kostensoort_key = ks_regel.prs_kostensoort_key(+)
          AND f.bes_bestelopdr_key = bo.bes_bestelopdr_key
          AND f.fin_factuur_key = fr.fin_factuur_key
          AND fr.fin_factuurregel_key = frd.fin_factuurregel_key(+)
          AND fr.fin_btwtabelwaarde_key = btw.fin_btwtabelwaarde_key
          AND f.fin_factuur_key = fb.fin_factuur_key(+)
          AND f.fin_factuur_key = fbr.fin_factuur_key(+)
          AND f.fin_factuur_key = fok.fin_factuur_key(+);

CREATE OR REPLACE VIEW WZUV_V_FACTUUR_MLDCNT_GEGEVENS
(
   FIN_FACTUUR_KEY,
   OPDRACHT_ID,
   FIN_FACTUUR_DATUM,
   FIN_FACTUUR_BOEKMAAND,
   FIN_FACTUUR_NR,
   FIN_FACTUUR_BESTAND,
   PRS_BEDRIJF_KEY,
   FIN_FACTUURREGEL_TOTAAL,
   FIN_FACTUURREGEL_BTW,
   FIN_FACTUURREGEL_BTW_PERC,
   FIN_BTWTABELWAARDE_BTWCODE,
   FIN_FACTUURREGEL_NR,
   FIN_FACTUURREGEL_OMSCHRIJVING,
   FIN_FACTUURREGEL_DATUM,
   FIN_FACTUUR_DEBITEUR_NR,
   FIN_FACTUUR_BETAALREF,
   FIN_FACTUUR_OMSCHR_KOPREGEL,
   PROJECT_NUMMER,
   PRS_KOSTENSOORT_OMS,
   PRS_KOSTENSOORT_DOORBELASTEN,
   PRS_KOSTENPLAATS_NR,
   BES_OPDR_KEY,
   MLD_OPDR_KEY,
   CNT_CONTRACT_KEY,
   FIN_FACTUUR_STATUSES_KEY
)
AS
   SELECT DISTINCT
          f.fin_factuur_key,
          COALESCE (
             TO_CHAR (cnt_contract_nummer),
             (SELECT    sd.ins_srtdiscipline_prefix
                     || m.mld_melding_key
                     || '/'
                     || o.mld_opdr_bedrijfopdr_volgnr
                FROM mld_melding m,
                     mld_stdmelding std,
                     ins_tab_discipline d,
                     ins_srtdiscipline sd
               WHERE     m.mld_melding_key = o.mld_melding_key
                     AND m.mld_stdmelding_key = std.mld_stdmelding_key
                     AND std.mld_ins_discipline_key = d.ins_discipline_key
                     AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key))
             opdracht_id,
          f.fin_factuur_datum,
          f.fin_factuur_boekmaand,
          f.fin_factuur_nr,
          fb.fin_factuur_bestand,
          COALESCE (b_c.prs_bedrijf_key, b_o.prs_bedrijf_key) prs_bedrijf_key,
          fr.fin_factuurregel_totaal,
          fr.fin_factuurregel_btw,
          btw.fin_btwtabelwaarde_perc,
          btw.fin_btwtabelwaarde_code,
          fr.fin_factuurregel_nr,
          fr.fin_factuurregel_omschrijving,
          frd.fin_factuurregel_datum,
          COALESCE (f.fin_factuur_debiteur_nr,
                    b_c.prs_leverancier_nr,
                    b_o.prs_leverancier_nr),
          fbr.fin_factuur_betaalref,
          fok.fin_factuur_omschr_kopregel,
          NULL projectnummer,
          COALESCE (ks_regel.prs_kostensoort_oms,
                    ks_contract.prs_kostensoort_oms,
                    ks.prs_kostensoort_oms),
          DECODE (ks_regel.prs_kostensoort_oms,
                  NULL, ks.prs_kostensoort_doorbelasten,
                  ks_regel.prs_kostensoort_doorbelasten),
          COALESCE (faklp.fin_factuur_afw_kpl, kp_c.prs_kostenplaats_nr, kp_o.prs_kostenplaats_nr)
             prs_kostenplaats_nr,
          NULL bes_opdr_key,
          o.mld_opdr_key,
          c.cnt_contract_key,
          f.fin_factuur_statuses_key
     FROM fin_factuur f,
          wzuv_v_factuur_bestand fb,
          wzuv_v_factuur_betaalref fbr,
          wzuv_v_factuur_omschr_kopregel fok,
          wzuv_v_factuur_afw_kpl faklp,
          fin_factuurregel fr,
          wzuv_v_factuurregel_datum frd,
          fin_btwtabelwaarde btw,
          mld_opdr o,
          mld_typeopdr ot,
          cnt_contract c,
          prs_bedrijf b_o,
          prs_bedrijf b_c,
          prs_kostensoort ks,
          prs_kostensoort ks_regel,
          prs_kostensoort ks_contract,
          prs_kostenplaats kp_c,
          prs_kostenplaats kp_o
    WHERE     f.fin_factuur_key = fr.fin_factuur_key
          AND fr.fin_factuurregel_key = frd.fin_factuurregel_key(+)
          AND fr.fin_btwtabelwaarde_key = btw.fin_btwtabelwaarde_key
          AND f.fin_factuur_key = fb.fin_factuur_key(+)
          AND f.fin_factuur_key = fbr.fin_factuur_key(+)
          AND f.fin_factuur_key = fok.fin_factuur_key(+)
          AND f.fin_factuur_key = faklp.fin_factuur_key(+)
          AND f.bes_bestelopdr_key IS NULL
          AND f.mld_opdr_key = o.mld_opdr_key(+)
          AND o.prs_kostenplaats_key = kp_o.prs_kostenplaats_key(+)
          AND o.mld_typeopdr_key = ot.mld_typeopdr_key(+)
          AND f.cnt_contract_key = c.cnt_contract_key(+)
          AND o.mld_uitvoerende_keys = b_o.prs_bedrijf_key(+)
          AND c.cnt_prs_bedrijf_key = b_c.prs_bedrijf_key(+)
          AND c.prs_kostenplaats_key = kp_c.prs_kostenplaats_key(+)
          AND f.prs_kostensoort_key = ks.prs_kostensoort_key(+)
          AND fr.prs_kostensoort_key = ks_regel.prs_kostensoort_key(+)
          AND c.prs_kostensoort_key = ks_contract.prs_kostensoort_key(+);

CREATE OR REPLACE VIEW WZUV_V_FACTUUR_GEG_AKKOORD
(
   FIN_FACTUUR_KEY,
   OPDRACHT_ID,
   FIN_FACTUUR_DATUM,
   FIN_FACTUUR_BOEKMAAND,
   FIN_FACTUUR_NR,
   FIN_FACTUUR_BESTAND,
   PRS_BEDRIJF_KEY,
   FIN_FACTUURREGEL_TOTAAL,
   FIN_FACTUURREGEL_BTW,
   FIN_FACTUURREGEL_BTW_PERC,
   FIN_BTWTABELWAARDE_BTWCODE,
   FIN_FACTUURREGEL_NR,
   FIN_FACTUURREGEL_OMSCHRIJVING,
   FIN_FACTUURREGEL_DATUM,
   FIN_FACTUUR_DEBITEUR_NR,
   FIN_FACTUUR_BETAALREF,
   FIN_FACTUUR_OMSCHR_KOPREGEL,
   PROJECT_NUMMER,
   PRS_KOSTENSOORT_OMS,
   PRS_KOSTENSOORT_DOORBELASTEN,
   PRS_KOSTENPLAATS_NR,
   BES_OPDR_KEY,
   MLD_OPDR_KEY,
   CNT_CONTRACT_KEY,
   FIN_FACTUUR_STATUSES_KEY
)
AS
   SELECT "FIN_FACTUUR_KEY",
          "OPDRACHT_ID",
          "FIN_FACTUUR_DATUM",
          "FIN_FACTUUR_BOEKMAAND",
          "FIN_FACTUUR_NR",
          "FIN_FACTUUR_BESTAND",
          "PRS_BEDRIJF_KEY",
          "FIN_FACTUURREGEL_TOTAAL",
          "FIN_FACTUURREGEL_BTW",
          "FIN_FACTUURREGEL_BTW_PERC",
          "FIN_BTWTABELWAARDE_BTWCODE",
          "FIN_FACTUURREGEL_NR",
          "FIN_FACTUURREGEL_OMSCHRIJVING",
          "FIN_FACTUURREGEL_DATUM",
          "FIN_FACTUUR_DEBITEUR_NR",
          "FIN_FACTUUR_BETAALREF",
          "FIN_FACTUUR_OMSCHR_KOPREGEL",
          "PROJECT_NUMMER",
          "PRS_KOSTENSOORT_OMS",
          "PRS_KOSTENSOORT_DOORBELASTEN",
          "PRS_KOSTENPLAATS_NR",
          "BES_OPDR_KEY",
          "MLD_OPDR_KEY",
          "CNT_CONTRACT_KEY",
          "FIN_FACTUUR_STATUSES_KEY"
     FROM wzuv_v_factuur_mldcnt_gegevens
    WHERE fin_factuur_statuses_key = 6
   UNION
   SELECT "FIN_FACTUUR_KEY",
          "OPDRACHT_ID",
          "FIN_FACTUUR_DATUM",
          "FIN_FACTUUR_BOEKMAAND",
          "FIN_FACTUUR_NR",
          "FIN_FACTUUR_BESTAND",
          "PRS_BEDRIJF_KEY",
          "FIN_FACTUURREGEL_TOTAAL",
          "FIN_FACTUURREGEL_BTW",
          "FIN_FACTUURREGEL_BTW_PERC",
          "FIN_BTWTABELWAARDE_BTWCODE",
          "FIN_FACTUURREGEL_NR",
          "FIN_FACTUURREGEL_OMSCHRIJVING",
          "FIN_FACTUURREGEL_DATUM",
          "FIN_FACTUUR_DEBITEUR_NR",
          "FIN_FACTUUR_BETAALREF",
          "FIN_FACTUUR_OMSCHR_KOPREGEL",
          "PROJECT_NUMMER",
          "PRS_KOSTENSOORT_OMS",
          "PRS_KOSTENSOORT_DOORBELASTEN",
          "PRS_KOSTENPLAATS_NR",
          "BES_OPDR_KEY",
          "MLD_OPDR_KEY",
          "CNT_CONTRACT_KEY",
          "FIN_FACTUUR_STATUSES_KEY"
     FROM wzuv_v_factuur_bes_gegevens
    WHERE fin_factuur_statuses_key = 6;

CREATE OR REPLACE VIEW WZUV_V_FACTUUR_GEG
(
   FIN_FACTUUR_KEY,
   OPDRACHT_ID,
   FIN_FACTUUR_DATUM,
   FIN_FACTUUR_BOEKMAAND,
   FIN_FACTUUR_NR,
   FIN_FACTUUR_BESTAND,
   PRS_BEDRIJF_KEY,
   FIN_FACTUURREGEL_TOTAAL,
   FIN_FACTUURREGEL_BTW,
   FIN_FACTUURREGEL_BTW_PERC,
   FIN_BTWTABELWAARDE_BTWCODE,
   FIN_FACTUURREGEL_NR,
   FIN_FACTUURREGEL_OMSCHRIJVING,
   FIN_FACTUURREGEL_DATUM,
   FIN_FACTUUR_DEBITEUR_NR,
   FIN_FACTUUR_BETAALREF,
   FIN_FACTUUR_OMSCHR_KOPREGEL,
   PROJECT_NUMMER,
   PRS_KOSTENSOORT_OMS,
   PRS_KOSTENSOORT_DOORBELASTEN,
   PRS_KOSTENPLAATS_NR,
   BES_OPDR_KEY,
   MLD_OPDR_KEY,
   CNT_CONTRACT_KEY,
   FIN_FACTUUR_STATUSES_KEY
)
AS
   SELECT "FIN_FACTUUR_KEY",
          "OPDRACHT_ID",
          "FIN_FACTUUR_DATUM",
          "FIN_FACTUUR_BOEKMAAND",
          "FIN_FACTUUR_NR",
          "FIN_FACTUUR_BESTAND",
          "PRS_BEDRIJF_KEY",
          "FIN_FACTUURREGEL_TOTAAL",
          "FIN_FACTUURREGEL_BTW",
          "FIN_FACTUURREGEL_BTW_PERC",
          "FIN_BTWTABELWAARDE_BTWCODE",
          "FIN_FACTUURREGEL_NR",
          "FIN_FACTUURREGEL_OMSCHRIJVING",
          "FIN_FACTUURREGEL_DATUM",
          "FIN_FACTUUR_DEBITEUR_NR",
          "FIN_FACTUUR_BETAALREF",
          "FIN_FACTUUR_OMSCHR_KOPREGEL",
          "PROJECT_NUMMER",
          "PRS_KOSTENSOORT_OMS",
          "PRS_KOSTENSOORT_DOORBELASTEN",
          "PRS_KOSTENPLAATS_NR",
          "BES_OPDR_KEY",
          "MLD_OPDR_KEY",
          "CNT_CONTRACT_KEY",
          "FIN_FACTUUR_STATUSES_KEY"
     FROM wzuv_v_factuur_mldcnt_gegevens
   UNION
   SELECT "FIN_FACTUUR_KEY",
          "OPDRACHT_ID",
          "FIN_FACTUUR_DATUM",
          "FIN_FACTUUR_BOEKMAAND",
          "FIN_FACTUUR_NR",
          "FIN_FACTUUR_BESTAND",
          "PRS_BEDRIJF_KEY",
          "FIN_FACTUURREGEL_TOTAAL",
          "FIN_FACTUURREGEL_BTW",
          "FIN_FACTUURREGEL_BTW_PERC",
          "FIN_BTWTABELWAARDE_BTWCODE",
          "FIN_FACTUURREGEL_NR",
          "FIN_FACTUURREGEL_OMSCHRIJVING",
          "FIN_FACTUURREGEL_DATUM",
          "FIN_FACTUUR_DEBITEUR_NR",
          "FIN_FACTUUR_BETAALREF",
          "FIN_FACTUUR_OMSCHR_KOPREGEL",
          "PROJECT_NUMMER",
          "PRS_KOSTENSOORT_OMS",
          "PRS_KOSTENSOORT_DOORBELASTEN",
          "PRS_KOSTENPLAATS_NR",
          "BES_OPDR_KEY",
          "MLD_OPDR_KEY",
          "CNT_CONTRACT_KEY",
          "FIN_FACTUUR_STATUSES_KEY"
     FROM wzuv_v_factuur_bes_gegevens;

-- Alle waarden (zijn evt meer records) uit eigen tabel 'Exact'  waarvan de waarde_code met een
-- zekere prefix begint (volgens de systeem-setting PREFIX_FCLT_FACTUUR_XML_HEADER), komen in de header vd xml terecht
-- 121 is de eigen tabel met dagboeknrs. (op dit moment alleen '40'  moet nog gevuld worden)

CREATE OR REPLACE VIEW wzuv_v_fclt_factuur_header
(
   result,
   result_order
)
AS
   SELECT    '<'
          || fac_usrdata_code
          || '>'
          || fac_usrdata_omschr
          || '</'
          || fac_usrdata_code
          || '>',
          1
     FROM fac_usrdata
    WHERE fac_usrtab_key = 121 AND fac_usrdata_verwijder IS NULL;

CREATE OR REPLACE VIEW wzuv_v_fclt_factuur_body
(
   result,
   result_order
)
AS
   SELECT    DECODE (regelnummer, 0, '<fin_factuur>', '<fin_factuurregel>')
          || '<fin_factuur_key>'
          || fin_factuur_key
          || '</fin_factuur_key>'
          || '<fin_factuur_nr>'
          || xml.char_to_html (fin_factuur_nr)
          || '</fin_factuur_nr>'
          || '<fin_factuur_bestand>'
          || xml.char_to_html (fin_factuur_bestand)
          || '</fin_factuur_bestand>'
          || '<fin_factuur_debiteur_nr>'
          || xml.char_to_html (fin_factuur_debiteur_nr)
          || '</fin_factuur_debiteur_nr>'
          || '<fin_factuur_omschr_kopregel>'
          || xml.char_to_html (fin_factuur_omschr_kopregel)
          || '</fin_factuur_omschr_kopregel>'
          || '<bes_mld_cnt_opdracht_id>'
          || xml.char_to_html (bes_mld_cnt_opdracht_id)
          || '</bes_mld_cnt_opdracht_id>'
          || '<fin_factuur_datum>'
          || datum
          || '</fin_factuur_datum>'
          || '<fin_factuur_boekmaand>'
          || fin_factuur_boekmaand
          || '</fin_factuur_boekmaand>'
          || '<prs_kostensoort_oms>'
          || xml.char_to_html (grootboekrekening)
          || '</prs_kostensoort_oms>'
          || '<prs_kostensoort_doorbelasten>'
          || xml.char_to_html (kostensoort_doorbelasten)
          || '</prs_kostensoort_doorbelasten>'
          || '<prs_betaal_referentie>'
          || xml.char_to_html (betaalreferentie)
          || '</prs_betaal_referentie>'
          || '<prs_leverancier_nr>'
          || xml.char_to_html (crediteur_nr)
          || '</prs_leverancier_nr>'
          || '<prs_bedrijf_naam>'
          || xml.char_to_html (crediteur_naam)
          || '</prs_bedrijf_naam>'
          || '<fin_factuur_totaal_exbtw>'
          || fin_factuur_totaal_exbtw
          || '</fin_factuur_totaal_exbtw>'
          || '<fin_factuur_totaal_incbtw>'
          || fin_factuur_totaal_incbtw
          || '</fin_factuur_totaal_incbtw>'
          || '<fin_factuurregel_omschrijving>'
          || xml.char_to_html (fin_factuurregel_omschrijving)
          || '</fin_factuurregel_omschrijving>'
          || '<fin_factuurregel_datum>'
          || xml.char_to_html (fin_factuurregel_datum)
          || '</fin_factuurregel_datum>'
          || '<fin_factuurregel_totaal>'
          || fin_factuurregel_totaal
          || '</fin_factuurregel_totaal>'
          || '<fin_factuurregel_btw_perc>'
          || btw_percentage
          || '</fin_factuurregel_btw_perc>'
          || '<fin_factuurregel_btw_perc_code>'
          || xml.char_to_html (btw_code)
          || '</fin_factuurregel_btw_perc_code>'
          || '<fin_factuurregel_btw_bedrag>'
          || btw_bedrag
          || '</fin_factuurregel_btw_bedrag>'
          || '<prs_kostenplaats_nr>'
          || xml.char_to_html (prs_kostenplaats_nr)
          || '</prs_kostenplaats_nr>'
          || DECODE (
                regelnummer,
                0,
                '',
                DECODE (max_factuur_regelnr - regelnummer,
                        0, '</fin_factuurregel></fin_factuur>',
                        '</fin_factuurregel>')),
          (1000000 + fin_factuur_key) * 10000 + regelnummer
     FROM (SELECT 0 regelnummer,
                  aant_factuur_regels,
                  max_factuur_regelnr,
                  fin_factuur_key,
                  fin_factuur_nr,
                  fin_factuur_bestand,
                  fin_factuur_debiteur_nr,
                  fin_factuur_omschr_kopregel,
                  opdracht_id bes_mld_cnt_opdracht_id,
                  TO_CHAR (fin_factuur_datum, 'ddmmyyyy') datum,
                  fin_factuur_boekmaand,
                  '' grootboekrekening,
                  '' kostensoort_doorbelasten,
                  betaalreferentie,
                  (SELECT prs_leverancier_nr
                     FROM prs_bedrijf b
                    WHERE b.prs_bedrijf_key = fg.prs_bedrijf_key)
                     crediteur_nr,
                  (SELECT prs_bedrijf_naam
                     FROM prs_bedrijf b
                    WHERE b.prs_bedrijf_key = fg.prs_bedrijf_key)
                     crediteur_naam,
                  REPLACE (TO_CHAR (ROUND (bedrag_exbtw, 2)), ',', '.')
                     fin_factuur_totaal_exbtw,
                  REPLACE (TO_CHAR (ROUND (bedrag_incbtw, 2)), ',', '.')
                     fin_factuur_totaal_incbtw,
                  '' fin_factuurregel_omschrijving,
                  '' fin_factuurregel_datum,
                  '' fin_factuurregel_totaal,
                  '' btw_percentage,
                  '' btw_code,
                  '' btw_bedrag,
                  '' prs_kostenplaats_nr
             FROM (  SELECT fin_factuur_key,
                            opdracht_id,
                            fin_factuur_datum,
                            fin_factuur_boekmaand,
                            fin_factuur_nr,
                            fin_factuur_bestand,
                            prs_bedrijf_key,
                            fin_factuur_debiteur_nr,
                            COALESCE (
                               fin_factuur_betaalref,
                               fin_factuur_nr || '/' || fin_factuur_debiteur_nr)
                               betaalreferentie,
                            fin_factuur_omschr_kopregel,
                            COUNT (fin_factuur_key) AS aant_factuur_regels,
                            MAX (fin_factuurregel_nr) AS max_factuur_regelnr,
                            SUM (fin_factuurregel_totaal) bedrag_exbtw,
                            SUM (
                               fin_factuurregel_totaal + fin_factuurregel_btw)
                               bedrag_incbtw
                       FROM wzuv_v_factuur_geg_akkoord             ---DEZE DUS
                   GROUP BY fin_factuur_key,
                            opdracht_id,
                            fin_factuur_datum,
                            fin_factuur_boekmaand,
                            fin_factuur_nr,
                            fin_factuur_bestand,
                            prs_bedrijf_key,
                            fin_factuur_debiteur_nr,
                            fin_factuur_betaalref,
                            fin_factuur_omschr_kopregel) fg
           UNION ALL
           SELECT fin_factuurregel_nr regelnummer,
                  (  SELECT COUNT (fin_factuur_key)
                       FROM wzuv_v_factuur_geg_akkoord fc
                      WHERE fc.fin_factuur_key = fg.fin_factuur_key
                   GROUP BY fin_factuur_key,
                            opdracht_id,
                            fin_factuur_datum,
                            fin_factuur_nr,
                            prs_bedrijf_key,
                            fin_factuur_debiteur_nr)
                     AS aant_factuur_regels,
                  (  SELECT MAX (fin_factuurregel_nr)
                       FROM wzuv_v_factuur_geg_akkoord fc
                      WHERE fc.fin_factuur_key = fg.fin_factuur_key
                   GROUP BY fin_factuur_key,
                            opdracht_id,
                            fin_factuur_datum,
                            fin_factuur_nr,
                            prs_bedrijf_key,
                            fin_factuur_debiteur_nr)
                     AS max_factuur_regelnr,
                  fin_factuur_key,
                  fin_factuur_nr,
                  '' fin_factuur_bestand,
                  fin_factuur_debiteur_nr,
                  '' fin_factuur_omschr_kopregel,
                  '' bes_mld_cnt_opdracht_id,
                  TO_CHAR (fin_factuur_datum, 'ddmmyyyy') datum,
                  fin_factuur_boekmaand,
                  prs_kostensoort_oms grootboekrekening,
                  TO_CHAR (prs_kostensoort_doorbelasten)
                     kostensoort_doorbelasten,
                  COALESCE (fin_factuur_betaalref,
                            fin_factuur_nr || '/' || fin_factuur_debiteur_nr)
                     betaalreferentie,
                  (SELECT prs_leverancier_nr
                     FROM prs_bedrijf b
                    WHERE b.prs_bedrijf_key = fg.prs_bedrijf_key)
                     crediteur_nr,
                  (SELECT prs_bedrijf_naam
                     FROM prs_bedrijf b
                    WHERE b.prs_bedrijf_key = fg.prs_bedrijf_key)
                     crediteur_naam,
                  '' fin_factuur_totaal_exbtw,
                  '' fin_factuur_totaal_incbtw,
                  fin_factuurregel_omschrijving,
                  fin_factuurregel_datum,
                  REPLACE (TO_CHAR (ROUND (fin_factuurregel_totaal, 2)),
                           ',',
                           '.')
                     fin_factuurregel_totaal,
                  TO_CHAR (fin_factuurregel_btw_perc) btw_percentage,
                  fin_btwtabelwaarde_btwcode btw_code,
                  REPLACE (TO_CHAR (ROUND (fin_factuurregel_btw, 2)),
                           ',',
                           '.')
                     btw_bedrag,
                  prs_kostenplaats_nr
             FROM wzuv_v_factuur_geg_akkoord fg
           ORDER BY fin_factuur_key, regelnummer);

CREATE OR REPLACE VIEW wzuv_v_export_fclt_factuur (result, result_order)
AS
   SELECT '<xml>', 0 FROM DUAL
   UNION
   SELECT result, result_order FROM wzuv_v_fclt_factuur_header
   UNION
   SELECT result, result_order FROM wzuv_v_fclt_factuur_body
   UNION
   SELECT '</xml>', 99999999999999999999 FROM DUAL;



CREATE OR REPLACE PROCEDURE wzuv_export_fclt_factuur (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2,
   p_filedir    IN VARCHAR2,
   p_filename   IN VARCHAR2)
AS
   -- In cursor cfactuur alle facturen die worden geexporteerd...
   CURSOR cfactuur
   IS
        SELECT fin_factuur_key
          FROM wzuv_v_factuur_geg_akkoord
      GROUP BY fin_factuur_key;
BEGIN
   -- DE EXPORT IS OP BASIS VAN EEN VIEW GEREALISEERD, WAARNA NU ALS LAATSTE STAP NOG WAT ADMINISTRATIE VOLGT...
   FOR cfact IN cfactuur
   LOOP
      -- Zowel de factuur in tracking zetten als de status op verwerkt (=7) zetten
      fin.setfactuurstatus (cfact.fin_factuur_key, 7, NULL);
   END LOOP;
END;
/

CREATE OR REPLACE VIEW wzuv_v_export_undo_exact
(
   result,
   result_order
)
AS
   SELECT REPLACE (
             REPLACE (
                   f.fin_factuur_key
                || ';'
                || opdracht_id
                || ';'
                || fin_factuur_datum
                || ';'
                || fin_factuur_nr
                || ';'
                || prs_bedrijf_key
                || ';'
                || fin_factuurregel_totaal
                || ';'
                || fin_factuurregel_btw
                || ';'
                || fin_factuurregel_nr
                || ';'
                || fin_factuur_debiteur_nr
                || ';'
                || project_nummer
                || ';'
                || prs_kostensoort_oms
                || ';'
                || bes_opdr_key
                || ';'
                || mld_opdr_key
                || ';'
                || cnt_contract_key,
                CHR (13),
                ''),
             CHR (10),
             '<ret>'),
          f.fin_factuur_key
     FROM wzuv_v_factuur_geg f, fac_tracking t, fac_srtnotificatie sn
    WHERE sn.fac_srtnotificatie_code = 'FINVER'
          AND sn.fac_srtnotificatie_key = t.fac_srtnotificatie_key
          AND t.fac_tracking_datum >=
                (SELECT MAX (t1.fac_tracking_datum) - (1 / (24 * 60))
                   FROM fac_tracking t1
                  WHERE t1.fac_srtnotificatie_key = t.fac_srtnotificatie_key)
          AND f.fin_factuur_key = t.fac_tracking_refkey
          AND f.fin_factuur_statuses_key = 7;



CREATE OR REPLACE PROCEDURE wzuv_select_undo_exact (p_applname   IN VARCHAR2,
                                                    p_applrun    IN VARCHAR2)
AS
   v_errormsg   VARCHAR (200);
BEGIN
   v_errormsg := 'Geen akties';
END;
/

-- Procedure om alle geexporteerde facturen naar status verwerkt te zetten.

CREATE OR REPLACE PROCEDURE wzuv_export_undo_exact (p_applname   IN VARCHAR2,
                                                    p_applrun    IN VARCHAR2,
                                                    p_filedir    IN VARCHAR2,
                                                    p_filename   IN VARCHAR2)
AS
   CURSOR cfactuur
   IS
      SELECT DISTINCT f.fin_factuur_key
        FROM fac_tracking t, fac_srtnotificatie sn, fin_factuur f
       WHERE sn.fac_srtnotificatie_code = 'FINVER'
             AND sn.fac_srtnotificatie_key = t.fac_srtnotificatie_key
             AND t.fac_tracking_datum >=
                   (SELECT MAX (t1.fac_tracking_datum) - (1 / (24 * 60))
                      FROM fac_tracking t1
                     WHERE t1.fac_srtnotificatie_key =
                              t.fac_srtnotificatie_key)
             AND f.fin_factuur_key = t.fac_tracking_refkey
             AND fin_factuur_statuses_key = 7;

   v_errormsg       VARCHAR (200);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
BEGIN
   v_errormsg := 'Geen akties';

   FOR cfact IN cfactuur
   LOOP
      -- Eerst de factuur in tracking zetten...
      -- Omdat van 7 naar 6 niet mag/geoorloofd is, lukt het niet via
      -- de reguliere functie fin.setfactuurstatus (cfact.fin_factuur_key, 6, NULL);

      -- Dan maar zelf en custom-made:
      fac.trackaction ('FINFOK',
                       cfact.fin_factuur_key,
                       NULL,
                       NULL,
                       'Factuur uit archief teruggezet');

      UPDATE fin_factuur
         SET fin_factuur_statuses_key = 6
       WHERE fin_factuur_key = cfact.fin_factuur_key;
   END LOOP;
END;
/

-- ===================================
-- EINDE VIEWS EN PROCS VOOR DE EXACT KOPPELING
-- ===================================

CREATE OR REPLACE PROCEDURE wzuv_processemail (
   pfrom        IN VARCHAR2,
   pto          IN VARCHAR2,
   psubject     IN VARCHAR2,
   pbody        IN VARCHAR2,
   psessionid   IN VARCHAR2,
   puserkey     IN NUMBER DEFAULT NULL)
AS
   v_count             NUMBER;
   sender              prs_perslid.prs_perslid_key%TYPE;
   kostenplaats        prs_afdeling.prs_kostenplaats_key%TYPE;
   newkey              mld_melding.mld_melding_key%TYPE;
   defaultstdmelding   fac_setting.fac_setting_default%TYPE;
   -- kkey                mld_kenmerk.mld_kenmerk_key%TYPE;
   errormsg            fac_result.fac_result_waarde%TYPE;
BEGIN
   -- Valideer de sender in pfrom: kennen we deze?
   SELECT COUNT ( * )
     INTO v_count
     FROM prs_perslid p, prs_afdeling d
    WHERE p.prs_afdeling_key = d.prs_afdeling_key
          AND UPPER (prs_perslid_email) = UPPER (pfrom);

   -- Bekende afzender --> dat is de melder
   IF (v_count = 1)
   THEN
      SELECT prs_perslid_key, d.prs_kostenplaats_key
        INTO sender, kostenplaats
        FROM prs_perslid p, prs_afdeling d
       WHERE p.prs_afdeling_key = d.prs_afdeling_key
             AND UPPER (prs_perslid_email) = UPPER (pfrom);
   -- Geen bekende afzender --> _FACILITOR
   ELSE
      SELECT prs_perslid_key, d.prs_kostenplaats_key
        INTO sender, kostenplaats
        FROM prs_perslid p, prs_afdeling d
       WHERE p.prs_afdeling_key = d.prs_afdeling_key AND prs_perslid_key = 3;
   END IF;

   CASE
      -- WZUV#51384: bij het overlijden van een patiënt moet een mailtje naar Facilitor de melding aanroepen en de workflow starten
      WHEN UPPER (pto) LIKE 'OVERLIJDEN@%'
      THEN
         defaultstdmelding := '461';

         -- suggested extensions:
         -- check for MLDUSE-write autorisations
         -- parse the subject to find an appropriate stdmelding, if uniquely possible
         BEGIN
            INSERT INTO mld_melding (mld_melding_module,
                                     mld_meldbron_key,
                                     mld_melding_datum,
                                     mld_melding_onderwerp,
                                     mld_melding_omschrijving,
                                     mld_melding_status,
                                     mld_stdmelding_key,
                                     mld_alg_locatie_key,
                                     prs_perslid_key,
                                     prs_perslid_key_voor,
                                     prs_kostenplaats_key,
                                     mld_melding_spoed)
                VALUES ('MLD',
                        4,                                            -- email
                        SYSDATE,
                        SUBSTR (psubject, 1, 60),
                        SUBSTR (
                           REPLACE (
                              SUBSTR (pbody, 1, 4000),
                              CHR (13) || CHR (10) || CHR (13) || CHR (10),
                              CHR (13) || CHR (10)),
                           1,
                           4000),              -- verwijder onnodige witregels
                        NULL,
                        defaultstdmelding,
                        1, -- Hoe bepalen we de locatie? Nu maar even op 1 = Epe gezet
                        sender,
                        sender,
                        kostenplaats,
                        3)
             RETURNING mld_melding_key
                  INTO newkey;

            -- In geval van overlijden moet een workflow gestart worden
            -- de startmelding krijgt status 5 en de volgende stap kan opgestart worden
            mld.setmeldingstatus (newkey, 5, sender);
            mld.mld_nextworkflowstep (newkey, 1);               -- 1=Completed


            INSERT INTO fac_result (fac_result_sessionid,
                                    fac_result_naam,
                                    fac_result_waarde)
                VALUES (psessionid,
                        'maillog',
                        'Geregistreerd onder melding ' || newkey);
         END;
      ELSE
         NULL;
   END CASE;

   IF errormsg IS NOT NULL
   THEN
      INSERT INTO fac_result (fac_result_sessionid,
                              fac_result_naam,
                              fac_result_waarde)
          VALUES (psessionid, 'errormsg', errormsg);
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      fac.writelog (
         'PROCESSEMAIL',
         'W',
            'Mail kon niet verwerkt worden afzender: '
         || pfrom
         || '['
         || errormsg
         || ']',
            'OTHERS (error '
         || SQLCODE
         || '/'
         || SUBSTR (SQLERRM, 1, 100)
         || ')');

      INSERT INTO fac_result (fac_result_sessionid,
                              fac_result_naam,
                              fac_result_waarde)
          VALUES (psessionid,
                  'errormsg',
                  'Database fout - Neem contact op met uw systeembeheerder');
END wzuv_processemail;
/


--- notificaties bij vrijkomen appartement
-- op diverse momenten moeten verschilllende medewerkers bericht ontvangen
-- direct bij melding overlijden krijgen huismeester, receptie en keuken bericht

CREATE OR REPLACE VIEW WZUV_V_NOTI_VRIJKOMEN_APP1
(
   SENDER,
   RECEIVER,
   TEXT,
   CODE,
   FAC_SRTNOTIFICATIE_KEY,
   KEY,
   XKEY,
   XEMAIL,
   XMOBILE
)
AS
   SELECT DISTINCT
          NULL sender,
          NULL receiver,
             'Melding vrijkomen '
          || og.alg_gebouw_naam
          || ' '
          || og.alg_plaatsomschrijving,
          fac_srtnotificatie_code,
          n.fac_srtnotificatie_key,
          m.mld_melding_key,
          NULL xkey,
          huismeester.prs_perslid_email xemail,
          NULL xmobile
     FROM fac_tracking t,
          mld_melding m,
          fac_srtnotificatie n,
          alg_v_allonrgoed_gegevens og,
          (SELECT ok.alg_onrgoed_key,
                  ok.alg_onrgoedkenmerk_waarde,
                  p.prs_perslid_voornaam,
                  p.prs_perslid_email
             FROM alg_onrgoedkenmerk ok, alg_kenmerk k, prs_perslid p
            WHERE ok.alg_kenmerk_key = k.alg_kenmerk_key
                  AND ok.alg_onrgoedkenmerk_waarde =
                        TO_CHAR (p.prs_perslid_key)
                  AND UPPER (k.alg_kenmerk_omschrijving) LIKE '%HUISMEESTER%') -- de juiste huismeester wordt bepaald op basis van het gebouw waar de cliënt woonachtig was
          huismeester
    WHERE     T.FAC_TRACKING_REFKEY = M.MLD_MELDING_KEY
          AND N.FAC_SRTNOTIFICATIE_CODE = 'CUST01'
          AND T.FAC_SRTNOTIFICATIE_KEY = 44                          -- mldnew
          AND M.MLD_STDMELDING_KEY = 521 -- startmelding opleveren appartement
          AND M.MLD_ALG_ONROERENDGOED_KEYS = OG.ALG_ONROERENDGOED_KEYS
          AND OG.ALG_GEBOUW_KEY = huismeester.ALG_ONRGOED_KEY
          AND t.fac_tracking_datum >
                (SELECT fac_notificatie_job_nextrun
                        - fac_notificatie_job_interval / 24
                   FROM fac_notificatie_job
                  WHERE UPPER (fac_notificatie_job_view) =
                           'WZUV_V_NOTI_VRIJKOMEN_APP1')
          AND t.fac_tracking_datum <
                (SELECT fac_notificatie_job_nextrun
                   FROM fac_notificatie_job
                  WHERE UPPER (fac_notificatie_job_view) =
                           'WZUV_V_NOTI_VRIJKOMEN_APP1')
   UNION ALL
   SELECT DISTINCT -- receptie: het mail adres van de receptie is per gebouw vastgelegd
          NULL sender,
          NULL receiver,
             'Melding vrijkomen '
          || og.alg_gebouw_naam
          || ' '
          || og.alg_plaatsomschrijving,
          fac_srtnotificatie_code,
          n.fac_srtnotificatie_key,
          m.mld_melding_key,
          NULL xkey,
          g.alg_gebouw_email xemail,
          NULL xmobile
     FROM fac_tracking t,
          mld_melding m,
          fac_srtnotificatie n,
          alg_v_allonrgoed_gegevens og,
          alg_gebouw g
    WHERE     T.FAC_TRACKING_REFKEY = M.MLD_MELDING_KEY
          AND T.FAC_SRTNOTIFICATIE_KEY = 44
          AND N.FAC_SRTNOTIFICATIE_CODE = 'CUST01'
          AND M.MLD_STDMELDING_KEY = 521 -- startmelding opleveren appartement
          AND M.MLD_ALG_ONROERENDGOED_KEYS = OG.ALG_ONROERENDGOED_KEYS
          AND OG.ALG_GEBOUW_KEY = G.ALG_GEBOUW_KEY
          AND t.fac_tracking_datum >
                (SELECT fac_notificatie_job_nextrun
                        - fac_notificatie_job_interval / 24
                   FROM fac_notificatie_job
                  WHERE UPPER (fac_notificatie_job_view) =
                           'WZUV_V_NOTI_VRIJKOMEN_APP1')
          AND t.fac_tracking_datum <
                (SELECT fac_notificatie_job_nextrun
                   FROM fac_notificatie_job
                  WHERE UPPER (fac_notificatie_job_view) =
                           'WZUV_V_NOTI_VRIJKOMEN_APP1')
   UNION ALL
   SELECT DISTINCT    -- de cateraar: er is per locatie 1 cateraar (gebruiker)
          NULL sender,
          NULL receiver,
             'Melding vrijkomen '
          || og.alg_gebouw_naam
          || ' '
          || og.alg_plaatsomschrijving,
          fac_srtnotificatie_code,
          n.fac_srtnotificatie_key,
          m.mld_melding_key,
          NULL xkey,
          p.prs_perslid_email xemail,
          NULL xmobile
     FROM fac_tracking t,
          mld_melding m,
          fac_srtnotificatie n,
          alg_v_allonrgoed_gegevens og,
          alg_gebouw g,
          prs_perslid p
    WHERE     T.FAC_TRACKING_REFKEY = M.MLD_MELDING_KEY
          AND T.FAC_SRTNOTIFICATIE_KEY = 44
          AND N.FAC_SRTNOTIFICATIE_CODE = 'CUST01'
          AND M.MLD_STDMELDING_KEY = 521 -- startmelding opleveren appartement
          AND M.MLD_ALG_ONROERENDGOED_KEYS = OG.ALG_ONROERENDGOED_KEYS
          AND OG.ALG_GEBOUW_KEY = G.ALG_GEBOUW_KEY
          AND P.ALG_ONROERENDGOED_KEYS = G.ALG_GEBOUW_KEY
          AND P.PRS_PERSLID_UPPER LIKE '%CATERAAR%'
          AND t.fac_tracking_datum >
                (SELECT fac_notificatie_job_nextrun
                        - fac_notificatie_job_interval / 24
                   FROM fac_notificatie_job
                  WHERE UPPER (fac_notificatie_job_view) =
                           'WZUV_V_NOTI_VRIJKOMEN_APP1')
          AND t.fac_tracking_datum <
                (SELECT fac_notificatie_job_nextrun
                   FROM fac_notificatie_job
                  WHERE UPPER (fac_notificatie_job_view) =
                           'WZUV_V_NOTI_VRIJKOMEN_APP1');

-- zodra het klusteam klaar is
-- krijgen huishouding en CSP bericht

CREATE OR REPLACE VIEW WZUV_V_NOTI_VRIJKOMEN_APP2
(
   SENDER,
   RECEIVER,
   TEXT,
   CODE,
   FAC_SRTNOTIFICATIE_KEY,
   KEY,
   XKEY,
   XEMAIL,
   XMOBILE
)
AS
   SELECT DISTINCT
          NULL sender,
          NULL receiver,
             'Melding vrijkomen '
          || og.alg_gebouw_naam
          || ' '
          || og.alg_plaatsomschrijving,
          fac_srtnotificatie_code,
          n.fac_srtnotificatie_key,
          m.mld_melding_key,
          NULL xkey,
          'm.witteveen@wzuveluwe.nl;clientservicepunt@wzuveluwe.nl' xemail,
          NULL xmobile
     FROM fac_tracking t,
          mld_melding m,
          fac_srtnotificatie n,
          alg_v_allonrgoed_gegevens og,
          alg_gebouw g,
          mld_kenmerkmelding km
    WHERE     T.FAC_TRACKING_REFKEY = M.MLD_MELDING_KEY
          AND T.FAC_SRTNOTIFICATIE_KEY = 39
          AND N.FAC_SRTNOTIFICATIE_CODE = 'CUST02'
          AND M.MLD_STDMELDING_KEY = 521 -- startmelding opleveren appartement
          AND M.MLD_ALG_ONROERENDGOED_KEYS = OG.ALG_ONROERENDGOED_KEYS
          AND OG.ALG_GEBOUW_KEY = G.ALG_GEBOUW_KEY
          AND M.MLD_MELDING_KEY = KM.MLD_MELDING_KEY
          AND KM.MLD_KENMERK_KEY = 541
          AND t.fac_tracking_datum >
                (SELECT fac_notificatie_job_nextrun
                        - fac_notificatie_job_interval / 24
                   FROM fac_notificatie_job
                  WHERE UPPER (fac_notificatie_job_view) =
                           'WZUV_V_NOTI_VRIJKOMEN_APP2')
          AND t.fac_tracking_datum <
                (SELECT fac_notificatie_job_nextrun
                   FROM fac_notificatie_job
                  WHERE UPPER (fac_notificatie_job_view) =
                           'WZUV_V_NOTI_VRIJKOMEN_APP2');

--- Als de huishouding klaar is met de schoonmaak krijgt het CSP nogmaals bericcht

CREATE OR REPLACE VIEW WZUV_V_NOTI_VRIJKOMEN_APP3
(
   SENDER,
   RECEIVER,
   TEXT,
   CODE,
   FAC_SRTNOTIFICATIE_KEY,
   KEY,
   XKEY,
   XEMAIL,
   XMOBILE
)
AS
   SELECT DISTINCT
          NULL sender,
          NULL receiver,
             'Werkzaamheden rondom vrijkomen '
          || og.alg_gebouw_naam
          || ' '
          || og.alg_plaatsomschrijving
          || ' afgerond',
          fac_srtnotificatie_code,
          n.fac_srtnotificatie_key,
          m.mld_melding_key,
          NULL xkey,
          'clientservicepunt@wzuveluwe.nl' xemail,
          NULL xmobile
     FROM fac_tracking t,
          mld_melding m,
          fac_srtnotificatie n,
          alg_v_allonrgoed_gegevens og,
          alg_gebouw g
    WHERE     T.FAC_TRACKING_REFKEY = M.MLD_MELDING_KEY
          AND T.FAC_SRTNOTIFICATIE_KEY = 39                          -- mldafm
          AND N.FAC_SRTNOTIFICATIE_CODE = 'CUST03'
          AND M.MLD_STDMELDING_KEY = 544 -- melding opleveren appartement huishouding
          AND M.MLD_ALG_ONROERENDGOED_KEYS = OG.ALG_ONROERENDGOED_KEYS
          AND OG.ALG_GEBOUW_KEY = G.ALG_GEBOUW_KEY
          AND t.fac_tracking_datum >
                (SELECT fac_notificatie_job_nextrun
                        - fac_notificatie_job_interval / 24
                   FROM fac_notificatie_job
                  WHERE UPPER (fac_notificatie_job_view) =
                           'WZUV_V_NOTI_VRIJKOMEN_APP3')
          AND t.fac_tracking_datum <
                (SELECT fac_notificatie_job_nextrun
                   FROM fac_notificatie_job
                  WHERE UPPER (fac_notificatie_job_view) =
                           'WZUV_V_NOTI_VRIJKOMEN_APP3');


-- Factuur import Nuts facturen Kenter

CREATE OR REPLACE PROCEDURE wzuv_import_fin_fact_kenter (
   p_import_key IN NUMBER)
AS
   v_seq_of_columns   VARCHAR (50);
BEGIN
   -- In de csv:
   -- Verzamelspecificatie nr. (1) ;Geadresseerde (2) ;Adres (3) ;PC Plaats (4) ;EAN code (5) ;Product (6) ;Aansluitadres: straat (7) ;Aansluitadres: huisnummer(8) ;Aansluitadres: huisnummertoevoeging (9);Aansluitadres: postcode (10);
   -- Aansluitadres: plaats (11) ;Locatiedetails (12) ;Kostenplaats (13) ;Kostendrager (14) ;Kostendrager2 (15) ;Factuurgroepering (16) ;Factuurdatum (17) ;Factuurnummer (18) ;Gestorneerde factuur (19) ;Factuurtype (20);
   -- Bedrag excl. BTW (21) ;Bedrag excl. BTW 21% (22);Bedrag excl. BTW 19% (23) ;Bedrag excl. BTW 6% (24) ;Bedrag excl. BTW 0% (25) ;Afrekentijdvak: start (26) ;Afrekentijdvak: einde (27) ;Blok 1 (28) ;Blok aantal 1 (29) ;Blok prijs 1 (30) ;
   -- Blok bedrag (excl. BTW) 1 (31) ;Blok BTW% 1 (32) ;Blok 2 (33) ;Blok aantal 2 (34) ;Blok prijs 2 (35) ;Blok bedrag (excl. BTW) 2 (36) ;Blok BTW% 2 (37);Blok 3 (38) ;Blok aantal 3 (39) ;Blok prijs 3 (40) ;
   -- Blok bedrag (excl. BTW) 3 (41);Blok BTW% 3 (42) ;Blok 4 (43) ;Blok aantal 4 (44) ;Blok prijs 4 (45) ;Blok bedrag (excl. BTW) 4 (46) ;Blok BTW% 4 (47) ;Blok 5 (48) ;Blok aantal 5 (49) ;Blok prijs 5 (50);
   -- Blok bedrag (excl. BTW) 5;Blok BTW% 5;Blok 6;Blok aantal 6;Blok prijs 6;Blok bedrag (excl. BTW) 6;Blok BTW% 6;Blok 7;Blok aantal 7;Blok prijs 7;Blok bedrag (excl. BTW) 7;Blok BTW% 7;Blok 8;Blok aantal 8;Blok prijs 8;Blok bedrag (excl. BTW) 8;Blok BTW% 8;Blok 9;Blok aantal 9;Blok prijs 9;Blok bedrag (excl. BTW) 9;Blok BTW% 9;Blok 10;Blok aantal 10;Blok prijs 10;Blok bedrag (excl. BTW) 10;Blok BTW% 10;Blok 11;Blok aantal 11;Blok prijs 11;Blok bedrag (excl. BTW) 11;Blok BTW% 11;Blok 12;Blok aantal 12;Blok prijs 12;Blok bedrag (excl. BTW) 12;Blok BTW% 12;Blok 13;Blok aantal 13;Blok prijs 13;Blok bedrag (excl. BTW) 13;Blok BTW% 13;Blok 14;Blok aantal 14;Blok prijs 14;Blok bedrag (excl. BTW) 14;Blok BTW% 14;Blok 15;Blok aantal 15;Blok prijs 15;Blok bedrag (excl. BTW) 15;Blok BTW% 15;Blok 16;Blok aantal 16;Blok prijs 16;Blok bedrag (excl. BTW) 16;Blok BTW% 16;Blok 17;Blok aantal 17;Blok prijs 17;Blok bedrag (excl. BTW) 17;Blok BTW% 17;Blok 18;Blok aantal 18;Blok prijs 18;Blok bedrag (excl. BTW) 18;Blok BTW% 18;Blok 19;Blok aantal 19;Blok prijs 19;Blok bedrag (excl. BTW) 19;Blok BTW% 19;Blok 20;Blok aantal 20;Blok prijs 20;Blok bedrag (excl. BTW) 20;Blok BTW% 20;Blok 21;Blok aantal 21;Blok prijs 21;Blok bedrag (excl. BTW) 21;Blok BTW% 21;Blok 22;Blok aantal 22;Blok prijs 22;Blok bedrag (excl. BTW) 22;Blok BTW% 22;Blok 23;Blok aantal 23;Blok prijs 23;Blok bedrag (excl. BTW) 23;Blok BTW% 23;Blok 24;Blok aantal 24;Blok prijs 24;Blok bedrag (excl. BTW) 24;Blok BTW% 24;Blok 25;Blok aantal 25;Blok prijs 25;Blok bedrag (excl. BTW) 25;Blok BTW% 25;Blok 26;Blok aantal 26;Blok prijs 26;Blok bedrag (excl. BTW) 26;Blok BTW% 26;Blok 27;Blok aantal 27;Blok prijs 27;Blok bedrag (excl. BTW) 27;Blok BTW% 27;Blok 28;Blok aantal 28;Blok prijs 28;Blok bedrag (excl. BTW) 28;Blok BTW% 28;Blok 29;Blok aantal 29;Blok prijs 29;Blok bedrag (excl. BTW) 29;Blok BTW% 29;Blok 30;Blok aantal 30;Blok prijs 30;Blok bedrag (excl. BTW) 30;Blok BTW% 30;Factuuraanbieder;BTW Bedrijfsnaam;BTW Nummer;KVK nummer
   --hulp voor pos      :  '1;2;3;4;5;6;7;8;9;0;1;2;3;4;5;6;7;8;9;0'
   v_seq_of_columns := '0;18;17;5;0;0;6;0;21;0;32;0;0;0;0;26;5;0;0;0';

   -- Variabelelijst
   -- v_leveranciernr: 1
   -- v_factuurnr: 2            (VERPLICHT, anders zet Facilitor '-' in factuurnr, en is status van factuur "Incompleet")
   -- v_factuurdatum: 3
   -- v_ordernr: 4              (VERPLICHT, anders is status van factuur "Incompleet")
   -- v_locatie: 5
   -- v_afleverdatum: 6
   -- v_omschrijving: 7
   -- v_aantal: 8
   -- v_kostprijs: 9            (VERPLICHT, anders is status van factuur "Incompleet")
   -- v_btw_bedrag: 10          (VERPLICHT, of anders veld 11, anders is status van factuur "Incompleet")
   -- v_btw: 11                 (VERPLICHT, of anders veld 10, anders is status van factuur "Incompleet")
   -- v_docid: 12
   -- v_debiteur_nr: 13
   -- v_opmerking: 14
   -- v_btw_verlegd: 15         (VERPLICHT, Ja/Nee/<leeg> waarbij leeg gelijk is aan Nee. Andere waarden leidt tot "Incompleet")
   -- v_kenmerk1: 16
   -- v_kenmerk1: 17
   -- v_kenmerk1: 18
   -- v_kenmerk1: 19
   -- v_kenmerk1: 20
   -- v_boekmaand: 21

   fac_import_factuur_body (p_import_key, v_seq_of_columns);

   -- De header regel kan verwijderd worden
   DELETE fac_imp_factuur f
    WHERE f.factuurnr = 'Factuurnummer';

   -- Het EAN nummer bevat nog een '  deze moet verwijderd worden
   UPDATE fac_imp_factuur
      SET kenmerk2 = SUBSTR (kenmerk2, 2, 18);

   -- Voeg prefix C toe aan het contractnummer van het actieve contract van Liander
   -- het juiste contract kan bepaald worden op basis van het EAN nummer dat in kenmerkveldje 2 staat
   UPDATE fac_imp_factuur f
      SET f.ordernr =
             (SELECT DECODE (
                        cnt_contract_versie,
                        NULL,
                        'C' || c.cnt_contract_nummer_intern,
                           'C'
                        || c.cnt_contract_nummer_intern
                        || '.'
                        || cnt_contract_versie)
                        AS orderid
                FROM cnt_kenmerkcontract kc,
                     cnt_kenmerk k,
                     cnt_srtkenmerk sk,
                     cnt_contract c,
                     prs_bedrijf b
               WHERE     kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                     AND k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                     AND kc.cnt_contract_key = c.cnt_contract_key
                     AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
                     AND b.prs_bedrijf_naam_upper LIKE '%KENTER%'
                     AND UPPER (sk.cnt_srtkenmerk_omschrijving) LIKE '%EAN%'
                     AND cnt_kenmerkcontract_waarde = f.kenmerk2);

   -- de boekmaand is de maand waarover de factuur betrekking heeft
   -- het kenmerk veld bevat de begindatum van deze maand dus daar extraheren we het jaar en de maand uit
   UPDATE fac_imp_factuur f
      SET f.boekmaand = SUBSTR (kenmerk1, 7, 4) || SUBSTR (kenmerk1, 3, 3)
    WHERE kenmerk1 IS NOT NULL;

   -- per boekmaand moet een factuur geboekt worden
   -- dus die plakken we voor nu maar even achter het factuurnummer
   UPDATE fac_imp_factuur f
      SET F.FACTUURNR = F.FACTUURNR || '/' || F.BOEKMAAND
    WHERE kenmerk1 IS NOT NULL;

   COMMIT;
END;
/

CREATE OR REPLACE PROCEDURE wzuv_update_fin_fact_kenter (
   p_import_key IN NUMBER)
AS
BEGIN
   -- Standaard FCLT verwerk import facturen
   fac_update_factuur (p_import_key);

   -- Bij de import hebben we de facturen gesplits naar periode
   -- Deze splitsing maken we nu weer ongedaan
   UPDATE fin_factuur f
      SET f.fin_factuur_nr =
             SUBSTR (f.fin_factuur_nr, 1, INSTR (f.fin_factuur_nr, '/') - 1)
    WHERE f.fin_factuur_key IN (SELECT i.fin_factuur_key
                                  FROM fac_imp_factuur i
                                 WHERE i.fac_import_key = p_import_key);
END;
/


--View voor Notificatie bij Rapeldatum contract bereikt
CREATE OR REPLACE  VIEW WZUV_V_NOTI_CNTREMINDER
(
    CODE,
    SENDER,
    RECEIVER,
    TEXT,
    KEY,
    PAR1,
    PAR2,
    XKEY
)
AS
    SELECT '',
           '',
           c.prs_perslid_key_beh,
              'Rappel: Contract '
           || c.cnt_contract_nummer_intern
           || DECODE (cnt_contract_versie,
                      NULL, '',
                      '.' || cnt_contract_versie)
           || ' ('
           || c.cnt_contract_omschrijving
           || ' '
           || b.prs_bedrijf_naam
           || ')'
           || ' moet uiterlijk per '
           || TO_CHAR (cnt.cnt_getopzegdatum (c.cnt_contract_key),
                       'DD-MM-YYYY')
           || ' worden verlengd of opgezegd.',
           c.cnt_contract_key,
           c.cnt_contract_nummer_intern,
           cnt.cnt_getopzegdatum (c.cnt_contract_key),
           NULL
      FROM cnt_v_aanwezigcontract c, prs_bedrijf b
     WHERE     b.prs_bedrijf_key = c.cnt_prs_bedrijf_key
           AND cnt_contract_verwijder IS NULL
           AND cnt_contract_status = 0
           AND (SYSDATE BETWEEN cnt.cnt_getrappeldatum (c.cnt_contract_key)
                            AND cnt.cnt_getopzegdatum (c.cnt_contract_key)) 
     UNION ALL 
    SELECT '',
           '',
           c.prs_perslid_key_eig,
              'Rappel: Contract '
           || c.cnt_contract_nummer_intern
           || DECODE (cnt_contract_versie,
                      NULL, '',
                      '.' || cnt_contract_versie)
           || ' ('
           || c.cnt_contract_omschrijving
           || ' '
           || b.prs_bedrijf_naam
           || ')'
           || ' moet uiterlijk per '
           || TO_CHAR (cnt.cnt_getopzegdatum (c.cnt_contract_key),
                       'DD-MM-YYYY')
           || ' worden verlengd of opgezegd.',
           c.cnt_contract_key,
           c.cnt_contract_nummer_intern,
           cnt.cnt_getopzegdatum (c.cnt_contract_key),
           NULL
      FROM cnt_v_aanwezigcontract c, prs_bedrijf b
     WHERE     b.prs_bedrijf_key = c.cnt_prs_bedrijf_key
           AND cnt_contract_verwijder IS NULL
           AND cnt_contract_status = 0
           AND (SYSDATE BETWEEN cnt.cnt_getrappeldatum (c.cnt_contract_key)
                            AND cnt.cnt_getopzegdatum (c.cnt_contract_key));


CREATE OR REPLACE VIEW WZUV_V_RAP_CONTROLE_RES
(
   SOORT,
   DATUM,
   NEDAPNR,
   KOSTENPLAATS,
   KOSTENSOORT,
   RES_NR,
   NO_SHOW,
   STATUS,
   OMSCHRIJVING,
   RUIMTE,
   RUIMTE_PRIJS,
   CATERING_PRIJS,
   NAAM_GEFACTUREERDE,
   FACTUURADRES,
   PC_PLAATS
)
AS
     SELECT DECODE (res.fclt_3d_afdeling_key,
                    422, 'Extern - Cliënt',
                    441, 'Extern - Overig',
                    'Intern')
               activiteitensoort,
            van,
            CASE
               WHEN UPPER (personeelsnr) LIKE 'NEDAP%'
               THEN
                  SUBSTR (personeelsnr, 7)
               ELSE
                  ''
            END
               AS NEDAPnr,
               kpl.prs_kostenplaats_nr
            || '- '
            || kpl.prs_kostenplaats_omschrijving,
            res.kostensoort,
            nummer,
            no_show,
            bostatus,
            res_omschrijving,
            ruimte,
            res.getruimteprijs (rrr.res_rsv_ruimte_key) ruimte_prijs,
            SUM (voorziening_totaalprijs) catering_prijs,
            naam_gefactureerde,
            factuuradres,
            pc_plaats
       FROM res_v_udr_reserveringincl res,
            prs_afdeling afd,
            res_rsv_ruimte rrr,
            prs_kostenplaats kpl,
            (SELECT res_rsv_ruimte_key,
                    res_kenmerkreservering_waarde naam_gefactureerde
               FROM res_kenmerkwaarde kw, res_kenmerk km, res_srtkenmerk skm
              WHERE     kw.res_kenmerk_key = km.res_kenmerk_key
                    AND km.res_srtkenmerk_key = skm.res_srtkenmerk_key
                    AND res_srtkenmerk_upper LIKE '%NAAM GEFACTUREERDE%')
            gefactureerde,
            (SELECT res_rsv_ruimte_key,
                    res_kenmerkreservering_waarde factuuradres
               FROM res_kenmerkwaarde kw, res_kenmerk km, res_srtkenmerk skm
              WHERE     kw.res_kenmerk_key = km.res_kenmerk_key
                    AND km.res_srtkenmerk_key = skm.res_srtkenmerk_key
                    AND res_srtkenmerk_upper LIKE 'ADRES%') adres,
            (SELECT res_rsv_ruimte_key, res_kenmerkreservering_waarde pc_plaats
               FROM res_kenmerkwaarde kw, res_kenmerk km, res_srtkenmerk skm
              WHERE     kw.res_kenmerk_key = km.res_kenmerk_key
                    AND km.res_srtkenmerk_key = skm.res_srtkenmerk_key
                    AND res_srtkenmerk_upper LIKE 'POSTCODE%') postcode
      WHERE     res.fclt_3d_afdeling_key = afd.prs_afdeling_key
            AND rrr.res_rsv_ruimte_key = res.key
            AND afd.prs_kostenplaats_key = kpl.prs_kostenplaats_key
            AND res.key = gefactureerde.res_rsv_ruimte_key(+)
            AND res.key = adres.res_rsv_ruimte_key(+)
            AND res.key = postcode.res_rsv_ruimte_key(+)
   GROUP BY res.fclt_3d_afdeling_key,
            van,
            personeelsnr,
            kpl.prs_kostenplaats_nr,
            kpl.prs_kostenplaats_omschrijving,
            kostensoort,
            nummer,
            no_show,
            bostatus,
            res_omschrijving,
            ruimte,
            rrr.res_rsv_ruimte_key,
            naam_gefactureerde,
            factuuradres,
            pc_plaats
   ORDER BY van, nummer;


CREATE OR REPLACE PROCEDURE wzuv_fin_upsertkenmerk (
   f_kenmerk_key      IN NUMBER,
   f_fact_key         IN NUMBER,
   f_kenmerk_waarde   IN VARCHAR2)
AS
   v_count    NUMBER;
   v_niveau   VARCHAR2 (1);
BEGIN
   -- Is er al een actuele waarde?
   SELECT COUNT ( * )
     INTO v_count
     FROM fin_kenmerkfactuur
    WHERE     fin_factuur_key = f_fact_key
          AND fin_kenmerk_key = f_kenmerk_key
          AND fin_kenmerkfactuur_verwijder IS NULL;

   IF v_count = 1
   THEN
      IF f_kenmerk_waarde IS NULL
      THEN
         -- Er was al een waarde maar nu is de waarde leeg: Wissen bestaande waarde
         DELETE fin_kenmerkfactuur
          WHERE     fin_factuur_key = f_fact_key
                AND fin_kenmerk_key = f_kenmerk_key
                AND fin_kenmerkfactuur_verwijder IS NULL;
      ELSE
         -- Er was al een waarde maar er wordt ook een waarde meegegeven: Bijwerken bestaande waarde
         UPDATE fin_kenmerkfactuur
            SET fin_kenmerkfactuur_waarde = f_kenmerk_waarde
          WHERE     fin_factuur_key = f_fact_key
                AND fin_kenmerk_key = f_kenmerk_key
                AND fin_kenmerkfactuur_verwijder IS NULL;
      END IF;
   ELSE
      IF f_kenmerk_key IS NOT NULL AND f_kenmerk_waarde IS NOT NULL
      THEN
         -- Er was nog geen waarde en er wordt een waarde meegegeven: Registreren waarde
         INSERT INTO FIN_KENMERKFACTUUR (fin_factuur_key,
                                         fin_kenmerk_key,
                                         fin_kenmerkfactuur_waarde)
             VALUES (f_fact_key, f_kenmerk_key, f_kenmerk_waarde);
      END IF;
   END IF;
END;
/

CREATE OR REPLACE PROCEDURE wzuv_export_ks_topbloemen (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2,
   p_filedir    IN VARCHAR2,
   p_filename   IN VARCHAR2)
AS
   -- In cursor c_factuur alle facturen die gerelateerd zijn aan een bestelling bij Topbloemen en die nog geen kostensoort hebben
   CURSOR c_factuur
   IS
      SELECT fac.fin_factuur_key
        FROM fin_factuur fac, prs_bedrijf b, bes_bestelopdr bo
       WHERE     b.prs_bedrijf_naam_upper LIKE '%TOPBLOEMEN%'
             AND b.prs_bedrijf_key = bo.prs_bedrijf_key
             AND fac.bes_bestelopdr_key = bo.bes_bestelopdr_key
             AND fac.prs_kostensoort_key IS NULL;
BEGIN
   FOR rec IN c_factuur
   LOOP
      -- voor alle facturen van Topbloemen waarbij nog geen kostensoort bekend is, moet de kostensoort herleid worden uit het kenmerk
      UPDATE fin_factuur fac
         SET fac.prs_kostensoort_key =
                (SELECT ks.prs_kostensoort_key
                   FROM prs_bedrijf b,
                        bes_bestelopdr bo,
                        bes_bestelling bes,
                        bes_kenmerkbestell kb,
                        bes_kenmerk km,
                        bes_srtkenmerk sk,
                        fac_usrdata kw,
                        prs_kostensoort ks
                  WHERE b.prs_bedrijf_naam_upper LIKE '%TOPBLOEMEN%'
                        AND b.prs_bedrijf_key = bo.prs_bedrijf_key
                        AND SUBSTR (bes_bestelopdr_id,
                                    1,
                                    INSTR (bes_bestelopdr_id, '/') - 1) =
                              bes.bes_bestelling_key(+)
                        AND kb.bes_bestelling_key = bes.bes_bestelling_key
                        AND kb.bes_kenmerkbestell_waarde =
                              TO_CHAR (kw.fac_usrdata_key)
                        AND TO_CHAR (kw.fac_usrdata_prijs) =
                              ks.prs_kostensoort_upper
                        AND kb.bes_kenmerk_key = km.bes_kenmerk_key
                        AND sk.bes_srtkenmerk_key = km.bes_srtkenmerk_key
                        AND fac.bes_bestelopdr_key = bo.bes_bestelopdr_key
                        AND sk.bes_srtkenmerk_upper = 'ATTENTIEPROTOCOL')
       WHERE fac.fin_factuur_key = rec.fin_factuur_key;
   END LOOP;
END;
/

CREATE OR REPLACE PROCEDURE wzuv_import_fin_fact_care4flex (
   p_import_key IN NUMBER)
AS
   v_seq_of_columns   VARCHAR (50);
BEGIN
   -- eerst de kopregel maar even weggooien
   DELETE FAC_IMP_FILE
    WHERE fac_import_key = p_import_key
          AND UPPER (fac_imp_file_line) LIKE
                'INVOICE_ID;INVOICE_NUMBER;INVOICE_PLACE;INVOICE_DATE;%';

   -- In de csv factuurnr;
   -- 1 INVOICE_ID;2 INVOICE_NUMBER;3 INVOICE_PLACE;4 INVOICE_DATE;5 INVOICE_TYPE;6 INVOICE_DEBTOR_REFERENCE;7 INVOICE_PROJECT_NUMBER;8 INVOICE_JOB_DESCRIPTION;9 INVOICE_DEBTOR_NAME;10 INVOICE_DEBTOR_FINANCIAL_CONTACT;
   -- 11 INVOICE_DEBTOR_ADDRESS;12 INVOICE_DEBTOR_POSTCODE;13 INVOICE_DEBTOR_PLACE;14 INVOICE_SUBTOTAL;15 INVOICE_VAT;16 INVOICE_DISCOUNT;17 INVOICE_TOTAL;18 INVOICE_G_ACCOUNT_YN;19 INVOICE_G_ACCOUNT_PCT;20 INVOICE_PAYMENT_TERM;
   -- 21 INVOICE_NOTES;22 INVOICE_VAT_NUMBER;23 INVOICE_DETAIL_WORKSHEET_WEEK;24 INVOICE_DETAIL_QUANTITY;25 INVOICE_DETAIL_PERCENTAGE;26 INVOICE_DETAIL_DESCRIPTION;27 INVOICE_DETAIL_TARIFF;28 INVOICE_DETAIL_DISCOUNT;29 INVOICE_DETAIL_VAT_PERCENTAGE;30 INVOICE_DETAIL_SUB_TOTAL;
   -- 31 WORKER_INITIALS;32 WORKER_FIRSTNAMES;33 WORKER_MIDDLENAME;34 WORKER_SURNAME;35 WORKER_MAIDEN_NAME;36 ADMINISTRATION_ID;37 ADMINISTRATION_NAME;38 ADMINISTRATION_ADDRESS;39 ADMINISTRATION_POSTCODE;40 ADMINISTRATION_PLACE;
   -- 41 ADMINISTRATION_PHONE;42 ADMINISTRATION_FAX;43 ADMINISTRATION_WEBSITE;44 ADMINISTRATION_KVK_NUMBER;45 ADMINISTRATION_VAT_NUMBER;46 ADMINISTRATION_IBAN;47 ADMINISTRATION_IBAN_G_ACCOUNT
   --hulp voor pos      :  '1;2;3;4;5;6;7;8;9;0;1;2;3;14;15;16;7;8;9;0'
   v_seq_of_columns := '0;2;4;0;0;0;23;24;30;0;29;0;0;26;0;7;31;32;33;34';

   -- Variabelelijst
   -- v_leveranciernr: 1
   -- v_factuurnr: 2            (VERPLICHT, anders zet Facilitor '-' in factuurnr, en is status van factuur "Incompleet")
   -- v_factuurdatum: 3
   -- v_ordernr: 4              (VERPLICHT, anders is status van factuur "Incompleet")
   -- v_locatie: 5
   -- v_afleverdatum: 6
   -- v_omschrijving: 7
   -- v_aantal: 8
   -- v_kostprijs: 9            (VERPLICHT, anders is status van factuur "Incompleet")
   -- v_btw_bedrag: 10          (VERPLICHT, of anders veld 11, anders is status van factuur "Incompleet")
   -- v_btw: 11                 (VERPLICHT, of anders veld 10, anders is status van factuur "Incompleet")
   -- v_docid: 12
   -- v_debiteur_nr: 13
   -- v_opmerking: 14
   -- v_btw_verlegd: 15         (VERPLICHT, Ja/Nee/<leeg> waarbij leeg gelijk is aan Nee. Andere waarden leidt tot "Incompleet")
   -- v_kenmerk1: 16
   -- v_kenmerk1: 17
   -- v_kenmerk1: 18
   -- v_kenmerk1: 19
   -- v_kenmerk1: 20
   -- v_boekmaand: 21

   fac_import_factuur_body (p_import_key, v_seq_of_columns);

   -- Dan de achternaam samenstellen
   UPDATE fac_imp_factuur f
      SET f.kenmerk6 =
             CASE
                WHEN f.kenmerk4 IS NOT NULL
                THEN
                   f.kenmerk4 || ' ' || f.kenmerk5
                ELSE
                   f.kenmerk5
             END;

   -- Dan de omschrijving van de factuurregel volledig samenstellen
   UPDATE fac_imp_factuur f
      SET f.omschrijving =
             CASE
                WHEN UPPER (opmerking) = 'UREN'
                THEN
                      'Week '
                   || f.omschrijving
                   || ' - '
                   || f.kenmerk2
                   || ' '
                   || f.kenmerk6
                   || ' - '
                   || f.aantal
                   || ' '
                   || f.opmerking
                ELSE
                      'Week '
                   || f.omschrijving
                   || ' - '
                   || f.kenmerk2
                   || ' '
                   || f.kenmerk6
                   || ' - '
                   || f.opmerking
             END;

   -- De factuur koppelen aan het juiste contract
   UPDATE fac_imp_factuur f
      SET f.ordernr =
             (SELECT DECODE (
                        cnt_contract_versie,
                        NULL,
                        'C' || c.cnt_contract_nummer_intern,
                           'C'
                        || c.cnt_contract_nummer_intern
                        || '.'
                        || cnt_contract_versie)
                        AS orderid
                FROM cnt_kenmerkcontract kc,
                     cnt_kenmerk k,
                     cnt_srtkenmerk sk,
                     cnt_contract c,
                     prs_bedrijf b
               WHERE     kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                     AND k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                     AND kc.cnt_contract_key = c.cnt_contract_key
                     AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
                     AND c.cnt_contract_verwijder IS NULL
                     AND b.prs_bedrijf_naam_upper LIKE '%CARE4FLEX%');

   -- De kostenplaats wordt meegegeven met de factuur, vast de kpl key erbij zoeken
   UPDATE fac_imp_factuur
      SET kenmerk12 =
             (SELECT kp.prs_kostenplaats_key
                FROM prs_kostenplaats kp
               WHERE SUBSTR (kenmerk1, -4) = kp.prs_kostenplaats_nr);

   COMMIT;
END;
/


CREATE OR REPLACE PROCEDURE wzuv_update_fin_fact_care4flex (
   p_import_key IN NUMBER)
AS
   CURSOR c_factuur
   IS
      SELECT fin_factuur_key, 22, kenmerk12
        FROM fac_imp_factuur
       WHERE fin_factuur_key IS NOT NULL;
BEGIN
   -- Standaard FCLT verwerk import facturen
   fac_update_factuur (p_import_key);

   -- het goedkeuren van deze facturen moet altijd door het flexbureau gedaan worde
   UPDATE fin_factuur f
      SET f.prs_perslid_key_goedkeur =
             (SELECT p.prs_perslid_key
                FROM prs_perslid p
               WHERE p.prs_perslid_upper = 'FLEXBUREAU')
    WHERE f.fin_factuur_key IN (SELECT i.fin_factuur_key
                                  FROM fac_imp_factuur i
                                 WHERE i.fac_import_key = p_import_key);


   -- de kostenplaats is niet de kostenplaats van het contract, maar de kostenplaats die op de factuur wordt meegegeven
   -- de key was al in kenmerk12 gezet
   -- daarnaast moet er een notificatie voor het goedkeuren van de factuur aangemaakt worden
   FOR rec IN c_factuur
   LOOP
      
      BEGIN
         wzuv_fin_upsertkenmerk (22, rec.fin_factuur_key, rec.kenmerk12);
      END;
      
          fac.trackaction ('FIN2GO',
                       rec.fin_factuur_key,
                       NULL,
                       NULL,
                       'Goedkeuring voor factuur Care4Flex vereist');
      
   END LOOP;
   

                       
END;
/

CREATE OR REPLACE PROCEDURE wzuv_import_fin_fact_randstad (
   p_import_key IN NUMBER)
AS
   v_seq_of_columns   VARCHAR (50);
BEGIN
   -- In de xsl factuurnr(1);factuurdatum(2);omschrijving(3);bedrag(4);btwperc(5);btwbedrag(6);omschr(7);weeknummer(8);Kostenplaats(9);pdf(10);aantal(11);naam(12)
   --hulp voor pos      :  '1;2;3;4;5;6;7;8;9;0;1;2;3;14;15;16;7;8;9;0'
   v_seq_of_columns := '12;1;2;0;0;0;3;0;4;6;0;10;0;0;0;7;8;9;11;0';

   -- Variabelelijst
   -- v_leveranciernr: 1
   -- v_factuurnr: 2            (VERPLICHT, anders zet Facilitor '-' in factuurnr, en is status van factuur "Incompleet")
   -- v_factuurdatum: 3
   -- v_ordernr: 4              (VERPLICHT, anders is status van factuur "Incompleet")
   -- v_locatie: 5
   -- v_afleverdatum: 6
   -- v_omschrijving: 7
   -- v_aantal: 8
   -- v_kostprijs: 9            (VERPLICHT, anders is status van factuur "Incompleet")
   -- v_btw_bedrag: 10          (VERPLICHT, of anders veld 11, anders is status van factuur "Incompleet")
   -- v_btw: 11                 (VERPLICHT, of anders veld 10, anders is status van factuur "Incompleet")
   -- v_docid: 12
   -- v_debiteur_nr: 13
   -- v_opmerking: 14
   -- v_btw_verlegd: 15         (VERPLICHT, Ja/Nee/<leeg> waarbij leeg gelijk is aan Nee. Andere waarden leidt tot "Incompleet")
   -- v_kenmerk1: 16
   -- v_kenmerk1: 17
   -- v_kenmerk1: 18
   -- v_kenmerk1: 19
   -- v_kenmerk1: 20
   -- v_boekmaand: 21

   fac_import_factuur_body (p_import_key, v_seq_of_columns);

   -- De factuur koppelen aan het juiste contract
   UPDATE fac_imp_factuur f
      SET f.ordernr =
             (SELECT DECODE (
          cnt_contract_versie,
          NULL,
          'C' || c.cnt_contract_nummer_intern,
          'C' || c.cnt_contract_nummer_intern || '.' || cnt_contract_versie)
          AS orderid
  FROM cnt_contract c, prs_bedrijf b
 WHERE     c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
       AND c.cnt_contract_verwijder IS NULL
       AND b.prs_bedrijf_naam_upper LIKE '%RANDSTAD%');

   -- De kostenplaats wordt meegegeven met de factuur, vast de kpl key erbij zoeken
   UPDATE fac_imp_factuur
      SET kenmerk12 =
             (SELECT kp.prs_kostenplaats_key
                FROM prs_kostenplaats kp
               WHERE SUBSTR (kenmerk3, 1, INSTR (kenmerk3, ' ') - 1) =
                        kp.prs_kostenplaats_nr);

   -- De omschrijving aanvullen met de informatie rondom het weeknummer
   UPDATE fac_imp_factuur
      SET omschrijving =
                REPLACE (omschrijving, 'Regular', 'Gewerkte uren')
             || ', aantal: '
             || kenmerk4
             || ', '
             || kenmerk1
             || ' '
             || kenmerk2
             || ', naam medewerker: '
             || leveranciernr;

   --- Daarna kan het veld leveranciernt opgeruimd worden
   UPDATE fac_imp_factuur
      SET leveranciernr = '';

   COMMIT;
END;
/

CREATE OR REPLACE PROCEDURE wzuv_update_fin_fact_randstad (
   p_import_key IN NUMBER)
AS
   CURSOR c_factuur
   IS
      SELECT fin_factuur_key, 22, kenmerk12
        FROM fac_imp_factuur
       WHERE fin_factuur_key IS NOT NULL;

   -- pdf extraheren uit xml
   -- Volgens JGL kunnen we niet meerdere imports tegelijk aan bij fac_result, zie hieronder.
   -- Vandaar de conditie met max(fin_factuur_key), die levert maximaal 1 record op.
   CURSOR cfactuur_docid
   IS
      SELECT fin_factuur_key,
             docid,
             factuurnr,
             fac_imp_file_index
        FROM fac_imp_factuur
       WHERE     fin_factuur_key IS NOT NULL
             AND fac_import_key = p_import_key
             AND docid IS NOT NULL
             AND fin_factuur_key =
                   (SELECT MAX (fin_factuur_key)
                      FROM fac_imp_factuur
                     WHERE     fin_factuur_key IS NOT NULL
                           AND fac_import_key = p_import_key
                           AND docid IS NOT NULL);

   -- Key van het kenmerk 'Factuurbijlage'
   c_kenmerk_key_bijlage   NUMBER (10) := 21;
BEGIN
   -- Standaard FCLT verwerk import facturen
   fac_update_factuur (p_import_key);

   -- het goedkeuren van deze facturen moet altijd door het flexbureau gedaan worden
   UPDATE fin_factuur f
      SET f.prs_perslid_key_goedkeur =
             (SELECT p.prs_perslid_key
                FROM prs_perslid p
               WHERE p.prs_perslid_upper = 'FLEXBUREAU')
    WHERE f.fin_factuur_key IN (SELECT i.fin_factuur_key
                                  FROM fac_imp_factuur i
                                 WHERE i.fac_import_key = p_import_key);

   -- de kostenplaats is niet de kostenplaats van het contract, maar de kostenplaats die op de factuur wordt meegegeven
   -- de key was al in kenmerk12 gezet
   -- dan regelen we direct ook maar even de notificatie voor het goedkeuren
   FOR rec IN c_factuur
   LOOP
      BEGIN
         wzuv_fin_upsertkenmerk (22, rec.fin_factuur_key, rec.kenmerk12);
      END;
      
      fac.trackaction ('FIN2GO',
                       rec.fin_factuur_key,
                       NULL,
                       NULL,
                       'Goedkeuring voor factuur Randstad vereist');
                       
   END LOOP;

   FOR rc IN cfactuur_docid
   LOOP
      BEGIN
         INSERT INTO fac_result (fac_result_sessionid,
                                 fac_result_naam,
                                 fac_result_waarde)
             VALUES ('IMPORT:' || TO_CHAR (p_import_key),
                     'flexcode',
                        'FIN:'
                     || TO_CHAR (rc.fin_factuur_key) -- We kunnen niet meerdere imports tegelijk aan!
                     || ':'
                     || c_kenmerk_key_bijlage
                     || ':'                                  -- De kenmerk key
                     || 'F');

         -- FSN#33363: Zelf de insert in fin_kenmerkfactuur doen van het bestandskenmerk (FSN#33105 verzorgt dit niet namelijk)
         INSERT INTO fin_kenmerkfactuur (fin_factuur_key,
                                         fin_kenmerk_key,
                                         fin_kenmerkfactuur_waarde)
             VALUES (rc.fin_factuur_key, c_kenmerk_key_bijlage, rc.docid);
      EXCEPTION
         WHEN OTHERS
         THEN
            fac.imp_writelog (
               p_import_key,
               'W',
                  'Van factuur met key '
               || rc.fin_factuur_key
               || ' is de bestandsnaam niet bewaard (regel '
               || rc.fac_imp_file_index
               || ')',
                  'Factuurnr:'
               || rc.factuurnr
               || ' / Bestandsnaam: '
               || rc.docid);
      END;
   END LOOP;
END;
/

CREATE OR REPLACE VIEW WZUV_V_INS_QRC_OBJECT
(
    HIDE_F_SORT,
    FCLT_F_DISCIPLINE,
    FCLT_F_OBJECTGROEP,
    FCLT_F_OBJECTSOORT,
    FCLT_F_IDENTIFICATIE,
    FCLT_F_BOOKMARK,
    INS_DEEL_KEY,
    INS_SRTDEEL_KEY,
    FCLT_3D_DISCIPLINE_KEY,
    BOOKMARK_ID
)
AS    
SELECT i.ins_deel_omschrijving           hide_f_sort,
       d.ins_discipline_omschrijving     fclt_f_discipline,
       g.ins_srtgroep_omschrijving       fclt_f_objectgroep,
       s.ins_srtdeel_omschrijving        fclt_f_objectsoort,
       i.ins_deel_omschrijving           fclt_f_identificatie,
       b.fac_bookmark_naam               fclt_f_bookmark,
       i.ins_deel_key,
       s.ins_srtdeel_key,
       i.ins_discipline_key              fclt_3d_discipline_key,
       b.fac_bookmark_id                 hide_f_bookmark_id
  FROM ins_deel        i,
       ins_srtdeel     s,
       ins_srtgroep    g,
       ins_discipline  d,
       fac_bookmark    b
 WHERE     UPPER (b.fac_bookmark_naam) = 'QRC NAAR OBJECT'
       AND COALESCE (b.fac_bookmark_expire, SYSDATE + 1) > SYSDATE
       AND ins_deel_verwijder IS NULL
       AND COALESCE (i.ins_deel_vervaldatum, SYSDATE + 1) > SYSDATE
       AND i.ins_deel_module = 'INS'
       AND i.ins_deel_parent_key IS NULL
       AND s.ins_srtdeel_key = i.ins_srtdeel_key
       AND g.ins_srtgroep_key = s.ins_srtgroep_key
       AND d.ins_discipline_key = g.ins_discipline_key;

BEGIN
   DBMS_UTILITY.COMPILE_SCHEMA (USER, FALSE);
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