-- Customer specific once-script NYBU.
-- Vanwege de 5.4.3 aanpassing in nybu.sql. Deze aanpassing met een once script. De procedures zijn tevens aangepast in nybu.sql

SET ECHO ON
SPOOL xNYBU#30811.lst
SET DEFINE OFF

-- Factuurregels verwijderen die door deze bug onterecht geëxporteerd zijn.
DELETE nybu_huur_archief
 WHERE periode = '201412';

-- Mutatieregels "onexporteren"
UPDATE nybu_huur_archief
   SET naar_coda = NULL
 WHERE ismutatie = 1
   AND periode = '201411';

CREATE OR REPLACE PROCEDURE nybu_bereken_factuurregels (
      p_applname     IN VARCHAR2,
      p_run          IN DATE,
      p_periode      IN VARCHAR2,
      p_doorvoeren   IN NUMBER)
AS
   v_aanduiding            VARCHAR2 (200);
   v_errorhint             VARCHAR2 (1000);
   v_errormsg              VARCHAR2 (1000);
   oracle_err_num          NUMBER;
   oracle_err_mes          VARCHAR2 (200);

   c_srtcnt_residence      NUMBER         := 221;
   c_srtcnt_office         NUMBER         := 561;
   c_km_coda_nr            NUMBER         := 1000;
   c_km_san_nr             NUMBER         := 1200;
   c_km_borg_betaald       NUMBER         := 43;
   c_km_vooruit_betalen    NUMBER         := 122;
   c_km_betaald_tot        NUMBER         := 124;
   c_km_refund             NUMBER         := 123;
   c_skm_huurder           NUMBER         := 101;
   c_skm_pnummer           NUMBER         := 341;
   c_skm_ruimte            NUMBER         := 102;
   c_usrtab_coda_btw       NUMBER         := 42;
   c_usrtab_coda_oms       NUMBER         := 43;
   c_ud_telkosten          NUMBER         := 61;

   -- Student room
   -- Alle verhuurcontracten waarbij de huidige periode (deels) binnen de looptijd valt
   -- TRUNC op maand cq LAST_DAY, omdat contracten halverwege de maand kunnen beginnen/eindigen
   CURSOR sr
   IS
      SELECT c.*
        FROM nybu_v_huurcontracten_student c
       WHERE (   c.betaald_tot IS NULL
              OR c.betaald_tot < p_periode)
         AND TO_DATE(p_periode, 'YYYYMM') BETWEEN TRUNC(c.cnt_contract_looptijd_van, 'MM')
                                              AND TRUNC(c.cnt_contract_looptijd_tot, 'MM');

   -- Residence/office
   CURSOR ro
   IS
      SELECT c.cnt_contract_key,
             c.cnt_contract_looptijd_van,
             c.cnt_contract_looptijd_tot,
             DECODE(c.ins_discipline_key,
                    c_srtcnt_residence, 'Staff residence',
                    c_srtcnt_office, 'Office') betreft,
             c.cnt_contract_nummer_intern,
             c.cnt_contract_omschrijving,
             kp.prs_kostenplaats_nr kpn,
             TRIM( SUBSTR(kg.prs_kostenplaatsgrp_oms, 1, 7) ) kpngrp,
             p.prs_perslid_key,
             p.prs_perslid_naam,
             pf.prs_perslid_naam_full,
             COALESCE(sannr.prs_kenmerklink_waarde, codanr.prs_kenmerklink_waarde) codanr,
             k.prs_kostenplaats_nr,
             rg.alg_ruimte_key,
             rg.alg_ruimte_aanduiding
        FROM (SELECT * FROM cnt_contract
               WHERE ins_discipline_key IN (c_srtcnt_residence, c_srtcnt_office) ) c,
             (SELECT kc.* FROM cnt_kenmerkcontract kc, cnt_kenmerk k
               WHERE kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                 AND k.cnt_srtkenmerk_key = c_skm_huurder
                 AND kc.cnt_kenmerkcontract_verwijder IS NULL) huurder,
             (SELECT kc.* FROM cnt_kenmerkcontract kc, cnt_kenmerk k
               WHERE kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                 AND cnt_srtkenmerk_key = c_skm_pnummer) pnummer,
             (SELECT kc.* FROM cnt_kenmerkcontract kc, cnt_kenmerk k
               WHERE kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                 AND k.cnt_srtkenmerk_key = c_skm_ruimte
                 AND kc.cnt_kenmerkcontract_verwijder IS NULL) ruimte,
             prs_perslid p,
             prs_v_perslid_fullnames pf,
             (SELECT * FROM prs_kenmerklink
               WHERE prs_kenmerk_key = c_km_coda_nr
                 AND prs_kenmerklink_verwijder IS NULL) codanr,
             (SELECT * FROM prs_kenmerklink
               WHERE prs_kenmerk_key = c_km_san_nr
                 AND prs_kenmerklink_verwijder IS NULL) sannr,
             prs_kostenplaats k,
             prs_kostenplaats kp,
             prs_kostenplaatsgrp kg,
             alg_v_ruimte_gegevens rg
       WHERE huurder.cnt_contract_key(+) = c.cnt_contract_key
         AND pnummer.cnt_contract_key(+) = c.cnt_contract_key
         AND ruimte.cnt_contract_key(+) = c.cnt_contract_key
         AND kp.prs_kostenplaats_key = c.prs_kostenplaats_key
         AND kg.prs_kostenplaatsgrp_key(+) = kp.prs_kostenplaatsgrp_key
         AND p.prs_perslid_key(+) = fac.safe_to_number(huurder.cnt_kenmerkcontract_waarde)
         AND pf.prs_perslid_key(+) = p.prs_perslid_key
         AND codanr.prs_link_key(+) = p.prs_perslid_key
         AND sannr.prs_link_key(+) = p.prs_perslid_key
         AND k.prs_kostenplaats_key(+) = fac.safe_to_number(pnummer.cnt_kenmerkcontract_waarde)
         AND rg.alg_ruimte_key(+) = fac.safe_to_number(ruimte.cnt_kenmerkcontract_waarde)
         AND c.cnt_contract_verwijder IS NULL
         AND TO_DATE(p_periode, 'YYYYMM') BETWEEN TRUNC(c.cnt_contract_looptijd_van, 'MM')
                                              AND TRUNC(c.cnt_contract_looptijd_tot, 'MM');

   v_periodeDate           DATE;
   v_periodeNaam           VARCHAR2(20);
   v_aantalPeriodes        NUMBER;
   v_curPeriodeDate        DATE;
   v_curPeriode            VARCHAR2(10);
   v_curPeriodeNaam        VARCHAR2(20);
   v_oms                   fac_usrdata.fac_usrdata_omschr%TYPE;
   v_btw_code              fac_usrdata.fac_usrdata_omschr%TYPE;
   v_btw_perc              fac_usrdata.fac_usrdata_code%TYPE;
   v_grtbk                 prs_kostensoort.prs_kostensoort_refcode%TYPE;
   v_kpl                   prs_kostenplaats.prs_kostenplaats_nr%TYPE;
   v_proj                  prs_kostenplaats.prs_kostenplaats_nr%TYPE;
   v_prijsfactor           NUMBER(6,5);
   v_betreft               VARCHAR(20);
   v_refnr                 VARCHAR(20);

BEGIN

   -- Buffer en log leegmaken
   DELETE nybu_huur_buffer;
   DELETE imp_log WHERE imp_log_applicatie = p_applname;

   v_periodeDate := TO_DATE(p_periode,'YYYYMM');
   v_periodeNaam := nybu.getPeriodeNaam(p_periode, 'EN');

   v_betreft := 'Campus';
   FOR rec IN sr
   LOOP
      v_aanduiding := rec.cnt_contract_nummer_intern||'/'||rec.naam;

      -- Huur, servicekosten en toeslagen kunnen een X aantal maanden vooruit betaald worden
      IF (rec.aantal_periodes > 1)
      THEN
         fac.writelog (
            p_applname, 'I',
            v_aanduiding || ': meerdere maanden in één keer factureren',
            'Aantal maanden: '||rec.aantal_periodes);
      END IF;
      FOR cntr IN 1..rec.aantal_periodes
      LOOP
         -- Voor de eerste en laatste maand wordt voor de huurprijs etc mogelijk maar
         -- een deel doorbelast, als het contract halverwege de maand begint/eindigt.
         -- Daarvoor een prijsfactor
         v_prijsfactor := 1;

         -- Bepaal gegevens van door-te-belasten periode (bij meerdere periodes in één keer
         -- doorbelasten is dit steeds een maand verder)
         v_curPeriodeDate := ADD_MONTHS(v_periodeDate, cntr-1);
         v_curPeriode  := TO_CHAR(v_curPeriodeDate, 'YYYYMM');
         v_curPeriodeNaam := nybu.getPeriodeNaam(v_curPeriode, 'EN');

         -- Lopend contract? --> huur etc factureren
         IF (v_curPeriodeDate BETWEEN TRUNC(rec.cnt_contract_looptijd_van, 'MM')
                                  AND TRUNC(rec.cnt_contract_looptijd_tot, 'MM') )
         THEN
            -- Is de ingangsmaand van het contract volledig, of beginnen we halverwege?
            -- (alleen checken bij ingangsmaand contract)
            IF (TRUNC(rec.cnt_contract_looptijd_van, 'MM') = v_curPeriodeDate)
            THEN
               v_prijsfactor := nybu.getPrijsFactor(rec.cnt_contract_looptijd_van, NULL, v_curPeriodeDate);

               IF (v_prijsfactor != 1)
               THEN
                  fac.writelog (
                     p_applname, 'I',
                     v_aanduiding || ': contract start halverwege '||v_curPeriodeNaam,
                     'Prijsfactor = '||v_prijsfactor);
               END IF;

            -- Is de eindmaand van het contract volledig, of eindigen we halverwege?
            -- (alleen checken in slotmaand contract)
            ELSIF (TRUNC(rec.cnt_contract_looptijd_tot, 'MM') = v_curPeriodeDate)
            THEN
               v_prijsfactor := nybu.getPrijsFactor(NULL, rec.cnt_contract_looptijd_tot, v_curPeriodeDate);

               IF (v_prijsfactor != 1)
               THEN
                  fac.writelog (
                     p_applname, 'I',
                     v_aanduiding || ': contract eindigt halverwege '||v_curPeriodeNaam,
                     'Prijsfactor = '||v_prijsfactor);
               END IF;
            END IF;

            --- HUURPRIJS ---
            v_errormsg := 'Archiefregel huurprijs aanmaken';
            -- Plaats in archief
            -- met juiste kostenplaatsen en -soorten, omschrijving
            INSERT INTO nybu_huur_buffer (
               betreft, datum_export,
               periode, isMutatie,
               deb_nr,
               achternaam, naam_full, prs_perslid_key,
               cnt_contract_nr, cnt_contract_key,
               kamer, alg_ruimte_key,
               omschrijving,
               kpn_code_afd, kpn_code_proj, prs_kostensoort_refcode, btw_code, btw_perc,
               bedrag)
            SELECT v_betreft, p_run,
                   p_periode, 0,
                   COALESCE (rec.budget_huur, rec.codanr),
                   rec.achternaam, rec.naam, rec.prs_perslid_key,
                   rec.cnt_contract_nummer_intern, rec.cnt_contract_key,
                   rec.kamer, rec.alg_ruimte_key,
                   oms.fac_usrdata_omschr||' '||v_curPeriodeNaam,
                   rec.kpngrp,
                   rec.kpn,
                   '19010',
                   btw.fac_usrdata_omschr,
                   fac.safe_to_number(btw.fac_usrdata_code),
                   TRUNC(v_prijsfactor * rec.huur_werkelijk, 2)
              FROM fac_usrdata oms,
                   fac_usrdata btw
             WHERE oms.fac_usrtab_key = c_usrtab_coda_oms
               AND btw.fac_usrdata_key = oms.fac_usrdata_parentkey
               AND oms.fac_usrdata_code = 'Rent';

            --- SERVICEKOSTEN ---
            v_errormsg := 'Archiefregel servicekosten aanmaken';
            -- Plaats in archief
            -- met juiste kostenplaatsen en -soorten, omschrijving
            INSERT INTO nybu_huur_buffer (
               betreft, datum_export,
               periode, isMutatie,
               deb_nr,
               achternaam, naam_full, prs_perslid_key,
               cnt_contract_nr, cnt_contract_key,
               kamer, alg_ruimte_key,
               omschrijving,
               kpn_code_afd, kpn_code_proj, prs_kostensoort_refcode, btw_code, btw_perc,
               bedrag)
            SELECT v_betreft, p_run,
                   p_periode, 0,
                   COALESCE (rec.budget_service, rec.codanr),
                   rec.achternaam, rec.naam, rec.prs_perslid_key,
                   rec.cnt_contract_nummer_intern, rec.cnt_contract_key,
                   rec.kamer, rec.alg_ruimte_key,
                   oms.fac_usrdata_omschr||' '||v_curPeriodeNaam,
                   rec.kpngrp,
                   rec.kpn,
                   '19010',
                   btw.fac_usrdata_omschr,
                   fac.safe_to_number(btw.fac_usrdata_code),
                   TRUNC(v_prijsfactor * rec.servicekosten_werkelijk, 2)
              FROM fac_usrdata oms,
                   fac_usrdata btw
             WHERE oms.fac_usrtab_key = c_usrtab_coda_oms
               AND btw.fac_usrdata_key = oms.fac_usrdata_parentkey
               AND oms.fac_usrdata_code = 'ServCost';

            --- PARTNERCHARGE ---
            IF (rec.roommate IS NOT NULL OR rec.partner_naam IS NOT NULL)
            THEN
               v_errormsg := 'Archiefregel partnercharge aanmaken';
               -- Plaats in archief
               -- met juiste kostenplaatsen en -soorten, omschrijving
               INSERT INTO nybu_huur_buffer (
                  betreft, datum_export,
                  periode, isMutatie,
                  deb_nr,
                  achternaam, naam_full, prs_perslid_key,
                  cnt_contract_nr, cnt_contract_key,
                  kamer, alg_ruimte_key,
                  omschrijving,
                  kpn_code_afd, kpn_code_proj, prs_kostensoort_refcode, btw_code, btw_perc,
                  bedrag)
               SELECT v_betreft, p_run,
                      p_periode, 0,
                      COALESCE (rec.budget_service, rec.codanr),
                      rec.achternaam, rec.naam, rec.prs_perslid_key,
                      rec.cnt_contract_nummer_intern, rec.cnt_contract_key,
                      rec.kamer, rec.alg_ruimte_key,
                      oms.fac_usrdata_omschr||' '||v_curPeriodeNaam,
                      rec.kpngrp,
                      rec.kpn,
                      '19010',
                      btw.fac_usrdata_omschr,
                      fac.safe_to_number(btw.fac_usrdata_code),
                      TRUNC(v_prijsfactor * rec.partnercharge_werkelijk, 2)
                 FROM fac_usrdata oms,
                      fac_usrdata btw
                WHERE oms.fac_usrtab_key = c_usrtab_coda_oms
                  AND btw.fac_usrdata_key = oms.fac_usrdata_parentkey
                  AND oms.fac_usrdata_code = 'PartnerCh';
            END IF;

            --- TELEFOONAANSLUITING ---
            IF (rec.telefooncharge IS NOT NULL AND rec.telefooncharge != 0)
            THEN
               v_errormsg := 'Archiefregel telefoonaansluiting aanmaken';
               -- Plaats in archief
               -- met juiste kostenplaatsen en -soorten, omschrijving
               INSERT INTO nybu_huur_buffer (
                  betreft, datum_export,
                  periode, isMutatie,
                  deb_nr,
                  achternaam, naam_full, prs_perslid_key,
                  cnt_contract_nr, cnt_contract_key,
                  kamer, alg_ruimte_key,
                  omschrijving,
                  kpn_code_afd, kpn_code_proj, prs_kostensoort_refcode, btw_code, btw_perc,
                  bedrag)
               SELECT v_betreft, p_run,
                      p_periode, 0,
                      COALESCE (rec.budget_telefoon, rec.codanr),
                      rec.achternaam, rec.naam, rec.prs_perslid_key,
                      rec.cnt_contract_nummer_intern, rec.cnt_contract_key,
                      rec.kamer, rec.alg_ruimte_key,
                      oms.fac_usrdata_omschr||' '||v_curPeriodeNaam,
                      rec.kpngrp,
                      rec.kpn,
                      '19010',
                      btw.fac_usrdata_omschr,
                      fac.safe_to_number(btw.fac_usrdata_code),
                      TRUNC(v_prijsfactor * rec.telefooncharge_werkelijk, 2)
                 FROM fac_usrdata oms,
                      fac_usrdata btw
                WHERE oms.fac_usrtab_key = c_usrtab_coda_oms
                  AND btw.fac_usrdata_key = oms.fac_usrdata_parentkey
                  AND oms.fac_usrdata_code = 'PhoneConn';
            END IF;

         ELSE
            fac.writelog (
               p_applname, 'W',
               v_aanduiding || ': contract loopt niet in gegeven periode!',
               'Periode: '||v_curPeriodeNaam);
         END IF;  -- Lopend?

      END LOOP;

      -- Als huur vooruit betaald, dan aangeven t/m welke periode
      -- (kenmerken alleen bijwerken als we ook doorvoeren)
      IF (rec.aantal_periodes > 1 AND p_doorvoeren = 1)
      THEN
         -- We hebben nu vooruit gefactureerd; "Bill in advance" leegmaken
         UPDATE cnt_kenmerkcontract
            SET cnt_kenmerkcontract_verwijder = SYSDATE
          WHERE cnt_kenmerk_key = c_km_vooruit_betalen
            AND cnt_contract_key = rec.cnt_contract_key
            AND cnt_kenmerkcontract_verwijder IS NULL;

         -- Voorlopig geen facturering; "Contract paid until" vullen
         INSERT INTO cnt_kenmerkcontract
           (cnt_contract_key, cnt_kenmerk_key, cnt_kenmerkcontract_waarde)
         VALUES
           (rec.cnt_contract_key,
            c_km_betaald_tot,
            v_curPeriode);
         -- Tracking
         fac.trackaction('CNTUPD',
                         rec.cnt_contract_key,
                         4, -- _FACILITOR
                         NULL,
                         'Contract updated'|| chr(10) ||
                         rec.aantal_periodes||' months billed in advance, until '||v_curPeriode);
      ELSE
         -- (weer) normale facturering; "Contract paid until" leegmaken als gevuld
         UPDATE cnt_kenmerkcontract
            SET cnt_kenmerkcontract_verwijder = SYSDATE
          WHERE cnt_kenmerk_key = c_km_betaald_tot
            AND cnt_contract_key = rec.cnt_contract_key
            AND cnt_kenmerkcontract_verwijder IS NULL;
      END IF;
   END LOOP;

   COMMIT;

   -- Residences & offices
   FOR rec IN ro
   LOOP
      v_aanduiding := rec.cnt_contract_key||'/'||rec.prs_perslid_naam||'/'||rec.alg_ruimte_aanduiding;
      v_betreft := rec.betreft;
      v_refnr := COALESCE(rec.prs_kostenplaats_nr, rec.codanr);
      v_prijsfactor := 1;

      v_errormsg := 'Archiefregels huur aanmaken';
      -- Plaats in archief
      -- met juiste kostenplaatsen en -soorten, omschrijving
      -- Voor één contract kunnen in één keer meerdere regels worden toegevoegd
      INSERT INTO nybu_huur_buffer (
         betreft, datum_export,
         periode, isMutatie,
         deb_nr,
         achternaam, naam_full, prs_perslid_key,
         cnt_contract_nr, cnt_contract_key,
         kamer, alg_ruimte_key,
         omschrijving,
         kpn_code_afd, kpn_code_proj, prs_kostensoort_refcode, btw_code, btw_perc,
         bedrag)
      SELECT v_betreft, p_run,
             p_periode, 0,
             DECODE(rec.betreft,
                    'Office', v_refnr,
                    CASE
                      WHEN k.cnt_kenmerk_volgnummer BETWEEN 100 AND 200
                      THEN
                         rec.codanr
                      WHEN k.cnt_kenmerk_volgnummer BETWEEN 200 AND 300
                      THEN
                         rec.prs_kostenplaats_nr
                      WHEN k.cnt_kenmerk_volgnummer > 300
                      THEN
                         'salaris'
                    END)
                refnr,
             rec.prs_perslid_naam, rec.prs_perslid_naam_full, rec.prs_perslid_key,
             rec.cnt_contract_nummer_intern, rec.cnt_contract_key,
             rec.alg_ruimte_aanduiding, rec.alg_ruimte_key,
             sk.cnt_srtkenmerk_omschrijving||' '||v_periodeNaam,
             rec.kpngrp,
             rec.kpn,
             '19010',
             sk.cnt_srtkenmerk_dimensie,
             fac.safe_to_number(ud.fac_usrdata_code),
               nybu.getPrijsFactor(rec.cnt_contract_looptijd_van, rec.cnt_contract_looptijd_tot, v_periodeDate)
             * fac.safe_to_number(kc.cnt_kenmerkcontract_waarde)
             --fac.safe_to_number(kc.cnt_kenmerkcontract_waarde) / (1+fac.safe_to_number(ud.fac_usrdata_code)/100)
        FROM cnt_kenmerkcontract kc,
             cnt_kenmerk k,
             cnt_srtkenmerk sk,
             fac_usrdata ud
       WHERE kc.cnt_contract_key = rec.cnt_contract_key
         AND kc.cnt_kenmerkcontract_verwijder IS NULL
         AND k.cnt_kenmerk_key = kc.cnt_kenmerk_key
         AND k.cnt_kenmerk_verwijder IS NULL
         AND k.cnt_kenmerk_volgnummer > 100
         AND fac.safe_to_number(kc.cnt_kenmerkcontract_waarde) IS NOT NULL
         AND fac.safe_to_number(kc.cnt_kenmerkcontract_waarde) > 0
         AND sk.cnt_srtkenmerk_key = k.cnt_srtkenmerk_key
         AND sk.cnt_srtkenmerk_verwijder IS NULL
         AND sk.cnt_srtkenmerk_kenmerktype = 'N'
         AND UPPER(ud.fac_usrdata_omschr) = UPPER(sk.cnt_srtkenmerk_dimensie)
         AND ud.fac_usrtab_key = c_usrtab_coda_btw;
   END LOOP;

   COMMIT;

   -- Als definitief, dan buffer naar archief kopiëren
   IF (p_doorvoeren = 1)
   THEN
      INSERT INTO nybu_huur_archief
         SELECT * FROM nybu_huur_buffer
          WHERE periode = p_periode;

      COMMIT;
   -- Anders eventuele nog niet-geëxporteerde mutatieregels in de buffer zetten
   ELSE
      INSERT INTO nybu_huur_buffer
         SELECT * FROM nybu_huur_archief
          WHERE periode = p_periode
            AND ismutatie = 1
            AND naar_coda IS NULL;
   END IF;

EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
            v_errorhint
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.writelog (
         p_applname,
         'E',
         v_aanduiding || v_errormsg,
         'Onbekende fout!');
      COMMIT;
END nybu_bereken_factuurregels;
/

CREATE OR REPLACE PROCEDURE nybu_select_huur_coda (
      p_applname IN VARCHAR2,
      p_applrun IN VARCHAR2)
AS
   v_aanduiding            VARCHAR2 (200);
   v_errorhint             VARCHAR2 (1000);
   v_errormsg              VARCHAR2 (1000);
   oracle_err_num          NUMBER;
   oracle_err_mes          VARCHAR2 (200);

   -- Individuele facturen voor debiteuren; ook voor sommatieregel met totaalbedrag
   -- Bedragen zijn incl BTW
   CURSOR c_deb
   IS
        SELECT deb_nr, achternaam, SUM(bedrag) bedrag, betreft
          FROM nybu_huur_archief
         WHERE naar_coda IS NULL
           AND deb_nr NOT LIKE 'P%'
           AND deb_nr != 'salaris'
      GROUP BY deb_nr, achternaam, betreft
      ORDER BY deb_nr;

   -- Factuurregels voor deze factuur
   CURSOR regels (in_deb_nr VARCHAR2)
   IS
      SELECT *
        FROM nybu_huur_archief
       WHERE deb_nr = in_deb_nr
         AND naar_coda IS NULL
      ORDER BY datum_export;

   -- Individuele facturen voor interne kostenplaatsen; ook voor sommatieregel met totaalbedrag
   -- Bedragen zijn excl BTW
   CURSOR c_kpn
   IS
        SELECT deb_nr, achternaam,
               COALESCE( TRIM( SUBSTR(kg.prs_kostenplaatsgrp_oms, 1, 7) ),
                        'ONB')
                  kpn_grp,
               kpn_code_afd,
               kpn_code_proj,
               SUM(bedrag/(1+btw_perc/100)) bedrag,
               betreft
          FROM nybu_huur_archief ha,
               prs_v_aanwezigkostenplaats ak,
               prs_kostenplaatsgrp kg
         WHERE naar_coda IS NULL
           AND deb_nr LIKE 'P%'
           AND ak.prs_kostenplaats_nr = deb_nr
           AND kg.prs_kostenplaatsgrp_key(+) = ak.prs_kostenplaatsgrp_key
      GROUP BY deb_nr, achternaam, prs_kostenplaatsgrp_oms, kpn_code_afd, kpn_code_proj, betreft
      ORDER BY deb_nr;

   CURSOR c_salaris
   IS
        SELECT COALESCE(prs_perslid_nr, prs_perslid_email) personeelsnr,
               achternaam,
               kpn_code_afd,
               kpn_code_proj,
               bedrag,
               btw_perc,
               omschrijving
          FROM nybu_huur_archief b,
               prs_perslid p
         WHERE naar_coda IS NULL
           AND deb_nr = 'salaris'
           AND p.prs_perslid_key = b.prs_perslid_key
      ORDER BY achternaam;

   v_teller                NUMBER;
   v_rap_count             NUMBER;
   v_run                   DATE;
   v_lastPeriode           VARCHAR(6);
   v_periode               VARCHAR(6);
   v_periodeNaam           VARCHAR2(20);
   v_last_period           VARCHAR(6);
BEGIN
   v_teller       := 0;
   v_rap_count    := 0;

   v_aanduiding   := 'Init';
   v_errormsg     := 'Periode bepalen';

   -- Deze export gaat over de huur voor volgende maand (periode = laatste export + 1)
   v_run          := TO_DATE(p_applrun, 'YYYY-MM-DD HH24:MI:SS');
   SELECT MAX(periode)
     INTO v_lastPeriode
     FROM nybu_huur_archief
    WHERE ismutatie = 0;
   v_periode      := TO_CHAR(ADD_MONTHS(TO_DATE(v_lastPeriode, 'YYYYMM'), 1), 'YYYYMM');
   v_periodeNaam  := nybu.getPeriodeNaam(v_periode, 'EN');

   -- Is deze periode al geëxporteerd?
   -- TODO: Niks doen, of wissen en nog een keer draaien?
   SELECT COALESCE(MAX(periode), 'NogNix')
     INTO v_last_period
     FROM nybu_huur_archief
    WHERE ismutatie = 0;

   IF (v_last_period = v_periode)
   THEN
      fac.writelog (
         p_applname,
         'E',
         'Export is al gedraaid voor periode '||v_periode||'!',
         'Export wordt afgebroken');
   ELSE

      DELETE imp_log
       WHERE imp_log_applicatie = p_applname;
      DELETE fac_rapport
       WHERE fac_rapport_node = p_applname;

      -- Genereer factuurregels voor komende maand
      nybu_bereken_factuurregels(p_applname, v_run, v_periode, 1);

      -- Genereer sommatie- en specificatieregels voor debiteuren
      FOR rec IN c_deb
      LOOP
         v_aanduiding := v_teller||': '||rec.deb_nr||'/'||rec.achternaam;
         v_errormsg   := 'Sommatieregel aanmaken';
         v_teller := v_teller + 1;
         v_rap_count := v_rap_count + 1;

         -- Sommatieregel
         INSERT INTO fac_rapport
           (fac_rapport_node,
            fac_rapport_volgnr,
            fac_rapport_regel,
            fac_rapport_soort)
         VALUES
           (p_applname,
            v_rap_count,
            v_teller ||';'||
            '10;' ||
            '13000;' ||
            REPLACE(rec.deb_nr, 'CON', 'DC') ||';'||
            ';' ||
            TRIM( TO_CHAR( ABS(rec.bedrag),
                              '99999999D99',
                              'NLS_NUMERIC_CHARACTERS=,.') ) ||';'||
            CASE
               WHEN rec.bedrag <  0 THEN 'C;'
               WHEN rec.bedrag >= 0 THEN 'D;'
            END ||
            ';' ||
            rec.betreft||' '||v_periodeNaam||' '||rec.achternaam ||';'||
            'Summary;' ||
            'K91200;' ||
            'P991210',
            0);

         -- Specificatieregels
         FOR reg IN regels (rec.deb_nr)
         LOOP
            v_errormsg   := 'Specificatieregel aanmaken';
            v_rap_count := v_rap_count + 1;
            INSERT INTO fac_rapport
              (fac_rapport_node,
               fac_rapport_volgnr,
               fac_rapport_regel,
               fac_rapport_soort)
            VALUES
              (p_applname,
               v_rap_count,
               v_teller ||';'||
               '12;' ||
               reg.prs_kostensoort_refcode ||';'||
               reg.kpn_code_afd ||';'||
               reg.kpn_code_proj ||';'||
               TRIM( TO_CHAR( ABS(reg.bedrag),
                              '99999999D99',
                              'NLS_NUMERIC_CHARACTERS=,.') ) ||';'||
               CASE
                  WHEN reg.bedrag <  0 THEN 'D;'
                  WHEN reg.bedrag >= 0 THEN 'C;'
               END ||
               reg.btw_code ||';'||
               reg.omschrijving ||';'||
               'Analysis;' ||
               ';' ||
               '',
               0);
         END LOOP;

      END LOOP;

      -- Scheidingsregel
      v_errormsg   := 'Scheidingsregel aanmaken';
      v_rap_count := v_rap_count + 1;
      INSERT INTO fac_rapport
        (fac_rapport_node,
         fac_rapport_volgnr,
         fac_rapport_regel,
         fac_rapport_soort)
      VALUES
        (p_applname,
         v_rap_count,
         'INTERNE KOSTENPLAATSEN;;;;;;;;;;;',
         0);
      v_teller := 0;

      -- Genereer sommatie- en specificatieregels voor interne kostenplaatsen
      FOR rec IN c_kpn
      LOOP
         v_aanduiding := v_teller||': '||rec.deb_nr||'/'||rec.achternaam;
         v_errormsg   := 'Sommatieregel KPN aanmaken';
         v_teller := v_teller + 1;
         v_rap_count := v_rap_count + 1;

         -- Sommatieregel
         INSERT INTO fac_rapport
           (fac_rapport_node,
            fac_rapport_volgnr,
            fac_rapport_regel,
            fac_rapport_soort)
         VALUES
           (p_applname,
            v_rap_count,
            v_teller ||';'||
            ';' ||
            '56000;' ||
            rec.kpn_grp ||';'||
            rec.deb_nr ||';'||
            TRIM( TO_CHAR( ABS(rec.bedrag),
                              '99999999D99',
                              'NLS_NUMERIC_CHARACTERS=,.') ) ||';'||
            CASE
               WHEN rec.bedrag <  0 THEN 'C;'
               WHEN rec.bedrag >= 0 THEN 'D;'
            END ||
            ';' ||
            rec.betreft||' '||v_periodeNaam||' '||rec.achternaam ||';'||
            ';' ||
            ';' ||
            '',
            0);

         -- Tegenboeking
         v_errormsg   := 'Tegenboeking aanmaken';
         v_rap_count := v_rap_count + 1;
         INSERT INTO fac_rapport
           (fac_rapport_node,
            fac_rapport_volgnr,
            fac_rapport_regel,
            fac_rapport_soort)
         VALUES
           (p_applname,
            v_rap_count,
            v_teller ||';'||
            ';' ||
            '76000;'||
            rec.kpn_code_afd ||';'||
            rec.kpn_code_proj ||';'||
            TRIM( TO_CHAR( ABS(rec.bedrag),
                           '99999999D99',
                           'NLS_NUMERIC_CHARACTERS=,.') ) ||';'||
            CASE
               WHEN rec.bedrag <  0 THEN 'D;'
               WHEN rec.bedrag >= 0 THEN 'C;'
            END ||
            ';' ||
            rec.betreft||' '||v_periodeNaam||' '||rec.achternaam ||';'||
            ';' ||
            ';' ||
            '',
            0);

      END LOOP;

      -- Scheidingsregel
      v_errormsg   := 'Scheidingsregel aanmaken';
      v_rap_count := v_rap_count + 1;
      INSERT INTO fac_rapport
        (fac_rapport_node,
         fac_rapport_volgnr,
         fac_rapport_regel,
         fac_rapport_soort)
      VALUES
        (p_applname,
         v_rap_count,
         'SALARISADMINISTRATIE;;;;;;;;;;;',
         0);
      v_teller := 0;

      -- Genereer specificatieregels voor salarisadministratie
      FOR rec IN c_salaris
      LOOP
         v_aanduiding := v_teller||': '||rec.personeelsnr||'/'||rec.achternaam;
         v_errormsg   := 'Sommatieregel salarisadministratie aanmaken';
         v_teller := v_teller + 1;
         v_rap_count := v_rap_count + 1;

         -- Sommatieregel
         INSERT INTO fac_rapport
           (fac_rapport_node,
            fac_rapport_volgnr,
            fac_rapport_regel,
            fac_rapport_soort)
         VALUES
           (p_applname,
            v_rap_count,
            v_teller ||';'||
            rec.personeelsnr ||';'||
            rec.achternaam ||';'||
            rec.kpn_code_afd ||';'||
            rec.kpn_code_proj ||';'||
            TRIM( TO_CHAR( ABS(rec.bedrag),
                              '99999999D99',
                              'NLS_NUMERIC_CHARACTERS=,.') ) ||';'||
            rec.btw_perc ||';'||
            rec.omschrijving||';'||
            ';' ||
            ';' ||
            ';' ||
            '',
            0);

      END LOOP;

   END IF;

   COMMIT;

EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
            v_errorhint
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.writelog (
         p_applname,
         'E',
         v_aanduiding || v_errormsg,
         'Onbekende fout!');
      COMMIT;
END nybu_select_huur_coda;
/


BEGIN adm.systrackscriptId('$Id$'); END;
/

COMMIT;

SPOOL OFF