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

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

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

  CREATE OR REPLACE PACKAGE BODY "CNRCTB920" AS

-- =================================================================================================
-- Controllo congruenza parametri in input
-- =================================================================================================
PROCEDURE chkParametriInput
   (
    inEsercizio NUMBER,
    inCdCds VARCHAR2,
    inCdUo VARCHAR2,
    inRepID INTEGER,
    inUtente VARCHAR2
   ) IS

   numero INTEGER;

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Verifica congruenza parametri.
   --   aEsercizio, inCdCds, inCdUo, repID e aUtente non possono essere nulli

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

END chkParametriInput;

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

   i BINARY_INTEGER;

   aRecUnitaOrganizzativa UNITA_ORGANIZZATIVA%ROWTYPE;

BEGIN

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

   parametri_tab.DELETE;

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

   FOR i IN 1 .. 2

   LOOP

      BEGIN

         -- Memorizzazione della descrizione dell'unità organizzativa

         IF    i = 1 THEN

               aRecUnitaOrganizzativa:=CNRCTB020.getUOValida(inEsercizio,
                                                             inCdUo);

               IF aRecUnitaOrganizzativa.cd_tipo_unita = CNRCTB020.TIPO_SAC THEN
                  parametri_tab(i).intero:=0;
                  aRecUnitaOrganizzativa:=CNRCTB020.getCDSValido(inEsercizio,
                                                                 inCdCdS);
               ELSE
                  parametri_tab(i).intero:=1;
               END IF;

               parametri_tab(i).stringa:=aRecUnitaOrganizzativa.ds_unita_organizzativa;

        -- Memorizzazione STATO_CONTABILE_LIQUIDAZIONE_CORI dell'Ateneo

         ELSIF i = 2 THEN

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

         END IF;

      END;

   END LOOP;

END valorizzaParametri;

-- =================================================================================================
-- Inserimento record in ESTRAZIONE_INPS_DETT)
-- =================================================================================================
PROCEDURE insEstrazioneInpsDett
   (
    aRecEstrazioneInpsDett ESTRAZIONE_INPS_DETT%ROWTYPE
   ) IS

BEGIN

   INSERT INTO ESTRAZIONE_INPS_DETT
          (id_estrazione,
           esercizio,
           cd_cds_compenso,
           cd_uo_compenso,
           esercizio_compenso,
           pg_compenso,
           esercizio_pagamento,
           fl_senza_calcoli,
           stato_cofi,
           dt_registrazione_compenso,
           dt_cmp_da_compenso,
           dt_cmp_a_compenso,
           dt_emissione_mandato,
           dt_trasmissione_mandato,
           dt_pagamento_mandato,
           ti_anagrafico,
           cd_anag,
           cd_terzo,
           cd_trattamento,
           cd_contributo_ritenuta,
           ds_contributo_ritenuta,
           pg_riga,
           imponibile_cori,
           imponibile_cori_dett,
           aliquota_cori_dett,
           ammontare_cori_dett,
           cd_cds_versamento,
           esercizio_versamento,
           cd_uo_versamento,
           pg_liquidazione_versamento,
           cd_gruppo_cr_versamento,
           im_liquidato_versamento,
           dt_emissione_versamento,
           dt_trasmissione_versamento,
           dt_pagamento_versamento,
           dacr,
           utcr,
           duva,
           utuv,
           pg_ver_rec)
   VALUES (aRecEstrazioneInpsDett.id_estrazione,
           aRecEstrazioneInpsDett.esercizio,
           aRecEstrazioneInpsDett.cd_cds_compenso,
           aRecEstrazioneInpsDett.cd_uo_compenso,
           aRecEstrazioneInpsDett.esercizio_compenso,
           aRecEstrazioneInpsDett.pg_compenso,
           aRecEstrazioneInpsDett.esercizio_pagamento,
           aRecEstrazioneInpsDett.fl_senza_calcoli,
           aRecEstrazioneInpsDett.stato_cofi,
           aRecEstrazioneInpsDett.dt_registrazione_compenso,
           aRecEstrazioneInpsDett.dt_cmp_da_compenso,
           aRecEstrazioneInpsDett.dt_cmp_a_compenso,
           aRecEstrazioneInpsDett.dt_emissione_mandato,
           aRecEstrazioneInpsDett.dt_trasmissione_mandato,
           aRecEstrazioneInpsDett.dt_pagamento_mandato,
           aRecEstrazioneInpsDett.ti_anagrafico,
           aRecEstrazioneInpsDett.cd_anag,
           aRecEstrazioneInpsDett.cd_terzo,
           aRecEstrazioneInpsDett.cd_trattamento,
           aRecEstrazioneInpsDett.cd_contributo_ritenuta,
           aRecEstrazioneInpsDett.ds_contributo_ritenuta,
           aRecEstrazioneInpsDett.pg_riga,
           aRecEstrazioneInpsDett.imponibile_cori,
           aRecEstrazioneInpsDett.imponibile_cori_dett,
           aRecEstrazioneInpsDett.aliquota_cori_dett,
           aRecEstrazioneInpsDett.ammontare_cori_dett,
           aRecEstrazioneInpsDett.cd_cds_versamento,
           aRecEstrazioneInpsDett.esercizio_versamento,
           aRecEstrazioneInpsDett.cd_uo_versamento,
           aRecEstrazioneInpsDett.pg_liquidazione_versamento,
           aRecEstrazioneInpsDett.cd_gruppo_cr_versamento,
           aRecEstrazioneInpsDett.im_liquidato_versamento,
           aRecEstrazioneInpsDett.dt_emissione_versamento,
           aRecEstrazioneInpsDett.dt_trasmissione_versamento,
           aRecEstrazioneInpsDett.dt_pagamento_versamento,
           aRecEstrazioneInpsDett.dacr,
           aRecEstrazioneInpsDett.utcr,
           aRecEstrazioneInpsDett.duva,
           aRecEstrazioneInpsDett.utuv,
           aRecEstrazioneInpsDett.pg_ver_rec);

END insEstrazioneInpsDett;

-- =================================================================================================
-- Estrazione dati per stampa CUD (Inserimento record in ESTRAZIONE_INPS_DETT)
-- =================================================================================================
PROCEDURE inserisciDatiINPSDett
   (
    inEsercizio NUMBER,
    inCdCds VARCHAR2,
    inCdUo VARCHAR2,
    inRepID INTEGER,
    inUtente VARCHAR2
   ) IS

   memChiaveCompenso VARCHAR2(500);
   memPgRiga NUMBER(10);
   memTiCoriEPPrec CHAR(1);

   aRecVEstraiDatiInps V_ESTRAI_DATI_INPS%ROWTYPE;
   aRecEstrazioneInpsDett ESTRAZIONE_INPS_DETT%ROWTYPE;

   gen_cur GenericCurTyp;

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Inizializza variabili

   memChiaveCompenso:=NULL;
   memPgRiga:=NULL;
   memTiCoriEPPrec:=NULL;

   -------------------------------------------------------------------------------------------------
   -- Ciclo principale di lettura record per inserimento in ESTRAZIONE_INPS_DETT distinto per CDS SAC
   -- o altro

   BEGIN

      IF parametri_tab(2).stringa = CNRCTB575.STATO_LIQUID_CORI_INV THEN

         IF parametri_tab(1).intero = 0 THEN

            OPEN gen_cur FOR

                 SELECT *
                 FROM   V_ESTRAI_DATI_INPS
                 WHERE  cd_cds_compenso = inCdCds AND
                        esercizio_pagamento = inEsercizio AND
                        dt_trasmissione_mandato IS NOT NULL
                 ORDER BY cd_cds_compenso,
                          cd_uo_compenso,
                          esercizio_compenso,
                          pg_compenso,
		          pg_riga,
		          ti_ente_percipiente
                 FOR UPDATE OF pg_compenso NOWAIT;

         ELSE

            OPEN gen_cur FOR

                 SELECT *
                 FROM   V_ESTRAI_DATI_INPS
                 WHERE  cd_cds_compenso = inCdCds AND
                        cd_uo_compenso = inCdUo AND
                        esercizio_pagamento = inEsercizio AND
                        dt_trasmissione_mandato IS NOT NULL
                 ORDER BY cd_cds_compenso,
                          cd_uo_compenso,
                          esercizio_compenso,
                          pg_compenso,
		          pg_riga,
		          ti_ente_percipiente
                 FOR UPDATE OF pg_compenso NOWAIT;

         END IF;

      ELSE

         IF parametri_tab(1).intero = 0 THEN

            OPEN gen_cur FOR

                 SELECT *
                 FROM   V_ESTRAI_DATI_INPS
                 WHERE  cd_cds_compenso = inCdCds AND
                        esercizio_pagamento = inEsercizio
                 ORDER BY cd_cds_compenso,
                          cd_uo_compenso,
                          esercizio_compenso,
                          pg_compenso,
		          pg_riga,
		          ti_ente_percipiente
                 FOR UPDATE OF pg_compenso NOWAIT;

         ELSE

            OPEN gen_cur FOR

                 SELECT *
                 FROM   V_ESTRAI_DATI_INPS
                 WHERE  cd_cds_compenso = inCdCds AND
                        cd_uo_compenso = inCdUo AND
                        esercizio_pagamento = inEsercizio
                 ORDER BY cd_cds_compenso,
                          cd_uo_compenso,
                          esercizio_compenso,
                          pg_compenso,
		          pg_riga,
		          ti_ente_percipiente
                 FOR UPDATE OF pg_compenso NOWAIT;

         END IF;

      END IF;

      LOOP

         FETCH gen_cur INTO
               aRecVEstraiDatiInps;

         EXIT WHEN gen_cur%NOTFOUND;

         -- Prima volta

         IF  memChiaveCompenso IS NULL THEN
             aRecEstrazioneInpsDett:=NULL;
             memChiaveCompenso:=aRecVEstraiDatiInps.chiave_compenso;
             memPgRiga:=aRecVEstraiDatiInps.pg_riga;
             memTiCoriEPPrec:=TICORIPERCIP;
         END IF;

         -- Se il compenso letto è diverso dal precedente o se il progressivo di riga è diverso dal
         -- precedente allora scrivo il compenso in ESTRAZIONE_INPS_DETT

         IF (memChiaveCompenso != aRecVEstraiDatiInps.chiave_compenso OR
             memPgRiga != aRecVEstraiDatiInps.pg_riga) THEN
            insEstrazioneInpsDett(aRecEstrazioneInpsDett);
            memChiaveCompenso:=aRecVEstraiDatiInps.chiave_compenso;
            memPgRiga:=aRecVEstraiDatiInps.pg_riga;
         END IF;

         -- Controllo sequenza record ENTE --> PERCIPIENTE

         IF aRecVEstraiDatiInps.ti_ente_percipiente = memTiCoriEPPrec THEN
            IBMERR001.RAISE_ERR_GENERICO
               ('Errore in sequenza record. Un CORI ente non è precedute da uno percipiente o viceversa ' || CHR(10) ||
                'Compenso UO ' || aRecVEstraiDatiInps.cd_uo_compenso ||
                ' esercizio ' || aRecVEstraiDatiInps.esercizio_compenso ||
                ' progressivo ' || aRecVEstraiDatiInps.pg_compenso);
         END IF;

         memTiCoriEPPrec:=aRecVEstraiDatiInps.ti_ente_percipiente;

         -- Costruzione del record

         IF aRecVEstraiDatiInps.ti_ente_percipiente = TICORIENTE THEN

            aRecEstrazioneInpsDett:=NULL;
            aRecEstrazioneInpsDett.id_estrazione:=inRepID;
            aRecEstrazioneInpsDett.esercizio:=inEsercizio;
            aRecEstrazioneInpsDett.cd_cds_compenso:=aRecVEstraiDatiInps.cd_cds_compenso;
            aRecEstrazioneInpsDett.cd_uo_compenso:=aRecVEstraiDatiInps.cd_uo_compenso;
            aRecEstrazioneInpsDett.esercizio_compenso:=aRecVEstraiDatiInps.esercizio_compenso;
            aRecEstrazioneInpsDett.pg_compenso:=aRecVEstraiDatiInps.pg_compenso;
            aRecEstrazioneInpsDett.esercizio_pagamento:=aRecVEstraiDatiInps.esercizio_pagamento;
            aRecEstrazioneInpsDett.fl_senza_calcoli:=aRecVEstraiDatiInps.fl_senza_calcoli;
            aRecEstrazioneInpsDett.stato_cofi:=aRecVEstraiDatiInps.stato_cofi;
            aRecEstrazioneInpsDett.dt_registrazione_compenso:=aRecVEstraiDatiInps.dt_registrazione_compenso;
            aRecEstrazioneInpsDett.dt_cmp_da_compenso:=TRUNC(aRecVEstraiDatiInps.dt_cmp_da_compenso);
            aRecEstrazioneInpsDett.dt_cmp_a_compenso:=TRUNC(aRecVEstraiDatiInps.dt_cmp_a_compenso);
            aRecEstrazioneInpsDett.dt_emissione_mandato:=TRUNC(aRecVEstraiDatiInps.dt_emissione_mandato);
            aRecEstrazioneInpsDett.dt_trasmissione_mandato:=TRUNC(aRecVEstraiDatiInps.dt_trasmissione_mandato);
            aRecEstrazioneInpsDett.dt_pagamento_mandato:=TRUNC(aRecVEstraiDatiInps.dt_pagamento_mandato);
            aRecEstrazioneInpsDett.ti_anagrafico:=aRecVEstraiDatiInps.ti_anagrafico;
            aRecEstrazioneInpsDett.cd_anag:=aRecVEstraiDatiInps.cd_anag;
            aRecEstrazioneInpsDett.cd_terzo:=aRecVEstraiDatiInps.cd_terzo;
            aRecEstrazioneInpsDett.cd_trattamento:=aRecVEstraiDatiInps.cd_trattamento;
            aRecEstrazioneInpsDett.cd_contributo_ritenuta:=aRecVEstraiDatiInps.cd_contributo_ritenuta;
            aRecEstrazioneInpsDett.ds_contributo_ritenuta:=aRecVEstraiDatiInps.ds_contributo_ritenuta;
            aRecEstrazioneInpsDett.pg_riga:=aRecVEstraiDatiInps.pg_riga;
            aRecEstrazioneInpsDett.imponibile_cori:=aRecVEstraiDatiInps.imponibile;
            --Per la Gestione degli OCCA ci sono tre casi:
            --1) Compensi OCCA normali (rapporto OCCA e fl_senza_calcoli = 'N')
            --2) Compensi OCCA registrati nel periodo transitorio (rapporto OCCA e fl_senza_calcoli = 'S')
            --3) Conguagli (rapporto OCCA, fl_senza_calcoli = 'S' e compenso.im_netto_percipiente < 0)
            --Nel caso 3) bisogna sempre sottrarre l'intera franchigia di 5000 euro
	    --Nel caso 2) bisogna controllare se lo stesso terzo ha un conguaglio perche' in tal caso
	    --            non si deve togliere la franchigia; se non ha conguagli, si deve togliere la franchigia
	    --            solo se ammontare è > 0 e imponibile > 5000
	    --Nel caso 1) bisogna prendere l'imponibile così come sta
	    Declare
	       rapporto	  	 VARCHAR2(10);
	       fl_sc	   	 VARCHAR2(1);
	       im_netto_perc	 NUMBER:=0;
	       rec_parametri_cnr parametri_cnr%Rowtype;
	    Begin
	       Select c.cd_tipo_rapporto, c.fl_senza_calcoli, c.im_netto_percipiente
	       Into rapporto, fl_sc, im_netto_perc
	       From compenso c
	       Where c.cd_cds = aRecVEstraiDatiInps.cd_cds_compenso
	         And c.cd_unita_organizzativa = aRecVEstraiDatiInps.cd_uo_compenso
	         And c.esercizio = aRecVEstraiDatiInps.esercizio_compenso
	         And c.pg_compenso = aRecVEstraiDatiInps.pg_compenso;
	         If rapporto != 'OCCA' Or  fl_sc = 'N' Then  -- non devo fare nulla
	            Null;
	         Else
	            rec_parametri_cnr := cnrutl001.getRecParametriCnr(inEsercizio);
	            --Devo vedere se e' un conguaglio
	            If Nvl(im_netto_perc,0) < 0 Then --è un conguaglio
	               If aRecEstrazioneInpsDett.imponibile_cori > Nvl(rec_parametri_cnr.importo_franchigia_occa,0) Then
	                   aRecEstrazioneInpsDett.imponibile_cori :=
	                      aRecEstrazioneInpsDett.imponibile_cori - Nvl(rec_parametri_cnr.importo_franchigia_occa,0);
	               End If;
	            Else
	                 --Non e' un Conguaglio ma devo vedere se togliere la franchigia
			 Declare
			    contacong NUMBER:= 0;
			    contaOccaSCNoCong NUMBER:= 0;
			 Begin
			    Select Count(1)
			    Into contacong
			    From compenso c
			    Where c.cd_terzo = aRecVEstraiDatiInps.cd_terzo
			      And to_char(c.dt_emissione_mandato,'YYYY') = inEsercizio
			      And c.cd_tipo_rapporto ='OCCA'
			      And c.fl_senza_calcoli = 'Y'
			      And c.im_netto_percipiente < 0;

			      If contacong > 0 Then
			         Null;
			      Else
			        --esiste solo un caso ed e' registrato male (hanno gia' tolto
				--loro la franchigia) quindi non la tolgo
			          --If aRecEstrazioneInpsDett.imponibile_cori > Nvl(rec_parametri_cnr.importo_franchigia_occa,0) Then
			          --    aRecEstrazioneInpsDett.imponibile_cori :=
			          --        aRecEstrazioneInpsDett.imponibile_cori - Nvl(rec_parametri_cnr.importo_franchigia_occa,0);
			          --End If;
			         Null;
			      End If;
			 End;
		    End If;
	         End If;
	    End;

            IF aRecVEstraiDatiInps.pg_riga = 0 THEN
               --aRecEstrazioneInpsDett.imponibile_cori_dett:=aRecVEstraiDatiInps.imponibile;
               aRecEstrazioneInpsDett.imponibile_cori_dett:=aRecEstrazioneInpsDett.imponibile_cori;
               aRecEstrazioneInpsDett.aliquota_cori_dett:=aRecVEstraiDatiInps.aliquota;
               aRecEstrazioneInpsDett.ammontare_cori_dett:=aRecVEstraiDatiInps.ammontare;
            ELSE
               aRecEstrazioneInpsDett.imponibile_cori_dett:=aRecVEstraiDatiInps.imponibile_det;
               aRecEstrazioneInpsDett.aliquota_cori_dett:=aRecVEstraiDatiInps.aliquota_det;
               aRecEstrazioneInpsDett.ammontare_cori_dett:=aRecVEstraiDatiInps.ammontare_det;
            END IF;
            aRecEstrazioneInpsDett.im_liquidato_versamento:=0;
            aRecEstrazioneInpsDett.dacr:=dataOdierna;
            aRecEstrazioneInpsDett.utcr:=inUtente;
            aRecEstrazioneInpsDett.duva:=dataOdierna;
            aRecEstrazioneInpsDett.utuv:=inUtente;
            aRecEstrazioneInpsDett.pg_ver_rec:=1;
         ELSE

            IF aRecVEstraiDatiInps.pg_riga = 0 THEN
               aRecEstrazioneInpsDett.aliquota_cori_dett:=aRecEstrazioneInpsDett.aliquota_cori_dett +
                                                          aRecVEstraiDatiInps.aliquota;
               aRecEstrazioneInpsDett.ammontare_cori_dett:=aRecEstrazioneInpsDett.ammontare_cori_dett +
                                                           aRecVEstraiDatiInps.ammontare;
            ELSE
               aRecEstrazioneInpsDett.aliquota_cori_dett:=aRecEstrazioneInpsDett.aliquota_cori_dett +
                                                          aRecVEstraiDatiInps.aliquota_det;
               aRecEstrazioneInpsDett.ammontare_cori_dett:=aRecEstrazioneInpsDett.ammontare_cori_dett +
                                                           aRecVEstraiDatiInps.ammontare_det;
            END IF;

         END IF;

      END LOOP;

      CLOSE gen_cur;

      -- Scrittura ultimo record
      -- ma solo se la fetch ha restituito dei valori
      If memChiaveCompenso Is Not Null Then
          insEstrazioneInpsDett(aRecEstrazioneInpsDett);
      End If;

   END;

END inserisciDatiINPSDett;

-- =================================================================================================
-- Estrazione dati per stampa INPS (Aggiornamento record in ESTRAZIONE_INPS_DETT per versamenti)
-- =================================================================================================
PROCEDURE upgDatiINPSDettVersamento
   (
    inEsercizio NUMBER,
    inRepID INTEGER
   ) IS

   aDtEmissione DATE;
   aDtTrasmissione DATE;
   aDtPagamento DATE;

   aRecEstrazioneINPSDett ESTRAZIONE_INPS_DETT%ROWTYPE;
   aRecLiquidGruppoCori LIQUID_GRUPPO_CORI%ROWTYPE;

   gen_cur GenericCurTyp;

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Recupero delle informazioni relativi ai versamenti

   BEGIN

      OPEN gen_cur FOR

           SELECT A.cd_cds_compenso,
                  A.cd_uo_compenso,
                  A.esercizio_compenso,
                  A.pg_compenso,
                  A.cd_contributo_ritenuta,
                  C.cd_cds,
                  C.esercizio,
                  C.cd_unita_organizzativa,
                  C.pg_liquidazione,
                  C.im_liquidato,
                  C.fl_accentrato,
                  C.stato,
                  C.cd_gruppo_cr,
                  C.cd_cds_doc,
                  C.esercizio_doc,
                  C.pg_doc,
                  C.cd_cds_rev,
                  C.esercizio_rev,
                  C.pg_rev
           FROM   ESTRAZIONE_INPS_DETT A,
                  LIQUID_GRUPPO_CORI_DET B,
                  LIQUID_GRUPPO_CORI 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_contributo_ritenuta = A.esercizio_compenso AND
                  B.pg_compenso = A.pg_compenso AND
                  B.cd_contributo_ritenuta = A.cd_contributo_ritenuta AND
                  C.cd_cds = B.cd_cds AND
                  C.esercizio = B.esercizio AND
                  C.cd_unita_organizzativa = B.cd_unita_organizzativa AND
                  C.pg_liquidazione = B.pg_liquidazione AND
                  C.cd_cds_origine = B.cd_cds_origine AND
                  C.cd_uo_origine = B.cd_uo_origine AND
                  C.pg_liquidazione_origine = B.pg_liquidazione_origine AND
                  C.cd_gruppo_cr = B.cd_gruppo_cr AND
                  C.cd_regione = B.cd_regione AND
                  C.pg_comune = B.pg_comune;

      LOOP

         FETCH gen_cur INTO
               aRecEstrazioneINPSDett.cd_cds_compenso,
               aRecEstrazioneINPSDett.cd_uo_compenso,
               aRecEstrazioneINPSDett.esercizio_compenso,
               aRecEstrazioneINPSDett.pg_compenso,
               aRecEstrazioneINPSDett.cd_contributo_ritenuta,
               aRecLiquidGruppoCori.cd_cds,
               aRecLiquidGruppoCori.esercizio,
               aRecLiquidGruppoCori.cd_unita_organizzativa,
               aRecLiquidGruppoCori.pg_liquidazione,
               aRecLiquidGruppoCori.im_liquidato,
               aRecLiquidGruppoCori.fl_accentrato,
               aRecLiquidGruppoCori.stato,
               aRecLiquidGruppoCori.cd_gruppo_cr,
               aRecLiquidGruppoCori.cd_cds_doc,
               aRecLiquidGruppoCori.esercizio_doc,
               aRecLiquidGruppoCori.pg_doc,
               aRecLiquidGruppoCori.cd_cds_rev,
               aRecLiquidGruppoCori.esercizio_rev,
               aRecLiquidGruppoCori.pg_rev;

         EXIT WHEN gen_cur%NOTFOUND;

         -- Recupero date emissione, trasmissione e pagamento di mandato o reversale associati
         -- alla liquidazione cori

         BEGIN

            IF aRecLiquidGruppoCori.pg_doc IS NOT NULL THEN

               SELECT dt_emissione, TRUNC(dt_trasmissione), TRUNC(dt_pagamento)
                      INTO aDtEmissione, aDtTrasmissione, aDtPagamento
               FROM   MANDATO
               WHERE  cd_cds = aRecLiquidGruppoCori.cd_cds_doc AND
                      esercizio = aRecLiquidGruppoCori.esercizio_doc AND
                      pg_mandato = aRecLiquidGruppoCori.pg_doc;

            END IF;

            IF (aRecLiquidGruppoCori.pg_doc IS NULL AND
                aRecLiquidGruppoCori.pg_rev IS NOT NULL) THEN

               SELECT dt_emissione, TRUNC(dt_trasmissione), TRUNC(dt_incasso)
                      INTO aDtEmissione, aDtTrasmissione, aDtPagamento
               FROM   REVERSALE
               WHERE  cd_cds = aRecLiquidGruppoCori.cd_cds_rev AND
                      esercizio = aRecLiquidGruppoCori.esercizio_rev AND
                      pg_reversale = aRecLiquidGruppoCori.pg_rev;

            END IF;

         EXCEPTION

            WHEN no_data_found THEN
                 aDtEmissione:=NULL;
                 aDtTrasmissione:=NULL;
                 aDtPagamento:=NULL;

         END;

         -- Aggiornamento dati versamento su tabella ESTRAZIONE_INPS_DETT

         BEGIN

            UPDATE ESTRAZIONE_INPS_DETT
            SET    cd_cds_versamento = aRecLiquidGruppoCori.cd_cds,
                   esercizio_versamento = aRecLiquidGruppoCori.esercizio,
                   cd_uo_versamento = aRecLiquidGruppoCori.cd_unita_organizzativa,
                   pg_liquidazione_versamento = aRecLiquidGruppoCori.pg_liquidazione,
                   cd_gruppo_cr_versamento = aRecLiquidGruppoCori.cd_gruppo_cr,
                   im_liquidato_versamento = aRecLiquidGruppoCori.im_liquidato,
                   dt_emissione_versamento = aDtEmissione,
                   dt_trasmissione_versamento = aDtTrasmissione,
                   dt_pagamento_versamento = aDtPagamento
            WHERE  id_estrazione = inRepID AND
                   esercizio = inEsercizio AND
                   cd_cds_compenso = aRecEstrazioneINPSDett.cd_cds_compenso AND
                   cd_uo_compenso = aRecEstrazioneINPSDett.cd_uo_compenso AND
                   esercizio_compenso = aRecEstrazioneINPSDett.esercizio_compenso AND
                   pg_compenso = aRecEstrazioneINPSDett.pg_compenso;

         END;

      END LOOP;

      CLOSE gen_cur;

   END;

END upgDatiINPSDettVersamento;

-- =================================================================================================
-- Composizione matrice versamenti INPS
-- =================================================================================================
PROCEDURE creaMatriceVersamentiINPS
   (
    inEsercizio NUMBER,
    inRepID INTEGER
   ) IS

   aDataRif DATE;

   i BINARY_INTEGER;
   k BINARY_INTEGER;

   aRecEstrazioneINPSDett ESTRAZIONE_INPS_DETT%ROWTYPE;

   gen_cur GenericCurTyp;

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Inizializza matrice versamenti

   BEGIN

      FOR i IN 1 .. 12

      LOOP

         versamenti_tab(i).tDtVersamento:=NULL;
         versamenti_tab(i).tNumVersamenti:=0;
         versamenti_tab(i).tImVersato:=0;
         versamenti_tab(i).tImDovuto:=0;

      END LOOP;

   END;

   -------------------------------------------------------------------------------------------------
   -- Ciclo principale di lettura ESTRAZIONE_INPS_DETT per valorizzare la matrice dei versamenti

   BEGIN

      IF parametri_tab(2).stringa = CNRCTB575.STATO_LIQUID_CORI_INV THEN

         OPEN gen_cur FOR

              SELECT DISTINCT cd_cds_versamento,
                     esercizio_versamento,
                     cd_uo_versamento,
                     pg_liquidazione_versamento,
                     im_liquidato_versamento,
                     dt_trasmissione_versamento
              FROM   ESTRAZIONE_INPS_DETT
              WHERE  id_estrazione = inRepID AND
                     esercizio = inEsercizio AND
                     dt_trasmissione_versamento IS NOT NULL
              ORDER BY dt_trasmissione_versamento;

      ELSE

         OPEN gen_cur FOR

              SELECT DISTINCT cd_cds_versamento,
                     esercizio_versamento,
                     cd_uo_versamento,
                     pg_liquidazione_versamento,
                     im_liquidato_versamento,
                     dt_emissione_versamento
              FROM   ESTRAZIONE_INPS_DETT
              WHERE  id_estrazione = inRepID AND
                     esercizio = inEsercizio AND
                     dt_emissione_versamento IS NOT NULL
              ORDER BY dt_emissione_versamento;

      END IF;

      LOOP

         FETCH gen_cur INTO
               aRecEstrazioneINPSDett.cd_cds_versamento,
               aRecEstrazioneINPSDett.esercizio_versamento,
               aRecEstrazioneINPSDett.cd_uo_versamento,
               aRecEstrazioneINPSDett.pg_liquidazione_versamento,
               aRecEstrazioneINPSDett.im_liquidato_versamento,
               aDataRif;

         EXIT WHEN gen_cur%NOTFOUND;

         -- Determino il mese di riferimento. E' pari allo stesso mese per giorni > di 15 altrimenti mese = mese -1.
         -- Correggo il mese mantenendolo pari a 1 se la data di riferimento è inferiore al 16/01/inEsercizio.
         -- Correggo il mese mantenendolo pari a 12 se la data di riferimento è maggiore del 31/12/inEsercizio.

         IF aDataRif > TO_DATE('3112' || inEsercizio, 'DDMMYYYY') THEN
            k:=12;
         ELSE
            IF IBMUTL001.getDayOfDate(aDataRif) > 15 THEN
               k:=IBMUTL001.getMonthOfDate(aDataRif);
            ELSE
               IF aDataRif < TO_DATE('1601' || inEsercizio,'DDMMYYYY') THEN
                  k:=1;
               ELSE
                  k:=IBMUTL001.getMonthOfDate(aDataRif) - 1;
               END IF;
            END IF;
         END IF;

         -- Valorizzo la matrice dei versamenti

         IF versamenti_tab(k).tDtVersamento IS NULL THEN
            versamenti_tab(k).tDtVersamento:=aDataRif;
            versamenti_tab(k).tNumVersamenti:=1;
         ELSE
            versamenti_tab(k).tNumVersamenti:=versamenti_tab(k).tNumVersamenti + 1;
            IF versamenti_tab(k).tDtVersamento < aDataRif THEN
               versamenti_tab(k).tDtVersamento:=aDataRif;
            END IF;
         END IF;

         versamenti_tab(k).tImVersato:=versamenti_tab(k).tImVersato + aRecEstrazioneINPSDett.im_liquidato_versamento;

      END LOOP;

      CLOSE gen_cur;

   END;

END creaMatriceVersamentiINPS;

-- =================================================================================================
-- Inserimento di un record in VP_STM_ESTRAZIONE_INPS
-- =================================================================================================
PROCEDURE insRecordStampaINPS
   (
    aRecVpStmEstrazioneINPS VP_STM_ESTRAZIONE_INPS%ROWTYPE,
    aSequenza IN OUT INTEGER
   ) IS

BEGIN

   aSequenza:=aSequenza + 1;

   INSERT INTO VP_STM_ESTRAZIONE_INPS
          (id_report,
           gruppo,
           tipologia_riga,
           sequenza,
           titolo,
           esercizio,
           cd_uo_descrizione,
           cd_anag,
           cognome_nome,
           comune_data_nascita,
           codice_fiscale,
           indirizzo,
           cap_comune_residenza,
           attivita_inps,
           altra_forma_ass_inps,
           cd_cds_compenso,
           cd_uo_compenso,
           esercizio_compenso,
           pg_compenso,
           v_mese_pagamento,
           v_data_versamento,
           v_numero_versamenti,
           v_importo_versato,
           v_importo_dovuto,
           v_importo_saldo,
           d_mese_compenso,
           d_imponibile_previdenziale,
           d_tipo_cori_inps,
           d_fl_senza_calcoli,
           d_imponibile_aliquota,
           d_aliquota,
           d_contributo_dovuto,
           d_dt_attivita_da,
           d_dt_attivita_a,
           d_dt_versamento)
   VALUES (aRecVpStmEstrazioneINPS.id_report,
           aRecVpStmEstrazioneINPS.gruppo,
           aRecVpStmEstrazioneINPS.tipologia_riga,
           aSequenza,
           aRecVpStmEstrazioneINPS.titolo,
           aRecVpStmEstrazioneINPS.esercizio,
           aRecVpStmEstrazioneINPS.cd_uo_descrizione,
           aRecVpStmEstrazioneINPS.cd_anag,
           aRecVpStmEstrazioneINPS.cognome_nome,
           aRecVpStmEstrazioneINPS.comune_data_nascita,
           aRecVpStmEstrazioneINPS.codice_fiscale,
           aRecVpStmEstrazioneINPS.indirizzo,
           aRecVpStmEstrazioneINPS.cap_comune_residenza,
           aRecVpStmEstrazioneINPS.attivita_inps,
           aRecVpStmEstrazioneINPS.altra_forma_ass_inps,
           aRecVpStmEstrazioneINPS.cd_cds_compenso,
           aRecVpStmEstrazioneINPS.cd_uo_compenso,
           aRecVpStmEstrazioneINPS.esercizio_compenso,
           aRecVpStmEstrazioneINPS.pg_compenso,
           aRecVpStmEstrazioneINPS.v_mese_pagamento,
           aRecVpStmEstrazioneINPS.v_data_versamento,
           aRecVpStmEstrazioneINPS.v_numero_versamenti,
           aRecVpStmEstrazioneINPS.v_importo_versato,
           aRecVpStmEstrazioneINPS.v_importo_dovuto,
           aRecVpStmEstrazioneINPS.v_importo_saldo,
           aRecVpStmEstrazioneINPS.d_mese_compenso,
           aRecVpStmEstrazioneINPS.d_imponibile_previdenziale,
           aRecVpStmEstrazioneINPS.d_tipo_cori_inps,
           aRecVpStmEstrazioneINPS.d_fl_senza_calcoli,
           aRecVpStmEstrazioneINPS.d_imponibile_aliquota,
           aRecVpStmEstrazioneINPS.d_aliquota,
           aRecVpStmEstrazioneINPS.d_contributo_dovuto,
           aRecVpStmEstrazioneINPS.d_dt_attivita_da,
           aRecVpStmEstrazioneINPS.d_dt_attivita_a,
           aRecVpStmEstrazioneINPS.d_dt_versamento);

END insRecordStampaINPS;

-- =================================================================================================
-- Inserimento dati per stampa INPS - Tabella VP_STM_ESTRAZIONE_INPS (DETTAGLIO COMPENSI)
-- =================================================================================================
PROCEDURE insDatiDettStampaINPS
   (
    inEsercizio NUMBER,
    inCdCds VARCHAR2,
    inCdUo VARCHAR2,
    inRepID INTEGER,
    inUtente VARCHAR2
   ) IS

   memCdAnag NUMBER(8);
   aPgStampa NUMBER;
   aPgReportGenerico NUMBER;
   aStringa VARCHAR2(200);
   aSequenza INTEGER;
   totImponibileINPS NUMBER(15,2);
   totDovutoINPS NUMBER(15,2);
   totVersatoINPS NUMBER(15,2);
   totSaldoINPS NUMBER(15,2);
   aDtMax DATE;
   aDtRif DATE;

   i BINARY_INTEGER;

   aRecEstrazioneINPSDett ESTRAZIONE_INPS_DETT%ROWTYPE;
   aRecVAnagraficoTutto V_ANAGRAFICO_TUTTO%ROWTYPE;
   aRecVpStmEstrazioneINPS VP_STM_ESTRAZIONE_INPS%ROWTYPE;
   aRecVpStmEstrazioneINPSBase VP_STM_ESTRAZIONE_INPS%ROWTYPE;
   aRecPrintPriority PRINT_PRIORITY%ROWTYPE;

   gen_cur GenericCurTyp;

BEGIN

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

   memCdAnag:=NULL;
   aSequenza:=100;
   aDtMax:=TO_DATE('3112' || inEsercizio,'DDMMYYYY');

   BEGIN

      SELECT pg_stampa.nextval INTO aPgStampa
      FROM   DUAL;

      SELECT IBMSEQ00_STAMPA.nextval INTO aPgReportGenerico
      FROM   DUAL;

   END;

   aRecVpStmEstrazioneINPSBase:=NULL;
   aRecVpStmEstrazioneINPSBase.id_report:=aPgReportGenerico;
   aRecVpStmEstrazioneINPSBase.gruppo:='B';
   aRecVpStmEstrazioneINPSBase.tipologia_riga:=TIRIGA_DET;
   aRecVpStmEstrazioneINPSBase.titolo:='ESTRAZIONE DATI INPS';
   aRecVpStmEstrazioneINPSBase.esercizio:=inEsercizio;
   IF parametri_tab(1).intero = 0 THEN
      aRecVpStmEstrazioneINPSBase.cd_uo_descrizione:=inCdCDS || ' ' || parametri_tab(1).stringa;
   ELSE
      aRecVpStmEstrazioneINPSBase.cd_uo_descrizione:=inCdUo || ' ' || parametri_tab(1).stringa;
   END IF;

   -------------------------------------------------------------------------------------------------
   -- Ciclo principale di lettura ESTRAZIONE_INPS_DETT per la scrittura dei dettagli per anagrafico
   -- in VP_STM_ESTRAZIONE_INPS e la valorizzazione dell'importo dovuto sulla matrice dei versamenti

   BEGIN

      -- Inizializzazione variabili

      IF parametri_tab(2).stringa = CNRCTB575.STATO_LIQUID_CORI_INV THEN

         OPEN gen_cur FOR

              SELECT *
              FROM   ESTRAZIONE_INPS_DETT
              WHERE  id_estrazione = inRepID AND
                     esercizio = inEsercizio
              ORDER BY cd_anag,
                       TO_CHAR(dt_trasmissione_mandato,'YYYYMM'),
                       cd_contributo_ritenuta,
                       dt_cmp_da_compenso;

      ELSE

         OPEN gen_cur FOR

              SELECT *
              FROM   ESTRAZIONE_INPS_DETT
              WHERE  id_estrazione = inRepID AND
                     esercizio = inEsercizio
              ORDER BY cd_anag,
                       TO_CHAR(dt_emissione_mandato,'YYYYMM'),
                       cd_contributo_ritenuta,
                       dt_cmp_da_compenso;

      END IF;

      LOOP

         FETCH gen_cur INTO
               aRecEstrazioneINPSDett;

         EXIT WHEN gen_cur%NOTFOUND;

         -- E' la prima volta o il soggetto anagrafico letto è diverso dal precedente --------------

         IF (memCdAnag IS NULL OR
             memCdAnag != aRecEstrazioneINPSDett.cd_anag) THEN

            -- Scrittura totali dettaglio B

            IF memCdAnag IS NOT NULL THEN
               aRecVpStmEstrazioneINPS.tipologia_riga:=TIRIGA_TOT;
               aRecVpStmEstrazioneINPS.cd_cds_compenso:=NULL;
               aRecVpStmEstrazioneINPS.cd_uo_compenso:=NULL;
               aRecVpStmEstrazioneINPS.esercizio_compenso:=NULL;
               aRecVpStmEstrazioneINPS.pg_compenso:=NULL;
               aRecVpStmEstrazioneINPS.d_mese_compenso:='Totale per percipiente';
               aRecVpStmEstrazioneINPS.d_imponibile_previdenziale:=totImponibileINPS;
               aRecVpStmEstrazioneINPS.d_tipo_cori_inps:=NULL;
               aRecVpStmEstrazioneINPS.d_fl_senza_calcoli:=NULL;
               aRecVpStmEstrazioneINPS.d_imponibile_aliquota:=NULL;
               aRecVpStmEstrazioneINPS.d_aliquota:=NULL;
               aRecVpStmEstrazioneINPS.d_contributo_dovuto:=totDovutoINPS;
               aRecVpStmEstrazioneINPS.d_dt_attivita_da:=NULL;
               aRecVpStmEstrazioneINPS.d_dt_attivita_a:=NULL;
               aRecVpStmEstrazioneINPS.d_dt_versamento:=NULL;
               insRecordStampaINPS(aRecVpStmEstrazioneINPS,
                                   aSequenza);
            END IF;

            -- Costruzione del record base ed azzeramento variabili di totale

            aRecVpStmEstrazioneINPS:=aRecVpStmEstrazioneINPSBase;
            memCdAnag:=aRecEstrazioneINPSDett.cd_anag;
            totImponibileINPS:=0;
            totDovutoINPS:=0;

            BEGIN

               SELECT * INTO aRecVAnagraficoTutto
               FROM   V_ANAGRAFICO_TUTTO
               WHERE  cd_anag = aRecEstrazioneINPSDett.cd_anag;

            END;

            aRecVpStmEstrazioneINPS.cd_anag:=aRecVAnagraficoTutto.cd_anag;
            aRecVpStmEstrazioneINPS.cognome_nome:=LTRIM(RTRIM(aRecVAnagraficoTutto.cognome || ' ' ||
                                                              aRecVAnagraficoTutto.nome || ' ' ||
                                                              aRecVAnagraficoTutto.ragione_sociale));

            aStringa:=NULL;
            IF aRecVAnagraficoTutto.ds_comune_nascita IS NOT NULL THEN
               aStringa:=aStringa || aRecVAnagraficoTutto.ds_comune_nascita || ' ';
            END IF;
            IF aRecVAnagraficoTutto.cd_provincia_nascita IS NOT NULL THEN
               aStringa:=aStringa || '(' || aRecVAnagraficoTutto.cd_provincia_nascita || ') ';
            END IF;
            IF aRecVAnagraficoTutto.dt_nascita IS NOT NULL THEN
               aStringa:=aStringa || TO_CHAR(aRecVAnagraficoTutto.dt_nascita,'DD/MM/YYYY');
            END IF;
            aRecVpStmEstrazioneINPS.comune_data_nascita:=aStringa;

            aRecVpStmEstrazioneINPS.codice_fiscale:=aRecVAnagraficoTutto.codice_fiscale;

            aStringa:=NULL;
            IF aRecVAnagraficoTutto.via_fiscale IS NOT NULL THEN
               aStringa:=aStringa || aRecVAnagraficoTutto.via_fiscale || ' ';
            END IF;
            IF aRecVAnagraficoTutto.num_civico_fiscale IS NOT NULL THEN
               aStringa:=aStringa || aRecVAnagraficoTutto.num_civico_fiscale;
            END IF;
            aRecVpStmEstrazioneINPS.indirizzo:=aStringa;

            aStringa:=NULL;
            IF aRecVAnagraficoTutto.cap_comune_fiscale IS NOT NULL THEN
               aStringa:=aStringa || aRecVAnagraficoTutto.cap_comune_fiscale || ' - ';
            END IF;
            IF aRecVAnagraficoTutto.ds_comune_fiscale IS NOT NULL THEN
               aStringa:=aStringa || aRecVAnagraficoTutto.ds_comune_fiscale || ' ';
            END IF;
            IF aRecVAnagraficoTutto.cd_provincia_fiscale IS NOT NULL THEN
               aStringa:=aStringa || '(' || aRecVAnagraficoTutto.cd_provincia_fiscale || ') ';
            END IF;
            aRecVpStmEstrazioneINPS.cap_comune_residenza:=aStringa;

            aStringa:=NULL;
            IF aRecVAnagraficoTutto.cd_attivita_inps IS NOT NULL THEN
               aStringa:=aStringa || aRecVAnagraficoTutto.cd_attivita_inps || ' - ';
            END IF;
            IF aRecVAnagraficoTutto.ds_attivita_inps IS NOT NULL THEN
               aStringa:=aStringa || aRecVAnagraficoTutto.ds_attivita_inps;
            END IF;
            aRecVpStmEstrazioneINPS.attivita_inps:=aStringa;

            aStringa:=NULL;
            IF aRecVAnagraficoTutto.altra_ass_previd_inps IS NOT NULL THEN
               aStringa:=aStringa || aRecVAnagraficoTutto.altra_ass_previd_inps || ' - ';
            END IF;
            IF aRecVAnagraficoTutto.ds_altra_ass_previd_inps IS NOT NULL THEN
               aStringa:=aStringa || aRecVAnagraficoTutto.ds_altra_ass_previd_inps;
            END IF;
            aRecVpStmEstrazioneINPS.altra_forma_ass_inps:=aStringa;

         END IF;

         -- Scrittura dati da ESTRAZIONE_INPS_DETT -------------------------------------------------

         aRecVpStmEstrazioneINPS.cd_cds_compenso:=aRecEstrazioneINPSDett.cd_cds_compenso;
         aRecVpStmEstrazioneINPS.cd_uo_compenso:=aRecEstrazioneINPSDett.cd_uo_compenso;
         aRecVpStmEstrazioneINPS.esercizio_compenso:=aRecEstrazioneINPSDett.esercizio_compenso;
         aRecVpStmEstrazioneINPS.pg_compenso:=aRecEstrazioneINPSDett.pg_compenso;
         IF parametri_tab(2).stringa = CNRCTB575.STATO_LIQUID_CORI_INV THEN
            aRecVpStmEstrazioneINPS.d_mese_compenso:=TO_CHAR(aRecEstrazioneINPSDett.dt_trasmissione_mandato,'MM');
         ELSE
            aRecVpStmEstrazioneINPS.d_mese_compenso:=TO_CHAR(aRecEstrazioneINPSDett.dt_emissione_mandato,'MM');
         END IF;
         aRecVpStmEstrazioneINPS.d_imponibile_previdenziale:=aRecEstrazioneINPSDett.imponibile_cori;
         aRecVpStmEstrazioneINPS.d_tipo_cori_inps:=aRecEstrazioneINPSDett.cd_contributo_ritenuta || ' - ' ||
                                                   aRecEstrazioneINPSDett.ds_contributo_ritenuta;
         aRecVpStmEstrazioneINPS.d_fl_senza_calcoli:=aRecEstrazioneINPSDett.fl_senza_calcoli;
         aRecVpStmEstrazioneINPS.d_imponibile_aliquota:=aRecEstrazioneINPSDett.imponibile_cori_dett;
         aRecVpStmEstrazioneINPS.d_aliquota:=aRecEstrazioneINPSDett.aliquota_cori_dett;
         aRecVpStmEstrazioneINPS.d_contributo_dovuto:=aRecEstrazioneINPSDett.ammontare_cori_dett;
         aRecVpStmEstrazioneINPS.d_dt_attivita_da:=aRecEstrazioneINPSDett.dt_cmp_da_compenso;
         aRecVpStmEstrazioneINPS.d_dt_attivita_a:=aRecEstrazioneINPSDett.dt_cmp_a_compenso;
         IF parametri_tab(2).stringa = CNRCTB575.STATO_LIQUID_CORI_INV THEN
            IF aRecEstrazioneINPSDett.dt_trasmissione_versamento IS NOT NULL THEN
               aRecVpStmEstrazioneINPS.d_dt_versamento:=aRecEstrazioneINPSDett.dt_trasmissione_versamento;
            ELSE
               aRecVpStmEstrazioneINPS.d_dt_versamento:=NULL;
            END IF;
         ELSE
            IF aRecEstrazioneINPSDett.dt_emissione_versamento IS NOT NULL THEN
               aRecVpStmEstrazioneINPS.d_dt_versamento:=aRecEstrazioneINPSDett.dt_emissione_versamento;
            ELSE
               aRecVpStmEstrazioneINPS.d_dt_versamento:=NULL;
            END IF;
         END IF;

         insRecordStampaINPS(aRecVpStmEstrazioneINPS,
                             aSequenza);

         -- Memorizzazione importi totali ----------------------------------------------------------

         totImponibileINPS:=totImponibileINPS + aRecEstrazioneINPSDett.imponibile_cori;
         totDovutoINPS:=totDovutoINPS + aRecEstrazioneINPSDett.ammontare_cori_dett;

         -- Memorizzazione del dovuto su matrice versamenti ----------------------------------------

         IF parametri_tab(2).stringa = CNRCTB575.STATO_LIQUID_CORI_INV THEN
            aDtRif:= aRecEstrazioneINPSDett.dt_trasmissione_mandato;
         ELSE
            aDtRif:= aRecEstrazioneINPSDett.dt_emissione_mandato;
         END IF;

         IF aDtRif > aDtMax THEN
            aDtRif:=aDtMax;
         END IF;

         i:=IBMUTL001.getMonthOfDate(aDtRif);
         versamenti_tab(i).tImDovuto:=versamenti_tab(i).tImDovuto + aRecEstrazioneINPSDett.ammontare_cori_dett;

      END LOOP;

      CLOSE gen_cur;

      -- Scrittura ultimo totale
      -- ma solo se la fetch ha restituito dei valori
      If memCdAnag IS Not Null Then
       aRecVpStmEstrazioneINPS.tipologia_riga:=TIRIGA_TOT;
       aRecVpStmEstrazioneINPS.cd_cds_compenso:=NULL;
       aRecVpStmEstrazioneINPS.cd_uo_compenso:=NULL;
       aRecVpStmEstrazioneINPS.esercizio_compenso:=NULL;
       aRecVpStmEstrazioneINPS.pg_compenso:=NULL;
       aRecVpStmEstrazioneINPS.d_mese_compenso:='Totale per percipiente';
       aRecVpStmEstrazioneINPS.d_imponibile_previdenziale:=totImponibileINPS;
       aRecVpStmEstrazioneINPS.d_tipo_cori_inps:=NULL;
       aRecVpStmEstrazioneINPS.d_fl_senza_calcoli:=NULL;
       aRecVpStmEstrazioneINPS.d_imponibile_aliquota:=NULL;
       aRecVpStmEstrazioneINPS.d_aliquota:=NULL;
       aRecVpStmEstrazioneINPS.d_contributo_dovuto:=totDovutoINPS;
       aRecVpStmEstrazioneINPS.d_dt_attivita_da:=NULL;
       aRecVpStmEstrazioneINPS.d_dt_attivita_a:=NULL;
       aRecVpStmEstrazioneINPS.d_dt_versamento:=NULL;
       insRecordStampaINPS(aRecVpStmEstrazioneINPS,
                           aSequenza);
      End If;

   END;

   -------------------------------------------------------------------------------------------------
   -- Scarico in VP_STM_ESTRAZIONE_INPS della matrice versamenti

   BEGIN

      -- Inizializzazione variabili

      aSequenza:=1;
      totDovutoINPS:=0;
      totVersatoINPS:=0;
      totSaldoINPS:=0;

      aRecVpStmEstrazioneINPSBase.gruppo:='A';
      aRecVpStmEstrazioneINPSBase.tipologia_riga:=TIRIGA_DET;
      aRecVpStmEstrazioneINPSBase.cd_anag:=0;


      -- Ciclo scarico versamenti

      FOR i IN 1 .. 12

      LOOP

         aRecVpStmEstrazioneINPS:=aRecVpStmEstrazioneINPSBase;
         aRecVpStmEstrazioneINPS.v_mese_pagamento:=LPAD(i,2,0);
         aRecVpStmEstrazioneINPS.v_data_versamento:=versamenti_tab(i).tDtVersamento;
         aRecVpStmEstrazioneINPS.v_numero_versamenti:=versamenti_tab(i).tNumVersamenti;
         aRecVpStmEstrazioneINPS.v_importo_versato:=versamenti_tab(i).tImVersato;
         aRecVpStmEstrazioneINPS.v_importo_dovuto:=versamenti_tab(i).tImDovuto;
         aRecVpStmEstrazioneINPS.v_importo_saldo:=aRecVpStmEstrazioneINPS.v_importo_versato -
                                                  aRecVpStmEstrazioneINPS.v_importo_dovuto;

         insRecordStampaINPS(aRecVpStmEstrazioneINPS,
                             aSequenza);

         totDovutoINPS:=totDovutoINPS + aRecVpStmEstrazioneINPS.v_importo_dovuto;
         totVersatoINPS:=totVersatoINPS + aRecVpStmEstrazioneINPS.v_importo_versato;
         totSaldoINPS:=totSaldoINPS + aRecVpStmEstrazioneINPS.v_importo_saldo;

      END LOOP;

      -- Totale finale

      aRecVpStmEstrazioneINPS:=aRecVpStmEstrazioneINPSBase;
      aRecVpStmEstrazioneINPS.tipologia_riga:=TIRIGA_TOT;
      aRecVpStmEstrazioneINPS.v_mese_pagamento:='Totale';
      aRecVpStmEstrazioneINPS.v_importo_versato:=totVersatoINPS;
      aRecVpStmEstrazioneINPS.v_importo_dovuto:=totDovutoINPS;
      aRecVpStmEstrazioneINPS.v_importo_saldo:=totSaldoINPS;

      insRecordStampaINPS(aRecVpStmEstrazioneINPS,
                          aSequenza);

   END;

   -------------------------------------------------------------------------------------------------
   -- Accodamento stampa
   BEGIN

      aRecPrintPriority:=CNRCTB890.getPrintPriority(IDNOMESTAMPA);

       CNRCTB890.insPrintSpooler(aPgStampa,
                                0,
                                aRecPrintPriority.ds_report,
                                IDNOMESTAMPA,
                                aRecPrintPriority.priority,
                                CNRCTB890.STM_VISIBILE_UTENTE,
                                inUtente,
                                aPgReportGenerico,
                                inUtente,
                                SYSDATE);

       CNRCTB890.insPrintSpoolerParam(aPgStampa,
       				     'id',
       				     'java.lang.Long',
                                     aPgReportGenerico,
                                     inUtente,
                                     SYSDATE);

   END;
End insDatiDettStampaINPS;

-- =================================================================================================
-- Estrazione dati per stampa INPS
-- =================================================================================================
PROCEDURE estrazioneDatiINPS
   (
    inEsercizio NUMBER,
    inCdCds VARCHAR2,
    inCdUo VARCHAR2,
    inRepID INTEGER,
    inUtente VARCHAR2,
    pg_exec NUMBER
   ) IS

BEGIN

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

   dataOdierna:=sysdate;

   -------------------------------------------------------------------------------------------------
   -- Inserimento in ESTRAZIONE_INPS_DETT dei compensi oggetto di esposizione sulla stampa.

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

   inserisciDatiINPSDett(inEsercizio,
                         inCdCds,
                         inCdUo,
                         inRepID,
                         inUtente);

   COMMIT;

   -------------------------------------------------------------------------------------------------
   -- Inserimento in ESTRAZIONE_INPS_DETT dei compensi oggetto di esposizione sulla stampa. Recupero
   -- dei dati relativi ai versamenti

   IBMUTL200.LOGINF(pg_exec,
                    'Estrazione dati INPS - Dettaglio elaborazione',
                    'FASE 2',
                    'FASE 2 - Aggiornamento dati versamenti su compensi presenti in ESTRAZIONE_INPS_DETT');

   upgDatiINPSDettVersamento(inEsercizio,
                             inRepID);

   COMMIT;

   -------------------------------------------------------------------------------------------------
   -- Composizione matrice versamenti INPS

   IBMUTL200.LOGINF(pg_exec,
                    'Estrazione dati INPS - Dettaglio elaborazione',
                    'FASE 3',
                    'FASE 3 - Composizione matrice versamenti INPS');

   creaMatriceVersamentiINPS(inEsercizio,
                             inRepID);

   -------------------------------------------------------------------------------------------------
   -- Valorizzazione dati per stampa su VP_STM_ESTRAZIONE_INPS

   IBMUTL200.LOGINF(pg_exec,
                    'Estrazione dati INPS - Dettaglio elaborazione',
                    'FASE 4',
                    'FASE 4 - Valorizzazione dati per stampa su VP_STM_ESTRAZIONE_INPS');

   insDatiDettStampaINPS(inEsercizio,
                         inCdCds,
                         inCdUo,
                         inRepID,
                         inUtente);

   -------------------------------------------------------------------------------------------------
   -- Accodamento stampa

   IBMUTL200.LOGINF(pg_exec,
                    'Estrazione dati INPS - Dettaglio elaborazione',
                    'FASE 5',
                    'FASE 5 - Stampa accodata');

END estrazioneDatiINPS;

-- =================================================================================================
-- Lancio estrazione INPS
-- =================================================================================================
PROCEDURE estrazioneINPSInterna
   (
    inEsercizio NUMBER,
    inCdCds VARCHAR2,
    inCdUo VARCHAR2,
    inRepID INTEGER,
    inMsgError IN OUT VARCHAR2,
    inUtente VARCHAR2,
    pg_exec NUMBER
   ) IS

BEGIN

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

   chkParametriInput(inEsercizio,
                     inCdCds,
                     inCdUo,
                     inRepID,
                     inUtente);

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

   valorizzaParametri(inEsercizio,
                      inCdCds,
                      inCdUo);

   -------------------------------------------------------------------------------------------------
   -- Estrazione dati per INPS.

   estrazioneDatiINPS(inEsercizio,
                      inCdCds,
                      inCdUo,
                      inRepID,
                      inUtente,
                      pg_exec);


END  estrazioneINPSInterna;

-- =================================================================================================
-- Guscio per gestione estrazione INPS in batch
-- =================================================================================================
PROCEDURE job_estrazioneINPS
   (
    job NUMBER,
    pg_exec NUMBER,
    next_date DATE,
    inEsercizio NUMBER,
    inCdCds VARCHAR2,
    inCdUo 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 INPS. Start:' || TO_CHAR(sysdate,'YYYY/MM/DD HH-MI-SS'));

   BEGIN

      estrazioneINPSInterna(inEsercizio,
                            inCdCds,
                            inCdUo,
                            inRepID,
                            aStringa,
                            inUtente,
                            pg_exec);

      COMMIT;

      -- Messaggio di operazione completata ad utente

      IBMUTL205.LOGINF('Estrazione dati INPS',
                       'Estrazione dati INPS ' || TO_CHAR(sysdate,'DD/MM/YYYY HH:MI:SS'),
                       'Operazione completata con successo. ' ||
                       'Per la gestione della stampa entrare nella funzione Code di stampa',
                       inUtente);

   EXCEPTION

      WHEN others THEN
           ROLLBACK;

      -- Messaggio di attenzione ad utente

      IBMUTL205.LOGWAR('Estrazione dati INPS ' || errori_tab.COUNT,
                       'Estrazione dati INPS ' || 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 INPS - Dettaglio errori',
                             'Errore : ' || errori_tab(i).tStringaErr,
                             'Identificativo = ' || errori_tab(i).tStringaKey);

         END LOOP;

      END IF;

   END;

END job_estrazioneINPS;

-- =================================================================================================
-- Main estrazione INPS
-- =================================================================================================
PROCEDURE estrazioneINPS
   (
    inEsercizio NUMBER,
    inCdCds VARCHAR2,
    inCdUo 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 INPS

   aProcedure:='CNRCTB920.job_estrazioneINPS(job, ' ||
                                             'pg_exec, ' ||
                                             'next_date, ' ||
                                             inEsercizio || ',''' ||
                                             inCdCds || ''',' ||
                                             '''' || inCdUo || ''',' ||
                                             inRepID || ',''' ||
                                             aStringa || ''',' ||
                                             '''' || inUtente || ''');';

   IBMUTL210.CREABATCHDINAMICO('Estrazione dati INPS',
                               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 estrazioneINPS;

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

END; -- PACKAGE END;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy