All Downloads are FREE. Search and download functionalities are using the official Maven repository.

expsigladb.Package.CNRCTB260_BODY.sql Maven / Gradle / Ivy

There is a newer version: 6.6.11
Show newest version
--------------------------------------------------------
--  DDL for Package Body CNRCTB260
--------------------------------------------------------

  CREATE OR REPLACE PACKAGE BODY "CNRCTB260" AS
--==================================================================================================
-- Inserimento record per titolo report (comune a tutte le stampe IVA)
--==================================================================================================
PROCEDURE insTitColReportGenerico
   (
    repID INTEGER,
    aSequenza IN OUT INTEGER,
    aTitoloReport1 VARCHAR2,
    aTitoloReport2 VARCHAR2,
    aTitoloReport3 VARCHAR2,
    aDenominazioneEnte VARCHAR2,
    aPIvaEnte VARCHAR2,
    aEsercizioRif INTEGER,
    gruppoStm CHAR,
    sottoGruppoStm CHAR,
    descrizioneGruppoStm VARCHAR2,
    aTipoReport VARCHAR2,
    aTipoRegistro VARCHAR2
   ) IS
   aStringaPartitaIva VARCHAR2(50);

BEGIN

   IF aPIvaEnte IS NOT NULL THEN
      aStringaPartitaIva:='Partita Iva ' || aPIvaEnte;
   ELSE
      aStringaPartitaIva:=NULL;
   END IF;

   -- Inserimento in base dati

   BEGIN

      INSERT INTO REPORT_GENERICO
             (id,
              chiave,
              tipo,
              sequenza,
              descrizione,
              attributo_1,
              attributo_2,
              attributo_3,
              importo_20,
              attributo_36,
              attributo_37,
              attributo_38,
              attributo_39,
              attributo_40)
      VALUES (repID,
              gruppoStm,
              'R',
              aSequenza,
              sottoGruppoStm,
              aTitoloReport1,
              aTitoloReport2,
              aTitoloReport3,
              aEsercizioRif,
              aDenominazioneEnte,
              aStringaPartitaIva,
              aTipoReport,
              aTipoRegistro,
              descrizioneGruppoStm);

   EXCEPTION

      WHEN DUP_VAL_ON_INDEX THEN
           IBMERR001.RAISE_ERR_GENERICO ('Chiave duplicata in inserimento titolo report su tabella REPORT_GENERICO');

   END;

END insTitColReportGenerico;

--==================================================================================================
-- Inserimento del frontespizio per il riepilogo sezionali in caso di stampa multipla degli stessi
--==================================================================================================
PROCEDURE insProspettiPerRegistri
   (
    repID INTEGER,
    aSequenza IN OUT INTEGER,
    aPasso INTEGER,
    aCdCdsOrigine VARCHAR2,
    aCdUoOrigine VARCHAR2,
    aEsercizio NUMBER,
    aCodiceSezionale VARCHAR2,
    aDescrizioneSezionale VARCHAR2,
    aDataInizio DATE,
    aDataFine DATE,
    aTipoReport VARCHAR2,
    aTipoRegistro VARCHAR2,
    gruppoStm CHAR,
    sottoGruppoStm CHAR,
    descrizioneGruppoStm VARCHAR2
   ) IS
   cv_min_fattura VARCHAR2(10);
   cv_max_fattura VARCHAR2(10);
   gen_cv GenericCurTyp;

BEGIN


   BEGIN

      -- Recupero intervallo numeri fattura per stampa copertina in caso di stampa multipla dei registri

      IF aPasso = 2 THEN

         IF aTipoRegistro = 'A' THEN

            OPEN gen_cv FOR

                 SELECT MIN(RPAD(protocollo_iva_generale,10,' ')),
                        MAX(RPAD(protocollo_iva_generale,10,' '))
                 FROM   V_REGISTRO_IVA_ACQUISTI
                 WHERE  cd_cds_origine = aCdCdsOrigine AND
                        cd_uo_origine = aCdUoOrigine AND
                        esercizio = aEsercizio AND
                        cd_tipo_sezionale = aCodiceSezionale AND
                        (data_registrazione BETWEEN aDataInizio AND aDataFine);
         ELSE

            OPEN gen_cv FOR

                 SELECT MIN(RPAD(protocollo_iva_generale,10,' ')),
                        MAX(RPAD(protocollo_iva_generale,10,' '))
                 FROM   V_REGISTRO_IVA_VENDITE
                 WHERE  cd_cds_origine = aCdCdsOrigine AND
                        cd_uo_origine = aCdUoOrigine AND
                        esercizio = aEsercizio AND
                        cd_tipo_sezionale = aCodiceSezionale AND
                        (data_registrazione BETWEEN aDataInizio AND aDataFine);

         END IF;

      END IF;

      LOOP

         FETCH gen_cv INTO
               cv_min_fattura,
               cv_max_fattura;

         EXIT WHEN gen_cv%NOTFOUND;

         aSequenza:=aSequenza + 20;

         BEGIN

            INSERT INTO VP_STM_REGISTRO_IVA
                   (id_report,
                    gruppo,
                    tipologia_riga,
                    sequenza,
                    sottogruppo,
                    cd_cds,
                    cd_uo,
                    cd_cds_origine,
                    cd_tipo_sezionale,
                    ti_fattura,
                    provvisorio_definitivo,
                    acquisto_vendita,
                    descrizione_gruppo)
            VALUES (repID,
                    gruppoStm,
                    'D',
                    aSequenza,
                    sottoGruppoStm,
                    cv_min_fattura,
                    cv_max_fattura,
                    'REGISTRATE DALL''UNITA'' SEZIONALE',
                    aCodiceSezionale,
                    aDescrizioneSezionale,
                    aTipoReport,
                    aTipoRegistro,
                    descrizioneGruppoStm);

         EXCEPTION

            WHEN DUP_VAL_ON_INDEX THEN
                 IBMERR001.RAISE_ERR_GENERICO
                    ('Chiave duplicata in inserimento riepilogo sezionali per registro su tabella REPORT_GENERICO');
         END;

      END LOOP;

      CLOSE gen_cv;

   END;

END insProspettiPerRegistri;

-- =================================================================================================
-- Stampa corpo del registro IVA sia acquisti che vendite
-- =================================================================================================
PROCEDURE insFatturePerRegistri
   (
    repID INTEGER,
    aSequenza IN OUT INTEGER,
    aPasso INTEGER,
    aCdCdsOrigine VARCHAR2,
    aCdUoOrigine VARCHAR2,
    aEsercizio NUMBER,
    aCodiceSezionale VARCHAR2,
    aDescrizioneSezionale VARCHAR2,
    aTipoIstituzCommerc CHAR,
    aDataInizio DATE,
    aDataFine DATE,
    aTipoRegistro VARCHAR2,
    aTipoReport VARCHAR2,
    aRistampa VARCHAR2,
    gruppoStm CHAR,
    sottoGruppoStm CHAR,
    descrizioneGruppoStm VARCHAR2,
    aMonetaItalia VARCHAR2,
    aTipoReportStato VARCHAR2
   ) IS
   eseguiLock CHAR(1);
   sottoGruppoStm_new CHAR(1);
   descrizioneGruppoStm_new VARCHAR2(100);
   scritto CHAR(1);
   gen_cv GenericCurTyp;
   tiIntraBollaDoganale CHAR(1);
   importoIvaIndetraibile NUMBER(15,2);
   c_iva_esigibile  NUMBER(15,2);
BEGIN

   -----------------------------------------------------------------------------------------------
   -- Lettura fatture e scrittura in REPORT GENERICO dell'elenco fatture per stampa registri

   IF aTipoRegistro = 'A' THEN

      IF (aTipoReport = 'D' AND
          aRistampa = 'N') THEN

         -- Prima di inserire le fatture passive legate al sezionale, nella tabella REPORT_GENERICO
         -- bisogna protocollare le stesse.

         insProtFatturePassAuto(aCdCdsOrigine,
                                aCdUoOrigine,
                                aEsercizio,
                                aCodiceSezionale,
                                aTipoIstituzCommerc,
                                aTipoReport,
                                aDataInizio,
                                aDataFine,
                                'FATTURA_P');

       END IF;

       IF aRistampa = 'N' THEN

         -- STAMPA NORMALE
         OPEN gen_cv FOR

              SELECT *
              FROM   V_REGISTRO_IVA_ACQUISTI
              WHERE  cd_cds_origine = aCdCdsOrigine AND
                     cd_uo_origine  = aCdUoOrigine AND
                     esercizio = aEsercizio AND
                     cd_tipo_sezionale  = aCodiceSezionale AND
                     (data_registrazione BETWEEN aDataInizio AND aDataFine)
              ORDER BY cd_cds_origine,
                       cd_uo_origine,
                       esercizio,
                       data_registrazione,
                       numero_progressivo;

      ELSE

         -- RISTAMPA

         OPEN gen_cv FOR

              SELECT B.*
              FROM   REPORT_DETTAGLIO A,
                     V_REGISTRO_IVA_ACQUISTI B
              WHERE  A.cd_cds = aCdCdsOrigine AND
                     A.cd_unita_organizzativa = aCdUoOrigine AND
                     A.esercizio = aEsercizio AND
                     A.tipo_report = aTipoReportStato AND
                     A.cd_tipo_sezionale = aCodiceSezionale AND
                     A.data_inizio = aDataInizio AND
                     A.data_fine = aDataFine AND
                     B.cd_cds = A.cd_cds_altro AND
                     B.cd_unita_organizzativa = A.cd_uo_altro AND
                     B.esercizio = A.esercizio AND
                     B.cd_tipo_sezionale = A.cd_tipo_sezionale AND
                     B.cd_cds_origine = A.cd_cds AND
                     B.cd_uo_origine = A.cd_unita_organizzativa AND
                     B.numero_progressivo = A.pg_documento
              ORDER BY B.cd_cds_origine,
                       B.cd_uo_origine,
                       B.esercizio,
                       B.data_registrazione,
                       B.numero_progressivo;
      END IF;

   ELSE

      IF (aTipoReport = 'D' AND
          aRistampa = 'N') THEN

         InsProtFatturePassAuto(aCdCdsOrigine,
                                aCdUoOrigine,
                                aEsercizio,
                                aCodiceSezionale,
                                aTipoIstituzCommerc,
                                aTipoReport,
                                aDataInizio,
                                aDataFine,
                                'AUTOFATTURA');

      END IF;

      IF aRistampa = 'N' THEN

         -- STAMPA NORMALE

         OPEN gen_cv FOR

              SELECT *
              FROM   V_REGISTRO_IVA_VENDITE
              WHERE  cd_cds_origine = aCdCdsOrigine AND
                     cd_uo_origine = aCdUoOrigine AND
                     esercizio = aEsercizio AND
                     cd_tipo_sezionale = aCodiceSezionale AND
                     (data_emissione BETWEEN aDataInizio AND aDataFine)
              ORDER BY cd_cds_origine,
                       cd_uo_origine,
                       esercizio,
                       data_emissione,
                       protocollo_iva_generale;
      ELSE

         -- RISTAMPA

         OPEN gen_cv FOR

              SELECT B.*
              FROM   REPORT_DETTAGLIO A,
                     V_REGISTRO_IVA_VENDITE B
              WHERE  A.cd_cds = aCdCdsOrigine AND
                     A.cd_unita_organizzativa = aCdUoOrigine AND
                     A.esercizio = aEsercizio AND
                     A.tipo_report = aTipoReportStato AND
                     A.cd_tipo_sezionale = aCodiceSezionale AND
                     A.data_inizio = aDataInizio AND
                     A.data_fine = aDataFine AND
                     B.cd_cds = A.cd_cds_altro AND
                     B.cd_unita_organizzativa = A.cd_uo_altro AND
                     B.esercizio = A.esercizio AND
                     B.cd_tipo_sezionale = A.cd_tipo_sezionale AND
                     B.cd_cds_origine = A.cd_cds AND
                     B.cd_uo_origine = A.cd_unita_organizzativa AND
                     B.numero_progressivo = A.pg_documento
              ORDER BY B.cd_cds_origine,
                       B.cd_uo_origine,
                       B.esercizio,
                       B.data_emissione,
                       B.protocollo_iva_generale;

      END IF;

   END IF;

   -- fetch del cursore fatture e insert in REPORT_GENERICO

   LOOP

      FETCH gen_cv INTO
            cv_cd_cds,
            cv_cd_uo,
            cv_esercizio,
            cv_cd_cds_origine,
            cv_cd_uo_origine,
            cv_cd_tipo_sezionale,
            cv_ti_fattura,
            cv_data_registrazione,
            cv_numero_progressivo,
            cv_data_emissione,
            cv_numero_fattura,
            cv_protocollo_iva,
            cv_protocollo_iva_gen,
            cv_comm_ist_testata,
            cv_codice_anagrafico,
            cv_ragione_sociale,
            cv_imponibile_dettaglio,
            cv_iva_dettaglio,
            cv_iva_indetraibile_dettaglio,
            cv_totale_dettaglio,
            cv_comm_ist_dettaglio,
            cv_codice_iva,
            cv_percentuale_iva,
            cv_descrizione_iva,
            cv_fl_iva_detraibile,
            cv_percentuale_iva_detraibile,
            cv_gruppo_iva,
            cv_descrizione_gruppo_iva,
            cv_intra_ue,
            cv_bolla_doganale,
            cv_spedizioniere,
            cv_codice_valuta,
            cv_importo_valuta,
            cv_esigibilita_diff,
            cv_data_esigibilita_diff,
            cv_tipo_documento_ft_pas,
            cv_extra_ue,
            cv_split_payment;

      EXIT WHEN gen_cv%NOTFOUND;
      aSequenza:=aSequenza + 20;

      -- Normalizza esposizione degli importi in divisa estera

      IF cv_codice_valuta = aMonetaItalia THEN
         cv_codice_valuta:=NULL;
         cv_importo_valuta:=0;
      END IF;

      -- Valorizzazione del flag intra o bolla doganale gestito solo per registro acquisti

      IF aTipoRegistro = 'A' THEN
         IF    cv_intra_ue = 'Y' THEN
               tiIntraBollaDoganale:='I';
         ELSIF cv_bolla_doganale = 'Y' THEN
               tiIntraBollaDoganale:='B';
         ELSIF cv_spedizioniere = 'Y' THEN
               tiIntraBollaDoganale:='S';
         Elsif cv_extra_ue ='Y' Then
               tiIntraBollaDoganale:='E';
         else
               tiIntraBollaDoganale:='N';
         END IF;
      ELSE
         IF    cv_intra_ue = 'Y' THEN
               tiIntraBollaDoganale:='I';
         ELSE
               tiIntraBollaDoganale:='N';
         END IF;
      END IF;

      -- Normalizzazione del valore di iva indetraibile per l'arrotondamento corretto
      -- in base al fatto che l'esercizio sia euro o meno
      c_iva_esigibile:=0;
      IF aTipoRegistro = 'A' THEN
         cv_iva_indetraibile_dettaglio:=TRUNC(cv_iva_indetraibile_dettaglio,2);

            If cv_esigibilita_diff = 'N' THEN
               c_iva_esigibile:=cv_iva_dettaglio;
            ELSE
               IF (cv_data_esigibilita_diff IS NOT NULL AND
                   (cv_data_esigibilita_diff BETWEEN aDataInizio AND aDataFine)) THEN
                     c_iva_esigibile:=cv_iva_dettaglio;
               END IF;
            END IF;
      END IF;
      BEGIN

         INSERT INTO VP_STM_REGISTRO_IVA
                (id_report,
                 gruppo,
                 tipologia_riga,
                 sequenza,
                 sottogruppo,
                 cd_cds,
                 cd_uo,
                 esercizio,
                 cd_cds_origine,
                 cd_uo_origine,
                 cd_tipo_sezionale,
                 ti_fattura,
                 data_registrazione,
                 numero_progressivo,
                 data_emissione,
                 numero_fattura,
                 protocollo_iva,
                 protocollo_iva_generale,
                 comm_ist_testata,
                 codice_anagrafico,
                 ragione_sociale,
                 imponibile,
                 iva,
                 iva_indetraibile,
                 totale,
                 comm_ist_dettaglio,
                 codice_iva,
                 percentuale_iva,
                 descrizione_iva,
                 fl_iva_detraibile,
                 percentuale_iva_detraibile,
                 gruppo_iva,
                 descrizione_gruppo_iva,
                 intra_ue,
                 codice_valuta,
                 importo_valuta,
                 esigibilita_diff,
                 data_esigibilita_diff,
                 provvisorio_definitivo,
                 acquisto_vendita,
                 descrizione_gruppo,
                 iva_esigibile,
                 fl_split_payment)
         VALUES (repID,
                 gruppoStm,
                 'D',
                 aSequenza,
                 sottoGruppoStm,
                 cv_cd_cds,
                 cv_cd_uo,
                 cv_esercizio,
                 cv_cd_cds_origine,
                 cv_cd_uo_origine,
                 cv_cd_tipo_sezionale,
                 cv_ti_fattura,
                 cv_data_registrazione,
                 cv_numero_progressivo,
                 cv_data_emissione,
                 cv_numero_fattura,
                 cv_protocollo_iva,
                 cv_protocollo_iva_gen,
                 cv_comm_ist_testata,
                 cv_codice_anagrafico,
                 cv_ragione_sociale,
                 cv_imponibile_dettaglio,
                 cv_iva_dettaglio,
                 cv_iva_indetraibile_dettaglio,
                 cv_totale_dettaglio,
                 cv_comm_ist_dettaglio,
                 cv_codice_iva,
                 cv_percentuale_iva,
                 cv_descrizione_iva,
                 cv_fl_iva_detraibile,
                 cv_percentuale_iva_detraibile,
                 cv_gruppo_iva,
                 cv_descrizione_gruppo_iva,
                 tiIntraBollaDoganale,
                 cv_codice_valuta,
                 cv_importo_valuta,
                 cv_esigibilita_diff,
                 cv_data_esigibilita_diff,
                 aTipoReport,
                 aTipoRegistro,
                 descrizioneGruppoStm,
                 c_iva_esigibile,
                 cv_split_payment);

      EXCEPTION

         WHEN DUP_VAL_ON_INDEX THEN
              IBMERR001.RAISE_ERR_GENERICO
                 ('Chiave duplicata in inserimento dettaglio fatture per stampa registro su tabella REPORT_GENERICO');

      END;

   END LOOP;

   CLOSE gen_cv;

   -------------------------------------------------------------------------------------------------
   -- Scrittura su REPORT_GENERICO del riepilogo codici iva e gruppi

   sottoGruppoStm_new:='R';
   descrizioneGruppoStm_new:='RIEPILOGO CODICI IVA GRUPPO B';
   aSequenza:=aSequenza + 20;

   insRiepilogoIvaPerRegistri(repID,
                              aSequenza,
                              aPasso,
                              aEsercizio,
                              gruppoStm,
                              sottoGruppoStm_new,
                              descrizioneGruppoStm_new,
                              aCdCdsOrigine,
                              aCdUoOrigine,
                              aCodiceSezionale);


END insFatturePerRegistri;

-- =================================================================================================
-- Assegnazione del numero di protocollo IVA per fatture passive e autofatture in sede di stampa
-- registri IVA
-- =================================================================================================
PROCEDURE insProtFatturePassAuto
   (
    aCdCdsOrigine VARCHAR2,
    aCdUoOrigine VARCHAR2,
    aEsercizio NUMBER,
    aCdTipoSezionale VARCHAR2,
    aTiIstituzCommerc CHAR,
    aTipoReport VARCHAR2,
    aDataInizio DATE,
    aDataFine DATE,
    aTiDocumento VARCHAR2
   ) IS
   aProtocolloFT NUMBER(10);
   aProtocolloNC NUMBER(10);
   aProtocolloND NUMBER(10);
   aProtocolloPG NUMBER(10);
   aProtocolloTmp NUMBER(10);
   aProtocolloGenTmp NUMBER(10);
   aStatement VARCHAR2(2000);
   aTiStatementSql VARCHAR2(2);
   eseguiLock CHAR(1);
   curs_doc GenericCurTyp;

BEGIN
-- Protocollo a -1 indica sezionale non definito o non compatibile
   aProtocolloFT:=-1;
   aProtocolloNC:=-1;
   aProtocolloND:=-1;
   aProtocolloPG:=-1;
   aTiStatementSql:='01';

   -- Il lock sui sezionali e fatture è fatto solo per registro definitivo

   IF aTipoReport = 'D' THEN
      eseguiLock:='Y';
   ELSE
      eseguiLock:='N';
   END IF;

   ----------------------------------------------------------------------------------------------
   -- Recupero del valore corrente dei protocolli di numerazione per il sezionale in elaborazione.

   CNRCTB120.getProtCorrenteSezionale(aCdCdsOrigine,
                                      aCdUoOrigine,
                                      aEsercizio,
                                      aCdTipoSezionale,
                                      eseguiLock,
                                      aProtocolloFT,
                                      aProtocolloNC,
                                      aProtocolloND,
                                      aProtocolloPG);

   -- Verifico l'esistenza di tutti i tipi di sezionali relativi al codice sezionale in esame.
   -- Nessun protocollo può valere -1

   IF (aProtocolloFT = -1 OR
       aProtocolloNC = -1 OR
       aProtocolloND = -1 OR
       aProtocolloPG = -1) THEN
      IBMERR001.RAISE_ERR_GENERICO
         ('Per il sezionale ' || aCdTipoSezionale || ' manca la definizione di qualche tipologia in numerazione');
   END IF;

   ----------------------------------------------------------------------------------------------
   -- Ciclo di protocollazione documenti.

   -- Composizione dello statement

   aStatement:=componiStatementSql(aCdCdsOrigine,
                                   aCdUoOrigine,
                                   aEsercizio,
                                   aCdTipoSezionale,
                                   aTiIstituzCommerc,
                                   aTipoReport,
                                   aDataInizio,
                                   aDataFine,
                                   aTiDocumento,
                                   eseguiLock,
                                   aTiStatementSql);

   BEGIN

      OPEN curs_doc FOR
           aStatement;

      LOOP

         FETCH curs_doc INTO
               cv_cd_cds,
               cv_cd_uo,
               cv_esercizio,
               cv_numero_progressivo,
               cv_data_registrazione,
               cv_ti_fattura;

         EXIT WHEN curs_doc%NOTFOUND;

         -- Incremento il protocollo iva dipendente dal tipo documento

         IF    cv_ti_fattura = CNRCTB100.TI_FATT_FATTURA THEN
               aProtocolloFT:=aProtocolloFT + 1;
               aProtocolloTmp:=aProtocolloFT;
         ELSIF cv_ti_fattura = CNRCTB100.TI_FATT_NOTA_C THEN
               aProtocolloNC:=aProtocolloNC + 1;
               aProtocolloTmp:=aProtocolloNC;
         ELSIF cv_ti_fattura = CNRCTB100.TI_FATT_NOTA_D THEN
               aProtocolloND:=aProtocolloND + 1;
               aProtocolloTmp:=aProtocolloND;
         END IF;

         -- Incremento il protocollo iva generale

         aProtocolloPG:=aProtocolloPG + 1;
         aProtocolloGenTmp:=aProtocolloPG;

         -- Aggiornamento del protocollo iva sul documento

         IF    aTiDocumento ='AUTOFATTURA' THEN

               UPDATE AUTOFATTURA
               SET    protocollo_iva = aProtocolloTmp,
                      protocollo_iva_generale = aProtocolloGenTmp
               WHERE  cd_cds = cv_cd_cds AND
                      cd_unita_organizzativa = cv_cd_uo AND
                      esercizio = cv_esercizio AND
                      pg_autofattura = cv_numero_progressivo;

         ELSIF aTiDocumento ='FATTURA_P' THEN

               UPDATE FATTURA_PASSIVA
               SET    protocollo_iva = aProtocolloTmp,
                      protocollo_iva_generale = aProtocolloGenTmp
               WHERE  cd_cds = cv_cd_cds AND
                      cd_unita_organizzativa = cv_cd_uo AND
                      esercizio = cv_esercizio AND
                      pg_fattura_passiva = cv_numero_progressivo;

         END IF;

         -- Aggiornamento del valore corrente per il sezionale in elaborazione

         IF aTipoReport = 'D' THEN

            CNRCTB120.upgSezionalePgCorrente(aCdCdsOrigine,
                                             aCdUoOrigine,
                                             aEsercizio,
                                             aCdTipoSezionale,
                                             aProtocolloFT,
                                             aProtocolloNC,
                                             aProtocolloND,
                                             aProtocolloPG);
         END IF;

      END LOOP;

      CLOSE curs_doc;

   END;

END InsProtFatturePassAuto;

-- =================================================================================================
-- Composizione di statement sql di tipo dinamico
-- aTiStatementSql = '01' --> SELECT per aggiornamento protocolli sui documenti
-- =================================================================================================
FUNCTION componiStatementSql
   (
    aCdCdsOrigine VARCHAR2,
    aCdUoOrigine VARCHAR2,
    aEsercizio NUMBER,
    aCdTipoSezionale VARCHAR2,
    aTiIstituzCommerc CHAR,
    aTipoReport VARCHAR2,
    aDataInizio DATE,
    aDataFine DATE,
    aTiDocumento VARCHAR2,
    eseguiLock CHAR,
    aTiStatementSql VARCHAR2
   ) RETURN VARCHAR2 IS
   aStatement VARCHAR2(2000);
   aDataDa VARCHAR2(100);
   aDataA VARCHAR2(100);

BEGIN

   ----------------------------------------------------------------------------------------------
   -- SELECT per aggiornamento protocolli sui documenti

   IF    aTiStatementSql = '01' THEN

         -- Composizione date

         aDataDa:='TO_DATE (' || '''' || TO_CHAR(aDataInizio,'DDMMYYYY') || '''' || ',''DDMMYYYY'')';
         aDataA:='TO_DATE (' || '''' || TO_CHAR(aDataFine,'DDMMYYYY') || '''' || ',''DDMMYYYY'')';

         IF    aTiDocumento ='AUTOFATTURA' THEN

               aStatement:='SELECT A.cd_cds, A.cd_unita_organizzativa, A.esercizio, ' ||
                                  'A.pg_autofattura, A.dt_registrazione, A.ti_fattura ' ||
                           'FROM   AUTOFATTURA A ';
         ELSIF aTiDocumento ='FATTURA_P' THEN
               aStatement:='SELECT A.cd_cds, A.cd_unita_organizzativa, A.esercizio, ' ||
                                  'A.pg_fattura_passiva, A.dt_registrazione, A.ti_fattura ' ||
                           'FROM   FATTURA_PASSIVA A ';
         END IF;

         aStatement:=aStatement ||
                    'WHERE  A.cd_cds_origine = ' || '''' || aCdCdsOrigine || '''' || ' AND ' ||
                           'A.cd_uo_origine = ' || '''' || aCdUoOrigine || '''' || ' AND ' ||
                           'A.esercizio = ' || aEsercizio  || ' AND ' ||
                           'A.cd_tipo_sezionale = ' || '''' || aCdTipoSezionale || '''' || ' AND ' ||
                           '(A.dt_registrazione BETWEEN ' || aDataDa || ' AND ' ||  aDataA || ') AND ' ||
                           'A.stato_cofi != ' || '''A''' || ' AND ';

         -- Controllo il tipo commerciale o meno del sezionale sul documento

         IF aTiIstituzCommerc = 'C' THEN
            aStatement:=aStatement ||
                        '(A.ti_istituz_commerc = ' ||  '''C''' || ' OR ' ||
                         'A.ti_istituz_commerc = ' ||  '''P''' || ')';
         ELSE
            aStatement:=aStatement || 'A.ti_istituz_commerc = ' ||  '''I''';
         END IF;

         aStatement:=aStatement || ' ' || 'ORDER BY 1, 2, 3, 5, 4';

   END IF;

   -- Aggiungo l'eventuale istruzione per lock

   IF aTipoReport = 'D' THEN
      aStatement:=aStatement || ' FOR UPDATE NOWAIT';
   END IF;

   RETURN aStatement;

END componiStatementSql;

-- =================================================================================================
-- Inserimento dati delle fatture nel report generico
-- =================================================================================================
PROCEDURE insRiepilogoIvaPerRegistri
   (
    repID INTEGER,
    aSequenza IN OUT INTEGER,
    aPasso INTEGER,
    aEsercizio NUMBER,
    gruppoStm CHAR,
    sottoGruppoStm CHAR,
    descrizioneGruppoStm VARCHAR2,
    aCdCdsOrigine VARCHAR2,
    aCdUoOrigine VARCHAR2,
    aCdTipoSezionale VARCHAR2
   ) IS
   progressivo INTEGER;
   scritto CHAR(1);
   gen_cv GenericCurTyp;
   gen_cv_a GenericCurTyp;
   imponibile_totale NUMBER(15,2);
   iva_totale NUMBER(15,2);
   iva_indetraibile_totale NUMBER(15,2);
   totale_totale NUMBER(15,2);
   iva_esigibile  NUMBER(15,2):=0;
BEGIN

   imponibile_totale:=0;
   iva_totale:=0;
   iva_indetraibile_totale:=0;
   totale_totale:=0;

   -------------------------------------------------------------------------------------------------
   -- Scrittura su REPORT_GENERICO del riepilogo codici iva e gruppi

   BEGIN

   -- Aggregazione per codice Sezionale e Gruppo

      IF aCdTipoSezionale IS NULL THEN

         OPEN gen_cv FOR

              SELECT gruppo_iva,
                     descrizione_gruppo_iva,
                     provvisorio_definitivo,
                     acquisto_vendita,
                     SUM(imponibile),
                     SUM(iva),
                     SUM(iva_indetraibile),
                     SUM(totale),
                     Sum(iva_esigibile)
              FROM   VP_STM_REGISTRO_IVA
              WHERE  id_report = repID AND
                     gruppo = 'B' AND
                     tipologia_riga = 'D'
              GROUP BY gruppo_iva,
                       descrizione_gruppo_iva,
                       provvisorio_definitivo,
                       acquisto_vendita;

      ELSE

         OPEN gen_cv FOR

              SELECT GRUPPO_IVA,
                     descrizione_gruppo_iva,
                     provvisorio_definitivo,
                     acquisto_vendita,
                     SUM(imponibile),
                     SUM(iva),
                     SUM(iva_indetraibile),
                     SUM(totale),
                     Sum(iva_esigibile)
              FROM   VP_STM_REGISTRO_IVA
              WHERE  id_report = repID AND
                     gruppo = 'B' AND
                     tipologia_riga = 'D' AND
                     cd_tipo_sezionale = aCdTipoSezionale
              GROUP BY gruppo_iva,
                       descrizione_gruppo_iva,
                       provvisorio_definitivo,
                       acquisto_vendita;
      END IF;

      -- fetch del cursore importi raggruppati per gruppo

      LOOP

         FETCH gen_cv INTO
               cv_gruppo_iva,
               cv_descrizione_gruppo_iva,
               cv_provvisorio_definitivo,
               cv_acquisto_vendita,
               cv_imponibile_dettaglio,
               cv_iva_dettaglio,
               cv_iva_indetraibile_dettaglio,
               cv_totale_dettaglio,
               cv_iva_esigibile;

         EXIT WHEN gen_cv%NOTFOUND;

         -- ciclo per recupero importi per codice iva in base al gruppo

         IF aCdTipoSezionale IS NULL THEN

            OPEN gen_cv_a FOR

                 SELECT codice_iva,
                        descrizione_iva,
                        gruppo_iva,
                        provvisorio_definitivo,
                        acquisto_vendita,
                        SUM(imponibile),
                        SUM(iva),
                        SUM(iva_indetraibile),
                        SUM(totale),
                        Sum(iva_esigibile)
                 FROM   VP_STM_REGISTRO_IVA
                 WHERE  id_report = repID AND
                        gruppo = 'B' AND
                        tipologia_riga = 'D' AND
                        gruppo_iva = cv_gruppo_iva
                 GROUP BY codice_iva,
                          descrizione_iva,
                          gruppo_iva,
                          provvisorio_definitivo,
                          acquisto_vendita
                 ORDER BY codice_iva;

         ELSE

            OPEN gen_cv_a FOR

                 SELECT codice_iva,
                        descrizione_iva,
                        gruppo_iva,
                        provvisorio_definitivo,
                        acquisto_vendita,
                        SUM(imponibile),
                        SUM(iva),
                        SUM(iva_indetraibile),
                        SUM(totale),
                        Sum(iva_esigibile)
                 FROM   VP_STM_REGISTRO_IVA
                 WHERE  id_report = repID AND
                        gruppo = 'B' AND
                        tipologia_riga = 'D' AND
                        cd_tipo_sezionale = aCdTipoSezionale AND
                        gruppo_iva = cv_gruppo_iva
                 GROUP BY codice_iva,
                          descrizione_iva,
                          gruppo_iva,
                          provvisorio_definitivo,
                          acquisto_vendita
                 ORDER BY codice_iva;

         END IF;

         -- Inserimento su REPORT_GENERICO del dettaglio per codice IVA

         LOOP

            aSequenza:=aSequenza + 20;

            FETCH gen_cv_a INTO
                  cv_codice_iva_a,
                  cv_descrizione_iva_a,
                  cv_gruppo_iva_a,
                  cv_provvisorio_definitivo_a,
                  cv_acquisto_vendita_a,
                  cv_imponibile_a,
                  cv_iva_a,
                  cv_iva_indetraibile_a,
                  cv_totale_a,
                  cv_iva_esigibile;

            EXIT WHEN gen_cv_a%NOTFOUND;

            BEGIN

               INSERT INTO VP_STM_REGISTRO_IVA
                      (id_report,
                       gruppo,
                       tipologia_riga,
                       sequenza,
                       sottogruppo,
                       cd_cds_origine,
                       cd_uo_origine,
                       cd_tipo_sezionale,
                       imponibile,
                       iva,
                       iva_indetraibile,
                       totale,
                       provvisorio_definitivo,
                       acquisto_vendita,
                       descrizione_gruppo,
                       iva_esigibile)
               VALUES (repID,
                       gruppoStm,
                       'P',
                       aSequenza,
                       sottoGruppoStm,
                       cv_codice_iva_a,
                       cv_descrizione_iva_a,
                       aCdTipoSezionale,
                       cv_imponibile_a,
                       cv_iva_a,
                       cv_iva_indetraibile_a,
                       cv_totale_a,
                       cv_provvisorio_definitivo_a,
                       cv_acquisto_vendita_a,
                       descrizioneGruppoStm,
                       cv_iva_esigibile);

            EXCEPTION

               WHEN DUP_VAL_ON_INDEX THEN
                    IBMERR001.RAISE_ERR_GENERICO
                       ('Chiave duplicata in inserimento riepilogo per aliquota in stampa registro su tabella REPORT_GENERICO');

            END;

         END LOOP;

         -- close del cursore fatture

         CLOSE gen_cv_a;

         -- Inserimento del totale di gruppo

         aSequenza:=aSequenza + 20;

         BEGIN

            imponibile_totale:=imponibile_totale + cv_imponibile_dettaglio;
            iva_totale:=iva_totale + cv_iva_dettaglio;
            iva_indetraibile_totale:=iva_indetraibile_totale + cv_iva_indetraibile_dettaglio;
            totale_totale:=totale_totale + cv_totale_dettaglio;
            iva_esigibile:=iva_esigibile + cv_iva_esigibile;
            INSERT INTO VP_STM_REGISTRO_IVA
                   (id_report,
                    gruppo,
                    tipologia_riga,
                    sequenza,
                    sottogruppo,
                    cd_uo_origine,
                    cd_tipo_sezionale,
                    imponibile,
                    iva,
                    iva_indetraibile,
                    totale,
                    provvisorio_definitivo,
                    acquisto_vendita,
                    descrizione_gruppo,
                    iva_esigibile)
            VALUES (repID,
                    gruppoStm,
                    'T',
                    aSequenza,
                    sottoGruppoStm,
                    'TOTALE GRUPPO ' || cv_gruppo_iva || ' ' || cv_descrizione_gruppo_iva,
                    aCdTipoSezionale,
                    cv_imponibile_dettaglio,
                    cv_iva_dettaglio,
                    cv_iva_indetraibile_dettaglio,
                    cv_totale_dettaglio,
                    cv_provvisorio_definitivo,
                    cv_acquisto_vendita,
                    descrizioneGruppoStm,
                    cv_iva_esigibile);

         EXCEPTION

            WHEN DUP_VAL_ON_INDEX THEN
                 IBMERR001.RAISE_ERR_GENERICO
                    ('Chiave duplicata in inserimento riepilogo per aliquota in stampa registro su tabella REPORT_GENERICO');

         END;

      END LOOP;

      CLOSE gen_cv;

   END;

   -------------------------------------------------------------------------------------------------
   -- Scrittura totale generale del riepilogo

   aSequenza:=aSequenza + 20;

   BEGIN

      INSERT INTO VP_STM_REGISTRO_IVA
             (id_report,
              gruppo,
              tipologia_riga,
              sequenza,
              sottogruppo,
              cd_uo_origine,
              cd_tipo_sezionale,
              imponibile,
              iva,
              iva_indetraibile,
              totale,
              provvisorio_definitivo,
              acquisto_vendita,
              descrizione_gruppo,
              iva_esigibile)
      VALUES (repID,
              gruppoStm,
              'T',
              aSequenza,
              sottoGruppoStm,
              'TOTALE GENERALE',
              aCdTipoSezionale,
              imponibile_totale,
              iva_totale,
              iva_indetraibile_totale,
              totale_totale,
              cv_provvisorio_definitivo,
              cv_acquisto_vendita,
              descrizioneGruppoStm,
              iva_esigibile);

   EXCEPTION

      WHEN DUP_VAL_ON_INDEX THEN
           IBMERR001.RAISE_ERR_GENERICO
              ('Chiave duplicata in inserimento riepilogo per aliquota in stampa registro su tabella REPORT_GENERICO');

   END;

END insRiepilogoIvaPerRegistri;

-- =================================================================================================
-- Inserimento nella tabella REPORT DETTAGLIO delle fatture oggetto di stampa definitiva
-- =================================================================================================
PROCEDURE insDettaglioPerRegistri
   (
    repID INTEGER,
    aPasso INTEGER,
    descrizioneSezionale VARCHAR2,
    aCdCdsOrigine VARCHAR2,
    aCdUoOrigine VARCHAR2,
    aEsercizio NUMBER,
    aCodiceSezionale VARCHAR2,
    aDataInizio DATE,
    aDataFine DATE,
    aTipoRegistro VARCHAR2,
    aUtente VARCHAR2,
    aTipoReportStato VARCHAR2
   ) IS
   dataOdierna DATE;
   aRecReportDettaglio REPORT_DETTAGLIO%ROWTYPE;
   gen_cv GenericCurTyp;

BEGIN

   aRecReportDettaglio:=NULL;
   dataOdierna:=sysdate;
   aRecReportDettaglio.tipo_report:=aTipoReportStato;
   aRecReportDettaglio.data_inizio:=aDataInizio;
   aRecReportDettaglio.data_fine:=aDataFine;
   aRecReportDettaglio.dacr:=dataOdierna;
   aRecReportDettaglio.utcr:=aUtente;
   aRecReportDettaglio.duva:=dataOdierna;
   aRecReportDettaglio.utuv:=aUtente;
   aRecReportDettaglio.pg_ver_rec:=1;

   -------------------------------------------------------------------------------------------------
   -- Lettura fatture e scrittura in REPORT DETTAGLIO dell'elenco fatture per stampa registri

   BEGIN

      IF aTipoRegistro = 'A' THEN

         -- Registro IVA acquisti

         OPEN gen_cv FOR

              SELECT DISTINCT cd_cds,
                     cd_unita_organizzativa,
                     cd_cds_origine,
                     cd_uo_origine,
                     esercizio,
                     cd_tipo_sezionale,
                     CNRCTB100.TI_FATTURA_PASSIVA,
                     data_registrazione,
                     numero_progressivo,
                     data_emissione,
                     protocollo_iva_generale
              FROM   V_REGISTRO_IVA_ACQUISTI
              WHERE  cd_cds_origine = aCdCdsOrigine AND
                     cd_uo_origine  = aCdUoOrigine AND
                     esercizio = aEsercizio AND
                     cd_tipo_sezionale  = aCodiceSezionale AND
                     (data_registrazione BETWEEN aDataInizio AND aDataFine)
              ORDER BY cd_cds_origine,
                       cd_uo_origine,
                       esercizio,
                       data_registrazione,
                       numero_progressivo;

      ELSE

         -- Registro IVA Vendite

         OPEN gen_cv FOR

              SELECT DISTINCT cd_cds,
                     cd_unita_organizzativa,
                     cd_cds_origine,
                     cd_uo_origine,
                     esercizio,
                     cd_tipo_sezionale,
                     DECODE(tipo_documento_ft_pas, NULL, CNRCTB100.TI_FATTURA_ATTIVA, CNRCTB100.TI_AUTOFATTURA),
                     data_registrazione,
                     numero_progressivo,
                     data_emissione,
                     protocollo_iva_generale
              FROM   V_REGISTRO_IVA_VENDITE
              WHERE  cd_cds_origine = aCdCdsOrigine AND
                     cd_uo_origine = aCdUoOrigine AND
                     esercizio = aEsercizio AND
                     cd_tipo_sezionale = aCodiceSezionale AND
                     (data_emissione BETWEEN aDataInizio AND aDataFine)
              ORDER BY cd_cds_origine,
                       cd_uo_origine,
                       esercizio,
                       data_emissione,
                       protocollo_iva_generale;

      END IF;

      -- fetch del cursore fatture e insert in REPORT_DETTAGLIO

      LOOP

         FETCH gen_cv INTO
               cv_cd_cds,
               cv_cd_uo,
               cv_cd_cds_origine,
               cv_cd_uo_origine,
               cv_esercizio,
               cv_cd_tipo_sezionale,
               cv_tipo_documento,
               cv_data_registrazione,
               cv_numero_progressivo,
               cv_data_emissione,
               cv_protocollo_iva_gen;

         EXIT WHEN gen_cv%NOTFOUND;

         aRecReportDettaglio.cd_cds:=cv_cd_cds_origine;
         aRecReportDettaglio.cd_unita_organizzativa:=cv_cd_uo_origine;
         aRecReportDettaglio.esercizio:=cv_esercizio;
         aRecReportDettaglio.cd_tipo_sezionale:=cv_cd_tipo_sezionale;
         aRecReportDettaglio.ti_documento:=cv_tipo_documento;
         aRecReportDettaglio.pg_documento:=cv_numero_progressivo;
         aRecReportDettaglio.cd_cds_altro:=cv_cd_cds;
         aRecReportDettaglio.cd_uo_altro:=cv_cd_uo;

         CNRCTB255.insReportDettaglio(aRecReportDettaglio);

      END LOOP;

      CLOSE gen_cv;

   END;

END insDettaglioPerRegistri;

-- =================================================================================================
-- Stampa RIEPILOGATIVO per UO con dettaglio per sezionale
-- =================================================================================================
PROCEDURE insFatturePerRiepilogativi
   (
    repID INTEGER,
    aSequenza IN OUT INTEGER,
    aPasso INTEGER,
    descrizioneSezionale VARCHAR2,
    aTiIstituzCommerc CHAR,
    aCdCdsOrigine VARCHAR2,
    aCdUoOrigine VARCHAR2,
    aEsercizio NUMBER,
    aCdTipoSezionale VARCHAR2,
    aDataInizio DATE,
    aDataFine DATE,
    aTipoRegistro VARCHAR2,
    aTipoReport VARCHAR2,
    gruppoStm CHAR,
    sottoGruppoStm CHAR,
    descrizioneGruppoStm VARCHAR2
   ) AS
   gen_cv GenericCurTyp;
   gen_cv_a GenericCurTyp;
   gen_cv_b GenericCurTyp;

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Ciclo principale - aggregazione per sezionale

   IF aTipoRegistro = 'A' THEN

      OPEN gen_cv FOR

           SELECT cd_cds_origine,
                  cd_uo_origine,
                  esercizio,
                  cd_tipo_sezionale,
                  SUM(imponibile_dettaglio),
                  SUM(iva_dettaglio),
                  SUM(TRUNC(iva_indetraibile_dettaglio,2)),
                  SUM(totale_dettaglio),
                  SUM(DECODE(FL_SPLIT_PAYMENT, 'Y', nvl(imponibile_dettaglio,0), 0)) imponibile_split_payment,
                  SUM(DECODE(FL_SPLIT_PAYMENT, 'Y', nvl(iva_dettaglio,0), 0)) iva_split_payment
           FROM   V_REGISTRO_IVA_ACQUISTI
           WHERE  cd_cds_origine = aCdCdsOrigine AND
                  cd_uo_origine = aCdUoOrigine AND
                  esercizio = aEsercizio AND
                  cd_tipo_Sezionale = aCdTipoSezionale AND
                  (data_registrazione BETWEEN aDataInizio AND aDataFine) AND
                  comm_ist_dettaglio = aTiIstituzCommerc
           GROUP BY cd_cds_origine,
                    cd_uo_origine,
                    esercizio,
                    cd_tipo_sezionale
           ORDER BY cd_tipo_sezionale;

   ELSE

      OPEN gen_cv FOR

           SELECT cd_cds_origine,
                  cd_uo_origine,
                  esercizio,
                  cd_tipo_sezionale,
                  SUM(imponibile_dettaglio),
                  SUM(iva_dettaglio),
                  0,
                  SUM(totale_dettaglio),
                  SUM(DECODE(FL_SPLIT_PAYMENT, 'Y', nvl(imponibile_dettaglio,0), 0)) imponibile_split_payment,
                  SUM(DECODE(FL_SPLIT_PAYMENT, 'Y', nvl(iva_dettaglio,0), 0)) iva_split_payment
           FROM   V_REGISTRO_IVA_VENDITE
           WHERE  cd_cds_origine = aCdCdsOrigine AND
                  cd_uo_origine = aCdUoOrigine AND
                  esercizio = aEsercizio AND
                  cd_tipo_Sezionale = aCdTipoSezionale AND
                  (data_emissione BETWEEN aDataInizio AND aDataFine)
           GROUP BY cd_cds_origine,
                    cd_uo_origine,
                    esercizio,
                    cd_tipo_sezionale,
                    0
           ORDER BY cd_tipo_sezionale;

   END IF;

   -------------------------------------------------------------------------------------------------
   -- Fetch del cursore sezionali e inizio ciclo di aggregazione per gruppo IVA

   BEGIN

      LOOP

         FETCH gen_cv INTO
               cv_cd_cds_origine,
               cv_cd_uo_origine,
               cv_esercizio,
               cv_cd_tipo_sezionale,
               cv_imponibile_dettaglio,
               cv_iva_dettaglio,
               cv_iva_indetraibile_dettaglio,
               cv_totale_dettaglio,
               cv_imponibile_split_payment,
               cv_iva_split_payment;

         EXIT WHEN gen_cv%NOTFOUND;

         -- Lettura raggruppamento per GRUPPO

         IF aTipoRegistro = 'A' THEN

            OPEN gen_cv_a FOR

                 SELECT gruppo_iva,
                        descrizione_gruppo_iva,
                        SUM(imponibile_dettaglio),
                        SUM(iva_dettaglio),
                        SUM(TRUNC(iva_indetraibile_dettaglio,2)),
                        SUM(totale_dettaglio),
                        SUM(DECODE(FL_SPLIT_PAYMENT, 'Y', nvl(imponibile_dettaglio,0), 0)) imponibile_split_payment,
                        SUM(DECODE(FL_SPLIT_PAYMENT, 'Y', nvl(iva_dettaglio,0), 0)) iva_split_payment
                 FROM   V_REGISTRO_IVA_ACQUISTI
                 WHERE  cd_cds_origine = aCdCdsOrigine AND
                        cd_uo_origine = aCdUoOrigine AND
                        esercizio = aEsercizio AND
                        cd_tipo_sezionale = aCdTipoSezionale AND
                        (data_registrazione BETWEEN aDataInizio AND aDataFine) AND
                        comm_ist_dettaglio = aTiIstituzCommerc
                 GROUP BY gruppo_iva,
                          descrizione_gruppo_iva
                 ORDER BY gruppo_iva;

         ELSE

            OPEN gen_cv_a FOR

                 SELECT GRUPPO_IVA,
                        descrizione_gruppo_iva,
                        SUM(imponibile_dettaglio),
                        SUM(iva_dettaglio),
                        0,
                        SUM(totale_dettaglio),
                        SUM(DECODE(FL_SPLIT_PAYMENT, 'Y', nvl(imponibile_dettaglio,0), 0)) imponibile_split_payment,
                        SUM(DECODE(FL_SPLIT_PAYMENT, 'Y', nvl(iva_dettaglio,0), 0)) iva_split_payment
                 FROM   V_REGISTRO_IVA_VENDITE
                 WHERE  cd_cds_origine = aCdCdsOrigine AND
                        cd_uo_origine = aCdUoOrigine AND
                        esercizio = aEsercizio AND
                        cd_tipo_sezionale = aCdTipoSezionale AND
                        (data_emissione BETWEEN aDataInizio AND aDataFine)
                 GROUP BY GRUPPO_IVA,
                          descrizione_gruppo_iva,
                          0
                 ORDER BY gruppo_iva;

         END IF;

         -------------------------------------------------------------------------------------------
         -- Fetch del cursore gruppi iva e inizio ciclo di aggregazione per codice IVA

         LOOP

            FETCH gen_cv_a INTO
                  cv_gruppo_iva_a,
                  cv_descrizione_gruppo_iva_a,
                  cv_imponibile_a,
                  cv_iva_a,
                  cv_iva_indetraibile_a,
                  cv_totale_a,
                  cv_imponibile_split_payment_a,
                  cv_iva_split_payment_a;

            EXIT WHEN gen_cv_a%NOTFOUND;

            -- ciclo per recupero importi per codice iva in base al gruppo

            IF aTipoRegistro = 'A' THEN

               OPEN gen_cv_b FOR

                    SELECT codice_iva,
                           descrizione_iva,
                           gruppo_iva,
                           SUM(imponibile_dettaglio),
                           SUM(iva_dettaglio),
                           SUM(TRUNC(iva_indetraibile_dettaglio,2)),
                           SUM(totale_dettaglio),
                           SUM(DECODE(FL_SPLIT_PAYMENT, 'Y', nvl(imponibile_dettaglio,0), 0)) imponibile_split_payment,
                           SUM(DECODE(FL_SPLIT_PAYMENT, 'Y', nvl(iva_dettaglio,0), 0)) iva_split_payment
                    FROM   V_REGISTRO_IVA_ACQUISTI
                    WHERE  cd_cds_origine = aCdCdsOrigine AND
                           cd_uo_origine = aCdUoOrigine AND
                           esercizio = aEsercizio AND
                           cd_tipo_sezionale = aCdTipoSezionale AND
                           (data_registrazione BETWEEN aDataInizio AND aDataFine) AND
                           comm_ist_dettaglio = aTiIstituzCommerc AND
                           gruppo_iva = cv_gruppo_iva_a
                    GROUP BY codice_iva,
                             descrizione_iva,
                             gruppo_iva
                    ORDER BY codice_iva;

            ELSE

               OPEN gen_cv_b FOR

                    SELECT codice_iva,
                           descrizione_iva,
                           gruppo_iva,
                           SUM(imponibile_dettaglio),
                           SUM(iva_dettaglio),
                           0,
                           SUM(totale_dettaglio),
                           SUM(DECODE(FL_SPLIT_PAYMENT, 'Y', nvl(imponibile_dettaglio,0), 0)) imponibile_split_payment,
                           SUM(DECODE(FL_SPLIT_PAYMENT, 'Y', nvl(iva_dettaglio,0), 0)) iva_split_payment
                    FROM   V_REGISTRO_IVA_VENDITE
                    WHERE  cd_cds_origine = aCdCdsOrigine AND
                           cd_uo_origine = aCdUoOrigine AND
                           esercizio = aEsercizio AND
                           cd_tipo_sezionale = aCdTipoSezionale AND
                           (data_emissione BETWEEN aDataInizio AND aDataFine) AND
                           gruppo_iva = cv_gruppo_iva_a
                    GROUP BY codice_iva,
                             descrizione_iva,
                             gruppo_iva,
                             0
                    ORDER BY codice_iva;

            END IF;

            -- Fetch cursore codici iva e inserimento su REPORT_GENERICO del dettaglio

            LOOP

               FETCH gen_cv_b INTO
                     cv_codice_iva_b,
                     cv_descrizione_iva_b,
                     cv_gruppo_iva_b,
                     cv_imponibile_b,
                     cv_iva_b,
                     cv_iva_indetraibile_b,
                     cv_totale_b,
                     cv_imponibile_split_payment_b,
                     cv_iva_split_payment_b;

               EXIT WHEN gen_cv_b%NOTFOUND;

               aSequenza:=aSequenza + 20;

               BEGIN

                  INSERT INTO VP_STM_RIEPILOGATIVO_UO
                         (id_report,
                          gruppo,
                          tipologia_riga,
                          sequenza,
                          sottogruppo,
                          codice_sezionale,
                          codice_gruppo_iva,
                          codice_iva,
                          sezionale_ds,
                          iva_ds,
                          imponibile,
                          iva,
                          iva_indetraibile,
                          totale,
                          acquisti_vendite,
                          descrizione_gruppo,
                          imponibile_split_payment,
                          iva_split_payment
                          )
                  VALUES (repID,
                          gruppoStm,
                          'D',
                          aSequenza,
                          sottoGruppoStm,
                          aCdTipoSezionale,
                          cv_gruppo_iva_b,
                          cv_codice_iva_b,
                          aCdTipoSezionale,
                          SUBSTR('CODICE IVA ' || cv_codice_iva_b || ' ' || cv_descrizione_iva_b,1,200),
                          cv_imponibile_b,
                          cv_iva_b,
                          cv_iva_indetraibile_b,
                          cv_totale_b,
                          aTipoRegistro,
                          descrizioneGruppoStm,
                          cv_imponibile_split_payment_b,
                          cv_iva_split_payment_b);

               EXCEPTION

                  WHEN DUP_VAL_ON_INDEX THEN
                       IBMERR001.RAISE_ERR_GENERICO
                          ('Chiave duplicata in inserimento riepilogo iva su tabella REPORT_GENERICO');

               END;

            END LOOP;

            CLOSE gen_cv_b;

            -- Inserimento del totale di gruppo

            aSequenza:=aSequenza + 20;

            BEGIN

               INSERT INTO VP_STM_RIEPILOGATIVO_UO
                      (id_report,
                       gruppo,
                       tipologia_riga,
                       sequenza,
                       sottogruppo,
                       codice_gruppo_iva,
                       iva_ds,
                       imponibile,
                       iva,
                       iva_indetraibile,
                       totale,
                       acquisti_vendite,
                       descrizione_gruppo,
                       imponibile_split_payment,
                       iva_split_payment)
               VALUES (repID,
                       gruppoStm,
                       'P',
                       aSequenza,
                       sottoGruppoStm,
                       cv_gruppo_iva_a,
                       SUBSTR('TOTALE GRUPPO' || cv_gruppo_iva_a || ' ' || cv_descrizione_gruppo_iva_a,1,200),
                       cv_imponibile_a,
                       cv_iva_a,
                       cv_iva_indetraibile_a,
                       cv_totale_a,
                       aTipoRegistro,
                       descrizioneGruppoStm,
                       cv_imponibile_split_payment_a,
                       cv_iva_split_payment_a);

            EXCEPTION

               WHEN DUP_VAL_ON_INDEX THEN
                    IBMERR001.RAISE_ERR_GENERICO
                       ('Chiave duplicata in inserimento riepilogo iva su tabella REPORT_GENERICO');

            END;

         END LOOP;

         CLOSE gen_cv_a;

         -- Inserimento del totale per sezionale

         aSequenza:=aSequenza + 20;

         BEGIN

            INSERT INTO VP_STM_RIEPILOGATIVO_UO
                   (id_report,
                    gruppo,
                    tipologia_riga,
                    sequenza,
                    sottogruppo,
                    codice_sezionale,
                    iva_ds,
                    imponibile,
                    iva,
                    iva_indetraibile,
                    totale,
                    acquisti_vendite,
                    descrizione_gruppo,
                    imponibile_split_payment,
                    iva_split_payment)
            VALUES (repID,
                    gruppoStm,
                    'T',
                    aSequenza,
                    sottoGruppoStm,
                    aCdTipoSezionale,
                    'TOTALE SEZIONALE ' || ' - ' || descrizioneSezionale,
                    cv_imponibile_dettaglio,
                    cv_iva_dettaglio,
                    cv_iva_indetraibile_dettaglio,
                    cv_totale_dettaglio,
                    aTipoRegistro,
                    descrizioneGruppoStm,
                    cv_imponibile_split_payment,
                    cv_iva_split_payment);

         EXCEPTION

            WHEN DUP_VAL_ON_INDEX THEN
                 IBMERR001.RAISE_ERR_GENERICO
                    ('Chiave duplicata in inserimento riepilogo iva su tabella REPORT_GENERICO');

         END;

      END LOOP;

      CLOSE gen_cv;

   END;

END insFatturePerRiepilogativi;


-- =================================================================================================
-- Stampa del registro riepilogativo senza dettaglio per sezionale. Si esegue solo se risultano
-- elaborati più di un sezionale
-- =================================================================================================
PROCEDURE insTotaliPerRiepilogativi
   (
    repID INTEGER,
    aSequenza IN OUT INTEGER,
    aPasso INTEGER,
    gruppoStm CHAR,
    sottoGruppoStm CHAR,
    descrizioneGruppoStm VARCHAR2
   ) AS
   gen_cv GenericCurTyp;
   gen_cv_a GenericCurTyp;
   gen_cv_b GenericCurTyp;

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Ciclo principale - aggregazione per gruppi iva

   BEGIN

      OPEN gen_cv_a FOR

           SELECT codice_gruppo_iva,
                  iva_ds,
                  acquisti_vendite,
                  SUM(imponibile),
                  SUM(iva),
                  SUM(iva_indetraibile),
                  SUM(totale),
                  SUM(imponibile_split_payment),
                  SUM(iva_split_payment)
           FROM   VP_STM_RIEPILOGATIVO_UO
           WHERE  id_report = repID AND
                  gruppo = 'B' AND
                  tipologia_riga = 'P'
           GROUP BY codice_gruppo_iva,
                    iva_ds,
                    acquisti_vendite
           ORDER BY codice_gruppo_iva;

      -- fetch del cursore gruppi iva e inizio ciclo di aggregazione per codice IVA

      LOOP

         FETCH gen_cv_a INTO
               cv_gruppo_iva_a,
               cv_descrizione_gruppo_iva_a,
               cv_acquisto_vendita_a,
               cv_imponibile_a,
               cv_iva_a,
               cv_iva_indetraibile_a,
               cv_totale_a,
               cv_imponibile_split_payment_a,
               cv_iva_split_payment_a;

         EXIT WHEN gen_cv_a%NOTFOUND;

         -- ciclo per recupero importi per codice iva in base al gruppo

         OPEN gen_cv_b FOR

              SELECT codice_iva,
                     iva_ds,
                     acquisti_vendite,
                     SUM(imponibile),
                     SUM(iva),
                     SUM(iva_indetraibile),
                     SUM(totale),
                     SUM(imponibile_split_payment),
                     SUM(iva_split_payment)
              FROM   VP_STM_RIEPILOGATIVO_UO
              WHERE  id_report = repID AND
                     gruppo = 'B' AND
                     tipologia_riga = 'D' AND
                     codice_gruppo_iva = cv_gruppo_iva_a
              GROUP BY codice_iva,
                       iva_ds,
                       acquisti_vendite
              ORDER BY codice_iva;

         -- Fetch cursore codici iva e inserimento su REPORT_GENERICO del dettaglio

         LOOP

            FETCH gen_cv_b INTO
                  cv_codice_iva_b,
                  cv_descrizione_iva_b,
                  cv_acquisto_vendita_b,
                  cv_imponibile_b,
                  cv_iva_b,
                  cv_iva_indetraibile_b,
                  cv_totale_b,
                  cv_imponibile_split_payment_b,
                  cv_iva_split_payment_b;

            EXIT WHEN gen_cv_b%NOTFOUND;

            aSequenza:=aSequenza + 20;

            BEGIN

               INSERT INTO VP_STM_RIEPILOGATIVO_UO
                      (id_report,
                       gruppo,
                       tipologia_riga,
                       sequenza,
                       sottogruppo,
                       codice_iva,
                       iva_ds,
                       imponibile,
                       iva,
                       iva_indetraibile,
                       totale,
                       acquisti_vendite,
                       descrizione_gruppo,
                       imponibile_split_payment,
                       iva_split_payment)
               VALUES (repID,
                       gruppoStm,
                       'D',
                       aSequenza,
                       sottoGruppoStm,
                       cv_codice_iva_b,
                       cv_descrizione_iva_b,
                       cv_imponibile_b,
                       cv_iva_b,
                       cv_iva_indetraibile_b,
                       cv_totale_b,
                       cv_acquisto_vendita_b,
                       descrizioneGruppoStm,
                       cv_imponibile_split_payment_b,
                       cv_iva_split_payment_b);

            EXCEPTION

               WHEN DUP_VAL_ON_INDEX THEN
                    IBMERR001.RAISE_ERR_GENERICO
                       ('Chiave duplicata in inserimento riepilogo iva su tabella REPORT_GENERICO' );

            END;

         END LOOP;

         CLOSE gen_cv_b;

         -- Inserimento del totale di gruppo

         aSequenza:=aSequenza + 20;

         BEGIN

            INSERT INTO VP_STM_RIEPILOGATIVO_UO
                   (id_report,
                    gruppo,
                    tipologia_riga,
                    sequenza,
                    sottogruppo,
                    codice_gruppo_iva,
                    iva_ds,
                    imponibile,
                    iva,
                    iva_indetraibile,
                    totale,
                    acquisti_vendite,
                    descrizione_gruppo,
                    imponibile_split_payment,
                    iva_split_payment)
            VALUES (repID,
                    gruppoStm,
                    'T',
                    aSequenza,
                    sottoGruppoStm,
                    cv_gruppo_iva_a,
                    cv_descrizione_gruppo_iva_a,
                    cv_imponibile_a,
                    cv_iva_a,
                    cv_iva_indetraibile_a,
                    cv_totale_a,
                    cv_acquisto_vendita_a,
                    descrizioneGruppoStm,
                    cv_imponibile_split_payment_a,
                    cv_iva_split_payment_a);

         EXCEPTION

            WHEN DUP_VAL_ON_INDEX THEN
                 IBMERR001.RAISE_ERR_GENERICO
                    ('Chiave duplicata in inserimento riepilogo iva su tabella REPORT_GENERICO' );

         END;

      END LOOP;

      CLOSE gen_cv_a;

      -- inserimento del totale generale

      OPEN gen_cv FOR

           SELECT acquisti_vendite,
                  SUM(imponibile),
                  SUM(iva),
                  SUM(iva_indetraibile),
                  SUM(totale),
                  SUM(imponibile_split_payment),
                  SUM(iva_split_payment)
           FROM   VP_STM_RIEPILOGATIVO_UO
           WHERE  id_report = repID AND
                  gruppo = 'C' AND
                  tipologia_riga = 'T'
           GROUP BY acquisti_vendite;

      -- Fetch cursore codici iva e inserimento su REPORT_GENERICO del dettaglio

      LOOP

         FETCH gen_cv INTO
               cv_acquisto_vendita,
               cv_imponibile_dettaglio,
               cv_iva_dettaglio,
               cv_iva_indetraibile_dettaglio,
               cv_totale_dettaglio,
               cv_imponibile_split_payment,
               cv_iva_split_payment;

         EXIT WHEN gen_cv%NOTFOUND;

         aSequenza:=aSequenza + 20;

         BEGIN

            INSERT INTO VP_STM_RIEPILOGATIVO_UO
                   (id_report,
                    gruppo,
                    tipologia_riga,
                    sequenza,
                    sottogruppo,
                    iva_ds,
                    imponibile,
                    iva,
                    iva_indetraibile,
                    totale,
                    acquisti_vendite,
                    descrizione_gruppo,
                    imponibile_split_payment,
                    iva_split_payment)
            VALUES (repID,
                    gruppoStm,
                    'T',
                    aSequenza,
                    sottoGruppoStm,
                    'TOTALE GENERALE',
                    cv_imponibile_dettaglio,
                    cv_iva_dettaglio,
                    cv_iva_indetraibile_dettaglio,
                    cv_totale_dettaglio,
                    cv_acquisto_vendita,
                    descrizioneGruppoStm,
                    cv_imponibile_split_payment,
                    cv_iva_split_payment);

         EXCEPTION

            WHEN DUP_VAL_ON_INDEX THEN
                 IBMERR001.RAISE_ERR_GENERICO
                    ('Chiave duplicata in inserimento riepilogo iva su tabella REPORT_GENERICO');

         END;

      END LOOP;

      CLOSE gen_cv;

   END;

END insTotaliPerRiepilogativi;

-- =================================================================================================
-- Inserimento dati delle fatture IVA differita nel report generico
-- =================================================================================================
PROCEDURE insFattureIvaDifferita
   (
    repID INTEGER,
    aSequenza IN OUT INTEGER,
    descrizioneSezionale VARCHAR2,
    aCdCdsOrigine VARCHAR2,
    aCdUoOrigine VARCHAR2,
    aEsercizio NUMBER,
    aCdTipoSezionale VARCHAR2,
    aDataInizio DATE,
    aDataFine DATE,
    aTipoRegistro VARCHAR2,
    aTipoReport VARCHAR2,
    aRistampa VARCHAR2,
    gruppoStm CHAR,
    sottoGruppoStm CHAR,
    descrizioneGruppoStm VARCHAR2
   ) IS
   gen_cv GenericCurTyp;
   acq_ven   VARCHAR2(1);
   UOENTE unita_organizzativa%rowtype:= CNRCTB020.GETUOENTE(aEsercizio);
Begin
Dbms_Output.put_line('diff '||aCdTipoSezionale);
   -- Dettaglio per SEZIONE I (EMESSE NEL PERIODO)
   IF    gruppoStm = 'A' THEN
         -- ***********************************************************************************************************
         -- Attenzione: inTipoRegistro = '*', ma poiche' non sono gestite le differite per gli acquisti, lasciamo cosi'
         -- ***********************************************************************************************************
         IF aTipoRegistro = 'A' Then

            OPEN gen_cv FOR

                 Select ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE, Sum(IMPONIBILE_DETTAGLIO),Sum(IVA_DETTAGLIO),Sum( IVA_INDETRAIBILE_DETTAGLIO),Sum(TOTALE_DETTAGLIO),
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF,'A'
                 FROM   V_STM_IVA_DIFF_PASSIVA
                 WHERE  cd_cds_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_cds_origine,aCdCdsOrigine) And
                        cd_uo_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_uo_origine,aCdUoOrigine) And
                        esercizio = aEsercizio AND
                        cd_tipo_sezionale = aCdTipoSezionale AND
                        (data_registrazione BETWEEN aDataInizio AND aDataFine)
               Group By ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE,
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF
                  ORDER BY cd_tipo_sezionale,
                          esercizio,
                          data_registrazione,
                          numero_progressivo;

         ELSE

            OPEN gen_cv For

                 Select ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE, Sum(IMPONIBILE_DETTAGLIO),Sum(IVA_DETTAGLIO),Sum( IVA_INDETRAIBILE_DETTAGLIO),Sum(TOTALE_DETTAGLIO),
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF,'V'
                 FROM   V_STM_IVA_DIFF_ATTIVA
                 WHERE  cd_cds_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_cds_origine,aCdCdsOrigine) And
                        cd_uo_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_uo_origine,aCdUoOrigine) And
                        esercizio = aEsercizio AND
                        cd_tipo_sezionale = aCdTipoSezionale AND
                        (data_emissione BETWEEN aDataInizio AND aDataFine)
                Group By ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE,
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF
                 ORDER BY cd_tipo_sezionale,
                          esercizio,
                          data_emissione,
                          protocollo_iva;
         END IF;

   -- Dettaglio per SEZIONE II (EMESSE NELL'ESERCIZIO E DIVENUTE ESIGIBILI NEL PERIODO)

   ELSIF gruppoStm = 'B' THEN

         IF aTipoRegistro = 'A' THEN

            OPEN gen_cv FOR

                  Select ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE, Sum(IMPONIBILE_DETTAGLIO),Sum(IVA_DETTAGLIO),Sum( IVA_INDETRAIBILE_DETTAGLIO),Sum(TOTALE_DETTAGLIO),
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF,'A'
                 FROM   V_STM_IVA_DIFF_PASSIVA
                 WHERE  data_registrazione <= aDataFine AND
                        cd_cds_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_cds_origine,aCdCdsOrigine) And
                        cd_uo_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_uo_origine,aCdUoOrigine) And
                        cd_tipo_sezionale = aCdTipoSezionale And
                        To_Char(data_registrazione,'YYYY') = aEsercizio And
                        data_esigibilita_diff IS NOT NULL AND
                        (data_esigibilita_diff BETWEEN aDataInizio AND aDataFine)
                Group By ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE,
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF
                  ORDER BY cd_tipo_sezionale,
                          esercizio,
                          data_registrazione,
                          numero_progressivo;
         ELSE

            OPEN gen_cv FOR
    /*
                 SELECT V_STM_IVA_DIFF_ATTIVA.*,'V'
                 FROM   V_STM_IVA_DIFF_ATTIVA
                 WHERE  data_emissione <= aDataFine AND
                        cd_cds_origine = aCdCdsOrigine AND
                        cd_uo_origine = aCdUoOrigine AND
                        cd_tipo_sezionale = aCdTipoSezionale AND
                        data_esigibilita_diff IS NOT NULL AND
                        (
                            (data_esigibilita_diff BETWEEN aDataInizio AND aDataFine)
                         OR
                            (
                             data_esigibilita_diff < aDataInizio AND
                             NOT EXISTS
                                 (SELECT 1
                                  FROM   REPORT_DETTAGLIO D
                                  WHERE  D.cd_cds = cd_cds_origine AND
                                         D.cd_unita_organizzativa = cd_uo_origine AND
                                         D.esercizio = esercizio AND
                                         D.tipo_report = 'LIQUIDAZIONE_VENDITE' AND
                                         D.pg_documento = numero_fattura)
                            )
                        )
                 ORDER BY cd_tipo_sezionale,
                          esercizio,
                          data_emissione,
                          protocollo_iva;
    */
      Select ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE, Sum(IMPONIBILE_DETTAGLIO),Sum(IVA_DETTAGLIO),Sum( IVA_INDETRAIBILE_DETTAGLIO),Sum(TOTALE_DETTAGLIO),
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF,'V'
                 FROM   V_STM_IVA_DIFF_ATTIVA
                 WHERE  data_emissione <= aDataFine And
      cd_cds_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_cds_origine,aCdCdsOrigine) And
                        cd_uo_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_uo_origine,aCdUoOrigine) And
                        cd_tipo_sezionale = aCdTipoSezionale And
                        To_Char(data_emissione,'YYYY') = aEsercizio And
                        data_esigibilita_diff IS NOT NULL AND
                        (
                            (data_esigibilita_diff BETWEEN aDataInizio AND aDataFine)
                         OR
                            (
                             data_esigibilita_diff < aDataInizio AND
                             Exists
                                 (SELECT 1
                                  FROM   REPORT_DETTAGLIO D
                                  WHERE  D.cd_cds = cd_cds_origine AND
                                         D.cd_unita_organizzativa = cd_uo_origine AND
                                         D.esercizio = V_STM_IVA_DIFF_ATTIVA.esercizio AND
                                         D.pg_documento = numero_progressivo And
                                         D.tipo_report = 'LIQUIDAZIONE_VENDITE' And
                                         D.TI_DOCUMENTO = 'FATTURA_A' And
                                         d.pg_riga_documento = progressivo_riga And
           D.DATA_INIZIO >= aDataInizio And
                       D.DATA_FINE <= aDataFine)
                            )
                        )
                 Group By ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE,
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF
                 ORDER BY cd_tipo_sezionale,
                          esercizio,
                          data_emissione,
                          protocollo_iva;
         END IF;

   -- Dettaglio per SEZIONE III (EMESSE IN ESERCIZI PRECEDENTI E DIVENUTE ESIGIBILI NEL PERIODO)
   ELSIF gruppoStm = 'C' THEN

         IF aTipoRegistro = 'A' THEN

               Open gen_cv FOR
      Select ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE, Sum(IMPONIBILE_DETTAGLIO),Sum(IVA_DETTAGLIO),Sum( IVA_INDETRAIBILE_DETTAGLIO),Sum(TOTALE_DETTAGLIO),
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF,'A'
                 FROM   V_STM_IVA_DIFF_PASSIVA
                 WHERE  data_registrazione <= aDataFine And
                  cd_cds_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_cds_origine,aCdCdsOrigine) And
                        cd_uo_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_uo_origine,aCdUoOrigine) And
                        cd_tipo_sezionale = aCdTipoSezionale And
                        To_Char(data_registrazione,'YYYY') < aEsercizio And
                        data_esigibilita_diff IS NOT NULL AND
                        (
                            (data_esigibilita_diff BETWEEN aDataInizio AND aDataFine
                            -- *RP
                            And data_esigibilita_diff-data_emissione <365
                            )
                         OR
                            (
                             data_esigibilita_diff < aDataInizio AND
                             Exists
                                 (SELECT 1
                                  FROM   REPORT_DETTAGLIO D
                                  WHERE  D.cd_cds = cd_cds_origine AND
                                         D.cd_unita_organizzativa = cd_uo_origine AND
                                         D.esercizio = V_STM_IVA_DIFF_PASSIVA.esercizio AND
                                         D.pg_documento = numero_progressivo And
                                         D.tipo_report = 'LIQUIDAZIONE_ACQUISTI' And
                                         D.TI_DOCUMENTO = 'FATTURA_P' And
                                         d.pg_riga_documento = progressivo_riga And
           D.DATA_INIZIO >= aDataInizio And
                       D.DATA_FINE <= aDataFine)
                            )
                        )
                 Group By ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE,
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF
                  ORDER BY cd_tipo_sezionale,
                          esercizio,
                          data_registrazione,
                          numero_progressivo;

         ELSE

            OPEN gen_cv FOR
      Select ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE, Sum(IMPONIBILE_DETTAGLIO),Sum(IVA_DETTAGLIO),Sum( IVA_INDETRAIBILE_DETTAGLIO),Sum(TOTALE_DETTAGLIO),
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF,'V'
                 FROM   V_STM_IVA_DIFF_ATTIVA
                 WHERE  data_emissione <= aDataFine And
                  cd_cds_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_cds_origine,aCdCdsOrigine) And
                        cd_uo_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_uo_origine,aCdUoOrigine) And
                        cd_tipo_sezionale = aCdTipoSezionale And
                        To_Char(data_emissione,'YYYY') < aEsercizio And
                        data_esigibilita_diff IS NOT NULL AND
                        (
                            (data_esigibilita_diff BETWEEN aDataInizio AND aDataFine)
                         OR
                            (
                             data_esigibilita_diff < aDataInizio AND
                             Exists
                                 (SELECT 1
                                  FROM   REPORT_DETTAGLIO D
                                  WHERE  D.cd_cds = cd_cds_origine AND
                                         D.cd_unita_organizzativa = cd_uo_origine AND
                                         D.esercizio = V_STM_IVA_DIFF_ATTIVA.esercizio AND
                                         D.pg_documento = numero_progressivo And
                                         D.tipo_report = 'LIQUIDAZIONE_VENDITE' And
                                         D.TI_DOCUMENTO = 'FATTURA_A' And
                                         d.pg_riga_documento = progressivo_riga And
           D.DATA_INIZIO >= aDataInizio And
                       D.DATA_FINE <= aDataFine)
                            )
                        )
                 Group By ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE,
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF
                 ORDER BY cd_tipo_sezionale,
                          esercizio,
                          data_emissione,
                          protocollo_iva;
         END IF;

   -- Dettaglio per SEZIONE IV (EMESSE NELL'ESERCIZIO E NON ANCORA ESIGIBILI)

   ELSIF gruppoStm = 'D' THEN

         IF aTipoRegistro = 'A' THEN

            OPEN gen_cv FOR

                  Select ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE, Sum(IMPONIBILE_DETTAGLIO),Sum(IVA_DETTAGLIO),Sum( IVA_INDETRAIBILE_DETTAGLIO),Sum(TOTALE_DETTAGLIO),
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF,'A'
                 FROM   V_STM_IVA_DIFF_PASSIVA
                 WHERE  data_registrazione <= aDataFine AND
                        cd_cds_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_cds_origine,aCdCdsOrigine) And
                        cd_uo_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_uo_origine,aCdUoOrigine) And
                        cd_tipo_sezionale = aCdTipoSezionale And
                        To_Char(data_registrazione,'YYYY') = aEsercizio And
                        (data_esigibilita_diff IS NULL OR
                         data_esigibilita_diff > aDataFine)
                 Group By ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE,
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF
                  ORDER BY cd_tipo_sezionale,
                          esercizio,
                          data_registrazione,
                          numero_progressivo;

         ELSE

            OPEN gen_cv FOR

                  Select ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE, Sum(IMPONIBILE_DETTAGLIO),Sum(IVA_DETTAGLIO),Sum( IVA_INDETRAIBILE_DETTAGLIO),Sum(TOTALE_DETTAGLIO),
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF,'V'
                 FROM   V_STM_IVA_DIFF_ATTIVA
                 WHERE  data_emissione <= aDataFine AND
      cd_cds_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_cds_origine,aCdCdsOrigine) And
                        cd_uo_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_uo_origine,aCdUoOrigine) And
                        cd_tipo_sezionale = aCdTipoSezionale And
                        To_Char(data_emissione,'YYYY') = aEsercizio And
                        (data_esigibilita_diff IS NULL OR
                         data_esigibilita_diff > aDataFine)
                Group By ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE,
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF
                 ORDER BY cd_tipo_sezionale,
                          esercizio,
                          data_emissione,
                          protocollo_iva;

         END IF;
   -- Dettaglio per SEZIONE V (EMESSE IN ESERCIZI PRECEDENTI E NON ANCORA ESIGIBILI)

   ELSIF gruppoStm = 'E' THEN

         IF aTipoRegistro = 'A' THEN

            OPEN gen_cv FOR

                  Select ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE, Sum(IMPONIBILE_DETTAGLIO),Sum(IVA_DETTAGLIO),Sum( IVA_INDETRAIBILE_DETTAGLIO),Sum(TOTALE_DETTAGLIO),
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF,'A'
                 FROM   V_STM_IVA_DIFF_PASSIVA
                 WHERE  data_registrazione <= aDataFine AND
                        cd_cds_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_cds_origine,aCdCdsOrigine) And
                        cd_uo_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_uo_origine,aCdUoOrigine) And
                        cd_tipo_sezionale = aCdTipoSezionale And
                         To_Char(data_registrazione,'YYYY') < aEsercizio And
                        (data_esigibilita_diff IS NULL OR
                         data_esigibilita_diff > aDataFine)
                Group By ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE,
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF
                  ORDER BY cd_tipo_sezionale,
                          esercizio,
                          data_registrazione,
                          numero_progressivo;

         ELSE

            OPEN gen_cv FOR
                  Select ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE, Sum(IMPONIBILE_DETTAGLIO),Sum(IVA_DETTAGLIO),Sum( IVA_INDETRAIBILE_DETTAGLIO),Sum(TOTALE_DETTAGLIO),
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF,'V'
                 FROM   V_STM_IVA_DIFF_ATTIVA
                 WHERE  data_emissione <= aDataFine AND
      cd_cds_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_cds_origine,aCdCdsOrigine) And
                        cd_uo_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_uo_origine,aCdUoOrigine) And
                        cd_tipo_sezionale = aCdTipoSezionale And
                        To_Char(data_emissione,'YYYY') < aEsercizio And
                        (data_esigibilita_diff IS NULL OR
                         data_esigibilita_diff > aDataFine)
                 Group By ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE,
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF
                 ORDER BY cd_tipo_sezionale,
                          esercizio,
                          data_emissione,
                          protocollo_iva;

         END IF;
         ELSIF gruppoStm = 'F' Then
         -- Solo per Acquisti viene passato il gruppo F
          IF aTipoRegistro = 'A' THEN

            OPEN gen_cv FOR

               Select ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE, Sum(IMPONIBILE_DETTAGLIO),Sum(IVA_DETTAGLIO),Sum( IVA_INDETRAIBILE_DETTAGLIO),Sum(TOTALE_DETTAGLIO),
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF,'A'
                 FROM   V_STM_IVA_DIFF_PASSIVA
                 WHERE  data_registrazione <= aDataFine And
                  cd_cds_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_cds_origine,aCdCdsOrigine) And
                        cd_uo_origine = Decode(aCdCdsOrigine,UOENTE.cd_unita_padre,cd_uo_origine,aCdUoOrigine) And
                        cd_tipo_sezionale = aCdTipoSezionale And
                        To_Char(data_EMISSIONE,'YYYY') < aEsercizio And
                        data_esigibilita_diff IS NOT NULL AND
                        data_esigibilita_diff BETWEEN aDataInizio AND aDataFine   And
                        data_esigibilita_diff-data_emissione >=365
               Group By ESERCIZIO, CD_CDS, CD_UNITA_ORGANIZZATIVA, CD_CDS_ORIGINE, CD_UO_ORIGINE,
                        CD_TIPO_SEZIONALE, TI_FATTURA, DATA_REGISTRAZIONE, NUMERO_PROGRESSIVO, DATA_EMISSIONE,
                        NUMERO_FATTURA, PROTOCOLLO_IVA, PROTOCOLLO_IVA_GENERALE, COMM_IST_TESTATA, CODICE_ANAGRAFICO,
                        RAGIONE_SOCIALE,
                        COMM_IST_DETTAGLIO, CODICE_IVA, PERCENTUALE_IVA, DESCRIZIONE_IVA, FL_IVA_DETRAIBILE,
                        PERCENTUALE_IVA_DETRAIBILE, INTRA_UE, BOLLA_DOGANALE, SPEDIZIONIERE, ESIGIBILITA_DIFF,
                        DATA_ESIGIBILITA_DIFF
                  ORDER BY cd_tipo_sezionale,
                          esercizio,
                          data_registrazione,
                          numero_progressivo;
         End IF;
   END IF;

   -- fetch del cursore fatture e insert in REPORT_GENERICO

   LOOP

      FETCH gen_cv INTO
            cv_esercizio,
            cv_cd_cds,
            cv_cd_uo,
            cv_cd_cds_origine,
            cv_cd_uo_origine,
            cv_cd_tipo_sezionale,
            cv_ti_fattura,
            cv_data_registrazione,
            cv_numero_progressivo,
            cv_data_emissione,
            cv_numero_fattura,
            cv_protocollo_iva,
            cv_protocollo_iva_gen,
            cv_comm_ist_testata,
            cv_codice_anagrafico,
            cv_ragione_sociale,
            cv_imponibile_dettaglio,
            cv_iva_dettaglio,
            cv_iva_indetraibile_dettaglio,
            cv_totale_dettaglio,
            cv_comm_ist_dettaglio,
            cv_codice_iva,
            cv_percentuale_iva,
            cv_descrizione_iva,
            cv_fl_iva_detraibile,
            cv_percentuale_iva_detraibile,
            cv_intra_ue,
            cv_bolla_doganale,
            cv_spedizioniere,
            cv_esigibilita_diff,
            cv_data_esigibilita_diff,
            cv_acquisto_vendita;

      EXIT WHEN gen_cv%NOTFOUND;

      aSequenza:=aSequenza + 20;

      cv_iva_indetraibile_dettaglio:=ROUND(cv_iva_indetraibile_dettaglio,2);

      BEGIN

         INSERT INTO VP_STM_IVA_DIFFERITA
                (id_report,
                 sezione,
                 tipologia_riga,
                 sequenza,
                 sottogruppo,
                 titolo_uo,
                 titolo_report,
                 cd_cds_origine,
                 cd_uo_origine,
                 esercizio,
                 cd_tipo_sezionale,
                 data_registrazione,
                 numero_progressivo,
                 data_emissione,
                 numero_fattura,
                 tipo,
                 protocollo_iva,
                 protocollo_iva_gen,
                 codice_terzo,
                 ragione_sociale,
                 imponibile,
                 iva,
                 iva_indetraibile,
                 totale,
                 codice_iva,
                 esigibilita_diff,
                 data_esigibilita,
                 provvisorio_definitivo,
                 acquisto_vendita,
                 descrizione_gruppo)
         VALUES (repID,
                 gruppoStm,
                 'D',
                 aSequenza,
                 sottoGruppoStm,
                 NULL,
                 NULL,
                 cv_cd_cds_origine,
                 cv_cd_uo_origine,
                 cv_esercizio,
                 cv_cd_tipo_sezionale,
     cv_data_registrazione,
                 cv_numero_progressivo,
                 cv_data_emissione,
                 cv_numero_fattura,
                 cv_ti_fattura,
                 cv_protocollo_iva,
                 cv_protocollo_iva_gen,
                 cv_codice_anagrafico,
                 cv_ragione_sociale,
                 cv_imponibile_dettaglio,
                 cv_iva_dettaglio,
                 cv_iva_indetraibile_dettaglio,
                 cv_totale_dettaglio,
                 cv_codice_iva,
                 cv_esigibilita_diff,
                 cv_data_esigibilita_diff,
                 aTipoReport,
                 --aTipoRegistro,
                 cv_acquisto_vendita,
                 descrizioneGruppoStm);

      EXCEPTION

         WHEN DUP_VAL_ON_INDEX THEN
              IBMERR001.RAISE_ERR_GENERICO
                 ('Chiave duplicata in inserimento dettagli iva differita su tabella REPORT_GENERICO' );

      END;

   END LOOP;

   CLOSE gen_cv;

END insFattureIvaDifferita;

-- =================================================================================================
-- Inserimento totali per sezionale
-- =================================================================================================
PROCEDURE insTotaliSezionaleIvaDifferita
   (
    repID INTEGER,
    aSequenza IN OUT INTEGER,
    gruppoStm CHAR,
    sottoGruppoStm CHAR,
    descrizioneGruppoStm VARCHAR2
   ) IS
   gen_cv GenericCurTyp;

BEGIN

   -- Calcolo dei totali per ogni sezione

   OPEN gen_cv FOR

        SELECT cd_tipo_sezionale,
               provvisorio_definitivo,
               acquisto_vendita,
               MAX(sequenza),
               SUM(imponibile),
               SUM(iva),
               SUM(iva_indetraibile),
               SUM(totale)
        FROM   VP_STM_IVA_DIFFERITA
        WHERE  id_report = repID AND
               sezione = gruppoStm AND
               tipologia_riga = 'D'
        GROUP BY cd_tipo_sezionale,
                 provvisorio_definitivo,
                 acquisto_vendita;

   -- fetch del cursore fatture e insert in REPORT_GENERICO

   LOOP

      FETCH gen_cv INTO
            cv_cd_tipo_sezionale,
            cv_provvisorio_definitivo,
            cv_acquisto_vendita,
            cv_imponibile_dettaglio,
            cv_iva_dettaglio,
            cv_iva_indetraibile_dettaglio,
            cv_totale_dettaglio;

      EXIT WHEN gen_cv%NOTFOUND;

      cv_sequenza:=cv_sequenza + 1;

      BEGIN

         INSERT INTO VP_STM_IVA_DIFFERITA
                (id_report,
                 sezione,
                 tipologia_riga,
                 sequenza,
                 sottogruppo,
                 ragione_sociale,
                 imponibile,
                 iva,
                 iva_indetraibile,
                 totale,
                 provvisorio_definitivo,
                 acquisto_vendita,
                 descrizione_gruppo)
         VALUES (repID,
                 gruppoStm,
                 'I',
                 cv_sequenza,
                 sottoGruppoStm,
                 'TOTALE SEZIONALE ' || cv_cd_tipo_sezionale,
                 cv_imponibile_dettaglio,
                 cv_iva_dettaglio,
                 cv_iva_indetraibile_dettaglio,
                 cv_totale_dettaglio,
                 cv_provvisorio_definitivo,
                 cv_acquisto_vendita,
                 descrizioneGruppoStm);
      EXCEPTION

         WHEN DUP_VAL_ON_INDEX THEN
              IBMERR001.RAISE_ERR_GENERICO
                 ('Chiave duplicata in inserimento totali per sezionale di iva differita su tabella REPORT_GENERICO' );

      END;

   END LOOP;

   CLOSE gen_cv;

END insTotaliSezionaleIvaDifferita;

-- =================================================================================================
-- Inserimento totali delle fatture IVA differita nel report generico
-- =================================================================================================
PROCEDURE insTotaliIvaDifferita
   (
    repID INTEGER,
    aSequenza IN OUT INTEGER,
    gruppoStm CHAR,
    sottoGruppoStm CHAR,
    descrizioneGruppoStm VARCHAR2
   ) IS
   gen_cv GenericCurTyp;

BEGIN

   -- Calcolo dei totali per ogni sezione

   OPEN gen_cv FOR

        SELECT acquisto_vendita,
               provvisorio_definitivo,
               SUM(imponibile),
               SUM(iva),
               SUM(iva_indetraibile),
               SUM(totale)
        FROM   VP_STM_IVA_DIFFERITA
        WHERE  id_report = repID AND
               sezione = gruppoStm AND
               tipologia_riga = 'D'
        GROUP BY acquisto_vendita,
                 provvisorio_definitivo;

   LOOP

      FETCH gen_cv INTO
            cv_acquisto_vendita,
            cv_provvisorio_definitivo,
            cv_imponibile_dettaglio,
            cv_iva_dettaglio,
            cv_iva_indetraibile_dettaglio,
            cv_totale_dettaglio;

      EXIT WHEN gen_cv%NOTFOUND;

      aSequenza:=aSequenza + 20;

      BEGIN

         INSERT INTO VP_STM_IVA_DIFFERITA
                (id_report,
                 sezione,
                 tipologia_riga,
                 sequenza,
                 sottogruppo,
                 ragione_sociale,
                 imponibile,
                 iva,
                 iva_indetraibile,
                 totale,
                 provvisorio_definitivo,
                 acquisto_vendita,
                 descrizione_gruppo)
         VALUES (repID,
                 gruppoStm,
                 'P',
                 aSequenza,
                 sottoGruppoStm,
                 descrizioneGruppoStm,
                 cv_imponibile_dettaglio,
                 cv_iva_dettaglio,
                 cv_iva_indetraibile_dettaglio,
                 cv_totale_dettaglio,
                 cv_provvisorio_definitivo,
                 cv_acquisto_vendita,
                 descrizioneGruppoStm);
      EXCEPTION

         WHEN DUP_VAL_ON_INDEX THEN
              IBMERR001.RAISE_ERR_GENERICO
                 ('Chiave duplicata in inserimento totali di sezione per iva differita su tabella REPORT_GENERICO' );

      END;

   END LOOP;

   CLOSE gen_cv;

END insTotaliIvaDifferita;
-- =================================================================================================
-- Inserimento totali delle fatture IVA differita raggruppate per codice IVA nel report generico
-- =================================================================================================
PROCEDURE insTotaliIvaDiffPerCodIVA
   (
    repID INTEGER,
    aSequenza IN OUT INTEGER,
    gruppoStm CHAR,
    sottoGruppoStm CHAR,
    descrizioneGruppoStm VARCHAR2
   ) IS
   gen_cv GenericCurTyp;

BEGIN

   -- Calcolo dei totali per ogni sezione e per codice iva

   OPEN gen_cv FOR

        SELECT acquisto_vendita,
               provvisorio_definitivo,
               codice_iva,
               SUM(imponibile),
               SUM(iva),
               SUM(iva_indetraibile),
               SUM(totale)
        FROM   VP_STM_IVA_DIFFERITA
        WHERE  id_report = repID AND
               sezione = gruppoStm AND
               tipologia_riga = 'D'
        GROUP BY acquisto_vendita,
                 provvisorio_definitivo,
                 codice_iva;

   LOOP

      FETCH gen_cv INTO
            cv_acquisto_vendita,
            cv_provvisorio_definitivo,
            cv_codice_iva,
            cv_imponibile_dettaglio,
            cv_iva_dettaglio,
            cv_iva_indetraibile_dettaglio,
            cv_totale_dettaglio;

      EXIT WHEN gen_cv%NOTFOUND;

      aSequenza:=aSequenza + 20;

      BEGIN

         INSERT INTO VP_STM_IVA_DIFFERITA
                (id_report,
                 sezione,
                 tipologia_riga,
                 sequenza,
                 sottogruppo,
                 ragione_sociale,
                 imponibile,
                 iva,
                 iva_indetraibile,
                 totale,
                 provvisorio_definitivo,
                 acquisto_vendita,
                 codice_iva,
                 descrizione_gruppo)
         VALUES (repID,
                 gruppoStm,
                 'C',
                 aSequenza,
                 sottoGruppoStm,
                 descrizioneGruppoStm,
                 cv_imponibile_dettaglio,
                 cv_iva_dettaglio,
                 cv_iva_indetraibile_dettaglio,
                 cv_totale_dettaglio,
                 cv_provvisorio_definitivo,
                 cv_acquisto_vendita,
                 cv_codice_iva,
                 descrizioneGruppoStm);
      EXCEPTION

         WHEN DUP_VAL_ON_INDEX THEN
              IBMERR001.RAISE_ERR_GENERICO
                 ('Chiave duplicata in inserimento totali di sezione per iva differita su tabella REPORT_GENERICO' );

      END;

   END LOOP;

   CLOSE gen_cv;

END insTotaliIvaDiffPerCodIVA;

-- =================================================================================================
-- Inserimento righe di riepilogo IVA differita nel report generico
-- =================================================================================================
PROCEDURE insRiepilogoIvaDifferita
   (
    repID INTEGER,
    aSequenza IN OUT INTEGER,
    aTipoRegistro VARCHAR2,
    aTipoReport VARCHAR2,
    totaleImponibile NUMBER,
    totaleIva NUMBER,
    totaleIvaIndetraibile NUMBER,
    totaleFattura NUMBER,
    gruppoStm CHAR,
    sottoGruppoStm CHAR,
    descrizioneGruppoStm VARCHAR2
   ) AS
   descrizioneTotale VARCHAR2(100);
   imponibileEsigibile NUMBER(15,2);
   ivaEsigibile NUMBER(15,2);
   ivaIndetraibileEsigibile NUMBER(15,2);
   totaleEsigibile NUMBER(15,2);
   gen_cv GenericCurTyp;

BEGIN

   FOR i IN 1 .. 7

   LOOP

      aSequenza:=aSequenza + 20;
      imponibileEsigibile:=0;
      ivaEsigibile:=0;
      ivaIndetraibileEsigibile:=0;
      totaleEsigibile:=0;

      -- Totale fatture attive e passive emesse

      IF    i = 1 THEN
            -- ***********************************************************************************************************
            -- Attenzione: aTipoRegistro = '*', ma poiche' non sono gestite le differite per gli acquisti, lasciamo cosi'
            -- ***********************************************************************************************************
            descrizioneTotale:='RIEPILOGO';


            imponibileEsigibile:=Nvl(totaleImponibile,0);
            ivaEsigibile:=Nvl(totaleIva,0);
            ivaIndetraibileEsigibile:=Nvl(totaleIvaIndetraibile,0);
            totaleEsigibile:=Nvl(totaleFattura,0);

            BEGIN

               INSERT INTO VP_STM_IVA_DIFFERITA
                      (id_report,
                       sezione,
                       tipologia_riga,
                       sequenza,
                       sottogruppo,
                       ragione_sociale,
                       imponibile,
                       iva,
                       iva_indetraibile,
                       totale,
                       provvisorio_definitivo,
                       acquisto_vendita,
                       descrizione_gruppo)
               VALUES (repID,
                       gruppoStm,
                       'T',
                       aSequenza,
                       sottoGruppoStm,
                       descrizioneTotale,
                       totaleImponibile,
                       totaleIva,
                       totaleIvaIndetraibile,
                       totaleFattura,
                       aTipoReport,
                       aTipoRegistro,
                       descrizioneGruppoStm);
            END;

      -- Totale prima sezione

      ELSIF i = 2 THEN

            If aTipoRegistro = 'A' THEN
               descrizioneTotale:='TOTALE FATTURE RICEVUTE NEL PERIODO';
            ELSE
               descrizioneTotale:='TOTALE FATTURE EMESSE NEL PERIODO';
            END IF;

            OPEN gen_cv FOR

              Select Nvl(SUM(Nvl(imponibile,0)),0),
                        Nvl(SUM(Nvl(iva,0)),0),
                        Nvl(SUM(Nvl(iva_indetraibile,0)),0),
                        Nvl(SUM(Nvl(totale,0)),0)
                 FROM   VP_STM_IVA_DIFFERITA
                 WHERE  id_report = repID AND
                        sezione = 'A' AND
                        tipologia_riga = 'P';

            -- fetch del cursore fatture e insert in REPORT_GENERICO

            LOOP

               FETCH gen_cv INTO
                     cv_imponibile_dettaglio,
                     cv_iva_dettaglio,
                     cv_iva_indetraibile_dettaglio,
                     cv_totale_dettaglio;

               EXIT WHEN gen_cv%NOTFOUND;

               aSequenza:=aSequenza + 20;

               imponibileEsigibile:=Nvl(imponibileEsigibile,0) - Nvl(cv_imponibile_dettaglio,0);
               ivaEsigibile:=Nvl(ivaEsigibile,0) - Nvl(cv_iva_dettaglio,0);
               ivaIndetraibileEsigibile:=Nvl(ivaIndetraibileEsigibile,0) - ROUND(Nvl(cv_iva_indetraibile_dettaglio,0),2);
               totaleEsigibile:=Nvl(totaleEsigibile,0) - Nvl(cv_totale_dettaglio,0);

               BEGIN

                  INSERT INTO VP_STM_IVA_DIFFERITA
                         (id_report,
                          sezione,
                          tipologia_riga,
                          sequenza,
                          sottogruppo,
                          ragione_sociale,
                          imponibile,
                          iva,
                          iva_indetraibile,
                          totale,
                          provvisorio_definitivo,
                          acquisto_vendita,
                          descrizione_gruppo)
                  VALUES (repID,
                          gruppoStm,
                          'T',
                          aSequenza,
                          sottoGruppoStm,
                          descrizioneTotale,
                          cv_imponibile_dettaglio,
                          cv_iva_dettaglio,
                          cv_iva_indetraibile_dettaglio,
                          cv_totale_dettaglio,
                          aTipoReport,
                          aTipoRegistro,
                          descrizioneGruppoStm);
               END;

            END LOOP;

            CLOSE gen_cv;

      -- Totale seconda sezione

      ELSIF i = 3 THEN


            If aTipoRegistro = 'A' THEN
               descrizioneTotale:='TOTALE FATTURE RICEVUTE NELL''ESERCIZIO, DIVENUTE ESIGIBILI NEL PERIODO';
            ELSE
                descrizioneTotale:='TOTALE FATTURE EMESSE NELL''ESERCIZIO, DIVENUTE ESIGIBILI NEL PERIODO';
            END IF;

            OPEN gen_cv FOR

              Select Nvl(SUM(Nvl(imponibile,0)),0),
                        Nvl(SUM(Nvl(iva,0)),0),
                        Nvl(SUM(Nvl(iva_indetraibile,0)),0),
                        Nvl(SUM(Nvl(totale,0)),0)
                 FROM   VP_STM_IVA_DIFFERITA
                 WHERE  id_report = repID AND
                        sezione = 'B' AND
                        tipologia_riga = 'P';

            -- fetch del cursore fatture e insert in REPORT_GENERICO

            LOOP

               FETCH gen_cv INTO
                     cv_imponibile_dettaglio,
                     cv_iva_dettaglio,
                     cv_iva_indetraibile_dettaglio,
                     cv_totale_dettaglio;

               EXIT WHEN gen_cv%NOTFOUND;

               aSequenza:=aSequenza + 20;

               imponibileEsigibile:=Nvl(imponibileEsigibile,0) + Nvl(cv_imponibile_dettaglio,0);
               ivaEsigibile:=Nvl(ivaEsigibile,0) + Nvl(cv_iva_dettaglio,0);
               ivaIndetraibileEsigibile:=Nvl(ivaIndetraibileEsigibile,0) + ROUND(Nvl(cv_iva_indetraibile_dettaglio,0),2);
               totaleEsigibile:=Nvl(totaleEsigibile,0) + Nvl(cv_totale_dettaglio,0);

               BEGIN

                  INSERT INTO VP_STM_IVA_DIFFERITA
                         (id_report,
                          sezione,
                          tipologia_riga,
                          sequenza,
                          sottogruppo,
                          ragione_sociale,
                          imponibile,
                          iva,
                          iva_indetraibile,
                          totale,
                          provvisorio_definitivo,
                          acquisto_vendita,
                          descrizione_gruppo)
                  VALUES (repID,
                          gruppoStm,
                          'T',
                          aSequenza,
                          sottoGruppoStm,
                          descrizioneTotale,
                          cv_imponibile_dettaglio,
                          cv_iva_dettaglio,
                          cv_iva_indetraibile_dettaglio,
                          cv_totale_dettaglio,
                          aTipoReport,
                          aTipoRegistro,
                          descrizioneGruppoStm);

               END;

            END LOOP;

            CLOSE gen_cv;
      ELSIF i = 4 THEN
            If aTipoRegistro = 'A' THEN
               descrizioneTotale:='TOTALE FATTURE RICEVUTE IN ESERCIZI PRECEDENTI, DIVENUTE ESIGIBILI NEL PERIODO';
            ELSE
              descrizioneTotale:='TOTALE FATTURE EMESSE IN ESERCIZI PRECEDENTI, DIVENUTE ESIGIBILI NEL PERIODO';
            END IF;


            OPEN gen_cv FOR

           Select Nvl(SUM(Nvl(imponibile,0)),0),
                        Nvl(SUM(Nvl(iva,0)),0),
                        Nvl(SUM(Nvl(iva_indetraibile,0)),0),
                        Nvl(SUM(Nvl(totale,0)),0)
                 FROM   VP_STM_IVA_DIFFERITA
                 WHERE  id_report = repID AND
                        sezione = 'C' AND
                        tipologia_riga = 'P';

            -- fetch del cursore fatture e insert in REPORT_GENERICO

            LOOP

               FETCH gen_cv INTO
                     cv_imponibile_dettaglio,
                     cv_iva_dettaglio,
                     cv_iva_indetraibile_dettaglio,
                     cv_totale_dettaglio;

               EXIT WHEN gen_cv%NOTFOUND;

               aSequenza:=aSequenza + 20;

               imponibileEsigibile:=Nvl(imponibileEsigibile,0) + Nvl(cv_imponibile_dettaglio,0);
               ivaEsigibile:=Nvl(ivaEsigibile,0) + Nvl(cv_iva_dettaglio,0);
               ivaIndetraibileEsigibile:=Nvl(ivaIndetraibileEsigibile,0) + ROUND(Nvl(cv_iva_indetraibile_dettaglio,0),2);
               totaleEsigibile:=Nvl(totaleEsigibile,0) + Nvl(cv_totale_dettaglio,0);

               BEGIN

                  INSERT INTO VP_STM_IVA_DIFFERITA
                         (id_report,
                          sezione,
                          tipologia_riga,
                          sequenza,
                          sottogruppo,
                          ragione_sociale,
                          imponibile,
                          iva,
                          iva_indetraibile,
                          totale,
                          provvisorio_definitivo,
                          acquisto_vendita,
                          descrizione_gruppo)
                  VALUES (repID,
                          gruppoStm,
                          'T',
                          aSequenza,
                          sottoGruppoStm,
                          descrizioneTotale,
                          cv_imponibile_dettaglio,
                          cv_iva_dettaglio,
                          cv_iva_indetraibile_dettaglio,
                          cv_totale_dettaglio,
                          aTipoReport,
                          aTipoRegistro,
                          descrizioneGruppoStm);

               END;

            END LOOP;

            CLOSE gen_cv;
      ELSIF i = 5 THEN
             If aTipoRegistro = 'A' THEN
               descrizioneTotale:='TOTALE FATTURE RICEVUTE NELL''ESERCIZIO, NON ANCORA ESIGIBILI';
            ELSE
              descrizioneTotale:='TOTALE FATTURE EMESSE NELL''ESERCIZIO, NON ANCORA ESIGIBILI';
            END IF;


            OPEN gen_cv FOR

          Select Nvl(SUM(Nvl(imponibile,0)),0),
                        Nvl(SUM(Nvl(iva,0)),0),
                        Nvl(SUM(Nvl(iva_indetraibile,0)),0),
                        Nvl(SUM(Nvl(totale,0)),0)
                 FROM   VP_STM_IVA_DIFFERITA
                 WHERE  id_report = repID AND
                        sezione = 'D' AND
                        tipologia_riga = 'P';

            -- fetch del cursore fatture e insert in REPORT_GENERICO

            LOOP

               FETCH gen_cv INTO
                     cv_imponibile_dettaglio,
                     cv_iva_dettaglio,
                     cv_iva_indetraibile_dettaglio,
                     cv_totale_dettaglio;

               EXIT WHEN gen_cv%NOTFOUND;

               aSequenza:=aSequenza + 20;

               imponibileEsigibile:=Nvl(imponibileEsigibile,0) + Nvl(cv_imponibile_dettaglio,0);
               ivaEsigibile:=Nvl(ivaEsigibile,0) + Nvl(cv_iva_dettaglio,0);
               ivaIndetraibileEsigibile:=Nvl(ivaIndetraibileEsigibile,0) + ROUND(Nvl(cv_iva_indetraibile_dettaglio,0),2);
               totaleEsigibile:=Nvl(totaleEsigibile,0) + Nvl(cv_totale_dettaglio,0);

               BEGIN

                  INSERT INTO VP_STM_IVA_DIFFERITA
                         (id_report,
                          sezione,
                          tipologia_riga,
                          sequenza,
                          sottogruppo,
                          ragione_sociale,
                          imponibile,
                          iva,
                          iva_indetraibile,
                          totale,
                          provvisorio_definitivo,
                          acquisto_vendita,
                          descrizione_gruppo)
                  VALUES (repID,
                          gruppoStm,
                          'T',
                          aSequenza,
                          sottoGruppoStm,
                          descrizioneTotale,
                          cv_imponibile_dettaglio,
                          cv_iva_dettaglio,
                          cv_iva_indetraibile_dettaglio,
                          cv_totale_dettaglio,
                          aTipoReport,
                          aTipoRegistro,
                          descrizioneGruppoStm);

               END;

            END LOOP;

            CLOSE gen_cv;

      ELSIF i = 6 THEN
            If aTipoRegistro = 'A' THEN
               descrizioneTotale:='TOTALE FATTURE RICEVUTE IN ESERCIZI PRECEDENTI, NON ANCORA ESIGIBILI';
            ELSE
               descrizioneTotale:='TOTALE FATTURE EMESSE IN ESERCIZI PRECEDENTI, NON ANCORA ESIGIBILI';
            END IF;

            OPEN gen_cv FOR
                       Select Nvl(SUM(Nvl(imponibile,0)),0),
                        Nvl(SUM(Nvl(iva,0)),0),
                        Nvl(SUM(Nvl(iva_indetraibile,0)),0),
                        Nvl(SUM(Nvl(totale,0)),0)
                 FROM   VP_STM_IVA_DIFFERITA
                 WHERE  id_report = repID AND
                        sezione = 'E' AND
                        tipologia_riga = 'P';

            -- fetch del cursore fatture e insert in REPORT_GENERICO

            LOOP

               FETCH gen_cv INTO
                     cv_imponibile_dettaglio,
                     cv_iva_dettaglio,
                     cv_iva_indetraibile_dettaglio,
                     cv_totale_dettaglio;

               EXIT WHEN gen_cv%NOTFOUND;

               aSequenza:=aSequenza + 20;

               imponibileEsigibile:=Nvl(imponibileEsigibile,0) + Nvl(cv_imponibile_dettaglio,0);
               ivaEsigibile:=Nvl(ivaEsigibile,0) + Nvl(cv_iva_dettaglio,0);
               ivaIndetraibileEsigibile:=Nvl(ivaIndetraibileEsigibile,0) + ROUND(Nvl(cv_iva_indetraibile_dettaglio,0),2);
               totaleEsigibile:=Nvl(totaleEsigibile,0) + Nvl(cv_totale_dettaglio,0);

            BEGIN

               INSERT INTO VP_STM_IVA_DIFFERITA
                      (id_report,
                       sezione,
                       tipologia_riga,
                       sequenza,
                       sottogruppo,
                       ragione_sociale,
                       imponibile,
                       iva,
                       iva_indetraibile,
                       totale,
                       provvisorio_definitivo,
                       acquisto_vendita,
                       descrizione_gruppo)
               VALUES (repID,
                       gruppoStm,
                       'T',
                       aSequenza,
                       sottoGruppoStm,
                       descrizioneTotale,
                       imponibileEsigibile,
                       ivaEsigibile,
                       ivaIndetraibileEsigibile,
                       totaleEsigibile,
                       aTipoReport,
                       aTipoRegistro,
                       descrizioneGruppoStm);
            END;

            END LOOP;

            CLOSE gen_cv;
      ELSIF i = 7 Then
      -- RP Gestito solo per gli Acquisti Fatture divenute esigibile perchè trascorso 1 anno
            If aTipoRegistro = 'A' THEN
               descrizioneTotale:='TOTALE FATTURE RICEVUTE IN ESERCIZI PRECEDENTI, DIVENUTE ESIGIBILI D''UFFUCIO';
            End IF;

            OPEN gen_cv FOR

                 Select Nvl(SUM(Nvl(imponibile,0)),0),
                        Nvl(SUM(Nvl(iva,0)),0),
                        Nvl(SUM(Nvl(iva_indetraibile,0)),0),
                        Nvl(SUM(Nvl(totale,0)),0)
                 FROM   VP_STM_IVA_DIFFERITA
                 WHERE  id_report = repID AND
                        sezione = 'F' AND
                        tipologia_riga = 'P';

            -- fetch del cursore fatture e insert in REPORT_GENERICO

            LOOP

               FETCH gen_cv INTO
                     cv_imponibile_dettaglio,
                     cv_iva_dettaglio,
                     cv_iva_indetraibile_dettaglio,
                     cv_totale_dettaglio;

               EXIT WHEN gen_cv%NOTFOUND;

               aSequenza:=aSequenza + 20;

               imponibileEsigibile:=Nvl(imponibileEsigibile,0) + Nvl(cv_imponibile_dettaglio,0);
               ivaEsigibile:=Nvl(ivaEsigibile,0) + Nvl(cv_iva_dettaglio,0);
               ivaIndetraibileEsigibile:=Nvl(ivaIndetraibileEsigibile,0) + ROUND(Nvl(cv_iva_indetraibile_dettaglio,0),2);
               totaleEsigibile:=Nvl(totaleEsigibile,0) + Nvl(cv_totale_dettaglio,0);

            BEGIN

               INSERT INTO VP_STM_IVA_DIFFERITA
                      (id_report,
                       sezione,
                       tipologia_riga,
                       sequenza,
                       sottogruppo,
                       ragione_sociale,
                       imponibile,
                       iva,
                       iva_indetraibile,
                       totale,
                       provvisorio_definitivo,
                       acquisto_vendita,
                       descrizione_gruppo)
               VALUES (repID,
                       gruppoStm,
                       'T',
                       aSequenza,
                       sottoGruppoStm,
                       descrizioneTotale,
                       imponibileEsigibile,
                       ivaEsigibile,
                       ivaIndetraibileEsigibile,
                       totaleEsigibile,
                       aTipoReport,
                       aTipoRegistro,
                       descrizioneGruppoStm);
            END;

            END LOOP;

            CLOSE gen_cv;
      END IF;

   END LOOP;

EXCEPTION

   WHEN DUP_VAL_ON_INDEX THEN
        IBMERR001.RAISE_ERR_GENERICO
           ('Chiave duplicata in inserimento riepilogo iva differita su tabella REPORT_GENERICO' );

END insRiepilogoIvaDifferita;

-- =============================================================================
-- Inserimento Riporto dati dichiarazione di intento su registro Vendite
-- =============================================================================
-- procedure insRiportoDatiIntento
--    (
--     repID INTEGER,
--     aSequenza IN OUT INTEGER,
--     aPasso INTEGER,
--     aCdCdsOrigine VARCHAR2,
--     aCdUoOrigine VARCHAR2,
--     aEsercizio NUMBER,
--     aCdTipoSezionale VARCHAR2,
--     aDataInizio DATE,
--     aDataFine DATE,
--     aTipoRegistro VARCHAR2,
--     aRistampa VARCHAR2,
--     gruppoStm CHAR,
--     sottoGruppoStm CHAR,
--     descrizioneGruppoStm VARCHAR2
--    ) AS
--
--    gen_cv GenericCurTyp;
--    tipo VARCHAR2(10);
-- BEGIN
--
--    IF aPasso = 5 THEN
--       IF aTipoRegistro = 'V' THEN
--          IF aRistampa = 'N' THEN
--             BEGIN
--                IF (aDataFine - aDataInizio) > 30 THEN
--                   tipo:= 'TRIMESTRE';
--                ELSE
--                  tipo:= 'MESE';
--                END IF;
--                IF tipo = 'MESE' THEN
--                   OPEN gen_cv FOR
--                        SELECT LTRIM(RTRIM(B.COGNOME || ' ' || nome || ragione_sociale)),
--                               A.ID_DICHIARAZIONE,
--                               A.DT_INI_VALIDITA,
--                               DT_COMUNICAZIONE_DIC
--                        FROM   DICHIARAZIONE_INTENTO A, ANAGRAFICO B
--                        WHERE  A.CD_ANAG = B.CD_ANAG AND
--                               A.DT_INSERIMENTO_REGISTRO IS NULL AND
--                               (
--                                   (A.DT_COMUNICAZIONE_DIC BETWEEN aDataInizio AND aDataFine) OR
--                                   (A.DT_COMUNICAZIONE_DIC BETWEEN aDataInizio-31 AND aDataInizio-1)
--                                );
--
--
--                ELSE
--                   OPEN gen_cv FOR
--                        SELECT LTRIM(RTRIM(cognome || ' ' || nome || ragione_sociale)),
--                               ID_dichiarazione,
--                               A.DT_INI_VALIDITA,
--                               dt_comunicazione_dic
--                        FROM   DICHIARAZIONE_INTENTO A, ANAGRAFICO B
--                        WHERE  A.CD_ANAG = B.CD_ANAG AND
--                               A.DT_inserimento_registro IS NULL AND
--                               (
--                                   (A.dt_comunicazione_dic BETWEEN aDataInizio AND aDataFine) OR
--                                   (A.dt_comunicazione_dic BETWEEN aDataInizio-91 AND aDataInizio-1)
--                               );
--                END IF;
--         -- Inizio ciclo
--                LOOP
--                   FETCH gen_cv INTO
--                         cv_ragione_sociale,
--                         cv_numero_dichiarazione,
--                         cv_data_inizio_validita,
--                         cv_data_comunicazione_dic;
--                   EXIT WHEN gen_cv%NOTFOUND;
--                   aSequenza:=aSequenza + 20;
--                BEGIN
--                      INSERT INTO REPORT_GENERICO
--                             (id,
--                              chiave,
--                              tipo,
--                              sequenza,
--                              descrizione,
--                              attributo_1,
--                              attributo_4,
--                              data_1,
--                              data_2,
--                              attributo_20
--                             )
--                      VALUES (repID,
--                              gruppoStm,
--                              'D',
--                              aSequenza,
--                              sottoGruppoStm,
--                              cv_ragione_sociale,
--                              cv_numero_dichiarazione,
--                              cv_data_inizio_validita,
--                              cv_data_comunicazione_dic,
--                              descrizioneGruppoStm
--                             );
--                      IF tipo = 'MESE' THEN
--                         UPDATE DICHIARAZIONE_INTENTO
--                         SET    dt_inserimento_registro = aDataFine
--                    WHERE  dt_inserimento_registro IS NULL AND
--                                (
--                                   (dt_comunicazione_dic BETWEEN aDataInizio AND aDataFine) OR
--                                   (dt_comunicazione_dic BETWEEN aDataInizio-31 AND aDataInizio-1)
--                                 );
--                      ELSE
--                        UPDATE DICHIARAZIONE_INTENTO
--                         SET    dt_inserimento_registro = aDataFine
--                         WHERE  dt_inserimento_registro IS NULL AND
--                                (
--                                (dt_comunicazione_dic BETWEEN aDataInizio AND aDataFine) OR
--                                 (dt_comunicazione_dic BETWEEN aDataInizio-91 AND aDataInizio-1)
--                                );
--                      END IF;
--                EXCEPTION
--                     WHEN DUP_VAL_ON_INDEX THEN
--                           Ibmerr001.RAISE_ERR_GENERICO ('Riporto dati dichiarazione di intento, già stampati.' );
--               END;
--                END LOOP;
--                -- close cursore
--                CLOSE gen_cv;
--             END;
--          -- se è una ristampa considera solo quelli già aggiornati alla data fine periodo
--          ELSE
--             BEGIN
--               OPEN gen_cv FOR
--                     SELECT LTRIM(RTRIM(cognome || ' ' || nome || ragione_sociale)),
--                            id_dichiarazione,
--                            a.DT_INI_VALIDITA,
--                            dt_comunicazione_dic
--                     FROM   DICHIARAZIONE_INTENTO A, ANAGRAFICO B
--                     WHERE  A.cd_anag = B.cd_anag AND
--                            A.ESERCIZIO = aEsercizio AND
--                            A.dt_inserimento_registro = aDataFine ;
--                LOOP
--                   FETCH gen_cv INTO
--                         cv_ragione_sociale,
--                         cv_numero_dichiarazione,
--                         cv_data_inizio_validita,
--                         cv_data_comunicazione_dic;
--
--                   EXIT WHEN gen_cv%NOTFOUND;
--
--                   aSequenza:=aSequenza + 20;
--                BEGIN
--                      INSERT INTO REPORT_GENERICO
--                             (id,
--                              chiave,
--                              tipo,
--                              sequenza,
--                              descrizione,
--                              attributo_1,
--                              attributo_4,
--                              data_1,
--                              data_2,
--                              attributo_20
--                             )
--                      VALUES (repID,
--                              gruppoStm,
--                              'D',
--                              aSequenza,
--                              sottoGruppoStm,
--                              cv_ragione_sociale,
--                              cv_numero_dichiarazione,
--                              cv_data_inizio_validita,
--                              cv_data_comunicazione_dic,
--                              descrizioneGruppoStm
--                             );
--                EXCEPTION
--                     WHEN DUP_VAL_ON_INDEX THEN
--                           Ibmerr001.RAISE_ERR_GENERICO ('Dichiarazione di intento, già stampata' );
--                END;
--                END LOOP;
--                -- close cursore
--                CLOSE gen_cv;
--             END;
--          END IF;
--       END IF;
--    END IF;
-- END insRiportoDatiIntento;

-- =============================================================================
-- Inserimento Riporto dati revoca dichiarazione di intento su registro Vendite
-- =============================================================================
-- procedure insRevocaDatiIntento
--    (
--     repID INTEGER,
--     aSequenza IN OUT INTEGER,
--     aPasso INTEGER,
--  aCdCdsOrigine VARCHAR2,
--  aCdUoOrigine VARCHAR2,
--  aEsercizio NUMBER,
--  aCdTipoSezionale VARCHAR2,
--     aDataInizio DATE,
--     aDataFine DATE,
--     aTipoRegistro VARCHAR2,
--     aRistampa VARCHAR2,
--     gruppoStm CHAR,
--     sottoGruppoStm CHAR,
--     descrizioneGruppoStm VARCHAR2
--    )  AS
--    retCode INTEGER;
--    gen_cv GenericCurTyp;
--    tipo VARCHAR2(10);
--
-- BEGIN
--
--  IF aPasso = 6 THEN
--
--   IF aTipoRegistro = 'V' THEN
--
--    IF aRistampa = 'N' THEN
--
--      BEGIN
--
--  IF (aDataFine - aDataInizio)>30 THEN
--     tipo:= 'TRIMESTRE';
--  ELSE
--     tipo:= 'MESE';
--  END IF;
--
--  IF tipo = 'MESE' THEN
--
--         OPEN gen_cv FOR
--
--              SELECT DECODE(ragione_sociale, ' ', cognome || ' ' || nome, ragione_sociale) AS denominazione,
--                     id_dichiarazione,
--                     dt_ini_validita,
--                     dt_comunicazione_rev
--              FROM   DICHIARAZIONE_INTENTO A, ANAGRAFICO B
--              WHERE  A.cd_anag = B.cd_anag AND
--                     A.DT_REVOCA_REGISTRO IS NULL AND
--                     ((A.dt_comunicazione_rev BETWEEN aDataInizio AND aDataFine) OR
--                      (A.dt_comunicazione_rev BETWEEN aDataInizio-31 AND aDataInizio-1));
--
--  ELSE
--
--         OPEN gen_cv FOR
--
--              SELECT DECODE(ragione_sociale, ' ', cognome || ' ' || nome, ragione_sociale) AS denominazione,
--                     id_dichiarazione,
--                     dt_ini_validita,
--                     A.dt_comunicazione_rev
--              FROM   DICHIARAZIONE_INTENTO A, ANAGRAFICO B
--              WHERE  A.cd_anag = B.cd_anag AND
--                     A.dt_revoca_registro IS NULL AND
--                     ((A.dt_comunicazione_rev BETWEEN aDataInizio AND aDataFine) OR
--                       (A.dt_comunicazione_rev BETWEEN aDataInizio-91 AND aDataInizio-1));
--
--  END IF;
--
--
--        LOOP
--
--          FETCH gen_cv INTO
--                cv_ragione_sociale,
--                cv_numero_dichiarazione,
--                cv_data_inizio_validita,
--                cv_data_comunicazione_rev;
--
--          EXIT WHEN gen_cv%NOTFOUND;
--
--          aSequenza:=aSequenza + 20;
--
--
--          BEGIN
--
--             INSERT INTO REPORT_GENERICO
--                   (id,
--                    chiave,
--                    tipo,
--                    sequenza,
--                    descrizione,
--                    attributo_1,
--                    attributo_4,
--                    data_1,
--                    data_2,
--                    attributo_20
--                   )
--            VALUES (repID,
--                    gruppoStm,
--                    'E',
--                    aSequenza,
--                    'Revoca dichiarazione d''intento',
--                    cv_ragione_sociale,
--                    cv_numero_dichiarazione,
--                    cv_data_inizio_validita,
--                    cv_data_comunicazione_rev,
--                    descrizioneGruppoStm
--                   );
--
--          IF tipo = 'MESE' THEN
--
--
--      UPDATE DICHIARAZIONE_INTENTO
--      SET dt_revoca_registro = aDataFine
--              WHERE dt_revoca_registro IS NULL AND
--                  ((dt_comunicazione_rev BETWEEN aDataInizio AND aDataFine) OR
--                       (dt_comunicazione_rev BETWEEN aDataInizio-31 AND aDataInizio-1));
--
--    ELSE
--
--      UPDATE DICHIARAZIONE_INTENTO
--      SET dt_revoca_registro = aDataFine
--              WHERE dt_revoca_registro IS NULL AND
--                  ((dt_comunicazione_rev BETWEEN aDataInizio AND aDataFine) OR
--                       (dt_comunicazione_rev BETWEEN aDataInizio-91 AND aDataInizio-1));
--
--    END IF;
--
--
--          EXCEPTION
--
--             WHEN DUP_VAL_ON_INDEX THEN
--                  Ibmerr001.RAISE_ERR_GENERICO ('Revoca dichiarazione di intento, già stampata ');
--          END;
--
--       END LOOP;
--
--       -- close cursore
--       CLOSE gen_cv;
--
--      END;
--
--    -- se è una ristampa considera solo quelli già aggiornati alla data fine periodo
--    ELSE
--
--      BEGIN
--
--         OPEN gen_cv FOR
--
--              SELECT DECODE(ragione_sociale, ' ', cognome || ' ' || nome, ragione_sociale) AS denominazione,
--                     id_dichiarazione,
--                     dt_ini_validita,
--                     dt_comunicazione_rev
--              FROM   DICHIARAZIONE_INTENTO A, ANAGRAFICO B
--              WHERE  A.cd_anag = B.cd_anag AND
--                     A.ESERCIZIO = aEsercizio AND
--                     A.dt_revoca_registro = aDataFine ;
--
--        LOOP
--
--          FETCH gen_cv INTO
--                cv_ragione_sociale,
--                cv_numero_dichiarazione,
--                cv_data_inizio_validita,
--                cv_data_comunicazione_rev;
--
--          EXIT WHEN gen_cv%NOTFOUND;
--
--          aSequenza:=aSequenza + 20;
--
--
--          BEGIN
--
--             INSERT INTO REPORT_GENERICO
--                   (id,
--                    chiave,
--                    tipo,
--                    sequenza,
--                    descrizione,
--                    attributo_1,
--                    attributo_4,
--                    data_1,
--                    data_2,
--                    attributo_20
--                   )
--            VALUES (repID,
--                    gruppoStm,
--                    'E',
--                    aSequenza,
--                    'Revoca dichiarazione d''intento',
--                    cv_ragione_sociale,
--                    cv_numero_dichiarazione,
--                    cv_data_inizio_validita,
--                    cv_data_comunicazione_rev,
--                    descrizioneGruppoStm
--                   );
--
--
--          EXCEPTION
--
--             WHEN DUP_VAL_ON_INDEX THEN
--                  Ibmerr001.RAISE_ERR_GENERICO ('Revoca dichiarazione di intento, già stampata'  );
--          END;
--       END LOOP;
--       -- close cursore
--       CLOSE gen_cv;
--     END;
--    END IF;
--  END IF;
-- END IF;
-- END insRevocaDatiIntento;
--
--
--
--  =============================================================================
--  Stampa Annotazioni libere
--  =============================================================================
--  FUNCTION insAnnotazioniLibere
--     (
--     repID INTEGER,
--     aSequenza IN OUT INTEGER,
--     aPasso INTEGER,
--     codiceSezionale VARCHAR2,
--     prefissoSezionale VARCHAR2,
--     descrizioneSezionale VARCHAR2,
--     aCodiceEsercizio VARCHAR2,
--     aDataInizio DATE,
--     aDataFine DATE,
--     aTipoRegistro VARCHAR2,
--     gruppoStm CHAR,
--     sottoGruppoStm CHAR,
--     descrizioneGruppoStm VARCHAR2
--    ) RETURN NUMBER AS
--    retCode INTEGER;
--    gen_cv GenericCurTyp;
--
-- BEGIN
--
--  IF aPasso = 7 THEN
--
--    BEGIN
--
--         OPEN gen_cv FOR
--
--              SELECT note
--              FROM   NOTE_REGISTRO_IVA
--              WHERE  esercizio = aCodiceEsercizio AND
--                     sezionale = codiceSezionale AND
--                     SUBSTR(tipo_registro,1,1) = aTipoRegistro AND
--                     (data_inizio BETWEEN aDataInizio AND aDataFine) AND
--                     (data_fine BETWEEN aDataInizio AND aDataFine) AND
--                     note IS NOT NULL;
--
--        LOOP
--
--          FETCH gen_cv INTO
--                cv_note;
--
--          EXIT WHEN gen_cv%NOTFOUND;
--
--          aSequenza:=aSequenza + 20;
--
--          BEGIN
--
--             INSERT INTO REPORT_GENERICO
--                   (id,
--                    chiave,
--                    tipo,
--                    sequenza,
--                    descrizione,
--                    attributo_1,
--                    attributo_3,
--                    attributo_20
--                   )
--            VALUES (repID,
--                    gruppoStm,
--                    'F',
--                    aSequenza,
--                    'Annotazioni Libere',
--                    cv_note,
--                    codiceSezionale,
--                    descrizioneGruppoStm
--                   );
--
--          EXCEPTION
--
--             WHEN dup_val_on_index THEN
--                  errMsg := substr(SQLERRM, 1, 200);
--                  ROLLBACK;
--                  ibmerr001.RAISE_ERR_GENERICO
--                    (errMsg || CHR(10) || 'PASSO ' || aPasso ||
--                     ' - Chiave duplicata in inserimento annotazioni libere');
--                  RETURN 1;
--
--             WHEN others THEN
--                  errMsg := substr(SQLERRM, 1, 200);
--                  ROLLBACK;
--                  ibmerr001.RAISE_ERR_GENERICO
--                     (errMsg || CHR(10) || 'Passo ' || aPasso ||
--                     ' - Errore generico in inserimento annotazioni libere');
--                 RETURN 1;
--
--          END;
--
--       END LOOP;
--
--       -- close cursore
--
--       CLOSE gen_cv;
--
--    EXCEPTION
--
--       WHEN others THEN
--            errMsg := substr(SQLERRM, 1, 200);
--            ROLLBACK;
--            ibmerr001.RAISE_ERR_GENERICO
--               (
--                errMsg || CHR(10) || 'Passo ' || aPasso ||
--                ' - Errore generico in select annotazioni libere');
--            RETURN 1;
--
--    END;
--
--  END IF;
--
-- RETURN 0;
--
-- END insAnnotazioniLibere;

-- =================================================================================================
-- Lettura liquidazione. Sulla tabella REPORT_GENERICO si memorizzano:
-- 1 dati letti dalla liquidazione e non calcolati dal programma
-- 2 dati calcolati dal programma
-- =================================================================================================
PROCEDURE letturaLiquidazione
   (
    repID INTEGER,
    aCdCds VARCHAR2,
    aEsercizio NUMBER,
    aCdUo VARCHAR2,
    aDataInizio DATE,
    aDataFine DATE,
    aTipoRegistro VARCHAR2,
    aTipoReport VARCHAR2,
    gruppoStm CHAR,
    sottoGruppoStm CHAR,
    descrizioneGruppoStm VARCHAR2,
    inGruppoReport VARCHAR2
   ) IS
   aRecLiquidazioneIva LIQUIDAZIONE_IVA%ROWTYPE;
   gen_cv GenericCurTyp;

BEGIN

   ----------------------------------------------------------------------------------------------
   -- Lettura dati della liquidazione e memorizzazione di quelli non calcolati dalla procedura.
   -- Sia quella provvisoria che quella definitiva utilizzato il riferimento repID

   BEGIN

      OPEN gen_cv FOR

           SELECT NVL(var_imp_per_prec,0),
                  NVL(iva_non_vers_per_prec,0),
                  NVL(iva_deb_cred_per_prec,0),
                  NVL(cred_iva_comp_detr,0),
                  NVL(int_deb_liq_trim,0),
                  NVL(cred_iva_spec_detr,0),
                  NVL(acconto_iva_vers,0),
                  nvl(iva_liq_esterna,0)
           FROM   LIQUIDAZIONE_IVA
           WHERE  cd_cds = aCdCds AND
                  esercizio = aEsercizio AND
                  cd_unita_organizzativa = aCdUo AND
                  tipo_liquidazione = inGruppoReport AND
                  dt_inizio = aDataInizio AND
                  dt_fine = aDataFine AND
                  report_id = repID;

      LOOP

         FETCH gen_cv INTO
               aRecLiquidazioneIva.var_imp_per_prec,
               aRecLiquidazioneIva.iva_non_vers_per_prec,
               aRecLiquidazioneIva.iva_deb_cred_per_prec,
               aRecLiquidazioneIva.cred_iva_comp_detr,
               aRecLiquidazioneIva.int_deb_liq_trim,
               aRecLiquidazioneIva.cred_iva_spec_detr,
               aRecLiquidazioneIva.acconto_iva_vers,
               aRecLiquidazioneIva.iva_liq_esterna;

         EXIT WHEN gen_cv%NOTFOUND;

         ----------------------------------------------------------------------------------------
         -- Inserimento record relativo ai dati letti dalla liquidazione e non calcolati dalla procedura
         -- e preparazione record per il calcolato dal sistema

         BEGIN

            -- Inserimento record relativo ai dati letti dalla liquidazione e non calcolati dalla procedura

            INSERT INTO REPORT_GENERICO
                   (id,
                    chiave,
                    tipo,
                    sequenza,
                    descrizione,
                    importo_1,
                    importo_2,
                    importo_3,
                    importo_4,
                    importo_5,
                    importo_6,
                    importo_7,
                    importo_16,
                    attributo_40)
            VALUES (repID,
                    gruppoStm,
                    'D',
                    1,
                    sottoGruppoStm,
                    aRecLiquidazioneIva.var_imp_per_prec,
                    aRecLiquidazioneIva.iva_non_vers_per_prec,
                    aRecLiquidazioneIva.iva_deb_cred_per_prec,
                    aRecLiquidazioneIva.cred_iva_comp_detr,
                    aRecLiquidazioneIva.int_deb_liq_trim,
                    aRecLiquidazioneIva.cred_iva_spec_detr,
                    aRecLiquidazioneIva.acconto_iva_vers,
                    aRecLiquidazioneIva.iva_liq_esterna,
                    descrizioneGruppoStm);

            -- Inserimento (azzeramento) record dell'attuale liquidazione (calcolato dal sistema)

            INSERT INTO VP_LIQUIDAZIONE_IVA
                   (id_report,
                    chiave,
                    tipo,
                    sequenza,
                    descrizione,
                    rp_iva_ven,
                    rp_iva_ven_diff,
                    rp_iva_ven_diff_esig,
                    rp_iva_ven_diff_es_prec_esig,
                    rp_iva_ven_autofatt,
                    rp_iva_ven_intraue,
                    rp_iva_acq,
                    rp_iva_acq_non_detr,
                    rp_iva_acq_diff,
                    rp_iva_acq_diff_esig,
                    rp_iva_acq_diff_es_prec_esig,
                    rp_iva_non_vers_per_prec,
                    rp_iva_deb_cred_per_prec,
                    rp_iva_cred_no_prorata,
                    rp_perc_prorata_detraibile,
                    rp_gestione_prorata,
                    rp_esercizio_euro,
                    rp_ds_gruppo_stampa,
                    rp_iva_liq_esterna,
                    rp_iva_acq_split_payment,
                    rp_iva_ven_split_payment)
            VALUES (repID,
                    gruppoStm,
                    'D',
                    2,
                    sottoGruppoStm,
                    0,
                    0,
                    0,
                    0,
                    0,
                    0,
                    0,
                    0,
                    0,
                    0,
                    0,
                    aRecLiquidazioneIva.iva_non_vers_per_prec,
                    0,
                    0,
                    0,
                    NULL,
                    NULL,
                    descrizioneGruppoStm,
                    aRecLiquidazioneIva.iva_liq_esterna,
                    0,
                    0);

         EXCEPTION

            WHEN DUP_VAL_ON_INDEX THEN
                 IBMERR001.RAISE_ERR_GENERICO
                    ('Chiave duplicata in inserimento riepilogo iva su tabella REPORT_GENERICO');
         END;

      END LOOP;

      CLOSE gen_cv;

   END;

END letturaLiquidazione;

-- =================================================================================================
-- Valorizzazione elementi della liquidazione calcolati dal sistema
-- =================================================================================================
PROCEDURE calcolaLiquidazione
   (
    repID INTEGER,
    aCdCdsOrigine VARCHAR2,
    aCdUoOrigine VARCHAR2,
    aEsercizio NUMBER,
    aCdTipoSezionale VARCHAR2,
    aDataInizio DATE,
    aDataFine DATE,
    aTipoRegistro VARCHAR2,
    aTipoReport VARCHAR2,
    acquistiVendite INTEGER,
    gruppoStm CHAR,
    sottoGruppoStm CHAR,
    descrizioneGruppoStm VARCHAR2,
    aEsercizioEuro VARCHAR2,
    aGestioneProrata VARCHAR2,
    aEsercizioReale NUMBER,
    inGruppoReport VARCHAR2
   ) IS

   aDataInizioLiqPrec DATE;
   aDataFineLiqPrec DATE;
   aEsercizioFineLiqPrec NUMBER(4);
   aCreDebPrecedente NUMBER(15,2);
   aIvaCreditoPeriodoPrec NUMBER(15,2);
   aPercentualeProrata NUMBER(15,2);
   aEsercizioPerProrata NUMBER(4);

   aRecLiquidazioneIva LIQUIDAZIONE_IVA%ROWTYPE;
   aRecReportLiquidazioneIva VP_LIQUIDAZIONE_IVA%ROWTYPE;

   gen_cv GenericCurTyp;

Begin
   -------------------------------------------------------------------------------------------------
   -- Lettura dell'eventuale credito/debito dalla precedente liquidazione.
   -- Si legge il campo LIQUIDAZIONE_IVA.iva_da_versare della liquidazione definitiva precedente al
   -- periodo in gestione. Si mantiene il campo solo se positivo (credito) o negativo <= 26 euro
   -- (debito non versato)

   aDataFineLiqPrec:=aDataInizio - 1;
   aDataInizioLiqPrec:=IBMUTL001.getFirstDayOfMonth(aDataFineLiqPrec);
   aEsercizioFineLiqPrec:=TO_NUMBER(TO_CHAR(aDataFineLiqPrec,'YYYY'));

   -- L'esercizio è corretto per gestire il fatto che il mese di dicembre è sempre liquidato
   -- nell'esercizio successivo

   IF TO_CHAR(aDataFineLiqPrec,'MM') = '12' and aEsercizioFineLiqPrec=2015 THEN
          aEsercizioFineLiqPrec:=aEsercizioFineLiqPrec;
   else
        IF TO_CHAR(aDataFineLiqPrec,'MM') = '12' then
           aEsercizioFineLiqPrec:=aEsercizioFineLiqPrec + 1;
        end if;
   END IF;

   -- Lettura dell'eventuale credito precedente

   BEGIN

      SELECT NVL(iva_da_versare,0) INTO aCreDebPrecedente
      FROM   LIQUIDAZIONE_IVA
      WHERE  cd_cds = aCdCdsOrigine AND
             esercizio = aEsercizioFineLiqPrec AND
             cd_unita_organizzativa = aCdUoOrigine AND
             tipo_liquidazione = inGruppoReport AND
             dt_inizio = aDataInizioLiqPrec AND
             dt_fine = aDataFineLiqPrec AND
             stato = 'D';

   EXCEPTION

      WHEN NO_DATA_FOUND THEN
           aCreDebPrecedente:=0;

   END;

   aIvaCreditoPeriodoPrec:=0;

   -- Controllo del valore del credito del periodo precedente. L'eventuale debito inferiore a 26 euro
   -- non è memorizzato in quanto comunque versato dalle singole Uo.

   IF    aCreDebPrecedente > 0 THEN
         aIvaCreditoPeriodoPrec:=aCreDebPrecedente;
   END IF;

   UPDATE VP_LIQUIDAZIONE_IVA
   SET    rp_iva_deb_cred_per_prec = aIvaCreditoPeriodoPrec
   WHERE  id_report = repID AND
          chiave = gruppoStm AND
          tipo = 'D' AND
          sequenza = 2;

   -------------------------------------------------------------------------------------------------
   -- Ciclo principale di lettura dei dati da calcolare per la liquidazione (no esigibilità differita)

   BEGIN

      IF acquistiVendite = 1 THEN

         OPEN gen_cv FOR

              SELECT cd_cds_origine,
                     cd_uo_origine,
                     esercizio,
                     cd_tipo_sezionale,
                     ti_fattura,
                     data_registrazione,
                     sezione_liquidazione,
                     ti_istituz_commerc,
                     SUM(NVL(iva_dettaglio,0)),
                     SUM(TRUNC(iva_indetraibile_dettaglio,2)),
                     esigibilita_diff,
                     tipo_documento_ft_pas,
                     tipo_autofattura,
                     fl_split_payment
              FROM   V_LIQUIDAZIONE_IVA_ACQUISTI
              WHERE  cd_cds_origine = aCdCdsOrigine AND
                     cd_uo_origine = aCdUoOrigine AND
                     esercizio = aEsercizioReale AND
                     cd_tipo_sezionale = aCdTipoSezionale AND
                     data_registrazione >= aDataInizio AND
                     data_registrazione <= aDataFine
              GROUP BY cd_cds_origine,
                       cd_uo_origine,
                       esercizio,
                       cd_tipo_sezionale,
                       ti_fattura,
                       data_registrazione,
                       sezione_liquidazione,
                       ti_istituz_commerc,
                       esigibilita_diff,
                       tipo_documento_ft_pas,
                       tipo_autofattura,
                       fl_split_payment;

      ELSE

         OPEN gen_cv FOR

              SELECT cd_cds_origine,
                     cd_uo_origine,
                     esercizio,
                     cd_tipo_sezionale,
                     ti_fattura,
                     data_registrazione,
                     sezione_liquidazione,
                     ti_istituz_commerc,
                     SUM(NVL(iva_dettaglio,0)),
                     0,
                     esigibilita_diff,
                     tipo_documento_ft_pas,
                     tipo_autofattura,
                     fl_split_payment
              FROM   V_LIQUIDAZIONE_IVA_VENDITE
              WHERE  cd_cds_origine = aCdCdsOrigine AND
                     cd_uo_origine = aCdUoOrigine AND
                     esercizio = aEsercizioReale AND
                     cd_tipo_sezionale = aCdTipoSezionale AND
                     data_emissione >= aDataInizio AND
                     data_emissione <= aDataFine
              GROUP BY cd_cds_origine,
                       cd_uo_origine,
                       esercizio,
                       cd_tipo_sezionale,
                       ti_fattura,
                       data_registrazione,
                       sezione_liquidazione,
                       ti_istituz_commerc,
                       0,
                       esigibilita_diff,
                       tipo_documento_ft_pas,
                       tipo_autofattura,
                       fl_split_payment;

      END IF;

      LOOP

         FETCH gen_cv INTO
               cv_cd_cds_origine,
               cv_cd_uo_origine,
               cv_esercizio,
               cv_cd_tipo_sezionale,
               cv_ti_fattura,
               cv_data_registrazione,
               cv_sezione_liquidazione,
               cv_comm_ist_dettaglio,
               cv_iva_dettaglio,
               cv_iva_indetraibile_dettaglio,
               cv_esigibilita_diff,
               cv_tipo_documento_ft_pas,
               cv_tipo_autofattura,
               cv_fl_split_payment;

         EXIT WHEN gen_cv%NOTFOUND;
Dbms_Output.put_line( cv_cd_cds_origine||' '||
               cv_cd_uo_origine||' '||
               cv_esercizio||' '||
               cv_cd_tipo_sezionale||' '||
               cv_ti_fattura||' '||
               cv_data_registrazione||' '||
               cv_sezione_liquidazione||' '||
               cv_iva_dettaglio||' '||
               cv_tipo_documento_ft_pas||' '||
               cv_fl_split_payment);
         -- Azzeramento importi iva se gestione commerciale o istituzionale

         IF acquistiVendite = 1 THEN
            IF inGruppoReport = 'C' THEN
               IF cv_comm_ist_dettaglio = 'I' THEN
                  cv_iva_dettaglio:=0;
                  cv_iva_indetraibile_dettaglio:=0;
               END IF;
            ELSE
               IF cv_comm_ist_dettaglio = 'C' THEN
                  cv_iva_dettaglio:=0;
                  cv_iva_indetraibile_dettaglio:=0;
               END IF;
            END IF;
         END IF;

         -- Aggiornamento dei dati letti dalla liquidazione calcolati dalla procedura

         aRecReportLiquidazioneIva:=NULL;
         aRecReportLiquidazioneIva.rp_iva_ven:=0;
         aRecReportLiquidazioneIva.rp_iva_ven_diff:=0;
         aRecReportLiquidazioneIva.rp_iva_ven_diff_esig:=0;
         aRecReportLiquidazioneIva.rp_iva_ven_diff_es_prec_esig:=0;
         aRecReportLiquidazioneIva.rp_iva_ven_autofatt:=0;
         aRecReportLiquidazioneIva.rp_iva_ven_intraue:=0;
         aRecReportLiquidazioneIva.rp_iva_ven_split_payment:=0;
         aRecReportLiquidazioneIva.rp_iva_acq:=0;
         aRecReportLiquidazioneIva.rp_iva_acq_non_detr:=0;
         aRecReportLiquidazioneIva.rp_iva_acq_diff:=0;
         aRecReportLiquidazioneIva.rp_iva_acq_diff_esig:=0;
         aRecReportLiquidazioneIva.rp_iva_acq_diff_es_prec_esig:=0;
         aRecReportLiquidazioneIva.rp_iva_acq_split_payment:=0;

         -- Gestione speciale per le liquidazioni istituzionali dove iva acquisti deve essere
         -- considerata come debito
         -- RP inGruppoReport = 'X'
         IF (inGruppoReport = 'I' OR
             inGruppoReport = 'S' Or
             inGruppoReport = 'X' Or
             inGruppoReport = 'P') THEN
            IF cv_sezione_liquidazione = 'AF' THEN
               aRecReportLiquidazioneIva.rp_iva_ven:=cv_iva_dettaglio;
            END IF;
         ELSE
            IF    cv_sezione_liquidazione = 'VF' THEN
                  aRecReportLiquidazioneIva.rp_iva_ven:=cv_iva_dettaglio;
                  IF cv_esigibilita_diff = 'Y' THEN
                     aRecReportLiquidazioneIva.rp_iva_ven_diff:=cv_iva_dettaglio;
                  END IF;
            ELSIF cv_sezione_liquidazione = 'VA' THEN
                  if cv_fl_split_payment = 'Y' Then
                    aRecReportLiquidazioneIva.rp_iva_ven_split_payment:=cv_iva_dettaglio;
                  else
                    aRecReportLiquidazioneIva.rp_iva_ven_autofatt:=cv_iva_dettaglio;
                  end if;
--                  IF cv_tipo_autofattura = '001' THEN
--                     aRecReportLiquidazioneIva.rp_iva_ven_autofatt:=cv_iva_dettaglio;
--                  ELSE
--                     aRecReportLiquidazioneIva.rp_iva_ven_intraue:=cv_iva_dettaglio;
--                  END IF;
                  IF cv_esigibilita_diff = 'Y' THEN
                     aRecReportLiquidazioneIva.rp_iva_ven_diff:=cv_iva_dettaglio;
                  END IF;
            ELSIF cv_sezione_liquidazione = 'AF' THEN
                  aRecReportLiquidazioneIva.rp_iva_acq:=cv_iva_dettaglio;
                  IF cv_esigibilita_diff = 'Y' THEN
                     aRecReportLiquidazioneIva.rp_iva_acq_diff:=cv_iva_dettaglio;
                  ELSE
                     aRecReportLiquidazioneIva.rp_iva_acq_non_detr:=cv_iva_indetraibile_dettaglio;
                  END IF;
                  IF cv_fl_split_payment = 'Y' Then
                     aRecReportLiquidazioneIva.rp_iva_acq_split_payment:=cv_iva_dettaglio;
                  END IF;
            END IF;
         END IF;

         BEGIN
            UPDATE VP_LIQUIDAZIONE_IVA
            SET    rp_iva_ven = rp_iva_ven + aRecReportLiquidazioneIva.rp_iva_ven,
                   rp_iva_ven_diff = rp_iva_ven_diff + aRecReportLiquidazioneIva.rp_iva_ven_diff,
                   rp_iva_ven_diff_esig = rp_iva_ven_diff_esig + aRecReportLiquidazioneIva.rp_iva_ven_diff_esig,
                   rp_iva_ven_diff_es_prec_esig = rp_iva_ven_diff_es_prec_esig + aRecReportLiquidazioneIva.rp_iva_ven_diff_es_prec_esig,
                   rp_iva_ven_autofatt = rp_iva_ven_autofatt + aRecReportLiquidazioneIva.rp_iva_ven_autofatt,
                   rp_iva_ven_intraue = rp_iva_ven_intraue + aRecReportLiquidazioneIva.rp_iva_ven_intraue,
                   rp_iva_ven_split_payment = rp_iva_ven_split_payment + aRecReportLiquidazioneIva.rp_iva_ven_split_payment,
                   rp_iva_acq = rp_iva_acq + aRecReportLiquidazioneIva.rp_iva_acq,
                   rp_iva_acq_non_detr = rp_iva_acq_non_detr + aRecReportLiquidazioneIva.rp_iva_acq_non_detr,
                   rp_iva_acq_diff = rp_iva_acq_diff + aRecReportLiquidazioneIva.rp_iva_acq_diff,
                   rp_iva_acq_diff_esig = rp_iva_acq_diff_esig + aRecReportLiquidazioneIva.rp_iva_acq_diff_esig,
                   rp_iva_acq_diff_es_prec_esig = rp_iva_acq_diff_es_prec_esig + aRecReportLiquidazioneIva.rp_iva_acq_diff_es_prec_esig,
                   rp_iva_acq_split_payment = rp_iva_acq_split_payment + aRecReportLiquidazioneIva.rp_iva_acq_split_payment
            WHERE  id_report = repID AND
                   chiave = gruppoStm AND
                   tipo = 'D' AND
                   sequenza = 2;

         END;

      END LOOP;

      CLOSE gen_cv;

   END;

   -------------------------------------------------------------------------------------------------
   -- Ciclo principale di lettura dei dati da calcolare per la liquidazione (si esigibilità differita)
   -- Si prelevano tutti i record con data esigibilità IVA inferiore alla data di fine, la vista
   -- V_LIQUID_IVA_VENDITE_ESIG garantisce il processo dei soli record mai inclusi in precedenti liquidazioni

   BEGIN

      IF acquistiVendite = 1 Then
         OPEN gen_cv FOR

              SELECT cd_cds_origine,
                     cd_uo_origine,
                     esercizio,
                     cd_tipo_sezionale,
                     ti_fattura,
                     data_registrazione,
                     sezione_liquidazione,
                     SUM(NVL(iva_dettaglio,0))
              FROM   V_LIQUID_IVA_ACQUISTI_ESIG
              WHERE  cd_cds_origine = aCdCdsOrigine AND
                     cd_uo_origine = aCdUoOrigine AND
                     cd_tipo_sezionale = aCdTipoSezionale AND
                     data_esigibilita IS NOT NULL AND
                     data_esigibilita <= aDataFine
              GROUP BY cd_cds_origine,
                     cd_uo_origine,
                     esercizio,
                     cd_tipo_sezionale,
                     ti_fattura,
                     data_registrazione,
                     sezione_liquidazione;
        Elsif acquistiVendite = 2 Then
         OPEN gen_cv FOR

              SELECT cd_cds_origine,
                     cd_uo_origine,
                     esercizio,
                     cd_tipo_sezionale,
                     ti_fattura,
                     data_registrazione,
                     sezione_liquidazione,
                     SUM(NVL(iva_dettaglio,0))
              FROM   V_LIQUID_IVA_VENDITE_ESIG
              WHERE  cd_cds_origine = aCdCdsOrigine AND
                     cd_uo_origine = aCdUoOrigine AND
                     cd_tipo_sezionale = aCdTipoSezionale AND
                     data_esigibilita IS NOT NULL AND
                     data_esigibilita <= aDataFine
              GROUP BY cd_cds_origine,
                     cd_uo_origine,
                     esercizio,
                     cd_tipo_sezionale,
                     ti_fattura,
                     data_registrazione,
                     sezione_liquidazione;
         End If;

         LOOP

            FETCH gen_cv INTO
                  cv_cd_cds_origine,
                  cv_cd_uo_origine,
                  cv_esercizio,
                  cv_cd_tipo_sezionale,
                  cv_ti_fattura,
                  cv_data_registrazione,
                  cv_sezione_liquidazione,
                  cv_iva_dettaglio;

            EXIT WHEN gen_cv%NOTFOUND;
Dbms_Output.put_line('esig '||cv_cd_cds_origine||' '||
               cv_cd_uo_origine||' '||
               cv_esercizio||' '||
               cv_cd_tipo_sezionale||' '||
               cv_ti_fattura||' '||
               cv_data_registrazione||' '||
               cv_sezione_liquidazione||' '||
               cv_iva_dettaglio);
            -- Aggiornamento ai dati letti dalla liquidazione calcolati dalla procedura

            aRecReportLiquidazioneIva:=NULL;
            aRecReportLiquidazioneIva.rp_iva_ven_diff_esig:=0;
            aRecReportLiquidazioneIva.rp_iva_ven_diff_es_prec_esig:=0;
            aRecReportLiquidazioneIva.rp_iva_acq_diff_esig:=0;
            aRecReportLiquidazioneIva.rp_iva_acq_diff_es_prec_esig:=0;

            IF    cv_sezione_liquidazione = 'VE' Then
                  If cv_esercizio != aEsercizio Then
                      aRecReportLiquidazioneIva.rp_iva_ven_diff_es_prec_esig:=cv_iva_dettaglio;
                  Else
                      aRecReportLiquidazioneIva.rp_iva_ven_diff_esig:=cv_iva_dettaglio;
                  End If;
            ELSIF cv_sezione_liquidazione = 'AC' Then
                  If cv_esercizio != aEsercizio Then
                      aRecReportLiquidazioneIva.rp_iva_acq_diff_es_prec_esig:=cv_iva_dettaglio;
                  Else
                      aRecReportLiquidazioneIva.rp_iva_acq_diff_esig:=cv_iva_dettaglio;
                  End If;
            END IF;

            BEGIN

               UPDATE VP_LIQUIDAZIONE_IVA
               SET    rp_iva_ven_diff_esig = rp_iva_ven_diff_esig + aRecReportLiquidazioneIva.rp_iva_ven_diff_esig,
                      rp_iva_ven_diff_es_prec_esig = rp_iva_ven_diff_es_prec_esig + aRecReportLiquidazioneIva.rp_iva_ven_diff_es_prec_esig,
                      rp_iva_acq_diff_esig = rp_iva_acq_diff_esig + aRecReportLiquidazioneIva.rp_iva_acq_diff_esig,
                      rp_iva_acq_diff_es_prec_esig = rp_iva_acq_diff_es_prec_esig + aRecReportLiquidazioneIva.rp_iva_acq_diff_es_prec_esig
               WHERE  id_report = repID AND
                      chiave = gruppoStm AND
                      tipo = 'D' AND
                      sequenza = 2;

            END;

         END LOOP;

         CLOSE gen_cv;

     -- END IF;

   END;

   -------------------------------------------------------------------------------------------------
   -- Calcolo del prorata

   BEGIN

      aPercentualeProrata:=NULL;

      IF (aGestioneProrata = 'Y' AND
          inGruppoReport = CNRCTB250.TI_LIQ_IVA_COMMERC) THEN
         aEsercizioPerProrata:=(aEsercizioReale - 1);

         BEGIN

            SELECT percentuale INTO aPercentualeProrata
            FROM   PRO_RATA
            WHERE  esercizio = aEsercizioPerProrata AND
                   cd_attivita_commerciale = '*';

         EXCEPTION

            WHEN no_data_found THEN
                 aPercentualeProrata:=NULL;

         END;

      END IF;

      UPDATE VP_LIQUIDAZIONE_IVA
      SET    rp_gestione_prorata = aGestioneProrata,
             rp_esercizio_euro = aEsercizioEuro,
             rp_perc_prorata_detraibile = aPercentualeProrata
      WHERE  id_report = repID AND
             chiave = gruppoStm AND
             tipo = 'D' AND
             sequenza = 2;

   END;

END calcolaLiquidazione;


-- =================================================================================================
-- Valorizzazione elementi della liquidazione calcolati dal sistema
-- =================================================================================================
PROCEDURE calcolaLiquidazioneEnte
   (
    repID INTEGER,
    aCdCdsOrigine VARCHAR2,
    aCdUoOrigine VARCHAR2,
    aEsercizio NUMBER,
    aDataInizio DATE,
    aDataFine DATE,
    aTipoRegistro VARCHAR2,
    aTipoReport VARCHAR2,
    gruppoStm CHAR,
    sottoGruppoStm CHAR,
    descrizioneGruppoStm VARCHAR2,
    aEsercizioEuro VARCHAR2,
    aGestioneProrata VARCHAR2,
    aEsercizioReale NUMBER,
    inGruppoReport VARCHAR2
   ) IS

   aDataInizioLiqPrec DATE;
   aDataFineLiqPrec DATE;
   aEsercizioFineLiqPrec NUMBER(4);
   aCreDebPrecedente NUMBER(15,2);
   aIvaCreditoPeriodoPrec NUMBER(15,2);
   aPercentualeProrata NUMBER(15,2);
   aEsercizioPerProrata NUMBER(4);

   aRecLiquidazioneIva LIQUIDAZIONE_IVA%ROWTYPE;
   UOENTE unita_organizzativa%rowtype:= CNRCTB020.GETUOENTE(aEsercizio);
   gen_cv GenericCurTyp;

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Lettura dell'eventuale credito/debito dalla precedente liquidazione.
   -- Si legge il campo LIQUIDAZIONE_IVA.iva_da_versare della liquidazione definitiva precedente al
   -- periodo in gestione. Si mantiene il campo solo se positivo (credito) o negativo <= 50.000 o
   -- 26 euro (debito non versato)
   --

   aDataFineLiqPrec:=aDataInizio - 1;
   aDataInizioLiqPrec:=IBMUTL001.getFirstDayOfMonth(aDataFineLiqPrec);
   aEsercizioFineLiqPrec:=TO_NUMBER(TO_CHAR(aDataFineLiqPrec,'YYYY'));

   -- L'esercizio è corretto per gestire il fatto che il mese di dicembre è sempre liquidato
   -- nell'esercizio successivo


  IF TO_CHAR(aDataFineLiqPrec,'MM') = '12' and aEsercizioFineLiqPrec=2015 THEN
          aEsercizioFineLiqPrec:=aEsercizioFineLiqPrec;
   else
        IF TO_CHAR(aDataFineLiqPrec,'MM') = '12' then
           aEsercizioFineLiqPrec:=aEsercizioFineLiqPrec + 1;
        end if;
   END IF;

   -- Lettura dell'eventuale credito del mese precedente

   BEGIN

      SELECT NVL(iva_da_versare,0) INTO aCreDebPrecedente
      FROM   LIQUIDAZIONE_IVA
      WHERE  cd_cds = aCdCdsOrigine AND
             esercizio = aEsercizioFineLiqPrec AND
             cd_unita_organizzativa = aCdUoOrigine AND
             tipo_liquidazione = inGruppoReport AND
             dt_inizio = aDataInizioLiqPrec AND
             dt_fine = aDataFineLiqPrec AND
             stato = 'D';

   EXCEPTION

        WHEN NO_DATA_FOUND THEN
             aCreDebPrecedente:=0;

   END;

   aIvaCreditoPeriodoPrec:=0;

   -- Controllo del valore del credito, debito del periodo precedente

   IF    aCreDebPrecedente > 0 THEN
         aIvaCreditoPeriodoPrec:=aCreDebPrecedente;
   ELSIF aCreDebPrecedente < 0 THEN
         IF aCreDebPrecedente >=-26 THEN
            aIvaCreditoPeriodoPrec:=aCreDebPrecedente;
         END IF;
   END IF;

   UPDATE VP_LIQUIDAZIONE_IVA
   SET    rp_iva_deb_cred_per_prec = aIvaCreditoPeriodoPrec
   WHERE  id_report = repID AND
          chiave = gruppoStm AND
          tipo = 'D' AND
          sequenza = 2;

   -------------------------------------------------------------------------------------------------
   -- Lettura dati della liquidazione e memorizzazione di quelli non calcolati dalla procedura (no differite)
   -- Si include ora anche la gestione dell'iva indetraibile solo per gli acquisti non differiti

   BEGIN

      OPEN gen_cv FOR

           SELECT *
           FROM   LIQUIDAZIONE_IVA
           WHERE  report_id = 0 AND
                  cd_cds !=UOENTE.cd_unita_padre and
                  stato = 'D' AND
                  esercizio = aEsercizio AND
                  tipo_liquidazione = inGruppoReport AND
                  dt_inizio = aDataInizio AND
                  dt_fine = aDataFine;

      LOOP

         FETCH gen_cv INTO
               aRecLiquidazioneIva;

         EXIT WHEN gen_cv%NOTFOUND;

         -- Aggiornamento dei dati letti dalle liquidazioni delle diverse UO

         BEGIN

            UPDATE VP_LIQUIDAZIONE_IVA
            SET    rp_iva_ven = rp_iva_ven + aRecLiquidazioneIva.iva_vendite,
                   rp_iva_ven_diff = rp_iva_ven_diff + aRecLiquidazioneIva.iva_vendite_diff,
                   rp_iva_ven_diff_esig = rp_iva_ven_diff_esig + aRecLiquidazioneIva.iva_vend_diff_esig,
                   rp_iva_ven_diff_es_prec_esig = rp_iva_ven_diff_es_prec_esig + aRecLiquidazioneIva.iva_vend_diff_es_prec_esig,
                   rp_iva_ven_autofatt = rp_iva_ven_autofatt + aRecLiquidazioneIva.iva_autofatt,
                   rp_iva_ven_intraue = rp_iva_ven_intraue + aRecLiquidazioneIva.iva_intraue,
                   rp_iva_ven_split_payment = rp_iva_ven_split_payment + aRecLiquidazioneIva.iva_ven_split_payment,
                   rp_iva_acq = rp_iva_acq + aRecLiquidazioneIva.iva_acquisti,
                   rp_iva_acq_non_detr = rp_iva_acq_non_detr + aRecLiquidazioneIva.iva_acq_non_detr,
                   rp_iva_acq_diff = rp_iva_acq_diff + aRecLiquidazioneIva.iva_acquisti_diff,
                   rp_iva_acq_diff_esig = rp_iva_acq_diff_esig + aRecLiquidazioneIva.iva_acq_diff_esig,
                   rp_iva_acq_diff_es_prec_esig = rp_iva_acq_diff_es_prec_esig + aRecLiquidazioneIva.iva_acq_diff_es_prec_esig,
                   rp_iva_acq_split_payment = rp_iva_acq_split_payment + aRecLiquidazioneIva.iva_acq_split_payment,
                   RP_IVA_LIQ_ESTERNA = nvl(RP_IVA_LIQ_ESTERNA,0) +nvl(aRecLiquidazioneIva.IVA_LIQ_ESTERNA ,0)
            WHERE  id_report = repID AND
                   chiave = gruppoStm AND
                   tipo = 'D' AND
                   sequenza = 2;

         END;

      END LOOP;

      CLOSE gen_cv;

   END;

   -------------------------------------------------------------------------------------------------
   -- Attivazione del calcolo del prorata

   BEGIN

      aPercentualeProrata:=NULL;

      IF (aGestioneProrata = 'Y' AND
          inGruppoReport = CNRCTB250.TI_LIQ_IVA_COMMERC) THEN

         aEsercizioPerProrata:=(aEsercizioReale - 1);

         BEGIN

            SELECT percentuale INTO aPercentualeProrata
            FROM   PRO_RATA
            WHERE  esercizio = aEsercizioPerProrata AND
                   cd_attivita_commerciale = '*';

         EXCEPTION

            WHEN no_data_found THEN
                 aPercentualeProrata:=NULL;

         END;

      END IF;

      UPDATE VP_LIQUIDAZIONE_IVA
      SET    rp_gestione_prorata = aGestioneProrata,
             rp_esercizio_euro = aEsercizioEuro,
             rp_perc_prorata_detraibile = aPercentualeProrata
      WHERE  id_report = repID AND
             chiave = gruppoStm AND
             tipo = 'D' AND
             sequenza = 2;

   END;

END calcolaLiquidazioneEnte;

-- =================================================================================================
-- Scrittura liquidazione. Sulla tabella LIQUIDAZIONE_IVA si memorizzano i soli valori calcolati dalla procedura
-- =================================================================================================
PROCEDURE scritturaLiquidazione
   (
    repID INTEGER,
    aCdCds VARCHAR2,
    aEsercizio NUMBER,
    aCdUo VARCHAR2,
    aDataInizio DATE,
    aDataFine DATE,
    aTipoRegistro VARCHAR2,
    aTipoReport VARCHAR2,
    gruppoStm CHAR,
    sottoGruppoStm CHAR,
    descrizioneGruppoStm VARCHAR2,
    inGruppoReport VARCHAR2
   ) IS
   aRecReportLiquidazioneIva VP_LIQUIDAZIONE_IVA%ROWTYPE;
   aRecLiquidazioneIva LIQUIDAZIONE_IVA%ROWTYPE;

   gen_cv GenericCurTyp;

   ivaAcquisti NUMBER(15,2);
   ivaAcquistiNoProrata NUMBER(15,2);
   ivaVendite NUMBER(15,2);
   ivaDebitoCredito NUMBER(15,2);
   ivaDaVersare NUMBER(15,2);

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Lettura dati della liquidazione calcolata dalla procedura

   BEGIN

      OPEN gen_cv FOR

           SELECT *
           FROM   VP_LIQUIDAZIONE_IVA
           WHERE  id_report = repID AND
                  chiave = gruppoStm AND
                  tipo = 'D' AND
                  sequenza = 2;

      LOOP

         FETCH gen_cv INTO
               aRecReportLiquidazioneIva;

         EXIT WHEN gen_cv%NOTFOUND;
         -------------------------------------------------------------------------------------------
         -- Iva acquisti

         -- Controllo se deve essere attivata la gestione del pro-rata

         ivaAcquistiNoProrata:=(aRecReportLiquidazioneIva.rp_iva_acq -
                                aRecReportLiquidazioneIva.rp_iva_acq_non_detr -
                                aRecReportLiquidazioneIva.rp_iva_acq_diff +
                                aRecReportLiquidazioneIva.rp_iva_acq_diff_esig +
                                aRecReportLiquidazioneIva.rp_iva_acq_diff_es_prec_esig);

         IF (aRecReportLiquidazioneIva.rp_gestione_prorata = 'N' OR
             aRecReportLiquidazioneIva.rp_perc_prorata_detraibile IS NULL) THEN
            ivaAcquisti:=ivaAcquistiNoProrata;
         ELSE
            IF aRecReportLiquidazioneIva.rp_esercizio_euro = 'Y' THEN
               ivaAcquisti:=ROUND((ivaAcquistiNoProrata * aRecReportLiquidazioneIva.rp_perc_prorata_detraibile / 100),2);
            ELSE
               ivaAcquisti:=ROUND((ivaAcquistiNoProrata * aRecReportLiquidazioneIva.rp_perc_prorata_detraibile / 100));
            END IF;
         END IF;

         -------------------------------------------------------------------------------------------
         -- Iva vendite

         ivaVendite:=(aRecReportLiquidazioneIva.rp_iva_ven +
                      aRecReportLiquidazioneIva.rp_iva_ven_split_payment -
                      aRecReportLiquidazioneIva.rp_iva_ven_diff +
                      aRecReportLiquidazioneIva.rp_iva_ven_diff_esig +
                      aRecReportLiquidazioneIva.rp_iva_ven_diff_es_prec_esig +
                      aRecReportLiquidazioneIva.rp_iva_ven_autofatt +
                      aRecReportLiquidazioneIva.rp_iva_ven_intraue);


         -------------------------------------------------------------------------------------------
         -- Aggiornamento del record di liquidazione

         -- Rileggo la liquidazione per il recupero delle informazioni imputate manualmente

         BEGIN

            SELECT * INTO aRecLiquidazioneIva
            FROM   LIQUIDAZIONE_IVA A
            WHERE  A.cd_cds = aCdCds AND
                   A.cd_unita_organizzativa = aCdUo AND
                   A.esercizio = aEsercizio AND
                   A.dt_inizio = aDataInizio AND
                   A.dt_fine = aDataFine AND
                   A.tipo_liquidazione = inGruppoReport AND
                   A.report_id = repID;

         END;

         -- Calcolo attributi iva_deb_cred e iva_da_versare

         ivaDebitoCredito:=ivaAcquisti - ivaVendite + aRecReportLiquidazioneIva.rp_iva_deb_cred_per_prec +
                           NVL(aRecLiquidazioneIva.var_imp_per_prec,0) -
                           NVL(aRecLiquidazioneIva.iva_non_vers_per_prec,0) +
                           NVL(aRecLiquidazioneIva.iva_deb_cred_per_prec,0) +
                           NVL(aRecLiquidazioneIva.cred_iva_comp_detr,0)+
                           NVL(aRecReportLiquidazioneIva.rp_iva_liq_esterna,0);

         ivaDaVersare:=ivaDebitoCredito - NVL(aRecLiquidazioneIva.int_deb_liq_trim,0) +
                       NVL(aRecLiquidazioneIva.cred_iva_spec_detr,0) +
                       NVL(aRecLiquidazioneIva.acconto_iva_vers,0);
         BEGIN

            UPDATE LIQUIDAZIONE_IVA
            SET    iva_vendite = aRecReportLiquidazioneIva.rp_iva_ven,
                   iva_vendite_diff = aRecReportLiquidazioneIva.rp_iva_ven_diff,
                   iva_vend_diff_esig = aRecReportLiquidazioneIva.rp_iva_ven_diff_esig,
                   iva_vend_diff_es_prec_esig = aRecReportLiquidazioneIva.rp_iva_ven_diff_es_prec_esig,
                   iva_autofatt = aRecReportLiquidazioneIva.rp_iva_ven_autofatt,
                   iva_intraue = aRecReportLiquidazioneIva.rp_iva_ven_intraue,
                   iva_debito = ivaVendite,
                   iva_acquisti = aRecReportLiquidazioneIva.rp_iva_acq,
                   iva_acq_non_detr = aRecReportLiquidazioneIva.rp_iva_acq_non_detr,
                   iva_acquisti_diff = aRecReportLiquidazioneIva.rp_iva_acq_diff,
                   iva_acq_diff_esig = aRecReportLiquidazioneIva.rp_iva_acq_diff_esig,
                   iva_acq_diff_es_prec_esig = aRecReportLiquidazioneIva.rp_iva_acq_diff_es_prec_esig,
                   iva_credito_no_prorata = ivaAcquistiNoProrata,
                   perc_prorata_detraibile = aRecReportLiquidazioneIva.rp_perc_prorata_detraibile,
                   iva_credito = ivaAcquisti,
                   iva_non_vers_per_prec = aRecReportLiquidazioneIva.rp_iva_non_vers_per_prec,
                   iva_deb_cred_per_prec = aRecReportLiquidazioneIva.rp_iva_deb_cred_per_prec,
                   iva_deb_cred = ivaDebitoCredito,
                   iva_da_versare = ivaDaVersare,
                   iva_versata = 0,
                   iva_liq_esterna = aRecReportLiquidazioneIva.rp_iva_liq_esterna,
                   iva_acq_split_payment = aRecReportLiquidazioneIva.rp_iva_acq_split_payment,
                   iva_ven_split_payment = aRecReportLiquidazioneIva.rp_iva_ven_split_payment
            WHERE  cd_cds = aCdCds AND
                   esercizio = aEsercizio AND
                   cd_unita_organizzativa = aCdUo AND
                   tipo_liquidazione = inGruppoReport AND
                   dt_inizio = aDataInizio AND
                   dt_fine = aDataFine AND
                   report_id = repID;

         END;

      END LOOP;

      CLOSE gen_cv;

   END;

END scritturaLiquidazione;

-- =================================================================================================
-- Creazione record di liquidazione definitiva
-- =================================================================================================
PROCEDURE insRecLiquidazioneDef
   (
    repID INTEGER,
    aCdCdsOrigine VARCHAR2,
    aCdUoOrigine VARCHAR2,
    aEsercizio NUMBER,
    aDataInizio DATE,
    aDataFine DATE,
    utente VARCHAR2,
    inGruppoReport VARCHAR2
   ) IS

BEGIN

   -----------------------------------------------------------------------------------------------
   -- Scrittura del record di liquidazione definitivo

   INSERT INTO LIQUIDAZIONE_IVA
          (cd_cds,
           esercizio,
           cd_unita_organizzativa,
           dt_inizio,
           dt_fine,
           report_id,
           stato,
           annotazioni,
           dt_versamento,
           cod_azienda,
           cab,
           iva_vendite,
           iva_vendite_diff,
           iva_vend_diff_esig,
           iva_autofatt,
           iva_intraue,
           iva_debito,
           iva_acquisti,
           iva_acq_non_detr,
           iva_acquisti_diff,
           iva_acq_diff_esig,
           iva_credito,
           var_imp_per_prec,
           iva_non_vers_per_prec,
           iva_deb_cred_per_prec,
           cred_iva_comp_detr,
           iva_deb_cred,
           int_deb_liq_trim,
           cred_iva_spec_detr,
           acconto_iva_vers,
           iva_da_versare,
           iva_versata,
           cred_iva_infrann_rimb,
           cred_iva_infrann_comp,
           cd_tipo_documento,
           cd_cds_doc_amm,
           cd_uo_doc_amm,
           esercizio_doc_amm,
           pg_doc_amm,
           iva_credito_no_prorata,
           perc_prorata_detraibile,
           dacr,
           utuv,
           utcr,
           duva,
           pg_ver_rec,
           abi,
           tipo_liquidazione,
           iva_vend_diff_es_prec_esig,
           iva_acq_diff_es_prec_esig,
           iva_liq_esterna,
           iva_acq_split_payment,
           iva_ven_split_payment)
   SELECT  A.cd_cds,
           A.esercizio,
           A.cd_unita_organizzativa,
           A.dt_inizio,
           A.dt_fine,
           -9,
           'D',
           A.annotazioni,
           A.dt_versamento,
           A.cod_azienda,
           A.cab,
           NVL(A.iva_vendite,0),
           NVL(A.iva_vendite_diff,0),
           NVL(A.iva_vend_diff_esig,0),
           NVL(A.iva_autofatt,0),
           NVL(A.iva_intraue,0),
           NVL(A.iva_debito,0),
           NVL(A.iva_acquisti,0),
           NVL(A.iva_acq_non_detr,0),
           NVL(A.iva_acquisti_diff,0),
           NVL(A.iva_acq_diff_esig,0),
           NVL(A.iva_credito,0),
           NVL(A.var_imp_per_prec,0),
           NVL(A.iva_non_vers_per_prec,0),
           NVL(A.iva_deb_cred_per_prec,0),
           NVL(A.cred_iva_comp_detr,0),
           NVL(A.iva_deb_cred,0),
           NVL(A.int_deb_liq_trim,0),
           NVL(A.cred_iva_spec_detr,0),
           NVL(A.acconto_iva_vers,0),
           NVL(A.iva_da_versare,0),
           DECODE(SIGN(NVL(A.iva_da_versare,0)),-1,ABS(NVL(A.iva_da_versare,0)),0),
           NVL(A.cred_iva_infrann_rimb,0),
           NVL(A.cred_iva_infrann_comp,0),
           A.cd_tipo_documento,
           A.cd_cds_doc_amm,
           A.cd_uo_doc_amm,
           A.esercizio_doc_amm,
           A.pg_doc_amm,
           NVL(A.iva_credito_no_prorata,0),
           NVL(A.perc_prorata_detraibile,0),
           A.dacr,
           A.utuv,
           A.utcr,
           A.duva,
           1,
           A.abi,
           inGruppoReport,
           NVL(A.iva_vend_diff_es_prec_esig,0),
           NVL(A.iva_acq_diff_es_prec_esig,0),
           nvl(a.iva_liq_esterna,0),
           nvl(a.iva_acq_split_payment,0),
           nvl(a.iva_ven_split_payment,0)
   FROM    LIQUIDAZIONE_IVA A
   WHERE   A.cd_cds = aCdCdsOrigine AND
           A.esercizio = aEsercizio AND
           A.cd_unita_organizzativa = aCdUoOrigine AND
           A.dt_inizio = aDataInizio AND
           A.dt_fine = aDataFine AND
           A.tipo_liquidazione = inGruppoReport AND
           A.report_id = repID;

   DELETE FROM LIQUIDAZIONE_IVA
   WHERE  cd_cds = aCdCdsOrigine AND
          esercizio = aEsercizio AND
          cd_unita_organizzativa = aCdUoOrigine AND
          dt_inizio = aDataInizio AND
          dt_fine = aDataFine AND
          tipo_liquidazione = inGruppoReport AND
          report_id = repID;

   UPDATE LIQUIDAZIONE_IVA
   SET    report_id = 0
   WHERE  cd_cds = aCdCdsOrigine AND
          esercizio = aEsercizio AND
          cd_unita_organizzativa = aCdUoOrigine AND
          dt_inizio = aDataInizio AND
          dt_fine = aDataFine AND
          tipo_liquidazione = inGruppoReport AND
          report_id = -9;

EXCEPTION

   WHEN DUP_VAL_ON_INDEX THEN
        IBMERR001.RAISE_ERR_GENERICO ('Chiave duplicata in inserimento liquidazione IVA definitiva');

END insRecLiquidazioneDef;

-- =================================================================================================
-- Inserimento nella tabella REPORT DETTAGLIO del dettaglio fatture con esigibilità differita che
-- sono state oggetto di liquidazione definitiva
-- =================================================================================================
PROCEDURE insDettaglioPerLiquidazione
   (
    repID INTEGER,
    aCdCdsOrigine VARCHAR2,
    aCdUoOrigine VARCHAR2,
    aEsercizio NUMBER,
    aCdTipoSezionale VARCHAR2,
    aDataInizio DATE,
    aDataFine DATE,
    aTipoRegistro VARCHAR2,
    utente VARCHAR2,
    inGruppoReport VARCHAR2
   ) IS
   descTipoReport VARCHAR2(100);
   gen_cv GenericCurTyp;

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Lettura fatture e scrittura in REPORT DETTAGLIO dell'elenco fatture ad esigibilità differita
   -- divenute esigibili ed elaborate in una liquidazione definitiva.
   -- Si prelevano tutti i record con data esigibilità IVA inferiore alla data di fine, la vista
   -- V_LIQUID_IVA_VENDITE_ESIG garantisce il processo dei soli record mai inclusi in precedenti liquidazioni

   IF aTipoRegistro = 'A' THEN
      descTipoReport:=CNRCTB255.TI_LIQUIDAZIONE_ACQ_ESIGIB;
   ELSE
      descTipoReport:=CNRCTB255.TI_LIQUIDAZIONE_VEN_ESIGIB;
   END IF;

   -- La gestione è attualmente attiva solo per registri IVA vendite

   IF aTipoRegistro = 'V' THEN

      OPEN gen_cv FOR

           SELECT DISTINCT cd_cds,
                  cd_unita_organizzativa,
                  esercizio,
                  numero_progressivo,
                  cd_cds_origine,
                  cd_uo_origine,
                  cd_tipo_sezionale,
                  ti_fattura,
                  pg_riga_documento
           FROM   V_LIQUID_IVA_VENDITE_ESIG
           WHERE  data_esigibilita IS NOT NULL AND
--                  data_esigibilita >= aDataInizio AND
                  data_esigibilita <= aDataFine AND
                  cd_cds_origine = aCdCdsOrigine AND
                  cd_uo_origine = aCdUoOrigine AND
                  cd_tipo_sezionale = aCdTipoSezionale
           ORDER BY 1,2,3;

      LOOP

         FETCH gen_cv INTO
               cv_cd_cds,
               cv_cd_uo,
               cv_esercizio,
               cv_numero_progressivo,
               cv_cd_cds_origine,
               cv_cd_uo_origine,
               cv_cd_tipo_sezionale,
               cv_ti_fattura,
               CV_riga_documento;

         EXIT WHEN gen_cv%NOTFOUND;

         BEGIN

            INSERT INTO REPORT_DETTAGLIO
                   (cd_cds,
                    cd_unita_organizzativa,
                    esercizio,
                    tipo_report,
                    data_inizio,
                    data_fine,
                    cd_tipo_sezionale,
                    ti_documento,
                    pg_documento,
                    cd_cds_altro,
                    cd_uo_altro,
                    dacr,
                    duva,
                    utuv,
                    utcr,
                    pg_ver_rec,
                    pg_riga_documento)
            VALUES (cv_cd_cds_origine,
                    cv_cd_uo_origine,
                    cv_esercizio,
                    descTipoReport,
                    aDataInizio,
                    aDataFine,
                    cv_cd_tipo_sezionale,
                    CNRCTB100.TI_FATTURA_ATTIVA,
                    cv_numero_progressivo,
                    cv_cd_cds,
                    cv_cd_uo,
                    sysdate,
                    sysdate,
                    utente,
                    utente,
                    1,
                    CV_riga_documento);

         EXCEPTION

            WHEN DUP_VAL_ON_INDEX THEN
                 IBMERR001.RAISE_ERR_GENERICO
                    ('Chiave duplicata in inserimento estremi fattura ad esigibilità differita in REPORT_DETTAGLIO '  ||
                     'FATTURA ' || cv_cd_cds || '/' || cv_cd_uo || '-' || cv_esercizio || '/' || cv_numero_progressivo);
         END;

      END LOOP;

      CLOSE gen_cv;
   Else
     OPEN gen_cv FOR

           SELECT DISTINCT cd_cds,
                  cd_unita_organizzativa,
                  esercizio,
                  numero_progressivo,
                  cd_cds_origine,
                  cd_uo_origine,
                  cd_tipo_sezionale,
                  ti_fattura,
                  pg_riga_documento
           FROM   V_LIQUID_IVA_ACQUISTI_ESIG
           WHERE  data_esigibilita IS NOT NULL AND
--                  data_esigibilita >= aDataInizio AND
                  data_esigibilita <= aDataFine AND
                  cd_cds_origine = aCdCdsOrigine AND
                  cd_uo_origine = aCdUoOrigine AND
                  cd_tipo_sezionale = aCdTipoSezionale
           ORDER BY 1,2,3;

      LOOP

         FETCH gen_cv INTO
               cv_cd_cds,
               cv_cd_uo,
               cv_esercizio,
               cv_numero_progressivo,
               cv_cd_cds_origine,
               cv_cd_uo_origine,
               cv_cd_tipo_sezionale,
               cv_ti_fattura,
               cv_riga_documento;

         EXIT WHEN gen_cv%NOTFOUND;

         BEGIN

            INSERT INTO REPORT_DETTAGLIO
                   (cd_cds,
                    cd_unita_organizzativa,
                    esercizio,
                    tipo_report,
                    data_inizio,
                    data_fine,
                    cd_tipo_sezionale,
                    ti_documento,
                    pg_documento,
                    cd_cds_altro,
                    cd_uo_altro,
                    dacr,
                    duva,
                    utuv,
                    utcr,
                    pg_ver_rec,
                    pg_riga_documento)
            VALUES (cv_cd_cds_origine,
                    cv_cd_uo_origine,
                    cv_esercizio,
                    descTipoReport,
                    aDataInizio,
                    aDataFine,
                    cv_cd_tipo_sezionale,
                    CNRCTB100.TI_FATTURA_PASSIVA,
                    cv_numero_progressivo,
                    cv_cd_cds,
                    cv_cd_uo,
                    sysdate,
                    sysdate,
                    utente,
                    utente,
                    1,
                    cv_riga_documento);

         EXCEPTION

            WHEN DUP_VAL_ON_INDEX THEN
                 IBMERR001.RAISE_ERR_GENERICO
                    ('Chiave duplicata in inserimento estremi fattura ad esigibilità differita in REPORT_DETTAGLIO '  ||
                     'FATTURA ' || cv_cd_cds || '/' || cv_cd_uo || '-' || cv_esercizio || '/' || cv_numero_progressivo);
         END;

      END LOOP;
   END IF;

END insDettaglioPerLiquidazione;

-- =================================================================================================
-- Ritorna l'esistenza o meno di una liquidazione definitiva
-- =================================================================================================
FUNCTION chkEsisteLiquidazioneDef
   (
    aCdCds VARCHAR2,
    aCdUo VARCHAR2,
    aEsercizio NUMBER,
    aDataInizio DATE,
    aDataFine DATE,
    aGruppoReport VARCHAR2
   ) RETURN VARCHAR2 IS
   flEsisteLiq NUMBER;

BEGIN

   SELECT COUNT(*) INTO flEsisteLiq
   FROM   DUAL
   WHERE  EXISTS
             (SELECT 1
              FROM   LIQUIDAZIONE_IVA A
              WHERE  A.cd_cds = aCdCds AND
                     A.cd_unita_organizzativa = aCdUo AND
                     A.esercizio = aEsercizio AND
                     A.dt_inizio = aDataInizio AND
                     A.dt_fine = aDataFine AND
                     A.tipo_liquidazione = aGruppoReport AND
                     A.report_id = 0);

   IF flEsisteLiq = 0 THEN
      RETURN 'N';
   ELSE
      RETURN 'Y';
   END IF;

END chkEsisteLiquidazioneDef;

-- ==========================================================================================================
-- Assegnazione della data di esigibilita IVA per fatture passive non divenute esigibili nell'arco di 1 Anno
-- in sede di stampa registri IVA
-- ==========================================================================================================
PROCEDURE InsDataDiffFatturePassAuto
   (
    aCdCdsOrigine VARCHAR2,
    aCdUoOrigine VARCHAR2,
    aEsercizio NUMBER,
    aCdTipoSezionale VARCHAR2,
    aDataInizio DATE,
    aDataFine DATE ) IS
   gen_cv GenericCurTyp;
BEGIN
    Open gen_cv FOR
           SELECT A.cd_cds, A.cd_unita_organizzativa, A.esercizio, A.pg_fattura_passiva
                  From   FATTURA_PASSIVA A
                  Where
                           A.cd_cds_origine = aCdCdsOrigine  AND
                           A.cd_uo_origine =  aCdUoOrigine  AND
                           A.esercizio_fattura_fornitore = aEsercizio-1   And
                           A.cd_tipo_sezionale =  aCdTipoSezionale And
                           To_Char(A.dt_fattura_fornitore,'mmyyyy')<= To_Char(aDataInizio,'mm')||To_Char(aDataInizio,'yyyy')-1 And
                           A.stato_cofi != 'A' AND
                           A.fl_liquidazione_differita='Y' And
                           A.ti_istituz_commerc ='C';

      LOOP

         FETCH gen_cv INTO
               cv_cd_cds,
               cv_cd_uo,
               cv_esercizio,
               cv_numero_progressivo;

         EXIT WHEN gen_cv%NOTFOUND;

               UPDATE FATTURA_PASSIVA_riga
               SET    data_esigibilita_iva = aDataFine
               WHERE  cd_cds = cv_cd_cds AND
                      cd_unita_organizzativa = cv_cd_uo AND
                      esercizio = cv_esercizio AND
                      pg_fattura_passiva = cv_numero_progressivo And
                      data_esigibilita_iva Is Null;

      END LOOP;

      CLOSE gen_cv;
End InsDataDiffFatturePassAuto;

END Cnrctb260; -- PACKAGE END;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy