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

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

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

  CREATE OR REPLACE PACKAGE BODY "CNRCTB505" AS

--==================================================================================================
-- Lettura di una missione esistente, verifica ammissibilità delle spese registrate e calcolo delle diarie
--==================================================================================================
PROCEDURE elaboraMissioneDiaria
   (
    inCdsMissione MISSIONE.cd_cds%TYPE,
    inUoMissione MISSIONE.cd_unita_organizzativa%TYPE,
    inEsercizioMissione MISSIONE.esercizio%TYPE,
    inPgMissione MISSIONE.pg_missione%TYPE
   ) IS
   eseguiLock CHAR(1);

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Memorizzazione parametri generali della procedura

   dataOdierna:=sysdate;
   eseguiLock:='Y';

   -------------------------------------------------------------------------------------------------
   -- Lettura dati di base legati alla missione in calcolo; testata missione, anagrafico, base
   -- inquadramento e quote esenti

   getDatiBaseMissione(inCdsMissione,
                       inUoMissione,
                       inEsercizioMissione,
                       inPgMissione,
                       eseguiLock);

   -------------------------------------------------------------------------------------------------
   -- Costruzione matrice diarie per tappa e verifica della consistenza delle spese. Queste devono
   -- trovare una entrata nella tabella MISSIONE_ABBATTIMENTI di configurazione all'ammissibilità
   -- delle stesse

   creaMatriceTappe;
   verificaConfigSpeseTappe;

   -------------------------------------------------------------------------------------------------
   -- Calcolo della diaria. Se la tappa è in comune altro non è possibile che la quota esente sia
   -- inferiore all'importo della diaria

   calcolaDiaria;

   -------------------------------------------------------------------------------------------------
   -- Cancellazione delle righe di diaria preesistenti nella missione ed inserimento di quelle calcolate

   inserisciDiarie;

END elaboraMissioneDiaria;
--==================================================================================================
-- Lettura di una missione esistente, verifica ammissibilità delle spese registrate e calcolo dei rimborsi
--==================================================================================================
PROCEDURE elaboraMissioneRimborso
   (
    inCdsMissione MISSIONE.cd_cds%TYPE,
    inUoMissione MISSIONE.cd_unita_organizzativa%TYPE,
    inEsercizioMissione MISSIONE.esercizio%TYPE,
    inPgMissione MISSIONE.pg_missione%TYPE,
    inCdTrattamento MISSIONE.cd_trattamento%TYPE default null
   ) IS
   eseguiLock CHAR(1);

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Memorizzazione parametri generali della procedura

   dataOdierna:=sysdate;
   eseguiLock:='Y';

   -------------------------------------------------------------------------------------------------
   -- Lettura dati di base legati alla missione in calcolo; testata missione, anagrafico, base
   -- inquadramento e quote esenti

   getDatiBaseMissione(inCdsMissione,
                       inUoMissione,
                       inEsercizioMissione,
                       inPgMissione,
                       eseguiLock);

   -------------------------------------------------------------------------------------------------
   -- Costruzione matrice diarie per tappa e verifica della consistenza delle spese. Queste devono
   -- trovare una entrata nella tabella MISSIONE_ABBATTIMENTI di configurazione all'ammissibilità
   -- delle stesse

   creaMatriceTappe;
   -- ???? da gestire     -- verificaConfigSpeseTappe;

   -------------------------------------------------------------------------------------------------
   -- Calcolo della diaria. Se la tappa è in comune altro non è possibile che la quota esente sia
   -- inferiore all'importo della diaria

   calcolaRimborso(inCdTrattamento);

   -------------------------------------------------------------------------------------------------
   -- Cancellazione delle righe di diaria preesistenti nella missione ed inserimento di quelle calcolate

   inserisciRimborsi;

END elaboraMissioneRimborso;

--==================================================================================================
-- Lettura dati di base legati alla missione in calcolo; testata missione, anagrafico, base
-- inquadramento e quote esenti
--==================================================================================================
PROCEDURE getDatiBaseMissione
   (
    inCdsMissione MISSIONE.cd_cds%TYPE,
    inUoMissione MISSIONE.cd_unita_organizzativa%TYPE,
    inEsercizioMissione MISSIONE.esercizio%TYPE,
    inPgMissione MISSIONE.pg_missione%TYPE,
    eseguiLock CHAR
   ) IS

BEGIN

   -- Lettura della testata della missione

   aRecMissione:=CNRCTB500.getMissione(inCdsMissione,
                                       inUoMissione,
                                       inEsercizioMissione,
                                       inPgMissione,
                                       eseguiLock);

   -- Recupero dei dati dell'anagrafico associato al terzo della missione

   aRecAnagrafico:=CNRCTB080.getAnag (aRecMissione.cd_terzo);

   -- Lettura dati base dell'inquadramento

   aRecRifInquadramento:=CNRCTB080.getRifInquadramento(aRecMissione.cd_tipo_rapporto,
                                                       aRecAnagrafico.cd_anag,
                                                       trunc(aRecMissione.dt_inizio_missione));

   -- Lettura della quota esente italia e estero

   IF (aRecMissione.fl_comune_proprio = 'Y' OR
       aRecMissione.fl_comune_altro = 'Y') THEN
      aRecQuotaEsenteItalia:=CNRCTB500.getMissioneQuotaEsente ('I',
                                                               trunc(aRecMissione.dt_inizio_missione));
   END IF;

   IF aRecMissione.fl_comune_estero = 'Y' THEN
      aRecQuotaEsenteEstero:=CNRCTB500.getMissioneQuotaEsente ('E',
                                                               trunc(aRecMissione.dt_inizio_missione));
   END IF;

END getDatiBaseMissione;


--==================================================================================================
-- Costruzione matrice diaria per tappa. Si eseguono i seguenti passi:
-- 1) Si estraggono i dati relativi alle tappe.
-- 2) Per ogni tappa si determina la tipologie delle spese registrate.
--
--==================================================================================================
PROCEDURE creaMatriceTappe
   IS
   i BINARY_INTEGER;

   aRecMissioneTappa MISSIONE_TAPPA%ROWTYPE;
   aRecMissioneDiaria MISSIONE_DIARIA%ROWTYPE;
   aRecMissioneQuotaRimborso MISSIONE_QUOTA_RIMBORSO%ROWTYPE;
   aCdAreaEstera  RIF_AREE_PAESI_ESTERI.CD_AREA_ESTERA%TYPE;

   gen_cur GenericCurTyp;

BEGIN

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

   matriceTappe_tab.DELETE;
   i:=0;

   -------------------------------------------------------------------------------------------------
   -- Valorizzazione della matrice tappe; stessa cardinalità di MISSIONE_TAPPA per una data missione

   BEGIN

      OPEN gen_cur FOR
           SELECT *
           FROM   MISSIONE_TAPPA
           WHERE  cd_cds = aRecMissione.cd_cds AND
                  esercizio = aRecMissione.esercizio AND
                  cd_unita_organizzativa = aRecMissione.cd_unita_organizzativa AND
                  pg_missione = aRecMissione.pg_missione
           ORDER BY dt_inizio_tappa;

      LOOP

         FETCH gen_cur INTO aRecMissioneTappa;

         EXIT WHEN gen_cur%NOTFOUND;

         i:=i + 1;

         matriceTappe_tab(i).tDtInizio:=aRecMissioneTappa.dt_inizio_tappa;
         matriceTappe_tab(i).tDtFine:=aRecMissioneTappa.dt_fine_tappa;

         -- Determina il numero di ore della tappa

         matriceTappe_tab(i).tNumeroOre:=CNRCTB500.calcolaOreTappa(aRecMissioneTappa.dt_inizio_tappa,
                                                                   aRecMissioneTappa.dt_fine_tappa);

         -- Determina il numero di minuti della tappa

         matriceTappe_tab(i).tNumeroMinuti:=CNRCTB500.calcolaMinutiTappa(aRecMissioneTappa.dt_inizio_tappa,
                                                                         aRecMissioneTappa.dt_fine_tappa);

         -- Determina area geografica e la conseguente quota esente lorda

         IF aRecMissioneTappa.fl_comune_estero ='Y' THEN
            matriceTappe_tab(i).tAreaGeografica:='E';
            matriceTappe_tab(i).tQuotaEsente:=aRecQuotaEsenteEstero.quota_esente;
         ELSE
            matriceTappe_tab(i).tAreaGeografica:='I';
            matriceTappe_tab(i).tQuotaEsente:=aRecQuotaEsenteItalia.quota_esente;
         END IF;
         matriceTappe_tab(i).tPgNazione:=aRecMissioneTappa.pg_nazione;

         Begin
            select cd_area_estera
            into aCdAreaEstera
            from NAZIONE
            where pg_nazione = aRecMissioneTappa.pg_nazione;

            If aCdAreaEstera is not null then
                matriceTappe_tab(i).tCdAreaEstera := aCdAreaEstera;
            Elsif matriceTappe_tab(i).tAreaGeografica != 'I' then
                IBMERR001.RAISE_ERR_GENERICO('Area Estera non definita per la nazione: ' || aRecMissioneTappa.pg_nazione);
            End if;
				 End;
         matriceTappe_tab(i).tIsComuneProprio:=aRecMissioneTappa.fl_comune_proprio;

         -- Inquadramento

         matriceTappe_tab(i).tPgRifInquadramento:=aRecMissione.pg_rif_inquadramento;

         -- Switch ammissibilità spese

         matriceTappe_tab(i).tFlPasto:='N';
         matriceTappe_tab(i).tFlAlloggio:='N';
         matriceTappe_tab(i).tFlTrasporto:='N';
         matriceTappe_tab(i).tFlNavigazione:=aRecMissioneTappa.fl_navigazione;
         matriceTappe_tab(i).tFlVittoGratuito:=aRecMissioneTappa.fl_vitto_gratuito;
         matriceTappe_tab(i).tFlAlloggioGratuito:=aRecMissioneTappa.fl_alloggio_gratuito;
         matriceTappe_tab(i).tFlVittoAlloggioGratuito:=aRecMissioneTappa.fl_vitto_alloggio_gratuito;
         matriceTappe_tab(i).tFlNoDiaria:=aRecMissioneTappa.fl_no_diaria;
				 matriceTappe_tab(i).tFlRimborso:=aRecMissioneTappa.fl_rimborso;

         -- Valori di default

         matriceTappe_tab(i).tOkAbbattimento:='N';
         matriceTappe_tab(i).tPercentualeAbbattimento:=0;
         matriceTappe_tab(i).tDiariaNetto:=0;
         matriceTappe_tab(i).tRimborso:= 0;

         -- Lettura delle spese registrate a fronte di ogni tappa. La funzione aggiorna gli elementi
         -- della matrice passati in input in base alle risultanze ricavate dalle spese associate ad
         -- ogni tappa.

         leggiSpeseTappa(aRecMissioneTappa,
                         matriceTappe_tab(i).tFlPasto,
                         matriceTappe_tab(i).tFlAlloggio,
                         matriceTappe_tab(i).tFlTrasporto);

         -- Lettura della diaria massima da applicare alla tappa. Si tratta della sola diaria lorda senza
         -- alcuna normalizzazione per le ore di riferimento o in base alle percentuali di abbattimento.

         IF aRecMissioneTappa.fl_no_diaria = 'Y' THEN
            matriceTappe_tab(i).tDiariaLorda:=0;
         ELSE
            aRecMissioneDiaria:=CNRCTB500.getMissioneDiaria (aRecMissioneTappa,
                                                             aRecRifInquadramento.cd_gruppo_inquadramento,
                                                             aRecMissioneTappa.dt_inizio_tappa);
                                                             --aRecMissione.dt_inizio_missione);
            matriceTappe_tab(i).tDiariaLorda:=aRecMissioneDiaria.im_diaria;
         END IF;

				 IF aRecMissioneTappa.fl_rimborso = 'Y' THEN
				      aRecMissioneQuotaRimborso := CNRCTB500.getMissioneQuotaRimborso (aRecMissioneTappa,
                                                                               aRecRifInquadramento.cd_gruppo_inquadramento,
                                                                               matriceTappe_tab(i).tCdAreaEstera,
                                                                               aRecMissioneTappa.dt_inizio_tappa);
				      matriceTappe_tab(i).tRimborso :=aRecMissioneQuotaRimborso.im_rimborso;
				 END IF;

      END LOOP;

      CLOSE gen_cur;

   END;

   RETURN;

END creaMatriceTappe;

--==================================================================================================
-- Lettura della tipologie di spese registrate per ogni tappa. Si aggiornano i riferimenti
-- per la ricerca di una entrata in MISSIONE_ABBATTIMENTI
--==================================================================================================
PROCEDURE leggiSpeseTappa
   (
    aRecMissioneTappa MISSIONE_TAPPA%ROWTYPE,
    flPasto IN OUT CHAR,
    flAlloggio IN OUT CHAR,
    flTrasporto IN OUT CHAR
   ) IS
   aAreaGeografica CHAR(1);
   gen_cur_d GenericCurTyp;
   aRecMissioneDettaglio MISSIONE_DETTAGLIO%ROWTYPE;

BEGIN

   -- Ciclo di lettura dei dettagli di spesa della missione

   BEGIN

      OPEN gen_cur_d FOR

           SELECT *
           FROM   MISSIONE_DETTAGLIO
           WHERE  cd_cds = aRecMissioneTappa.cd_cds AND
                  cd_unita_organizzativa = aRecMissioneTappa.cd_unita_organizzativa AND
                  esercizio = aRecMissioneTappa.esercizio AND
                  pg_missione = aRecMissioneTappa.pg_missione AND
                  dt_inizio_tappa = aRecMissioneTappa.dt_inizio_tappa AND
                  ti_spesa_diaria = 'S';

      LOOP

         FETCH gen_cur_d INTO aRecMissioneDettaglio;

         EXIT WHEN gen_cur_d%NOTFOUND;

         -- Determino le tipologie di spesa presenti nella tappa ed aggiorno gli indicatori
         -- di tipologia spesa nella matrice delle tappe.

         IF    aRecMissioneDettaglio.ti_cd_ti_spesa = 'A' THEN
               flAlloggio:='Y';
         ELSIF aRecMissioneDettaglio.ti_cd_ti_spesa = 'P' THEN
               flPasto:='Y';
         ELSIF (aRecMissioneDettaglio.ti_cd_ti_spesa = 'R' OR
                aRecMissioneDettaglio.ti_cd_ti_spesa = 'T') THEN
               flTrasporto:='Y';
         END IF;

      END LOOP;

      CLOSE gen_cur_d;

   END;

   RETURN;

END leggiSpeseTappa;

-- =================================================================================================
-- Verifica esistenza di tappe le cui spese non hanno trovato una entrata nella tabella
-- MISSIONE_ABBATTIMENTI di configurazione all'ammissibilità delle stesse
-- =================================================================================================
PROCEDURE verificaConfigSpeseTappe
   IS
   i BINARY_INTEGER;
   isDurataMaggioreOttoOre CHAR(1);
   aNumeroOre NUMBER;
   aStringa VARCHAR2(1000);
   aStringa2 VARCHAR2(1000);

   aRecMissioneAbbattimenti MISSIONE_ABBATTIMENTI%ROWTYPE;

   gen_cur_a GenericCurTyp;

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Calcolo la durata complessiva della missione. Se questa è maggiore di 8 ore allora deve sempre
   -- essere usato l'accesso maggiore di 8 ore nel recupero degli abbattimenti

   isDurataMaggioreOttoOre:='N';
   IF TRUNC((aRecMissione.dt_fine_missione - aRecMissione.dt_inizio_missione),5) > isOttoOre THEN
      isDurataMaggioreOttoOre:='Y';
   END IF;

   -- Ciclo di lettura della matrice tappe della missione per aggiornamento degli indicatori
   -- di ritrovamento di un riferimento in MISSIONE_ABBATTIMENTI dati i dettagli di spesa
   -- associati ad una tappa

   BEGIN

      FOR i IN matriceTappe_tab.FIRST .. matriceTappe_tab.LAST

      LOOP

         -- Normalizzazione del numero di ore portato dalla tappa rispetto alla durata della stessa
         -- missione. Se loa missione dura più di otto ore allora si considera che la stessa tappa è
         -- maggiore di otto ore. Si prevede tuttavia il caso in cui la durata della tappa sia maggiore
         -- di quella della missione (stato estero sempre in 24 ore)

         IF isDurataMaggioreOttoOre = 'Y' THEN
            IF matriceTappe_tab(i).tNumeroOre > 8 THEN
               aNumeroOre:=matriceTappe_tab(i).tNumeroOre;
            ELSE
               aNumeroOre:=9;
            END IF;
         ELSE
            aNumeroOre:=matriceTappe_tab(i).tNumeroOre;
         END IF;

         -- Lettura abbattimenti

         OPEN gen_cur_a FOR

              SELECT *
              FROM   MISSIONE_ABBATTIMENTI
              WHERE  dt_inizio_validita <= matriceTappe_tab(i).tDtInizio AND
                     dt_fine_validita >= matriceTappe_tab(i).tDtFine AND
                     fl_pasto = matriceTappe_tab(i).tFlPasto AND
                     fl_alloggio = matriceTappe_tab(i).tFlAlloggio AND
                     fl_trasporto = matriceTappe_tab(i).tFlTrasporto AND
                     fl_navigazione = matriceTappe_tab(i).tFlNavigazione AND
                     fl_vitto_gratuito = matriceTappe_tab(i).tFlVittoGratuito AND
                     fl_alloggio_gratuito = matriceTappe_tab(i).tFlAlloggioGratuito AND
                     fl_vitto_alloggio_gratuito = matriceTappe_tab(i).tFlVittoAlloggioGratuito AND
                     (
                      ti_area_geografica = matriceTappe_tab(i).tAreaGeografica OR
                      ti_area_geografica = '*'
                     ) AND
                     (
                      pg_nazione = matriceTappe_tab(i).tPgNazione OR
                      pg_nazione = 0
                     ) AND
                     (
                      pg_rif_inquadramento  = matriceTappe_tab(i).tPgRifInquadramento OR
                      pg_rif_inquadramento = 0
                     )
              ORDER BY pg_rif_inquadramento desc,
                       pg_nazione desc,
                       ti_area_geografica desc;

         LOOP

            FETCH gen_cur_a INTO aRecMissioneAbbattimenti;

            EXIT WHEN gen_cur_a%NOTFOUND;

            -- Valorizzazione dell'indicatore nella matrice tappe di recupero della percentuale di
            -- abbattimento della diaria

            IF    aNumeroOre <= 4 THEN
                  IF aRecMissioneAbbattimenti.durata_ore = '< 4' THEN
                     matriceTappe_tab(i).tOkAbbattimento:='Y';
                     matriceTappe_tab(i).tPercentualeAbbattimento:=aRecMissioneAbbattimenti.percentuale_abbattimento;
                     EXIT;
                  END IF;
            ELSIF (aNumeroOre > 4 AND
                   aNumeroOre <= 8) THEN
                  IF aRecMissioneAbbattimenti.durata_ore = '> 4' THEN
                     matriceTappe_tab(i).tOkAbbattimento:='Y';
                     matriceTappe_tab(i).tPercentualeAbbattimento:=aRecMissioneAbbattimenti.percentuale_abbattimento;
                     EXIT;
                 END IF;
            ELSIF aNumeroOre > 8 THEN
                  IF aRecMissioneAbbattimenti.durata_ore = '> 8' THEN
                     matriceTappe_tab(i).tOkAbbattimento:='Y';
                     matriceTappe_tab(i).tPercentualeAbbattimento:=aRecMissioneAbbattimenti.percentuale_abbattimento;
                     EXIT;
                  END IF;
            END IF;

         END LOOP;

         CLOSE gen_cur_a;

      END LOOP;

   END;

   -- Ciclo di lettura della matrice tappe della missione per verifica esistenza di configurazioni di spesa
   -- registrate e non previste dal regolamento

   BEGIN

      aStringa:=NULL;

      FOR i IN matriceTappe_tab.FIRST .. matriceTappe_tab.LAST


      LOOP

         IF matriceTappe_tab(i).tOkAbbattimento='N' THEN
            IF NVL( LENGTH(aStringa), 0) < 900 THEN
               aStringa:= aStringa || 'TAPPA data inizio ' ||
                          TO_CHAR(matriceTappe_tab(i).tDtInizio,'DD/MM/YYYY') || CHR(10);
            END IF;
         END IF;

      END LOOP;

      IF aStringa IS NOT NULL THEN
         aStringa:='Non trovata entrata in MISSIONE_ABBATTIMENTI per le spese definite in: ' || CHR(10) ||
                   aStringa;
         IBMERR001.RAISE_ERR_GENERICO (aStringa);
      END IF;

   END;

   RETURN;

END verificaConfigSpeseTappe;

--==================================================================================================
-- Esecuzione del calcolo della diaria. E' segnalato errore se si tratta di missione italia in
-- comune altro con quota esente inderiore all'importo della diaria
--==================================================================================================
PROCEDURE calcolaDiaria
   IS
   i BINARY_INTEGER;

BEGIN

   BEGIN

      FOR i IN matriceTappe_tab.FIRST .. matriceTappe_tab.LAST

      LOOP

         -- Lettura della diaria massima da applicare alla tappa. Se, per la tappa, è vero il
         -- flag di no diaria questa è posta = 0.
         -- Negli altri casi si operano i seguenti calcoli:
         -- 1) Si determina il valore della diaria lorda per le ore effettive di durata della missione in
         --    data tappa.
         -- 2) Si determina l'importo dela diaria netta considerando la percentuale di abbattimento
         --    recuperata per ogni singola tappa.
         -- 3) Si abbatte allo stesso modo della diaria la quota esente.
         -- 4) Se la tappa della missione è in Italia e comune proprio viene azzerata la quota esente.
         -- 4) Se la quota esente è maggiore della diaria netta si rende uguale a quest'ultima. Si solleva
         --    errore se la quota esente è minore della diaria netta in caso di missione in italia con
         --    tappa in altro comune.

         IF matriceTappe_tab(i).tFlNoDiaria = 'Y' THEN
            matriceTappe_tab(i).tDiariaLorda:=0;
            matriceTappe_tab(i).tDiariaNetto:=0;
            matriceTappe_tab(i).tQuotaEsente:=0;
         ELSE
            matriceTappe_tab(i).tDiariaLorda:=ROUND((matriceTappe_tab(i).tDiariaLorda / 24 *
                                                     matriceTappe_tab(i).tNumeroOre),2);
            matriceTappe_tab(i).tDiariaNetto:=ROUND((matriceTappe_tab(i).tDiariaLorda -
                                                       (matriceTappe_tab(i).tDiariaLorda *
                                                        matriceTappe_tab(i).tPercentualeAbbattimento / 100)),2);

            IF (matriceTappe_tab(i).tAreaGeografica = 'I' AND
                matriceTappe_tab(i).tIsComuneProprio = 'Y') THEN
               matriceTappe_tab(i).tQuotaEsente:=0;
            ELSE
               matriceTappe_tab(i).tQuotaEsente:=
                                   ROUND((matriceTappe_tab(i).tQuotaEsente -
                                            (matriceTappe_tab(i).tQuotaEsente *
                                             matriceTappe_tab(i).tPercentualeAbbattimento / 100)),2);
            END IF;

            IF (matriceTappe_tab(i).tAreaGeografica = 'I' AND
                matriceTappe_tab(i).tIsComuneProprio = 'N' AND
                matriceTappe_tab(i).tQuotaEsente < matriceTappe_tab(i).tDiariaNetto) THEN
               IBMERR001.RAISE_ERR_GENERICO
                   ('LA TAPPA in Italia comune altro - data inizio ' ||
                    TO_CHAR(matriceTappe_tab(i).tDtInizio,'DD/MM/YYYY') ||
                    ' presenta una quota esente inferiore all''importo della diaria');
            END IF;

            IF (matriceTappe_tab(i).tQuotaEsente > matriceTappe_tab(i).tDiariaNetto) THEN
               matriceTappe_tab(i).tQuotaEsente:=matriceTappe_tab(i).tDiariaNetto;
            END IF;


         END IF;

      END LOOP;

   END;

   RETURN;

END calcolaDiaria;

--==================================================================================================
-- Esecuzione del calcolo della diaria. E' segnalato errore se si tratta di missione italia in
-- comune altro con quota esente inderiore all'importo della diaria
--==================================================================================================
PROCEDURE calcolaRimborso (inCdTrattamento IN MISSIONE.cd_trattamento%TYPE)
   IS
   i BINARY_INTEGER;
   aRecTipoTrattamento TIPO_TRATTAMENTO%ROWTYPE;
   contaRitFiscale NUMBER:=0;
BEGIN

   BEGIN

      -- Recupero dati del tipo trattamento indicato nella missione
      if inCdTrattamento is not null then
          aRecTipoTrattamento:=CNRCTB545.getTipoTrattamento(inCdTrattamento,
                                                            aRecMissione.dt_registrazione);

         SELECT count(1)
         into contaRitFiscale
         FROM V_TIPO_TRATTAMENTO_TIPO_CORI
         WHERE cd_trattamento = aRecTipoTrattamento.cd_trattamento
           AND dt_ini_val_trattamento = aRecTipoTrattamento.dt_ini_validita
           AND dt_fin_val_trattamento = aRecTipoTrattamento.dt_fin_validita
           AND dt_ini_val_tratt_cori <= aRecMissione.dt_registrazione
           AND dt_fin_val_tratt_cori >= aRecMissione.dt_registrazione
           AND dt_ini_val_tipo_cori <= aRecMissione.dt_registrazione
           AND dt_fin_val_tipo_cori >= aRecMissione.dt_registrazione
           AND cd_classificazione_cori = CNRCTB545.isCoriFiscale;
      else
          contaRitFiscale :=99999;
      end if;

--pipe.send_message('contaRitFiscale = '||contaRitFiscale);


      FOR i IN matriceTappe_tab.FIRST .. matriceTappe_tab.LAST

      LOOP

         IF matriceTappe_tab(i).tFlRimborso = 'Y' THEN
            If matriceTappe_tab(i).tNumeroMinuti >= 1440 then
                 -- il rimborso è già quello inserito
                 -- verifico solo che la quota esente non sia maggiore del rimborso
                 If contaRitFiscale > 0 then
                    If matriceTappe_tab(i).tQuotaEsente > matriceTappe_tab(i).tRimborso then
                         matriceTappe_tab(i).tQuotaEsente := matriceTappe_tab(i).tRimborso;
                    End If;
                 Else
                    matriceTappe_tab(i).tQuotaEsente := 0;
                 End if;
            Elsif matriceTappe_tab(i).tNumeroMinuti < 1440 and matriceTappe_tab(i).tNumeroMinuti >= 720  then
                 matriceTappe_tab(i).tRimborso := matriceTappe_tab(i).tRimborso/2;
                 If contaRitFiscale > 0 then
                    If matriceTappe_tab(i).tQuotaEsente > matriceTappe_tab(i).tRimborso then
                         matriceTappe_tab(i).tQuotaEsente := matriceTappe_tab(i).tRimborso;
                    End If;
                 Else
                    matriceTappe_tab(i).tQuotaEsente := 0;
                 End if;
            Else   -- matriceTappe_tab(i).tNumeroMinuti < 720
                 matriceTappe_tab(i).tRimborso := 0;
                 matriceTappe_tab(i).tQuotaEsente := 0;
            End if;
         END IF;
      END LOOP;

   END;

   RETURN;

END calcolaRimborso;
--==================================================================================================
-- Inserimento delle righe di diaria in MISSIONE_DETTAGLIO
--==================================================================================================
PROCEDURE inserisciDiarie
   IS
   i BINARY_INTEGER;

   aRecMissioneDettaglio MISSIONE_DETTAGLIO%ROWTYPE;
   aBaseIncrementoRiga MISSIONE_DETTAGLIO.pg_riga%TYPE;

BEGIN

   --  Inserimento delle righe di diaria calcolate. E' inserita una riga diaria per  ogni tappa definita

   aRecMissioneDettaglio:=NULL;

   SELECT NVL(MAX(pg_riga), 0) INTO aBaseIncrementoRiga
   FROM   MISSIONE_DETTAGLIO
   WHERE  cd_cds = aRecMissione.cd_cds AND
          cd_unita_organizzativa = aRecMissione.cd_unita_organizzativa AND
          esercizio = aRecMissione.esercizio AND
          pg_missione = aRecMissione.pg_missione;

   BEGIN

      FOR i IN 1 .. matriceTappe_tab.COUNT

      LOOP

         aRecMissioneDettaglio.cd_cds:=aRecMissione.cd_cds;
         aRecMissioneDettaglio.esercizio:=aRecMissione.esercizio;
         aRecMissioneDettaglio.cd_unita_organizzativa:=aRecMissione.cd_unita_organizzativa;
         aRecMissioneDettaglio.pg_missione:=aRecMissione.pg_missione;
         aRecMissioneDettaglio.dt_inizio_tappa:=matriceTappe_tab(i).tDtInizio;
         aRecMissioneDettaglio.pg_riga:=aBaseIncrementoRiga + i;
         aRecMissioneDettaglio.ti_spesa_diaria:='D';
         aRecMissioneDettaglio.im_spesa_divisa:=0;
         aRecMissioneDettaglio.cambio_spesa:=0;
         aRecMissioneDettaglio.im_spesa_euro:=0;
         aRecMissioneDettaglio.im_spesa_max_divisa:=0;
         aRecMissioneDettaglio.im_spesa_max:=0;
         aRecMissioneDettaglio.im_base_maggiorazione:=0;
         aRecMissioneDettaglio.percentuale_maggiorazione:=0;
         aRecMissioneDettaglio.im_maggiorazione:=0;
         aRecMissioneDettaglio.indennita_chilometrica:=0;
         aRecMissioneDettaglio.im_totale_spesa:=0;
         aRecMissioneDettaglio.fl_diaria_manuale:='N';
         aRecMissioneDettaglio.im_diaria_lorda:=matriceTappe_tab(i).tDiariaLorda;
         aRecMissioneDettaglio.im_diaria_netto:=matriceTappe_tab(i).tDiariaNetto;
         aRecMissioneDettaglio.im_quota_esente:=matriceTappe_tab(i).tQuotaEsente;
         aRecMissioneDettaglio.utcr:=aRecMissione.utcr;
         aRecMissioneDettaglio.dacr:=aRecMissione.dacr;
         aRecMissioneDettaglio.utuv:=aRecMissione.utuv;
         aRecMissioneDettaglio.duva:=aRecMissione.duva;
         aRecMissioneDettaglio.pg_ver_rec:=aRecMissione.pg_ver_rec;
         aRecMissioneDettaglio.im_maggiorazione_euro:=0;
				 aRecMissioneDettaglio.im_rimborso:=0;
         CNRCTB500.insMissioneDettaglio (aRecMissioneDettaglio);

      END LOOP;

   END;

   RETURN;

END inserisciDiarie;
--==================================================================================================
-- Inserimento delle righe di rimborso in MISSIONE_DETTAGLIO
--==================================================================================================
PROCEDURE inserisciRimborsi
   IS
   i BINARY_INTEGER;

   aRecMissioneDettaglio MISSIONE_DETTAGLIO%ROWTYPE;
   aBaseIncrementoRiga MISSIONE_DETTAGLIO.pg_riga%TYPE;

BEGIN

   --  Inserimento delle righe di rimborso calcolate.
   -- ?????? E' inserita una riga diaria per  ogni tappa definita

   aRecMissioneDettaglio:=NULL;

   SELECT NVL(MAX(pg_riga), 0) INTO aBaseIncrementoRiga
   FROM   MISSIONE_DETTAGLIO
   WHERE  cd_cds = aRecMissione.cd_cds AND
          cd_unita_organizzativa = aRecMissione.cd_unita_organizzativa AND
          esercizio = aRecMissione.esercizio AND
          pg_missione = aRecMissione.pg_missione;

   BEGIN

      FOR i IN 1 .. matriceTappe_tab.COUNT
      LOOP
--pipe.send_message('matriceTappe_tab(i).tAreaGeografica = '||matriceTappe_tab(i).tAreaGeografica);
         if matriceTappe_tab(i).tAreaGeografica = 'E' and matriceTappe_tab(i).tFlRimborso = 'Y' then
              aRecMissioneDettaglio.cd_cds:=aRecMissione.cd_cds;
              aRecMissioneDettaglio.esercizio:=aRecMissione.esercizio;
              aRecMissioneDettaglio.cd_unita_organizzativa:=aRecMissione.cd_unita_organizzativa;
              aRecMissioneDettaglio.pg_missione:=aRecMissione.pg_missione;
              aRecMissioneDettaglio.dt_inizio_tappa:=matriceTappe_tab(i).tDtInizio;
              aRecMissioneDettaglio.pg_riga:=aBaseIncrementoRiga + i;
              aRecMissioneDettaglio.ti_spesa_diaria:='R';
              aRecMissioneDettaglio.im_spesa_divisa:=0;
              aRecMissioneDettaglio.cambio_spesa:=0;
              aRecMissioneDettaglio.im_spesa_euro:=0;
              aRecMissioneDettaglio.im_spesa_max_divisa:=0;
              aRecMissioneDettaglio.im_spesa_max:=0;
              aRecMissioneDettaglio.im_base_maggiorazione:=0;
              aRecMissioneDettaglio.percentuale_maggiorazione:=0;
              aRecMissioneDettaglio.im_maggiorazione:=0;
              aRecMissioneDettaglio.indennita_chilometrica:=0;
              aRecMissioneDettaglio.im_totale_spesa:=0;
              aRecMissioneDettaglio.fl_diaria_manuale:='N';
              aRecMissioneDettaglio.im_diaria_lorda:=0;
              aRecMissioneDettaglio.im_diaria_netto:=0;
              aRecMissioneDettaglio.im_quota_esente:=matriceTappe_tab(i).tQuotaEsente;
              aRecMissioneDettaglio.im_rimborso:=matriceTappe_tab(i).tRimborso;
              aRecMissioneDettaglio.utcr:=aRecMissione.utcr;
              aRecMissioneDettaglio.dacr:=aRecMissione.dacr;
              aRecMissioneDettaglio.utuv:=aRecMissione.utuv;
              aRecMissioneDettaglio.duva:=aRecMissione.duva;
              aRecMissioneDettaglio.pg_ver_rec:=aRecMissione.pg_ver_rec;
              aRecMissioneDettaglio.im_maggiorazione_euro:=0;

              CNRCTB500.insMissioneDettaglio (aRecMissioneDettaglio);
         end if;
      END LOOP;

   END;

   RETURN;

END inserisciRimborsi;

--==================================================================================================
-- Valorizzazione di importo lordo e quota esente per generazione compenso
--==================================================================================================
PROCEDURE calcolaImportiCompenso
   (
    inCdsMissione MISSIONE.cd_cds%TYPE,
    inUoMissione MISSIONE.cd_unita_organizzativa%TYPE,
    inEsercizioMissione MISSIONE.esercizio%TYPE,
    inPgMissione MISSIONE.pg_missione%TYPE,
    inImportoLordo IN OUT NUMBER,
    inQuotaEsente IN OUT NUMBER,
    inAliquotaIrpef IN OUT NUMBER
   ) IS
   eseguiLock CHAR(1);
   aImportoSpesaMaggiorazione NUMBER(15,2);
   aImportoLordoGenerico NUMBER(15,2);
   aQuotaEsenteGenerico NUMBER(15,2);
   aImportoLordoComuneP NUMBER(15,2);
   aQuotaEsenteComuneP NUMBER(15,2);
   aImportoLordoComuneA NUMBER(15,2);
   aQuotaEsenteComuneA NUMBER(15,2);
   aImportoLordoComuneE NUMBER(15,2);
   aQuotaEsenteComuneE NUMBER(15,2);
   aImportoRimborso NUMBER(15,2);
   aQuotaEsenteRimborso NUMBER(15,2);

   aRecMissioneTappa MISSIONE_TAPPA%ROWTYPE;
   aRecMissioneDettaglio MISSIONE_DETTAGLIO%ROWTYPE;

   gen_cur_t GenericCurTyp;
   gen_cur_d GenericCurTyp;

BEGIN

--commit;
--IBMERR001.RAISE_ERR_GENERICO('PROVA FIX ERRORE');

   inImportoLordo:=0;
   inQuotaEsente:=0;
   inAliquotaIrpef:=0;
   aImportoSpesaMaggiorazione:=0;
   aImportoLordoGenerico:=0;
   aQuotaEsenteGenerico:=0;
   aImportoLordoComuneP:=0;
   aQuotaEsenteComuneP:=0;
   aImportoLordoComuneA:=0;
   aQuotaEsenteComuneA:=0;
   aImportoLordoComuneE:=0;
   aQuotaEsenteComuneE:=0;
   aImportoRimborso:=0;
   aQuotaEsenteRimborso:=0;

   eseguiLock:='Y';

   -------------------------------------------------------------------------------------------------
   -- Lettura della testata della missione

   BEGIN

      -- Lettura dati di base legati alla missione in calcolo; testata missione, anagrafico, base
      -- inquadramento e quote esenti

      getDatiBaseMissione(inCdsMissione,
                          inUoMissione,
                          inEsercizioMissione,
                          inPgMissione,
                          eseguiLock);

   END;

   -------------------------------------------------------------------------------------------------
   -- Ciclo di lettura delle tappe e quindi dei dettagli della missione

   BEGIN

      OPEN gen_cur_t FOR

           SELECT *
           FROM   MISSIONE_TAPPA
           WHERE  cd_cds = inCdsMissione AND
                  cd_unita_organizzativa = inUoMissione AND
                  esercizio = inEsercizioMissione AND
                  pg_missione = inPgMissione
           ORDER BY dt_inizio_tappa;

      LOOP

         FETCH gen_cur_t INTO aRecMissioneTappa;

         EXIT WHEN gen_cur_t%NOTFOUND;

         -- Lettura del dettaglio di spese e diaria della missione

         BEGIN

            aImportoSpesaMaggiorazione:=0;
            aImportoLordoGenerico:=0;
            aQuotaEsenteGenerico:=0;

            OPEN gen_cur_d FOR

                 SELECT *
                 FROM   MISSIONE_DETTAGLIO
                 WHERE  cd_cds = aRecMissioneTappa.cd_cds AND
                        cd_unita_organizzativa = aRecMissioneTappa.cd_unita_organizzativa AND
                        esercizio = aRecMissioneTappa.esercizio AND
                        pg_missione = aRecMissioneTappa.pg_missione AND
                        dt_inizio_tappa = aRecMissioneTappa.dt_inizio_tappa;

            LOOP

               FETCH gen_cur_d INTO aRecMissioneDettaglio;

               EXIT WHEN gen_cur_d%NOTFOUND;

               -- Lettura delle spese. In caso di spese anticipate recupero l'eventuale importo della
               -- maggiorazione negli altri casi opero con l'importo totale della spesa

               IF aRecMissioneDettaglio.ti_spesa_diaria = 'S' THEN

                  IF aRecMissioneDettaglio.fl_spesa_anticipata = 'Y' THEN
                     aImportoSpesaMaggiorazione:=aRecMissioneDettaglio.im_maggiorazione_euro;
                  ELSE
                     aImportoSpesaMaggiorazione:=aRecMissioneDettaglio.im_totale_spesa;
                  END IF;

                  IF aRecMissioneTappa.fl_comune_proprio = 'Y' THEN
                     IF aRecMissioneDettaglio.ti_cd_ti_spesa = 'T' THEN
                        aImportoLordoGenerico:=aImportoLordoGenerico + aImportoSpesaMaggiorazione;
                        aQuotaEsenteGenerico:=aQuotaEsenteGenerico + aImportoSpesaMaggiorazione;
                     ELSE
                        aImportoLordoGenerico:=aImportoLordoGenerico + aImportoSpesaMaggiorazione;
                     END IF;
                  ELSE
                     aImportoLordoGenerico:=aImportoLordoGenerico + aImportoSpesaMaggiorazione;
                     aQuotaEsenteGenerico:=aQuotaEsenteGenerico + aImportoSpesaMaggiorazione;
                  END IF;

               ELSIF aRecMissioneDettaglio.ti_spesa_diaria = 'D' THEN

                  aImportoLordoGenerico:=aImportoLordoGenerico + aRecMissioneDettaglio.im_diaria_netto;
                  aQuotaEsenteGenerico:=aQuotaEsenteGenerico + aRecMissioneDettaglio.im_quota_esente;

               ELSE    --aRecMissioneDettaglio.ti_spesa_diaria = 'R' (quota di rimborso)

                  aImportoRimborso:=aImportoRimborso + aRecMissioneDettaglio.im_rimborso;
                  aQuotaEsenteRimborso:=aQuotaEsenteRimborso + aRecMissioneDettaglio.im_quota_esente;

               END IF;
--pipe.send_message('aImportoLordoGenerico = '||aImportoLordoGenerico);
--pipe.send_message('aQuotaEsenteGenerico = '||aQuotaEsenteGenerico);
            END LOOP;

            CLOSE gen_cur_d;

            IF    aRecMissioneTappa.fl_comune_proprio = 'Y' THEN
                  aImportoLordoComuneP:=aImportoLordoComuneP + aImportoLordoGenerico;
                  aQuotaEsenteComuneP:=aQuotaEsenteComuneP + aQuotaEsenteGenerico;
            ELSIF aRecMissioneTappa.fl_comune_altro = 'Y' THEN
                  aImportoLordoComuneA:=aImportoLordoComuneA + aImportoLordoGenerico;
                  aQuotaEsenteComuneA:=aQuotaEsenteComuneA + aQuotaEsenteGenerico;
            ELSIF aRecMissioneTappa.fl_comune_estero = 'Y' THEN
                  aImportoLordoComuneE:=aImportoLordoComuneE + aImportoLordoGenerico;
                  aQuotaEsenteComuneE:=aQuotaEsenteComuneE + aQuotaEsenteGenerico;
            END IF;

         END;

      END LOOP;

      CLOSE gen_cur_t;

      IF aRecMissione.fl_comune_estero = 'N' THEN
         inImportoLordo:=aImportoLordoComuneP + aImportoLordoComuneA;
         inQuotaEsente:=aQuotaEsenteComuneP + aQuotaEsenteComuneA;
      ELSE
--pipe.send_message('inAliquotaIrpef = '||inAliquotaIrpef);

         lordizzaImporto(aImportoLordoComuneE,
                         aQuotaEsenteComuneE,
                         inAliquotaIrpef,
                         aRecAnagrafico.aliquota_fiscale);

         inImportoLordo:=aImportoLordoComuneP + aImportoLordoComuneA + aImportoLordoComuneE + aImportoRimborso;
         inQuotaEsente:=aQuotaEsenteComuneP + aQuotaEsenteComuneA + aQuotaEsenteComuneE + aQuotaEsenteRimborso;
--pipe.send_message('inImportoLordo = '||inImportoLordo);
--pipe.send_message('inQuotaEsente = '||inQuotaEsente);

      END IF;

   END;

   RETURN;

END calcolaImportiCompenso;

--==================================================================================================
-- Lordizzazione importo per missione estera
--==================================================================================================
PROCEDURE lordizzaImporto
   (
    aInOutImportoLordo IN OUT NUMBER,
    aInOutQuotaEsente IN OUT NUMBER,
    inAliquotaIrpef IN OUT NUMBER,
    aAliquotaFiscaleAnag ANAGRAFICO.aliquota_fiscale%TYPE
   ) IS
   i BINARY_INTEGER;
   eseguiLock CHAR(1);
   aImportoNetto NUMBER(15,2);
   aMontanteIRPEF NUMBER(15,2);
   aMontanteINPS NUMBER(15,2);
   aAliquotaIrpef NUMBER(10,6);
   aAliquotaInps NUMBER(10,6);
   aAliquotaAnag NUMBER(10,6);
   isAnnualizzato CHAR(1);
   aImportoAccessoScaglione NUMBER(15,2);
   aImportoMaxRifScaglione NUMBER(15,2);
   aRecMontanti MONTANTI%ROWTYPE;
   aRecTipoTrattamento TIPO_TRATTAMENTO%ROWTYPE;
   aRecVTrattamento V_TIPO_TRATTAMENTO_TIPO_CORI%ROWTYPE;

   gen_cur GenericCurTyp;

BEGIN

   aMontanteIRPEF:=0;
   aMontanteINPS:=0;
   aAliquotaIrpef:=0;
   aAliquotaInps:=0;
   aAliquotaAnag:=0;
   aImportoNetto:=aInOutImportoLordo - aInOutQuotaEsente;
   coriLordizza_tab.DELETE;
   i:=0;

   -------------------------------------------------------------------------------------------------
   -- Lettura dei montanti

   eseguiLock:='Y';
   aRecMontanti:=CNRCTB080.getMontanti(aRecMissione.esercizio,
                                       aRecAnagrafico.cd_anag,
                                       eseguiLock);

   -------------------------------------------------------------------------------------------------
   -- Recupero dati del tipo trattamento indicato nel compenso

   aRecTipoTrattamento:=CNRCTB545.getTipoTrattamento(aRecMissione.cd_trattamento,
                                                     aRecMissione.dt_registrazione);

   -------------------------------------------------------------------------------------------------
   -- Recupero dei dati relativi al trattamento selezionato per la missione

   BEGIN

      OPEN gen_cur FOR

           SELECT *
           FROM   V_TIPO_TRATTAMENTO_TIPO_CORI
           WHERE  cd_trattamento = aRecTipoTrattamento.cd_trattamento AND
                  dt_ini_val_trattamento = aRecTipoTrattamento.dt_ini_validita AND
                  dt_fin_val_trattamento = aRecTipoTrattamento.dt_fin_validita AND
                  dt_ini_val_tratt_cori <= aRecMissione.dt_registrazione AND
                  dt_fin_val_tratt_cori >= aRecMissione.dt_registrazione AND
                  dt_ini_val_tipo_cori <= aRecMissione.dt_registrazione AND
                  dt_fin_val_tipo_cori >= aRecMissione.dt_registrazione AND
                  fl_uso_in_lordizza = 'Y'
           ORDER BY cd_trattamento,
                    id_riga;

      LOOP

         FETCH gen_cur INTO aRecVTrattamento;

         EXIT WHEN gen_cur%NOTFOUND;

         -- Controllo se si tratta di contributo ritenuta che identifica irpef a scaglioni

         IF aRecVTrattamento.pg_classificazione_montanti IS NOT NULL THEN
            IF CNRCTB545.getIsIrpefScaglioni(aRecVTrattamento.cd_classificazione_cori,
                                             aRecVTrattamento.pg_classificazione_montanti,
                                             aRecVTrattamento.fl_scrivi_montanti) = 'Y' THEN
               i:=i + 1;
               coriLordizza_tab(i).tCdCori:=aRecVTrattamento.cd_cori;
               coriLordizza_tab(i).tIsIrpef:='Y';
               IF aRecMissione.ti_anagrafico = 'D' THEN
                  aMontanteIRPEF:=aMontanteIRPEF + aRecMontanti.irpef_dipendenti;
               ELSE
                  aMontanteIRPEF:=aMontanteIRPEF + aRecMontanti.irpef_altri;
               END IF;
            ELSE
               i:=i + 1;
               coriLordizza_tab(i).tCdCori:=aRecVTrattamento.cd_cori;
               coriLordizza_tab(i).tIsIrpef:='N';
               IF aRecVTrattamento.fl_scrivi_montanti = 'Y' THEN
                  IF aRecVTrattamento.pg_classificazione_montanti = 2 THEN
                     IF aRecMissione.ti_anagrafico = 'D' THEN
                        aMontanteINPS:=aMontanteINPS + aRecMontanti.inps_dipendenti;
                     ELSE
                        aMontanteINPS:=aMontanteINPS + aRecMontanti.inps_altri;
                     END IF;
                  ELSE
                     IF aRecVTrattamento.pg_classificazione_montanti = 3 THEN
                        IF aRecMissione.ti_anagrafico = 'D' THEN
                           aMontanteINPS:=aMontanteINPS + aRecMontanti.inps_tesoro_dipendenti;
                        END IF;
                     END IF;
                     IF aRecVTrattamento.pg_classificazione_montanti = 7 THEN
                         aMontanteINPS:=aMontanteINPS + aRecMontanti.inps_occasionali;
                     END IF;
                  END IF;
               END IF;
            END IF;
         END IF;

      END LOOP;

      CLOSE gen_cur;

   END;

   -------------------------------------------------------------------------------------------------
   -- Verifico se devo eseguire la lordizzazione

   IF coriLordizza_tab.COUNT > 0 THEN

      aImportoAccessoScaglione:=0;
      aImportoMaxRifScaglione:=0;

      BEGIN

         FOR i IN coriLordizza_tab.FIRST .. coriLordizza_tab.LAST

         LOOP

            isAnnualizzato:='N';

            IF coriLordizza_tab(i).tIsIrpef = 'Y' THEN

               aImportoAccessoScaglione:=aMontanteIrpef;
               aImportoMaxRifScaglione:=aMontanteIrpef;
               aAliquotaAnag:=0;

               -- Determino le eventuali eccezioni in calcolo irpef solo per il calcolo non dipendente

               IF aRecMissione.ti_anagrafico = 'A' THEN

                  IF aRecTipoTrattamento.fl_irpef_annualizzata = 'Y' THEN
                     isAnnualizzato:='2';
                     aImportoAccessoScaglione:=0;
                     aImportoMaxRifScaglione:=ROUND(
                                                      (aImportoNetto /
                                                       IBMUTL001.getDaysCommBetween
                                                            (TRUNC(aRecMissione.dt_inizio_missione),
                                                             TRUNC(aRecMissione.dt_fine_missione)
                                                            ) *
                                                       360
                                                      ),2
                                                   );
                     aAliquotaAnag:=0;
                  END IF;

                  IF (aAliquotaFiscaleAnag IS NOT NULL AND
                      aAliquotaFiscaleAnag > 0) THEN
                     isAnnualizzato:='1';
                     aImportoAccessoScaglione:=0;
                     aAliquotaAnag:=aAliquotaFiscaleAnag;
                  END IF;

               END IF;

               aAliquotaIrpef:=aAliquotaIrpef + getAliquotaLordizza(coriLordizza_tab(i).tIsIrpef,
                                                                    coriLordizza_tab(i).tCdCori,
                                                                    aRecTipoTrattamento.ti_anagrafico,
                                                                    aRecMissione.dt_registrazione,
                                                                    isAnnualizzato,
                                                                    aImportoAccessoScaglione,
                                                                    aImportoMaxRifScaglione,
                                                                    aAliquotaAnag);
            ELSE
               aImportoAccessoScaglione:=aMontanteInps;
               aImportoMaxRifScaglione:=aMontanteInps;
               aAliquotaAnag:=0;

               aAliquotaInps:=aAliquotaInps + getAliquotaLordizza(coriLordizza_tab(i).tIsIrpef,
                                                                    coriLordizza_tab(i).tCdCori,
                                                                    aRecTipoTrattamento.ti_anagrafico,
                                                                    aRecMissione.dt_registrazione,
                                                                    isAnnualizzato,
                                                                    aImportoAccessoScaglione,
                                                                    aImportoMaxRifScaglione,
                                                                    aAliquotaAnag);
            END IF;

         END LOOP;
--pipe.send_message('aAliquotaIrpef = '||aAliquotaIrpef);
--pipe.send_message('aAliquotaInps = '||aAliquotaInps);

         aImportoNetto:=aImportoNetto * (1 / (1 - aAliquotaIrpef * (1 - aAliquotaInps)));
         aInOutImportoLordo:=aInOutQuotaEsente + aImportoNetto;
--pipe.send_message('aImportoNetto = '||aImportoNetto);
--pipe.send_message('aInOutImportoLordo = '||aInOutImportoLordo);
         -- Ritorna l'aliquota irpef per lordizzazione in caso di trattamento annualizzato

         IF isAnnualizzato = '2' THEN
            inAliquotaIrpef:=(aAliquotaIrpef * 100);
         END IF;

      END;

   END IF;

   RETURN;

END lordizzaImporto;

--==================================================================================================
-- Ritorna l'aliquota cori per lordizzazione
--==================================================================================================
FUNCTION getAliquotaLordizza
   (
    isIrpef CHAR,
    aCdContributoRitenuta SCAGLIONE.cd_contributo_ritenuta%TYPE,
    aTiAnagrafico SCAGLIONE.ti_anagrafico%TYPE,
    aDataRif DATE,
    isAnnualizzato CHAR,
    aImportoAccesso IN OUT SCAGLIONE.im_inferiore%TYPE,
    aImportoMaxRif SCAGLIONE.im_inferiore%TYPE,
    aAliquotaAnag IN OUT SCAGLIONE.aliquota%TYPE
   ) RETURN SCAGLIONE.aliquota%TYPE IS
   aCdRegione COMPENSO.cd_regione_add%TYPE;
   aCdProvincia COMPENSO.cd_provincia_add%TYPE;
   aPgComune COMPENSO.pg_comune_add%TYPE;
   aAliquotaPerLordizza SCAGLIONE.aliquota%TYPE;
   aImponibileBlocco NUMBER(15,2);
   resto NUMBER(15,2);
   aImportoIrpef NUMBER(15,2);

   aRecVPreScaglione V_PRE_SCAGLIONE%ROWTYPE;
   aRecTmpScaglioneImponibile V_SCAGLIONE%ROWTYPE;

   gen_cur_s GenericCurTyp;

BEGIN

   -- Lettura dello scaglione per il recupero dell'aliquota cori

   aCdRegione:='*';
   aCdProvincia:='*';
   aPgComune:=0;
   aImportoIrpef:=0;
   aAliquotaPerLordizza:=0;

   aRecVPreScaglione:=CNRCTB545.getScaglione(aCdContributoRitenuta,
                                             aTiAnagrafico,
                                             aDataRif,
                                             aImportoAccesso,
                                             aAliquotaAnag,
                                             aCdRegione,
                                             aCdProvincia,
                                             aPgComune);

   -- L'accesso agli scaglioni successivi è svolto solo in caso di annualizzazione altrimenti si torna
   -- l'aliquota dello scaglione

   IF isAnnualizzato = '2' THEN

      -- Se il valore annualizzato è contenuto nel primo scaglione ritorno l'aliquota determinata altrimenti
      -- determino l'importo IRPEF per tutti gli scaglioni

      IF aRecVPreScaglione.im_superiore >= aImportoMaxRif THEN
         aAliquotaPerLordizza:=aRecVPreScaglione.aliquota_percip / 100;

      ELSE

         -- Valorizzazione importo IRPEF per il primo scaglione

         aImponibileBlocco:=aRecVPreScaglione.im_superiore;
         resto:=aImportoMaxRif - aImponibileBlocco;
         aImportoIrpef:=aImportoIrpef + ROUND(aImponibileBlocco * (aRecVPreScaglione.aliquota_percip / 100),2);

         -- Valorizzazione importo IRPEF per i restanti scaglioni

         BEGIN

            OPEN gen_cur_s FOR

                 SELECT *
                 FROM   V_SCAGLIONE
                 WHERE  cd_contributo_ritenuta = aCdContributoRitenuta AND
                        (ti_anagrafico = aTiAnagrafico OR
                         ti_anagrafico = '*' ) AND
                        dt_inizio_validita <=aDataRif AND
                        dt_fine_validita >= aDataRif AND
                        cd_regione = aCdRegione AND
                        cd_provincia = aCdProvincia AND
                        pg_comune = aPgComune AND
                        im_inferiore >= aRecVPreScaglione.im_superiore AND
                        im_inferiore <= aImportoMaxRif
                 ORDER BY 4;

            LOOP

               FETCH gen_cur_s INTO aRecTmpScaglioneImponibile;

               EXIT WHEN gen_cur_s%NOTFOUND;

               IF aImportoMaxRif < aRecTmpScaglioneImponibile.im_superiore THEN
                  aImponibileBlocco:=resto;
               ELSE
                  aImponibileBlocco:=aRecTmpScaglioneImponibile.im_superiore -
                                     aRecTmpScaglioneImponibile.im_inferiore +
                                     1;
                  resto:=resto - aImponibileBlocco;
               END IF;

               aImportoIrpef:=aImportoIrpef + ROUND(aImponibileBlocco * (aRecTmpScaglioneImponibile.aliquota_percip / 100),2);

            END LOOP;

            -- close cursore

            CLOSE gen_cur_s;

         END;

            aAliquotaPerLordizza:=(aImportoIrpef / aImportoMaxRif);

      END IF;

   ELSE
      aAliquotaPerLordizza:=aRecVPreScaglione.aliquota_percip / 100;
   END IF;

   RETURN aAliquotaPerLordizza;

END getAliquotaLordizza;


--==================================================================================================
-- Controllo eliminazione della missione
--==================================================================================================
PROCEDURE eseguiDelMissione
   (
    inCdsMissione MISSIONE.cd_cds%TYPE,
    inUoMissione MISSIONE.cd_unita_organizzativa%TYPE,
    inEsercizioMissione MISSIONE.esercizio%TYPE,
    inPgMissione MISSIONE.pg_missione%TYPE,
    statoCancella IN OUT NUMBER
   ) IS
   eseguiLock CHAR(1);
   aTipoChiamata CHAR(1);
   aStatoCancellazione INTEGER;
   fl_chk_anticipo CHAR(1);
   aRecMissione MISSIONE%ROWTYPE;
   aRecCompenso COMPENSO%ROWTYPE;

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Valorizzazione variabili

   eseguiLock:='Y';
   aTipoChiamata:='M';
   aStatoCancellazione:=0;
   IF statoCancella = 0 THEN
      fl_chk_anticipo:='N';
   ELSE
      fl_chk_anticipo:='Y';
   END IF;
   statoCancella:=0;

   -------------------------------------------------------------------------------------------------
   -- Recupero la missione

   aRecMissione:=CNRCTB500.getMissione (inCdsMissione,
                                        inUoMissione,
                                        inEsercizioMissione,
                                        inPgMissione,
                                        eseguiLock);

   -- La missione risulta essere già in stato annullato

   IF aRecMissione.stato_cofi = 'A' THEN
      IBMERR001.RAISE_ERR_GENERICO
         ('La missone selezionata risulta essere già stata annullata in data ' ||
          TO_CHAR(aRecMissione.dt_cancellazione,'DD/MM/YYYY'));
   END IF;

   -- La missione risulta essere associato a mandati e/o reversali

   IF aRecMissione.stato_cofi = 'P' THEN
      IBMERR001.RAISE_ERR_GENERICO
         ('Impossibile eliminare una missione che risulta pagata. Occorre prima annullare ' ||
          'il mandato associato');
   END IF;

   -- La missione risulta essere associato ad una spesa del fondo economale

   IF aRecMissione.stato_pagamento_fondo_eco = 'R' THEN
      IBMERR001.RAISE_ERR_GENERICO
         ('Impossibile eliminare una missione che risulta associata ad una spesa su fondo economale.');
   END IF;

   -------------------------------------------------------------------------------------------------
   -- Sgangio anticipo da missione

   IF (fl_chk_anticipo = 'Y' AND
       aRecMissione.pg_anticipo IS NOT NULL) THEN
      CNRCTB580.sganciaAnticipoDaMissione(aRecMissione.cd_cds_anticipo,
                                          aRecMissione.cd_uo_anticipo,
                                          aRecMissione.esercizio_anticipo,
                                          aRecMissione.pg_anticipo,
                                          aRecMissione.utuv,
                                          sysdate);
   END IF;

   -------------------------------------------------------------------------------------------------
   -- Verifico se la missione è associata ad un compenso

   IF aRecMissione.fl_associato_compenso = 'Y' THEN

      aRecCompenso:=CNRCTB545.getCompensoDaMissione(aRecMissione.cd_cds,
                                                    aRecMissione.cd_unita_organizzativa,
                                                    aRecMissione.esercizio,
                                                    aRecMissione.pg_missione,
                                                    eseguiLock);

      -- Controllo la cancellazione del compenso

      aStatoCancellazione:=CNRCTB550.cancellaCompenso(aRecCompenso.cd_cds,
                                                      aRecCompenso.cd_unita_organizzativa,
                                                      aRecCompenso.esercizio,
                                                      aRecCompenso.pg_compenso,
                                                      aTipoChiamata);

      IF aStatoCancellazione = CNRCTB545.isCancellazioneFisica THEN
         CNRCTB545.eliminaFisicoCompenso(aRecCompenso.cd_cds,
                                         aRecCompenso.cd_unita_organizzativa,
                                         aRecCompenso.esercizio,
                                         aRecCompenso.pg_compenso);
      ELSE
         CNRCTB545.eliminaLogicoCompenso(aRecCompenso.cd_cds,
                                         aRecCompenso.cd_unita_organizzativa,
                                         aRecCompenso.esercizio,
                                         aRecCompenso.pg_compenso,
                                         aRecMissione.utuv,
                                         'MI');
      END IF;

   END IF;

   -------------------------------------------------------------------------------------------------
   -- Ritorno lo stato della cancellazione da farsi sulla missione

   IF aStatoCancellazione = 0 THEN
      IF aRecMissione.ti_associato_manrev = 'N'  AND
	  	 (aRecMissione.stato_coge = 'N' OR aRecMissione.stato_coge = 'X') AND
		 (aRecMissione.stato_coan = 'N' OR aRecMissione.stato_coan = 'X') THEN
         aStatoCancellazione:=CNRCTB545.isCancellazioneFisica;
      ELSE
         aStatoCancellazione:=CNRCTB545.isCancellazioneLogica;
      END IF;
   END IF;

   statoCancella:=aStatoCancellazione;

END eseguiDelMissione;

END;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy