--
-- $Id$
--
-- Script containing customer specific configuration sql statements for PCHE (Eindhoven Strijp-S)

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

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


/* grootboekrekeningen:
Grootboek		Omschrijving
200006		   24/7 Abonnement bewoners
200007	  	   24/7 Abonnement bedrijven
200008		   Nacht en weekend abonnement
200009		   Nacht abonnement
200010		   Werkdagen abonnement
200011		   Realtime abonnement
200012         Strijp-S bultje

200013		   Borg abonnement passen
200014		   Borg fietspassen

200027		   Waardenkaart bedrijven
200028		   Waardenkaart bewoners
*/

/* verkoopfactuurvelden:
fin_verkoopfactuur_key	     Identificatie van de verkoopfactuurregel
fin_verkoopfactuur_id	     Identificatie van de verkoopfactuurregel (in tekst vorm)
fin_verkoopfactuur_datum	  Factuurdatum, in geval van bestellingen en mutaties is dit de huidige datum. In geval van prolongaties van de contracten zal dit de eerste van de komende maand zijn.
fin_verkoopfactuur_omschr	  Omschrijving van de bestelregel. Voor bestellingen wordt hier de artikelomschrijving ingevuld.
fin_verkoopfactuur_xmlnode   Type van FACILITOR entiteit waaraan deze verkoopfactuur gekoppeld is. Kan zijn: contract of bestelopdr.
fin_verkoopfactuur_refkey	  Identificatie van de FACILITOR entiteit waaraan deze factuur gekoppeld is.
prs_kostenplaats_nr	        LET OP:Referentie naar de melding voor contractmutaties.
prs_kostensoort_refcode	     Grootboekrekening
prs_bedrijf_key	           Identificatie van de debiteur
prs_debiteur_naam	           Naam van de debiteur (prs_bedrijf_naam)
fin_verkoopfactuur_bedrag	  Factuurregelbedrag exclusief BTW
fin_verkoopfactuur_btw	     BTW bedrag voor deze factuurregel
fin_btwtabelwaarde_code	     Code van het BTW tarief
fin_btwtabelwaarde_oms	     Omschrijving van het BTW tarief
fin_btwtabelwaarde_perc	     BTW percentage
fin_btwtabelwaarde_verlegd	  Of de btw verlegd is (n.v.t.)
fin_verkoopfactuur_maand	  De maandnotatie van de factuurdatum
fin_verkoopfactuur_c1	     Debiteurnummer (prs_leverancier_nr)
fin_verkoopfactuur_c2	     Email adres waarnaar de factuur verzonden is.
fin_verkoopfactuur_c3	     Periode in geval van contract (M, Q, Y)
fin_verkoopfactuur_c4	     Type abonnement bij mutatie
fin_verkoopfactuur_c5        Bestandsnaam pdf
fin_verkoopfactuur_c7	     Lijst met pasnummers horende bij dit contract.
fin_verkoopfactuur_n1	     Factuurregel volgnummer
fin_verkoopfactuur_n2	     Aantal
fin_verkoopfactuur_n3	     Bedrag dat betaald is.
fin_verkoopfactuur_n4	     Korting betaaltermijn (procenten)
fin_verkoopfactuur_n5	     Korting Contract (procenten)
fin_verkoopfactuur_d1	     Datum waarop de factuur volledig betaald is.
fin_verkoopfactuur_d2	     Datum waarop de factuur naar Exact verzonden is.
fin_verkoopfactuur_d3	     Periode van
fin_verkoopfactuur_d4	     Periode tot
fin_verkoopfactuur_d5	     Datum waarop de factuur verzonden is.
*/

CREATE OR REPLACE VIEW pche_v_rap_verkoopfacturen
(
   fin_verkoopfactuur_key,
   fin_verkoopfactuur_id,
   node,
   omschrijving
)
AS
     SELECT max(fin_verkoopfactuur_key),
           fin_verkoopfactuur_id,
            fin_verkoopfactuur_xmlnode,
            listagg (fin_verkoopfactuur_omschr, ',')
               WITHIN GROUP (ORDER BY fin_verkoopfactuur_omschr)
               AS omschrijving
       FROM fin_verkoopfactuur
   GROUP BY fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode;

CREATE OR REPLACE VIEW pche_v_pasnrs
(
   cnt_contract_key,
   pasnrs
)
AS
     SELECT co.cnt_contract_key,
            LISTAGG (d.ins_deel_omschrijving, ',')
               WITHIN GROUP (ORDER BY (ins_deel_omschrijving))
               AS pasnrs
       FROM ins_deel d, cnt_contract_object co
      WHERE co.cnt_ins_deel_key = d.ins_deel_key
        AND co.cnt_contract_object_verwijder IS NULL
        AND d.ins_deel_verwijder IS NULL
        AND COALESCE (d.ins_deel_vervaldatum, SYSDATE) >= SYSDATE
   GROUP BY co.cnt_contract_key;

CREATE OR REPLACE VIEW pche_v_open_contract
(
   cnt_contract_key,
   cnt_contract_omschrijving,
   cnt_contract_verwijder
)
AS
   SELECT cnt_contract_key,
             cnt_contract_omschrijving
          || ' ['
          || cnt_contract_nummer_intern
          || '.'
          || COALESCE (cnt_contract_versie, '0')
          || ']'
          || DECODE (cnt_contract_status, 1, ' *', DECODE(cnt_contract_verwijder, NULL, DECODE(SIGN(cnt_contract_looptijd_tot - SYSDATE), -1, ' *', ''), ' *'))
             cnt_contract_omschrijving,
          DECODE (cnt_contract_status, 1, sysdate -1,  coalesce(cnt_contract_verwijder, cnt_contract_looptijd_tot)) verwijder
     FROM cnt_contract;

CREATE OR REPLACE VIEW pche_v_contract_gegevens
(
   debiteur,
   bewoner,
   bedrijf,
   prs_bedrijf_key,
   contract,
   cnt_contract_key,
   looptijd_van,
   looptijd_tot,
   dgn5,
   dgn7,
   nacht,
   nachtweekend,
   bultje,
   betaling,
   betaling_korting,
   betaling_periode,
   p_dgn5,
   p_dgn7,
   p_nacht,
   p_nachtweekend,
   p_bultje,
   contract_korting,
   aantal_passen
)
AS
   SELECT prs_leverancier_nr debiteur,
          COALESCE (
             (SELECT fac.safe_to_number (prs_kenmerklink_waarde)
                FROM prs_kenmerklink
               WHERE prs_kenmerklink_verwijder IS NULL
                 AND prs_link_key = prs_bedrijf_key
                 AND prs_kenmerk_key = 1000),
             0)
             bewoner,
          prs_bedrijf_naam bedrijf,
          prs_bedrijf_key,
          'C' || cnt_contract_nummer_intern contract,
          c.cnt_contract_key,
          c.cnt_contract_looptijd_van,
          c.cnt_contract_looptijd_tot,
          (SELECT cnt_kenmerkcontract_waarde
             FROM cnt_kenmerkcontract kc
            WHERE c.cnt_contract_key = kc.cnt_contract_key
              AND kc.cnt_kenmerk_key = 1)
             dgn5,
          (SELECT cnt_kenmerkcontract_waarde
             FROM cnt_kenmerkcontract kc, cnt_kenmerk k
            WHERE c.cnt_contract_key = kc.cnt_contract_key
              AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key
              AND k.cnt_srtkenmerk_key = 2)
             dgn7,
          (SELECT cnt_kenmerkcontract_waarde
             FROM cnt_kenmerkcontract kc
            WHERE c.cnt_contract_key = kc.cnt_contract_key
              AND kc.cnt_kenmerk_key = 3)
             nacht,
          (SELECT cnt_kenmerkcontract_waarde
             FROM cnt_kenmerkcontract kc
            WHERE c.cnt_contract_key = kc.cnt_contract_key
              AND kc.cnt_kenmerk_key = 4)
             nachtweekend,
          (SELECT cnt_kenmerkcontract_waarde
             FROM cnt_kenmerkcontract kc
            WHERE c.cnt_contract_key = kc.cnt_contract_key
              AND kc.cnt_kenmerk_key = 41)
             bultje,
          (SELECT fac_usrdata_omschr
             FROM fac_usrdata ud, cnt_kenmerkcontract kc, cnt_kenmerk k
            WHERE c.cnt_contract_key = kc.cnt_contract_key
              AND k.cnt_srtkenmerk_key = 5
              AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key
              AND fac.safe_to_number (cnt_kenmerkcontract_waarde) =
                     ud.fac_usrdata_key)
             betaling,
          (SELECT fac_usrdata_prijs
             FROM fac_usrdata ud, cnt_kenmerkcontract kc, cnt_kenmerk k
            WHERE c.cnt_contract_key = kc.cnt_contract_key
              AND k.cnt_srtkenmerk_key = 5
              AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key
              AND fac.safe_to_number (cnt_kenmerkcontract_waarde) =
                     ud.fac_usrdata_key)
             betaling_korting,
          (SELECT fac_usrdata_code
             FROM fac_usrdata ud, cnt_kenmerkcontract kc, cnt_kenmerk k
            WHERE c.cnt_contract_key = kc.cnt_contract_key
              AND k.cnt_srtkenmerk_key = 5
              AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key
              AND fac.safe_to_number (cnt_kenmerkcontract_waarde) =
                     ud.fac_usrdata_key)
             betaling_periode,
          (SELECT fac_usrdata_prijs
             FROM fac_usrdata
            WHERE fac_usrdata_key = 21)
             p_dgn5,
          (SELECT fac_usrdata_prijs
             FROM fac_usrdata
            WHERE fac_usrdata_key = DECODE(c.ins_discipline_key, 61, 62, 1))
             p_dgn7,
          (SELECT fac_usrdata_prijs
             FROM fac_usrdata
            WHERE fac_usrdata_key = 3)
             p_nacht,
          (SELECT fac_usrdata_prijs
             FROM fac_usrdata
            WHERE fac_usrdata_key = 2)
             p_nachtweekend,
          (SELECT fac_usrdata_prijs
             FROM fac_usrdata
            WHERE fac_usrdata_key = 81)
             p_bultje,
          cnt_contract_korting contract_korting,
          (SELECT COUNT (ins_deel_key)
             FROM ins_deel d, cnt_contract_object co
            WHERE c.cnt_contract_key = co.cnt_contract_key
              AND co.cnt_ins_deel_key = d.ins_deel_key)
             aantal_passen
     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 c.cnt_contract_status = 0;

--PCHE#41481 Dit is een vaste rapportage geworden
CREATE OR REPLACE VIEW pche_v_rap_bedrijfexport
(
   bedrijfsnaam,
   naam_gebruiker,
   pasnummer,
   adres,
   postcode,
   plaats,
   telefoonnummer_gebruiker
)
AS
   SELECT DECODE (bedrijf.bedrijf, NULL, 'geen bedrijf', bedrijf.bedrijf)
             bedrijfsnaam,
          naam.ins_kenmerkdeel_waarde naam_gebruiker,
          naam.ins_deel_upper pasnummer,
          bedrijfg.prs_bedrijf_post_adres adres,
          bedrijfg.prs_bedrijf_post_postcode postcode,
          bedrijfg.prs_bedrijf_post_plaats plaats,
          tel.ins_kenmerkdeel_waarde telefoonnummer_gebruiker
     FROM (SELECT i.ins_deel_upper, ik.ins_kenmerkdeel_waarde
             FROM ins_deel i, ins_kenmerkdeel ik
            WHERE     ik.ins_kenmerk_key = 21
                  AND i.ins_deel_key = ik.ins_deel_key
                  AND i.ins_deel_verwijder IS NULL) naam,
          (SELECT i.ins_deel_upper, ik.ins_kenmerkdeel_waarde
             FROM ins_deel i, ins_kenmerkdeel ik
            WHERE     ik.ins_kenmerk_key = 22
                  AND i.ins_deel_key = ik.ins_deel_key
                  AND i.ins_deel_verwijder IS NULL) tel,
          (SELECT p.bedrijf, p.pas, p.prs_bedrijf_key
             FROM pche_v_contractdeel_gegevens p) bedrijf,
          (SELECT pb.prs_bedrijf_key,
                  pb.prs_bedrijf_post_adres,
                  pb.prs_bedrijf_post_postcode,
                  pb.prs_bedrijf_post_plaats
             FROM prs_bedrijf pb) bedrijfg
    WHERE     naam.ins_deel_upper = tel.ins_deel_upper
          AND naam.ins_deel_upper = bedrijf.pas(+)
          AND bedrijf.prs_bedrijf_key = bedrijfg.prs_bedrijf_key(+);

CREATE OR REPLACE FORCE VIEW pche_v_contractdeel_gegevens
(
   debiteur,
   bewoner,
   bedrijf,
   prs_bedrijf_key,
   contract,
   cnt_contract_key,
   dgn5,
   dgn7,
   nacht,
   nachtweekend,
   bultje,
   betaling,
   betaling_korting,
   betaling_periode,
   p_dgn5,
   p_dgn7,
   p_nacht,
   p_nachtweekend,
   p_bultje,
   contract_korting,
   pas
)
AS
   SELECT prs_leverancier_nr debiteur,
          COALESCE (
             (SELECT fac.safe_to_number (prs_kenmerklink_waarde)
                FROM prs_kenmerklink
               WHERE prs_kenmerklink_verwijder IS NULL
                 AND prs_link_key = prs_bedrijf_key
                 AND prs_kenmerk_key = 1000),
             0)
             bewoner,
          prs_bedrijf_naam bedrijf,
          prs_bedrijf_key,
          'C' || cnt_contract_nummer_intern contract,
          c.cnt_contract_key,
          (SELECT cnt_kenmerkcontract_waarde
             FROM cnt_kenmerkcontract kc
            WHERE c.cnt_contract_key = kc.cnt_contract_key
              AND kc.cnt_kenmerk_key = 1)
             dgn5,
          (SELECT cnt_kenmerkcontract_waarde
             FROM cnt_kenmerkcontract kc, cnt_kenmerk k
            WHERE c.cnt_contract_key = kc.cnt_contract_key
              AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key
              AND k.cnt_srtkenmerk_key = 2)
             dgn7,
          (SELECT cnt_kenmerkcontract_waarde
             FROM cnt_kenmerkcontract kc
            WHERE c.cnt_contract_key = kc.cnt_contract_key
              AND kc.cnt_kenmerk_key = 3)
             nacht,
          (SELECT cnt_kenmerkcontract_waarde
             FROM cnt_kenmerkcontract kc
            WHERE c.cnt_contract_key = kc.cnt_contract_key
              AND kc.cnt_kenmerk_key = 4)
             nachtweekend,
          (SELECT cnt_kenmerkcontract_waarde
             FROM cnt_kenmerkcontract kc
            WHERE c.cnt_contract_key = kc.cnt_contract_key
              AND kc.cnt_kenmerk_key = 41)
             bultje,
          (SELECT fac_usrdata_omschr
             FROM fac_usrdata ud, cnt_kenmerkcontract kc, cnt_kenmerk k
            WHERE c.cnt_contract_key = kc.cnt_contract_key
              AND k.cnt_srtkenmerk_key = 5
              AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key
              AND fac.safe_to_number (cnt_kenmerkcontract_waarde) =
                     ud.fac_usrdata_key)
             betaling,
          (SELECT fac_usrdata_prijs
             FROM fac_usrdata ud, cnt_kenmerkcontract kc, cnt_kenmerk k
            WHERE c.cnt_contract_key = kc.cnt_contract_key
              AND k.cnt_srtkenmerk_key = 5
              AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key
              AND fac.safe_to_number (cnt_kenmerkcontract_waarde) =
                     ud.fac_usrdata_key)
             betaling_korting,
          (SELECT fac_usrdata_code
             FROM fac_usrdata ud, cnt_kenmerkcontract kc, cnt_kenmerk k
            WHERE c.cnt_contract_key = kc.cnt_contract_key
              AND k.cnt_srtkenmerk_key = 5
              AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key
              AND fac.safe_to_number (cnt_kenmerkcontract_waarde) =
                     ud.fac_usrdata_key)
             betaling_periode,
          (SELECT fac_usrdata_prijs
             FROM fac_usrdata
            WHERE fac_usrdata_key = 21)
             p_dgn5,
          (SELECT fac_usrdata_prijs
             FROM fac_usrdata
            WHERE fac_usrdata_key = 1)
             p_dgn7,
          (SELECT fac_usrdata_prijs
             FROM fac_usrdata
            WHERE fac_usrdata_key = 3)
             p_nacht,
          (SELECT fac_usrdata_prijs
             FROM fac_usrdata
            WHERE fac_usrdata_key = 2)
             p_nachtweekend,
          (SELECT fac_usrdata_prijs
             FROM fac_usrdata
            WHERE fac_usrdata_key = 81)
             p_bultje,
          cnt_contract_korting contract_korting,
          ins_deel_omschrijving pas
     FROM cnt_contract c,
          prs_bedrijf b,
          ins_deel d,
          cnt_contract_object co
    WHERE c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
      AND c.cnt_contract_key = co.cnt_contract_key(+)
      AND co.cnt_ins_deel_key = d.ins_deel_key(+);

CREATE OR REPLACE VIEW pche_v_rap_contract_gegevens
(
   debiteur,
   bedrijf,
   bewoner,
   contract,
   dgn5,
   dgn7,
   nacht,
   nachtweekend,
   bultje,
   betaling,
   p_dgn5,
   p_dgn7,
   p_nacht,
   p_nachtweekend,
   p_bultje,
   aantal_passen,
   betaling_korting,
   contract_korting,
   t_dgn5,
   t_dgn7,
   t_nacht,
   t_nachtweekend,
   t_bultje,
   totaal,
   totaal_netto,
   pasnrs
)
AS
   SELECT debiteur,
          bedrijf,
          bewoner,
          contract,
          dgn5,
          dgn7,
          nacht,
          nachtweekend,
          bultje,
          betaling,
          p_dgn5,
          p_dgn7,
          p_nacht,
          p_nachtweekend,
          p_bultje,
          aantal_passen,
          betaling_korting,
          contract_korting,
          dgn5 * p_dgn5 t_dgn5,
          dgn7 * p_dgn7 t_dgn7,
          nacht * p_nacht t_nacht,
          nachtweekend * p_nachtweekend t_nachtweekend,
          bultje * p_bultje t_bultje,
            COALESCE (fac.safe_to_number (dgn5), 0) * p_dgn5
          + COALESCE (fac.safe_to_number (dgn7), 0) * p_dgn7
          + COALESCE (fac.safe_to_number (nacht), 0) * p_nacht
          + COALESCE (fac.safe_to_number (nachtweekend), 0) * p_nachtweekend
          + COALESCE (fac.safe_to_number (bultje), 0) * p_bultje
             totaal,
          ROUND (
             ( (100 - COALESCE (contract_korting, 0) - betaling_korting) / 100)
             * (  COALESCE (fac.safe_to_number (dgn5), 0) * p_dgn5
                + COALESCE (fac.safe_to_number (dgn7), 0) * p_dgn7
                + COALESCE (fac.safe_to_number (nacht), 0) * p_nacht
                + COALESCE (fac.safe_to_number (nachtweekend), 0)
                  * p_nachtweekend
                + COALESCE (fac.safe_to_number (bultje), 0)
                  * p_bultje),
             2)
             totaal_netto,
          pasnrs
     FROM pche_v_contract_gegevens cg, pche_v_pasnrs p
    WHERE cg.cnt_contract_key = p.cnt_contract_key;


CREATE OR REPLACE PROCEDURE pche_select_daily_task (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2)
AS
BEGIN
   -- Kopieer de bedrijfsgegevens naar afdelingen en personen

   -- Pas bestaande afdelingen aan.
   UPDATE prs_afdeling a
      SET
          (prs_afdeling_naam,
          prs_afdeling_omschrijving,
          prs_afdeling_verwijder,
          prs_kostenplaats_key
          ) =
             (SELECT prs_leverancier_nr,
                     prs_bedrijf_naam,
                     prs_bedrijf_verwijder,
                     1
                FROM prs_bedrijf b
               WHERE b.prs_bedrijf_key = a.prs_bedrijf_key
                 AND b.prs_leverancier_nr IS NOT NULL)
    WHERE EXISTS
             (SELECT b.prs_bedrijf_key
                FROM prs_bedrijf b, prs_v_afdeling ab
               WHERE ab.prs_bedrijf_key = b.prs_bedrijf_key
                 AND ab.prs_afdeling_key = a.prs_afdeling_key
                 AND b.prs_leverancier_nr IS NOT NULL
                 AND b.prs_bedrijf_contract = 1);

   -- Voeg nieuwe afdelingen toe.
   INSERT INTO prs_afdeling (prs_bedrijf_key, prs_afdeling_naam, prs_afdeling_omschrijving, prs_kostenplaats_key)
      SELECT prs_bedrijf_key, prs_leverancier_nr, prs_bedrijf_naam, 1
        FROM prs_bedrijf b
       WHERE prs_bedrijf_contract = 1
         AND prs_leverancier_nr IS NOT NULL
         AND NOT EXISTS (SELECT b.prs_bedrijf_key
                           FROM prs_afdeling ab
                          WHERE b.prs_bedrijf_key = ab.prs_bedrijf_key);

   -- Pas bestaande personen aan
   UPDATE prs_perslid p
      SET
          (prs_afdeling_key,
          prs_srtperslid_key,
          prs_perslid_module,
          prs_perslid_naam,
          fac_profiel_key,
          prs_perslid_email,
         -- prs_perslid_oslogin,   Nog maar even niet ivm meerdere bedrijven met hetzelfde mail adres.
          prs_perslid_verwijder
          ) =
             (SELECT prs_afdeling_key,
                     22,
                     'PRS',
                     prs_afdeling_omschrijving || DECODE (prs_afdeling_verwijder, NULL, '', '[' || to_char (prs_afdeling_verwijder, 'yyyymmdd') || ']'),
                     1,
                     prs_bedrijf_email,
           --          prs_bedrijf_email,
                     prs_afdeling_verwijder
                FROM prs_afdeling a, prs_bedrijf b
               WHERE a.prs_afdeling_key = p.prs_afdeling_key
                 AND a.prs_bedrijf_key = b.prs_bedrijf_key)
    WHERE prs_srtperslid_key = 22;

   -- Voeg nieuwe personen toe
   INSERT INTO prs_perslid (prs_afdeling_key,
                            prs_srtperslid_key,
                            prs_perslid_module,
                            prs_perslid_naam,
                            fac_profiel_key,
                            prs_perslid_email)
      SELECT prs_afdeling_key,
             22,
             'PRS',
             prs_afdeling_omschrijving || DECODE (prs_afdeling_verwijder, NULL, '', '[' || to_char (prs_afdeling_verwijder, 'yyyymmdd') || ']'),
             1,
             prs_bedrijf_email
        FROM prs_afdeling a, prs_bedrijf b
       WHERE a.prs_bedrijf_key = b.prs_bedrijf_key
         AND b.prs_bedrijf_contract = 1
         AND b.prs_bedrijf_verwijder IS NULL
         AND a.prs_afdeling_verwijder IS NULL
         AND NOT EXISTS (SELECT prs_perslid_key
                           FROM prs_perslid p
                          WHERE p.prs_afdeling_key = a.prs_afdeling_key);

   -- Koppel personen aan de juiste autorisatie
   -- 41 autorisatiegroep bewoners
   -- 61 autorisatiegroep bedrijven
   -- Kenmerk 1000 is kenmerk voor bewoners bij bedrijf (1 = bewoner)
   INSERT INTO fac_gebruikersgroep (prs_perslid_key, fac_groep_key)
   SELECT prs_perslid_key, DECODE (b.prs_kenmerklink_waarde, 1, 41, 61)
     FROM prs_perslid p,
          prs_v_afdeling a,
          (SELECT prs_kenmerklink_waarde, prs_link_key
             FROM prs_kenmerklink kl
            WHERE kl.prs_kenmerk_key = 1000) b
    WHERE p.prs_afdeling_key = a.prs_afdeling_key
      AND a.prs_bedrijf_key = b.prs_link_key(+)
      AND NOT EXISTS
             (SELECT fac_gebruikersgroep_key
                FROM fac_gebruikersgroep gg
               WHERE gg.prs_perslid_key = p.prs_perslid_key
                 AND gg.fac_groep_key =
                        DECODE (b.prs_kenmerklink_waarde, 1, 41, 61));

END pche_select_daily_task;
/



CREATE OR REPLACE PROCEDURE pche_select_exact_common (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2,
   p_betaling_periode IN NUMBER,
   p_antedateerdagen  IN NUMBER)
AS

   CURSOR c_melding
   IS
      SELECT b.prs_leverancier_nr,
             b.prs_bedrijf_naam,
             COALESCE (
                (SELECT prs_kenmerklink_waarde
                   FROM prs_kenmerklink
                  WHERE prs_kenmerklink_verwijder IS NULL
                    AND prs_link_key = prs_bedrijf_key
                    AND prs_kenmerk_key = 1020),
                b.prs_bedrijf_email)
                prs_bedrijf_email,
             b.prs_bedrijf_key,
             m.mld_melding_key,
             c.cnt_contract_key,
             m.mld_melding_opmerking,
             DECODE (
                k.mld_srtkenmerk_key,
                29,
                DECODE (
                   (SELECT fac_usrdata_upper
                      FROM fac_usrdata ud, mld_kenmerkmelding km
                     WHERE km.mld_melding_key = m.mld_melding_key
                       AND fac.safe_to_number (km.mld_kenmerkmelding_waarde) =
                              fac_usrdata_key
                       AND km.mld_kenmerk_key IN (1, 61)       -- bedrijv / bewoners
                                                        ),
                   '5DGN',
                   '200010',
                   '7DGN',
                   DECODE (std.mld_ins_discipline_key, 4, '200007', '200006'), -- bedrijv / bewoners
                   'N&W',
                   '200008',
                   'NACHT',
                   '200009',
                   'BULTJE',
                   '200012',
                   'REALTIME',
                   '200011'
                   ),
                '200013')                                                     -- borg
                prs_kostensoort_refcode,
             fac.safe_to_number (km.mld_kenmerkmelding_waarde * DECODE(k.mld_srtkenmerk_key, 241, ud.fac_usrdata_prijs , 1)) bedrag,
             ROUND (
                  fac.safe_to_number (km.mld_kenmerkmelding_waarde * DECODE(k.mld_srtkenmerk_key, 241, ud.fac_usrdata_prijs , 1))
                  * fin_btwtabelwaarde_perc
                  / (100 + fin_btwtabelwaarde_perc),
                2)
                btw,
             fin_btwtabelwaarde_code,
             fin_btwtabelwaarde_oms,
             fin_btwtabelwaarde_perc,
             fin_btwtabelwaarde_verlegd,
             ud.fac_usrdata_omschr abtype,
             (SELECT fac.safe_to_date(MAX(kmb.mld_kenmerkmelding_waarde), 'dd-mm-yyyy')
                FROM mld_kenmerkmelding kmb
               WHERE kmb.mld_melding_key = m.mld_melding_key
                 AND kmb.mld_kenmerk_key = 421) van,
             (SELECT fac.safe_to_date(MAX(kme.mld_kenmerkmelding_waarde), 'dd-mm-yyyy')
                FROM mld_kenmerkmelding kme
               WHERE kme.mld_melding_key = m.mld_melding_key
                 AND kme.mld_kenmerk_key = 441) tot
        FROM mld_melding m,
             cnt_contract c,
             prs_bedrijf b,
             fin_btwtabelwaarde btw,
             mld_kenmerkmelding km,
             mld_kenmerk k,
             mld_stdmelding std,
             fac_usrdata ud,
             mld_kenmerkmelding kmt,
             mld_kenmerk kt
       WHERE (SELECT fac.safe_to_number (mld_kenmerkmelding_waarde)
                FROM mld_kenmerkmelding km, mld_kenmerk k
               WHERE km.mld_kenmerk_key = k.mld_kenmerk_key
                 AND k.mld_srtkenmerk_key IN  (28, 201)                 -- contract referentie / contract referentie alle (voor creditering)
                 AND km.mld_melding_key = m.mld_melding_key) = c.cnt_contract_key
         AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
         AND DECODE (k.mld_srtkenmerk_key, 29, 21, 0) = fin_btwtabelwaarde_perc -- normaal wel btw maar niet op borg
         AND m.mld_melding_key = km.mld_melding_key
         AND km.mld_kenmerk_key = k.mld_kenmerk_key
         AND km.mld_kenmerkmelding_verwijder IS NULL
         AND k.mld_srtkenmerk_key IN (29, 41, 241)         -- te factureren bedrag / borg / aantal transacties
         AND m.mld_melding_status = 5                                    -- afgemeld
         AND m.mld_melding_indult = 0                         -- melding is niet uitgesloten voor facturering
         AND fac.safe_to_number (km.mld_kenmerkmelding_waarde) <> 0
         AND m.mld_stdmelding_key = std.mld_stdmelding_key
         AND kmt.mld_melding_key = m.mld_melding_key
         AND kmt.mld_kenmerk_key = kt.mld_kenmerk_key
         AND kt.mld_srtkenmerk_key IN (61, 1)
         AND fac.safe_to_number (kmt.mld_kenmerkmelding_waarde) = ud.fac_usrdata_key
         AND m.mld_melding_key NOT IN
                   (SELECT COALESCE(FAC.SAFE_TO_NUMBER(prs_kostenplaats_nr), -1) FROM fin_verkoopfactuur)
       ORDER BY m.mld_melding_key;


   CURSOR c_bestel
   IS
      SELECT boi.bes_bestelopdr_item_omschrijv,
             bo.bes_bestelopdr_key,
             bed.prs_bedrijf_key,
             bed.prs_bedrijf_naam,
             COALESCE (
                (SELECT prs_kenmerklink_waarde
                   FROM prs_kenmerklink
                  WHERE prs_kenmerklink_verwijder IS NULL
                    AND prs_link_key = bed.prs_bedrijf_key
                    AND prs_kenmerk_key = 1020),
                bed.prs_bedrijf_email)
                prs_bedrijf_email,
             k.prs_kostensoort_oms,
             k.prs_kostensoort_opmerking,
             k.prs_kostensoort_refcode,
             boi.bes_bestelopdr_item_aantal,
             boi.bes_bestelopdr_item_prijs,
             btw.fin_btwtabelwaarde_code,
             btw.fin_btwtabelwaarde_oms,
             btw.fin_btwtabelwaarde_perc,
             btw.fin_btwtabelwaarde_verlegd,
             bed.prs_leverancier_nr,
             boi.bes_bestelopdr_item_posnr
        FROM bes_bestelling b,
             prs_perslid p,
             prs_v_afdeling a,
             prs_bedrijf bed,
             prs_kostensoort k,
             bes_bestelling_item bi,
             bes_bestelopdr_item boi,
             bes_bestelopdr bo,
             bes_srtdeel sd,
             bes_srtgroep sg,
             ins_tab_discipline d,
             fin_btwtabelwaarde btw
       WHERE b.prs_perslid_key = p.prs_perslid_key
         AND p.prs_afdeling_key = a.prs_afdeling_key
         AND b.bes_bestelling_key = bi.bes_bestelling_key
         AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
         AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key
         AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
         AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
         AND sg.ins_discipline_key = d.ins_discipline_key
         AND d.prs_kostensoort_key = k.prs_kostensoort_key
         AND sd.bes_srtdeel_btw = btw.fin_btwtabelwaarde_perc
         AND a.prs_bedrijf_key = bed.prs_bedrijf_key
         AND NOT EXISTS
                (SELECT fin_verkoopfactuur_key
                   FROM fin_verkoopfactuur
                  WHERE fin_verkoopfactuur_xmlnode = 'bestelopdr'
                    AND bo.bes_bestelopdr_key = fin_verkoopfactuur_refkey)
         AND bes_bestelopdr_status = 3;

   CURSOR c_contract(c_betaling_periode NUMBER)
   IS
        SELECT abtype,
               cnt_contract_key,
               c.prs_bedrijf_key,
               COALESCE (
                  (SELECT prs_kenmerklink_waarde
                     FROM prs_kenmerklink
                    WHERE prs_kenmerklink_verwijder IS NULL
                      AND prs_link_key = b.prs_bedrijf_key
                      AND prs_kenmerk_key = 1020),
                  b.prs_bedrijf_email)
                  prs_bedrijf_email,
               bedrijf,
               looptijd_van,
               looptijd_tot,
               ROUND (
                    aantal
                  * stuksprijs
                  * betaling_periode
                  * (1 - COALESCE (betaling_korting, 0) / 100 - COALESCE (contract_korting, 0) / 100),
                  2)
                  bedrag,
               ROUND (
                  ROUND (
                       aantal
                     * stuksprijs
                     * betaling_periode
                     * (1 - COALESCE (betaling_korting, 0) / 100 - COALESCE (contract_korting, 0) / 100),
                     2)
                  * fin_btwtabelwaarde_perc
                  / (100 + fin_btwtabelwaarde_perc),
                  2)
                  btw,
               fin_btwtabelwaarde_code,
               fin_btwtabelwaarde_oms,
               fin_btwtabelwaarde_perc,
               fin_btwtabelwaarde_verlegd,
               debiteur,
               aantal,
               COALESCE (betaling_korting, 0) betaling_korting,
               betaling,
               COALESCE (contract_korting, 0) contract_korting,
               betaling_periode,
               prs_kostensoort_refcode,
               ( SELECT pa.pasnrs
                   FROM pche_v_pasnrs pa
                  WHERE c.cnt_contract_key = pa.cnt_contract_key) pasnrs
          FROM (SELECT DISTINCT debiteur,
                                bedrijf,
                                prs_bedrijf_key,
                                contract,
                                cnt_contract_key,
                                looptijd_van,
                                looptijd_tot,
                                'Werkdagen abonnement' abtype,
                                dgn5 aantal,
                                betaling,
                                betaling_korting,
                                betaling_periode,
                                p_dgn5 stuksprijs,
                                contract_korting,
                                '200010' prs_kostensoort_refcode
                  FROM pche_v_contract_gegevens
                 WHERE dgn5 IS NOT NULL
                UNION ALL
                SELECT DISTINCT debiteur,
                                bedrijf,
                                prs_bedrijf_key,
                                contract,
                                cnt_contract_key,
                                looptijd_van,
                                looptijd_tot,
                                '24/7 abonnement' abtype,
                                dgn7 aantal,
                                betaling,
                                betaling_korting,
                                betaling_periode,
                                p_dgn7 stuksprijs,
                                contract_korting,
                                DECODE (bewoner, 1, '200006', '200007') prs_kostensoort_refcode
                  FROM pche_v_contract_gegevens
                 WHERE dgn7 IS NOT NULL
                UNION ALL
                SELECT DISTINCT debiteur,
                                bedrijf,
                                prs_bedrijf_key,
                                contract,
                                cnt_contract_key,
                                looptijd_van,
                                looptijd_tot,
                                'Nacht abonnement' abtype,
                                nacht aantal,
                                betaling,
                                betaling_korting,
                                betaling_periode,
                                p_nacht stuksprijs,
                                contract_korting,
                                '200009' prs_kostensoort_refcode
                  FROM pche_v_contract_gegevens
                 WHERE nacht IS NOT NULL
                UNION ALL
                SELECT DISTINCT debiteur,
                                bedrijf,
                                prs_bedrijf_key,
                                contract,
                                cnt_contract_key,
                                looptijd_van,
                                looptijd_tot,
                                'Nacht- en Weekend abonnement' abtype,
                                nachtweekend aantal,
                                betaling,
                                betaling_korting,
                                betaling_periode,
                                p_nachtweekend stuksprijs,
                                contract_korting,
                                '200008' prs_kostensoort_refcode
                  FROM pche_v_contract_gegevens
                 WHERE nachtweekend IS NOT NULL
                UNION ALL
                SELECT DISTINCT debiteur,
                                bedrijf,
                                prs_bedrijf_key,
                                contract,
                                cnt_contract_key,
                                looptijd_van,
                                looptijd_tot,
                                'Strijp-S Bultje abonnement' abtype,
                                bultje aantal,
                                betaling,
                                betaling_korting,
                                betaling_periode,
                                p_bultje stuksprijs,
                                contract_korting,
                                '200012' prs_kostensoort_refcode
                  FROM pche_v_contract_gegevens
                 WHERE bultje IS NOT NULL) c,
               fin_btwtabelwaarde btw,
               prs_bedrijf b
         WHERE      btw.fin_btwtabelwaarde_perc = 21
               AND  p_betaling_periode = betaling_periode
               AND c.prs_bedrijf_key = b.prs_bedrijf_key
      ORDER BY cnt_contract_key;


   v_factuur_key       NUMBER;
   v_bestelopdr_key    NUMBER;
   v_melding_key       NUMBER;
   v_contract_key      NUMBER;
   v_factuurregel_nr   NUMBER;
   v_verkoopfactuurkop_key NUMBER;
   v_pdf_naam          VARCHAR2(200);
   v_begin             DATE;
   v_eind              DATE;
BEGIN
   SELECT COALESCE(MAX (FAC.SAFE_TO_NUMBER(fin_verkoopfactuurkop_id)),0)
     INTO v_factuur_key
     FROM fin_verkoopfactuurkop;

   v_bestelopdr_key := -1;
   v_contract_key := -1;
   v_melding_key := -1;

   IF p_betaling_periode = 0 THEN    -- alleen uitvoeren als het geen periode facturatie is.
      -- verwijder nog niet geexporteerde meldingen
      DELETE fin_verkoopfactuur
       WHERE fin_verkoopfactuur_xmlnode = 'contract'
         AND prs_kostenplaats_nr IS NOT NULL   -- referentie naar melding. Is dus mutatie op contract.
         AND fin_verkoopfactuur_d2 IS NULL; -- Nog niet naar Exact geëxporteerd.
      FOR rec IN c_melding
      LOOP
         IF rec.mld_melding_key <> v_melding_key
         THEN
            v_factuurregel_nr := 1;
            v_factuur_key := v_factuur_key + 1;
            INSERT INTO fin_verkoopfactuurkop (fin_verkoopfactuurkop_id) VALUES (TO_CHAR (v_factuur_key))
               RETURNING fin_verkoopfactuurkop_key INTO v_verkoopfactuurkop_key;
            v_pdf_naam := 'Factuur_' || TO_CHAR (v_factuur_key) || '_' || DBMS_RANDOM.string ('a', 32) || '.pdf';
         ELSE
            v_factuurregel_nr := v_factuurregel_nr + 1;
         END IF;

         -- fin_verkoopfactuur_d1 = datum betaald
         INSERT INTO fin_verkoopfactuur (fin_verkoopfactuurkop_key,
                                         fin_verkoopfactuur_id, -- factuurnummer zoals deze naar de klant gaat
                                         fin_verkoopfactuur_datum, -- datum afgesproken met PCHE voor bestellingen is dat de sysdate
                                         fin_verkoopfactuur_omschr, -- factuurregelomschrijving is artikelregel
                                         fin_verkoopfactuur_xmlnode, -- bestelopdr
                                         fin_verkoopfactuur_refkey, -- bes_bestelopdr_key
                                         prs_bedrijf_key, -- bedrijf van de aanvrager
                                         prs_debiteur_naam,   -- prs_bedrijf_naam
                                         fin_verkoopfactuur_bedrag,
                                         fin_verkoopfactuur_btw,
                                         fin_btwtabelwaarde_code,
                                         fin_btwtabelwaarde_oms,
                                         fin_btwtabelwaarde_perc,
                                         fin_btwtabelwaarde_verlegd,
                                         prs_kostensoort_oms,
                                         prs_kostensoort_opmerking,
                                         prs_kostensoort_refcode,
                                         prs_kostenplaats_nr,   -- LET OP: melding key als referentie naar de melding
                                         fin_verkoopfactuur_maand,
                                         fin_verkoopfactuur_c1, -- prs_leverancier_nr
                                         fin_verkoopfactuur_c2, -- prs_bedrijf_email
                                         fin_verkoopfactuur_c4, -- abonnementstype
                                         fin_verkoopfactuur_c5, -- filenaam van de PDF
                                         fin_verkoopfactuur_n1, -- bestelregel volgnummer
                                         fin_verkoopfactuur_n2, -- aantal
                                         fin_verkoopfactuur_d3, -- begin periode
                                         fin_verkoopfactuur_d4) -- einde periode
             VALUES (v_verkoopfactuurkop_key,
                     TO_CHAR (v_factuur_key),
                     SYSDATE,
                     rec.mld_melding_opmerking,
                     'contract',
                     rec.cnt_contract_key,
                     rec.prs_bedrijf_key,
                     rec.prs_bedrijf_naam,
                     rec.bedrag - rec.btw,
                     rec.btw,
                     rec.fin_btwtabelwaarde_code,
                     rec.fin_btwtabelwaarde_oms,
                     rec.fin_btwtabelwaarde_perc,
                     rec.fin_btwtabelwaarde_verlegd,
                     NULL,
                     NULL,
                     rec.prs_kostensoort_refcode,
                     TO_CHAR(rec.mld_melding_key),
                     TO_CHAR (SYSDATE, 'yyyymm'),
                     rec.prs_leverancier_nr,
                     rec.prs_bedrijf_email,
                     rec.abtype,
                     v_pdf_naam,
                     v_factuurregel_nr,
                     NULL,
                     rec.van,
                     rec.tot);

         v_melding_key := rec.mld_melding_key;
      END LOOP;

      -- verwijder nog niet geexporteerde bestellingen
      DELETE fin_verkoopfactuur
       WHERE fin_verkoopfactuur_xmlnode = 'bestelopdr'
         AND fin_verkoopfactuur_d2 IS NULL; -- Nog niet naar Exact geëxporteerd.
      FOR rec IN c_bestel
      LOOP
         IF rec.bes_bestelopdr_key <> v_bestelopdr_key
         THEN
            v_factuur_key := v_factuur_key + 1;
            INSERT INTO fin_verkoopfactuurkop (fin_verkoopfactuurkop_id) VALUES (TO_CHAR (v_factuur_key))
               RETURNING fin_verkoopfactuurkop_key INTO v_verkoopfactuurkop_key;
            v_pdf_naam := 'Factuur_' || TO_CHAR (v_factuur_key) || '_' || DBMS_RANDOM.string ('a', 32) || '.pdf';
         END IF;

         -- fin_verkoopfactuur_d1 = datum betaald
         INSERT INTO fin_verkoopfactuur (fin_verkoopfactuurkop_key,
                                         fin_verkoopfactuur_id, -- factuurnummer zoals deze naar de klant gaat
                                         fin_verkoopfactuur_datum, -- datum afgesproken met PCHE voor bestellingen is dat de sysdate
                                         fin_verkoopfactuur_omschr, -- factuurregelomschrijving is artikelregel
                                         fin_verkoopfactuur_xmlnode, -- bestelopdr
                                         fin_verkoopfactuur_refkey, -- bes_bestelopdr_key
                                         prs_bedrijf_key, -- bedrijf van de aanvrager
                                         prs_debiteur_naam,   -- prs_bedrijf_naam
                                         fin_verkoopfactuur_bedrag,
                                         fin_verkoopfactuur_btw,
                                         fin_btwtabelwaarde_code,
                                         fin_btwtabelwaarde_oms,
                                         fin_btwtabelwaarde_perc,
                                         fin_btwtabelwaarde_verlegd,
                                         prs_kostensoort_oms,
                                         prs_kostensoort_opmerking,
                                         prs_kostensoort_refcode,
                                         fin_verkoopfactuur_maand,
                                         fin_verkoopfactuur_c1, -- prs_leverancier_nr
                                         fin_verkoopfactuur_c2, -- prs_bedrijf_email
                                         fin_verkoopfactuur_c5, -- filenaam van de PDF
                                         fin_verkoopfactuur_n1, -- bestelregel volgnummer
                                         fin_verkoopfactuur_n2)         -- aantal
             VALUES (v_verkoopfactuurkop_key,
                     TO_CHAR (v_factuur_key),
                     SYSDATE,
                     rec.bes_bestelopdr_item_omschrijv,
                     'bestelopdr',
                     rec.bes_bestelopdr_key,
                     rec.prs_bedrijf_key,
                     rec.prs_bedrijf_naam,
                       rec.bes_bestelopdr_item_aantal
                     * rec.bes_bestelopdr_item_prijs
                     / (1 + rec.fin_btwtabelwaarde_perc / 100),
                     (  rec.bes_bestelopdr_item_aantal
                      * rec.bes_bestelopdr_item_prijs
                      * rec.fin_btwtabelwaarde_perc
                      / 100)
                     / (1 + rec.fin_btwtabelwaarde_perc / 100),
                     rec.fin_btwtabelwaarde_code,
                     rec.fin_btwtabelwaarde_oms,
                     rec.fin_btwtabelwaarde_perc,
                     rec.fin_btwtabelwaarde_verlegd,
                     rec.prs_kostensoort_oms,
                     rec.prs_kostensoort_opmerking,
                     rec.prs_kostensoort_refcode,
                     TO_CHAR (SYSDATE, 'yyyymm'),
                     rec.prs_leverancier_nr,
                     rec.prs_bedrijf_email,
                     v_pdf_naam,
                     rec.bes_bestelopdr_item_posnr,
                     rec.bes_bestelopdr_item_aantal);

         v_bestelopdr_key := rec.bes_bestelopdr_key;
      END LOOP;

   ELSE
      -- verwijder nog niet geexporteerde contracten van deze betalingsperiode
      DELETE fin_verkoopfactuur
       WHERE fin_verkoopfactuur_xmlnode = 'contract'
         AND prs_kostenplaats_nr IS NULL    -- geen mutaties op contract
         AND fin_verkoopfactuur_c3 = DECODE(p_betaling_periode, 1, 'M', 3, 'Q', 12, 'Y', '')
         AND fin_verkoopfactuur_d2 IS NULL; -- Nog niet naar Exact geëxporteerd.
      FOR rec IN c_contract(p_betaling_periode)
      LOOP
         IF rec.cnt_contract_key <> v_contract_key
         THEN
            v_factuur_key := v_factuur_key + 1;
            v_factuurregel_nr := 1;
            INSERT INTO fin_verkoopfactuurkop (fin_verkoopfactuurkop_id) VALUES (TO_CHAR (v_factuur_key))
            RETURNING fin_verkoopfactuurkop_key INTO v_verkoopfactuurkop_key;
            v_pdf_naam := 'Factuur_' || TO_CHAR (v_factuur_key) || '_' || DBMS_RANDOM.string ('a', 32) || '.pdf';
         ELSE
            v_factuurregel_nr := v_factuurregel_nr + 1;
         END IF;

         -- fin_verkoopfactuur_d1 = datum betaald
         -- bereken de periode
         v_begin := ADD_MONTHS (TRUNC (SYSDATE - p_antedateerdagen, 'MM'), 1);

         IF rec.betaling_periode = 1
         THEN                                            -- betaling per maand
            v_begin := ADD_MONTHS (TRUNC (SYSDATE - p_antedateerdagen, 'MM'), 1);
            v_eind := ADD_MONTHS (v_begin, 1) - 1;
         ELSIF rec.betaling_periode = 3
         THEN                                         -- betaling per kwartaal
            v_begin := ADD_MONTHS (TRUNC (SYSDATE - p_antedateerdagen, 'Q'), 3);
            v_eind := ADD_MONTHS (v_begin, 3) - 1;
         ELSE                                            -- betaling per maand
            v_begin := ADD_MONTHS (TRUNC (SYSDATE - p_antedateerdagen, 'Y'), 12);
            v_eind := ADD_MONTHS (v_begin, 12) - 1;
         END IF;

         -- we gaan het contract alleen factureren als de factureringstermijn volledig binnen het contract valt.
         IF rec.looptijd_van < v_eind
            AND rec.looptijd_tot > v_begin
         THEN
            INSERT INTO fin_verkoopfactuur (fin_verkoopfactuurkop_key,
                                            fin_verkoopfactuur_id, -- factuurnummer zoals deze naar de klant gaat
                                            fin_verkoopfactuur_datum, -- datum afgesproken met PCHE voor bestellingen is dat de sysdate
                                            fin_verkoopfactuur_omschr, -- factuurregelomschrijving is artikelregel
                                            fin_verkoopfactuur_xmlnode, -- bestelopdr
                                            fin_verkoopfactuur_refkey, -- bes_bestelopdr_key
                                            prs_bedrijf_key, -- bedrijf van de aanvrager
                                            prs_debiteur_naam, -- prs_bedrijf_naam
                                            fin_verkoopfactuur_bedrag,
                                            fin_verkoopfactuur_btw,
                                            fin_btwtabelwaarde_code,
                                            fin_btwtabelwaarde_oms,
                                            fin_btwtabelwaarde_perc,
                                            fin_btwtabelwaarde_verlegd,
                                            prs_kostensoort_refcode,
                                            fin_verkoopfactuur_maand,
                                            fin_verkoopfactuur_c1, -- prs_leverancier_nr
                                            fin_verkoopfactuur_c2, -- prs_bedrijf_email
                                            fin_verkoopfactuur_c3, -- betalingsperiode (M, Q, Y)
                                            fin_verkoopfactuur_c5, -- filenaam van de PDF
                                            fin_verkoopfactuur_c7, -- lijst met pasnummers
                                            fin_verkoopfactuur_n1, -- bestelregel volgnummer
                                            fin_verkoopfactuur_n2,      -- aantal
                                            fin_verkoopfactuur_n4, -- korting betaaltermijn
                                            fin_verkoopfactuur_n5, -- korting contract
                                            fin_verkoopfactuur_d3, -- begin periode
                                            fin_verkoopfactuur_d4) -- einde periode
                VALUES (v_verkoopfactuurkop_key,
                        TO_CHAR (v_factuur_key),
                        SYSDATE,
                        rec.abtype,
                        'contract',
                        rec.cnt_contract_key,
                        rec.prs_bedrijf_key,
                        rec.bedrijf,
                        rec.bedrag - rec.btw,     -- netto bedrag zonder btw
                        rec.btw,
                        rec.fin_btwtabelwaarde_code,
                        rec.fin_btwtabelwaarde_oms,
                        rec.fin_btwtabelwaarde_perc,
                        rec.fin_btwtabelwaarde_verlegd,
                        rec.prs_kostensoort_refcode,
                        TO_CHAR (v_begin, 'yyyymm'),
                        rec.debiteur,
                        rec.prs_bedrijf_email,
                        DECODE(p_betaling_periode, 1, 'M', 3, 'Q', 12, 'Y', ''),
                        v_pdf_naam,
                        rec.pasnrs,
                        v_factuurregel_nr,
                        rec.aantal,
                        rec.betaling_korting,
                        rec.contract_korting,
                        v_begin,
                        v_eind);

         v_contract_key := rec.cnt_contract_key;
         ELSE
            NULL;
            -- Voorlopig even niets doen.
            -- fac.writelog (p_applname, 'E', 'Gevonden contract niet binnen facturatietermijn: ' || rec.cnt_contract_key || ' (' || rec.bedrijf || ')', '');
         END IF;
      END LOOP;
   END IF;


   COMMIT;
END;
/

CREATE OR REPLACE PROCEDURE pche_select_exact (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2)
AS
BEGIN
   pche_select_exact_common (p_applname, p_applrun, 0, 0);
END;
/

CREATE OR REPLACE PROCEDURE pche_select_exact_jaar (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2)
AS
BEGIN
   pche_select_exact_common (p_applname, p_applrun, 12, 0);
END;
/

CREATE OR REPLACE PROCEDURE pche_select_exact_kwartaal (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2)
AS
BEGIN
   pche_select_exact_common (p_applname, p_applrun, 3, 0);
END;
/

CREATE OR REPLACE PROCEDURE pche_select_exact_maand (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2)
AS
BEGIN
   pche_select_exact_common (p_applname, p_applrun, 1, 0);
END;
/



--
-- Export van verkoopfacturen. Dit zijn facturen die in de tabel fin_verkoopfacturen staan maar die de
-- datum export fin_verkoopfactuur_d2 leeg hebben
CREATE OR REPLACE VIEW pche_v_exact_verkoopgegevens
(
   factuur_omschrijving,
   referentie,
   fin_verkoopfactuur_key,
   fin_verkoopfactuur_id,
   fin_verkoopfactuur_c1,
   fin_verkoopfactuur_n1,
   fin_verkoopfactuur_n2,
   fin_verkoopfactuur_omschr,
   fin_verkoopfactuur_bedrag,
   prs_kostensoort_refcode,
   fin_btwtabelwaarde_code,
   fin_verkoopfactuur_datum,
   prs_kostenplaats_nr
)
AS
   SELECT DECODE (
             fin_verkoopfactuur_xmlnode,
             'bestelopdr',
             'Bestelling waardekaarten',
             'contract',
             DECODE (
                prs_kostenplaats_nr,
                NULL, 'Ab' || TO_CHAR (fin_verkoopfactuur_d3, 'dd-mm-yy') || '/' || TO_CHAR (fin_verkoopfactuur_d4, 'dd-mm-yy'),
                DECODE(fin_verkoopfactuur_c4, 'Realtime abonnement', 'Rt' || TO_CHAR (fin_verkoopfactuur_d3, 'dd-mm-yy') || '/' || TO_CHAR (fin_verkoopfactuur_d4, 'dd-mm-yy'),
                                              'Abonnement mutatie')
                    )
                )
             factuur_omschrijving,
          DECODE (
             prs_kostenplaats_nr,
             NULL,
             DECODE (
                fin_verkoopfactuur_xmlnode,
                'contract',
                'C' || fin_verkoopfactuur_refkey,
                'B'
                || (SELECT SUBSTR (bes_bestelopdr_id,
                                   1,
                                   INSTR (bes_bestelopdr_id, '/') - 1)
                      FROM bes_bestelopdr bo
                     WHERE bo.bes_bestelopdr_key = fin_verkoopfactuur_refkey)),
             'M' || prs_kostenplaats_nr)
             referentie,
          fin_verkoopfactuur_key,
          fin_verkoopfactuur_id,
          fin_verkoopfactuur_c1,                                 -- debiteurnr
          fin_verkoopfactuur_n1,                             -- factuurregelnr
          fin_verkoopfactuur_n2,                                     -- aantal
          fin_verkoopfactuur_omschr,
          fin_verkoopfactuur_bedrag,
          prs_kostensoort_refcode,
          fin_btwtabelwaarde_code,
          fin_verkoopfactuur_datum,
          prs_kostenplaats_nr
     FROM fin_verkoopfactuur v
    WHERE fin_verkoopfactuur_d2 IS NULL;

-- Procedure om alle verkoopfacturen te exporteren naar exact.
CREATE OR REPLACE PROCEDURE pche_select_exact_output (p_applname   IN VARCHAR2,
                                                      p_applrun    IN VARCHAR2)
AS
   CURSOR c
   IS
        SELECT factuur_omschrijving,
               fin_verkoopfactuur_id,
               fin_verkoopfactuur_c1,
               fin_verkoopfactuur_datum,
               referentie,
               sum(fin_verkoopfactuur_bedrag) bedrag
          FROM pche_v_exact_verkoopgegevens
      GROUP BY factuur_omschrijving,
               fin_verkoopfactuur_id,
               fin_verkoopfactuur_c1,
               fin_verkoopfactuur_datum,
               referentie
      ORDER BY fin_verkoopfactuur_id;

   CURSOR c_sub (c_verkoopfactuur_id VARCHAR2)
   IS
        SELECT *
          FROM pche_v_exact_verkoopgegevens
         WHERE fin_verkoopfactuur_id = c_verkoopfactuur_id
      ORDER BY fin_verkoopfactuur_n1;

   CURSOR c_noti
   IS
        SELECT vk.fin_verkoopfactuurkop_key, vk.fin_verkoopfactuurkop_id, fin_verkoopfactuur_c2,fin_verkoopfactuur_c5
          FROM fin_verkoopfactuur v, fin_verkoopfactuurkop vk
         WHERE v.fin_verkoopfactuurkop_key = vk.fin_verkoopfactuurkop_key
           AND v.fin_verkoopfactuur_d5 IS NULL
         GROUP BY vk.fin_verkoopfactuurkop_key, vk.fin_verkoopfactuurkop_id, fin_verkoopfactuur_c2, fin_verkoopfactuur_c5;

   v_bestand    VARCHAR2(12);
   v_bedrag_txt VARCHAR2(12);
   v_sub_count  NUMBER;
BEGIN
   v_bestand := SUBSTR (p_applname, 1, 12);

   -- facturen verzenden.
   FOR rec IN c_noti
   LOOP
      BEGIN

            -- CUST01 notificatie heeft key 181
            -- Datum van de notificatie wordt op middernacht gezet om er voor te zorgen dat na kantooruren de pdf generatie
            -- kan plaatsvinden.
            INSERT INTO fac_notificatie (fac_srtnotificatie_key,
                                         fac_notificatie_status,
                                         fac_notificatie_receiver_email,
                                         fac_notificatie_oms,
                                         fac_notificatie_refkey,
                                         fac_notificatie_prioriteit,
                                         fac_notificatie_attachments,
                                         fac_notificatie_datum)
              VALUES (181,
                      2,   -- mail
                      rec.fin_verkoopfactuur_c2,  -- email
                      'Factuur parking Strijp-S',
                      rec.fin_verkoopfactuurkop_key,
                      2,
                      '/../../Fplace5i/CUST/PCHE/export/PDF/' || rec.fin_verkoopfactuur_c5,
                      TRUNC(SYSDATE)+1);


            UPDATE fin_verkoopfactuur
               SET fin_verkoopfactuur_d5 = SYSDATE
             WHERE fin_verkoopfactuurkop_key = rec.fin_verkoopfactuurkop_key;




      EXCEPTION WHEN OTHERS
      THEN
         fac.writelog (p_applname, 'E', 'Overwachte fout bij notificeren: ' || rec.fin_verkoopfactuurkop_key || ' (' || rec.fin_verkoopfactuur_c2 || ')', '');
      END;
   END LOOP;

   -- Eerst opruiming
   DELETE FROM imp_log
         WHERE imp_log_applicatie = p_applname;

   DELETE fac_rapport
    WHERE fac_rapport_node = v_bestand;

   -- header
   pchx.add_xml_row (v_bestand,
                     '<?xml version="1.0" encoding="windows-1252"?>');
   pchx.add_xml_row (v_bestand, '<eExact>');
   pchx.add_xml_row (v_bestand, '<GLEntries>');

   FOR rec IN c
   LOOP
      BEGIN
         pchx.add_xml_row (v_bestand, '<GLEntry status="E" entry="' || rec.fin_verkoopfactuur_id || '">');
         pchx.add_xml_row (v_bestand, '<Division code="250"/>');
         pchx.add_xml_element (v_bestand,
                               'Description',
                               xml.char_to_html(SUBSTR(rec.factuur_omschrijving,1,20)));
         pchx.add_xml_element (v_bestand, 'Date', TO_CHAR(rec.fin_verkoopfactuur_datum, 'YYYY-MM-DD'));
         pchx.add_xml_element (v_bestand, 'DocumentDate', TO_CHAR(SYSDATE, 'YYYY-MM-DD') );
         pchx.add_xml_row (v_bestand, '<Journal type="V" code="57">');
            pchx.add_xml_element (v_bestand, 'Description', 'Verkoopboek');
            pchx.add_xml_row (v_bestand, '<GLAccount code="110003" type="B" side="D" subtype="D">');
               pchx.add_xml_element (v_bestand, 'Description', 'Omzet debiteuren');
            pchx.add_xml_row (v_bestand, '</GLAccount>');
         pchx.add_xml_row (v_bestand, '</Journal>');
         pchx.add_xml_row (v_bestand, '<Costcenter code="1260"/>');
         pchx.add_xml_row (v_bestand, '<Amount>');
            pchx.add_xml_row (v_bestand, '<Currency code="EUR"/>');
            v_bedrag_txt := REPLACE (TO_CHAR (rec.bedrag), ',', '.');
            pchx.add_xml_element (v_bestand, 'Value', v_bedrag_txt);
         pchx.add_xml_row (v_bestand, '</Amount>');
         v_sub_count := 1;
         FOR rec1 IN c_sub (rec.fin_verkoopfactuur_id)
         LOOP
            BEGIN
               pchx.add_xml_row (v_bestand, '<FinEntryLine number="' || v_sub_count || '" subtype="K" type="N">');
                  pchx.add_xml_element (v_bestand, 'Date', TO_CHAR(rec1.fin_verkoopfactuur_datum, 'YYYY-MM-DD'));
                  pchx.add_xml_row (v_bestand, '<GLAccount code="' || xml.char_to_html(rec1.prs_kostensoort_refcode) || '"/>');
                  pchx.add_xml_element (v_bestand,
                          'Description',
                          xml.char_to_html(SUBSTR(rec1.fin_verkoopfactuur_omschr,1,60)));
                  pchx.add_xml_row (v_bestand, '<Costcenter code="1260"/>');
                  pchx.add_xml_row (v_bestand, '<Debtor code="' || xml.char_to_html(rec1.fin_verkoopfactuur_c1) || '"/>');
                  pchx.add_xml_row (v_bestand, '<Item code="' || xml.char_to_html(rec1.prs_kostensoort_refcode) || '"/>');
                  pchx.add_xml_row (v_bestand, '<Amount>');
                     pchx.add_xml_row (v_bestand, '<Currency code="EUR"/>');
                     v_bedrag_txt := REPLACE (TO_CHAR (rec1.fin_verkoopfactuur_bedrag), ',', '.');
                     pchx.add_xml_element (v_bestand, 'Credit', v_bedrag_txt);
                     pchx.add_xml_row (v_bestand, '<VAT code="' || xml.char_to_html(rec1.fin_btwtabelwaarde_code) || '"/>');
                  pchx.add_xml_row (v_bestand, '</Amount>');
               pchx.add_xml_row (v_bestand, '</FinEntryLine>');
               v_sub_count := v_sub_count + 1;

               -- markeer in de verkoopfactuuradministratie dat deze verkoopfactuur geexporteerd is naar Exact
               UPDATE fin_verkoopfactuur
                  SET fin_verkoopfactuur_d2 = SYSDATE
                WHERE fin_verkoopfactuur_key = rec1.fin_verkoopfactuur_key;

               -- Zet de melding op verwerkt. Nu de factuur aangemaakt is mag hier toch niets meer aan gewijzigd worden.
               IF rec1.prs_kostenplaats_nr IS NOT NULL
               THEN
                  MLD.setmeldingstatus (fac.safe_to_number(rec1.prs_kostenplaats_nr), 6, NULL);
               END IF;
            END;
         END LOOP;
         pchx.add_xml_row (v_bestand, '</GLEntry>');
      END;
   END LOOP;

   pchx.add_xml_row (v_bestand, '</GLEntries>');
   pchx.add_xml_row (v_bestand, '</eExact>');
END;
/

CREATE OR REPLACE VIEW pche_v_export_exact_output (
   result,
   result_order
   )
AS
   SELECT fac_rapport_regel, fac_rapport_volgnr
     FROM fac_rapport
    WHERE fac_rapport_node = 'EXACT_OUTPUT';


CREATE OR REPLACE PROCEDURE pche_select_annuleer_factuur (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2)
AS
BEGIN
   -- We ondersteunen alleen het annuleren van periodieke facturen op
   -- contracten. Dus maand, kwartaal of jaarfacturen.
   DELETE fin_verkoopfactuur
    WHERE fin_verkoopfactuur_key IN
                (SELECT fin_verkoopfactuur_key
                   FROM fac_notificatie n, fin_verkoopfactuur v
                  WHERE n.fac_notificatie_refkey = fin_verkoopfactuurkop_key
                    AND fin_verkoopfactuur_xmlnode = 'contract'
                    AND prs_kostenplaats_nr IS NULL
                    AND fac_srtnotificatie_key = 181);

   -- srtnotificatie 181 = CUST01
   DELETE fac_notificatie n
    WHERE fac_srtnotificatie_key = 181
      AND NOT EXISTS (SELECT fin_verkoopfactuur_key
                        FROM fin_verkoopfactuur
                       WHERE n.fac_notificatie_refkey = fin_verkoopfactuurkop_key);

   DELETE fin_verkoopfactuurkop vk
    WHERE NOT EXISTS (SELECT fin_verkoopfactuurkop_key
                        FROM fin_verkoopfactuur v
                       WHERE vk.fin_verkoopfactuurkop_key = v.fin_verkoopfactuurkop_key);
END;
/

CREATE OR REPLACE PROCEDURE pche_select_exact_debtor (p_applname   IN VARCHAR2,
                                                      p_applrun    IN VARCHAR2)
AS
   CURSOR c
   IS
        select * from prs_bedrijf where prs_leverancier_nr is not null;

   v_bestand    VARCHAR2(12);
   v_sub_count  NUMBER;
BEGIN
   v_bestand := SUBSTR (p_applname, 1, 12);

    -- Eerst opruiming
   DELETE FROM imp_log
         WHERE imp_log_applicatie = p_applname;

   DELETE fac_rapport
    WHERE fac_rapport_node = v_bestand;

   -- header
   pchx.add_xml_row (v_bestand,
                     '<?xml version="1.0" encoding="windows-1252"?>');
   pchx.add_xml_row (v_bestand, '<eExact>');
   pchx.add_xml_row (v_bestand, '<Accounts>');

   FOR rec IN c
   LOOP
      BEGIN
         pchx.add_xml_row (v_bestand, '<Account code=" ' || rec.prs_leverancier_nr || '" status="A" type="C">');
            pchx.add_xml_element (v_bestand, 'Name', rec.prs_bedrijf_naam);
            pchx.add_xml_element (v_bestand, 'Phone', rec.prs_bedrijf_telefoon);
            pchx.add_xml_element (v_bestand, 'Fax', rec.prs_bedrijf_fax);
            pchx.add_xml_element (v_bestand, 'Email', rec.prs_bedrijf_email);
            pchx.add_xml_row (v_bestand, '<Contacts>');
               pchx.add_xml_row (v_bestand, '<Contact default="1" gender="M" status="A">');
                  pchx.add_xml_row (v_bestand, '<Addresses>');
                     pchx.add_xml_row (v_bestand, '<Address type="D" desc="">');
                        pchx.add_xml_element (v_bestand, 'AddressLine1', rec.prs_bedrijf_bezoek_adres);
                        pchx.add_xml_element (v_bestand, 'PostalCode', rec.prs_bedrijf_bezoek_postcode);
                        pchx.add_xml_element (v_bestand, 'City', rec.prs_bedrijf_bezoek_plaats);
                     pchx.add_xml_row (v_bestand, '</Address>');
                     pchx.add_xml_row (v_bestand, '<Address type="I" desc="">');
                        pchx.add_xml_element (v_bestand, 'AddressLine1', rec.prs_bedrijf_post_adres);
                        pchx.add_xml_element (v_bestand, 'PostalCode', rec.prs_bedrijf_post_postcode);
                        pchx.add_xml_element (v_bestand, 'City', rec.prs_bedrijf_post_plaats);
                     pchx.add_xml_row (v_bestand, '</Address>');
                  pchx.add_xml_row (v_bestand, '</Addresses>');
               pchx.add_xml_row (v_bestand, '</Contact>');
            pchx.add_xml_row (v_bestand, '</Contacts>');
            pchx.add_xml_row (v_bestand, '<Debtor number="300657" code="' || rec.prs_leverancier_nr || '">');
               pchx.add_xml_row (v_bestand, '<GLCentralization code=" 110003" side="D" type="B" subtype="D">');
                  pchx.add_xml_element (v_bestand, 'Description', 'Exoloitatie debiteuren Strijp S');
               pchx.add_xml_row (v_bestand, '</GLCentralization>');
            pchx.add_xml_row (v_bestand, '</Debtor>');
            pchx.add_xml_row (v_bestand, '<PaymentCondition code="00" type="9" type1="1" surcharge="B" method="B" invoicing="B" installments="0"/>');
            pchx.add_xml_row (v_bestand, '<AccountCategory code="STR">');
               pchx.add_xml_element (v_bestand, 'Description', 'Exoloitatie Strijp S');
            pchx.add_xml_row (v_bestand, '</AccountCategory>');
         pchx.add_xml_row (v_bestand, '</Account>');
      END;
   END LOOP;
   pchx.add_xml_row (v_bestand, '</Accounts>');
   pchx.add_xml_row (v_bestand, '</eExact>');
END;
/

CREATE OR REPLACE VIEW pche_v_export_exact_debtor (
   result,
   result_order
   )
AS
   SELECT fac_rapport_regel, fac_rapport_volgnr
     FROM fac_rapport
    WHERE fac_rapport_node = 'EXACT_DEBTOR';


-- export om bat file aan te maken die de PDF bestanden genereerd. Deze export moet voor middernacht gedraaid worden omdat daarna
-- de notificaties vanuit de putorders verstuurd worden.
CREATE OR REPLACE VIEW pche_v_export_pdf_att
(
   result,
   result_order
)
AS
   SELECT DISTINCT
             'call genereer1fin_vk_pdf.bat '
          || v.fin_verkoopfactuurkop_key
          || ' '
          || vk.fin_verkoopfactuur_c5,
          v.fin_verkoopfactuurkop_key
     FROM fin_verkoopfactuurkop v, fin_verkoopfactuur vk, fac_notificatie n
    WHERE n.fac_srtnotificatie_key = 181        -- notificatie verkoopfacturen
      AND vk.fin_verkoopfactuurkop_key = v.fin_verkoopfactuurkop_key
      AND n.fac_notificatie_refkey = vk.fin_verkoopfactuurkop_key;

-- view om contractinformatie in de portal te laten zien
CREATE OR REPLACE VIEW pche_v_mijn_contracten
(
   prs_perslid_key,
   contract,
   looptijd_van,
   looptijd_tot,
   dgn5,
   dgn7,
   nacht,
   nachtweekend,
   bultje,
   betaling,
   betaling_korting,
   betaling_periode,
   p_dgn5,
   p_dgn7,
   p_nacht,
   p_nachtweekend,
   p_bultje,
   contract_korting,
   aantal_passen,
   pasnrs
)
AS
   SELECT prs_perslid_key,
          contract,
          looptijd_van,
          looptijd_tot,
          dgn5,
          dgn7,
          nacht,
          nachtweekend,
          bultje,
          betaling,
          betaling_korting,
          betaling_periode,
          p_dgn5,
          p_dgn7,
          p_nacht,
          p_nachtweekend,
          p_bultje,
          contract_korting,
          aantal_passen,
          pn.pasnrs
     FROM pche_v_contract_gegevens cg,
          prs_perslid p,
          prs_v_afdeling a,
          pche_v_pasnrs pn
    WHERE p.prs_afdeling_key = a.prs_afdeling_key
      AND a.prs_bedrijf_key = cg.prs_bedrijf_key
      AND cg.cnt_contract_key = pn.cnt_contract_key;


CREATE OR REPLACE VIEW pche_v_verkoopfactuur
AS
   SELECT fin_verkoopfactuur_key,
          fin_verkoopfactuur_aanmaak,
          fin_verkoopfactuur_id,
          fin_verkoopfactuur_datum,
          fin_verkoopfactuur_omschr,
          fin_verkoopfactuur_xmlnode,
          fin_verkoopfactuur_refkey,
          prs_kostenplaats_nr mutatie_ref,
          prs_kostensoort_refcode grootboeknr,
          prs_debiteur_naam,
          prs_bedrijf_key,
          fin_verkoopfactuur_bedrag,
          fin_verkoopfactuur_btw,
          fin_btwtabelwaarde_code,
          fin_btwtabelwaarde_oms,
          fin_btwtabelwaarde_perc,
          fin_verkoopfactuur_maand,
          fin_verkoopfactuur_n1 regel_volgnr,
          fin_verkoopfactuur_n2 aantal,
          fin_verkoopfactuur_n3 betaald_bedrag,
          fin_verkoopfactuur_n4 korting_betalingstermijn,
          fin_verkoopfactuur_n5 korting_contract,
          fin_verkoopfactuur_c1 debiteurnummer,
          fin_verkoopfactuur_c2 email,
          fin_verkoopfactuur_c3 periode,
          fin_verkoopfactuur_c7 pasnummers,
          fin_verkoopfactuur_d1 volledig_betaald,
          fin_verkoopfactuur_d2 factuur_naar_exact,
          fin_verkoopfactuur_d3 van,
          fin_verkoopfactuur_d4 tot,
          fin_verkoopfactuur_d5 factuur_naar_deb,
          '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'cust/pche/export/pdf/' || fin_verkoopfactuur_c5
          || '")''>'
          || 'pdf'
          || '</a>'
          html_pdf,
          DECODE(fin_verkoopfactuur_d1, NULL, 'NEE', 'JA') volledig_betaald_jn
     FROM fin_verkoopfactuur;

-- Toon de facturen van mijn bedrijf. Facturen die per ongelijk op nog niet gekoppelde personen worden
-- geboekt (afdeling_key = 21) worden uitgesloten.
CREATE OR REPLACE VIEW pche_my_v_verkoopfactuur
AS
   SELECT SYSDATE - fin_verkoopfactuur_aanmaak hide_f_volgorde,
          p.prs_perslid_key fclt_3d_user_key,
          fin_verkoopfactuur_key,
          fin_verkoopfactuur_aanmaak,
          fin_verkoopfactuur_id,
          fin_verkoopfactuur_datum,
          fin_verkoopfactuur_omschr,
          fin_verkoopfactuur_xmlnode,
          fin_verkoopfactuur_refkey,
          prs_kostenplaats_nr mutatie_ref,
          prs_kostensoort_refcode grootboeknr,
          prs_debiteur_naam,
          v.prs_bedrijf_key,
          fin_verkoopfactuur_bedrag,
          fin_verkoopfactuur_btw,
          fin_btwtabelwaarde_code,
          fin_btwtabelwaarde_oms,
          fin_btwtabelwaarde_perc,
          fin_verkoopfactuur_maand,
          fin_verkoopfactuur_n1 regel_volgnr,
          fin_verkoopfactuur_n2 aantal,
          fin_verkoopfactuur_n3 betaald_bedrag,
          fin_verkoopfactuur_n4 korting_betalingstermijn,
          fin_verkoopfactuur_n5 korting_contract,
          fin_verkoopfactuur_c1 debiteurnummer,
          fin_verkoopfactuur_c2 email,
          fin_verkoopfactuur_c3 periode,
          fin_verkoopfactuur_c7 pasnummers,
          fin_verkoopfactuur_d1 volledig_betaald,
          fin_verkoopfactuur_d2 factuur_naar_exact,
          fin_verkoopfactuur_d3 van,
          fin_verkoopfactuur_d4 tot,
          fin_verkoopfactuur_d5 factuur_naar_deb,
          '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'cust/pche/export/pdf/' || fin_verkoopfactuur_c5
          || '")''>'
          || 'pdf'
          || '</a>'
          html_pdf
     FROM fin_verkoopfactuur v, prs_afdeling a, prs_perslid p
    WHERE v.prs_bedrijf_key = a.prs_bedrijf_key
      AND a.prs_afdeling_key = p.prs_afdeling_key
      AND a.prs_afdeling_key <> 21;


CREATE OR REPLACE PROCEDURE pche_import_betaling (p_import_key IN NUMBER)
AS
   CURSOR c_imp
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;

   CURSOR c_deb
   IS
      SELECT b.*, v.fin_verkoopfactuur_c1
        FROM pche_imp_betaling b, fin_verkoopfactuur v
       WHERE b.fin_verkoopfactuur_id = v.fin_verkoopfactuur_id(+)
         AND b.fac_import_key = p_import_key
         AND COALESCE (prs_leverancier_nr, 'a') <>
                COALESCE (fin_verkoopfactuur_c1, 'b');

   CURSOR c_bed
   IS
      SELECT *
        FROM (  SELECT fac_imp_file_index,
                       b.fin_verkoopfactuur_id,
                       b.fin_verkoopfactuur_bedrag b_bedrag,
                       SUM(v.fin_verkoopfactuur_bedrag
                           + v.fin_verkoopfactuur_btw)
                       - COALESCE (v.fin_verkoopfactuur_n3, 0)
                          f_bedrag
                  FROM pche_imp_betaling b, fin_verkoopfactuur v
                 WHERE b.fin_verkoopfactuur_id = v.fin_verkoopfactuur_id(+)
                   AND b.fac_import_key = p_import_key
              GROUP BY fac_imp_file_index,
                       b.fin_verkoopfactuur_id,
                       b.fin_verkoopfactuur_bedrag,
                       v.fin_verkoopfactuur_n3)
       WHERE ABS (f_bedrag - b_bedrag) > 0.1;

   v_newline                      VARCHAR2 (1000);
   v_aanduiding                   VARCHAR2 (1000);              -- Import line
   v_field                        VARCHAR2 (100);              -- Import field
   v_fielddelimitor               VARCHAR2 (1);             -- Field seperator
   v_errormsg                     VARCHAR (200);
   v_errorhint                    VARCHAR (200);
   oracle_err_num                 NUMBER;
   oracle_err_mes                 VARCHAR2 (200);
   v_skipfield                    VARCHAR2 (100);
   v_header_found                 BOOLEAN;
   v_log_omschrijving             VARCHAR2 (1000);
   -- De importvelden
   v_verkoopfactuur_betaaldatum   DATE;
   v_verkoopfactuur_betaal_txt    VARCHAR2 (100);
   v_verkoopfactuur_id            VARCHAR2 (100);             -- VARCHAR2(30);
   v_verkoopfactuur_bedrag        NUMBER (11, 2);
   v_verkoopfactuur_bedrag_txt    VARCHAR2 (100);
   v_leverancier_nr               VARCHAR2 (100);             -- VARCHAR2(50);
   v_debiteur_naam                VARCHAR2 (100);             -- VARCHAR2(60),

   PROCEDURE appendlog (p_log IN OUT VARCHAR2, p_append IN VARCHAR2)
   IS
   BEGIN
      IF p_log IS NOT NULL
      THEN
         p_log := p_log || ' - ' || p_append;
      ELSE
         p_log := p_append;
      END IF;
   END;
BEGIN
   -- Init
   v_header_found := FALSE;
   v_fielddelimitor := ';';

   -- verwijder alle tijdelijke records.
   DELETE pche_imp_betaling
    WHERE fac_import_verwerkt IS NULL;

   FOR rec IN c_imp
   LOOP
      BEGIN
         v_newline := rec.fac_imp_file_line;
         v_aanduiding := v_newline;
         v_log_omschrijving := '';

         IF SUBSTR (v_newline, 1, 3) = '?'
         THEN
            -- EF BB BF aangetroffen
            fac.imp_writelog (p_import_key,
                              'W',
                              'Byte Order Mark aangetroffen',
                              'Bestand heeft onbehandeld UTF-8 formaat.');
            v_newline := SUBSTR (v_newline, 4);
         END IF;

         fac.imp_getfield (v_newline,
                           v_fielddelimitor,
                           v_verkoopfactuur_betaal_txt);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_verkoopfactuur_id);
         fac.imp_getfield (v_newline,
                           v_fielddelimitor,
                           v_verkoopfactuur_bedrag_txt);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_leverancier_nr);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_debiteur_naam);

         -- Skip until a valid header is found
         IF UPPER (v_verkoopfactuur_betaal_txt) = 'DATUM'
        AND UPPER (v_verkoopfactuur_id) = 'ONZE REF.'
        AND UPPER (v_verkoopfactuur_bedrag_txt) = 'ONTVANGST'
        AND UPPER (v_leverancier_nr) = 'DEBITEUR'
        AND UPPER (v_debiteur_naam) = 'DEBITEUR: NAAM'
         THEN
            -- Sla de kopregel over.
            v_header_found := TRUE;
         ELSIF (v_header_found AND v_verkoopfactuur_betaal_txt IS NOT NULL)
         THEN
            v_verkoopfactuur_betaaldatum :=
               fac.safe_to_date (v_verkoopfactuur_betaal_txt, 'dd-mm-yyyy');

            IF v_verkoopfactuur_betaaldatum IS NULL
            THEN
               appendlog (
                  v_log_omschrijving,
                  'Datumformaat niet correct: '
                  || v_verkoopfactuur_betaal_txt);
            END IF;

            v_verkoopfactuur_bedrag :=
               fac.safe_to_number(REPLACE (
                                     REPLACE (v_verkoopfactuur_bedrag_txt,
                                              '.'),
                                     ',',
                                     '.'));

            IF v_verkoopfactuur_bedrag IS NULL
            THEN
               appendlog (
                  v_log_omschrijving,
                  'Datumformaat niet correct: '
                  || v_verkoopfactuur_bedrag_txt);
            END IF;

            INSERT INTO pche_imp_betaling (fin_verkoopfactuur_betaaldatum,
                                           fin_verkoopfactuur_id,
                                           fin_verkoopfactuur_bedrag,
                                           prs_leverancier_nr,
                                           prs_debiteur_naam,
                                           fac_import_key,
                                           imp_log_status,
                                           imp_log_omschrijving,
                                           fac_imp_file_index)
                VALUES (v_verkoopfactuur_betaaldatum,
                        TRIM (v_verkoopfactuur_id),
                        v_verkoopfactuur_bedrag,
                        TRIM (v_leverancier_nr),
                        TRIM (v_debiteur_naam),
                        p_import_key,
                        DECODE (v_log_omschrijving, NULL, NULL, 'E'),
                        v_log_omschrijving,
                        rec.fac_imp_file_index);
         END IF;

         IF v_log_omschrijving IS NOT NULL
         THEN
            fac.imp_writelog (p_import_key,
                              'E',
                              v_log_omschrijving,
                              '');
         END IF;

         COMMIT;
      END;
   END LOOP;

   IF NOT v_header_found
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Geen geldige header aangetroffen',
                        'Bestand is geen geldig betaling importbestand.');
   END IF;

   FOR rec IN c_deb
   LOOP
      BEGIN
         fac.imp_writelog (
            p_import_key,
            'W',
               'Regel:'
            || rec.fac_imp_file_index
            || ' ['
            || rec.fin_verkoopfactuur_id
            || '] Afwijkend debiteurnummer gevonden: Bestand: '
            || rec.prs_leverancier_nr
            || ' Factuur:'
            || rec.fin_verkoopfactuur_c1,
            '.');
      END;
   END LOOP;

   FOR rec IN c_bed
   LOOP
      BEGIN
         fac.imp_writelog (
            p_import_key,
            'W',
               'Regel:'
            || rec.fac_imp_file_index
            || ' ['
            || rec.fin_verkoopfactuur_id
            || '] Afwijkend bedrag gevonden: Bestand: '
            || rec.b_bedrag
            || ' Factuur:'
            || rec.f_bedrag,
            '.');
      END;
   END LOOP;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
         'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        SUBSTR (v_errormsg, 1, 1000),
                        v_aanduiding);
END;
/

CREATE OR REPLACE PROCEDURE pche_update_betaling (p_import_key IN NUMBER)
AS
   CURSOR c_imp
   IS
        SELECT *
          FROM pche_imp_betaling
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;

   v_errormsg                     VARCHAR (200);
   v_errorhint                    VARCHAR (200);
   v_aanduiding                  VARCHAR2(1000);
   oracle_err_num                 NUMBER;
   oracle_err_mes                 VARCHAR2 (200);
    v_factuur_bedrag        NUMBER(11,2);
    v_factuur_betaald       NUMBER(11,2);

BEGIN
   -- verwijder alle tijdelijke records.
   DELETE pche_imp_betaling
    WHERE fac_import_verwerkt IS NULL
      AND fac_import_key <> p_import_key;

   FOR rec IN c_imp
   LOOP

       BEGIN

       v_aanduiding := 'Regel:' || rec.fac_imp_file_index;

         IF COALESCE(rec.imp_log_status, 'x') <> 'E'
         THEN
            -- verwerk de betaling in de verkoopfacturen
            UPDATE fin_verkoopfactuur
                SET fin_verkoopfactuur_n3 = COALESCE(fin_verkoopfactuur_n3,0) + rec.fin_verkoopfactuur_bedrag
               WHERE fin_verkoopfactuur_id = rec.fin_verkoopfactuur_id;

            SELECT SUM(COALESCE(fin_verkoopfactuur_bedrag,0) + COALESCE(fin_verkoopfactuur_btw,0)), fin_verkoopfactuur_n3
               INTO v_factuur_bedrag, v_factuur_betaald
               FROM fin_verkoopfactuur
              WHERE fin_verkoopfactuur_id = rec.fin_verkoopfactuur_id
              GROUP BY fin_verkoopfactuur_n3;

              IF v_factuur_bedrag - v_factuur_betaald < 0.1
              THEN
                 UPDATE fin_verkoopfactuur
                    SET fin_verkoopfactuur_d1 = rec.fin_verkoopfactuur_betaaldatum
                   WHERE fin_verkoopfactuur_id = rec.fin_verkoopfactuur_id;
               END IF;
           END IF;

           UPDATE pche_imp_betaling
           SET fac_import_verwerkt = SYSDATE
           WHERE fac_import_key = p_import_key
           and fac_imp_file_index = rec.fac_imp_file_index;
       END;

   END LOOP;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
         'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        SUBSTR (v_errormsg, 1, 1000),
                        v_aanduiding);
END;
/

CREATE OR REPLACE VIEW pche_v_rap_cnt_obj_geb
AS
   SELECT c.cnt_contract_key,
          cnt_contract_nummer_intern,
          cnt_contract_omschrijving,
          cnt_contract_looptijd_van,
          cnt_contract_looptijd_tot,
          prs_bedrijf_naam,
          prs_perslid_naam_full contractbeheerder,
          ins_discipline_omschrijving contractsoort,
          cnt_betaling,
          cnt_7_dagen,
          cnt_5_werkdag,
          cnt_nacht_weekend,
          cnt_strijpsbultje,
          prs_gebouw,
          DECODE (prs_bewoner, 1, ' Ja', 'Nee') prs_bewoner,
          prs_kpn,
          afw_mail_fact,
          ins_deel_key,
          ins_srtdeel_omschrijving objectsoort,
          ins_deel_opmerking,
          ins_deel_omschrijving,
          ins_naam,
          ins_telefoonnummer,
          ins_kenteken
     FROM    (SELECT cnt_contract_key,
                     cnt_contract_nummer,
                     cnt_contract_nummer_intern,
                     cnt_contract_omschrijving,
                     cnt_contract_looptijd_van,
                     cnt_contract_looptijd_tot,
                     b.prs_bedrijf_naam,
                     pf.prs_perslid_naam_full,
                     ins_discipline_omschrijving,
                     (SELECT fac_usrdata_omschr
                        FROM cnt_kenmerkcontract ck, fac_usrdata ud
                       WHERE ck.cnt_contract_key = c.cnt_contract_key
                             AND ud.fac_usrtab_key = 3
                             AND fac.safe_to_number (
                                   cnt_kenmerkcontract_waarde) =
                                   fac_usrdata_key
                             AND ck.cnt_kenmerk_key IN (5, 22))
                        cnt_betaling,
                     (SELECT fac.safe_to_number (cnt_kenmerkcontract_waarde)
                        FROM cnt_kenmerkcontract ck
                       WHERE ck.cnt_contract_key = c.cnt_contract_key
                             AND ck.cnt_kenmerk_key IN (2, 21))
                        cnt_7_dagen,
                     (SELECT fac.safe_to_number (cnt_kenmerkcontract_waarde)
                        FROM cnt_kenmerkcontract ck
                       WHERE ck.cnt_contract_key = c.cnt_contract_key
                             AND ck.cnt_kenmerk_key = 1)
                        cnt_5_werkdag,
                     (SELECT fac.safe_to_number (cnt_kenmerkcontract_waarde)
                        FROM cnt_kenmerkcontract ck
                       WHERE ck.cnt_contract_key = c.cnt_contract_key
                             AND ck.cnt_kenmerk_key = 4)
                        cnt_nacht_weekend,
                     (SELECT fac.safe_to_number (cnt_kenmerkcontract_waarde)
                        FROM cnt_kenmerkcontract ck
                       WHERE ck.cnt_contract_key = c.cnt_contract_key
                             AND ck.cnt_kenmerk_key = 41)
                        cnt_strijpsbultje,
                     (SELECT ud.fac_usrdata_omschr
                        FROM prs_kenmerklink pk, fac_usrdata ud
                       WHERE     prs_kenmerklink_niveau = 'B'
                             AND pk.prs_kenmerk_key = 1040
                             AND ud.fac_usrtab_key = 61
                             AND pk.prs_link_key = b.prs_bedrijf_key
                             AND fac.safe_to_number (
                                   pk.prs_kenmerklink_waarde) =
                                   ud.fac_usrdata_key)
                        prs_gebouw,
                     (SELECT pk.prs_kenmerklink_waarde
                        FROM prs_kenmerklink pk
                       WHERE     pk.prs_link_key = b.prs_bedrijf_key
                             AND prs_kenmerklink_niveau = 'B'
                             AND pk.prs_kenmerk_key = 1000)
                        prs_bewoner,
                     (SELECT pk.prs_kenmerklink_waarde
                        FROM prs_kenmerklink pk
                       WHERE     pk.prs_link_key = b.prs_bedrijf_key
                             AND prs_kenmerklink_niveau = 'B'
                             AND pk.prs_kenmerk_key = 1060)
                        prs_kpn,
                     (SELECT pk.prs_kenmerklink_waarde
                        FROM prs_kenmerklink pk
                       WHERE     pk.prs_link_key = b.prs_bedrijf_key
                             AND prs_kenmerklink_niveau = 'B'
                             AND pk.prs_kenmerk_key = 1020)
                        afw_mail_fact
                FROM cnt_v_aanwezigcontract c,
                     cnt_discipline cd,
                     prs_v_perslid_fullnames pf,
                     prs_bedrijf b
               WHERE     c.ins_discipline_key = cd.ins_discipline_key
                     AND c.prs_perslid_key_beh = pf.prs_perslid_key
                     AND b.prs_bedrijf_key = c.cnt_prs_bedrijf_key) c
          LEFT OUTER JOIN
             (SELECT co.cnt_contract_key,
                     ins_deel_key,
                     sd.ins_srtdeel_omschrijving,
                     ins_deel_opmerking,
                     ins_deel_omschrijving,
                     (SELECT ins_kenmerkdeel_waarde
                        FROM ins_kenmerkdeel
                       WHERE ins_deel_key = d.ins_deel_key
                             AND ins_kenmerk_key = 21)
                        ins_naam,
                     (SELECT ins_kenmerkdeel_waarde
                        FROM ins_kenmerkdeel
                       WHERE ins_deel_key = d.ins_deel_key
                             AND ins_kenmerk_key = 22)
                        ins_telefoonnummer,
                     (SELECT ins_kenmerkdeel_waarde
                        FROM ins_kenmerkdeel
                       WHERE ins_deel_key = d.ins_deel_key
                             AND ins_kenmerk_key = 1)
                        ins_kenteken
                FROM cnt_contract_object co, ins_deel d, ins_srtdeel sd
               WHERE     cnt_contract_object_verwijder IS NULL
                     AND d.ins_deel_verwijder IS NULL
                     AND co.cnt_ins_deel_key = d.ins_deel_key
                     AND d.ins_srtdeel_key = sd.ins_srtdeel_key) co
          ON c.cnt_contract_key = co.cnt_contract_key;

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

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

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