-- Customer specific once-script
--
-- (c) 2016 Facilitor B.V.
--
-- Support: +31 53 4800700
SET ECHO ON
SPOOL xNYBU38040.lst
SET DEFINE OFF

CREATE OR REPLACE PROCEDURE nybu_select_huur_mutaties (
   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);

   -- Mutaties nieuw versus oud (waarbij nieuw het uitgangspunt is ivm kameromschrijving):
   --   - oude bedrag != nieuwe bedrag
   --   - oud bestaat niet in nieuw
   --   - nieuw bestaat niet in oud
   -- NYBU#29529: regels ook vergelijken op naam van huurder, ivm deb_nr 'salaris', dat voor
   -- verschillende personen natuurlijk hetzelfde is (idem voor P-nummer, trouwens)
   --NYBU#38040 Er moet ook rekening gehouden worden met meerdere versies van 1 contract
   CURSOR c (
      in_periode VARCHAR2)
   IS
      WITH nw AS (SELECT *
                    FROM nybu_huur_buffer
                   WHERE periode = in_periode),
           oud
              AS (SELECT a.*
                    FROM nybu_huur_archief a,
                         cnt_kenmerkcontract kc,
                         cnt_kenmerk k
                   WHERE     kc.cnt_contract_key = a.cnt_contract_key
                         AND kc.cnt_kenmerkcontract_verwijder IS NULL
                         AND k.cnt_kenmerk_key = kc.cnt_kenmerk_key
                         AND k.cnt_srtkenmerk_key = 681
                         AND periode = in_periode
                         AND naar_coda IS NOT NULL
                         AND ismutatie = 0)
      SELECT nw.*,
             COALESCE (oud.bedrag, 0) bedrag_oud,
             COALESCE (nw.bedrag, 0) bedrag_new
        FROM    nw
             LEFT OUTER JOIN
                oud
             ON     oud.cnt_contract_key = nw.cnt_contract_key --- Er moet ook naar de versie van het contract gekeken worden
                AND oud.deb_nr = nw.deb_nr
                AND oud.omschrijving = nw.omschrijving
                AND oud.kamer = nw.kamer
                AND COALESCE (oud.naam_full, 'apekool') =
                      COALESCE (nw.naam_full, 'apekool')
       WHERE oud.bedrag IS NULL                   -- nieuw bestaat niet in oud
                               OR nw.bedrag != oud.bedrag -- nieuw bedrag != oud bedrag
      UNION
      SELECT oud.*,
             COALESCE (oud.bedrag, 0) bedrag_oud,
             COALESCE (nw.bedrag, 0) bedrag_new
        FROM    oud
             LEFT OUTER JOIN
                nw
             ON      oud.cnt_contract_key = nw.cnt_contract_key --- Er moet ook naar de versie van het contract gekeken worden
                AND oud.deb_nr = nw.deb_nr
                AND oud.omschrijving = nw.omschrijving
                AND oud.kamer = nw.kamer
                AND COALESCE (oud.naam_full, 'apekool') =
                      COALESCE (nw.naam_full, 'apekool')
       WHERE nw.bedrag IS NULL                    -- oud bestaat niet in nieuw
                              ;

   v_run            DATE;
   v_periode        VARCHAR (6);
   v_periodeNaam    VARCHAR2 (20);
   v_next_period    VARCHAR (6);
BEGIN
   v_aanduiding := 'Init';
   v_errormsg := 'Periode bepalen';

   -- Deze export maakt correctieregels voor de huur van de laatst geëxporteerde maand
   -- TODO: afdwingen dat die periode niet te ver in het verleden ligt?
   v_run := TO_DATE (p_applrun, 'YYYY-MM-DD HH24:MI:SS');

   SELECT MAX (periode)
     INTO v_periode
     FROM nybu_huur_archief
    WHERE isMutatie = 0;

   v_periodeNaam := nybu.getPeriodeNaam (v_periode, 'EN');

   -- Mutaties over periode n komen op factuur voor periode n+1
   v_next_period :=
      TO_CHAR (ADD_MONTHS (TO_DATE (v_periode, 'YYYYMM'), 1), 'YYYYMM');

   DELETE imp_log
    WHERE imp_log_applicatie = p_applname;

   DELETE fac_rapport
    WHERE fac_rapport_node = p_applname;

   -- Eerder gemaakte mutatieregels voor deze periode verwijderen
   DELETE nybu_huur_archief
    WHERE isMutatie = 1 AND periode >= v_next_period AND naar_coda IS NULL;

   -- Genereer factuurregels voor deze maand (mode 2 = allonges)
   nybu_bereken_factuurregels (p_applname,
                               v_run,
                               v_periode,
                               2);

   -- Genereer mutatieregels
   FOR rec IN c (v_periode)
   LOOP
      v_aanduiding :=
            v_periode
         || '/'
         || rec.deb_nr
         || '/'
         || rec.achternaam
         || '/'
         || rec.omschrijving;
      v_errormsg := 'Mutatieregel aanmaken';

      INSERT INTO nybu_huur_archief (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)
          VALUES (rec.betreft,
                  v_run,
                  v_next_period,
                  1,
                  rec.deb_nr,
                  rec.achternaam,
                  rec.naam_full,
                  rec.prs_perslid_key,
                  rec.cnt_contract_nr,
                  rec.cnt_contract_key,
                  rec.kamer,
                  rec.alg_ruimte_key,
                  'Correction ' || rec.omschrijving,
                  rec.kpn_code_afd,
                  rec.kpn_code_proj,
                  rec.prs_kostensoort_refcode,
                  rec.btw_code,
                  rec.btw_perc,
                  rec.bedrag_new - rec.bedrag_oud);

      fac.writelog (
         p_applname,
         'I',
         'Mutatieregel voor ' || v_aanduiding,
         rec.omschrijving || ': ' || (rec.bedrag_new - rec.bedrag_oud));
   END LOOP;

   -- Verwijder 'niet-mutatie regels' (die zijn in de buffer aangemaakt door nybu_bereken_factuurregels() )
   DELETE nybu_huur_buffer
    WHERE isMutatie = 0 AND periode = v_periode AND naar_coda IS NULL;

   -- Zet allongeregels in huurbuffer
   INSERT INTO nybu_huur_buffer
      SELECT *
        FROM nybu_huur_archief
       WHERE periode = v_next_period AND ismutatie = 1 AND naar_coda IS NULL;

   fac.writelog (p_applname,
                 'S',
                 'Mutatieregels gegenereerd',
                 'Periode ' || v_periode);

   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_mutaties;
/

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