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

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

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

  CREATE OR REPLACE PACKAGE BODY "CNRCTB900" AS

function isAnagCervello(inRepID NUMBER, inEsercizio NUMBER, inAnag NUMBER) return varchar2 is
isCerv char(1);
conta  NUMBER;
Begin
    --Leggo tutti i trattamenti presenti in ESTRAZIONE_CUD_DETT e se uno di essi ha il flag dei cervelli
    -- restituisco 'Y' (c'è anche il conguaglio)

    Select Count(1)
    Into conta
    From ESTRAZIONE_CUD_DETT A
    Where A.id_estrazione = inRepID
      And A.esercizio = inEsercizio
      And A.cd_anag = inAnag
      And A.cd_trattamento In (Select t.cd_trattamento
                               From tipo_trattamento t
                               Where To_Char(t.dt_fin_validita,'yyyy') >= inEsercizio
                                 And t.fl_agevolazioni_cervelli = 'Y');
    If conta = 0 Then
       isCerv := 'N';
    Else
       isCerv := 'Y';
    End If;
    return isCerv;
End;

function isAnagRientroLav30(inRepID NUMBER, inEsercizio NUMBER, inAnag NUMBER) return varchar2 is
isRientroLav30 char(1);
conta  NUMBER;
Begin
    --Leggo tutti i trattamenti presenti in ESTRAZIONE_CUD_DETT e se uno di essi ha il flag dei cervelli
    -- restituisco 'Y' (c'è anche il conguaglio)

    Select Count(1)
    Into conta
    From ESTRAZIONE_CUD_DETT A
    Where A.id_estrazione = inRepID
      And A.esercizio = inEsercizio
      And A.cd_anag = inAnag
      And A.cd_trattamento In (Select t.cd_trattamento
                               From tipo_trattamento t, trattamento_cori c, tipo_contributo_ritenuta cr
                               Where t.cd_trattamento = C.CD_TRATTAMENTO
                     and To_Char(t.dt_fin_validita,'yyyy') >= inEsercizio
                     and c.cd_contributo_ritenuta = cr.cd_contributo_ritenuta
                     And t.fl_agevolazioni_rientro_lav = 'Y'
                     and CR.CD_CLASSIFICAZIONE_CORI = 'FI'
                     and CR.FL_CREDITO_IRPEF = 'N'
                     and substr(calcolo_imponibile,3,2) = '70');

    If conta = 0 Then
       isRientroLav30 := 'N';
    Else
       isRientroLav30 := 'Y';
    End If;
    return isRientroLav30;
End;

function isAnagRientroLav20(inRepID NUMBER, inEsercizio NUMBER, inAnag NUMBER) return varchar2 is
isRientroLav20 char(1);
conta  NUMBER;
Begin
    --Leggo tutti i trattamenti presenti in ESTRAZIONE_CUD_DETT e se uno di essi ha il flag dei cervelli
    -- restituisco 'Y' (c'è anche il conguaglio)

    Select Count(1)
    Into conta
    From ESTRAZIONE_CUD_DETT A
    Where A.id_estrazione = inRepID
      And A.esercizio = inEsercizio
      And A.cd_anag = inAnag
      And A.cd_trattamento In (Select t.cd_trattamento
                               From tipo_trattamento t, trattamento_cori c, tipo_contributo_ritenuta cr
                               Where t.cd_trattamento = C.CD_TRATTAMENTO
                     and To_Char(t.dt_fin_validita,'yyyy') >= inEsercizio
                     and c.cd_contributo_ritenuta = cr.cd_contributo_ritenuta
                     And t.fl_agevolazioni_rientro_lav = 'Y'
                     and CR.CD_CLASSIFICAZIONE_CORI = 'FI'
                     and CR.FL_CREDITO_IRPEF = 'N'
                     and substr(calcolo_imponibile,3,2) = '80');

    If conta = 0 Then
       isRientroLav20 := 'N';
    Else
       isRientroLav20 := 'Y';
    End If;
    return isRientroLav20;
End;
-- =================================================================================================
-- Controllo congruenza parametri in input
-- =================================================================================================
PROCEDURE chkParametriInput
   (
    inEsercizio NUMBER,
    inCdAnag VARCHAR2,
    inRepID INTEGER,
    inUtente VARCHAR2
   ) IS

   numero INTEGER;

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Verifica congruenza parametri.
   --   aEsercizio, aCdAnag, repID e aUtente non possono essere nulli
   --   aCdAnag può essere nullo o valorizzato

   IF (inEsercizio IS NULL OR
       inCdAnag IS NULL OR
       inRepID IS NULL OR
       inUtente IS NULL) THEN
      IBMERR001.RAISE_ERR_GENERICO
         ('Valorizzazione parametri in input errata. ' ||
          'Un identificativo (esercizio, codice anagrafico, identificativo report, id utente) risulta non valorizzato');
   END IF;

   -------------------------------------------------------------------------------------------------
   -- Verifica esistenza codice anagrafico

   -- Non faccio nulla se è richiesta l'estrazione per tutte le anagrafiche

   IF inCdAnag = '%' THEN
      RETURN;
   END IF;

   -- Verifica esistenza del codice anagrafico

   BEGIN

      SELECT COUNT(*) INTO numero
      FROM   ANAGRAFICO
      WHERE  cd_anag = inCdAnag;

      IF numero = 0 THEN
         IBMERR001.RAISE_ERR_GENERICO
            ('Codice anagrafico ' || inCdAnag || ' inesistente');
      END IF;

   END;

END chkParametriInput;

-- =================================================================================================
-- Memorizzazione parametri di uso della procedura di stampa
-- =================================================================================================
PROCEDURE valorizzaParametri
   (
    inEsercizio NUMBER
   ) IS

   i BINARY_INTEGER;

   aRecUnitaOrganizzativa UNITA_ORGANIZZATIVA%ROWTYPE;
   aRecTerzo TERZO%ROWTYPE;
   aRecVAnagraficoTerzo V_ANAGRAFICO_TERZO%ROWTYPE;

BEGIN

   ------------------------------------------------------------------------------------------------
   -- Azzeramento tabella parametri

   parametri_tab.DELETE;

   ------------------------------------------------------------------------------------------------
   -- Lettura del codice anagrafico e terzo corrispondente al CNR

   aRecUnitaOrganizzativa:=CNRCTB020.getUoEnte(inEsercizio);
   CNRCTB080.getTerzoPerUO(aRecUnitaOrganizzativa.cd_unita_organizzativa,
                           aRecTerzo.cd_terzo);

   BEGIN

      SELECT * INTO aRecVAnagraficoTerzo
      FROM   V_ANAGRAFICO_TERZO
      WHERE  cd_terzo = aRecTerzo.cd_terzo;

   END;

   ------------------------------------------------------------------------------------------------
   -- Valorizzazione parametri

   FOR i IN 1 .. 22

   LOOP

      BEGIN

         -- Memorizzazione del nome dell'ENTE dichiarante

         IF    i = 1 THEN

               parametri_tab(i).stringa:=aRecVAnagraficoTerzo.ragione_sociale;

         -- Memorizzazione del codice fiscale dell'ENTE dichiarante

         ELSIF i = 2 THEN

               parametri_tab(i).stringa:=aRecVAnagraficoTerzo.codice_fiscale;
               IF parametri_tab(i).stringa IS NULL THEN
                  parametri_tab(i).stringa:='CF INESISTENTE';
               END IF;

         -- Memorizzazione del comune dell'ENTE dichiarante

         ELSIF i = 3 THEN

               parametri_tab(i).stringa:=aRecVAnagraficoTerzo.ds_comune_fiscale;

         -- Memorizzazione della provincia dell'ENTE dichiarante

         ELSIF i = 4 THEN

               parametri_tab(i).stringa:=aRecVAnagraficoTerzo.cd_provincia_fiscale;

         -- Memorizzazione del CAP dell'ENTE dichiarante

         ELSIF i = 5 THEN

               parametri_tab(i).stringa:=aRecVAnagraficoTerzo.cap_comune_fiscale;

         -- Memorizzazione indirizzo dell'ENTE dichiarante

         ELSIF i = 6 THEN

               IF aRecVAnagraficoTerzo.num_civico_fiscale IS NOT NULL THEN
                  parametri_tab(i).stringa:=aRecVAnagraficoTerzo.via_fiscale  || ', ' ||
                                            aRecVAnagraficoTerzo.num_civico_fiscale;
               ELSE
                  parametri_tab(i).stringa:=aRecVAnagraficoTerzo.via_fiscale;
               END IF;

        -- Memorizzazione telefono dell'ENTE dichiarante

         ELSIF i = 7 THEN

               BEGIN

                  SELECT riferimento INTO parametri_tab(i).stringa
                  FROM   TELEFONO
                  WHERE  cd_terzo = aRecTerzo.cd_terzo AND
                         ti_riferimento = 'T' AND
                         rownum = 1;

               EXCEPTION

                  WHEN no_data_found THEN
                       parametri_tab(i).stringa:=NULL;

               END;

        -- Memorizzazione fax dell'ENTE dichiarante

         ELSIF i = 8 THEN

               BEGIN

                  SELECT riferimento INTO parametri_tab(i).stringa
                  FROM   TELEFONO
                  WHERE  cd_terzo = aRecTerzo.cd_terzo AND
                         ti_riferimento = 'F' AND
                         rownum = 1;

               EXCEPTION

                  WHEN no_data_found THEN
                       parametri_tab(i).stringa:=NULL;

               END;

        -- Memorizzazione mail dell'ENTE dichiarante

         ELSIF i = 9 THEN

               BEGIN

                  SELECT riferimento INTO parametri_tab(i).stringa
                  FROM   TELEFONO
                  WHERE  cd_terzo = aRecTerzo.cd_terzo AND
                         ti_riferimento = 'E' AND
                         rownum = 1;

               EXCEPTION

                  WHEN no_data_found THEN
                       parametri_tab(i).stringa:=NULL;

               END;

        -- Memorizzazione RAPPRESENTANTE_FISCALE dell'ENTE dichiarante

         ELSIF i = 10 THEN

               IF aRecVAnagraficoTerzo.pg_rapp_legale IS NULL THEN
                  parametri_tab(i).stringa:=NULL;
               ELSE

                  BEGIN

                     SELECT LTRIM(RTRIM(cognome || ' ' || nome)) INTO parametri_tab(i).stringa
                     FROM   RAPPRESENTANTE_LEGALE
                     WHERE  pg_rapp_legale = aRecVAnagraficoTerzo.pg_rapp_legale;

                  EXCEPTION

                     WHEN no_data_found THEN
                          parametri_tab(i).stringa:=NULL;

                  END;

               END IF;

        -- Memorizzazione STATO_CONTABILE_LIQUIDAZIONE_CORI dell'Ateneo

         ELSIF i = 11 THEN

               parametri_tab(i).stringa:=CNRCTB015.getVal01PerChiave(inEsercizio,
                                                                     'GESTIONE_CORI_SPECIALE',
                                                                     'STATO_LIQUIDA_CORI');

        -- Memorizzazione dell'eventuale annotazione di default per il CUD

         ELSIF i = 12 THEN

               BEGIN

                  SELECT ds_nota INTO parametri_tab(i).stringa
                  FROM   NOTE_ANAGRAFICO
                  WHERE  esercizio = inEsercizio AND
                         cd_anag = 0 AND
                         tipo_nota = 'CUD';

               EXCEPTION

                  WHEN no_data_found THEN
                       parametri_tab(i).stringa:=NULL;

               END;

        -- Annotazione di default per CUD con uso di trattamenti con aliquota_max

         ELSIF i = 13 THEN

               parametri_tab(i).stringa:='IRPEF calcolata applicando l''aliquota marginale richiesta dal percipiente';

        -- Annotazione di default per CUD con addizionali regionali o comunali totalmente trattenute

         ELSIF i = 14 THEN

               parametri_tab(i).stringa:='Gli importi delle addizionali sono stati interamente trattenuti';

        -- Annotazione di default per CUD con addizionali regionali o comunali accantonate

         ELSIF i = 15 THEN

               parametri_tab(i).stringa:='Gli importi delle addizionali sono stati accantonati';

        -- Annotazione di default per CUD a soggetti non residenti

         ELSIF i = 16 THEN

               parametri_tab(i).stringa:='IRPEF calcolata applicando ritenuta a titolo d''imposta del 30% ' ||
                                         'prevista per i soggetti non residenti in Italia';

        -- Annotazione di default per indicare gli intervalli temporali di riferimento dei periodi compenso

         ELSIF i = 17 THEN

               parametri_tab(i).stringa:='I giorni indicati al punto 6 sono stati determinati tenendo conto ' ||
                                         'dei seguenti periodi di competenza:';

        -- Annotazione di default prima parte quota deduzione standard

         ELSIF i = 18 THEN

               parametri_tab(i).stringa:='La quota di deduzione riconosciuta su tutte le tipologie di reddito ' ||
                                         'ai sensi dell''art. 10 bis comma 1 del TUIR è pari a euro ';

        -- Annotazione di default seconda parte quota deduzione standard

         ELSIF i = 19 THEN

               parametri_tab(i).stringa:=', la quota di deduzione riconosciuta sui redditi di lavoro dipendente ' ||
                                         'o assimilati ai sensi dell''art. 10 bis comma 2 del TUIR è pari a euro ';

        -- Annotazione prima parte quota deduzione fissa intera

         ELSIF i = 20 THEN

               parametri_tab(i).stringa:='Su richiesta del sostituito la deduzione riconosciuta su tutte le ' ||
                                         'tipologie di reddito ai sensi dell''art. 10 bis comma 1 del TUIR, è ' ||
                                         'stata attribuita interamente per euro ';

        -- Annotazione seconda parte quota deduzione fissa intera

         ELSIF i = 21 THEN

               parametri_tab(i).stringa:=', la quota di deduzione riconosciuta sui redditi di lavoro dipendente ' ||
                                         'o assimilati ai sensi dell''art. 10 bis comma 2 del TUIR è pari a euro ';
        -- Annotazione seconda parte quota deduzione fissa intera

         ELSIF i = 22 THEN

               parametri_tab(i).stringa:='Le detrazioni di cui ai punti 33 e 34 sono state determinate tenendo ' ||
                                         'conto degli altri redditi comunicati dal sostituito pari a euro ';

         END IF;

      END;

   END LOOP;

END valorizzaParametri;


-- =================================================================================================
-- Estrazione dati per stampa CUD (Inserimento record in ESTRAZIONE_CUD_DETT)
-- =================================================================================================
PROCEDURE inserisciDatiCUDDett
   (
    inEsercizio NUMBER,
    aCdAnag NUMBER,
    inRepID INTEGER,
    inUtente VARCHAR2
   ) IS

   aNumero INTEGER;

   aRecEstraiImponibileCudV V_ESTRAI_IMPONIBILE_CUD%ROWTYPE;

   gen_cur GenericCurTyp;

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Ciclo principale di lettura record per inserimento in ESTRAZIONE_CUD_DETT

   BEGIN

      IF aCdAnag IS NULL THEN

         OPEN gen_cur FOR

              SELECT *
              FROM   V_ESTRAI_IMPONIBILE_CUD
              WHERE  esercizio_configurazione = inEsercizio AND
                     esercizio_pagamento = inEsercizio and
                     (fl_compenso_conguaglio = 'Y'
                     OR
                     fl_senza_calcoli = 'Y'
                     OR
                     (fl_compenso_conguaglio = 'N' AND fl_senza_calcoli = 'N' AND IM_LORDO_PERCIP_COMPENSO > 0.01)
                     )
              FOR UPDATE OF pg_compenso NOWAIT;

      ELSE

         OPEN gen_cur FOR

              SELECT *
              FROM   V_ESTRAI_IMPONIBILE_CUD
              WHERE  cd_anag = aCdAnag AND
                     esercizio_configurazione = inEsercizio AND
                     esercizio_pagamento = inEsercizio and
                     (fl_compenso_conguaglio = 'Y'
                     OR
                     fl_senza_calcoli = 'Y'
                     OR
                     (fl_compenso_conguaglio = 'N' AND fl_senza_calcoli = 'N' AND IM_LORDO_PERCIP_COMPENSO > 0.01)
                     )
              FOR UPDATE OF pg_compenso NOWAIT;

      END IF;

      LOOP

         FETCH gen_cur INTO
               aRecEstraiImponibileCudV;

         EXIT WHEN gen_cur%NOTFOUND;

         -- Inserimento record su ESTRAZIONE_CUD_DETT

         INSERT INTO ESTRAZIONE_CUD_DETT
                (id_estrazione,
                 esercizio,
                 cd_cds_compenso,
                 cd_uo_compenso,
                 esercizio_compenso,
                 pg_compenso,
                 esercizio_pagamento,
                 fl_senza_calcoli,
                 fl_compenso_conguaglio,
                 fl_incluso_in_conguaglio,
                 fl_ultimo_conguaglio,
                 dacr_conguaglio,
                 cd_cds_conguaglio,
                 cd_uo_conguaglio,
                 esercizio_conguaglio,
                 pg_conguaglio,
                 cd_trattamento,
                 fl_detrazioni,
                 fl_aliquota_max,
                 fl_tassazione_separata,
                 fl_compenso_minicarriera,
                 fl_recupero_rate,
                 fl_cococo,
                 fl_ritenuta_non_residenti,
                 cd_tipologia_reddito,
                 ds_tipologia_reddito,
                 cd_anag,
                 cd_terzo,
                 dt_cmp_da_compenso,
                 dt_cmp_a_compenso,
                 im_lordo_percip_compenso,
                 quota_esente_compenso,
                 im_no_fiscale_compenso,
                 imponibile_fisc_lordo_compenso,
                 imponibile_fisc_netto_compenso,
                 im_deduzione_compenso,
                 detraz_pe_netto_compenso,
                 detraz_la_netto_compenso,
                 detraz_co_netto_compenso,
                 detraz_fi_netto_compenso,
                 detraz_al_netto_compenso,
                 fl_escludi_qvaria_deduzione,
                 fl_intera_qfissa_deduzione,
                 imponibile_fisc_lordo_contrib,
                 imponibile_fisc_netto_contrib,
                 im_deduzione_contrib,
                 im_riduz_contrib,
                 im_previd_percip_contrib,
                 im_inail_percip_contrib,
                 im_irpef_lordo_contrib,
                 im_irpef_netto_contrib,
                 im_addreg_contrib,
                 im_addpro_contrib,
                 im_addcom_contrib,
                 primo_acconto_irpef_contrib,
                 secondo_acconto_irpef_contrib,
                 dt_cmp_da_esterno,
                 dt_cmp_a_esterno,
                 imponibile_fiscale_esterno,
                 im_irpef_esterno,
                 im_addreg_esterno,
                 im_addpro_esterno,
                 im_addcom_esterno,
                 detraz_pe_esterno,
                 detraz_la_esterno,
                 detraz_co_esterno,
                 detraz_fi_esterno,
                 detraz_al_esterno,
                 im_deduzione_dovuto_conguaglio,
                 im_deduzione_goduto_conguaglio,
                 im_ritenute_irpef_dovuto_cong,
                 im_addreg_dovuto_cong,
                 im_addpro_dovuto_cong,
                 im_addcom_dovuto_cong,
                 detraz_pe_dovuto_conguaglio,
                 detraz_la_dovuto_conguaglio,
                 detraz_co_dovuto_conguaglio,
                 detraz_fi_dovuto_conguaglio,
                 detraz_al_dovuto_conguaglio,
                 im_ritenute_irpef_goduto_cong,
                 im_addreg_goduto_cong,
                 im_addpro_goduto_cong,
                 im_addcom_goduto_cong,
                 detraz_pe_goduto_conguaglio,
                 detraz_la_goduto_conguaglio,
                 detraz_co_goduto_conguaglio,
                 detraz_fi_goduto_conguaglio,
                 detraz_al_goduto_conguaglio,
                 dacr,
                 utcr,
                 duva,
                 utuv,
                 pg_ver_rec,
                 im_previd_ente_contrib,
                 imponibile_previd_contrib,
                 im_deduzione_family,
                 im_ded_family_dovuto_cong,
                         im_ded_family_goduto_cong,
                         im_irpef_sospeso,
                         fl_compenso_missione,
                         im_redd_non_tassati_per_conv,
                         im_redd_esenti_per_legge,
                         im_bonus_erogato,
                         im_bonus_dovuto_cong,
                         im_bonus_goduto_cong,
                         cd_categoria,
                         DETRAZIONE_RID_CUNEO_NETTO,
                         im_rid_cuneo_erogato,
                         im_credito_irpef_dovuto,
                         im_credito_irpef_goduto,
                         im_detr_rid_cuneo_dovuto_cong,
                         im_detr_rid_cuneo_goduto_cong)
         VALUES (inRepID,
                 inEsercizio,
                 aRecEstraiImponibileCudV.cd_cds_compenso,
                 aRecEstraiImponibileCudV.cd_uo_compenso,
                 aRecEstraiImponibileCudV.esercizio_compenso,
                 aRecEstraiImponibileCudV.pg_compenso,
                 aRecEstraiImponibileCudV.esercizio_pagamento,
                 aRecEstraiImponibileCudV.fl_senza_calcoli,
                 aRecEstraiImponibileCudV.fl_compenso_conguaglio,
                 'N',
                 'N',
                 TO_DATE(NULL),
                 NULL,
                 NULL,
                 TO_NUMBER(NULL),
                 TO_NUMBER(NULL),
                 aRecEstraiImponibileCudV.cd_trattamento,
                 aRecEstraiImponibileCudV.fl_detrazioni,
                 'N',
                 aRecEstraiImponibileCudV.fl_tassazione_separata,
                 aRecEstraiImponibileCudV.fl_compenso_minicarriera,
                 aRecEstraiImponibileCudV.fl_recupero_rate,
                 aRecEstraiImponibileCudV.fl_cococo,
                 'N',
                 aRecEstraiImponibileCudV.cd_tipologia_reddito,
                 aRecEstraiImponibileCudV.ds_tipologia_reddito,
                 aRecEstraiImponibileCudV.cd_anag,
                 aRecEstraiImponibileCudV.cd_terzo,
                 aRecEstraiImponibileCudV.dt_cmp_da_compenso,
                 aRecEstraiImponibileCudV.dt_cmp_a_compenso,
                 aRecEstraiImponibileCudV.im_lordo_percip_compenso,
                 aRecEstraiImponibileCudV.quota_esente_compenso,
                 aRecEstraiImponibileCudV.im_no_fiscale_compenso,
                 aRecEstraiImponibileCudV.imponibile_fisc_lordo_compenso,
                 aRecEstraiImponibileCudV.imponibile_fisc_netto_compenso,
                 aRecEstraiImponibileCudV.im_deduzione_compenso,
                 aRecEstraiImponibileCudV.detraz_pe_netto_compenso,
                 aRecEstraiImponibileCudV.detraz_la_netto_compenso,
                 aRecEstraiImponibileCudV.detraz_co_netto_compenso,
                 aRecEstraiImponibileCudV.detraz_fi_netto_compenso,
                 aRecEstraiImponibileCudV.detraz_al_netto_compenso,
                 aRecEstraiImponibileCudV.fl_escludi_qvaria_deduzione,
                 aRecEstraiImponibileCudV.fl_intera_qfissa_deduzione,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 TO_DATE(NULL),
                 TO_DATE(NULL),
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 0,
                 dataOdierna,
                 inUtente,
                 dataOdierna,
                 inUtente,
                 1,
                 0,
                 0,
                 0,          --verrà valorizzato da CONTRIBUTO_RITENUTA
                 0,          --verrà valorizzato da CONGUAGLIO
                 0,          --verrà valorizzato da CONGUAGLIO
                 0,      --verrà valorizzato da CONTRIBUTO_RITENUTA o da CONGUAGLIO
                 aRecEstraiImponibileCudV.fl_compenso_missione,
                         aRecEstraiImponibileCudV.im_redd_non_tassati_per_conv,
                         aRecEstraiImponibileCudV.im_redd_esenti_per_legge,
                         0,
                         0,
                         0,
                         aRecEstraiImponibileCudV.cd_categoria,
                         aRecEstraiImponibileCudV.DETRAZIONE_RID_CUNEO_NETTO,
                 0,
                 0,
                 0,
                 0,
                 0);
      END LOOP;

      CLOSE gen_cur;

   END;


END inserisciDatiCUDDett;

-- =================================================================================================
-- Estrazione dati per stampa CUD (Aggiornamento record in ESTRAZIONE_CUD_DETT da CONTRIBUTO_RITENUTA)
-- =================================================================================================
PROCEDURE upgDatiCUDDettCori
   (
    inEsercizio NUMBER,
    inRepID INTEGER
   ) IS

   aRecEstrazioneCudDett ESTRAZIONE_CUD_DETT%ROWTYPE;
   aRecContributoRitenuta CONTRIBUTO_RITENUTA%ROWTYPE;
   aRecTipoContributoRitenuta TIPO_CONTRIBUTO_RITENUTA%ROWTYPE;

   gen_cur GenericCurTyp;

   DATA_INIZIO_RID_CUNEO DATE;

BEGIN

   DATA_INIZIO_RID_CUNEO := CNRCTB015.getDt01PerChiave('0', 'RIDUZIONE_CUNEO_DL_3_2020', 'DATA_INIZIO');


   -------------------------------------------------------------------------------------------------
   -- Recupero delle informazioni relativi agli importi a carico percipiente (INPS, INAIL, RIDUZ e IRPEF)
   -- a carico percepiente

   BEGIN

      OPEN gen_cur FOR

           SELECT A.cd_cds_compenso,
                  A.cd_uo_compenso,
                  A.esercizio_compenso,
                  A.pg_compenso,
                  A.cd_trattamento,
                  B.cd_contributo_ritenuta,
                  B.ti_ente_percipiente,
                  B.imponibile_lordo,
                  B.imponibile,
                  B.im_deduzione_irpef,
                  B.im_deduzione_family,
                  B.ammontare_lordo,
                  B.ammontare,
                  B.im_cori_sospeso,
                  C.fl_assistenza_fiscale,
                  C.cd_classificazione_cori,
                  C.pg_classificazione_montanti,
                  C.fl_scrivi_montanti,
                  C.fl_credito_irpef,
                  a.dt_cmp_da_compenso,
                  a.dt_cmp_a_compenso,
                  c.dt_ini_validita
           FROM   ESTRAZIONE_CUD_DETT A,
                  CONTRIBUTO_RITENUTA B,
                  TIPO_CONTRIBUTO_RITENUTA C
           WHERE  A.id_estrazione = inRepID AND
                  A.esercizio = inEsercizio AND
                  B.cd_cds = A.cd_cds_compenso AND
                  B.cd_unita_organizzativa = A.cd_uo_compenso AND
                  B.esercizio = A.esercizio_compenso AND
                  B.pg_compenso = A.pg_compenso AND
                  C.cd_contributo_ritenuta = B.cd_contributo_ritenuta AND
                  C.dt_ini_validita = B.dt_ini_validita;

      LOOP

         FETCH gen_cur INTO
               aRecEstrazioneCudDett.cd_cds_compenso,
               aRecEstrazioneCudDett.cd_uo_compenso,
               aRecEstrazioneCudDett.esercizio_compenso,
               aRecEstrazioneCudDett.pg_compenso,
               aRecEstrazioneCudDett.cd_trattamento,
               aRecContributoRitenuta.cd_contributo_ritenuta,
               aRecContributoRitenuta.ti_ente_percipiente,
               aRecContributoRitenuta.imponibile_lordo,
               aRecContributoRitenuta.imponibile,
               aRecContributoRitenuta.im_deduzione_irpef,
               aRecContributoRitenuta.im_deduzione_family,
               aRecContributoRitenuta.ammontare_lordo,
               aRecContributoRitenuta.ammontare,
               aRecContributoRitenuta.im_cori_sospeso,
               aRecTipoContributoRitenuta.fl_assistenza_fiscale,
               aRecTipoContributoRitenuta.cd_classificazione_cori,
               aRecTipoContributoRitenuta.pg_classificazione_montanti,
               aRecTipoContributoRitenuta.fl_scrivi_montanti,
               aRecTipoContributoRitenuta.fl_credito_irpef,
               aRecEstrazioneCudDett.dt_cmp_da_compenso,
               aRecEstrazioneCudDett.dt_cmp_a_compenso,
               aRecTipoContributoRitenuta.dt_ini_validita;

         EXIT WHEN gen_cur%NOTFOUND;

         aRecEstrazioneCudDett.imponibile_fisc_lordo_contrib:=0;
         aRecEstrazioneCudDett.imponibile_fisc_netto_contrib:=0;
         aRecEstrazioneCudDett.im_deduzione_contrib:=0;
         aRecEstrazioneCudDett.im_deduzione_family:=0;
         aRecEstrazioneCudDett.im_riduz_contrib:=0;
         aRecEstrazioneCudDett.im_previd_percip_contrib:=0;
         aRecEstrazioneCudDett.im_previd_ente_contrib:=0;
         aRecEstrazioneCudDett.im_inail_percip_contrib:=0;
         aRecEstrazioneCudDett.im_irpef_lordo_contrib:=0;
         aRecEstrazioneCudDett.im_irpef_netto_contrib:=0;
         aRecEstrazioneCudDett.im_irpef_sospeso:=0;
         aRecEstrazioneCudDett.im_addreg_contrib:=0;
         aRecEstrazioneCudDett.im_addpro_contrib:=0;
         aRecEstrazioneCudDett.im_addcom_contrib:=0;
         aRecEstrazioneCudDett.primo_acconto_irpef_contrib:=0;
         aRecEstrazioneCudDett.secondo_acconto_irpef_contrib:=0;
         aRecEstrazioneCudDett.imponibile_previd_contrib:=0;
         aRecEstrazioneCudDett.fl_ritenuta_non_residenti:='N';
         aRecEstrazioneCudDett.im_bonus_erogato:=0;
         aRecEstrazioneCudDett.im_rid_cuneo_erogato:=0;

         -- Normalizzazione importi ----------------------------------------------------------------

         -- Parte percipiente

         IF aRecContributoRitenuta.ti_ente_percipiente = 'P' THEN

            -- Riduzione erariale, acconti assistenza fiscale e irpef con dettaglio per stranieri
--pipe.send_message('aRecTipoContributoRitenuta.cd_classificazione_cori = '||aRecTipoContributoRitenuta.cd_classificazione_cori);
--pipe.send_message('aRecTipoContributoRitenuta.fl_credito_irpef = '||aRecTipoContributoRitenuta.fl_credito_irpef);
            IF    aRecTipoContributoRitenuta.cd_classificazione_cori = CNRCTB545.isCoriFiscale THEN
                  IF (aRecTipoContributoRitenuta.pg_classificazione_montanti IS NOT NULL AND
                      aRecTipoContributoRitenuta.pg_classificazione_montanti = 5) THEN
                     aRecEstrazioneCudDett.im_riduz_contrib:=aRecContributoRitenuta.ammontare_lordo;
                  ELSIF aRecTipoContributoRitenuta.fl_credito_irpef = 'Y' then
                    if DATA_INIZIO_RID_CUNEO > aRecTipoContributoRitenuta.dt_ini_validita then
                     aRecEstrazioneCudDett.im_bonus_erogato:=-aRecContributoRitenuta.ammontare_lordo;
                    else
                     aRecEstrazioneCudDett.im_rid_cuneo_erogato:=-aRecContributoRitenuta.ammontare_lordo;
                    end if;
--pipe.send_message('aRecEstrazioneCudDett.im_bonus_erogato = '||aRecEstrazioneCudDett.im_bonus_erogato);
                  ELSE
                             aRecEstrazioneCudDett.im_deduzione_family:=aRecContributoRitenuta.im_deduzione_family;
                     IF aRecTipoContributoRitenuta.fl_assistenza_fiscale = 'Y' Then
                        --QUESTI CAMPI VALORIZZATI NON VENGONO PIù UTILIZZATI, IN OGNI CASO I CORI PER L'ASSISTENZA
                        --FISCALE VANNO ESCLUSI PER IL CALCOLO DELL'AMMONTARE
                        IF    (aRecContributoRitenuta.cd_contributo_ritenuta = 'IRPEF730I' OR
                               aRecContributoRitenuta.cd_contributo_ritenuta = 'IRPEF730IC') THEN
                              aRecEstrazioneCudDett.primo_acconto_irpef_contrib:=aRecContributoRitenuta.ammontare_lordo;
                        ELSIF (aRecContributoRitenuta.cd_contributo_ritenuta = 'IRPEF730II' OR
                               aRecContributoRitenuta.cd_contributo_ritenuta = 'IRP730ICO') THEN
                              aRecEstrazioneCudDett.secondo_acconto_irpef_contrib:=aRecContributoRitenuta.ammontare_lordo;
                        END IF;
                     ELSE
                        --IF  aRecContributoRitenuta.cd_contributo_ritenuta = 'IRPEFSTRA' Then

                        --I CORI FISCALI NON A SCAGLIONI DOVREBBERO ESSERE SOLO QUELLI DEI NON RESIDENTI
                        --CI SONO ANCHE NON RESIDENTI CHE HANNO L'IRPEF A SCAGLIONI (BORS,ASS), MA QUESTI NON MI
                        --INTERESSA ETICHETTARLI COME NON RESIDENTI
                        If CNRCTB545.getIsIrpefScaglioni(aRecTipoContributoRitenuta.cd_classificazione_cori,
                                                         aRecTipoContributoRitenuta.pg_classificazione_montanti,
                                                         aRecTipoContributoRitenuta.fl_scrivi_montanti) = 'N' Then
                            aRecEstrazioneCudDett.fl_ritenuta_non_residenti:='Y';
                        END IF;
                        aRecEstrazioneCudDett.imponibile_fisc_lordo_contrib:=aRecContributoRitenuta.imponibile_lordo;
                        aRecEstrazioneCudDett.imponibile_fisc_netto_contrib:=aRecContributoRitenuta.imponibile;
                        aRecEstrazioneCudDett.im_deduzione_contrib:=aRecContributoRitenuta.im_deduzione_irpef;
                        aRecEstrazioneCudDett.im_irpef_lordo_contrib:=aRecContributoRitenuta.ammontare_lordo;
                        aRecEstrazioneCudDett.im_irpef_netto_contrib:=aRecContributoRitenuta.ammontare;
                        aRecEstrazioneCudDett.im_irpef_sospeso:=aRecContributoRitenuta.im_cori_sospeso;
                     END IF;
                  END IF;

            -- Previdenziale

            ELSIF aRecTipoContributoRitenuta.cd_classificazione_cori = CNRCTB545.isCoriPrevid THEN
                  aRecEstrazioneCudDett.im_previd_percip_contrib:=aRecContributoRitenuta.ammontare_lordo;
                  -- Se è stato superato lo scaglione (cioè esiste il record in contributo_ritenuta_det),
                  -- l'imponibile previdenziale deve essere preso da li, perchè su contributo_ritenuta c'è
                  -- l'intero importo e non solo quello realmente imponibile
                  Select Nvl(Sum(imponibile),0)
                  Into aRecEstrazioneCudDett.imponibile_previd_contrib
                  From contributo_ritenuta_det
                  Where cd_cds = aRecEstrazioneCudDett.cd_cds_compenso
                    And cd_unita_organizzativa = aRecEstrazioneCudDett.cd_uo_compenso
                    And esercizio = aRecEstrazioneCudDett.esercizio_compenso
                    And pg_compenso = aRecEstrazioneCudDett.pg_compenso
                    And cd_contributo_ritenuta = aRecContributoRitenuta.cd_contributo_ritenuta
                    And ti_ente_percipiente = aRecContributoRitenuta.ti_ente_percipiente;

                  If aRecEstrazioneCudDett.imponibile_previd_contrib = 0 Then
                     aRecEstrazioneCudDett.imponibile_previd_contrib:=aRecContributoRitenuta.imponibile;
                  End If;
            -- Inail

            ELSIF aRecTipoContributoRitenuta.cd_classificazione_cori = CNRCTB545.isCoriInail THEN
                  aRecEstrazioneCudDett.im_inail_percip_contrib:=aRecContributoRitenuta.ammontare_lordo;

            -- Addizionale Regionale

            ELSIF aRecTipoContributoRitenuta.cd_classificazione_cori = CNRCTB545.isCoriAddReg THEN
                  aRecEstrazioneCudDett.im_addreg_contrib:=aRecContributoRitenuta.ammontare_lordo;

            -- Addizionale Provinciale

            ELSIF aRecTipoContributoRitenuta.cd_classificazione_cori = CNRCTB545.isCoriAddPro THEN
                  aRecEstrazioneCudDett.im_addpro_contrib:=aRecContributoRitenuta.ammontare_lordo;

            -- Addizionale Comunale

            ELSIF aRecTipoContributoRitenuta.cd_classificazione_cori = CNRCTB545.isCoriAddCom THEN
                  aRecEstrazioneCudDett.im_addcom_contrib:=aRecContributoRitenuta.ammontare_lordo;

            END IF;

         -- Parte ente

         ELSE

            -- Previdenziale

            IF aRecTipoContributoRitenuta.cd_classificazione_cori = CNRCTB545.isCoriPrevid THEN
               aRecEstrazioneCudDett.im_previd_ente_contrib:=aRecContributoRitenuta.ammontare_lordo;
            END IF;

         END IF;

         -- Aggiornamento ESTRAZIONE_CUD_DETT ------------------------------------------------------

         BEGIN

            IF aRecEstrazioneCudDett.fl_ritenuta_non_residenti ='Y' THEN

               UPDATE ESTRAZIONE_CUD_DETT
               SET    fl_ritenuta_non_residenti = aRecEstrazioneCudDett.fl_ritenuta_non_residenti,
                      imponibile_fisc_lordo_contrib = imponibile_fisc_lordo_contrib +
                                                      aRecEstrazioneCudDett.imponibile_fisc_lordo_contrib,
                      imponibile_fisc_netto_contrib = imponibile_fisc_netto_contrib +
                                                      aRecEstrazioneCudDett.imponibile_fisc_netto_contrib,
                      im_deduzione_contrib = im_deduzione_contrib + aRecEstrazioneCudDett.im_deduzione_contrib,
                      im_deduzione_family = im_deduzione_family + aRecEstrazioneCudDett.im_deduzione_family,
                      im_riduz_contrib = im_riduz_contrib + aRecEstrazioneCudDett.im_riduz_contrib,
                      im_previd_percip_contrib = im_previd_percip_contrib +
                                                 aRecEstrazioneCudDett.im_previd_percip_contrib,
                      im_previd_ente_contrib = im_previd_ente_contrib +
                                               aRecEstrazioneCudDett.im_previd_ente_contrib,
                      im_inail_percip_contrib = im_inail_percip_contrib + aRecEstrazioneCudDett.im_inail_percip_contrib,
                      im_irpef_lordo_contrib = im_irpef_lordo_contrib + aRecEstrazioneCudDett.im_irpef_lordo_contrib,
                      im_irpef_netto_contrib = im_irpef_netto_contrib + aRecEstrazioneCudDett.im_irpef_netto_contrib,
                      im_irpef_sospeso = im_irpef_sospeso + aRecEstrazioneCudDett.im_irpef_sospeso,
                      im_addreg_contrib = im_addreg_contrib + aRecEstrazioneCudDett.im_addreg_contrib,
                      im_addpro_contrib = im_addpro_contrib + aRecEstrazioneCudDett.im_addpro_contrib,
                      im_addcom_contrib = im_addcom_contrib + aRecEstrazioneCudDett.im_addcom_contrib,
                      primo_acconto_irpef_contrib = primo_acconto_irpef_contrib +
                                                    aRecEstrazioneCudDett.primo_acconto_irpef_contrib,
                      secondo_acconto_irpef_contrib = secondo_acconto_irpef_contrib +
                                                      aRecEstrazioneCudDett.secondo_acconto_irpef_contrib,
                      imponibile_previd_contrib = imponibile_previd_contrib +
                                                  aRecEstrazioneCudDett.imponibile_previd_contrib,
                      im_bonus_erogato = im_bonus_erogato + aRecEstrazioneCudDett.im_bonus_erogato,
                      im_rid_cuneo_erogato = im_rid_cuneo_erogato + aRecEstrazioneCudDett.im_rid_cuneo_erogato
               WHERE  id_estrazione = inRepID AND
                      esercizio = inEsercizio AND
                      cd_cds_compenso = aRecEstrazioneCudDett.cd_cds_compenso AND
                      cd_uo_compenso = aRecEstrazioneCudDett.cd_uo_compenso AND
                      esercizio_compenso = aRecEstrazioneCudDett.esercizio_compenso AND
                      pg_compenso = aRecEstrazioneCudDett.pg_compenso;

            ELSE

               UPDATE ESTRAZIONE_CUD_DETT
               SET    imponibile_fisc_lordo_contrib = imponibile_fisc_lordo_contrib +
                                                      aRecEstrazioneCudDett.imponibile_fisc_lordo_contrib,
                      imponibile_fisc_netto_contrib = imponibile_fisc_netto_contrib +
                                                      aRecEstrazioneCudDett.imponibile_fisc_netto_contrib,
                      im_deduzione_contrib = im_deduzione_contrib + aRecEstrazioneCudDett.im_deduzione_contrib,
                      im_deduzione_family = im_deduzione_family + aRecEstrazioneCudDett.im_deduzione_family,
                      im_riduz_contrib = im_riduz_contrib + aRecEstrazioneCudDett.im_riduz_contrib,
                      im_previd_percip_contrib = im_previd_percip_contrib +
                                                 aRecEstrazioneCudDett.im_previd_percip_contrib,
                      im_previd_ente_contrib = im_previd_ente_contrib +
                                               aRecEstrazioneCudDett.im_previd_ente_contrib,
                      im_inail_percip_contrib = im_inail_percip_contrib + aRecEstrazioneCudDett.im_inail_percip_contrib,
                      im_irpef_lordo_contrib = im_irpef_lordo_contrib + aRecEstrazioneCudDett.im_irpef_lordo_contrib,
                      im_irpef_netto_contrib = im_irpef_netto_contrib + aRecEstrazioneCudDett.im_irpef_netto_contrib,
                      im_irpef_sospeso = im_irpef_sospeso + aRecEstrazioneCudDett.im_irpef_sospeso,
                      im_addreg_contrib = im_addreg_contrib + aRecEstrazioneCudDett.im_addreg_contrib,
                      im_addpro_contrib = im_addpro_contrib + aRecEstrazioneCudDett.im_addpro_contrib,
                      im_addcom_contrib = im_addcom_contrib + aRecEstrazioneCudDett.im_addcom_contrib,
                      primo_acconto_irpef_contrib = primo_acconto_irpef_contrib +
                                                    aRecEstrazioneCudDett.primo_acconto_irpef_contrib,
                      secondo_acconto_irpef_contrib = secondo_acconto_irpef_contrib +
                                                      aRecEstrazioneCudDett.secondo_acconto_irpef_contrib,
                      imponibile_previd_contrib = imponibile_previd_contrib +
                                                  aRecEstrazioneCudDett.imponibile_previd_contrib,
                      im_bonus_erogato = im_bonus_erogato + aRecEstrazioneCudDett.im_bonus_erogato,
                      im_rid_cuneo_erogato = im_rid_cuneo_erogato + aRecEstrazioneCudDett.im_rid_cuneo_erogato
               WHERE  id_estrazione = inRepID AND
                      esercizio = inEsercizio AND
                      cd_cds_compenso = aRecEstrazioneCudDett.cd_cds_compenso AND
                      cd_uo_compenso = aRecEstrazioneCudDett.cd_uo_compenso AND
                      esercizio_compenso = aRecEstrazioneCudDett.esercizio_compenso AND
                      pg_compenso = aRecEstrazioneCudDett.pg_compenso;
            END IF;

         END;

      END LOOP;

      CLOSE gen_cur;

   END;

END upgDatiCUDDettCori;

-- =================================================================================================
-- Estrazione dati per stampa CUD (Aggiornamento record in ESTRAZIONE_CUD_DETT da CONTRIBUTO_RITENUTA)
-- =================================================================================================
PROCEDURE upgDatiCUDDettCong
   (
    inEsercizio NUMBER,
    inRepID INTEGER
   ) IS

   aRecEstrazioneCudDett ESTRAZIONE_CUD_DETT%ROWTYPE;
   aRecConguaglio CONGUAGLIO%ROWTYPE;

   aRecContributoRitenuta CONTRIBUTO_RITENUTA%ROWTYPE;
   aRecAssCompensoConguaglio ASS_COMPENSO_CONGUAGLIO%ROWTYPE;

   gen_cur GenericCurTyp;

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Recupero delle informazioni relativi ai conguagli. Evidenzio i compensi che sono anche conguagli
   -- riportando le informazioni prese dai conguagli stessi

   BEGIN

      OPEN gen_cur FOR

           SELECT A.cd_cds_compenso,
                  A.cd_uo_compenso,
                  A.esercizio_compenso,
                  A.pg_compenso,
                  B.cd_cds,
                  B.cd_unita_organizzativa,
                  B.esercizio,
                  B.pg_conguaglio,
                  B.dacr,
                  B.dt_da_competenza_esterno,
                  B.dt_a_competenza_esterno,
                  B.imponibile_fiscale_esterno,
                  B.im_irpef_esterno,
                  B.im_addreg_esterno,
                  B.im_addprov_esterno,
                  B.im_addcom_esterno,
                  B.detrazioni_la_esterno,
                  B.detrazioni_pe_esterno,
                  B.detrazioni_co_esterno,
                  B.detrazioni_fi_esterno,
                  B.detrazioni_al_esterno,
                  B.im_deduzione_dovuto,
                  B.im_deduzione_goduto,
                  B.im_irpef_dovuto,
                  B.im_addreg_dovuto,
                  B.im_addprov_dovuto,
                  B.im_addcom_dovuto,
                  B.detrazioni_la_dovuto,
                  B.detrazioni_pe_dovuto,
                  B.detrazioni_co_dovuto,
                  B.detrazioni_fi_dovuto,
                  B.detrazioni_al_dovuto,
                  B.im_irpef_goduto,
                  B.im_addreg_goduto,
                  B.im_addprov_goduto,
                  B.im_addcom_goduto,
                  B.detrazioni_la_goduto,
                  B.detrazioni_pe_goduto,
                  B.detrazioni_co_goduto,
                  B.detrazioni_fi_goduto,
                  B.detrazioni_al_goduto,
                  B.im_deduzione_family_dovuto,
                  B.im_deduzione_family_goduto,
                  B.detrazione_rid_cuneo_dovuto,
                  B.detrazione_rid_cuneo_goduto,
                  B.im_bonus_irpef_dovuto,
                  B.im_bonus_irpef_goduto,
                  B.im_credito_irpef_dovuto,
                  B.im_credito_irpef_goduto
           FROM   ESTRAZIONE_CUD_DETT A, CONGUAGLIO B
           WHERE  A.id_estrazione = inRepID AND
                  A.esercizio = inEsercizio AND
                  A.fl_compenso_conguaglio = 'Y' AND
                  B.cd_cds_compenso = A.cd_cds_compenso AND
                  B.cd_uo_compenso = A.cd_uo_compenso AND
                  B.esercizio_compenso = A.esercizio_compenso AND
                  B.pg_compenso = A.pg_compenso;

      LOOP

         FETCH gen_cur INTO
               aRecEstrazioneCudDett.cd_cds_compenso,
               aRecEstrazioneCudDett.cd_uo_compenso,
               aRecEstrazioneCudDett.esercizio_compenso,
               aRecEstrazioneCudDett.pg_compenso,
               aRecConguaglio.cd_cds,
               aRecConguaglio.cd_unita_organizzativa,
               aRecConguaglio.esercizio,
               aRecConguaglio.pg_conguaglio,
               aRecConguaglio.dacr,
               aRecConguaglio.dt_da_competenza_esterno,
               aRecConguaglio.dt_a_competenza_esterno,
               aRecConguaglio.imponibile_fiscale_esterno,
               aRecConguaglio.im_irpef_esterno,
               aRecConguaglio.im_addreg_esterno,
               aRecConguaglio.im_addprov_esterno,
               aRecConguaglio.im_addcom_esterno,
               aRecConguaglio.detrazioni_la_esterno,
               aRecConguaglio.detrazioni_pe_esterno,
               aRecConguaglio.detrazioni_co_esterno,
               aRecConguaglio.detrazioni_fi_esterno,
               aRecConguaglio.detrazioni_al_esterno,
               aRecConguaglio.im_deduzione_dovuto,
               aRecConguaglio.im_deduzione_goduto,
               aRecConguaglio.im_irpef_dovuto,
               aRecConguaglio.im_addreg_dovuto,
               aRecConguaglio.im_addprov_dovuto,
               aRecConguaglio.im_addcom_dovuto,
               aRecConguaglio.detrazioni_la_dovuto,
               aRecConguaglio.detrazioni_pe_dovuto,
               aRecConguaglio.detrazioni_co_dovuto,
               aRecConguaglio.detrazioni_fi_dovuto,
               aRecConguaglio.detrazioni_al_dovuto,
               aRecConguaglio.im_irpef_goduto,
               aRecConguaglio.im_addreg_goduto,
               aRecConguaglio.im_addprov_goduto,
               aRecConguaglio.im_addcom_goduto,
               aRecConguaglio.detrazioni_la_goduto,
               aRecConguaglio.detrazioni_pe_goduto,
               aRecConguaglio.detrazioni_co_goduto,
               aRecConguaglio.detrazioni_fi_goduto,
               aRecConguaglio.detrazioni_al_goduto,
               aRecConguaglio.im_deduzione_family_dovuto,
               aRecConguaglio.im_deduzione_family_goduto,
               aRecConguaglio.detrazione_rid_cuneo_dovuto,
               aRecConguaglio.detrazione_rid_cuneo_goduto,
               aRecConguaglio.im_bonus_irpef_dovuto,
               aRecConguaglio.im_bonus_irpef_goduto,
               aRecConguaglio.im_credito_irpef_dovuto,
               aRecConguaglio.im_credito_irpef_goduto;
         EXIT WHEN gen_cur%NOTFOUND;

         BEGIN

            UPDATE ESTRAZIONE_CUD_DETT
            SET    fl_incluso_in_conguaglio = 'Y',
                   dacr_conguaglio = aRecConguaglio.dacr,
                   cd_cds_conguaglio = aRecConguaglio.cd_cds,
                   cd_uo_conguaglio = aRecConguaglio.cd_unita_organizzativa,
                   esercizio_conguaglio = aRecConguaglio.esercizio,
                   pg_conguaglio = aRecConguaglio.pg_conguaglio,
                   dt_cmp_da_esterno = aRecConguaglio.dt_da_competenza_esterno,
                   dt_cmp_a_esterno = aRecConguaglio.dt_a_competenza_esterno,
                   imponibile_fiscale_esterno = aRecConguaglio.imponibile_fiscale_esterno,
                   im_irpef_esterno = aRecConguaglio.im_irpef_esterno,
                   im_addreg_esterno = aRecConguaglio.im_addreg_esterno,
                   im_addpro_esterno = aRecConguaglio.im_addprov_esterno,
                   im_addcom_esterno = aRecConguaglio.im_addcom_esterno,
                   detraz_pe_esterno = aRecConguaglio.detrazioni_pe_esterno,
                   detraz_la_esterno = aRecConguaglio.detrazioni_la_esterno,
                   detraz_co_esterno = aRecConguaglio.detrazioni_co_esterno,
                   detraz_fi_esterno = aRecConguaglio.detrazioni_fi_esterno,
                   detraz_al_esterno = aRecConguaglio.detrazioni_al_esterno,
                   im_deduzione_dovuto_conguaglio = aRecConguaglio.im_deduzione_dovuto,
                   im_deduzione_goduto_conguaglio = aRecConguaglio.im_deduzione_goduto,
                   im_ritenute_irpef_dovuto_cong = aRecConguaglio.im_irpef_dovuto,
                   im_addreg_dovuto_cong = aRecConguaglio.im_addreg_dovuto,
                   im_addpro_dovuto_cong = aRecConguaglio.im_addprov_dovuto,
                   im_addcom_dovuto_cong = aRecConguaglio.im_addcom_dovuto,
                   detraz_pe_dovuto_conguaglio = aRecConguaglio.detrazioni_pe_dovuto,
                   detraz_la_dovuto_conguaglio = aRecConguaglio.detrazioni_la_dovuto,
                   detraz_co_dovuto_conguaglio = aRecConguaglio.detrazioni_co_dovuto,
                   detraz_fi_dovuto_conguaglio = aRecConguaglio.detrazioni_fi_dovuto,
                   detraz_al_dovuto_conguaglio = aRecConguaglio.detrazioni_al_dovuto,
                   im_ritenute_irpef_goduto_cong = aRecConguaglio.im_irpef_goduto,
                   im_addreg_goduto_cong = aRecConguaglio.im_addreg_goduto,
                   im_addpro_goduto_cong = aRecConguaglio.im_addprov_goduto,
                   im_addcom_goduto_cong = aRecConguaglio.im_addcom_goduto,
                   detraz_pe_goduto_conguaglio = aRecConguaglio.detrazioni_pe_goduto,
                   detraz_la_goduto_conguaglio = aRecConguaglio.detrazioni_la_goduto,
                   detraz_co_goduto_conguaglio = aRecConguaglio.detrazioni_co_goduto,
                   detraz_fi_goduto_conguaglio = aRecConguaglio.detrazioni_fi_goduto,
                   detraz_al_goduto_conguaglio = aRecConguaglio.detrazioni_al_goduto,
                   im_ded_family_dovuto_cong = aRecConguaglio.im_deduzione_family_dovuto,
                       im_ded_family_goduto_cong = aRecConguaglio.im_deduzione_family_goduto,
                       im_bonus_dovuto_cong = aRecConguaglio.im_bonus_irpef_dovuto,
                       im_bonus_goduto_cong = aRecConguaglio.im_bonus_irpef_goduto,
                       im_credito_irpef_dovuto = aRecConguaglio.im_credito_irpef_dovuto,
                       im_credito_irpef_goduto = aRecConguaglio.im_credito_irpef_goduto,
                       im_detr_rid_cuneo_dovuto_cong = aRecConguaglio.detrazione_rid_cuneo_dovuto,
                       im_detr_rid_cuneo_goduto_cong = aRecConguaglio.detrazione_rid_cuneo_goduto
            WHERE  id_estrazione = inRepID AND
                   esercizio = inEsercizio AND
                   cd_cds_compenso = aRecEstrazioneCudDett.cd_cds_compenso AND
                   cd_uo_compenso = aRecEstrazioneCudDett.cd_uo_compenso AND
                   esercizio_compenso = aRecEstrazioneCudDett.esercizio_compenso AND
                   pg_compenso = aRecEstrazioneCudDett.pg_compenso;

         END;

      END LOOP;

      CLOSE gen_cur;

   END;

   -------------------------------------------------------------------------------------------------
   -- Recupero delle informazioni relativi ai conguagli. Evidenzio i compensi che sono stati compresi
   -- in un conguaglio siano essi compensi-congualio o no

   BEGIN

      OPEN gen_cur FOR

           SELECT A.cd_cds_compenso,
                  A.cd_uo_compenso,
                  A.esercizio_compenso,
                  A.pg_compenso,
                  B.cd_cds_conguaglio,
                  B.cd_uo_conguaglio,
                  B.esercizio_conguaglio,
                  B.pg_conguaglio
           FROM   ESTRAZIONE_CUD_DETT A, ASS_COMPENSO_CONGUAGLIO B
           WHERE  A.id_estrazione = inRepID AND
                  A.esercizio = inEsercizio AND
                  A.fl_compenso_conguaglio != 'Y' AND
                  B.cd_cds_compenso = A.cd_cds_compenso AND
                  B.cd_uo_compenso = A.cd_uo_compenso AND
                  B.esercizio_compenso = A.esercizio_compenso AND
                  B.pg_compenso = A.pg_compenso AND
                  EXISTS
                     (SELECT 1
                      FROM   CONGUAGLIO C, ESTRAZIONE_CUD_DETT D
                      WHERE  C.cd_cds = B.cd_cds_conguaglio AND
                             C.cd_unita_organizzativa = B.cd_uo_conguaglio AND
                             C.esercizio = B.esercizio_conguaglio AND
                             C.pg_conguaglio = B.pg_conguaglio AND
                             D.id_estrazione = inRepID AND
                             D.esercizio = inEsercizio AND
                             D.fl_compenso_conguaglio = 'Y' AND
                             D.cd_cds_compenso = C.cd_cds_compenso AND
                             D.cd_uo_compenso = C.cd_uo_compenso AND
                             D.esercizio_compenso = C.esercizio_compenso AND
                             D.pg_compenso = C.pg_compenso);


      LOOP

         FETCH gen_cur INTO
               aRecEstrazioneCudDett.cd_cds_compenso,
               aRecEstrazioneCudDett.cd_uo_compenso,
               aRecEstrazioneCudDett.esercizio_compenso,
               aRecEstrazioneCudDett.pg_compenso,
               aRecAssCompensoConguaglio.cd_cds_conguaglio,
               aRecAssCompensoConguaglio.cd_uo_conguaglio,
               aRecAssCompensoConguaglio.esercizio_conguaglio,
               aRecAssCompensoConguaglio.pg_conguaglio;

         EXIT WHEN gen_cur%NOTFOUND;

         BEGIN

            UPDATE ESTRAZIONE_CUD_DETT
            SET    fl_incluso_in_conguaglio = 'Y',
                   cd_cds_conguaglio = aRecAssCompensoConguaglio.cd_cds_conguaglio,
                   cd_uo_conguaglio = aRecAssCompensoConguaglio.cd_uo_conguaglio,
                   esercizio_conguaglio = aRecAssCompensoConguaglio.esercizio_conguaglio,
                   pg_conguaglio = aRecAssCompensoConguaglio.pg_conguaglio
            WHERE  id_estrazione = inRepID AND
                   esercizio = inEsercizio AND
                   cd_cds_compenso = aRecEstrazioneCudDett.cd_cds_compenso AND
                   cd_uo_compenso = aRecEstrazioneCudDett.cd_uo_compenso AND
                   esercizio_compenso = aRecEstrazioneCudDett.esercizio_compenso AND
                   pg_compenso = aRecEstrazioneCudDett.pg_compenso;

         END;

      END LOOP;

      CLOSE gen_cur;

   END;

   -------------------------------------------------------------------------------------------------
   -- Definisco, se vi sono conguagli, l'ultimo costruito temporalmente

   BEGIN

      OPEN gen_cur FOR

           SELECT A.cd_cds_compenso,
                  A.cd_uo_compenso,
                  A.esercizio_compenso,
                  A.pg_compenso
           FROM   ESTRAZIONE_CUD_DETT A
           WHERE  A.id_estrazione = inRepID AND
                  A.esercizio = inEsercizio AND
                  A.fl_compenso_conguaglio = 'Y' AND
                  (A.cd_anag, A.dacr_conguaglio) =
                      (SELECT B.cd_anag, MAX(B.dacr_conguaglio)
                       FROM   ESTRAZIONE_CUD_DETT B
                       WHERE  B.id_estrazione = A.id_estrazione AND
                              B.esercizio = A.esercizio AND
                              B.fl_compenso_conguaglio = A.fl_compenso_conguaglio AND
                              B.cd_anag = A.cd_anag
                       GROUP BY B.cd_anag);

      LOOP

         FETCH gen_cur INTO
               aRecEstrazioneCudDett.cd_cds_compenso,
               aRecEstrazioneCudDett.cd_uo_compenso,
               aRecEstrazioneCudDett.esercizio_compenso,
               aRecEstrazioneCudDett.pg_compenso;

         EXIT WHEN gen_cur%NOTFOUND;

         BEGIN

            UPDATE ESTRAZIONE_CUD_DETT
            SET    fl_ultimo_conguaglio = 'Y',
                   fl_incluso_in_conguaglio = 'N'
            WHERE  id_estrazione = inRepID AND
                   esercizio = inEsercizio AND
                   cd_cds_compenso = aRecEstrazioneCudDett.cd_cds_compenso AND
                   cd_uo_compenso = aRecEstrazioneCudDett.cd_uo_compenso AND
                   esercizio_compenso = aRecEstrazioneCudDett.esercizio_compenso AND
                   pg_compenso = aRecEstrazioneCudDett.pg_compenso;

         END;

      END LOOP;

      CLOSE gen_cur;

   END;

END upgDatiCUDDettCong;

-- =================================================================================================
-- Aggiornamento annotazioni CUD
-- =================================================================================================
PROCEDURE inserisciCUDAnnotazioni
   (
    inRepID INTEGER,
    inEsercizio NUMBER,
    aCdAnag NUMBER,
    aPgOrdineAnnotazione INTEGER,
    aPgTipoAnnotazione INTEGER,
    aCdTipologiaReddito VARCHAR2,
    aDataRifDa DATE,
    aDsTipologiaReddito VARCHAR2,
    aImponibile NUMBER,
    aDataRifA DATE,
    inUtente VARCHAR2
   ) IS

BEGIN

   BEGIN

      INSERT INTO ESTRAZIONE_CUD_ANNOTAZIONI
             (id_estrazione,
              esercizio,
              dip_cd_anag,
              pg_ordine_annotazione,
              pg_tipo_annotazione,
              cd_tipologia_reddito,
              data_rif_da,
              ds_tipologia_reddito,
              imponibile,
              data_rif_a,
              dacr,
              utcr,
              duva,
              utuv,
              pg_ver_rec)
      VALUES (inRepID,
              inEsercizio,
              aCdAnag,
              aPgOrdineAnnotazione,
              aPgTipoAnnotazione,
              aCdTipologiaReddito,
              aDataRifDa,
              aDsTipologiaReddito,
              aImponibile,
              aDataRifA,
              dataOdierna,
              inUtente,
              dataOdierna,
              inUtente,
              1);

   EXCEPTION

      WHEN dup_val_on_index THEN

           IF aPgOrdineAnnotazione = 1 THEN

              UPDATE ESTRAZIONE_CUD_ANNOTAZIONI
              SET    imponibile = imponibile + aImponibile
              WHERE  id_estrazione = inRepID AND
                     esercizio = inEsercizio AND
                     dip_cd_anag = aCdAnag AND
                     pg_ordine_annotazione = aPgOrdineAnnotazione AND
                     pg_tipo_annotazione = aPgTipoAnnotazione AND
                     cd_tipologia_reddito = aCdTipologiaReddito AND
                     data_rif_da = aDataRifDa;

           END IF;

   END;

END inserisciCUDAnnotazioni;

-- =================================================================================================
-- Aggregazione dati in ESTRAZIONE_CUD
-- =================================================================================================
PROCEDURE aggregaDatiCUD
   (
    inEsercizio NUMBER,
    inRepID INTEGER,
    inUtente VARCHAR2
   ) IS

   ok_data_stampa DATE;
   aStringaTelFax VARCHAR2(500);

   aImponibile NUMBER(15,2);
   aPgOrdineAnnotazione INTEGER;
   aDataRifDa DATE;
   aDataRifA DATE;
   aCdTipologiaRedditoDef VARCHAR2(10);
   aDsTipologiaRedditoDef VARCHAR2(300);

   memCdAnag ESTRAZIONE_CUD_DETT.cd_anag%TYPE;
   isScritto CHAR(1);

   mem_imponibile_si_detr NUMBER(15,2);

   aRecEstrazioneCudDett ESTRAZIONE_CUD_DETT%ROWTYPE;
   aRecEstrazioneCud ESTRAZIONE_CUD%ROWTYPE;

   add_reg_anno_prec NUMBER(15,2);
   add_com_anno_prec NUMBER(15,2);

   i BINARY_INTEGER;
   isCervello VARCHAR2(1);
   isRientroLav30 VARCHAR2(1);
   isRientroLav20 VARCHAR2(1);
   imponibile_non_tassato  NUMBER(15,2):=0;
   detrazione_rid_cuneo  NUMBER(15,2):=0;

   gen_cur GenericCurTyp;

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Inizializzazione variabili

   memCdAnag:=NULL;

   -- Data stampa CUD

   IF TO_CHAR(dataOdierna, 'YYYY') = inEsercizio THEN
      ok_data_stampa:=TRUNC(dataOdierna);
   ELSE
      IF TRUNC(dataOdierna) >= TO_DATE('1503' || TO_CHAR(dataOdierna, 'YYYY'), 'DDMMYYYY') THEN
          ok_data_stampa:=TO_DATE('1503' || TO_CHAR(dataOdierna, 'YYYY') ,'DDMMYYYY');
      ELSE
          ok_data_stampa:=TRUNC(dataOdierna);
      END IF;
   END IF;

   -- Stringa telefono fax

   aStringaTelFax:=NULL;
   IF parametri_tab(7).stringa IS NOT NULL THEN
      aStringaTelFax:='T ' || parametri_tab(7).stringa || ' ';
   END IF;
   IF parametri_tab(8).stringa IS NOT NULL THEN
      aStringaTelFax:=aStringaTelFax || 'F ' || parametri_tab(8).stringa;
   END IF;

   -------------------------------------------------------------------------------------------------
   -- Aggregazione dati di ESTRAZIONE_CUD_DETT in ESTRAZIONE_CUD. Si elaborano i soli importi relativi
   -- agli imponibili fiscali, distinti per l'associazione o meno a detrazioni, e gli acconti IRPEF.
   -- Si evidenzia anche il dettaglio per codice e descrizione tipologia reddito per la costruzione del
   -- dettaglio da esporre nelle annotazioni.

   BEGIN

      -- Si determina il valore della tipologia delle annotazioni

      aPgOrdineAnnotazione:=1;
      aDataRifDa:=TO_DATE('01011900','DDMMYYYY');
      aDataRifA:=NULL;

      -- Si evidenzia anche il dettaglio per codice e descrizione tipologia reddito

      OPEN gen_cur FOR

           SELECT A.cd_anag,
                  A.cd_terzo,
                  A.fl_tassazione_separata,
                  A.cd_tipologia_reddito,
                  A.ds_tipologia_reddito,
                  A.fl_ritenuta_non_residenti,
                  A.cd_categoria,
                  SUM(DECODE(A.fl_detrazioni,'Y', A.imponibile_fisc_lordo_contrib, 0)),
                  SUM(DECODE(A.fl_detrazioni,'Y', 0, A.imponibile_fisc_lordo_contrib)),
                  SUM(A.primo_acconto_irpef_contrib),
                  SUM(A.secondo_acconto_irpef_contrib),
                  SUM(A.detrazione_rid_cuneo_netto),
                  0,
                  0,
                  0
           FROM   ESTRAZIONE_CUD_DETT A
           WHERE  A.id_estrazione = inRepID AND
                  A.esercizio = inEsercizio AND
                  A.fl_compenso_conguaglio = 'N'
           GROUP BY A.cd_anag,
                    A.cd_terzo,
                    A.fl_tassazione_separata,
                    A.cd_tipologia_reddito,
                    A.ds_tipologia_reddito,
                    A.fl_ritenuta_non_residenti,
                    A.cd_categoria,
                    0,
                    0,
                    0
           ORDER BY A.cd_anag,
                    A.cd_terzo,
                    A.fl_tassazione_separata,
                    A.cd_tipologia_reddito,
                    A.ds_tipologia_reddito,
                    A.fl_ritenuta_non_residenti,
                    A.cd_categoria;

      LOOP

         FETCH gen_cur INTO
               aRecEstrazioneCudDett.cd_anag,
               aRecEstrazioneCudDett.cd_terzo,
               aRecEstrazioneCudDett.fl_tassazione_separata,
               aRecEstrazioneCudDett.cd_tipologia_reddito,
               aRecEstrazioneCudDett.ds_tipologia_reddito,
               aRecEstrazioneCudDett.fl_ritenuta_non_residenti,
               aRecEstrazioneCudDett.cd_categoria,
               aRecEstrazioneCud.imponibile_si_detr,
               aRecEstrazioneCud.imponibile_no_detr,
               aRecEstrazioneCud.primo_acconto_irpef,
               aRecEstrazioneCud.secondo_acconto_irpef,
               aRecEstrazioneCud.ult_detr_cuneo_fisc,
               aRecEstrazioneCud.imponibile_si_detr_tassep,
               aRecEstrazioneCud.imponibile_no_detr_tassep,
               aRecEstrazioneCud.imponibile_non_residenti;

         EXIT WHEN gen_cur%NOTFOUND;

         -- Primo anagrafico in elaborazione

         IF memCdAnag IS NULL THEN
            memCdAnag:=aRecEstrazioneCudDett.cd_anag;
            isScritto:='N';
         END IF;

         -- Il codice anagrafico in lettura è diverso dal precedente

         IF memCdAnag != aRecEstrazioneCudDett.cd_anag THEN
            memCdAnag:=aRecEstrazioneCudDett.cd_anag;
            isScritto:='N';
         END IF;

         -- Gestione imponibile tassazione separata

         IF aRecEstrazioneCudDett.fl_tassazione_separata = 'Y' THEN
            aRecEstrazioneCud.imponibile_si_detr_tassep:=aRecEstrazioneCud.imponibile_si_detr;
            aRecEstrazioneCud.imponibile_si_detr:=0;
            aRecEstrazioneCud.imponibile_no_detr_tassep:=aRecEstrazioneCud.imponibile_no_detr;
            aRecEstrazioneCud.imponibile_no_detr:=0;
         END IF;

      -- Gestione per residenti esteri

         IF aRecEstrazioneCudDett.fl_ritenuta_non_residenti = 'Y' Then
            If aRecEstrazioneCud.imponibile_si_detr != 0 Then
               aRecEstrazioneCud.imponibile_non_residenti:=aRecEstrazioneCud.imponibile_si_detr;
               aRecEstrazioneCud.imponibile_si_detr:=0;
            Else
               aRecEstrazioneCud.imponibile_non_residenti:=aRecEstrazioneCud.imponibile_no_detr;
               aRecEstrazioneCud.imponibile_no_detr:=0;
            End If;
         END IF;

         -- Aggiornamento dati da ESTRAZIONE_CUD_DETT su ESTRAZIONE_CUD inclusi dati di testata

         BEGIN

            IF isScritto = 'N' THEN
               isScritto:= 'Y';

                   -- i campi successivi non sono più utilizzati, quindi li valorizzo a zero
                   add_reg_anno_prec := 0;
               add_com_anno_prec := 0;

               INSERT INTO ESTRAZIONE_CUD
                      (id_estrazione,
                       esercizio,
                       datlav_codice_fiscale,
                       datlav_nome,
                       datlav_cognome,
                       datlav_comune,
                       datlav_provincia,
                       datlav_cap,
                       datlav_indirizzo,
                       datlav_telefono,
                       datlav_mail,
                       dip_cd_anag,
                       dip_rp_reddito_complessivo,
                       dip_rp_no_tax_area,
                       dip_rp_deduzione_fissa_intera,
                       imponibile_si_detr,
                       imponibile_no_detr,
                       fl_applic_aliquota_max,
                       fl_no_applic_deduzione,
                       gg_periodo_lavoro,
                       ritenute_irpef,
                       addizionale_regionale,
                       addizionale_comunale,
                       primo_acconto_irpef,
                       secondo_acconto_irpef,
                       deduzione_dovuta,
                       imponibile_irpef,
                       imposta_lorda,
                       detrazioni_lavoro_dip,
                       detrazioni_familiari,
                       totale_detrazioni,
                       imponibile_cong_si_detr,
                       imponibile_cong_no_detr,
                       rigo_cococo,
                       dt_inizio_cococo,
                       dt_fine_cococo,
                       compensi_corrisposti_cococo,
                       contributi_dovuti_cococo,
                       contributi_trattenuti_cococo,
                       contributi_versati_cococo,
                       imponibile_si_detr_tassep,
                       imponibile_no_detr_tassep,
                       ritenute_irpef_tassep,
                       annotazioni_2,
                       data_stampa,
                       firma_datlav,
                       fl_ha_conguagli,
                       fl_soggetto_estero,
                       add_reg_accantonato,
                       add_com_accantonato,
                       dacr,
                       utcr,
                       duva,
                       utuv,
                       pg_ver_rec,
                       cnr_data_assunzione,
                       cnr_data_cessazione,
                       cnr_detrazione_coniuge,
                       cnr_detrazione_figli,
                       cnr_detrazioni_tassep,
                       cnr_gg_periodo_tassep,
                       cnr_tipologia_reddito_punto_1,
                       cnr_tempo_determinato,
                       cnr_tipologia_reddito_punto_2,
                       cnr_deduzione_fissa_3000,
                       cnr_deduzione_fissa_4500,
                       cnr_posizione_inail,
                       add_reg_anno_precedente,
                       add_com_anno_precedente,
                       im_deduzione_family,
                       imponibile_non_residenti,
                       ritenute_non_residenti,
                       im_irpef_sospeso,
                       im_redd_non_tassati_per_conv,
                       im_redd_esenti_per_legge,
                       im_bonus_erogato,
                       cd_categoria,
                       ult_detr_cuneo_fisc,
                       tratt_int_erog_cuneo_fisc,
                       tratt_int_cong_cuneo_fisc)
               VALUES (inRepID,
                       inEsercizio ,
                       parametri_tab(2).stringa,
                       TO_CHAR(NULL),
                       parametri_tab(1).stringa,
                       SUBSTR(parametri_tab(3).stringa,1,60),
                       SUBSTR(parametri_tab(4).stringa,1,4),
                       SUBSTR(parametri_tab(5).stringa,1,5),
                       parametri_tab(6).stringa,
                       SUBSTR(aStringaTelFax, 1, 50),
                       SUBSTR(parametri_tab(8).stringa,1,50),
                       aRecEstrazioneCudDett.cd_anag,
                       0,
                       'N',
                       'N',
                       aRecEstrazioneCud.imponibile_si_detr,
                       aRecEstrazioneCud.imponibile_no_detr,
                       'N',
                       'N',
                       0,
                       0,
                       0,
                       0,
                       aRecEstrazioneCud.primo_acconto_irpef,
                       aRecEstrazioneCud.secondo_acconto_irpef,
                       0,
                       0,
                       0,
                       0,
                       0,
                       0,
                       0,
                       0,
                       1,
                       TO_DATE(NULL),
                       TO_DATE(NULL),
                       0,
                       0,
                       0,
                       0,
                       aRecEstrazioneCud.imponibile_si_detr_tassep,
                       aRecEstrazioneCud.imponibile_no_detr_tassep,
                       0,
                       parametri_tab(12).stringa,
                       ok_data_stampa,
                       parametri_tab(10).stringa,
                       'N',
                       'N',
                       0,
                       0,
                       dataOdierna,
                       inUtente,
                       dataOdierna,
                       inUtente,
                       1,
                       TO_DATE(NULL),
                       TO_DATE(NULL),
                       0,
                       0,
                       0,
                       0,
                       TO_CHAR(NULL),
                       TO_CHAR(NULL),
                       TO_CHAR(NULL),
                       0,
                       0,
                       TO_CHAR(NULL),
                       add_reg_anno_prec,
                       add_com_anno_prec,
                       0,
                       aRecEstrazioneCud.imponibile_non_residenti,
                       0,
                       0,
                       0,
                       0,
                       0,
                       aRecEstrazioneCudDett.cd_categoria,
                       0,
                       0,
                       0);
            ELSE

               UPDATE ESTRAZIONE_CUD
               SET    imponibile_si_detr = imponibile_si_detr + aRecEstrazioneCud.imponibile_si_detr,
                      imponibile_no_detr = imponibile_no_detr + aRecEstrazioneCud.imponibile_no_detr,
                      primo_acconto_irpef = primo_acconto_irpef + aRecEstrazioneCud.primo_acconto_irpef,
                      secondo_acconto_irpef = secondo_acconto_irpef + aRecEstrazioneCud.secondo_acconto_irpef,
                      imponibile_si_detr_tassep = imponibile_si_detr_tassep + aRecEstrazioneCud.imponibile_si_detr_tassep,
                      imponibile_no_detr_tassep = imponibile_no_detr_tassep + aRecEstrazioneCud.imponibile_no_detr_tassep,
                      imponibile_non_residenti = imponibile_non_residenti + aRecEstrazioneCud.imponibile_non_residenti
               WHERE  id_estrazione = inRepID AND
                      esercizio = inEsercizio AND
                      dip_cd_anag = aRecEstrazioneCudDett.cd_anag AND
                      rigo_cococo = 1;

            END IF;

         END;

         -- Aggiornamento dati da ESTRAZIONE_CUD_DETT su ESTRAZIONE_CUD_ANNOTAZIONI

         BEGIN

            FOR i IN 1 .. 2

            LOOP

               IF    i = 1 THEN
                     aImponibile:=aRecEstrazioneCud.imponibile_si_detr;
               ELSIF i = 2 THEN
                     aImponibile:=aRecEstrazioneCud.imponibile_no_detr;
               END IF;

               IF aImponibile != 0 THEN
                  inserisciCUDAnnotazioni(inRepID,
                                          inEsercizio,
                                          aRecEstrazioneCudDett.cd_anag,
                                          aPgOrdineAnnotazione,
                                          i,
                                          aRecEstrazioneCudDett.cd_tipologia_reddito,
                                          aDataRifDa,
                                          aRecEstrazioneCudDett.ds_tipologia_reddito,
                                          aImponibile,
                                          aDataRifA,
                                          inUtente);
               END IF;

            END LOOP;

         END;

      END LOOP;

      CLOSE gen_cur;

   END;

   -- Se il terzo in esame è un cervellone, devo ricalcolare l'imponibile (leggendolo anche dal conguaglio)
   -- poichè il conguaglio stesso potrebbe averlo modificato
   -- Inoltre, sempre per i cervelloni, calcolo l'imponibile non tassato come il 90% del lordo percipiente (preso dai compensi)
   OPEN gen_cur FOR
           SELECT Distinct A.cd_anag
           FROM   ESTRAZIONE_CUD_DETT A
           WHERE  A.id_estrazione = inRepID AND
                  A.esercizio = inEsercizio;

   LOOP
         FETCH gen_cur Into
               aRecEstrazioneCudDett.cd_anag;

         Exit WHEN gen_cur%NOTFOUND;

         isCervello := isAnagCervello(inRepID, inEsercizio, aRecEstrazioneCudDett.cd_anag);
         isRientroLav30 := isAnagRientroLav30(inRepID, inEsercizio, aRecEstrazioneCudDett.cd_anag);
         isRientroLav20 := isAnagRientroLav20(inRepID, inEsercizio, aRecEstrazioneCudDett.cd_anag);

         If isCervello = 'N' and isRientroLav30 = 'N' and isRientroLav20 = 'N' Then
            Null;
         Else
--pipe.send_message('anag = '||aRecEstrazioneCudDett.cd_anag);
            -- calcolo l'imponibile
            Begin
               Select --Sum(DECODE(A.fl_detrazioni,'Y', Decode(A.fl_tassazione_separata,'N',A.imponibile_fisc_lordo_compenso, 0),0)),
                      --Sum(DECODE(A.fl_detrazioni,'Y', Decode(A.fl_tassazione_separata,'N',0,A.imponibile_fisc_lordo_compenso),0)),
                      --Sum(DECODE(A.fl_detrazioni,'Y', 0, Decode(A.fl_tassazione_separata,'N',A.imponibile_fisc_lordo_compenso, 0))),
                      --Sum(DECODE(A.fl_detrazioni,'Y', 0, Decode(A.fl_tassazione_separata,'N',0,A.imponibile_fisc_lordo_compenso)))
                      --Il conguaglio deve avere in configurazione_cud il flag fl_detrazioni = 'N' (ad es. per il calcolo
                      --dei giorni lavorati) e quindi l'imponibile che leggo dal conguaglio non può tener conto di tale flag
                      Sum(Decode(A.fl_tassazione_separata,'N',A.imponibile_fisc_lordo_compenso, 0)),
                      Sum(Decode(A.fl_tassazione_separata,'N',0,A.imponibile_fisc_lordo_compenso))
               Into aRecEstrazioneCud.imponibile_si_detr,
                    aRecEstrazioneCud.imponibile_si_detr_tassep
                    --aRecEstrazioneCud.imponibile_no_detr,
                    --aRecEstrazioneCud.imponibile_no_detr_tassep
               From   ESTRAZIONE_CUD_DETT A
               Where  A.id_estrazione = inRepID AND
                      A.esercizio = inEsercizio And
                      A.cd_anag = aRecEstrazioneCudDett.cd_anag And
                      --A.fl_compenso_conguaglio = 'N' And
                      (A.fl_incluso_in_conguaglio = 'N'
                        Or
                       A.fl_ultimo_conguaglio = 'Y');
            End;

            -- calcolo l'imponibile non tassato
            imponibile_non_tassato :=0;

            Begin
               Select NVL(Sum(A.im_lordo_percip_compenso), 0) - NVL(Sum(A.quota_esente_compenso), 0)
               Into imponibile_non_tassato --aRecEstrazioneCud.imponibile_non_tassato_cerv
               From   ESTRAZIONE_CUD_DETT A
               Where  A.id_estrazione = inRepID AND
                      A.esercizio = inEsercizio And
                      A.cd_anag = aRecEstrazioneCudDett.cd_anag And
                      A.fl_compenso_conguaglio = 'N';
            End;

            If isCervello = 'Y' then
                 aRecEstrazioneCud.imponibile_non_tassato_cerv := imponibile_non_tassato * 90/100;
                 aRecEstrazioneCud.imponi_non_tassato_rientro_lav := 0;
            elsif isRientroLav30 = 'Y' then
                 aRecEstrazioneCud.imponi_non_tassato_rientro_lav := imponibile_non_tassato * 70/100;
                 aRecEstrazioneCud.imponibile_non_tassato_cerv := 0;
            elsif isRientroLav20 = 'Y' then
                 aRecEstrazioneCud.imponi_non_tassato_rientro_lav := imponibile_non_tassato * 80/100;
                 aRecEstrazioneCud.imponibile_non_tassato_cerv := 0;
            end if;


            UPDATE ESTRAZIONE_CUD
               SET    imponibile_si_detr = aRecEstrazioneCud.imponibile_si_detr,
                      --imponibile_no_detr = aRecEstrazioneCud.imponibile_no_detr
                      imponibile_si_detr_tassep = imponibile_si_detr_tassep + aRecEstrazioneCud.imponibile_si_detr_tassep,
                      --imponibile_no_detr_tassep = imponibile_no_detr_tassep + aRecEstrazioneCud.imponibile_no_detr_tassep
                      imponibile_non_tassato_cerv = aRecEstrazioneCud.imponibile_non_tassato_cerv,
                      imponi_non_tassato_rientro_lav = aRecEstrazioneCud.imponi_non_tassato_rientro_lav
               WHERE  id_estrazione = inRepID AND
                      esercizio = inEsercizio AND
                      dip_cd_anag = aRecEstrazioneCudDett.cd_anag AND
                      rigo_cococo = 1;
         End If;
  End Loop;

   -------------------------------------------------------------------------------------------------
   -- Aggregazione dati di ESTRAZIONE_CUD_DETT in ESTRAZIONE_CUD. Estrazione ritenute, detrazioni,
   -- deduzioni ed importi esterni.
   -- Sono gestite le seguenti regole:
   -- a) In caso di tassazione separata elabora solo l'ammontare IRPEF relativo
   -- b) In caso di non tassazione separata gli importi sono presi dai compensi se non associati ad
   --    alcun conguaglio altrimenti sono presi dal conguaglio. In questo caso:
   --    irpef lorda = CONGUAGLIO.im_irpef_dovuto
   --    detrazioni = CONGUAGLIO.detrazioni_XX_dovuto
   --    irpef netta = irpef lorda - detrazioni

   -- a) I dati esterni sono azzerati se non siamo in presenza di un ultimo conguaglio (per
   --    ora gestisco il solo imponibile fiscale esterno)

   -- b) Le detrazioni normali (non _dovute) sono azzerate se il compenso e un
   --    conguaglio o risulta incluso in un conguaglio.
   -- c) Le detrazioni dovute (conguaglio) sono azzerate se il compenso non e un
   --    conguaglio o se risulta incluso in un conguaglio.
   -- d) E' un caso particolare di compenso senza calcoli il cui valore deve essere
   --    considerato unan detrazione personale.
   -- e) Per le ritenute IRPEF + ADDREG + ADDCOM si fanno due calcoli:
   --    1) Sommo i dati di contributo e ritenuta azzerando i valori se negativi ed
   --       il compenso associato non e un conguaglio.
   --    2) Sommo i dati di contributo e ritenuta solo per i compensi non di tipo
   --       conguaglio e se non sono stati inclusi in un conguaglio + i dati da
   --       conguaglio solo se il compenso e un conguaglio e non e stato incluso
   --       in altro conguaglio

   BEGIN

      -- Si determina il valore della tipologia delle annotazioni

      aPgOrdineAnnotazione:=1;
      aDataRifDa:=TO_DATE('01011900','DDMMYYYY');
      aDataRifA:=NULL;
      aCdTipologiaRedditoDef:='ZZZZZZ';
      aDsTipologiaRedditoDef:='Imponibile esterno';

      -- Ciclo principale di aggiornamento

      OPEN gen_cur FOR

           SELECT cd_anag,
                  fl_detrazioni,
                  fl_compenso_conguaglio,
                  fl_incluso_in_conguaglio,
                  fl_ultimo_conguaglio,
                  fl_tassazione_separata,
                  fl_cococo,
                  im_lordo_percip_compenso,
                  quota_esente_compenso,
                  imponibile_previd_contrib,
                  im_previd_percip_contrib,
                  im_previd_ente_contrib,
                  im_deduzione_dovuto_conguaglio,
                  im_ritenute_irpef_dovuto_cong,
                  im_addreg_dovuto_cong,
                  im_addpro_dovuto_cong,
                  im_addcom_dovuto_cong,
                  detraz_pe_dovuto_conguaglio,
                  detraz_la_dovuto_conguaglio,
                  detraz_co_dovuto_conguaglio,
                  detraz_fi_dovuto_conguaglio,
                  detraz_al_dovuto_conguaglio,
                  imponibile_fiscale_esterno,
                  im_deduzione_compenso,
                  im_irpef_lordo_contrib,
                  im_irpef_netto_contrib,
                  im_addreg_contrib,
                  im_addpro_contrib,
                  im_addcom_contrib,
                  detraz_pe_netto_compenso,
                  detraz_la_netto_compenso,
                  detraz_co_netto_compenso,
                  detraz_fi_netto_compenso,
                  detraz_al_netto_compenso,
                  fl_escludi_qvaria_deduzione,
                  fl_intera_qfissa_deduzione,
                  im_deduzione_family,
                          im_ded_family_dovuto_cong,
                          fl_ritenuta_non_residenti,
                          im_irpef_sospeso,
                          im_redd_non_tassati_per_conv,
                  im_redd_esenti_per_legge,
                  im_bonus_erogato,
                  im_bonus_dovuto_cong,
                  im_rid_cuneo_erogato,
                  im_credito_irpef_dovuto,
                  im_credito_irpef_goduto,
                  im_detr_rid_cuneo_dovuto_cong
           FROM   ESTRAZIONE_CUD_DETT A
           WHERE  id_estrazione = inRepID AND
                  esercizio = inEsercizio;

      LOOP

         FETCH gen_cur INTO
               aRecEstrazioneCudDett.cd_anag,
               aRecEstrazioneCudDett.fl_detrazioni,
               aRecEstrazioneCudDett.fl_compenso_conguaglio,
               aRecEstrazioneCudDett.fl_incluso_in_conguaglio,
               aRecEstrazioneCudDett.fl_ultimo_conguaglio,
               aRecEstrazioneCudDett.fl_tassazione_separata,
               aRecEstrazioneCudDett.fl_cococo,
               aRecEstrazioneCudDett.im_lordo_percip_compenso,
               aRecEstrazioneCudDett.quota_esente_compenso,
               aRecEstrazioneCudDett.imponibile_previd_contrib,
               aRecEstrazioneCudDett.im_previd_percip_contrib,
               aRecEstrazioneCudDett.im_previd_ente_contrib,
               aRecEstrazioneCudDett.im_deduzione_dovuto_conguaglio,
               aRecEstrazioneCudDett.im_ritenute_irpef_dovuto_cong,
               aRecEstrazioneCudDett.im_addreg_dovuto_cong,
               aRecEstrazioneCudDett.im_addpro_dovuto_cong,
               aRecEstrazioneCudDett.im_addcom_dovuto_cong,
               aRecEstrazioneCudDett.detraz_pe_dovuto_conguaglio,
               aRecEstrazioneCudDett.detraz_la_dovuto_conguaglio,
               aRecEstrazioneCudDett.detraz_co_dovuto_conguaglio,
               aRecEstrazioneCudDett.detraz_fi_dovuto_conguaglio,
               aRecEstrazioneCudDett.detraz_al_dovuto_conguaglio,
               aRecEstrazioneCudDett.imponibile_fiscale_esterno,
               aRecEstrazioneCudDett.im_deduzione_compenso,
               aRecEstrazioneCudDett.im_irpef_lordo_contrib,
               aRecEstrazioneCudDett.im_irpef_netto_contrib,
               aRecEstrazioneCudDett.im_addreg_contrib,
               aRecEstrazioneCudDett.im_addpro_contrib,
               aRecEstrazioneCudDett.im_addcom_contrib,
               aRecEstrazioneCudDett.detraz_pe_netto_compenso,
               aRecEstrazioneCudDett.detraz_la_netto_compenso,
               aRecEstrazioneCudDett.detraz_co_netto_compenso,
               aRecEstrazioneCudDett.detraz_fi_netto_compenso,
               aRecEstrazioneCudDett.detraz_al_netto_compenso,
               aRecEstrazioneCudDett.fl_escludi_qvaria_deduzione,
               aRecEstrazioneCudDett.fl_intera_qfissa_deduzione,
               aRecEstrazioneCudDett.im_deduzione_family,
               aRecEstrazioneCudDett.im_ded_family_dovuto_cong,
               aRecEstrazioneCudDett.fl_ritenuta_non_residenti,
               aRecEstrazioneCudDett.im_irpef_sospeso,
               aRecEstrazioneCudDett.im_redd_non_tassati_per_conv,
               aRecEstrazioneCudDett.im_redd_esenti_per_legge,
               aRecEstrazioneCudDett.im_bonus_erogato,
               aRecEstrazioneCudDett.im_bonus_dovuto_cong,
               aRecEstrazioneCudDett.im_rid_cuneo_erogato,
               aRecEstrazioneCudDett.im_credito_irpef_dovuto,
               aRecEstrazioneCudDett.im_credito_irpef_goduto,
               aRecEstrazioneCudDett.im_detr_rid_cuneo_dovuto_cong;

         EXIT WHEN gen_cur%NOTFOUND;

         BEGIN

            -- Azzeramento variabili ---------------------------------------------------------------

            aRecEstrazioneCud.ritenute_irpef_tassep:=0;
            aRecEstrazioneCud.cnr_detrazioni_tassep:=0;

            aRecEstrazioneCud.imposta_lorda:=0;
            aRecEstrazioneCud.detrazioni_lavoro_dip:=0;
            aRecEstrazioneCud.detrazioni_familiari:=0;
            aRecEstrazioneCud.cnr_detrazione_coniuge:=0;
            aRecEstrazioneCud.cnr_detrazione_figli:=0;
            aRecEstrazioneCud.totale_detrazioni:=0;
            aRecEstrazioneCud.ritenute_irpef:=0;
            aRecEstrazioneCud.deduzione_dovuta:=0;
            aRecEstrazioneCud.im_deduzione_family:=0;

            aRecEstrazioneCud.addizionale_regionale:=0;
            aRecEstrazioneCud.addizionale_comunale:=0;

            aRecEstrazioneCud.imponibile_cong_si_detr:=0;
            aRecEstrazioneCud.imponibile_cong_no_detr:=0;

            aRecEstrazioneCud.imponibile_si_detr:=0;
            aRecEstrazioneCud.imponibile_no_detr:=0;

            aRecEstrazioneCud.compensi_corrisposti_cococo:=0;
            aRecEstrazioneCud.contributi_dovuti_cococo:=0;
            aRecEstrazioneCud.contributi_trattenuti_cococo:=0;
            aRecEstrazioneCud.contributi_versati_cococo:=0;

            aRecEstrazioneCud.dip_rp_deduzione_fissa_intera:='N';

                aRecEstrazioneCud.imponibile_non_residenti:=0;
                aRecEstrazioneCud.ritenute_non_residenti:=0;

                aRecEstrazioneCud.im_irpef_sospeso:=0;

                aRecEstrazioneCud.im_redd_non_tassati_per_conv := aRecEstrazioneCudDett.im_redd_non_tassati_per_conv;
                aRecEstrazioneCud.im_redd_esenti_per_legge := aRecEstrazioneCudDett.im_redd_esenti_per_legge;

                aRecEstrazioneCud.im_bonus_erogato:=0;
                aRecEstrazioneCud.ult_detr_cuneo_fisc:=0;
                aRecEstrazioneCud.tratt_int_erog_cuneo_fisc:=0;
                aRecEstrazioneCud.tratt_int_cong_cuneo_fisc:=0;

            -- Sistemazione dati estratti ----------------------------------------------------------


            -- In caso di NON RESIDENTI valorizzo il solo ammontare IRPEF.
            If aRecEstrazioneCudDett.fl_ritenuta_non_residenti = 'Y' THEN

               aRecEstrazioneCud.ritenute_non_residenti:=aRecEstrazioneCudDett.im_irpef_netto_contrib;

            -- In caso di tassazione separata valorizzo il solo ammontare IRPEF.
            -- Per il CNR aggiunta l'estrazione delle detrazioni
            Elsif aRecEstrazioneCudDett.fl_tassazione_separata = 'Y' THEN

               aRecEstrazioneCud.ritenute_irpef_tassep:=aRecEstrazioneCudDett.im_irpef_netto_contrib;

               -- Elaborazione compensi non inclusi in alcun conguaglio

               IF (aRecEstrazioneCudDett.fl_compenso_conguaglio = 'N' AND
                   aRecEstrazioneCudDett.fl_incluso_in_conguaglio = 'N') THEN
                  aRecEstrazioneCud.cnr_detrazioni_tassep:=aRecEstrazioneCudDett.detraz_pe_netto_compenso +
                                                           aRecEstrazioneCudDett.detraz_la_netto_compenso +
                                                           aRecEstrazioneCudDett.detraz_co_netto_compenso +
                                                           aRecEstrazioneCudDett.detraz_fi_netto_compenso +
                                                           aRecEstrazioneCudDett.detraz_al_netto_compenso;
               END IF;

            -- Gestione per non tassazione separata.
            -- Per CNR aggiunti i campi di detrazione coniuge e figli + altri

            Else

               -- Elaborazione compensi non inclusi in alcun conguaglio

               IF (aRecEstrazioneCudDett.fl_compenso_conguaglio = 'N' AND
                   aRecEstrazioneCudDett.fl_incluso_in_conguaglio = 'N') THEN
                  aRecEstrazioneCud.imposta_lorda:=aRecEstrazioneCudDett.im_irpef_lordo_contrib;
                  aRecEstrazioneCud.detrazioni_lavoro_dip:=aRecEstrazioneCudDett.detraz_pe_netto_compenso +
                                                           aRecEstrazioneCudDett.detraz_la_netto_compenso;
                  aRecEstrazioneCud.detrazioni_familiari:=aRecEstrazioneCudDett.detraz_co_netto_compenso +
                                                          aRecEstrazioneCudDett.detraz_fi_netto_compenso +
                                                          aRecEstrazioneCudDett.detraz_al_netto_compenso;
                  aRecEstrazioneCud.cnr_detrazione_coniuge:=aRecEstrazioneCudDett.detraz_co_netto_compenso;
                  aRecEstrazioneCud.cnr_detrazione_figli:=aRecEstrazioneCudDett.detraz_fi_netto_compenso +
                                                          aRecEstrazioneCudDett.detraz_al_netto_compenso;
                  aRecEstrazioneCud.totale_detrazioni:=aRecEstrazioneCud.detrazioni_lavoro_dip +
                                                       aRecEstrazioneCud.detrazioni_familiari;
                  aRecEstrazioneCud.ritenute_irpef:=aRecEstrazioneCudDett.im_irpef_netto_contrib;
                  aRecEstrazioneCud.deduzione_dovuta:=aRecEstrazioneCudDett.im_deduzione_compenso;
                  aRecEstrazioneCud.im_deduzione_family:=aRecEstrazioneCudDett.im_deduzione_family;
                  aRecEstrazioneCud.addizionale_regionale:=aRecEstrazioneCudDett.im_addreg_contrib;
                  aRecEstrazioneCud.addizionale_comunale:=aRecEstrazioneCudDett.im_addcom_contrib;
                  aRecEstrazioneCud.im_irpef_sospeso:=aRecEstrazioneCudDett.im_irpef_sospeso;
                  aRecEstrazioneCud.im_bonus_erogato:=aRecEstrazioneCudDett.im_bonus_erogato;

               END IF;

               -- Elaborazione compensi conguaglio (solo ultimo)

               IF (aRecEstrazioneCudDett.fl_compenso_conguaglio = 'Y' AND
                   aRecEstrazioneCudDett.fl_ultimo_conguaglio = 'Y') THEN
                  aRecEstrazioneCud.imposta_lorda:=aRecEstrazioneCudDett.im_ritenute_irpef_dovuto_cong;
                  aRecEstrazioneCud.detrazioni_lavoro_dip:=aRecEstrazioneCudDett.detraz_pe_dovuto_conguaglio +
                                                           aRecEstrazioneCudDett.detraz_la_dovuto_conguaglio;
                  aRecEstrazioneCud.detrazioni_familiari:=aRecEstrazioneCudDett.detraz_co_dovuto_conguaglio +
                                                          aRecEstrazioneCudDett.detraz_fi_dovuto_conguaglio +
                                                          aRecEstrazioneCudDett.detraz_al_dovuto_conguaglio;
                  aRecEstrazioneCud.cnr_detrazione_coniuge:=aRecEstrazioneCudDett.detraz_co_dovuto_conguaglio;
                  aRecEstrazioneCud.cnr_detrazione_figli:=aRecEstrazioneCudDett.detraz_fi_dovuto_conguaglio +
                                                          aRecEstrazioneCudDett.detraz_al_dovuto_conguaglio;
                  aRecEstrazioneCud.totale_detrazioni:=aRecEstrazioneCud.detrazioni_lavoro_dip +
                                                       aRecEstrazioneCud.detrazioni_familiari +
                                                       aRecEstrazioneCudDett.im_detr_rid_cuneo_dovuto_cong;
                  aRecEstrazioneCud.ritenute_irpef:=aRecEstrazioneCud.imposta_lorda -
                                                    aRecEstrazioneCud.totale_detrazioni;
                  aRecEstrazioneCud.deduzione_dovuta:=aRecEstrazioneCudDett.im_deduzione_dovuto_conguaglio;
                  aRecEstrazioneCud.im_deduzione_family:=aRecEstrazioneCudDett.im_ded_family_dovuto_cong;
                  aRecEstrazioneCud.addizionale_regionale:=aRecEstrazioneCudDett.im_addreg_dovuto_cong;
                  aRecEstrazioneCud.addizionale_comunale:=aRecEstrazioneCudDett.im_addcom_dovuto_cong;
                  aRecEstrazioneCud.im_irpef_sospeso:=aRecEstrazioneCudDett.im_irpef_sospeso;
                  aRecEstrazioneCud.im_bonus_erogato:=aRecEstrazioneCudDett.im_bonus_dovuto_cong;

                  aRecEstrazioneCud.ult_detr_cuneo_fisc:=aRecEstrazioneCudDett.im_detr_rid_cuneo_dovuto_cong;
                  aRecEstrazioneCud.tratt_int_erog_cuneo_fisc:=aRecEstrazioneCudDett.im_credito_irpef_dovuto;
                  if aRecEstrazioneCudDett.im_credito_irpef_goduto - aRecEstrazioneCudDett.im_credito_irpef_dovuto > 0 then
                    aRecEstrazioneCud.tratt_int_cong_cuneo_fisc:=aRecEstrazioneCudDett.im_credito_irpef_goduto - aRecEstrazioneCudDett.im_credito_irpef_dovuto;
                  else
                    aRecEstrazioneCud.tratt_int_cong_cuneo_fisc:=0;
                  end if;
                  IF aRecEstrazioneCudDett.fl_detrazioni = 'Y' THEN
                     aRecEstrazioneCud.imponibile_cong_si_detr:=aRecEstrazioneCudDett.imponibile_fiscale_esterno;
                     aRecEstrazioneCud.imponibile_si_detr:=aRecEstrazioneCudDett.imponibile_fiscale_esterno;
                  ELSE
                     aRecEstrazioneCud.imponibile_cong_no_detr:=aRecEstrazioneCudDett.imponibile_fiscale_esterno;
                     aRecEstrazioneCud.imponibile_no_detr:=aRecEstrazioneCudDett.imponibile_fiscale_esterno;
                  END IF;
                  IF aRecEstrazioneCudDett.fl_intera_qfissa_deduzione = 'Y' THEN
                     aRecEstrazioneCud.dip_rp_deduzione_fissa_intera:= 'Y';
                  END IF;
               END IF;

            End If;

            -- Dati relativi a cococo indifferenti alla gestione per tassazione separata

            IF (aRecEstrazioneCudDett.fl_compenso_conguaglio = 'N'
                --AND aRecEstrazioneCudDett.fl_cococo = 'Y'    -- ANCHE GLI ASSEGNI
                ) THEN
               IF aRecEstrazioneCudDett.im_previd_percip_contrib != 0 THEN
                  aRecEstrazioneCud.compensi_corrisposti_cococo:=aRecEstrazioneCudDett.imponibile_previd_contrib;
                  aRecEstrazioneCud.contributi_dovuti_cococo:=aRecEstrazioneCudDett.im_previd_percip_contrib +
                                                              aRecEstrazioneCudDett.im_previd_ente_contrib;
                  aRecEstrazioneCud.contributi_trattenuti_cococo:=aRecEstrazioneCudDett.im_previd_percip_contrib;
                  aRecEstrazioneCud.contributi_versati_cococo:=aRecEstrazioneCudDett.im_previd_percip_contrib +
                                                               aRecEstrazioneCudDett.im_previd_ente_contrib;
               END IF;
            END IF;


            -- Aggiornamento ESTRAZIONE_CUD --------------------------------------------------------

            IF (aRecEstrazioneCud.ritenute_irpef_tassep != 0 OR
                aRecEstrazioneCud.cnr_detrazioni_tassep != 0 OR
                aRecEstrazioneCud.imposta_lorda != 0 OR
                aRecEstrazioneCud.detrazioni_lavoro_dip != 0 OR
                aRecEstrazioneCud.detrazioni_familiari != 0 OR
                aRecEstrazioneCud.cnr_detrazione_coniuge != 0 OR
                aRecEstrazioneCud.cnr_detrazione_figli != 0 OR
                aRecEstrazioneCud.totale_detrazioni != 0 OR
                aRecEstrazioneCud.ritenute_irpef != 0 OR
                aRecEstrazioneCud.deduzione_dovuta != 0 Or
                aRecEstrazioneCud.im_deduzione_family != 0 OR
                aRecEstrazioneCud.addizionale_regionale != 0 OR
                aRecEstrazioneCud.addizionale_comunale != 0 OR
                aRecEstrazioneCud.imponibile_cong_si_detr != 0 OR
                aRecEstrazioneCud.imponibile_cong_no_detr != 0 OR
                aRecEstrazioneCud.imponibile_si_detr != 0 OR
                aRecEstrazioneCud.imponibile_no_detr != 0 OR
                aRecEstrazioneCud.compensi_corrisposti_cococo != 0 OR
                aRecEstrazioneCud.contributi_dovuti_cococo != 0 OR
                aRecEstrazioneCud.contributi_trattenuti_cococo != 0 OR
                aRecEstrazioneCud.contributi_versati_cococo != 0 Or
                aRecEstrazioneCud.ritenute_non_residenti != 0 or
                aRecEstrazioneCud.im_irpef_sospeso != 0 or
                aRecEstrazioneCud.im_redd_non_tassati_per_conv != 0 or
                aRecEstrazioneCud.im_redd_esenti_per_legge != 0 or
                aRecEstrazioneCud.im_bonus_erogato != 0 or
                aRecEstrazioneCud.ult_detr_cuneo_fisc != 0 or
                aRecEstrazioneCud.tratt_int_erog_cuneo_fisc != 0 or
                aRecEstrazioneCud.tratt_int_cong_cuneo_fisc != 0) THEN

               IF aRecEstrazioneCud.dip_rp_deduzione_fissa_intera = 'Y' THEN
                  UPDATE ESTRAZIONE_CUD
                  SET    imponibile_si_detr = imponibile_si_detr + aRecEstrazioneCud.imponibile_cong_si_detr,
                         imponibile_no_detr = imponibile_no_detr + aRecEstrazioneCud.imponibile_cong_no_detr,
                         ritenute_irpef = ritenute_irpef + aRecEstrazioneCud.ritenute_irpef,
                         ritenute_irpef_tassep = ritenute_irpef_tassep + aRecEstrazioneCud.ritenute_irpef_tassep,
                         addizionale_regionale = addizionale_regionale + aRecEstrazioneCud.addizionale_regionale,
                         addizionale_comunale = addizionale_comunale + aRecEstrazioneCud.addizionale_comunale,
                         deduzione_dovuta = deduzione_dovuta + aRecEstrazioneCud.deduzione_dovuta,
                         im_deduzione_family = im_deduzione_family + aRecEstrazioneCud.im_deduzione_family,
                         detrazioni_lavoro_dip = detrazioni_lavoro_dip + aRecEstrazioneCud.detrazioni_lavoro_dip,
                         detrazioni_familiari = detrazioni_familiari + aRecEstrazioneCud.detrazioni_familiari,
                         totale_detrazioni = totale_detrazioni + aRecEstrazioneCud.totale_detrazioni,
                         imponibile_cong_si_detr = imponibile_cong_si_detr + aRecEstrazioneCud.imponibile_cong_si_detr,
                         imponibile_cong_no_detr = imponibile_cong_no_detr + aRecEstrazioneCud.imponibile_cong_no_detr,
                         imposta_lorda = imposta_lorda + aRecEstrazioneCud.imposta_lorda,
                         compensi_corrisposti_cococo = compensi_corrisposti_cococo +
                                                       aRecEstrazioneCud.compensi_corrisposti_cococo,
                         contributi_dovuti_cococo = contributi_dovuti_cococo +
                                                    aRecEstrazioneCud.contributi_dovuti_cococo,
                         contributi_trattenuti_cococo = contributi_trattenuti_cococo +
                                                        aRecEstrazioneCud.contributi_trattenuti_cococo,
                         contributi_versati_cococo = contributi_versati_cococo +
                                                     aRecEstrazioneCud.contributi_versati_cococo,
                         dip_rp_deduzione_fissa_intera = aRecEstrazioneCud.dip_rp_deduzione_fissa_intera,
                         cnr_detrazioni_tassep = cnr_detrazioni_tassep + aRecEstrazioneCud.cnr_detrazioni_tassep,
                         cnr_detrazione_coniuge = cnr_detrazione_coniuge + aRecEstrazioneCud.cnr_detrazione_coniuge,
                         cnr_detrazione_figli = cnr_detrazione_figli + aRecEstrazioneCud.cnr_detrazione_figli,
                         ritenute_non_residenti = ritenute_non_residenti + aRecEstrazioneCud.ritenute_non_residenti,
                         im_irpef_sospeso = im_irpef_sospeso + aRecEstrazioneCud.im_irpef_sospeso,
                         im_redd_non_tassati_per_conv  = im_redd_non_tassati_per_conv + aRecEstrazioneCud.im_redd_non_tassati_per_conv,
                         im_redd_esenti_per_legge  = im_redd_esenti_per_legge + aRecEstrazioneCud.im_redd_esenti_per_legge,
                         im_bonus_erogato = im_bonus_erogato + aRecEstrazioneCud.im_bonus_erogato,
                         ult_detr_cuneo_fisc = ult_detr_cuneo_fisc + aRecEstrazioneCud.ult_detr_cuneo_fisc,
                         tratt_int_erog_cuneo_fisc = tratt_int_erog_cuneo_fisc + aRecEstrazioneCud.tratt_int_erog_cuneo_fisc,
                         tratt_int_cong_cuneo_fisc = tratt_int_cong_cuneo_fisc + aRecEstrazioneCud.tratt_int_cong_cuneo_fisc
                  WHERE  id_estrazione = inRepID AND
                         esercizio = inEsercizio AND
                         dip_cd_anag = aRecEstrazioneCudDett.cd_anag AND
                         rigo_cococo = 1;

               ELSE
                  UPDATE ESTRAZIONE_CUD
                  SET    imponibile_si_detr = imponibile_si_detr + aRecEstrazioneCud.imponibile_cong_si_detr,
                         imponibile_no_detr = imponibile_no_detr + aRecEstrazioneCud.imponibile_cong_no_detr,
                         ritenute_irpef = ritenute_irpef + aRecEstrazioneCud.ritenute_irpef,
                         ritenute_irpef_tassep = ritenute_irpef_tassep + aRecEstrazioneCud.ritenute_irpef_tassep,
                         addizionale_regionale = addizionale_regionale + aRecEstrazioneCud.addizionale_regionale,
                         addizionale_comunale = addizionale_comunale + aRecEstrazioneCud.addizionale_comunale,
                         deduzione_dovuta = deduzione_dovuta + aRecEstrazioneCud.deduzione_dovuta,
                         im_deduzione_family = im_deduzione_family + aRecEstrazioneCud.im_deduzione_family,
                         detrazioni_lavoro_dip = detrazioni_lavoro_dip + aRecEstrazioneCud.detrazioni_lavoro_dip,
                         detrazioni_familiari = detrazioni_familiari + aRecEstrazioneCud.detrazioni_familiari,
                         totale_detrazioni = totale_detrazioni + aRecEstrazioneCud.totale_detrazioni,
                         imponibile_cong_si_detr = imponibile_cong_si_detr + aRecEstrazioneCud.imponibile_cong_si_detr,
                         imponibile_cong_no_detr = imponibile_cong_no_detr + aRecEstrazioneCud.imponibile_cong_no_detr,
                         imposta_lorda = imposta_lorda + aRecEstrazioneCud.imposta_lorda,
                         compensi_corrisposti_cococo = compensi_corrisposti_cococo +
                                                       aRecEstrazioneCud.compensi_corrisposti_cococo,
                         contributi_dovuti_cococo = contributi_dovuti_cococo +
                                                    aRecEstrazioneCud.contributi_dovuti_cococo,
                         contributi_trattenuti_cococo = contributi_trattenuti_cococo +
                                                        aRecEstrazioneCud.contributi_trattenuti_cococo,
                         contributi_versati_cococo = contributi_versati_cococo +
                                                     aRecEstrazioneCud.contributi_versati_cococo,
                         cnr_detrazioni_tassep = cnr_detrazioni_tassep + aRecEstrazioneCud.cnr_detrazioni_tassep,
                         cnr_detrazione_coniuge = cnr_detrazione_coniuge + aRecEstrazioneCud.cnr_detrazione_coniuge,
                         cnr_detrazione_figli = cnr_detrazione_figli + aRecEstrazioneCud.cnr_detrazione_figli,
                         ritenute_non_residenti = ritenute_non_residenti + aRecEstrazioneCud.ritenute_non_residenti,
                         im_irpef_sospeso = im_irpef_sospeso + aRecEstrazioneCud.im_irpef_sospeso,
                         im_redd_non_tassati_per_conv  = im_redd_non_tassati_per_conv + aRecEstrazioneCud.im_redd_non_tassati_per_conv,
                         im_redd_esenti_per_legge  = im_redd_esenti_per_legge + aRecEstrazioneCud.im_redd_esenti_per_legge,
                         im_bonus_erogato = im_bonus_erogato + aRecEstrazioneCud.im_bonus_erogato,
                         ult_detr_cuneo_fisc = ult_detr_cuneo_fisc + aRecEstrazioneCud.ult_detr_cuneo_fisc,
                         tratt_int_erog_cuneo_fisc = tratt_int_erog_cuneo_fisc + aRecEstrazioneCud.tratt_int_erog_cuneo_fisc,
                         tratt_int_cong_cuneo_fisc = tratt_int_cong_cuneo_fisc + aRecEstrazioneCud.tratt_int_cong_cuneo_fisc
                  WHERE  id_estrazione = inRepID AND
                         esercizio = inEsercizio AND
                         dip_cd_anag = aRecEstrazioneCudDett.cd_anag AND
                         rigo_cococo = 1;

               END IF;
            END IF;

            -- Aggiornamento ESTRAZIONE_CUD_ANNOTAZIONI per imponibile fiscale esterno -------------

            IF aRecEstrazioneCudDett.imponibile_fiscale_esterno != 0 THEN

               IF aRecEstrazioneCud.imponibile_cong_si_detr != 0 THEN
                  i:=1;
                  aImponibile:=aRecEstrazioneCud.imponibile_cong_si_detr;
               ELSE
                  i:=2;
                  aImponibile:=aRecEstrazioneCud.imponibile_cong_no_detr;
               END IF;

               inserisciCUDAnnotazioni(inRepID,
                                       inEsercizio,
                                       aRecEstrazioneCudDett.cd_anag,
                                       aPgOrdineAnnotazione,
                                       i,
                                       aCdTipologiaRedditoDef,
                                       aDataRifDa,
                                       aDsTipologiaRedditoDef,
                                       aImponibile,
                                       aDataRifA,
                                       inUtente);

            END IF;

         END;

      END LOOP;

      CLOSE gen_cur;

   END;

   -------------------------------------------------------------------------------------------------
   -- Calcolo imponibile_IRPEF

   UPDATE ESTRAZIONE_CUD
   SET    imponibile_IRPEF = imponibile_si_detr + imponibile_no_detr - deduzione_dovuta - im_deduzione_family
   WHERE  id_estrazione = inRepID AND
          esercizio = inEsercizio;
End aggregaDatiCUD;

-- =================================================================================================
-- Inserimento dati anagrafici in ESTRAZIONE_CUD
-- =================================================================================================
PROCEDURE insDatiAnagCud
   (
    inEsercizio NUMBER,
    inRepID INTEGER
   ) IS

   cv_ti_entita CHAR(1);
   cv_ti_entita_fisica CHAR(1);
   cv_ti_entita_giuridica CHAR(1);
   cv_cognome VARCHAR2(100);
   cv_nome VARCHAR2(100);
   cv_ragione_sociale VARCHAR2(100);
   cv_fl_applic_aliquota_max CHAR(1);
   cv_via_fiscale VARCHAR2(150);
   cv_num_civico_fiscale VARCHAR2(10);
   cv_ti_italiano_estero VARCHAR2(1);
   cv_uo VARCHAR2(30);

   memAnnotazioni ESTRAZIONE_CUD.annotazioni_2%TYPE;
   memCdAnag ESTRAZIONE_CUD.dip_cd_anag%TYPE;

   aImAddRegRate NUMBER(15,2);
   aImAddComRate NUMBER(15,2);

   aRecEstrazioneCud ESTRAZIONE_CUD%ROWTYPE;
   aRecAnagraficoEsercizio ANAGRAFICO_ESERCIZIO%ROWTYPE;
   aRecRateizzaClassificCori RATEIZZA_CLASSIFIC_CORI%ROWTYPE;

ANAG NUMBER;

   gen_cur GenericCurTyp;

BEGIN
   -------------------------------------------------------------------------------------------------
   -- Aggiornamento dati dei soggetti anagrafici presenti in ESTRAZIONE_CUD

   BEGIN

      OPEN gen_cur FOR

           SELECT A.dip_cd_anag,
                  B.ti_entita,
                  B.ti_entita_fisica,
                  B.ti_entita_giuridica,
                  B.cognome,
                  B.nome,
                  B.ragione_sociale,
                  B.codice_fiscale,
                  B.ti_sesso,
                  TO_CHAR(B.dt_nascita,'DD'),
                  TO_CHAR(B.dt_nascita,'MM'),
                  TO_CHAR(B.dt_nascita,'YYYY'),
                  C.ds_comune,
                  C.cd_provincia,
                  D.ds_comune,
                  D.cd_provincia,
                  D.cd_catastale,
                  D.ti_italiano_estero,
                  E.ds_nota,
                  DECODE(B.aliquota_fiscale, NULL, 'N', 'Y'),
                  B.matricola_inail,
                  Substr(B.cap_comune_fiscale,1,5),
                  B.via_fiscale,
                  B.num_civico_fiscale
           FROM   ESTRAZIONE_CUD A, ANAGRAFICO B,
                  COMUNE C, COMUNE D, NOTE_ANAGRAFICO E
           WHERE  A.id_estrazione = inRepID AND
                  A.esercizio = inEsercizio AND
                  B.cd_anag = A.dip_cd_anag AND
                  C.pg_comune = B.pg_comune_nascita AND
                  D.pg_comune = B.pg_comune_fiscale AND
                  E.esercizio (+) = A.esercizio AND
                  E.cd_anag (+) = A.dip_cd_anag AND
                  (E.tipo_nota = 'CUD' OR
                   E.tipo_nota IS NULL);

      LOOP

         FETCH gen_cur INTO
               aRecEstrazioneCud.dip_cd_anag,
               cv_ti_entita,
               cv_ti_entita_fisica,
               cv_ti_entita_giuridica,
               cv_cognome,
               cv_nome,
               cv_ragione_sociale,
               aRecEstrazioneCud.dip_codice_fiscale,
               aRecEstrazioneCud.dip_sesso,
               aRecEstrazioneCud.dip_gg_nascita,
               aRecEstrazioneCud.dip_mm_nascita,
               aRecEstrazioneCud.dip_aa_nascita,
               aRecEstrazioneCud.dip_com_nascita,
               aRecEstrazioneCud.dip_prv_nascita,
               aRecEstrazioneCud.dip_com_domfisc,
               aRecEstrazioneCud.dip_prv_domfisc,
               aRecEstrazioneCud.dip_cod_com_domfisc,
               cv_ti_italiano_estero,
               aRecEstrazioneCud.annotazioni_2,
               cv_fl_applic_aliquota_max,
               aRecEstrazioneCud.cnr_posizione_inail,
               aRecEstrazioneCud.dip_cap_domfisc,
               cv_via_fiscale,
               cv_num_civico_fiscale;

         EXIT WHEN gen_cur%NOTFOUND;

       -- Poichè esistono dati sporchi sul db (residenza anagrafico diversa da residenza terzo)
       -- e poichè nei compensi e nell'acconto prendiamo la residenza dal terzo, anche nel CUD
       -- i dati della residenza li prendiamo dal terzo e poichè potrebbero esserci più terzi validi
       -- per la stessa anagrafica, prendiamo il terzo di ESTRAZIONE_CUD
       Begin
          Select c.ds_comune, c.cd_provincia, c.cd_catastale, substr(t.cap_comune_sede,1,5), t.via_sede, t.numero_civico_sede, c.ti_italiano_estero
            Into aRecEstrazioneCud.dip_com_domfisc, aRecEstrazioneCud.dip_prv_domfisc, aRecEstrazioneCud.dip_cod_com_domfisc,
                 aRecEstrazioneCud.dip_cap_domfisc, cv_via_fiscale, cv_num_civico_fiscale, cv_ti_italiano_estero
            From terzo t, comune c
              Where t.pg_comune_sede = c.pg_comune
                And t.cd_anag = aRecEstrazioneCud.dip_cd_anag
                --And t.dt_fine_rapporto Is Null
                And t.cd_terzo In (Select e.cd_terzo
                                   From ESTRAZIONE_CUD_DETT e
                                 Where id_estrazione = inRepID
                                   And esercizio = inEsercizio
                                   And cd_anag = aRecEstrazioneCud.dip_cd_anag)
              And Rownum < 2;
       Exception
            When NO_DATA_FOUND then
                  IBMERR001.RAISE_ERR_GENERICO('Terzo non trovato per Anagrafico:'||aRecEstrazioneCud.dip_cd_anag);
              When Too_Many_Rows then
                  IBMERR001.RAISE_ERR_GENERICO('Esistono più terzi validi per Anagrafico:'||aRecEstrazioneCud.dip_cd_anag);
         End;
         -- Aggiornamento dati da ESTRAZIONE_CUD_DETT su ESTRAZIONE_CUD inclusi dati di testata

         aRecEstrazioneCud.dip_cognome:=NULL;
         aRecEstrazioneCud.dip_nome:=NULL;
         --03/03/2009 - Prendiamo sempre il Cognome ed il Nome, così se non sono valorizzati il CUD
         --             ci segnala l'errore e possiamo correggerlo in SIGLA
       /*
         IF    cv_ti_entita = 'U' THEN
               aRecEstrazioneCud.dip_cognome:=cv_ragione_sociale;
         ELSIF cv_ti_entita = 'G' THEN
               aRecEstrazioneCud.dip_cognome:=cv_ragione_sociale;
         ELSIF cv_ti_entita = 'F' THEN
               IF cv_ti_entita_fisica = 'D' THEN
                  aRecEstrazioneCud.dip_cognome:=cv_ragione_sociale;
               ELSE
                  aRecEstrazioneCud.dip_cognome:=cv_cognome;
                  aRecEstrazioneCud.dip_nome:=cv_nome;
               END IF;
         ELSIF cv_ti_entita = 'D' THEN
               IF cv_ragione_sociale IS NOT NULL THEN
                  aRecEstrazioneCud.dip_cognome:=cv_ragione_sociale;
               ELSE
                  aRecEstrazioneCud.dip_cognome:=cv_cognome;
                  aRecEstrazioneCud.dip_nome:=cv_nome;
               END IF;
         END IF;
         */
         aRecEstrazioneCud.dip_cognome:=cv_cognome;
         aRecEstrazioneCud.dip_nome:=cv_nome;

       -- Se il comune della residenza fiscale è estero, si prende il comune della UO
       If cv_ti_italiano_estero != 'I' Then
         Begin
            --prendo la UO sulla quale il terzo ha il reddito maggiore
            Select cd_uo_compenso
            Into cv_uo
            From ( Select cd_uo_compenso, Nvl(Sum(imponibile_fisc_lordo_contrib),0) somma
                   From ESTRAZIONE_CUD_DETT
                   Where id_estrazione = inRepID
                     And esercizio = inEsercizio
                     And cd_anag = aRecEstrazioneCud.dip_cd_anag
                   Group By cd_uo_compenso
                   Order By somma Desc)
            Where Rownum <2;

                  Select c.ds_comune, c.cd_provincia, c.cd_catastale, substr(t.cap_comune_sede,1,5), t.via_sede, t.numero_civico_sede
            Into aRecEstrazioneCud.dip_com_domfisc, aRecEstrazioneCud.dip_prv_domfisc, aRecEstrazioneCud.dip_cod_com_domfisc,
                 aRecEstrazioneCud.dip_cap_domfisc, cv_via_fiscale, cv_num_civico_fiscale
            From terzo t, comune c
            Where t.pg_comune_sede = c.pg_comune
              And cd_unita_organizzativa = cv_uo;
         Exception
               When Others Then Null;
         End;
         End If;

         IF cv_num_civico_fiscale IS NOT NULL THEN
            cv_via_fiscale:=cv_via_fiscale || ', ' || cv_num_civico_fiscale;
         END IF;
         -- Normalizzazione estrazioni per congruenza alla dimensione su db

         memAnnotazioni:=LTRIM(RTRIM(aRecEstrazioneCud.annotazioni_2));

         BEGIN
            IF memAnnotazioni IS NULL THEN

               UPDATE ESTRAZIONE_CUD
               SET    dip_cognome = aRecEstrazioneCud.dip_cognome,
                      dip_nome = aRecEstrazioneCud.dip_nome,
                      dip_codice_fiscale = aRecEstrazioneCud.dip_codice_fiscale,
                      dip_sesso = aRecEstrazioneCud.dip_sesso,
                      dip_gg_nascita = aRecEstrazioneCud.dip_gg_nascita,
                      dip_mm_nascita = aRecEstrazioneCud.dip_mm_nascita,
                      dip_aa_nascita = aRecEstrazioneCud.dip_aa_nascita,
                      dip_com_nascita = aRecEstrazioneCud.dip_com_nascita,
                      dip_prv_nascita = aRecEstrazioneCud.dip_prv_nascita,
                      dip_com_domfisc = aRecEstrazioneCud.dip_com_domfisc,
                      dip_prv_domfisc = aRecEstrazioneCud.dip_prv_domfisc,
                      dip_cod_com_domfisc = aRecEstrazioneCud.dip_cod_com_domfisc,
                      fl_applic_aliquota_max = cv_fl_applic_aliquota_max,
                      cnr_posizione_inail = aRecEstrazioneCud.cnr_posizione_inail,
                      dip_cap_domfisc = aRecEstrazioneCud.dip_cap_domfisc,
                      dip_ind_domfisc = cv_via_fiscale
               WHERE  id_estrazione = inRepID AND
                      esercizio = inEsercizio AND
                      dip_cd_anag = aRecEstrazioneCud.dip_cd_anag;

            ELSE
               UPDATE ESTRAZIONE_CUD
               SET    dip_cognome = aRecEstrazioneCud.dip_cognome,
                      dip_nome = aRecEstrazioneCud.dip_nome,
                      dip_codice_fiscale = aRecEstrazioneCud.dip_codice_fiscale,
                      dip_sesso = aRecEstrazioneCud.dip_sesso,
                      dip_gg_nascita = aRecEstrazioneCud.dip_gg_nascita,
                      dip_mm_nascita = aRecEstrazioneCud.dip_mm_nascita,
                      dip_aa_nascita = aRecEstrazioneCud.dip_aa_nascita,
                      dip_com_nascita = aRecEstrazioneCud.dip_com_nascita,
                      dip_prv_nascita = aRecEstrazioneCud.dip_prv_nascita,
                      dip_com_domfisc = aRecEstrazioneCud.dip_com_domfisc,
                      dip_prv_domfisc = aRecEstrazioneCud.dip_prv_domfisc,
                      dip_cod_com_domfisc = aRecEstrazioneCud.dip_cod_com_domfisc,
                      annotazioni_2 = DECODE(annotazioni_2, NULL,
                                             aRecEstrazioneCud.annotazioni_2,
                                             annotazioni_2 || ' ' || chr(10) || aRecEstrazioneCud.annotazioni_2),
                      fl_applic_aliquota_max = cv_fl_applic_aliquota_max,
                      cnr_posizione_inail = aRecEstrazioneCud.cnr_posizione_inail,
                      dip_cap_domfisc = aRecEstrazioneCud.dip_cap_domfisc,
                      dip_ind_domfisc = cv_via_fiscale
               WHERE  id_estrazione = inRepID AND
                      esercizio = inEsercizio AND
                      dip_cd_anag = aRecEstrazioneCud.dip_cd_anag;

            END IF;

         END;

      END LOOP;

      CLOSE gen_cur;
   END;

   -------------------------------------------------------------------------------------------------
   -- Aggiornamento flag anagrafici su ESTRAZIONE_CUD

   BEGIN

      -- Gestione campo soggetto_estero ------------------------------------------------------------

      UPDATE ESTRAZIONE_CUD A
      SET    A.fl_soggetto_estero = 'Y'
      WHERE  EXISTS
             (SELECT 1
              FROM   ESTRAZIONE_CUD_DETT B
              WHERE  B.id_estrazione = A.id_estrazione AND
                     B.esercizio = A.esercizio AND
                     B.cd_anag = A.dip_cd_anag AND
                     B.fl_ritenuta_non_residenti = 'Y') AND
             A.id_estrazione = inRepID AND
             A.esercizio = inEsercizio;

      -- Recupero informazioni da ANAGRAFICO_ESERCIZIO (NO_TAX_AREA) -------------------------------

      BEGIN

         OPEN gen_cur FOR

              SELECT A.dip_cd_anag,
                     A.esercizio,
                     NVL(B.fl_notaxarea,'N'),
                     Nvl(B.im_reddito_complessivo,0),
                     Nvl(B.im_reddito_abitaz_princ,0)
              FROM   ESTRAZIONE_CUD A, ANAGRAFICO_ESERCIZIO B
              WHERE  A.id_estrazione = inRepID AND
                     A.esercizio = inEsercizio AND
                     B.cd_anag = A.dip_cd_anag AND
                     B.esercizio = A.esercizio;

         LOOP

            FETCH gen_cur INTO
                  aRecEstrazioneCud.dip_cd_anag,
                  aRecEstrazioneCud.esercizio,
                  aRecAnagraficoEsercizio.fl_notaxarea,
                  aRecEstrazioneCud.altri_redditi,
                  aRecEstrazioneCud.reddito_abitaz_princ;

            EXIT WHEN gen_cur%NOTFOUND;

            IF aRecAnagraficoEsercizio.fl_notaxarea = 'Y' THEN

               UPDATE ESTRAZIONE_CUD
               SET    dip_rp_no_tax_area = 'Y',
                      fl_no_applic_deduzione = 'Y'
               WHERE  id_estrazione = inRepID AND
                      esercizio = inEsercizio AND
                      dip_cd_anag = aRecEstrazioneCud.dip_cd_anag AND
                      rigo_cococo = 1;

            END IF;
            UPDATE ESTRAZIONE_CUD
               SET altri_redditi = aRecEstrazioneCud.altri_redditi,
                   reddito_abitaz_princ = aRecEstrazioneCud.reddito_abitaz_princ
               WHERE  id_estrazione = inRepID AND
                      esercizio = inEsercizio AND
                      dip_cd_anag = aRecEstrazioneCud.dip_cd_anag AND
                      rigo_cococo = 1;

         END LOOP;

         CLOSE gen_cur;

      END;

      -- Recupero informazioni di accantonamento delle addizionali territorio ----------------------

      BEGIN

         memCdAnag:=NULL;

         OPEN gen_cur FOR

              SELECT A.dip_cd_anag,
                     A.esercizio,
                     B.cd_classificazione_cori,
                     B.im_da_rateizzare
              FROM   ESTRAZIONE_CUD A, RATEIZZA_CLASSIFIC_CORI B
              WHERE  A.id_estrazione = inRepID AND
                     A.esercizio = inEsercizio AND
                     B.cd_anag = A.dip_cd_anag AND
                     B.esercizio = A.esercizio AND
                     EXISTS
                        (SELECT 1
                         FROM   ESTRAZIONE_CUD_DETT C
                         WHERE  C.id_estrazione = A.id_estrazione AND
                                C.esercizio = A.esercizio AND
                                C.cd_anag = A.dip_cd_anag AND
                                C.cd_cds_conguaglio = B.cd_cds_conguaglio AND
                                C.cd_uo_conguaglio = B.cd_uo_conguaglio AND
                                C.esercizio_conguaglio = B.esercizio AND
                                C.pg_conguaglio = B.pg_conguaglio AND
                                C.fl_ultimo_conguaglio = 'Y')
              UNION ALL
              SELECT A.dip_cd_anag,
                     A.esercizio,
                     B.cd_classificazione_cori,
                     B.im_da_rateizzare
              FROM   ESTRAZIONE_CUD A, RATEIZZA_CLASSIFIC_CORI_S B
              WHERE  A.id_estrazione = 48 AND
                     A.esercizio = 2003 AND
                     B.cd_anag = A.dip_cd_anag AND
                     B.esercizio = A.esercizio AND
                     EXISTS
                        (SELECT 1
                         FROM   ESTRAZIONE_CUD_DETT C
                         WHERE  C.id_estrazione = A.id_estrazione AND
                                C.esercizio = A.esercizio AND
                                C.cd_anag = A.dip_cd_anag AND
                                C.cd_cds_conguaglio = B.cd_cds_conguaglio AND
                                C.cd_uo_conguaglio = B.cd_uo_conguaglio AND
                                C.esercizio_conguaglio = B.esercizio AND
                                C.pg_conguaglio = B.pg_conguaglio AND
                                C.fl_ultimo_conguaglio = 'Y')
              ORDER BY 1;

         LOOP

            FETCH gen_cur INTO
                  aRecEstrazioneCud.dip_cd_anag,
                  aRecEstrazioneCud.esercizio,
                  aRecRateizzaClassificCori.cd_classificazione_cori,
                  aRecRateizzaClassificCori.im_da_rateizzare;

            EXIT WHEN gen_cur%NOTFOUND;

            IF memCdAnag IS NULL THEN
               memCdAnag:=aRecEstrazioneCud.dip_cd_anag;
               aImAddRegRate:=0;
               aImAddComRate:=0;
            END IF;

            IF memCdAnag != aRecEstrazioneCud.dip_cd_anag THEN

               UPDATE ESTRAZIONE_CUD
               SET    add_reg_accantonato = aImAddRegRate,
                      add_com_accantonato = aImAddComRate
               WHERE  id_estrazione = inRepID AND
                      esercizio = inEsercizio AND
                      dip_cd_anag = memCdAnag AND
                      rigo_cococo = 1;

               memCdAnag:=aRecEstrazioneCud.dip_cd_anag;
               aImAddRegRate:=0;
               aImAddComRate:=0;

            END IF;

            IF    aRecRateizzaClassificCori.cd_classificazione_cori = CNRCTB545.isCoriAddReg THEN
                  aImAddRegRate:=aRecRateizzaClassificCori.im_da_rateizzare;
            ELSIF aRecRateizzaClassificCori.cd_classificazione_cori = CNRCTB545.isCoriAddCom THEN
                  aImAddComRate:=aRecRateizzaClassificCori.im_da_rateizzare;
            END IF;

         END LOOP;

         UPDATE ESTRAZIONE_CUD
         SET    add_reg_accantonato = aImAddRegRate,
                add_com_accantonato = aImAddComRate
         WHERE  id_estrazione = inRepID AND
                esercizio = inEsercizio AND
                dip_cd_anag = memCdAnag AND
                rigo_cococo = 1;

         CLOSE gen_cur;
      END;

      -- Recupero informazioni di recupero delle addizionali territorio rateizzate nell'esercizio precedente --

      BEGIN

         memCdAnag:=NULL;

         OPEN gen_cur FOR

              SELECT A.dip_cd_anag,
                     A.esercizio,
                     B.cd_classificazione_cori,
                     B.im_rateizzato
              FROM   ESTRAZIONE_CUD A, RATEIZZA_CLASSIFIC_CORI B
              WHERE  A.id_estrazione = inRepID AND
                     A.esercizio = inEsercizio AND
                     B.cd_anag = A.dip_cd_anag AND
                     B.esercizio = (A.esercizio - 1)
              ORDER BY 1;

         LOOP

            FETCH gen_cur INTO
                  aRecEstrazioneCud.dip_cd_anag,
                  aRecEstrazioneCud.esercizio,
                  aRecRateizzaClassificCori.cd_classificazione_cori,
                  aRecRateizzaClassificCori.im_rateizzato;

            EXIT WHEN gen_cur%NOTFOUND;

            IF memCdAnag IS NULL THEN
               memCdAnag:=aRecEstrazioneCud.dip_cd_anag;
               aImAddRegRate:=0;
               aImAddComRate:=0;
            END IF;

            IF memCdAnag != aRecEstrazioneCud.dip_cd_anag THEN

               UPDATE ESTRAZIONE_CUD
               SET    add_reg_anno_precedente = aImAddRegRate,
                      add_com_anno_precedente = aImAddComRate
               WHERE  id_estrazione = inRepID AND
                      esercizio = inEsercizio AND
                      dip_cd_anag = memCdAnag AND
                      rigo_cococo = 1;

               memCdAnag:=aRecEstrazioneCud.dip_cd_anag;
               aImAddRegRate:=0;
               aImAddComRate:=0;

            END IF;

            IF    aRecRateizzaClassificCori.cd_classificazione_cori = CNRCTB545.isCoriAddReg THEN
                  aImAddRegRate:=aRecRateizzaClassificCori.im_rateizzato;
            ELSIF aRecRateizzaClassificCori.cd_classificazione_cori = CNRCTB545.isCoriAddCom THEN
                  aImAddComRate:=aRecRateizzaClassificCori.im_rateizzato;
            END IF;

         END LOOP;

         UPDATE ESTRAZIONE_CUD
         SET    add_reg_anno_precedente = aImAddRegRate,
                add_com_anno_precedente = aImAddComRate
         WHERE  id_estrazione = inRepID AND
                esercizio = inEsercizio AND
                dip_cd_anag = memCdAnag AND
                rigo_cococo = 1;

         CLOSE gen_cur;
      END;

   END;
End insDatiAnagCud;

-- =================================================================================================
-- Aggiornamento del numero di giorni lavorati in ESTRAZIONI_CUD
-- =================================================================================================
PROCEDURE scriviGiorniLavoro
   (
    inEsercizio NUMBER,
    inRepID INTEGER,
    inUtente VARCHAR2,
    aCdAnag NUMBER
   ) IS

   numeroGG_CREDITO_1_SEM INTEGER;
   numeroGG_CREDITO_2_SEM INTEGER;
   numeroGG INTEGER;
   numeroGGTassep INTEGER;
   aImponibile NUMBER(15,2);
   aPgOrdineAnnotazione INTEGER;
   aPgTipoAnnotazione INTEGER;
   aCdTipologiaRedditoDate VARCHAR2(10);
   aDsTipologiaRedditoDate VARCHAR2(300);

   aDataMinGenerale DATE;
   aDataMaxGenerale DATE;
   aDataMinCococo DATE;
   aDataMaxCococo DATE;
   aDataFineAnno DATE;

   i BINARY_INTEGER;

   DATA_INIZIO_RID_CUNEO DATE;

BEGIN

      DATA_INIZIO_RID_CUNEO := CNRCTB015.getDt01PerChiave('0', 'RIDUZIONE_CUNEO_DL_3_2020', 'DATA_INIZIO');


   -------------------------------------------------------------------------------------------------
   -- Valorizzazione costanti

   aImponibile:=0;
   aPgOrdineAnnotazione:=3;
   aPgTipoAnnotazione:=0;
   aCdTipologiaRedditoDate:='DATE';
   aDsTipologiaRedditoDate:='INTERVALLO DATE';
   aDataFineAnno:=TO_DATE('3112' || inEsercizio,'DDMMYYYY');

   tabella_date_ok.DELETE;
   tabella_date_ok_tutte.DELETE;
   tabella_date_ok_cococo.DELETE;
   tabella_date_ok_tassep.DELETE;

   -- Azzeramento tabella date negative per recupero rate se non ci sono intervalli ordinari

   IF tabella_date.COUNT = 0 THEN
      tabella_date_neg.DELETE;
   END IF;
   If tabella_date_tutte.COUNT = 0 THEN
      tabella_date_tutte_neg.DELETE;
   END IF;
   IF tabella_date_cococo.COUNT = 0 THEN
      tabella_date_neg_cococo.DELETE;
   END IF;
   IF tabella_date_tassep.COUNT = 0 THEN
      tabella_date_neg_tassep.DELETE;
   END IF;


   -------------------------------------------------------------------------------------------------
   -- Normalizzazione delle date per includere il recupero delle rate ed eliminare periodi di eventuale
   -- sovrapposizione

   -- Date compensi
   IF tabella_date.COUNT > 0 THEN
      CNRCTB650.scaricaRecuperoRate(tabella_date,
                                    tabella_date_neg);
      CNRCTB650.normalizzaMatriceDate(tabella_date,
                                      tabella_date_ok);
      CNRCTB650.chkSpuriRecuperoRate(tabella_date_neg);
   END IF;

-- Date tutti i compensi

   IF tabella_date_tutte.COUNT > 0 THEN
      CNRCTB650.scaricaRecuperoRate(tabella_date_tutte,
                                    tabella_date_tutte_neg);
      CNRCTB650.normalizzaMatriceDate(tabella_date_tutte,
                                      tabella_date_ok_tutte);
      CNRCTB650.chkSpuriRecuperoRate(tabella_date_tutte_neg);
   END IF;

   -- Date cococo

   IF tabella_date_cococo.COUNT > 0 THEN
      CNRCTB650.scaricaRecuperoRate(tabella_date_cococo,
                                    tabella_date_neg_cococo);
      CNRCTB650.normalizzaMatriceDate(tabella_date_cococo,
                                      tabella_date_ok_cococo);
      CNRCTB650.chkSpuriRecuperoRate(tabella_date_neg_cococo);
   END IF;

   -- Date tassazione separata

   IF tabella_date_tassep.COUNT > 0 THEN
      CNRCTB650.scaricaRecuperoRate(tabella_date_tassep,
                                    tabella_date_neg_tassep);
      CNRCTB650.normalizzaMatriceDate(tabella_date_tassep,
                                      tabella_date_ok_tassep);
      CNRCTB650.chkSpuriRecuperoRate(tabella_date_neg_tassep);
   END IF;

   -------------------------------------------------------------------------------------------------
   -- Calcolo del numero di giorni lavorativi (preso solo dai compensi non a tassazione separata)
   BEGIN

      numeroGG_CREDITO_1_SEM :=0;
      numeroGG_CREDITO_2_SEM :=0;
      numeroGG:=0;                 -- devo considerare solo i compensi non a tassazione separata

      IF tabella_date_ok.COUNT > 0 THEN

         FOR i IN tabella_date_ok.FIRST .. tabella_date_ok.LAST

         Loop
            -- Calcolo del numero dei giorni
                numeroGG:=(numeroGG + (tabella_date_ok(i).tDataA - tabella_date_ok(i).tDataDa + 1));
         End Loop;

         IF numeroGG > maxGGAnno THEN
            numeroGG:=maxGGAnno;
         END IF;
      END IF;

   END;
   -------------------------------------------------------------------------------------------------
   -- Calcolo della minima e massima data dei compensi ed aggiornamento delle annotazioni (DATE COMPENSI)
   BEGIN

      aDataMinGenerale:=NULL;         -- devo considerare tutti i compensi (anche a tassazione separata)
      aDataMaxGenerale:=NULL;             -- devo considerare tutti i compensi (anche a tassazione separata)

      IF tabella_date_ok_tutte.COUNT > 0 THEN

         FOR i IN tabella_date_ok_tutte.FIRST .. tabella_date_ok_tutte.LAST

         LOOP

            -- Scrittura su tabella ESTRAZIONE_CUD_ANNOTAZIONI degli intervalli temporali considerati

            inserisciCUDAnnotazioni(inRepID,
                                    inEsercizio,
                                    aCdAnag,
                                    aPgOrdineAnnotazione,
                                    aPgTipoAnnotazione,
                                    aCdTipologiaRedditoDate,
                                    tabella_date_ok_tutte(i).tDataDa,
                                    aDsTipologiaRedditoDate,
                                    aImponibile,
                                    tabella_date_ok_tutte(i).tDataA,
                                    inUtente);

            -- Determino intervallo minino e massimo delle date compensi per CNR

            IF aDataMinGenerale IS NULL THEN
               aDataMinGenerale:=tabella_date_ok_tutte(i).tDataDa;
               aDataMaxGenerale:=tabella_date_ok_tutte(i).tDataA;
            ELSE
               IF tabella_date_ok_tutte(i).tDataDa < aDataMinGenerale THEN
                  aDataMinGenerale:=tabella_date_ok_tutte(i).tDataDa;
               END IF;
               IF tabella_date_ok_tutte(i).tDataA > aDataMaxGenerale THEN
                  aDataMaxGenerale:=tabella_date_ok_tutte(i).tDataA;
               END IF;
            END IF;

         END LOOP;

         -- Normalizzazione date generali al 31/12/XXXX

         IF aDataMinGenerale > aDataFineAnno THEN
            aDataMinGenerale:=aDataFineAnno;
         END IF;

         IF aDataMaxGenerale > aDataFineAnno THEN
            aDataMaxGenerale:=aDataFineAnno;
         END IF;

      END IF;

   END;

   -------------------------------------------------------------------------------------------------
   -- Calcolo del numero di giorni lavorativi (DATE COMPENSI A TASSAZIONE SEPARATA)
   /*
   BEGIN
      numeroGGTassep:=0;
      IF tabella_date_ok_tassep.COUNT > 0 THEN
         FOR i IN tabella_date_ok_tassep.FIRST .. tabella_date_ok_tassep.LAST
         LOOP
            -- Calcolo del numero dei giorni
            numeroGGTassep:=(numeroGGTassep + (tabella_date_ok_tassep(i).tDataA - tabella_date_ok_tassep(i).tDataDa + 1));
         END LOOP;
         IF numeroGGTassep > maxGGAnno THEN
            numeroGGTassep:=maxGGAnno;
         END IF;
      END IF;
   END;
   */
   -- Modificato: deve essere il max anno e non il numero di giorni
   BEGIN
      numeroGGTassep:=0;
      IF tabella_date_ok_tassep.COUNT > 0 THEN
         FOR i IN tabella_date_ok_tassep.FIRST .. tabella_date_ok_tassep.LAST
         LOOP
            -- Calcolo L'anno massimo
            If numeroGGTassep = 0 Or numeroGGTassep < To_Char(tabella_date_ok_tassep(i).tDataA,'yyyy') Then
                numeroGGTassep:=To_Char(tabella_date_ok_tassep(i).tDataA,'yyyy');
            End If;
         END LOOP;
         IF numeroGGTassep > inEsercizio Then
            numeroGGTassep:=inEsercizio;
         END IF;
      END IF;
   END;
   -------------------------------------------------------------------------------------------------
   -- Calcolo dell'intervallo minimo e massimo dei cococo (DATE COCOCO)

   BEGIN

      aDataMinCococo:=NULL;
      aDataMaxCococo:=NULL;

      IF tabella_date_ok_cococo.COUNT > 0 THEN

         FOR i IN tabella_date_ok_cococo.FIRST .. tabella_date_ok_cococo.LAST

         LOOP

            IF aDataMinCococo IS NULL THEN
               aDataMinCococo:=tabella_date_ok_cococo(i).tDataDa;
               aDataMaxCococo:=tabella_date_ok_cococo(i).tDataA;
            ELSE
               IF tabella_date_ok_cococo(i).tDataDa < aDataMinCococo THEN
                  aDataMinCococo:=tabella_date_ok_cococo(i).tDataDa;
               END IF;
               IF tabella_date_ok_cococo(i).tDataA > aDataMaxCococo THEN
                  aDataMaxCococo:=tabella_date_ok_cococo(i).tDataA;
               END IF;
            END IF;

         END LOOP;

         -- Normalizzazione date cococo al 31/12/XXXX

         IF aDataMinCococo > aDataFineAnno THEN
            aDataMinCococo:=aDataFineAnno;
         END IF;

         IF aDataMaxCococo > aDataFineAnno THEN
            aDataMaxCococo:=aDataFineAnno;
         END IF;

      END IF;

   END;

   -------------------------------------------------------------------------------------------------
   -- Aggiornamento estrazione CUD

   BEGIN

      UPDATE ESTRAZIONE_CUD
      SET    gg_periodo_lavoro = numeroGG,
             gg_periodo_lavoro_sem1 = numeroGG_CREDITO_1_SEM,
             gg_periodo_lavoro_sem2 = numeroGG_CREDITO_2_SEM,
             dt_inizio_cococo = aDataMinCococo,
             dt_fine_cococo = aDataMaxCococo,
             cnr_data_assunzione = aDataMinGenerale,
             cnr_data_cessazione = aDataMaxGenerale
      WHERE  id_estrazione = inRepID AND
             esercizio = inEsercizio AND
             dip_cd_anag = aCdAnag AND
             rigo_cococo = 1;

   END;

END scriviGiorniLavoro;

-- =================================================================================================
-- Calcolo del numero di giorni di riferimento
-- =================================================================================================
PROCEDURE calcolaGiorniLavoro
   (
    inEsercizio NUMBER,
    inRepID INTEGER,
    inUtente VARCHAR2
   ) IS

   retCode INTEGER;
   scritto CHAR(1);
   dataDa DATE;
   dataA DATE;
   memCdAnag ESTRAZIONE_CUD_DETT.cd_anag%TYPE;

   i BINARY_INTEGER;
   k BINARY_INTEGER;

   aRecEstrazioneCud ESTRAZIONE_CUD%ROWTYPE;
   aRecEstrazioneCudDett ESTRAZIONE_CUD_DETT%ROWTYPE;

   gen_cur GenericCurTyp;

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Calcolo ed aggiornamento del periodo di lavoro in giorni su ESTRAZIONE_CUD

   BEGIN

      -- Calcolo il numero massimo di giorni per un dato esercizio

      maxGGAnno:=IBMUTL001.getDaysBetween(TO_DATE('0101' || inEsercizio,'DDMMYYYY'),
                                          TO_DATE('3112' || inEsercizio,'DDMMYYYY'));

      If maxGGAnno > 365 Then
           maxGGAnno := 365;
      End If;

      -- Azzeramento variabili

      memCdAnag:=NULL;


      -- Apertura cursore e determinazione degli intervalli date di lavoro a parità di codice e tipo anagrafico

      OPEN gen_cur FOR

           SELECT cd_anag,
                  fl_cococo,
                  fl_recupero_rate,
                  fl_tassazione_separata,
                  fl_compenso_missione,
                  im_redd_non_tassati_per_conv,
                  im_redd_esenti_per_legge,
                  fl_ritenuta_non_residenti,
                  DECODE(fl_detrazioni, 'Y', dt_cmp_da_compenso, Decode(cd_trattamento,'T098',dt_cmp_da_compenso,Null)),
                  DECODE(fl_detrazioni, 'Y', dt_cmp_a_compenso, Decode(cd_trattamento,'T098',dt_cmp_a_compenso,Null)),
                  DECODE(fl_ultimo_conguaglio, 'Y', dt_cmp_da_esterno, NULL),
                  DECODE(fl_ultimo_conguaglio, 'Y', dt_cmp_a_esterno, NULL)
           FROM   ESTRAZIONE_CUD_DETT
           WHERE  id_estrazione = inRepID AND
                  esercizio = inEsercizio
           ORDER BY cd_anag;

      LOOP

         FETCH gen_cur INTO
               aRecEstrazioneCudDett.cd_anag,
               aRecEstrazioneCudDett.fl_cococo,
               aRecEstrazioneCudDett.fl_recupero_rate,
               aRecEstrazioneCudDett.fl_tassazione_separata,
               aRecEstrazioneCudDett.fl_compenso_missione,
               aRecEstrazioneCudDett.im_redd_non_tassati_per_conv,
               aRecEstrazioneCudDett.im_redd_esenti_per_legge,
               aRecEstrazioneCudDett.fl_ritenuta_non_residenti,
               aRecEstrazioneCudDett.dt_cmp_da_compenso,
               aRecEstrazioneCudDett.dt_cmp_a_compenso,
               aRecEstrazioneCudDett.dt_cmp_da_esterno,
               aRecEstrazioneCudDett.dt_cmp_a_esterno;

         EXIT WHEN gen_cur%NOTFOUND;

         -- E' la prima volta che leggo un record dalla fetch

         IF memCdAnag IS NULL THEN
            tabella_date.DELETE;
            tabella_date_neg.DELETE;
            tabella_date_tutte.DELETE;
            tabella_date_tutte_neg.DELETE;
            tabella_date_cococo.DELETE;
            tabella_date_neg_cococo.DELETE;
            tabella_date_tassep.DELETE;
            tabella_date_neg_tassep.DELETE;
            i:=0;
            memCdAnag:=aRecEstrazioneCudDett.cd_anag;
         END IF;

         -- I riferimenti anagrafici letti sono diversi da quelli precedenti.
         -- Scarico il numero di giorni e lo aggiorno in ESTRAZIONE_CUD.
         -- Si azzera la tabella di riferimento delle date lavorate per riferimento anagrafico

         IF memCdAnag != aRecEstrazioneCudDett.cd_anag THEN

            scriviGiorniLavoro(inEsercizio,
                               inRepID,
                               inUtente,
                               memCdAnag);

            tabella_date.DELETE;
            tabella_date_neg.DELETE;
            tabella_date_tutte.DELETE;
            tabella_date_tutte_neg.DELETE;
            tabella_date_cococo.DELETE;
            tabella_date_neg_cococo.DELETE;
            tabella_date_tassep.DELETE;
            tabella_date_neg_tassep.DELETE;

            i:=0;
            memCdAnag:=aRecEstrazioneCudDett.cd_anag;

         END IF;

         -- Aggiornamento della tabella di memorizzazione delle date lavorate

         FOR j IN 1 .. 2

         LOOP

            IF j = 1 THEN
               dataDa:= aRecEstrazioneCudDett.dt_cmp_da_compenso;
               dataA:= aRecEstrazioneCudDett.dt_cmp_a_compenso;
            ELSE
               dataDa:= aRecEstrazioneCudDett.dt_cmp_da_esterno;
               dataA:=aRecEstrazioneCudDett.dt_cmp_a_esterno;
            END IF;

            IF dataDa IS NOT NULL THEN
               IF aRecEstrazioneCudDett.fl_recupero_rate= 'N' THEN
                  IF aRecEstrazioneCudDett.fl_tassazione_separata = 'Y' THEN
                     If (aRecEstrazioneCudDett.fl_compenso_missione = 'N' and
                         aRecEstrazioneCudDett.im_redd_non_tassati_per_conv = 0 and
                         aRecEstrazioneCudDett.im_redd_esenti_per_legge = 0 and
                         aRecEstrazioneCudDett.fl_ritenuta_non_residenti = 'N') then
                        CNRCTB545.componiMatriceDate(tabella_date_tassep,
                                                     dataDa,
                                                     dataA,
                                                     'N',
                                                     'Y');

                        CNRCTB545.componiMatriceDate(tabella_date_tutte,
                                                     dataDa,
                                                     dataA,
                                                     'N',
                                                     'Y');
                     End If;
                  ELSE
                     If (aRecEstrazioneCudDett.fl_compenso_missione = 'N' and
                         aRecEstrazioneCudDett.im_redd_non_tassati_per_conv = 0 and
                         aRecEstrazioneCudDett.im_redd_esenti_per_legge = 0 and
                         aRecEstrazioneCudDett.fl_ritenuta_non_residenti = 'N') then
                        CNRCTB545.componiMatriceDate(tabella_date,
                                                     dataDa,
                                                     dataA,
                                                     'N',
                                                     'Y');

                        CNRCTB545.componiMatriceDate(tabella_date_tutte,
                                                     dataDa,
                                                     dataA,
                                                     'N',
                                                     'Y');
                     End If;
                     IF aRecEstrazioneCudDett.fl_cococo = 'Y' THEN
                        CNRCTB545.componiMatriceDate(tabella_date_cococo,
                                                     dataDa,
                                                     dataA,
                                                     'N',
                                                     'Y');
                     END IF;
                  END IF;
               Else
--pipe.send_message('aRecEstrazioneCudDett.cd_anag = '||aRecEstrazioneCudDett.cd_anag);
                  IF aRecEstrazioneCudDett.fl_tassazione_separata = 'Y' THEN
                     If (aRecEstrazioneCudDett.fl_compenso_missione = 'N' and
                         aRecEstrazioneCudDett.im_redd_non_tassati_per_conv = 0 and
                         aRecEstrazioneCudDett.im_redd_esenti_per_legge = 0 and
                         aRecEstrazioneCudDett.fl_ritenuta_non_residenti = 'N') then
                        CNRCTB545.componiMatriceDate(tabella_date_neg_tassep,
                                                     dataDa,
                                                     dataA,
                                                     'N',
                                                     'Y');

                        CNRCTB545.componiMatriceDate(tabella_date_tutte_neg,
                                                     dataDa,
                                                     dataA,
                                                     'N',
                                                     'Y');
                     End If;
                  ELSE
                     If (aRecEstrazioneCudDett.fl_compenso_missione = 'N' and
                         aRecEstrazioneCudDett.im_redd_non_tassati_per_conv = 0 and
                         aRecEstrazioneCudDett.im_redd_esenti_per_legge = 0 and
                         aRecEstrazioneCudDett.fl_ritenuta_non_residenti = 'N') then
                        CNRCTB545.componiMatriceDate(tabella_date_neg,
                                                     dataDa,
                                                     dataA,
                                                     'N',
                                                     'Y');

                        CNRCTB545.componiMatriceDate(tabella_date_tutte_neg,
                                                     dataDa,
                                                     dataA,
                                                     'N',
                                                     'Y');
                     End If;
                     IF aRecEstrazioneCudDett.fl_cococo = 'Y' THEN
                        CNRCTB545.componiMatriceDate(tabella_date_neg_cococo,
                                                     dataDa,
                                                     dataA,
                                                     'N',
                                                     'Y');
                     END IF;
                  END IF;
               END IF;
            END IF;

         END LOOP;

      END LOOP;

      scriviGiorniLavoro(inEsercizio,
                         inRepID,
                         inUtente,
                         memCdAnag);

      CLOSE gen_cur;

   END;

END calcolaGiorniLavoro;

-- =================================================================================================
-- Inserimento dati annotazioni in ESTRAZIONE_CUD
-- =================================================================================================
PROCEDURE insDatiAnnotazioniCud
   (
    inEsercizio VARCHAR2,
    inRepID INTEGER
   ) IS

   memAnnotazione ESTRAZIONE_CUD.annotazioni_1%TYPE;
   memAnnotazioneDate ESTRAZIONE_CUD.annotazioni_1%TYPE;

   scrittoArt1 CHAR(1);
   scrittoArt2 CHAR(1);
   scrittoPeriodoGG CHAR(1);
   aDataDaTmp DATE;
   aDataATmp DATE;
   imDeduzione1 NUMBER(15,2);
   imDeduzione2 NUMBER(15,2);
   aStringaImporto VARCHAR2(50);
   aStringaImporto1 VARCHAR2(50);
   aTrnslFrom VARCHAR2(50);
   aTrnslTo VARCHAR2(50);

   aRecEstrazioneCud ESTRAZIONE_CUD%ROWTYPE;
   aRecEstrazioneCudAnnotaz ESTRAZIONE_CUD_ANNOTAZIONI%ROWTYPE;

   gen_cur GenericCurTyp;
   gen_cur_a GenericCurTyp;

BEGIN

   aTrnslFrom:='0123456789,.';
   aTrnslTo:='0123456789.,';

   -------------------------------------------------------------------------------------------------
   -- Ciclo principale di recupero delle annotazioni recupero dati di ESTRAZIONE_CUD

   BEGIN

      OPEN gen_cur FOR

           SELECT dip_cd_anag,
                  dip_rp_reddito_complessivo,
                  dip_rp_no_tax_area,
                  dip_rp_deduzione_fissa_intera,
                  fl_applic_aliquota_max,
                  fl_no_applic_deduzione,
                  gg_periodo_lavoro,
                  deduzione_dovuta,
                  imponibile_si_detr,
                  imponibile_no_detr,
                  addizionale_regionale,
                  addizionale_comunale,
                  fl_soggetto_estero
           FROM   ESTRAZIONE_CUD
           WHERE  id_estrazione = inRepID AND
                  esercizio = inEsercizio;

      LOOP

         FETCH gen_cur INTO
               aRecEstrazioneCud.dip_cd_anag,
               aRecEstrazioneCud.dip_rp_reddito_complessivo,
               aRecEstrazioneCud.dip_rp_no_tax_area,
               aRecEstrazioneCud.dip_rp_deduzione_fissa_intera,
               aRecEstrazioneCud.fl_applic_aliquota_max,
               aRecEstrazioneCud.fl_no_applic_deduzione,
               aRecEstrazioneCud.gg_periodo_lavoro,
               aRecEstrazioneCud.deduzione_dovuta,
               aRecEstrazioneCud.imponibile_si_detr,
               aRecEstrazioneCud.imponibile_no_detr,
               aRecEstrazioneCud.addizionale_regionale,
               aRecEstrazioneCud.addizionale_comunale,
               aRecEstrazioneCud.fl_soggetto_estero;

         EXIT WHEN gen_cur%NOTFOUND;

         memAnnotazione:=NULL;
         scrittoArt1:='N';
         scrittoArt2:='N';
         scrittoPeriodoGG:='N';
         memAnnotazioneDate:=NULL;
         aDataDaTmp:=NULL;
         aDataATmp:=NULL;
         imDeduzione1:=0;
         imDeduzione2:=0;

         -- Annotazioni per tipologia reddito ---------------------------------------------------

         BEGIN

            OPEN gen_cur_a FOR

                 SELECT *
                 FROM   ESTRAZIONE_CUD_ANNOTAZIONI
                 WHERE  id_estrazione = inRepID AND
                        esercizio = inEsercizio AND
                        dip_cd_anag = aRecEstrazioneCud.dip_cd_anag AND
                        pg_ordine_annotazione = 1
                 ORDER BY pg_tipo_annotazione,
                          cd_tipologia_reddito;

            LOOP

               FETCH gen_cur_a INTO
                     aRecEstrazioneCudAnnotaz;

               EXIT WHEN gen_cur_a%NOTFOUND;

               IF aRecEstrazioneCudAnnotaz.pg_tipo_annotazione = 1 THEN
                  IF scrittoArt1 = 'N' THEN
                     scrittoArt1:= 'Y';
                     memAnnotazione:=memAnnotazione ||
                                     'L''importo indicato al punto 1 della parte B dati fiscali è così composto: ' || CHR(10);
                  END IF;
                  aStringaImporto:=LTRIM(TO_CHAR(aRecEstrazioneCudAnnotaz.imponibile,'9999G999G999G999D99'));
                  IF LENGTH(aStringaImporto) - INSTR(aStringaImporto,',',-1) != 2 THEN
                     aStringaImporto:=TRANSLATE(aStringaImporto,aTrnslFrom,aTrnslTo);
                  END IF;
                  IF LENGTH(aStringaImporto) = 3 THEN
                     aStringaImporto:='0' || aStringaImporto;
                  END IF;
                  memAnnotazione:=memAnnotazione || 'Redditi per ' || aRecEstrazioneCudAnnotaz.ds_tipologia_reddito ||
                                  ' euro ' || aStringaImporto || CHR(10);

               ELSE
                  IF scrittoArt2 = 'N' THEN
                     scrittoArt2:= 'Y';
                     memAnnotazione:=memAnnotazione ||
                                     'L''importo indicato al punto 2 della parte B dati fiscali è così composto: ' || CHR(10);
                  END IF;
                  aStringaImporto:=LTRIM(TO_CHAR(aRecEstrazioneCudAnnotaz.imponibile,'9999G999G999G999D99'));
                  IF LENGTH(aStringaImporto) - INSTR(aStringaImporto,',',-1) != 2 THEN
                     aStringaImporto:=TRANSLATE(aStringaImporto,aTrnslFrom,aTrnslTo);
                  END IF;
                  IF LENGTH(aStringaImporto) = 3 THEN
                     aStringaImporto:='0' || aStringaImporto;
                  END IF;
                  memAnnotazione:=memAnnotazione || 'Redditi per ' || aRecEstrazioneCudAnnotaz.ds_tipologia_reddito ||
                                  ' euro ' || aStringaImporto || CHR(10);
               END IF;

            END LOOP;

            CLOSE gen_cur_a;

         END;

         -- Annotazioni per gestiona aliquota_max -----------------------------------------------

         BEGIN

            IF aRecEstrazioneCud.fl_applic_aliquota_max = 'Y' THEN
               memAnnotazione:=memAnnotazione || parametri_tab(13).stringa || CHR(10);
            END IF;

         END;

         -- Annotazioni per intervallo date giorni lavoro ---------------------------------------

         BEGIN

            IF (aRecEstrazioneCud.gg_periodo_lavoro < maxGGAnno AND
                aRecEstrazioneCud.gg_periodo_lavoro != 0 ) THEN

               OPEN gen_cur_a FOR

                    SELECT *
                    FROM   ESTRAZIONE_CUD_ANNOTAZIONI
                    WHERE  id_estrazione = inRepID AND
                           esercizio = inEsercizio AND
                           dip_cd_anag = aRecEstrazioneCud.dip_cd_anag AND
                           pg_ordine_annotazione = 3
                    ORDER BY data_rif_da;

               LOOP

                  FETCH gen_cur_a INTO
                        aRecEstrazioneCudAnnotaz;

                  EXIT WHEN gen_cur_a%NOTFOUND;

                  -- E' la prima volta che leggo un intervallo temporale

                  IF scrittoPeriodoGG = 'N' THEN
                     scrittoPeriodoGG:= 'Y';
                     memAnnotazione:=memAnnotazione || parametri_tab(17).stringa || CHR(10);
                     aDataDaTmp:=aRecEstrazioneCudAnnotaz.data_rif_da;
                     aDataATmp:=aRecEstrazioneCudAnnotaz.data_rif_a;
                  ELSE

                     -- Controllo intervalli temporali contigui

                     IF aRecEstrazioneCudAnnotaz.data_rif_da = aDataATmp + 1 THEN
                        aDataATmp:=aRecEstrazioneCudAnnotaz.data_rif_a;
                     ELSE
                        IF memAnnotazioneDate IS NULL THEN
                           memAnnotazioneDate:=memAnnotazioneDate || 'Dal ' || TO_CHAR(aDataDaTmp,'DD/MM/YYYY') ||
                                              ' Al ' || TO_CHAR(aDataATmp,'DD/MM/YYYY');
                           aDataDaTmp:=aRecEstrazioneCudAnnotaz.data_rif_da;
                           aDataATmp:=aRecEstrazioneCudAnnotaz.data_rif_a;
                        ELSE
                           memAnnotazioneDate:=memAnnotazioneDate || ', Dal ' || TO_CHAR(aDataDaTmp,'DD/MM/YYYY') ||
                                               ' Al ' || TO_CHAR(aDataATmp,'DD/MM/YYYY');
                           aDataDaTmp:=aRecEstrazioneCudAnnotaz.data_rif_da;
                           aDataATmp:=aRecEstrazioneCudAnnotaz.data_rif_a;
                        END IF;
                     END IF;
                  END IF;

               END LOOP;

               CLOSE gen_cur_a;

               -- Scrittura ultimo record tmp delle annotazioni date

               IF memAnnotazioneDate IS NULL THEN
                  memAnnotazioneDate:=memAnnotazioneDate || 'Dal ' || TO_CHAR(aDataDaTmp,'DD/MM/YYYY') ||
                                      ' Al ' || TO_CHAR(aDataATmp,'DD/MM/YYYY');
               ELSE
                  memAnnotazioneDate:=memAnnotazioneDate || ', Dal ' || TO_CHAR(aDataDaTmp,'DD/MM/YYYY') ||
                                      ' Al ' || TO_CHAR(aDataATmp,'DD/MM/YYYY');
               END IF;

               memAnnotazione:=memAnnotazione || memAnnotazioneDate || CHR(10);

            END IF;

         END;

         -- Annotazioni per gestione deduzione --------------------------------------------------

         BEGIN

            IF aRecEstrazioneCud.deduzione_dovuta != 0 THEN

               IF aRecEstrazioneCud.dip_rp_deduzione_fissa_intera = 'N' THEN

                  imDeduzione1:=ROUND((aRecEstrazioneCud.deduzione_dovuta * 40 / 100),2);
                  imDeduzione2:=aRecEstrazioneCud.deduzione_dovuta - imDeduzione1;

                  aStringaImporto:=LTRIM(TO_CHAR(imDeduzione1,'9999G999G999G999D99'));
                  IF LENGTH(aStringaImporto) - INSTR(aStringaImporto,',',-1) != 2 THEN
                     aStringaImporto:=TRANSLATE(aStringaImporto,aTrnslFrom,aTrnslTo);
                  END IF;
                  IF LENGTH(aStringaImporto) = 3 THEN
                     aStringaImporto:='0' || aStringaImporto;
                  END IF;
                  aStringaImporto1:=LTRIM(TO_CHAR(imDeduzione2,'9999G999G999G999D99'));
                  IF LENGTH(aStringaImporto1) - INSTR(aStringaImporto1,',',-1) != 2 THEN
                     aStringaImporto1:=TRANSLATE(aStringaImporto1,aTrnslFrom,aTrnslTo);
                  END IF;
                  IF LENGTH(aStringaImporto1) = 3 THEN
                     aStringaImporto1:='0' || aStringaImporto1;
                  END IF;

                  memAnnotazione:=memAnnotazione ||
                                  parametri_tab(18).stringa || aStringaImporto ||
                                  parametri_tab(19).stringa || aStringaImporto1 || CHR(10);

               ELSE

                  IF aRecEstrazioneCud.deduzione_dovuta > 3000 THEN
                     imDeduzione1:=3000;
                     imDeduzione2:=aRecEstrazioneCud.deduzione_dovuta - imDeduzione1;
                  ELSE
                     imDeduzione1:=aRecEstrazioneCud.deduzione_dovuta;
                     imDeduzione2:=0;
                  END IF;

                  aStringaImporto:=LTRIM(TO_CHAR(imDeduzione1,'9999G999G999G999D99'));
                  IF LENGTH(aStringaImporto) - INSTR(aStringaImporto,',',-1) != 2 THEN
                     aStringaImporto:=TRANSLATE(aStringaImporto,aTrnslFrom,aTrnslTo);
                  END IF;
                  IF LENGTH(aStringaImporto) = 3 THEN
                     aStringaImporto:='0' || aStringaImporto;
                  END IF;
                  aStringaImporto1:=LTRIM(TO_CHAR(imDeduzione2,'9999G999G999G999D99'));
                  IF LENGTH(aStringaImporto1) - INSTR(aStringaImporto1,',',-1) != 2 THEN
                     aStringaImporto1:=TRANSLATE(aStringaImporto1,aTrnslFrom,aTrnslTo);
                  END IF;
                  IF LENGTH(aStringaImporto1) = 3 THEN
                     aStringaImporto1:='0' || aStringaImporto1;
                  END IF;

                  memAnnotazione:=memAnnotazione ||
                                  parametri_tab(20).stringa || aStringaImporto ||
                                  parametri_tab(21).stringa || aStringaImporto1 || CHR(10);

               END IF;

            END IF;

         END;

         -- Annotazioni per gestione reddito complessivo ----------------------------------------

         BEGIN

            IF aRecEstrazioneCud.dip_rp_reddito_complessivo >
               (aRecEstrazioneCud.imponibile_si_detr + aRecEstrazioneCud.imponibile_no_detr) THEN

               aStringaImporto:=LTRIM(TO_CHAR(aRecEstrazioneCud.dip_rp_reddito_complessivo,'9999G999G999G999D99'));
               IF LENGTH(aStringaImporto) - INSTR(aStringaImporto,',',-1) != 2 THEN
                  aStringaImporto:=TRANSLATE(aStringaImporto,aTrnslFrom,aTrnslTo);
               END IF;
               IF LENGTH(aStringaImporto) = 3 THEN
                  aStringaImporto:='0' || aStringaImporto;
               END IF;

               memAnnotazione:=memAnnotazione || parametri_tab(22).stringa || aStringaImporto || CHR(10);

            END IF;

         END;

         -- Annotazioni per gestione soggetto estero --------------------------------------------

         BEGIN

            IF aRecEstrazioneCud.fl_soggetto_estero = 'Y' THEN

               memAnnotazione:=memAnnotazione || parametri_tab(16).stringa || CHR(10);

            END IF;

         END;

         -- Annotazioni per gestione addizionali regionali e comunali ---------------------------

         BEGIN

            IF (aRecEstrazioneCud.addizionale_regionale != 0 OR
                aRecEstrazioneCud.addizionale_comunale != 0) THEN

               IF (aRecEstrazioneCud.add_reg_accantonato = 0 AND
                   aRecEstrazioneCud.add_com_accantonato = 0) THEN
                  memAnnotazione:=memAnnotazione || parametri_tab(14).stringa || CHR(10);
               END IF;

            END IF;

         END;

         -- Aggiornamento attributo annotazioni_1 di ESTRAZIONE_CUD -----------------------------

         BEGIN

            UPDATE ESTRAZIONE_CUD
            SET    annotazioni_1 = memAnnotazione
            WHERE  id_estrazione = inRepID AND
                   esercizio = inEsercizio AND
                   dip_cd_anag = aRecEstrazioneCud.dip_cd_anag AND
                   rigo_cococo = 1;

         END;

      END LOOP;

      CLOSE gen_cur;

   END;

END insDatiAnnotazioniCud;

-- =================================================================================================
-- Determino la tipologia di reddito principale per CNR
-- =================================================================================================
PROCEDURE calcolaTipologiaReddito
   (
    inEsercizio VARCHAR2,
    inRepID INTEGER
   ) IS

   memImponibile1 NUMBER(15,2);
   memImponibile2 NUMBER(15,2);

   aRecEstrazioneCud ESTRAZIONE_CUD%ROWTYPE;
   aRecEstrazioneCudAnnotaz ESTRAZIONE_CUD_ANNOTAZIONI%ROWTYPE;

   gen_cur GenericCurTyp;
   gen_cur_a GenericCurTyp;

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Ciclo principale di recupero delle annotazioni recupero dati di ESTRAZIONE_CUD

   BEGIN

      OPEN gen_cur FOR

           SELECT dip_cd_anag,
                  dip_rp_reddito_complessivo,
                  dip_rp_no_tax_area,
                  dip_rp_deduzione_fissa_intera,
                  fl_applic_aliquota_max,
                  fl_no_applic_deduzione,
                  deduzione_dovuta,
                  imponibile_si_detr,
                  imponibile_no_detr
           FROM   ESTRAZIONE_CUD
           WHERE  id_estrazione = inRepID AND
                  esercizio = inEsercizio;

      LOOP

         FETCH gen_cur INTO
               aRecEstrazioneCud.dip_cd_anag,
               aRecEstrazioneCud.dip_rp_reddito_complessivo,
               aRecEstrazioneCud.dip_rp_no_tax_area,
               aRecEstrazioneCud.dip_rp_deduzione_fissa_intera,
               aRecEstrazioneCud.fl_applic_aliquota_max,
               aRecEstrazioneCud.fl_no_applic_deduzione,
               aRecEstrazioneCud.deduzione_dovuta,
               aRecEstrazioneCud.imponibile_si_detr,
               aRecEstrazioneCud.imponibile_no_detr;

         EXIT WHEN gen_cur%NOTFOUND;

         aRecEstrazioneCud.cnr_tipologia_reddito_punto_1:=NULL;
         aRecEstrazioneCud.cnr_tempo_determinato:='001';
         aRecEstrazioneCud.cnr_tipologia_reddito_punto_2:=NULL;
         aRecEstrazioneCud.cnr_deduzione_fissa_3000:=0;
         aRecEstrazioneCud.cnr_deduzione_fissa_4500:=0;
         memImponibile1:=0;
         memImponibile2:=0;

         -- Calcola tipologia di reddito --------------------------------------------------------

         BEGIN

            OPEN gen_cur_a FOR

                 SELECT *
                 FROM   ESTRAZIONE_CUD_ANNOTAZIONI
                 WHERE  id_estrazione = inRepID AND
                        esercizio = inEsercizio AND
                        dip_cd_anag = aRecEstrazioneCud.dip_cd_anag AND
                        pg_ordine_annotazione = 1
                 ORDER BY pg_tipo_annotazione,
                          cd_tipologia_reddito;

            LOOP

               FETCH gen_cur_a INTO
                     aRecEstrazioneCudAnnotaz;

               EXIT WHEN gen_cur_a%NOTFOUND;

               IF aRecEstrazioneCudAnnotaz.pg_tipo_annotazione = 1 THEN
                  IF ABS(aRecEstrazioneCudAnnotaz.imponibile) > memImponibile1 THEN
                     aRecEstrazioneCud.cnr_tipologia_reddito_punto_1:=aRecEstrazioneCudAnnotaz.cd_tipologia_reddito;
                     memImponibile1:=ABS(aRecEstrazioneCudAnnotaz.imponibile);
                  END IF;
               ELSE
                  IF ABS(aRecEstrazioneCudAnnotaz.imponibile) > memImponibile2 THEN
                     aRecEstrazioneCud.cnr_tipologia_reddito_punto_2:=aRecEstrazioneCudAnnotaz.cd_tipologia_reddito;
                     memImponibile2:=ABS(aRecEstrazioneCudAnnotaz.imponibile);
                  END IF;
               END IF;

            END LOOP;

            CLOSE gen_cur_a;

         END;

         -- Gestione deduzione ------------------------------------------------------------------

         BEGIN

            IF aRecEstrazioneCud.deduzione_dovuta != 0 THEN

               -- Se esistono solo imponibili per puto 2 tutto è sempre gestito nelle 3000

               IF (aRecEstrazioneCud.imponibile_si_detr = 0 AND
                   aRecEstrazioneCud.imponibile_no_detr != 0) THEN

                  IF aRecEstrazioneCud.deduzione_dovuta > 3000 THEN
                     aRecEstrazioneCud.cnr_deduzione_fissa_3000:=3000;
                     aRecEstrazioneCud.cnr_deduzione_fissa_4500:=aRecEstrazioneCud.deduzione_dovuta -
                                                                 aRecEstrazioneCud.cnr_deduzione_fissa_3000;
                  ELSE
                     aRecEstrazioneCud.cnr_deduzione_fissa_3000:=aRecEstrazioneCud.deduzione_dovuta;
                     aRecEstrazioneCud.cnr_deduzione_fissa_4500:=0;
                  END IF;

               -- Esistono imponibili per punto 1

               ELSE

                  IF aRecEstrazioneCud.dip_rp_deduzione_fissa_intera = 'N' THEN

                     aRecEstrazioneCud.cnr_deduzione_fissa_3000:=ROUND((aRecEstrazioneCud.deduzione_dovuta * 40 / 100),2);
                     aRecEstrazioneCud.cnr_deduzione_fissa_4500:=aRecEstrazioneCud.deduzione_dovuta -
                                                                 aRecEstrazioneCud.cnr_deduzione_fissa_3000;

                  ELSE

                     IF aRecEstrazioneCud.deduzione_dovuta > 3000 THEN
                        aRecEstrazioneCud.cnr_deduzione_fissa_3000:=3000;
                        aRecEstrazioneCud.cnr_deduzione_fissa_4500:=aRecEstrazioneCud.deduzione_dovuta -
                                                                    aRecEstrazioneCud.cnr_deduzione_fissa_3000;
                     ELSE
                        aRecEstrazioneCud.cnr_deduzione_fissa_3000:=aRecEstrazioneCud.deduzione_dovuta;
                        aRecEstrazioneCud.cnr_deduzione_fissa_4500:=0;
                     END IF;

                  END IF;

               END IF;

            END IF;

         END;

         -- Aggiornamento attributi CNR di ESTRAZIONE_CUD ---------------------------------------

         BEGIN

            UPDATE ESTRAZIONE_CUD
            SET    cnr_tipologia_reddito_punto_1 = aRecEstrazioneCud.cnr_tipologia_reddito_punto_1,
                   cnr_tempo_determinato = aRecEstrazioneCud.cnr_tempo_determinato,
                   cnr_tipologia_reddito_punto_2 = aRecEstrazioneCud.cnr_tipologia_reddito_punto_2,
                   cnr_deduzione_fissa_3000 = aRecEstrazioneCud.cnr_deduzione_fissa_3000,
                   cnr_deduzione_fissa_4500 = aRecEstrazioneCud.cnr_deduzione_fissa_4500
            WHERE  id_estrazione = inRepID AND
                   esercizio = inEsercizio AND
                   dip_cd_anag = aRecEstrazioneCud.dip_cd_anag AND
                   rigo_cococo = 1;

         END;

      END LOOP;

      CLOSE gen_cur;

   END;

END calcolaTipologiaReddito;

-- =================================================================================================
-- Determino l'acconto per l'addizionale comunale
-- =================================================================================================
PROCEDURE calcolaAccontoAddCom
   (
    inEsercizio VARCHAR2,
    inRepID INTEGER
   ) IS

   acconto_es_suc            NUMBER(15,2):=0;
   cod_com_acc_es_suc        VARCHAR2(10);
   pg_com_acc_es_suc         NUMBER(10);
   data_acc_es_suc           DATE;
   esenzione_add_com_es_suc  NUMBER(15,2):=0;
   acconto_es                NUMBER(15,2):=0;
   cod_com_acc_es            VARCHAR2(10);
   esenzione_add_com_saldo   NUMBER(15,2):=0;
   data_ultimo_cong          DATE;
   pg_com_domfisc            NUMBER(10);

   aRecEstrazioneCud ESTRAZIONE_CUD%ROWTYPE;

   gen_cur GenericCurTyp;

BEGIN

   BEGIN
      OPEN gen_cur FOR

           SELECT dip_cd_anag, dip_cod_com_domfisc
           FROM   ESTRAZIONE_CUD
           WHERE  id_estrazione = inRepID AND
                  esercizio = inEsercizio;
      LOOP
         FETCH gen_cur INTO
               aRecEstrazioneCud.dip_cd_anag,
               aRecEstrazioneCud.dip_cod_com_domfisc;

         EXIT WHEN gen_cur%NOTFOUND;
         --Prendo l'acconto calcolato per l'esercizio successivo
       Begin
             Select Nvl(a.im_acconto_calcolato,0), c.cd_catastale, a.pg_comune, a.dacr
             Into acconto_es_suc, cod_com_acc_es_suc, pg_com_acc_es_suc, data_acc_es_suc
             From acconto_classific_cori a, comune c
             Where a.pg_comune = c.pg_comune
               And a.esercizio = inEsercizio+1
               And a.cd_anag = aRecEstrazioneCud.dip_cd_anag
               And a.cd_classificazione_cori = CNRCTB545.isCoriAddCom;
         Exception
             When No_Data_Found Then
                acconto_es_suc := 0;
                cod_com_acc_es_suc := aRecEstrazioneCud.dip_cod_com_domfisc;
                Begin
                  Select pg_comune
                  Into pg_com_acc_es_suc
                  From comune
                  Where cd_catastale = cod_com_acc_es_suc
                    And ti_italiano_estero = 'I';
                Exception
                    When No_Data_Found Then
                        pg_com_acc_es_suc := Null;
                    When Too_Many_Rows Then
                        pg_com_acc_es_suc := Null;
                End;
                data_acc_es_suc := dataOdierna;
         End;
         --Prendo l'eventuale esenzione dei comuni presi in considerazione per acconto esercizio successivo
         --Se ho calcolato l'acconto, prendo l'esenzione del comune presente nell'acconto in data di creazione dell'acconto
         --Se non ho calcolato l'acconto, prendo l'esenzione del comune presente in anagrafica in data odierna
         If pg_com_acc_es_suc Is Not Null Then
             esenzione_add_com_es_suc := CNRCTB545.getEsenzioniAddcom(pg_com_acc_es_suc,data_acc_es_suc).importo;
         End If;
         --Prendo l'acconto trattenuto per l'esercizio dei dati del CUD
       Begin
             Select Nvl(a.im_acconto_trattenuto,0), c.cd_catastale
             Into acconto_es, cod_com_acc_es
             From acconto_classific_cori a, comune c
             Where a.pg_comune = c.pg_comune
               And a.esercizio = inEsercizio
               And a.cd_anag = aRecEstrazioneCud.dip_cd_anag
               And a.cd_classificazione_cori = CNRCTB545.isCoriAddCom;
         Exception
             When No_Data_Found Then
                acconto_es := 0;
                cod_com_acc_es := aRecEstrazioneCud.dip_cod_com_domfisc;
         End;
       --Prendo l'eventuale esenzione dei comuni presi in considerazione per il saldo addiz. com. (data ultimo cong)
       --
       Begin
          Select dacr_conguaglio
          Into data_ultimo_cong
          From estrazione_cud_dett
          Where id_estrazione = inRepID
              And esercizio = inEsercizio
              And cd_anag = aRecEstrazioneCud.dip_cd_anag
              And fl_compenso_conguaglio = 'Y'
              And fl_ultimo_conguaglio = 'Y';
         Exception
            When No_Data_Found Then
               data_ultimo_cong := dataOdierna;
            When Too_Many_Rows Then
               data_ultimo_cong := dataOdierna;
         End;
         Begin
            Select pg_comune
            Into pg_com_domfisc
            From comune
            Where cd_catastale = aRecEstrazioneCud.dip_cod_com_domfisc
              And ti_italiano_estero = 'I';
         Exception
               When No_Data_Found Then
                    pg_com_domfisc := Null;
               When Too_Many_Rows Then
                    pg_com_domfisc := Null;
         End;
         If pg_com_domfisc Is Not Null Then
            esenzione_add_com_saldo := CNRCTB545.getEsenzioniAddcom(pg_com_domfisc,data_ultimo_cong).importo;
         End If;
         Begin
            UPDATE ESTRAZIONE_CUD
            SET    im_acconto_add_com_es_suc = acconto_es_suc,
                   dip_cod_com_acc_es_suc = cod_com_acc_es_suc,
                   im_esenz_add_com_es_suc = esenzione_add_com_es_suc,
                   im_acconto_add_com = acconto_es,
                   dip_cod_com_acc_es = cod_com_acc_es,
                   im_esenz_add_com_es = esenzione_add_com_saldo
            WHERE  id_estrazione = inRepID AND
                   esercizio = inEsercizio AND
                   dip_cd_anag = aRecEstrazioneCud.dip_cd_anag AND
                   rigo_cococo = 1;
         End;
      END LOOP;

      CLOSE gen_cur;

   END;

   --Blocco aggiunto per sanare casi sporchi
   --Esistono diversi conguagli non contabilizzati che quindi non vengono inseriti nel cud (il che è giusto)
   --però se per essi esiste una rateizzazione (calcolata con il conguaglio), essa non viene presa
   /*
   Declare
      add_reg_rat  NUMBER(15,2):=0;
      add_com_rat  NUMBER(15,2):=0;
   Begin
     Open gen_cur FOR

        SELECT dip_cd_anag
        FROM   ESTRAZIONE_CUD
        WHERE  id_estrazione = inRepID AND
               esercizio = inEsercizio And
               dip_cd_anag In (8392,11751,12083,15256,20210,22150,25626,26295,48489,48576,60281,64656,66401,
                               68623,79333,80356,91528,91529,91530,91532,93966,94693,102150) And
               Nvl(add_reg_accantonato,0) = 0 And
               Nvl(add_com_accantonato,0) = 0;
     Loop
         FETCH gen_cur INTO
               aRecEstrazioneCud.dip_cd_anag;

         EXIT WHEN gen_cur%NOTFOUND;

         --Prendo le addizionali rateizzate
       Begin
             Select Nvl(im_da_rateizzare,0)
             Into add_reg_rat
             From rateizza_classific_cori
             Where esercizio = inEsercizio
               And cd_anag = aRecEstrazioneCud.dip_cd_anag
               And cd_classificazione_cori = CNRCTB545.isCoriAddReg;
         Exception
             When No_Data_Found Then
                 Null;
         End;
         Begin
             Select Nvl(im_da_rateizzare,0)
             Into add_com_rat
             From rateizza_classific_cori
             Where esercizio = inEsercizio
               And cd_anag = aRecEstrazioneCud.dip_cd_anag
               And cd_classificazione_cori = CNRCTB545.isCoriAddCom;
         Exception
             When No_Data_Found Then
                 Null;
         End;
         Begin
            UPDATE ESTRAZIONE_CUD
            SET    add_reg_accantonato = add_reg_rat,
                   add_com_accantonato = add_com_rat
            WHERE  id_estrazione = inRepID AND
                   esercizio = inEsercizio AND
                   dip_cd_anag = aRecEstrazioneCud.dip_cd_anag AND
                   rigo_cococo = 1;
         End;
     End Loop;

     Close gen_cur;

   End;
   */
END calcolaAccontoAddCom;

-- =================================================================================================
-- Creazione File output
-- =================================================================================================
PROCEDURE scriviFileOutput
   (
    inEsercizio NUMBER,
    inRepID INTEGER,
    inUtente VARCHAR2
   ) IS

   mioCLOB CLOB;
   aStringaChiave1 VARCHAR2(5);
   aStringaChiave2 VARCHAR2(8);
   aStringaChiave3 VARCHAR2(6);
   aStringa VARCHAR2(1000);
   aSalta VARCHAR2(1):='N';
   aDifferenza INTEGER;

   aStringaImporto VARCHAR2(10);

   i BINARY_INTEGER;

   aRecBframeBlob BFRAME_BLOB%ROWTYPE;
   aRecEstrazioneCud ESTRAZIONE_CUD%ROWTYPE;

   gen_cur GenericCurTyp;

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Inizializzazione CLOB

   aRecBframeBlob.cd_tipo:=IDTIPOBLOB;
   aRecBframeBlob.path:='fileoutCUD/' || inEsercizio || '/';
   aRecBframeBlob.filename:='FILEOUT_CUD_' || inRepID || '.DAT';
   aRecBframeBlob.ti_visibilita:='U';
   aRecBframeBlob.ds_file:='FILE OUTPUT ESTRAZIONE CUD';
   aRecBframeBlob.ds_utente:='FILE OUTPUT ESTRAZIONE CUD';

   IBMUTL005.ShIniCBlob(aRecBframeBlob.cd_tipo,
                        aRecBframeBlob.path,
                        aRecBframeBlob.filename,
                        aRecBframeBlob.ti_visibilita,
                        aRecBframeBlob.ds_file,
                        aRecBframeBlob.ds_utente,
                        inUtente,
                        mioCLOB);

   -------------------------------------------------------------------------------------------------
   -- Scrittura CLOB (file output estrazione CUD)

   BEGIN

      -- Valorizzazione costanti della chiave file -------------------------------------------------

      aStringaChiave2:='94109411';

      -- Ciclo elaborazione dati CUD ---------------------------------------------------------------
      -- Escluse le anagrafiche che non hanno imponibile fiscale/previdenziale
      OPEN gen_cur FOR

           SELECT *
           FROM   ESTRAZIONE_CUD
           WHERE  id_estrazione = inRepID
             AND  esercizio = inEsercizio
             AND  (IMPONIBILE_NO_DETR != 0
                   OR IMPONIBILE_SI_DETR != 0
                   OR IMPONIBILE_NO_DETR_TASSEP != 0
                   OR IMPONIBILE_NON_RESIDENTI != 0
                   OR IMPONIBILE_SI_DETR_TASSEP != 0
                   OR COMPENSI_CORRISPOSTI_COCOCO != 0
                   OR IM_REDD_NON_TASSATI_PER_CONV != 0
                   OR IM_REDD_ESENTI_PER_LEGGE != 0)
           ORDER BY dip_codice_fiscale;

      LOOP

         FETCH gen_cur INTO
               aRecEstrazioneCud;

         EXIT WHEN gen_cur%NOTFOUND;

         -- Creazione di due tipi record (anagrafico e dettaglio)

         FOR i IN 1 .. 3

         LOOP

            aStringa:=NULL;
            aSalta := 'N';
            -- Dettaglio anagrafico ----------------------------------------------------------------

            IF i = 1 THEN

               -- Chiave

               aStringaChiave1:='1010 ';
               aStringaChiave3:=LPAD((300000 + aRecEstrazioneCud.dip_cd_anag),6,'0');
               aStringa:=aStringaChiave1 || aStringaChiave2 || aStringaChiave3;

               -- Cognome

               IF aRecEstrazioneCud.dip_cognome IS NULL THEN
                  aStringa:=aStringa || RPAD(' ', 24, ' ');
               ELSE
                  aStringa:=aStringa || RPAD(SUBSTR(Upper(aRecEstrazioneCud.dip_cognome), 1, 24), 24, ' ');
               END IF;

               -- Nome

               IF aRecEstrazioneCud.dip_nome IS NULL THEN
                  aStringa:=aStringa || RPAD(' ', 24, ' ');
               ELSE
                  aStringa:=aStringa || RPAD(SUBSTR(Upper(aRecEstrazioneCud.dip_nome), 1, 24), 24, ' ');
               END IF;

               -- Data assunzione (data minima di inizio competenza dei compensi elaborati)

               IF aRecEstrazioneCud.cnr_data_assunzione IS NULL THEN
                  aStringa:=aStringa || LPAD('0', 8, '0');
               ELSE
                  aStringa:=aStringa ||
                            TO_CHAR(aRecEstrazioneCud.cnr_data_assunzione, 'DD') ||
                            TO_CHAR(aRecEstrazioneCud.cnr_data_assunzione, 'MM') ||
                            TO_CHAR(aRecEstrazioneCud.cnr_data_assunzione, 'YYYY');
               END IF;

               -- Codice fiscale

               IF aRecEstrazioneCud.dip_codice_fiscale IS NULL THEN
                  aStringa:=aStringa || RPAD(' ', 16, ' ');
               ELSE
                  aStringa:=aStringa || RPAD(SUBSTR(Upper(aRecEstrazioneCud.dip_codice_fiscale), 1, 16), 16, ' ');
               END IF;

               -- Data di nascita

               IF (aRecEstrazioneCud.dip_gg_nascita IS NULL OR
                   aRecEstrazioneCud.dip_mm_nascita IS NULL OR
                   aRecEstrazioneCud.dip_aa_nascita IS NULL) THEN
                  aStringa:=aStringa || LPAD('0', 8, '0');
               ELSE
                  aStringa:=aStringa || LPAD(aRecEstrazioneCud.dip_gg_nascita, 2, '0') ||
                                        LPAD(aRecEstrazioneCud.dip_mm_nascita, 2, '0') ||
                                        LPAD(aRecEstrazioneCud.dip_aa_nascita, 4, '0');
               END IF;

               -- Comune di nascita

               IF aRecEstrazioneCud.dip_com_nascita IS NULL THEN
                  aStringa:=aStringa || RPAD(' ', 24, ' ');
               ELSE
                  aStringa:=aStringa || RPAD(SUBSTR(Upper(aRecEstrazioneCud.dip_com_nascita), 1, 24), 24, ' ');
               END IF;

               -- Provincia di nascita

               IF aRecEstrazioneCud.dip_prv_nascita IS NULL THEN
                  aStringa:=aStringa || RPAD(' ', 3, ' ');
               ELSE
                  aStringa:=aStringa || RPAD(SUBSTR(Upper(aRecEstrazioneCud.dip_prv_nascita), 1, 3), 3, ' ');
               END IF;

               -- Sesso

               IF aRecEstrazioneCud.dip_sesso IS NULL THEN
                  aStringa:=aStringa || ' ';
               ELSE
                  aStringa:=aStringa || Upper(aRecEstrazioneCud.dip_sesso);
               END IF;

               -- Provincia di residenza

               IF aRecEstrazioneCud.dip_prv_domfisc IS NULL THEN
                  aStringa:=aStringa || RPAD(' ', 3, ' ');
               ELSE
                  aStringa:=aStringa || RPAD(SUBSTR(Upper(aRecEstrazioneCud.dip_prv_domfisc), 1, 3), 3, ' ');
               END IF;

               -- Data cessazione (data massima di fine competenza dei compensi elaborati)

               IF aRecEstrazioneCud.cnr_data_cessazione IS NULL THEN
                  aStringa:=aStringa || LPAD('0', 8, '0');
               ELSE
                  aStringa:=aStringa ||
                            TO_CHAR(aRecEstrazioneCud.cnr_data_cessazione, 'DD') ||
                            TO_CHAR(aRecEstrazioneCud.cnr_data_cessazione, 'MM') ||
                            TO_CHAR(aRecEstrazioneCud.cnr_data_cessazione, 'YYYY');
               END IF;

               -- Filler

               aStringa:=aStringa || RPAD(' ', 2, ' ');

               -- Indirizzo del domicilio fiscale

               IF aRecEstrazioneCud.dip_ind_domfisc IS NULL THEN
                  aStringa:=aStringa || RPAD(' ', 24, ' ');
               ELSE
                  aStringa:=aStringa || RPAD(SUBSTR(Upper(aRecEstrazioneCud.dip_ind_domfisc), 1, 24), 24, ' ');
               END IF;

               -- CAP del domicilio fiscale

               IF aRecEstrazioneCud.dip_cap_domfisc IS NULL THEN
                  aStringa:=aStringa || LPAD('0', 5, '0');
               ELSE
                  IF IBMUTL001.isNumeric(aRecEstrazioneCud.dip_cap_domfisc) = 'Y' THEN
                     aStringa:=aStringa || LPAD(aRecEstrazioneCud.dip_cap_domfisc, 5, '0');
                  ELSE
                     aStringa:=aStringa || LPAD('0', 5, '0');
                  END IF;
               END IF;

               -- Provincia del domicilio fiscale

               IF aRecEstrazioneCud.dip_prv_domfisc IS NULL THEN
                  aStringa:=aStringa || RPAD(' ', 3, ' ');
               ELSE
                  aStringa:=aStringa || RPAD(SUBSTR(Upper(aRecEstrazioneCud.dip_prv_domfisc), 1, 3), 3, ' ');
               END IF;

               -- Comune del domicilio fiscale

               IF aRecEstrazioneCud.dip_com_domfisc IS NULL THEN
                  aStringa:=aStringa || RPAD(' ', 24, ' ');
               ELSE
                  aStringa:=aStringa || RPAD(SUBSTR(Upper(aRecEstrazioneCud.dip_com_domfisc), 1, 24), 24, ' ');
               END IF;

               IF aRecEstrazioneCud.dip_com_domfisc IS NULL THEN
                  aStringa:=aStringa || RPAD(' ', 24, ' ');
               ELSE
                  IF LENGTH(aRecEstrazioneCud.dip_com_domfisc) > 24 THEN
                     aStringa:=aStringa || RPAD(SUBSTR(Upper(aRecEstrazioneCud.dip_com_domfisc), 25, 24), 24, ' ');
                  ELSE
                     aStringa:=aStringa || RPAD(' ', 24, ' ');
                  END IF;
               END IF;

               -- Qualifica 770/SA

               aStringa:=aStringa || RPAD(' ', 5, ' ');

               -- Codice comune alla data 01/01/esercizio
               --(è il comune con cui è stato calcolato l'acconto per l'esercizio a cui si riferisce il CUD
               --e se non c'è nessun acconto è quello dell'anagrafica)

               IF aRecEstrazioneCud.dip_cod_com_acc_es IS NULL THEN
                  aStringa:=aStringa || RPAD(' ', 4, ' ');
               ELSE
                  aStringa:=aStringa || RPAD(SUBSTR(Upper(aRecEstrazioneCud.dip_cod_com_acc_es), 1, 4), 4, ' ');
               END IF;

               -- Provincia lavoro

               aStringa:=aStringa || LPAD('9', 6, '9');

             -- Indirizzo Domicilio Fiscale completo solo per la stampa delle Etichette
               IF aRecEstrazioneCud.dip_ind_domfisc IS NULL THEN
                  aStringa:=aStringa || RPAD(' ', 100, ' ');
               ELSE
                  aStringa:=aStringa || RPAD(SUBSTR(Upper(aRecEstrazioneCud.dip_ind_domfisc), 1, 100), 100, ' ');
               END IF;

             -- Codice comune con cui è stato calcolato l'acconto addizionale comunale per l'esercizio successivo
             -- Altrimenti è quello dell'anagrafica

               IF aRecEstrazioneCud.dip_cod_com_acc_es_suc IS NULL THEN
                  aStringa:=aStringa || RPAD(' ', 4, ' ');
               ELSE
                  aStringa:=aStringa || RPAD(SUBSTR(Upper(aRecEstrazioneCud.dip_cod_com_acc_es_suc), 1, 4), 4, ' ');
               END IF;

             -- Codice comune alla data 31/12/esercizio (uguale a Codice comune del domicilio fiscale)

               IF aRecEstrazioneCud.dip_cod_com_domfisc IS NULL THEN
                  aStringa:=aStringa || RPAD(' ', 4, ' ');
               ELSE
                  aStringa:=aStringa || RPAD(SUBSTR(Upper(aRecEstrazioneCud.dip_cod_com_domfisc), 1, 4), 4, ' ');
               END IF;

               IF LENGTH(aStringa) != 343 THEN
                  IBMERR001.RAISE_ERR_GENERICO
                     ('Errore in lunghezza file in output tipo record 1010 lunghezza ' || LENGTH(aStringa));
               END IF;

            -- Dettaglio importi -------------------------------------------------------------------

            Elsif i = 2 Then
               -- per i terzi che hanno compensi solo da non residenti (solo cococo) devo prendere solo i dati inps
               -- quindi passo anche il record 2010

               If aRecEstrazioneCud.fl_soggetto_estero = 'Y' And
                  Nvl(aRecEstrazioneCud.imponibile_si_detr,0) = 0 And
                  Nvl(aRecEstrazioneCud.imponibile_no_detr,0) = 0 Then

                  -- Chiave

                  aStringaChiave1:='2010 ';
                  aStringaChiave3:=LPAD((300000 + aRecEstrazioneCud.dip_cd_anag),6,'0');
                  aStringa:=aStringaChiave1 || aStringaChiave2 || aStringaChiave3;

                  -- Campi contabili

                  aStringa:=aStringa ||
                            LPAD('0', 159, '0') ||
                            LPAD((aRecEstrazioneCud.compensi_corrisposti_cococo * 100), 10, '0') ||
                            LPAD((aRecEstrazioneCud.contributi_dovuti_cococo * 100), 10, '0') ||
                            LPAD((aRecEstrazioneCud.contributi_trattenuti_cococo * 100), 10, '0') ||
                            LPAD((aRecEstrazioneCud.contributi_versati_cococo * 100), 10, '0') ||
                            LPAD('0', 10, '0') ||
                            LPAD(' ', 5, ' ') ||
                            LPAD('0', 41, '0') ||
                            LPAD(' ', 1, ' ') ||
                            LPAD('0', 18, '0') ||
                            LPAD(' ', 5, ' ') ||
                            LPAD('0', 40, '0') ||
                            LPAD(' ', 16, ' ') ||
                            LPAD('0', 20, '0');

                  --aSalta := 'Y';
               Else

                  -- Chiave

                  aStringaChiave1:='2010 ';
                  aStringaChiave3:=LPAD((300000 + aRecEstrazioneCud.dip_cd_anag),6,'0');
                  aStringa:=aStringaChiave1 || aStringaChiave2 || aStringaChiave3;

                  -- Campi contabili

                  aStringa:=aStringa ||
                            LPAD((aRecEstrazioneCud.imponibile_si_detr * 100), 10, '0') ||
                            LPAD((aRecEstrazioneCud.ritenute_irpef * 100), 10, '0');
                  If aRecEstrazioneCud.addizionale_regionale - aRecEstrazioneCud.add_reg_accantonato > 0 Then
                     aStringa:=aStringa ||Lpad(((aRecEstrazioneCud.addizionale_regionale -
                                                 aRecEstrazioneCud.add_reg_accantonato) * 100), 10, '0');
                  Else
                     aStringa:=aStringa ||Lpad('0',10,'0');
                  End If;

                  --SE L'ADDIZIONALE COMUNALE DOVUTA - QUELLA RATEIZZATA - ACCONTO TRATTENUTO < 0 PASSO ZERO
                  If  aRecEstrazioneCud.addizionale_comunale - aRecEstrazioneCud.add_com_accantonato - Nvl(aRecEstrazioneCud.im_acconto_add_com,0) > 0 Then
                     aStringa:=aStringa ||Lpad(((aRecEstrazioneCud.addizionale_comunale -
                                                 aRecEstrazioneCud.add_com_accantonato -
                                                 Nvl(aRecEstrazioneCud.im_acconto_add_com,0)) * 100), 10, '0');
                  Else
                     aStringa:=aStringa ||Lpad('0',10,'0');
                  End If;

                  aStringa:=aStringa ||
                            LPAD(((aRecEstrazioneCud.imponibile_si_detr_tassep +
                                   aRecEstrazioneCud.imponibile_no_detr_tassep) * 100), 10, '0') ||
                            LPAD((aRecEstrazioneCud.ritenute_irpef_tassep * 100), 10, '0') ||
                            Lpad((aRecEstrazioneCud.detrazioni_lavoro_dip * 100), 10, '0') ||
                            Lpad((aRecEstrazioneCud.cnr_detrazione_coniuge * 100), 10, '0') || --LPAD((aRecEstrazioneCud.im_deduzione_family * 100), 10, '0') ||
                            Lpad((aRecEstrazioneCud.cnr_detrazione_figli * 100), 10, '0') ||
                            LPAD((aRecEstrazioneCud.cnr_detrazioni_tassep * 100), 10, '0') ||
                            LPAD(aRecEstrazioneCud.gg_periodo_lavoro, 3, '0') ||
                            LPAD(aRecEstrazioneCud.cnr_gg_periodo_tassep, 8, '0') ||
                            LPAD((aRecEstrazioneCud.add_reg_accantonato * 100), 10, '0') ||
                            LPAD((aRecEstrazioneCud.add_com_accantonato * 100), 10, '0') ||
                            LPAD('0', 4, '0') ||
                            LPAD('0', 4, '0') ||
                            LPAD((aRecEstrazioneCud.add_reg_anno_precedente * 100), 10, '0') ||
                            LPAD((aRecEstrazioneCud.add_com_anno_precedente * 100), 10, '0') ||
                            LPAD((aRecEstrazioneCud.compensi_corrisposti_cococo * 100), 10, '0') ||
                            LPAD((aRecEstrazioneCud.contributi_dovuti_cococo * 100), 10, '0') ||
                            LPAD((aRecEstrazioneCud.contributi_trattenuti_cococo * 100), 10, '0') ||
                            LPAD((aRecEstrazioneCud.contributi_versati_cococo * 100), 10, '0') ||
                            LPAD((aRecEstrazioneCud.imposta_lorda * 100), 10, '0') ||
                            RPAD(NVL(aRecEstrazioneCud.cd_categoria,' '), 5, ' ') || --CATEGORIE PARTICOLARI
                            LPAD((aRecEstrazioneCud.imponibile_no_detr * 100), 10, '0');

                  IF aRecEstrazioneCud.cnr_tipologia_reddito_punto_1 IS NULL THEN
                     aStringa:=aStringa || RPAD(' ', 3, ' ');
                  ELSE
                     aStringa:=aStringa || RPAD(SUBSTR(aRecEstrazioneCud.cnr_tipologia_reddito_punto_1, 1, 3), 3, ' ');
                  END IF;

                  aStringa:=aStringa || aRecEstrazioneCud.cnr_tempo_determinato;

                  IF aRecEstrazioneCud.cnr_tipologia_reddito_punto_2 IS NULL THEN
                     aStringa:=aStringa || RPAD(' ', 3, ' ');
                  ELSE
                     aStringa:=aStringa || RPAD(SUBSTR(aRecEstrazioneCud.cnr_tipologia_reddito_punto_2, 1, 3), 3, ' ');
                  END IF;

                  IF aRecEstrazioneCud.fl_applic_aliquota_max = 'N' THEN
                     aStringa:=aStringa || '0';
                  ELSE
                     aStringa:=aStringa || '1';
                  END IF;

                /*
                  IF (aRecEstrazioneCud.cnr_deduzione_fissa_3000 + aRecEstrazioneCud.cnr_deduzione_fissa_4500) > 0 THEN
                     aStringa:=aStringa || '0';
                  ELSE
                     aStringa:=aStringa || '1';
                  END IF;

                  aStringa:=aStringa ||
                            LPAD((aRecEstrazioneCud.cnr_deduzione_fissa_3000 * 100), 10, '0') ||
                            LPAD((aRecEstrazioneCud.cnr_deduzione_fissa_4500 * 100), 10, '0') ||
                            ' ';
                */
                aStringa:=aStringa ||
                          LPAD('0', 1, '0') ||
                            LPAD('0', 10, '0') ||
                            LPAD('0', 10, '0');

                  aStringa:=aStringa ||
                            Lpad(' ', 1, ' ');

                  IF aRecEstrazioneCud.cnr_posizione_inail IS NULL THEN
                     aStringa:=aStringa || LPAD('0', 10, '0');
                  ELSE
                     IF IBMUTL001.isNumeric(aRecEstrazioneCud.cnr_posizione_inail) = 'Y' THEN
                        aStringa:=aStringa || LPAD(SUBSTR(aRecEstrazioneCud.cnr_posizione_inail,1,10), 10, '0');
                     ELSE
                        aStringa:=aStringa || LPAD('0', 10, '0');
                     END IF;
                  END IF;

                  aStringa:=aStringa ||
                            LPAD('0', 4, '0') ||
                            LPAD('0', 4, '0') ||
                            LPAD(' ', 4, ' ');

                  /*
                  IF aRecEstrazioneCud.dt_inizio_cococo Is Not Null THEN
                     aStringa:=aStringa || '3';
                  ELSE
                     aStringa:=aStringa || ' ';
                  END IF;
                  */
                  aStringa:=aStringa || ' ';

                  aStringa:=aStringa ||
                                 Lpad('0',10,'0') ||
                                 Lpad('0',10,'0') ||
                                 Lpad('0',10,'0') ||
                                 Lpad('0',10,'0') ||
                                 Lpad(' ',16,' ') ||
                                 Lpad('0',10,'0');

                  aStringa:=aStringa ||Lpad((aRecEstrazioneCud.im_acconto_add_com_es_suc * 100), 10, '0');
                  aStringa:=aStringa ||LPAD('0', 3, '0') ||
                                       LPAD('0', 3, '0');

                  IF LENGTH(aStringa) != 380 Then
                     IBMERR001.RAISE_ERR_GENERICO
                        ('Errore in lunghezza file in output tipo record 2010 lunghezza ' || LENGTH(aStringa));
                  END IF;
               End If;
          Else         -- i = 3

               -- Chiave

               aStringaChiave1:='2020 ';
               aStringaChiave3:=LPAD((300000 + aRecEstrazioneCud.dip_cd_anag),6,'0');
               aStringa:=aStringaChiave1 || aStringaChiave2 || aStringaChiave3;

             -- Campi contabili

             -- se il terzo è SOLO non residente (per come abbiamo inteso noi i non residenti)i primi cinque campi sono a zero
             If aRecEstrazioneCud.fl_soggetto_estero = 'Y' And
                  Nvl(aRecEstrazioneCud.imponibile_si_detr,0) = 0 And
                  Nvl(aRecEstrazioneCud.imponibile_no_detr,0) = 0 Then

                  aStringa:=aStringa || LPAD('0', 10, '0')||
                                        LPAD('0', 10, '0')||
                                        LPAD('0', 10, '0')||
                                        LPAD('0', 10, '0')||
                                        LPAD('0', 10, '0');
         Else
                  --IF aggiunto per sanare casi sporchi
              --Esistono diversi conguagli non contabilizzati che quindi non vengono inseriti nel cud (il che è giusto)
              --però se per essi esiste l'acconto, poichè aRecEstrazioneCud.addizionale_comunale è <0, invece dell'acconto
              --viene passato zero
                  --If aRecEstrazioneCud.dip_cd_anag In(20210,60281,64656,66401,79333,80356,91528,91530,91532) Then
                  --     aStringa:=aStringa ||
                  --             Lpad((Nvl(aRecEstrazioneCud.im_acconto_add_com,0) * 100), 10, '0');
                  --Else
                       --SE DOVUTO - ACCONTO >= 0 PASSO L'ACCONTO COSì COME CALCOLATO ALTRIMENTI LO FORZO UGUALE AL SALDO
                       If  aRecEstrazioneCud.addizionale_comunale - Nvl(aRecEstrazioneCud.im_acconto_add_com,0) < 0 Then
                           If aRecEstrazioneCud.addizionale_comunale > 0 Then
                                 aStringa:=aStringa ||
                                           Lpad((aRecEstrazioneCud.addizionale_comunale * 100), 10, '0');
                           Else
                                 aStringa:=aStringa || Lpad('0', 10, '0');
                           End If;
                       Else
                           aStringa:=aStringa ||
                            Lpad((Nvl(aRecEstrazioneCud.im_acconto_add_com,0) * 100), 10, '0');
                       End If;
                  --End If;
                  aStringa:=aStringa ||
                            LPAD('0', 10, '0') ||          -- ULTERIORE DETRAZIONE 1380
                            Lpad((Nvl(aRecEstrazioneCud.im_esenz_add_com_es,0) * 100), 10, '0')||
                            Lpad((Nvl(aRecEstrazioneCud.im_esenz_add_com_es_suc,0) * 100), 10, '0')||
                            Lpad((Nvl(aRecEstrazioneCud.reddito_abitaz_princ,0) * 100), 10, '0');
         End If;

         -- se il terzo è residente i successivi due campi sono a zero
         aStringa:=aStringa ||
                   Lpad((Nvl(aRecEstrazioneCud.imponibile_non_residenti,0) * 100), 10, '0')||
                   Lpad((Nvl(aRecEstrazioneCud.ritenute_non_residenti,0) * 100), 10, '0');

         aStringa:=aStringa || LPAD('0', 10, '0')||
                               LPAD('0', 10, '0');

         aStringa:=aStringa ||Lpad((Nvl(aRecEstrazioneCud.altri_redditi,0) * 100), 10, '0');

         aStringa:=aStringa || LPAD('0', 10, '0');                                                                                                                                  -- ADD. COM. ACCONTO ESERCIZIO SOSPESA
         aStringa:=aStringa ||Lpad((Nvl(aRecEstrazioneCud.im_irpef_sospeso,0) * 100), 10, '0');       -- RITENUTA IRPEF SOSPESA
         aStringa:=aStringa || LPAD('0', 10, '0')||
                               LPAD('0', 10, '0')||
                               LPAD('0', 10, '0')||
                               LPAD('0', 10, '0')||
                               LPAD('0', 10, '0')||
                               LPAD('0', 10, '0')||
                               LPAD('0', 10, '0')||
                               LPAD('0', 10, '0');
         IF Nvl(aRecEstrazioneCud.im_irpef_sospeso,0) != 0 THEN
                aStringa:=aStringa ||'3';
         ELSE
                aStringa:=aStringa ||'0';
         END IF;

         aStringa:=aStringa ||Lpad((Nvl(aRecEstrazioneCud.imponibile_non_tassato_cerv,0) * 100), 10, '0');

         IF LTRIM(RTRIM(aRecEstrazioneCud.annotazioni_2)) IS NOT NULL THEN
             aStringa:=aStringa ||'Y';
         ELSE
             aStringa:=aStringa ||'N';
         END IF;

         aStringa:=aStringa ||Lpad((Nvl(aRecEstrazioneCud.im_redd_esenti_per_legge,0) * 100), 10, '0');     --  REDDITI ESENTI PER LEGGE (ASSEGNI DI RICERCA)
         aStringa:=aStringa ||Lpad((Nvl(aRecEstrazioneCud.im_redd_non_tassati_per_conv,0) * 100), 10, '0');       --  REDDITI NON TASSATI PER CONVENZIONE
         aStringa:=aStringa ||Lpad((Nvl(aRecEstrazioneCud.imponi_non_tassato_rientro_lav,0) * 100), 10, '0');  -- IMPONIBILE NON TASSATO RIENTRO DEI LAVORATORI

         IF aRecEstrazioneCud.cnr_tipologia_reddito_punto_2 IS NULL THEN
              aStringa:=aStringa || RPAD(' ', 3, ' ');
         ELSE
              aStringa:=aStringa || RPAD(SUBSTR(aRecEstrazioneCud.cnr_tipologia_reddito_punto_2, 1, 3), 3, ' ');
         END IF;

         aStringa:=aStringa ||Lpad((Nvl(aRecEstrazioneCud.im_bonus_erogato,0) * 100), 10, '0');       --  IMPORTO BONUS EROGATO
         aStringa:=aStringa ||Lpad((Nvl(aRecEstrazioneCud.ult_detr_cuneo_fisc,0) * 100), 10, '0');    --  ULTERIORE DETRAZIONE CUNEO FISCALE...SOLO LA PARTE DI DETRAZIONE
         aStringa:=aStringa ||Lpad((Nvl(aRecEstrazioneCud.tratt_int_erog_cuneo_fisc,0) * 100), 10, '0');    --  TRATTAMENTO INTEGRATIVO EROGATO CUNEO FISCALE...SOLO LA PARTE DI TRATTAMENTO INTEGRATIVO(NON DETRAZIONE) EROGATA, INCLUSI I CONGUAGLI
         aStringa:=aStringa ||Lpad((Nvl(aRecEstrazioneCud.tratt_int_cong_cuneo_fisc,0) * 100), 10, '0');    --  TRATTAMENTO INTEGRATIVO RECUPERATO ENTRO CONGUAGLIO CUNEO FISCALE...SOLO LA PARTE DI CONGUAGLIO TRATTAMENTO INTEGRATIVO(NON DETRAZIONE)

         IF LENGTH(aStringa) != 304 Then
            IBMERR001.RAISE_ERR_GENERICO
               ('Errore in lunghezza file in output tipo record 2020 lunghezza ' || LENGTH(aStringa));
         END IF;

      END IF;   -- i=....

      -- Scrittura CLOB
          If aSalta = 'N' Then
                aDifferenza:= 500 - LENGTH(aStringa);

                aStringa:=aStringa || LPAD(' ', aDifferenza, ' ');

                IBMUTL005.ShPutLine(aRecBframeBlob.cd_tipo,
                                aRecBframeBlob.path,
                                    aRecBframeBlob.filename,
                                    mioCLOB,
                                    aStringa);
            End If;

         END LOOP;

      END LOOP;

      CLOSE gen_cur;

   END;

   -------------------------------------------------------------------------------------------------
   -- Chiusura CLOB

   IBMUTL005.ShCloseClob(aRecBframeBlob.cd_tipo,
                   aRecBframeBlob.path,
                         aRecBframeBlob.filename,
                   mioCLOB);

END scriviFileOutput;

-- =================================================================================================
-- Inserimento CARICHI FAMILIARI
-- =================================================================================================
PROCEDURE inserisciCarichiFamiliari
   (
    inEsercizio NUMBER,
    inRepID INTEGER
   ) IS

   NUMERO_MESI    NUMBER(2):=0;
   DT_INIZIO      DATE;
   DT_FINE        DATE;
   MESE_INIZIO    NUMBER(2);
   MESE_FINE    NUMBER(2);
   TIPO         VARCHAR2(7);
   FL_MINORE_3_ANNI  VARCHAR2(1);
BEGIN
   for rec in (select esercizio,ID_ESTRAZIONE, dip_cd_anag,
                          DIP_CODICE_FISCALE,DIP_COGNOME,DIP_NOME,
                      nvl(DETRAZIONI_FAMILIARI,0) DETRAZIONI_FAMILIARI,
                      nvl(CNR_DETRAZIONE_CONIUGE,0) CNR_DETRAZIONE_CONIUGE,
                      nvl(CNR_DETRAZIONE_FIGLI,0) CNR_DETRAZIONE_FIGLI
               from ESTRAZIONE_CUD
               where esercizio = inEsercizio
               and id_estrazione = inRepID
               and (nvl(DETRAZIONI_FAMILIARI,0) !=0 or
                    nvl(CNR_DETRAZIONE_CONIUGE,0) !=0 or
                    nvl(CNR_DETRAZIONE_FIGLI,0) !=0))   loop

        IF REC.CNR_DETRAZIONE_CONIUGE != 0 THEN
           for con in (select CODICE_FISCALE,TI_PERSONA,PRC_CARICO,DT_INI_VALIDITA,DT_FIN_VALIDITA
                       from CARICO_FAMILIARE_ANAG
                       where CD_ANAG = REC.DIP_CD_ANAG
                         AND TI_PERSONA = 'C'
                         AND TO_CHAR(DT_INI_VALIDITA,'YYYY') <= inEsercizio
                         AND TO_CHAR(DT_FIN_VALIDITA,'YYYY') >= inEsercizio
                         AND ROWNUM < 2) LOOP

               IF TO_CHAR(CON.DT_INI_VALIDITA,'YYYY') < inEsercizio THEN
                    DT_INIZIO := TO_DATE('01/01/'||inEsercizio,'DD/MM/YYYY');
                    MESE_INIZIO := 1;
               ELSE
                    DT_INIZIO := CON.DT_INI_VALIDITA;
                    MESE_INIZIO := TO_NUMBER(TO_CHAR(CON.DT_INI_VALIDITA,'MM'));
               END IF;

               IF TO_CHAR(CON.DT_FIN_VALIDITA,'YYYY') > inEsercizio THEN
                    DT_FINE := TO_DATE('31/12/'||inEsercizio,'DD/MM/YYYY');
                    MESE_FINE := 12;
               ELSE
                    DT_FINE := CON.DT_FIN_VALIDITA;
                    MESE_FINE := TO_NUMBER(TO_CHAR(CON.DT_FIN_VALIDITA,'MM'));
               END IF;

               NUMERO_MESI := MESE_FINE - MESE_INIZIO + 1;

               INSERT INTO ESTRAZIONE_CUD_CARICHI_FAM (ID_ESTRAZIONE,ESERCIZIO,DIP_CD_ANAG,DIP_CODICE_FISCALE,DIP_COGNOME,DIP_NOME,DT_NASCITA_FIGLIO,
                                                     TIPOLOGIA_CARICO,CODICE_FISCALE_CARICO,NOMINATIVO_CARICO,ANNO_DETRAZIONE,PRC_CARICO,
                                                 NUMERO_MESI_CARICO,FL_MINORE_3_ANNI)
                  VALUES (REC.ID_ESTRAZIONE,REC.ESERCIZIO,LPAD((300000 + rec.dip_cd_anag),6,'0'),REC.DIP_CODICE_FISCALE,REC.DIP_COGNOME,REC.DIP_NOME,NULL,
                          'CONIUGE',CON.CODICE_FISCALE,NULL,REC.ESERCIZIO,CON.PRC_CARICO,
                        NUMERO_MESI,Null);

           END LOOP;
        end if;
        If  REC.CNR_DETRAZIONE_FIGLI != 0 Then
           for fig in (select CODICE_FISCALE,TI_PERSONA,PRC_CARICO,DT_INI_VALIDITA,DT_FIN_VALIDITA,
                              FL_HANDICAP, DT_FINE_FIGLIO_HA_TREANNI,DT_NASCITA_FIGLIO
                       from CARICO_FAMILIARE_ANAG
                       where CD_ANAG = REC.DIP_CD_ANAG
                         AND TI_PERSONA In ('F','A')
                         AND TO_CHAR(DT_INI_VALIDITA,'YYYY') <= inEsercizio
                         AND TO_CHAR(DT_FIN_VALIDITA,'YYYY') >= inEsercizio) LOOP

               IF TO_CHAR(FIG.DT_INI_VALIDITA,'YYYY') < inEsercizio THEN
                    DT_INIZIO := TO_DATE('01/01/'||inEsercizio,'DD/MM/YYYY');
                    MESE_INIZIO := 1;
               ELSE
                    DT_INIZIO := FIG.DT_INI_VALIDITA;
                    MESE_INIZIO := TO_NUMBER(TO_CHAR(FIG.DT_INI_VALIDITA,'MM'));
               END IF;

               IF TO_CHAR(FIG.DT_FIN_VALIDITA,'YYYY') > inEsercizio THEN
                    DT_FINE := TO_DATE('31/12/'||inEsercizio,'DD/MM/YYYY');
                    MESE_FINE := 12;
               ELSE
                    DT_FINE := FIG.DT_FIN_VALIDITA;
                    MESE_FINE := TO_NUMBER(TO_CHAR(FIG.DT_FIN_VALIDITA,'MM'));
               END IF;

               NUMERO_MESI := MESE_FINE - MESE_INIZIO + 1;

               If FIG.TI_PERSONA = 'F' Then
                  If FIG.FL_HANDICAP = 'N' Then
                      TIPO := 'FIGLI';
                  Else
                      TIPO := 'FGINVA';
                  End If;
                  If To_Char(FIG.DT_FINE_FIGLIO_HA_TREANNI,'YYYY') < inEsercizio Then
                     FL_MINORE_3_ANNI := 'N';
                  Else
                     FL_MINORE_3_ANNI := 'S';
                  End If;
               Else
                      TIPO := 'ALTROFA';
                      FL_MINORE_3_ANNI:= Null;
               End If;

               INSERT INTO ESTRAZIONE_CUD_CARICHI_FAM (ID_ESTRAZIONE,ESERCIZIO,DIP_CD_ANAG,DIP_CODICE_FISCALE,DIP_COGNOME,DIP_NOME,DT_NASCITA_FIGLIO,
                                    TIPOLOGIA_CARICO,CODICE_FISCALE_CARICO,NOMINATIVO_CARICO,ANNO_DETRAZIONE,PRC_CARICO,
                                    NUMERO_MESI_CARICO,FL_MINORE_3_ANNI)
                  VALUES (REC.ID_ESTRAZIONE,REC.ESERCIZIO,LPAD((300000 + rec.dip_cd_anag),6,'0'),REC.DIP_CODICE_FISCALE,REC.DIP_COGNOME,REC.DIP_NOME,FIG.DT_NASCITA_FIGLIO,
                          TIPO,FIG.CODICE_FISCALE,NULL,REC.ESERCIZIO,FIG.PRC_CARICO,
                        NUMERO_MESI,FL_MINORE_3_ANNI);

           END LOOP;
        End If;

   end loop;
END inserisciCarichiFamiliari;

-- =================================================================================================
-- Estrazione dati per stampa CUD
-- =================================================================================================
PROCEDURE estrazioneDatiCUD
   (
    inEsercizio NUMBER,
    aCdAnag NUMBER,
    inRepID INTEGER,
    inUtente VARCHAR2,
    pg_exec NUMBER
   ) IS

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Inizializzazione variabili

   --dataOdierna:=sysdate;

   -------------------------------------------------------------------------------------------------
   -- Inserimento in ESTRAZIONE_CUD_DETT dei compensi oggetto di esposizione sul CUD. Caricamento
   -- dei dati relativi alla testata del compenso

   IBMUTL200.LOGINF(pg_exec,
                    'Estrazione dati CUD - Dettaglio elaborazione',
                    'FASE 1',
                    'FASE 1 - Inserimento compensi in ESTRAZIONE_CUD_DETT');

   inserisciDatiCUDDett(inEsercizio,
                        aCdAnag,
                        inRepID,
                        inUtente);

   -------------------------------------------------------------------------------------------------
   -- Inserimento in ESTRAZIONE_CUD_DETT dei compensi oggetto di esposizione sul CUD. Caricamento
   -- dei dati relativi alla testata del compenso

   IBMUTL200.LOGINF(pg_exec,
                    'Estrazione dati CUD - Dettaglio elaborazione',
                    'FASE 2',
                    'FASE 2 - Aggiornamento dati contributo ritenuta su compensi presenti ' ||
                    'in ESTRAZIONE_CUD_DETT');

   upgDatiCUDDettCori(inEsercizio,
                      inRepID);

   COMMIT;

   -------------------------------------------------------------------------------------------------
   -- Inserimento in ESTRAZIONE_CUD_DETT dei compensi oggetto di esposizione sul CUD. Caricamento
   -- dei dati relativi alla testata del compenso

   IBMUTL200.LOGINF(pg_exec,
                    'Estrazione dati CUD - Dettaglio elaborazione',
                    'FASE 3',
                    'FASE 3 - Aggiornamento dati conguaglio su compensi presenti in ESTRAZIONE_CUD_DETT');

   upgDatiCUDDettCong(inEsercizio,
                      inRepID);


   -------------------------------------------------------------------------------------------------
   -- Aggregazione dati di ESTRAZIONE_CUD_DETT in ESTRAZIONE_CUD.

   IBMUTL200.LOGINF(pg_exec,
                    'Estrazione dati CUD - Dettaglio elaborazione',
                    'FASE 4',
                    'FASE 4 - Aggiornamento dati in tabella ESTRAZIONE_CUD (imponibile)');

   aggregaDatiCud(inEsercizio,
                  inRepID,
                  inUtente);

   -------------------------------------------------------------------------------------------------
   -- Aggiornamento dati anagrafici.

   IBMUTL200.LOGINF(pg_exec,
                    'Estrazione dati CUD - Dettaglio elaborazione',
                    'FASE 5',
                    'FASE 5 - Aggiornamento dati anagrafici');

   insDatiAnagCud(inEsercizio,
                  inRepID);

   -------------------------------------------------------------------------------------------------
   -- Calcolo del numero di giorni di riferimento

   IBMUTL200.LOGINF(pg_exec,
                    'Estrazione dati CUD - Dettaglio elaborazione',
                    'FASE 6',
                    'FASE 6 - Calcolo giorni lavoro');

   calcolaGiorniLavoro(inEsercizio,
                       inRepID,
                       inUtente);

   -------------------------------------------------------------------------------------------------
   -- Aggiornamento dati su annotazioni

   IBMUTL200.LOGINF(pg_exec,
                    'Estrazione dati CUD - Dettaglio elaborazione',
                    'FASE 7',
                    'FASE 7 - Inserimento dettaglio annotazioni');

   insDatiAnnotazioniCud(inEsercizio,
                         inRepID);

   -------------------------------------------------------------------------------------------------
   -- Determino la tipologia di reddito preponderante per CNR.

   IBMUTL200.LOGINF(pg_exec,
                    'Estrazione dati CUD - Dettaglio elaborazione',
                    'FASE 8',
                    'FASE 8 - Determino la tipologia di reddito principale');

   calcolaTipologiaReddito(inEsercizio,
                           inRepID);

   -------------------------------------------------------------------------------------------------
   -- Determino l'acconto per l'addizionale comunale

   IBMUTL200.LOGINF(pg_exec,
                    'Estrazione dati CUD - Dettaglio elaborazione',
                    'FASE 9',
                    'FASE 9 - Determino Acconto Addizionale Comunale');

   calcolaAccontoAddCom(inEsercizio,
                        inRepID);
   -------------------------------------------------------------------------------------------------
   -- Scrittura del file di output

   IBMUTL200.LOGINF(pg_exec,
                    'Estrazione dati CUD - Dettaglio elaborazione',
                    'FASE 10',
                    'FASE 10 - creazione CLOB (file output)');

   scriviFileOutput(inEsercizio,
                    inRepID,
                    inUtente);

-------------------------------------------------------------------------------------------------
   -- Inserimento carichi familiari in ESTRAZIONE_CUD_CARICHI_FAM

   IBMUTL200.LOGINF(pg_exec,
                    'Estrazione dati CUD - Dettaglio elaborazione',
                    'FASE 10',
                    'FASE 10 - Inserimento Carichi Familiari');

   inserisciCarichiFamiliari(inEsercizio,
                             inRepID);

-------------------------------------------------------------------------------------------------

   IBMUTL200.LOGINF(pg_exec,
                    'Estrazione dati CUD - Dettaglio elaborazione',
                    'FASE 11',
                    'FASE 11 - Fine caricamento');

END estrazioneDatiCUD;

-- =================================================================================================
-- Lancio estrazione CUD
-- =================================================================================================
PROCEDURE estrazioneCUDInterna
   (
    inEsercizio NUMBER,
    inCdAnag VARCHAR2,
    inRepID INTEGER,
    inMsgError IN OUT VARCHAR2,
    inUtente VARCHAR2,
    pg_exec NUMBER
   ) IS

   aCdAnag NUMBER(8);

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Controllo congruenza parametri in input

   chkParametriInput(inEsercizio,
                     inCdAnag,
                     inRepID,
                     inUtente);

   -------------------------------------------------------------------------------------------------
   -- Valorizza parametri

   -- Normalizzazione del codice anagrafico

   aCdAnag:=NULL;
   IF inCdAnag != '%' THEN
      aCdAnag:=inCdAnag;
   END IF;

   -------------------------------------------------------------------------------------------------
   -- Lettura parametri di base alla procedura.

   valorizzaParametri(inEsercizio);

   -------------------------------------------------------------------------------------------------
   -- Estrazione dati per CUD.

   estrazioneDatiCUD(inEsercizio,
                     aCdAnag,
                     inRepID,
                     inUtente,
                     pg_exec);


END  estrazioneCUDInterna;

-- =================================================================================================
-- Guscio per gestione estrazione CUD in batch
-- =================================================================================================
PROCEDURE job_estrazioneCUD
   (
    job NUMBER,
    pg_exec NUMBER,
    next_date DATE,
    inEsercizio NUMBER,
    inCdAnag VARCHAR2,
    inRepID INTEGER,
    inMsgError VARCHAR2,
    inUtente VARCHAR2
   ) IS
   aStringa VARCHAR2(2000);
   i BINARY_INTEGER;

BEGIN

   -- Lancio start esecuzione log

   aStringa:=inMsgError;

   IBMUTL210.logStartExecutionUpd(pg_exec, IDTIPOLOG, job, 'Richista utente:' || inUtente,
                                  'Estrazione dati CUD. Start:' || TO_CHAR(sysdate,'YYYY/MM/DD HH-MI-SS'));

   BEGIN

      estrazioneCUDInterna(inEsercizio,
                           inCdAnag,
                           inRepID,
                           aStringa,
                           inUtente,
                           pg_exec);

      COMMIT;

      -- Messaggio di operazione completata ad utente

      IBMUTL205.LOGINF('Estrazione dati CUD',
                       'Estrazione dati CUD ' || TO_CHAR(sysdate,'DD/MM/YYYY HH:MI:SS'),
                       'Operazione completata con successo',
                       inUtente);

   EXCEPTION

      WHEN others THEN
           ROLLBACK;

      -- Messaggio di attenzione ad utente

      IBMUTL205.LOGWAR('Estrazione dati CUD ' || errori_tab.COUNT,
                       'Estrazione dati CUD ' || TO_CHAR(sysdate,'DD/MM/YYYY HH:MI:SS') || ' ' ||
                       '(pg_exec = ' || pg_exec || ')', DBMS_UTILITY.FORMAT_ERROR_STACK, inUtente);

      -- Scrittura degli eventuali altri errori

      IF errori_tab.COUNT > 0 THEN

         FOR i IN errori_tab.FIRST .. errori_tab.LAST

         LOOP

            IBMUTL200.LOGWAR(pg_exec,
                             'Estrazione dati CUD - Dettaglio errori',
                             'Errore : ' || errori_tab(i).tStringaErr,
                             'Identificativo = ' || errori_tab(i).tStringaKey);

         END LOOP;

      END IF;

   END;

END job_estrazioneCUD;

-- =================================================================================================
-- Main estrazione CUD Standard
-- =================================================================================================
PROCEDURE estrazioneCUD
   (
    inEsercizio NUMBER,
    inCdAnag VARCHAR2,
    inRepID INTEGER,
    inMsgError IN OUT VARCHAR2,
    inUtente VARCHAR2
   ) IS

   aProcedure VARCHAR2(2000);
   aStringa VARCHAR2(2000);

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Valorizza parametri

   aStringa:=inMsgError;

   -------------------------------------------------------------------------------------------------
   -- Attivazione della gestione batch per estrazione CUD

   aProcedure:='CNRCTB900.job_estrazioneCud(job, ' ||
                                            'pg_exec, ' ||
                                            'next_date, ' ||
                                            inEsercizio || ',''' ||
                                            inCdAnag || ''',' ||
                                            inRepID || ',''' ||
                                            aStringa || ''',' ||
                                            '''' || inUtente || ''');';

   IBMUTL210.CREABATCHDINAMICO('Estrazione dati CUD',
                               aProcedure,
                               inUtente);

   IBMUTL001.deferred_commit;

   IBMERR001.RAISE_ERR_GENERICO
      ('Operazione sottomessa per esecuzione. Al completamento l''utente riceverà un messaggio di notifica ' ||
       'dello stato dell''operazione');


END estrazioneCUD;

-- =================================================================================================

END; -- PACKAGE END;
/




© 2015 - 2024 Weber Informatics LLC | Privacy Policy