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

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

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

  CREATE OR REPLACE PACKAGE BODY "CNRCTB053" is

--------------------------------- VECCHIA GESTIONE -----------------------------------
 Procedure INS_ASS_GAE_ESERCIZIO(
    recParametriCnr PARAMETRI_CNR%rowtype,
    aLA linea_attivita%Rowtype,
    aTSNow date,
    aUser VARCHAR2)
 Is
    aAssLAEsercizio  ass_linea_attivita_esercizio%rowtype;
 Begin
    If aLa.PG_PROGETTO Is Not Null Then
       aAssLAEsercizio.ESERCIZIO                := aLA.ESERCIZIO_INIZIO;
       aAssLAEsercizio.CD_CENTRO_RESPONSABILITA := aLA.CD_CENTRO_RESPONSABILITA;
       aAssLAEsercizio.CD_LINEA_ATTIVITA        := aLA.CD_LINEA_ATTIVITA;
       aAssLAEsercizio.PG_PROGETTO              := aLA.PG_PROGETTO;
       If nvl(recParametriCnr.fl_nuovo_pdg,'N') = 'N' and aLA.ESERCIZIO_FINE > 2015 Then
          aAssLAEsercizio.ESERCIZIO_FINE        := 2015;
       Else
          aAssLAEsercizio.ESERCIZIO_FINE        := aLA.ESERCIZIO_FINE;
       End If;
       aAssLAEsercizio.DACR                     := aTSNow;
       aAssLAEsercizio.UTCR                     := aUser;
       aAssLAEsercizio.DUVA                     := aTSNow;
       aAssLAEsercizio.UTUV                     := aUser;
       aAssLAEsercizio.PG_VER_REC               := 1;
       CNRCTB010.ins_ASS_LINEA_ATTIVITA_ESER(aAssLAEsercizio);
    End If;
 End INS_ASS_GAE_ESERCIZIO;

 procedure ribaltaSuAreaPDGInt(
  aEsercizio number,
  aCdCentroResponsabilita varchar2,
  aCDR cdr%rowtype,
  aCDRArea cdr%rowtype,
  aEVCollegato elemento_voce%rowtype,
  aDett pdg_preventivo_spe_det%rowtype,
  recParametriCnr PARAMETRI_CNR%rowtype,
  aTSNow date,
  aUser varchar2
 ) is
  aUOCDS unita_organizzativa%rowtype;
  aLA linea_attivita%rowtype;
  aLACollegataS linea_attivita%rowtype;
  aLACollegataE linea_attivita%rowtype;
  aPgDettaglio NUMBER;
  aPgDettaglioColl NUMBER;
  aDestE pdg_preventivo_etr_det%rowtype;
  aDestS pdg_preventivo_spe_det%rowtype;
  aEV elemento_voce%rowtype;
  aStatoRibaltamento char(1);
  aFlagRibaltato boolean;
  aInsieme insieme_la%rowtype;
  aAssPdgVarCDRE ass_pdg_variazione_cdr%Rowtype;
  aAssPdgVarCDRS ass_pdg_variazione_cdr%Rowtype;
begin
    -- Leggo la linea di attività del dettaglio del centro servito

  begin
        select * into aLA from linea_attivita where
               CD_CENTRO_RESPONSABILITA = aCDR.cd_centro_responsabilita
         and CD_LINEA_ATTIVITA=aDett.cd_linea_attivita;
       exception
        when NO_DATA_FOUND then
       IBMERR001.RAISE_ERR_GENERICO('Linea di attività del dettaglio del centro servito non trovata!');
         end;

  -- Ricerca o creazione della nuova linea di attività nel servente AREA

  begin
      -- Devo selezionare la linea di entrata CSSAC (una sola in quest'area con natura 5)
        select * into aLACollegataE from linea_attivita where
               CD_CENTRO_RESPONSABILITA = aCDRArea.cd_centro_responsabilita
           and CD_TIPO_LINEA_ATTIVITA = CNRCTB010.TI_LA_CSSAC
           and CD_NATURA = aLA.cd_natura
       and CD_NATURA = '5'     ; -- Dettaglio di natura 5
       exception
        when NO_DATA_FOUND then
            aInsieme:=null;
            aInsieme:=CNRCTB010.creaInsiemeScrArea(aEsercizio, aCDRArea.cd_centro_responsabilita, aUser);
            aLACollegataE.ESERCIZIO_INIZIO:= aEsercizio;
            aLACollegataE.ESERCIZIO_FINE:= CNRCTB008.ESERCIZIO_INFINITO;
            aLACollegataE.CD_CENTRO_RESPONSABILITA:=aCDRArea.cd_centro_responsabilita;
            aLACollegataE.CD_NATURA := aLA.cd_natura;
            aLACollegataE.CD_TIPO_LINEA_ATTIVITA := CNRCTB010.TI_LA_CSSAC;
            aLACollegataE.ds_linea_attivita:=aLA.ds_linea_attivita;
            aLACollegataE.denominazione:=CNRCTB010.SPESE_PER_COSTI_ALTRUI;
            aLACollegataE.CD_LINEA_ATTIVITA := CNRCTB010.getNextCodice(CNRCTB010.TI_TIPO_LA_SISTEMA,aLACollegataE);
            aLACollegataE.TI_GESTIONE := CNRCTB010.TI_GESTIONE_ENTRATE;
            aLACollegataE.CD_INSIEME_LA := aInsieme.cd_insieme_la;
            aLACollegataE.DACR:=aTSNow;
            aLACollegataE.UTCR:=aUser;
            aLACollegataE.DUVA:=aTSNow;
            aLACollegataE.UTUV:=aUser;
            aLACollegataE.PG_VER_REC:=1;
            CNRCTB010.ins_LINEA_ATTIVITA(aLACollegataE);

	    INS_ASS_GAE_ESERCIZIO(recParametriCnr, aLACollegataE, aTSNow, aUser);

            select * into aLACollegataE from linea_attivita where
                   CD_CENTRO_RESPONSABILITA=aCDRArea.cd_centro_responsabilita
             and CD_LINEA_ATTIVITA = aLACollegataE.CD_LINEA_ATTIVITA;
     end;

     -- Calcolo il progressivo del dettaglio (Ricavo figurativo) nel servente

         aDestE:=NULL;
         aPgDettaglioColl:=0;
         select NVL(max(pg_entrata),0) into aPgDettaglioColl from PDG_PREVENTIVO_ETR_DET where
             ESERCIZIO=aEsercizio
            and CD_CENTRO_RESPONSABILITA=aCDRArea.cd_centro_responsabilita
            and CD_LINEA_ATTIVITA=aLACollegataE.cd_linea_attivita
            and TI_APPARTENENZA=aEVCollegato.ti_appartenenza
            and TI_GESTIONE=aEVCollegato.ti_gestione
            and CD_ELEMENTO_VOCE=aEVCollegato.cd_elemento_voce;

         aPgDettaglioColl:=aPgDettaglioColl+1;

     -- Inserisco il ricavo figurativo nel servente AREA

         aDestE.ESERCIZIO:=aEsercizio;
         aDestE.CD_CENTRO_RESPONSABILITA:=aCDRArea.cd_centro_responsabilita;
         aDestE.CD_LINEA_ATTIVITA:=aLACollegataE.cd_linea_attivita;
         aDestE.TI_APPARTENENZA:=aEVCollegato.ti_appartenenza;
         aDestE.TI_GESTIONE:=aEVCollegato.ti_gestione;
         aDestE.CD_ELEMENTO_VOCE:=aEVCollegato.cd_elemento_voce;
         aDestE.PG_ENTRATA:=aPgDettaglioColl;
         aDestE.DT_REGISTRAZIONE:=aTSNow;
         aDestE.DESCRIZIONE:='Ricavo figurativo';
         aDestE.STATO:='Y';
         aDestE.ORIGINE:=CNRCTB050.ORIGINE_DIRETTA;
         aDestE.CATEGORIA_DETTAGLIO:=CNRCTB050.DETTAGLIO_CARICO;
         aDestE.FL_SOLA_LETTURA:='Y';

         aDestE.CD_CENTRO_RESPONSABILITA_CLGS:=aCDR.cd_centro_responsabilita;
         aDestE.CD_LINEA_ATTIVITA_CLGS:=aLA.cd_linea_attivita;
         aDestE.CD_FUNZIONE:=aLA.cd_funzione;
         aDestE.CD_NATURA:=aLA.cd_natura;
         aDestE.TI_APPARTENENZA_CLGS:=aDett.ti_appartenenza;
         aDestE.TI_GESTIONE_CLGS:=aDett.ti_gestione;
         aDestE.CD_ELEMENTO_VOCE_CLGS:=aDett.cd_elemento_voce;
         aDestE.PG_SPESA_CLGS:=aDett.pg_spesa;

         aDestE.IM_RB_RSE:=
            aDett.IM_RH_CCS_COSTI
           +aDett.IM_RM_CSS_AMMORTAMENTI
           +aDett.IM_RN_CSS_RIMANENZE
           +aDett.IM_RO_CSS_ALTRI_COSTI;

     aDestE.IM_RD_A2_RICAVI:=
            aDett.IM_RAA_A2_COSTI_FINALI;

     aDestE.IM_RF_A3_RICAVI:=
            aDett.IM_RAH_A3_COSTI_FINALI;

         aDestE.IM_RA_RCE:=0;
         aDestE.IM_RC_ESR:=0;
         aDestE.IM_RE_A2_ENTRATE:=0;
         aDestE.IM_RG_A3_ENTRATE:=0;

         aDestE.ESERCIZIO_PDG_VARIAZIONE:=aDett.ESERCIZIO_PDG_VARIAZIONE;
         aDestE.PG_VARIAZIONE_PDG:=aDett.PG_VARIAZIONE_PDG;

         aDestE.DACR:=aTSNow;
         aDestE.UTCR:=aUser;
         aDestE.DUVA:=aTSNow;
         aDestE.UTUV:=aUser;
         aDestE.PG_VER_REC:=1;
         CNRCTB050.ins_PDG_PREVENTIVO_ETR_DET (aDestE);

        -- Aggiorno il dettaglio del centro servito con i dati del ricavo figurativo nel servente area

       update PDG_PREVENTIVO_SPE_DET set
        PG_ENTRATA_CLGE = aDestE.pg_entrata,
           CD_CENTRO_RESPONSABILITA_CLGE=aDestE.cd_centro_responsabilita,
           CD_LINEA_ATTIVITA_CLGE=aDestE.cd_linea_attivita,
           TI_APPARTENENZA_CLGE=aDestE.ti_appartenenza,
           TI_GESTIONE_CLGE=aDestE.ti_gestione,
           CD_ELEMENTO_VOCE_CLGE=aDestE.cd_elemento_voce,
           CATEGORIA_DETTAGLIO=CNRCTB050.DETTAGLIO_SCARICO
       where
               ESERCIZIO=aDett.esercizio
           and CD_CENTRO_RESPONSABILITA=aDett.cd_centro_responsabilita
           and CD_LINEA_ATTIVITA=aDett.cd_linea_attivita
           and TI_APPARTENENZA=aDett.ti_appartenenza
           and TI_GESTIONE=aDett.ti_gestione
           and CD_ELEMENTO_VOCE=aDett.cd_elemento_voce
         and PG_SPESA=aDett.pg_spesa;

        -- Se il dettaglio proviene da una variazione PDG di un istituto sulla natura 5
        -- carico l'associazione tra la variazione PDG e il CDR dell'area
         If aDestE.ESERCIZIO_PDG_VARIAZIONE Is Not Null And aDestE.PG_VARIAZIONE_PDG Is Not Null Then
             Begin
            select * into aAssPdgVarCDRE from ass_pdg_variazione_cdr where
                   ESERCIZIO = aDestE.ESERCIZIO And
                   PG_VARIAZIONE_PDG = aDestE.PG_VARIAZIONE_PDG And
                   CD_CENTRO_RESPONSABILITA = aDestE.cd_centro_responsabilita;
           Exception
             When NO_DATA_FOUND Then
               aAssPdgVarCDRE.ESERCIZIO := aDestE.ESERCIZIO;
               aAssPdgVarCDRE.PG_VARIAZIONE_PDG := aDestE.PG_VARIAZIONE_PDG;
               aAssPdgVarCDRE.CD_CENTRO_RESPONSABILITA := aDestE.cd_centro_responsabilita;
               aAssPdgVarCDRE.IM_ENTRATA := 0;
               aAssPdgVarCDRE.IM_SPESA := 0;
                 aAssPdgVarCDRE.DACR:=aTSNow;
                 aAssPdgVarCDRE.UTCR:=aUser;
                 aAssPdgVarCDRE.DUVA:=aTSNow;
                 aAssPdgVarCDRE.UTUV:=aUser;
                 aAssPdgVarCDRE.PG_VER_REC:=1;
                 CNRCTB050.ins_ASS_PDG_VARIAZIONE_CDR(aAssPdgVarCDRE);
             End;
           End If;

     -- Creo la spesa nel centro servente

     -- Per prima cosa è necessario creare la linea di attività collegata a quella di partenza (spesa servito)
     begin
      -- Devo selezionare la linea di spesa collegata
      -- Si tratta di una linea di attività di spesa propria dell'AREA
        select * into aLACollegataS from linea_attivita where
               CD_CENTRO_RESPONSABILITA = aCDRArea.cd_centro_responsabilita
         and CD_LA_COLLEGATO=aLA.cd_linea_attivita
         and CD_CDR_COLLEGATO=aCDR.cd_centro_responsabilita
           and CD_TIPO_LINEA_ATTIVITA = CNRCTB010.TI_LA_PROP
       and TI_GESTIONE = CNRCTB010.TI_GESTIONE_SPESE;
       exception
        when NO_DATA_FOUND then
            aInsieme:=CNRCTB010.getInsiemeScrArea(aEsercizio, aCDRArea.cd_centro_responsabilita);
            aLACollegataS.ESERCIZIO_INIZIO:= aEsercizio;
            aLACollegataS.ESERCIZIO_FINE:= CNRCTB008.ESERCIZIO_INFINITO;
            aLACollegataS.CD_CENTRO_RESPONSABILITA:=aCDRArea.cd_centro_responsabilita;
            aLACollegataS.CD_FUNZIONE := aLA.cd_funzione;
            aLACollegataS.CD_NATURA := aLA.cd_natura;
            aLACollegataS.CD_TIPO_LINEA_ATTIVITA := CNRCTB010.TI_LA_PROP;
            aLACollegataS.ds_linea_attivita:=aLA.ds_linea_attivita;
            aLACollegataS.denominazione:=CNRCTB010.SPESE_PER_COSTI_ALTRUI;
            aLACollegataS.cd_la_collegato:=aLA.cd_linea_attivita;
            aLACollegataS.cd_cdr_collegato:=aCDR.cd_centro_responsabilita;
            aLACollegataS.CD_LINEA_ATTIVITA := CNRCTB010.getNextCodice(CNRCTB010.TI_TIPO_LA_PROPRIA,aLACollegataS);
            aLACollegataS.TI_GESTIONE := CNRCTB010.TI_GESTIONE_SPESE;
            aLACollegataS.CD_INSIEME_LA := aInsieme.CD_INSIEME_LA;
            aLACollegataS.DACR:=aTSNow;
            aLACollegataS.UTCR:=aUser;
            aLACollegataS.DUVA:=aTSNow;
            aLACollegataS.UTUV:=aUser;
            aLACollegataS.PG_VER_REC:=1;
            CNRCTB010.ins_LINEA_ATTIVITA(aLACollegataS);

            INS_ASS_GAE_ESERCIZIO(recParametriCnr, aLACollegataS, aTSNow, aUser);

            CNRCTB010.COPIARISULTATI(aLACollegataS,aLA);

            select * into aLACollegataS from linea_attivita where
                   CD_CENTRO_RESPONSABILITA=aCDRArea.cd_centro_responsabilita
             and CD_LINEA_ATTIVITA = aLACollegataS.cd_linea_attivita;
         end;

         aDestS:=NULL;
         aPgDettaglioColl:=0;
         select NVL(max(pg_spesa),0) into aPgDettaglioColl from PDG_PREVENTIVO_SPE_DET where
             ESERCIZIO=aEsercizio
            and CD_CENTRO_RESPONSABILITA=aCDRArea.cd_centro_responsabilita
            and CD_LINEA_ATTIVITA=aLACollegataS.cd_linea_attivita
            and TI_APPARTENENZA=aDett.ti_appartenenza
            and TI_GESTIONE=aDett.ti_gestione
            and CD_ELEMENTO_VOCE=aDett.cd_elemento_voce;

         aPgDettaglioColl:=aPgDettaglioColl+1;

     -- Il dettaglio di spesa nell'area = a quello di spesa del servito

     aDestS:=NULL;
         aDestS.ESERCIZIO:=aEsercizio;
         aDestS.CD_CENTRO_RESPONSABILITA:=aCDRArea.CD_CENTRO_RESPONSABILITA;
         aDestS.CD_LINEA_ATTIVITA:=aLACollegataS.CD_LINEA_ATTIVITA;
         aDestS.CD_FUNZIONE:=aLACollegataS.cd_funzione;
         aDestS.CD_NATURA:=aLACollegataS.cd_natura;

         aDestS.TI_APPARTENENZA:=aDett.TI_APPARTENENZA;
         aDestS.TI_GESTIONE:=aDett.TI_GESTIONE;
         aDestS.CD_ELEMENTO_VOCE:=aDett.CD_ELEMENTO_VOCE;
         aDestS.PG_SPESA:=aPgDettaglioColl;
         aDestS.DT_REGISTRAZIONE:=aTSNow;
         aDestS.DESCRIZIONE:=aDett.DESCRIZIONE;
         aDestS.STATO:=aDett.STATO;
         aDestS.ORIGINE:=aDett.ORIGINE;
         aDestS.CATEGORIA_DETTAGLIO:=aDett.CATEGORIA_DETTAGLIO;
         aDestS.FL_SOLA_LETTURA:=aDett.FL_SOLA_LETTURA;

--         aDestS.CD_CENTRO_RESPONSABILITA_CLGE:=aDett.CD_CENTRO_RESPONSABILITA_CLGE;
--         aDestS.CD_LINEA_ATTIVITA_CLGE:=aDett.CD_LINEA_ATTIVITA_CLGE;
--         aDestS.TI_APPARTENENZA_CLGE:=aDett.TI_APPARTENENZA_CLGE;
--         aDestS.TI_GESTIONE_CLGE:=aDett.TI_GESTIONE_CLGE;
--         aDestS.CD_ELEMENTO_VOCE_CLGE:=aDett.CD_ELEMENTO_VOCE_CLGE;
--         aDestS.PG_ENTRATA_CLGE:=aDett.PG_ENTRATA_CLGE;

         aDestS.IM_RH_CCS_COSTI:=aDett.IM_RH_CCS_COSTI;
         aDestS.IM_RI_CCS_SPESE_ODC:=aDett.IM_RI_CCS_SPESE_ODC;
         aDestS.IM_RJ_CCS_SPESE_ODC_ALTRA_UO:=aDett.IM_RJ_CCS_SPESE_ODC_ALTRA_UO;
         aDestS.IM_RK_CCS_SPESE_OGC:=aDett.IM_RK_CCS_SPESE_OGC;
         aDestS.IM_RL_CCS_SPESE_OGC_ALTRA_UO:=aDett.IM_RL_CCS_SPESE_OGC_ALTRA_UO;
         aDestS.IM_RM_CSS_AMMORTAMENTI:=aDett.IM_RM_CSS_AMMORTAMENTI;
         aDestS.IM_RN_CSS_RIMANENZE:=aDett.IM_RN_CSS_RIMANENZE;
         aDestS.IM_RO_CSS_ALTRI_COSTI:=aDett.IM_RO_CSS_ALTRI_COSTI;
         aDestS.IM_RP_CSS_VERSO_ALTRO_CDR:=aDett.IM_RP_CSS_VERSO_ALTRO_CDR;
         aDestS.IM_RQ_SSC_COSTI_ODC:=aDett.IM_RQ_SSC_COSTI_ODC;
         aDestS.IM_RR_SSC_COSTI_ODC_ALTRA_UO:=aDett.IM_RR_SSC_COSTI_ODC_ALTRA_UO;
         aDestS.IM_RS_SSC_COSTI_OGC:=aDett.IM_RS_SSC_COSTI_OGC;
         aDestS.IM_RT_SSC_COSTI_OGC_ALTRA_UO:=aDett.IM_RT_SSC_COSTI_OGC_ALTRA_UO;
         aDestS.IM_RU_SPESE_COSTI_ALTRUI:=aDett.IM_RU_SPESE_COSTI_ALTRUI;
         aDestS.IM_RV_PAGAMENTI:=aDett.IM_RV_PAGAMENTI;
         aDestS.IM_RAA_A2_COSTI_FINALI:=aDett.IM_RAA_A2_COSTI_FINALI;
         aDestS.IM_RAB_A2_COSTI_ALTRO_CDR:=aDett.IM_RAB_A2_COSTI_ALTRO_CDR;
         aDestS.IM_RAC_A2_SPESE_ODC:=aDett.IM_RAC_A2_SPESE_ODC;
         aDestS.IM_RAD_A2_SPESE_ODC_ALTRA_UO:=aDett.IM_RAD_A2_SPESE_ODC_ALTRA_UO;
         aDestS.IM_RAE_A2_SPESE_OGC:=aDett.IM_RAE_A2_SPESE_OGC;
         aDestS.IM_RAF_A2_SPESE_OGC_ALTRA_UO:=aDett.IM_RAF_A2_SPESE_OGC_ALTRA_UO;
         aDestS.IM_RAG_A2_SPESE_COSTI_ALTRUI:=aDett.IM_RAG_A2_SPESE_COSTI_ALTRUI;
         aDestS.IM_RAH_A3_COSTI_FINALI:=aDett.IM_RAH_A3_COSTI_FINALI;
         aDestS.IM_RAI_A3_COSTI_ALTRO_CDR:=aDett.IM_RAI_A3_COSTI_ALTRO_CDR;
         aDestS.IM_RAL_A3_SPESE_ODC:=aDett.IM_RAL_A3_SPESE_ODC;
         aDestS.IM_RAM_A3_SPESE_ODC_ALTRA_UO:=aDett.IM_RAM_A3_SPESE_ODC_ALTRA_UO;
         aDestS.IM_RAN_A3_SPESE_OGC:=aDett.IM_RAN_A3_SPESE_OGC;
         aDestS.IM_RAO_A3_SPESE_OGC_ALTRA_UO:=aDett.IM_RAO_A3_SPESE_OGC_ALTRA_UO;
         aDestS.IM_RAP_A3_SPESE_COSTI_ALTRUI:=aDett.IM_RAP_A3_SPESE_COSTI_ALTRUI;

         aDestS.ESERCIZIO_PDG_VARIAZIONE:=aDett.ESERCIZIO_PDG_VARIAZIONE;
         aDestS.PG_VARIAZIONE_PDG:=aDett.PG_VARIAZIONE_PDG;

         aDestS.DACR:=aTSNow;
         aDestS.UTCR:=aUser;
         aDestS.DUVA:=aTSNow;
         aDestS.UTUV:=aUser;
         aDestS.PG_VER_REC:=1;

  -- Mantengo il collegamento con il dettaglio verso altra UO esistente eventualmente nel servito

         aDestS.CD_CENTRO_RESPONSABILITA_CLGS:=aDett.CD_CENTRO_RESPONSABILITA_CLGS;
         aDestS.CD_LINEA_ATTIVITA_CLGS:=aDett.CD_LINEA_ATTIVITA_CLGS;
         aDestS.TI_APPARTENENZA_CLGS:=aDett.TI_APPARTENENZA_CLGS;
         aDestS.TI_GESTIONE_CLGS:=aDett.TI_GESTIONE_CLGS;
         aDestS.CD_ELEMENTO_VOCE_CLGS:=aDett.CD_ELEMENTO_VOCE_CLGS;
         aDestS.PG_SPESA_CLGS:=aDett.PG_SPESA_CLGS;

         CNRCTB050.ins_PDG_PREVENTIVO_SPE_DET (aDestS);

     -- Aggiorna il dettaglio eventualmente precedentemente collegato al servito e ora ollegato a dettaglio dell'AREA
         update pdg_preventivo_spe_det set
          cd_centro_responsabilita_clgs=aDestS.CD_CENTRO_RESPONSABILITA,
          CD_LINEA_ATTIVITA_CLGS=aDestS.CD_LINEA_ATTIVITA,
          TI_APPARTENENZA_CLGS=aDestS.TI_APPARTENENZA,
          TI_GESTIONE_CLGS=aDestS.TI_GESTIONE,
          CD_ELEMENTO_VOCE_CLGS=aDestS.CD_ELEMENTO_VOCE,
          PG_SPESA_CLGS=aDestS.PG_SPESA,
      pg_ver_rec=pg_ver_Rec+1,
      utuv=aUser,
      duva=aTSNow
     where
               esercizio = aDestS.esercizio
           And CD_CENTRO_RESPONSABILITA=aDestS.cd_centro_responsabilita_clgs
           and CD_LINEA_ATTIVITA=aDestS.cd_linea_attivita_clgs
           and TI_APPARTENENZA=aDestS.ti_appartenenza_clgs
           and TI_GESTIONE=aDestS.ti_gestione_clgs
           and CD_ELEMENTO_VOCE=aDestS.cd_elemento_voce_clgs
         and PG_SPESA=aDestS.pg_spesa_clgs;



         -- Aggiornamento del dettaglio del centro servito a livello di importi (aCDR)

         update pdg_preventivo_spe_det set

     -- Sposto gli importi nelle nuove colonne
      IM_RP_CSS_VERSO_ALTRO_CDR=
            IM_RH_CCS_COSTI
           +IM_RM_CSS_AMMORTAMENTI
           +IM_RN_CSS_RIMANENZE
           +IM_RO_CSS_ALTRI_COSTI
         ,IM_RAB_A2_COSTI_ALTRO_CDR=
            IM_RAA_A2_COSTI_FINALI
         ,IM_RAI_A3_COSTI_ALTRO_CDR=
            IM_RAH_A3_COSTI_FINALI

     -- Azzero i costi (H) e le colonne che li determinano (I,J,K,L)
         ,IM_RH_CCS_COSTI=0
         ,IM_RM_CSS_AMMORTAMENTI=0
         ,IM_RN_CSS_RIMANENZE=0
         ,IM_RO_CSS_ALTRI_COSTI=0

         ,IM_RAA_A2_COSTI_FINALI=0
         ,IM_RAH_A3_COSTI_FINALI=0

     ,IM_RI_CCS_SPESE_ODC=0
         ,IM_RK_CCS_SPESE_OGC=0

     -- Azzero il collegamento con il centro servito - è stato scaricato sull'area

         ,cd_centro_responsabilita_clgs=null
         ,CD_LINEA_ATTIVITA_CLGS=null
         ,TI_APPARTENENZA_CLGS=null
         ,TI_GESTIONE_CLGS=null
         ,CD_ELEMENTO_VOCE_CLGS=null
         ,PG_SPESA_CLGS=null

         ,IM_RJ_CCS_SPESE_ODC_ALTRA_UO=0
         ,IM_RL_CCS_SPESE_OGC_ALTRA_UO=0
         ,IM_RR_SSC_COSTI_ODC_ALTRA_UO=0
         ,IM_RT_SSC_COSTI_OGC_ALTRA_UO=0
         ,IM_RAD_A2_SPESE_ODC_ALTRA_UO=0
         ,IM_RAF_A2_SPESE_OGC_ALTRA_UO=0
         ,IM_RAM_A3_SPESE_ODC_ALTRA_UO=0
         ,IM_RAO_A3_SPESE_OGC_ALTRA_UO=0

     ,IM_RQ_SSC_COSTI_ODC=0
         ,IM_RS_SSC_COSTI_OGC=0
         ,IM_RAC_A2_SPESE_ODC=0
         ,IM_RAE_A2_SPESE_OGC=0
         ,IM_RAL_A3_SPESE_ODC=0
         ,IM_RAN_A3_SPESE_OGC=0

     ,IM_RU_SPESE_COSTI_ALTRUI=0
     ,IM_RAP_A3_SPESE_COSTI_ALTRUI=0
     ,IM_RAG_A2_SPESE_COSTI_ALTRUI=0
     ,IM_RV_PAGAMENTI=0

     ,pg_ver_rec=pg_ver_Rec+1
     ,utuv=aUser
     ,duva=aTSNow
     where
               esercizio = aDett.esercizio
           And CD_CENTRO_RESPONSABILITA=aDett.cd_centro_responsabilita
           and CD_LINEA_ATTIVITA=aDett.cd_linea_attivita
           and TI_APPARTENENZA=aDett.ti_appartenenza
           and TI_GESTIONE=aDett.ti_gestione
           and CD_ELEMENTO_VOCE=aDett.cd_elemento_voce
         and PG_SPESA=aDett.pg_spesa;

        -- Se il dettaglio proviene da una variazione PDG di un istituto sulla natura 5
        -- carico l'associazione tra la variazione PDG e il CDR dell'area
        If aDestS.ESERCIZIO_PDG_VARIAZIONE Is Not Null And aDestS.PG_VARIAZIONE_PDG Is Not Null Then
             Begin
            select * into aAssPdgVarCDRS from ass_pdg_variazione_cdr where
                   ESERCIZIO = aDestS.ESERCIZIO And
                   PG_VARIAZIONE_PDG = aDestS.PG_VARIAZIONE_PDG And
                   CD_CENTRO_RESPONSABILITA = aDestS.cd_centro_responsabilita;
           Exception
             When NO_DATA_FOUND Then
               aAssPdgVarCDRS.ESERCIZIO := aDestS.ESERCIZIO;
               aAssPdgVarCDRS.PG_VARIAZIONE_PDG := aDestS.PG_VARIAZIONE_PDG;
               aAssPdgVarCDRS.CD_CENTRO_RESPONSABILITA := aDestS.cd_centro_responsabilita;
               aAssPdgVarCDRS.IM_ENTRATA := 0;
               aAssPdgVarCDRS.IM_SPESA := 0;
                 aAssPdgVarCDRS.DACR:=aTSNow;
                 aAssPdgVarCDRS.UTCR:=aUser;
                 aAssPdgVarCDRS.DUVA:=aTSNow;
                 aAssPdgVarCDRS.UTUV:=aUser;
                 aAssPdgVarCDRS.PG_VER_REC:=1;
                 CNRCTB050.ins_ASS_PDG_VARIAZIONE_CDR(aAssPdgVarCDRS);
             End;
           End If;
 End;

-------------------------------------------------------------------------------------------------
-------------------------------------- NUOVA GESTIONE -------------------------------------------
-------------------------------------------------------------------------------------------------

Procedure ribaltaSuAreaPDGG_etr_Int(
  aEsercizio              number,
  aCdCentroResponsabilita varchar2,
  aCDR                    cdr%rowtype,
  aCDRArea                cdr%rowtype,
  aDett                   pdg_modulo_entrate_gest%rowtype,
  RIGHE_VAR_ENT           pdg_variazione_riga_gest%rowtype,
  recParametriCNR         PARAMETRI_CNR%Rowtype,
  aTSNow                  date,
  aUser                   VARCHAR2) Is

  aLA                   linea_attivita%Rowtype;
  aLACollegataE         linea_attivita%Rowtype;
  aDestE                pdg_modulo_entrate_gest%Rowtype;
  aRighe_var_ent        pdg_variazione_riga_gest%Rowtype;
  aAssPdgVarCDRE        ass_pdg_variazione_cdr%Rowtype;

Begin
    -- Leggo la linea di attività del dettaglio del CDR Assegnatario che deve scaricare sull'Area

-- L'nvl c'è perchè vedendo se è pieno il record del gestionale o delle variazioni capisco di cosa si tratta,
-- se dello scarico del PdG o dei dettagli di variazione

  begin
        Select *
        Into  aLA
        From  linea_attivita
        Where CD_CENTRO_RESPONSABILITA = Nvl(aDett.CD_CDR_ASSEGNATARIO, RIGHE_VAR_ENT.CD_CDR_ASSEGNATARIO) And
              CD_LINEA_ATTIVITA        = Nvl(aDett.cd_linea_attivita, RIGHE_VAR_ENT.cd_linea_attivita);
      exception
        when NO_DATA_FOUND then
       IBMERR001.RAISE_ERR_GENERICO('Linea di attività di entrata del dettaglio del CdR che scarica su Area non trovata!');
        End;

  -- Ricerca o creazione della nuova linea di attività dell'AREA creata dalla Linea
  -- del CdR (finale) che sta scaricando

  begin
        -- Seleziono la linea di entrata con gli stessi CdR/Linea di origine

        select *
        into  aLACollegataE
        from  linea_attivita
        Where CD_CENTRO_RESPONSABILITA = aCDRArea.CD_CENTRO_RESPONSABILITA And
              CD_CDR_COLLEGATO = Nvl(aDett.CD_CDR_ASSEGNATARIO, RIGHE_VAR_ENT.CD_CDR_ASSEGNATARIO) And
                CD_LA_COLLEGATO  = Nvl(aDett.CD_LINEA_ATTIVITA, RIGHE_VAR_ENT.CD_LINEA_ATTIVITA);

       exception
        when NO_DATA_FOUND then

            aLACollegataE.CD_CENTRO_RESPONSABILITA      := aCDRArea.cd_centro_responsabilita;
            aLACollegataE.CD_LINEA_ATTIVITA             := CNRCTB010.getNextCodice(CNRCTB010.TI_TIPO_LA_PROPRIA,aLACollegataE);
            aLACollegataE.CD_TIPO_LINEA_ATTIVITA        := CNRCTB010.TI_LA_PROP;
            aLACollegataE.denominazione                 := 'Linea generata da '||Nvl(aDett.CD_CDR_ASSEGNATARIO, RIGHE_VAR_ENT.CD_CDR_ASSEGNATARIO)||
                                                           ' ('||aCDRArea.DS_CDR||') / '||
                                                           Nvl(aDett.CD_LINEA_ATTIVITA, RIGHE_VAR_ENT.CD_LINEA_ATTIVITA);
            aLACollegataE.CD_NATURA                     := aLA.cd_natura;
            aLACollegataE.ds_linea_attivita             := aLA.ds_linea_attivita ||'('||Nvl(aDett.CD_CDR_ASSEGNATARIO, RIGHE_VAR_ENT.CD_CDR_ASSEGNATARIO)||
                                                           '/'||Nvl(aDett.CD_LINEA_ATTIVITA, RIGHE_VAR_ENT.CD_LINEA_ATTIVITA)||')';
            aLACollegataE.ESERCIZIO_INIZIO              := aEsercizio;
            aLACollegataE.ESERCIZIO_FINE                := CNRCTB008.ESERCIZIO_INFINITO;
            aLACollegataE.CD_INSIEME_LA                 := Null;
            aLACollegataE.TI_GESTIONE                   := CNRCTB010.TI_GESTIONE_ENTRATE;
            aLACollegataE.DACR                          := aTSNow;
            aLACollegataE.UTCR                          := aUser;
            aLACollegataE.DUVA                          := aTSNow;
            aLACollegataE.UTUV                          := aUser;
            aLACollegataE.PG_VER_REC                    := 1;
            aLACollegataE.CD_CDR_COLLEGATO              := Nvl(aDett.CD_CDR_ASSEGNATARIO, RIGHE_VAR_ENT.CD_CDR_ASSEGNATARIO);
            aLACollegataE.CD_LA_COLLEGATO               := Nvl(aDett.CD_LINEA_ATTIVITA, RIGHE_VAR_ENT.CD_LINEA_ATTIVITA);
            aLACollegataE.PG_PROGETTO                   := Nvl(aDett.pg_progetto, aLa.pg_progetto);
            aLACollegataE.CD_RESPONSABILE_TERZO         := aLA.CD_RESPONSABILE_TERZO;
            aLACollegataE.FL_LIMITE_ASS_OBBLIG          := 'N'; -- DEFAULT SFONDABILE

            aLACollegataE.CD_MISSIONE                   := aLA.cd_missione;
            If Nvl(aDett.pg_progetto, aLa.pg_progetto) = aLA.pg_progetto Then
               aLACollegataE.CD_PROGRAMMA               := aLA.cd_programma;
            End If;

----DBMS_OUTPUT.PUT_LINE ('INSERISCE LA '||aLACollegataE.CD_CENTRO_RESPONSABILITA||' '||aLACollegataE.CD_LINEA_ATTIVITA);

            CNRCTB010.ins_LINEA_ATTIVITA(aLACollegataE);

	    INS_ASS_GAE_ESERCIZIO(recParametriCnr, aLACollegataE, aTSNow, aUser);

            select *
            into  aLACollegataE
            from  linea_attivita
            Where CD_CENTRO_RESPONSABILITA = aCDRArea.cd_centro_responsabilita And
                  CD_LINEA_ATTIVITA        = aLACollegataE.CD_LINEA_ATTIVITA;
     end;

If aDett.esercizio Is Not Null Then     -- scarico del Piano di Gestione gestionale, non per variazione

         aDestE := NULL;

     -- Inserisco la riga per L'Area (scaricata)

         aDestE.ESERCIZIO                        := aDett.esercizio;
         aDestE.CD_CENTRO_RESPONSABILITA         := aDett.CD_CENTRO_RESPONSABILITA;
         aDestE.PG_PROGETTO                      := aDett.PG_PROGETTO;
         aDestE.CD_NATURA                        := aDett.CD_NATURA;
         aDestE.ID_CLASSIFICAZIONE               := aDett.ID_CLASSIFICAZIONE;
         aDestE.CD_CDS_AREA                      := aDett.CD_CDS_AREA;
         aDestE.PG_DETTAGLIO                     := aDett.PG_DETTAGLIO;
         aDestE.CD_CDR_ASSEGNATARIO              := aCDRArea.cd_centro_responsabilita;
         aDestE.CD_LINEA_ATTIVITA                := aLACollegataE.cd_linea_attivita;
         aDestE.TI_APPARTENENZA                  := aDett.TI_APPARTENENZA;
         aDestE.TI_GESTIONE                      := aDett.TI_GESTIONE;
         aDestE.CD_ELEMENTO_VOCE                 := aDett.CD_ELEMENTO_VOCE;
         aDestE.DT_REGISTRAZIONE                 := aDett.DT_REGISTRAZIONE;
         aDestE.DESCRIZIONE                      := aDett.DESCRIZIONE;
         aDestE.ORIGINE                          := aDett.ORIGINE;             -- cioè DIR
         aDestE.CATEGORIA_DETTAGLIO              := aDett.CATEGORIA_DETTAGLIO; -- cioè PRE
         aDestE.FL_SOLA_LETTURA                  := 'Y';
         aDestE.IM_ENTRATA                       := aDett.IM_ENTRATA;
         aDestE.IM_INCASSI                       := aDett.IM_INCASSI;
         aDestE.CD_CDR_ASSEGNATARIO_CLGE         := aDett.CD_CDR_ASSEGNATARIO;
         aDestE.CD_LINEA_ATTIVITA_CLGE           := aDett.CD_LINEA_ATTIVITA;
         aDestE.ESERCIZIO_PDG_VARIAZIONE         := aDett.ESERCIZIO_PDG_VARIAZIONE;
         aDestE.PG_VARIAZIONE_PDG                := aDett.PG_VARIAZIONE_PDG;
         aDestE.DACR                             := aTSNow;
         aDestE.UTCR                             := aUser;
         aDestE.DUVA                             := aTSNow;
         aDestE.UTUV                             := aUser;
         aDestE.PG_VER_REC                       := 1;

         CNRCTB051.ins_PDG_MODULO_ENTRATE_GEST (aDestE);

        -- Aggiorno il dettaglio ORIGINALE con:
        -- il CdR/Linea della riga che ha creato
        -- la Categoria_dettaglio "Scaricato"

       Update PDG_MODULO_ENTRATE_GEST
       Set    CD_CDR_ASSEGNATARIO_CLGE = aCDRArea.cd_centro_responsabilita,
                CD_LINEA_ATTIVITA_CLGE   = aLACollegataE.cd_linea_attivita,
              CATEGORIA_DETTAGLIO      = CNRCTB050.DETTAGLIO_SCARICO -- SCR
       Where ESERCIZIO                = aDett.ESERCIZIO                and
             CD_CENTRO_RESPONSABILITA = aDett.CD_CENTRO_RESPONSABILITA and
             PG_PROGETTO              = aDett.PG_PROGETTO              and
             CD_NATURA                = aDett.CD_NATURA                and
             ID_CLASSIFICAZIONE       = aDett.ID_CLASSIFICAZIONE       and
             CD_CDS_AREA              = aDett.CD_CDS_AREA              and
             PG_DETTAGLIO             = aDett.PG_DETTAGLIO             and
             CD_CDR_ASSEGNATARIO      = aDett.CD_CDR_ASSEGNATARIO      and
             CD_LINEA_ATTIVITA        = aDett.CD_LINEA_ATTIVITA        and
             TI_APPARTENENZA          = aDett.TI_APPARTENENZA          and
             TI_GESTIONE              = aDett.TI_GESTIONE              and
             CD_ELEMENTO_VOCE         = aDett.CD_ELEMENTO_VOCE;

Elsif RIGHE_VAR_ENT.esercizio Is Not Null Then -- scarico delle variazioni al PdG

        -- Se il dettaglio proviene da una variazione PDG di un istituto sulla natura 5
        -- carico l'associazione tra la variazione PDG e il CDR dell'area

             Begin
            select  *
            into    aAssPdgVarCDRE
            from    ass_pdg_variazione_cdr
            where   ESERCIZIO = RIGHE_VAR_ENT.ESERCIZIO And
                        PG_VARIAZIONE_PDG = RIGHE_VAR_ENT.PG_VARIAZIONE_PDG And
                        CD_CENTRO_RESPONSABILITA = aCDRArea.cd_centro_responsabilita;
           Exception
             When NO_DATA_FOUND Then
               aAssPdgVarCDRE.ESERCIZIO                := RIGHE_VAR_ENT.ESERCIZIO;
               aAssPdgVarCDRE.PG_VARIAZIONE_PDG        := RIGHE_VAR_ENT.PG_VARIAZIONE_PDG;
               aAssPdgVarCDRE.CD_CENTRO_RESPONSABILITA := aCDRArea.cd_centro_responsabilita;
               aAssPdgVarCDRE.IM_ENTRATA               := 0;
               aAssPdgVarCDRE.IM_SPESA                 := 0;
                 aAssPdgVarCDRE.DACR                     := aTSNow;
                 aAssPdgVarCDRE.UTCR                     := aUser;
                 aAssPdgVarCDRE.DUVA                     := aTSNow;
                 aAssPdgVarCDRE.UTUV                     := aUser;
                 aAssPdgVarCDRE.PG_VER_REC               := 1;
                 CNRCTB050.ins_ASS_PDG_VARIAZIONE_CDR(aAssPdgVarCDRE);
             End;

         aRighe_var_ent := NULL;

   -- Inserisco la riga per L'Area (scaricata)

         aRighe_var_ent.ESERCIZIO                        := Righe_var_ent.ESERCIZIO;
         aRighe_var_ent.PG_VARIAZIONE_PDG                := Righe_var_ent.PG_VARIAZIONE_PDG;

         Select Nvl(Max(PG_RIGA), 0) + 1
         Into   aRighe_var_ent.PG_RIGA
         From   pdg_variazione_riga_gest
         Where  ESERCIZIO = Righe_var_ent.Esercizio And
                PG_VARIAZIONE_PDG = Righe_var_ent.PG_VARIAZIONE_PDG;

         aRighe_var_ent.CD_CDR_ASSEGNATARIO              := aCDRArea.cd_centro_responsabilita;
         aRighe_var_ent.CD_LINEA_ATTIVITA                := aLACollegataE.cd_linea_attivita;
         aRighe_var_ent.CD_CDS_AREA                      := Righe_var_ent.CD_CDS_AREA;
         aRighe_var_ent.TI_APPARTENENZA                  := Righe_var_ent.TI_APPARTENENZA;
         aRighe_var_ent.TI_GESTIONE                      := Righe_var_ent.TI_GESTIONE;
         aRighe_var_ent.CD_ELEMENTO_VOCE                 := Righe_var_ent.CD_ELEMENTO_VOCE;
         aRighe_var_ent.DT_REGISTRAZIONE                 := Righe_var_ent.DT_REGISTRAZIONE;
         aRighe_var_ent.DESCRIZIONE                      := Righe_var_ent.DESCRIZIONE;
         aRighe_var_ent.CATEGORIA_DETTAGLIO              := Righe_var_ent.CATEGORIA_DETTAGLIO;
         aRighe_var_ent.IM_ENTRATA                       := Righe_var_ent.IM_ENTRATA;
         aRighe_var_ent.IM_SPESE_GEST_DECENTRATA_INT     := 0;
         aRighe_var_ent.IM_SPESE_GEST_DECENTRATA_EST     := 0;
         aRighe_var_ent.IM_SPESE_GEST_ACCENTRATA_INT     := 0;
         aRighe_var_ent.IM_SPESE_GEST_ACCENTRATA_EST     := 0;
         aRighe_var_ent.PG_RIGA_CLGS                     := Righe_var_ent.PG_RIGA;
         aRighe_var_ent.CD_CDR_ASSEGNATARIO_CLGS         := Righe_var_ent.CD_CDR_ASSEGNATARIO;
         aRighe_var_ent.CD_LINEA_ATTIVITA_CLGS           := Righe_var_ent.CD_LINEA_ATTIVITA;
         aRighe_var_ent.DACR                             := aTSNow;
         aRighe_var_ent.UTCR                             := aUser;
         aRighe_var_ent.DUVA                             := aTSNow;
         aRighe_var_ent.UTUV                             := aUser;
         aRighe_var_ent.PG_VER_REC                       := 1;

         CNRCTB051.ins_PDG_VARIAZIONE_RIGA_GEST (aRighe_var_ent);

        -- Aggiorno il dettaglio ORIGINALE con:
        -- la RIGA generata (+ CDR/LINEA GENERATI);
        -- la Categoria_dettaglio "Scaricato"

       Update PDG_VARIAZIONE_RIGA_GEST
       Set    PG_RIGA_CLGS              = aRighe_var_ent.PG_RIGA,
                CD_CDR_ASSEGNATARIO_CLGS  = aRighe_var_ent.CD_CDR_ASSEGNATARIO,
                CD_LINEA_ATTIVITA_CLGS    = aRighe_var_ent.CD_LINEA_ATTIVITA,
              CATEGORIA_DETTAGLIO      = CNRCTB050.DETTAGLIO_SCARICO -- SCR
       Where  ESERCIZIO         = Righe_var_ent.ESERCIZIO And
                PG_VARIAZIONE_PDG = Righe_var_ent.PG_VARIAZIONE_PDG And
                PG_RIGA           = Righe_var_ent.PG_RIGA;

End If;

End;

 procedure ribaltaSuAreaPDGG_spe_Int(
  aEsercizio              number,
  aCdCentroResponsabilita varchar2,
  aCDR                    cdr%rowtype,
  aCDRArea                cdr%rowtype,
  aDett                   pdg_modulo_spese_gest%rowtype,
  RIGHE_VAR_SPE           PDG_VARIAZIONE_RIGA_GEST%rowtype,
  recParametriCNR         PARAMETRI_CNR%Rowtype,
  aTSNow                  date,
  aUser                   varchar2
 ) is
  aLA                   linea_attivita%rowtype;
  aLACollegataS         linea_attivita%rowtype;
  aDestS                pdg_modulo_spese_gest%rowtype;
  aRighe_var_spe        pdg_variazione_riga_gest%Rowtype;
  aAssPdgVarCDRS        ass_pdg_variazione_cdr%Rowtype;
  LIVELLO_COFOG       number:=0;
 begin
    -- Leggo la linea di attività del dettaglio del CDR Assegnatario che deve scaricare sull'Area

-- L'nvl c'è perchè vedendo se è pieno il record del gestionale o delle variazioni capisco di cosa si tratta,
-- se dello scarico del PdG o dei dettagli di variazione

  begin
        select *
        into  aLA
        from  linea_attivita
        Where CD_CENTRO_RESPONSABILITA = Nvl(aDett.CD_CDR_ASSEGNATARIO, RIGHE_VAR_SPE.CD_CDR_ASSEGNATARIO) And
              CD_LINEA_ATTIVITA        = Nvl(aDett.cd_linea_attivita, RIGHE_VAR_SPE.cd_linea_attivita);
      exception
        when NO_DATA_FOUND then
       IBMERR001.RAISE_ERR_GENERICO('Linea di attività di spesa del dettaglio del CdR che scarica su Area non trovata!');
        End;

  -- Ricerca o creazione della nuova linea di attività dell'AREA creata dalla Linea
  -- del CdR (finale) che sta scaricando

  begin
        -- verifico se per l'esercizio è necessario gestire il cofog
        select LIVELLO_PDG_COFOG into LIVELLO_COFOG
        from parametri_cnr
        where
          esercizio = aEsercizio;

        -- Seleziono la linea di spesa con gli stessi CdR/Linea di origine
        Begin
          select *
          into  aLACollegataS
          from  linea_attivita
          Where CD_CENTRO_RESPONSABILITA = aCDRArea.CD_CENTRO_RESPONSABILITA And
                CD_CDR_COLLEGATO =  aLA.cd_centro_responsabilita And
                CD_LA_COLLEGATO  =  aLA.CD_LINEA_ATTIVITA and
                --esercizio_inizio >= aEsercizio and
                esercizio_fine >= aEsercizio;
        Exception
          When too_many_rows Then
            For recLACollegataS in (select *
                                    from  linea_attivita
                                    Where CD_CENTRO_RESPONSABILITA = aCDRArea.CD_CENTRO_RESPONSABILITA And
                                          CD_CDR_COLLEGATO =  aLA.cd_centro_responsabilita And
                                          CD_LA_COLLEGATO  =  aLA.CD_LINEA_ATTIVITA and
                                          esercizio_fine >= aEsercizio
                                          Order By esercizio_inizio Desc) Loop
               aLACollegataS := recLACollegataS;
               Exit;
            End Loop;
        End;

        if (LIVELLO_COFOG!=0) then
          update linea_attivita set cd_cofog= aLa.cd_cofog
              where
                CD_CENTRO_RESPONSABILITA = aCDRArea.CD_CENTRO_RESPONSABILITA And
                CD_CDR_COLLEGATO =  aLA.cd_centro_responsabilita And
                CD_LA_COLLEGATO  =  aLA.CD_LINEA_ATTIVITA and
                --esercizio_inizio >= aEsercizio and
                esercizio_fine >= aEsercizio;
        end if;
       exception
        when NO_DATA_FOUND then

            aLACollegataS.CD_CENTRO_RESPONSABILITA      := aCDRArea.cd_centro_responsabilita;
            aLACollegataS.CD_LINEA_ATTIVITA             := CNRCTB010.getNextCodice(CNRCTB010.TI_TIPO_LA_PROPRIA, aLACollegataS);
            aLACollegataS.CD_TIPO_LINEA_ATTIVITA        := CNRCTB010.TI_LA_PROP;
            aLACollegataS.denominazione                 := 'Linea generata da '||Nvl(aDett.CD_CDR_ASSEGNATARIO, RIGHE_VAR_SPE.CD_CDR_ASSEGNATARIO)||' ('||aCDRArea.DS_CDR||') / '||
                                                           Nvl(aDett.CD_LINEA_ATTIVITA, RIGHE_VAR_SPE.cd_linea_attivita);
            aLACollegataS.CD_NATURA                     := aLA.cd_natura;
            aLACollegataS.CD_FUNZIONE                   := aLA.CD_FUNZIONE;
            If (Length(aLA.ds_linea_attivita ||'('||Nvl(aDett.CD_CDR_ASSEGNATARIO, RIGHE_VAR_SPE.CD_CDR_ASSEGNATARIO)||'/'||Nvl(aDett.cd_linea_attivita, RIGHE_VAR_SPE.cd_linea_attivita)||')') > 300) Then
              aLACollegataS.ds_linea_attivita           := aLA.ds_linea_attivita;
            Else
              aLACollegataS.ds_linea_attivita           := aLA.ds_linea_attivita ||'('||Nvl(aDett.CD_CDR_ASSEGNATARIO, RIGHE_VAR_SPE.CD_CDR_ASSEGNATARIO)||
                                                           '/'||Nvl(aDett.cd_linea_attivita, RIGHE_VAR_SPE.cd_linea_attivita)||')';
            End If;
            aLACollegataS.ESERCIZIO_INIZIO              := aEsercizio;
            aLACollegataS.ESERCIZIO_FINE                := CNRCTB008.ESERCIZIO_INFINITO;
            aLACollegataS.CD_INSIEME_LA                 := Null;
            aLACollegataS.TI_GESTIONE                   := CNRCTB010.TI_GESTIONE_SPESE;
            aLACollegataS.DACR                          := aTSNow;
            aLACollegataS.UTCR                          := aUser;
            aLACollegataS.DUVA                          := aTSNow;
            aLACollegataS.UTUV                          := aUser;
            aLACollegataS.PG_VER_REC                    := 1;
            aLACollegataS.CD_CDR_COLLEGATO              := Nvl(aDett.CD_CDR_ASSEGNATARIO, RIGHE_VAR_SPE.CD_CDR_ASSEGNATARIO);
            aLACollegataS.CD_LA_COLLEGATO               := Nvl(aDett.cd_linea_attivita, RIGHE_VAR_SPE.cd_linea_attivita);
            aLACollegataS.PG_PROGETTO                   := Nvl(aDett.pg_progetto, aLa.pg_progetto);
            aLACollegataS.CD_RESPONSABILE_TERZO         := aLA.CD_RESPONSABILE_TERZO;
            aLACollegataS.FL_LIMITE_ASS_OBBLIG          := 'Y'; -- DEFAULT NON SFONDABILE
            aLACollegataS.CD_COFOG                      := aLA.CD_COFOG;
            aLACollegataS.CD_MISSIONE                   := aLA.cd_missione;
            If Nvl(aDett.pg_progetto, aLa.pg_progetto) = aLA.pg_progetto Then
               aLACollegataS.CD_PROGRAMMA               := aLA.cd_programma;
            End If;

            CNRCTB010.ins_LINEA_ATTIVITA(aLACollegataS);

	    INS_ASS_GAE_ESERCIZIO(recParametriCnr, aLACollegataS, aTSNow, aUser);

            select *
            into  aLACollegataS
            from  linea_attivita
            Where CD_CENTRO_RESPONSABILITA = aCDRArea.cd_centro_responsabilita And
                  CD_LINEA_ATTIVITA        = aLACollegataS.CD_LINEA_ATTIVITA;
     end;

If aDett.esercizio Is Not Null Then -- scarico del Piano di Gestione gestionale, non per variazione

         aDestS := NULL;

     -- Inserisco la riga per L'Area (scaricata)

         aDestS.ESERCIZIO                     := aDett.esercizio;
         aDestS.CD_CENTRO_RESPONSABILITA      := aDett.CD_CENTRO_RESPONSABILITA;
         aDestS.PG_PROGETTO                   := aDett.PG_PROGETTO;
         aDestS.ID_CLASSIFICAZIONE            := aDett.ID_CLASSIFICAZIONE;
         aDestS.CD_CDS_AREA                   := aDett.CD_CDS_AREA;
         aDestS.PG_DETTAGLIO                  := aDett.PG_DETTAGLIO;
         aDestS.CD_CDR_ASSEGNATARIO           := aCDRArea.cd_centro_responsabilita;
         aDestS.CD_LINEA_ATTIVITA             := aLACollegataS.cd_linea_attivita;
         aDestS.TI_APPARTENENZA               := aDett.TI_APPARTENENZA;
         aDestS.TI_GESTIONE                   := aDett.TI_GESTIONE;
         aDestS.CD_ELEMENTO_VOCE              := aDett.CD_ELEMENTO_VOCE;
         aDestS.DT_REGISTRAZIONE              := aDett.DT_REGISTRAZIONE;
         aDestS.DESCRIZIONE                   := aDett.DESCRIZIONE;
         aDestS.ORIGINE                       := aDett.ORIGINE;              -- cioè DIR
         aDestS.CATEGORIA_DETTAGLIO           := aDett.CATEGORIA_DETTAGLIO;  -- cioè PRE
         aDestS.FL_SOLA_LETTURA               := 'Y';
         aDestS.IM_SPESE_GEST_DECENTRATA_INT  := aDett.IM_SPESE_GEST_DECENTRATA_INT;
         aDestS.IM_SPESE_GEST_DECENTRATA_EST  := aDett.IM_SPESE_GEST_DECENTRATA_EST;
         aDestS.IM_SPESE_GEST_ACCENTRATA_INT  := aDett.IM_SPESE_GEST_ACCENTRATA_INT;
         aDestS.IM_SPESE_GEST_ACCENTRATA_EST  := aDett.IM_SPESE_GEST_ACCENTRATA_EST;
         aDestS.IM_PAGAMENTI                  := aDett.IM_PAGAMENTI;
         aDestS.CD_CDR_ASSEGNATARIO_CLGS      := aDett.CD_CDR_ASSEGNATARIO;
         aDestS.CD_LINEA_ATTIVITA_CLGS        := aDett.CD_LINEA_ATTIVITA;
         aDestS.PG_PROGETTO_CLGS              := aDett.PG_PROGETTO;
         aDestS.ESERCIZIO_PDG_VARIAZIONE      := aDett.ESERCIZIO_PDG_VARIAZIONE;
         aDestS.PG_VARIAZIONE_PDG             := aDett.PG_VARIAZIONE_PDG;
         aDestS.UTCR                          := aUser;
         aDestS.DACR                          := aTSNow;
         aDestS.UTUV                          := aUser;
         aDestS.DUVA                          := aTSNow;
         aDestS.PG_VER_REC                    := 1;

         CNRCTB051.ins_PDG_MODULO_SPESE_GEST (aDestS);

        -- Aggiorno il dettaglio ORIGINALE con:
        -- il CdR/Linea della riga che ha creato
        -- la Categoria_dettaglio "Scaricato"

       update PDG_MODULO_SPESE_GEST
       Set    CD_CDR_ASSEGNATARIO_CLGS = aCDRArea.cd_centro_responsabilita,
                CD_LINEA_ATTIVITA_CLGS   = aLACollegataS.cd_linea_attivita,
                PG_PROGETTO_CLGS         = aDett.PG_PROGETTO,
              CATEGORIA_DETTAGLIO      = CNRCTB050.DETTAGLIO_SCARICO -- SCR
       Where  ESERCIZIO                = aDett.ESERCIZIO                and
                CD_CENTRO_RESPONSABILITA = aDett.CD_CENTRO_RESPONSABILITA and
                PG_PROGETTO              = aDett.PG_PROGETTO              and
                ID_CLASSIFICAZIONE       = aDett.ID_CLASSIFICAZIONE       and
                CD_CDS_AREA              = aDett.CD_CDS_AREA              and
                PG_DETTAGLIO             = aDett.PG_DETTAGLIO             and
                CD_CDR_ASSEGNATARIO      = aDett.CD_CDR_ASSEGNATARIO      and
                CD_LINEA_ATTIVITA        = aDett.CD_LINEA_ATTIVITA        and
                TI_APPARTENENZA          = aDett.TI_APPARTENENZA          and
                TI_GESTIONE              = aDett.TI_GESTIONE              and
                CD_ELEMENTO_VOCE         = aDett.CD_ELEMENTO_VOCE;

Elsif RIGHE_VAR_SPE.esercizio Is Not Null Then -- scarico delle variazioni al PDG

   -- Se il dettaglio proviene da una variazione PDG di un istituto carico l'associazione tra la variazione PDG e il CDR dell'area

             Begin
            select  *
            into    aAssPdgVarCDRS
            from    ass_pdg_variazione_cdr
            where   ESERCIZIO = RIGHE_VAR_SPE.ESERCIZIO And
                        PG_VARIAZIONE_PDG = RIGHE_VAR_SPE.PG_VARIAZIONE_PDG And
                        CD_CENTRO_RESPONSABILITA = aCDRArea.cd_centro_responsabilita;
           Exception
             When NO_DATA_FOUND Then
               aAssPdgVarCDRS.ESERCIZIO                := RIGHE_VAR_SPE.ESERCIZIO;
               aAssPdgVarCDRS.PG_VARIAZIONE_PDG        := RIGHE_VAR_SPE.PG_VARIAZIONE_PDG;
               aAssPdgVarCDRS.CD_CENTRO_RESPONSABILITA := aCDRArea.cd_centro_responsabilita;
               aAssPdgVarCDRS.IM_ENTRATA               := 0;
               aAssPdgVarCDRS.IM_SPESA                 := 0;
                 aAssPdgVarCDRS.DACR                     := aTSNow;
                 aAssPdgVarCDRS.UTCR                     := aUser;
                 aAssPdgVarCDRS.DUVA                     := aTSNow;
                 aAssPdgVarCDRS.UTUV                     := aUser;
                 aAssPdgVarCDRS.PG_VER_REC               := 1;
                 CNRCTB050.ins_ASS_PDG_VARIAZIONE_CDR(aAssPdgVarCDRS);
             End;

         aRighe_var_spe := NULL;

   -- Inserisco la riga per L'Area (scaricata)

         aRighe_var_spe.ESERCIZIO                        := Righe_var_spe.ESERCIZIO;
         aRighe_var_spe.PG_VARIAZIONE_PDG                := Righe_var_spe.PG_VARIAZIONE_PDG;

         Select Nvl(Max(PG_RIGA), 0) + 1
         Into   aRighe_var_spe.PG_RIGA
         From   pdg_variazione_riga_gest
         Where  ESERCIZIO = Righe_var_spe.Esercizio And
                PG_VARIAZIONE_PDG = Righe_var_spe.PG_VARIAZIONE_PDG;

         aRighe_var_spe.CD_CDR_ASSEGNATARIO              := aCDRArea.cd_centro_responsabilita;
         aRighe_var_spe.CD_LINEA_ATTIVITA                := aLACollegataS.cd_linea_attivita;
         aRighe_var_spe.CD_CDS_AREA                      := Righe_var_spe.CD_CDS_AREA;
         aRighe_var_spe.TI_APPARTENENZA                  := Righe_var_spe.TI_APPARTENENZA;
         aRighe_var_spe.TI_GESTIONE                      := Righe_var_spe.TI_GESTIONE;
         aRighe_var_spe.CD_ELEMENTO_VOCE                 := Righe_var_spe.CD_ELEMENTO_VOCE;
         aRighe_var_spe.DT_REGISTRAZIONE                 := Righe_var_spe.DT_REGISTRAZIONE;
         aRighe_var_spe.DESCRIZIONE                      := Righe_var_spe.DESCRIZIONE;
         aRighe_var_spe.CATEGORIA_DETTAGLIO              := Righe_var_spe.CATEGORIA_DETTAGLIO;
         aRighe_var_spe.IM_ENTRATA                       := 0;
         aRighe_var_spe.IM_SPESE_GEST_DECENTRATA_INT     := Righe_var_spe.IM_SPESE_GEST_DECENTRATA_INT;
         aRighe_var_spe.IM_SPESE_GEST_DECENTRATA_EST     := Righe_var_spe.IM_SPESE_GEST_DECENTRATA_EST;
         aRighe_var_spe.IM_SPESE_GEST_ACCENTRATA_INT     := Righe_var_spe.IM_SPESE_GEST_ACCENTRATA_INT;
         aRighe_var_spe.IM_SPESE_GEST_ACCENTRATA_EST     := Righe_var_spe.IM_SPESE_GEST_ACCENTRATA_EST;
         aRighe_var_spe.PG_RIGA_CLGS                     := Righe_var_spe.PG_RIGA;
         aRighe_var_spe.CD_CDR_ASSEGNATARIO_CLGS         := Righe_var_spe.CD_CDR_ASSEGNATARIO;
         aRighe_var_spe.CD_LINEA_ATTIVITA_CLGS           := Righe_var_spe.CD_LINEA_ATTIVITA;
         aRighe_var_spe.DACR                             := aTSNow;
         aRighe_var_spe.UTCR                             := aUser;
         aRighe_var_spe.DUVA                             := aTSNow;
         aRighe_var_spe.UTUV                             := aUser;
         aRighe_var_spe.PG_VER_REC                       := 1;

         CNRCTB051.ins_PDG_VARIAZIONE_RIGA_GEST (aRighe_var_spe);

        -- Aggiorno il dettaglio ORIGINALE con:
        -- la RIGA generata (+ CDR/LINEA GENERATI);
        -- la Categoria_dettaglio "Scaricato"

       Update PDG_VARIAZIONE_RIGA_GEST
       Set    PG_RIGA_CLGS              = aRighe_var_spe.PG_RIGA,
                CD_CDR_ASSEGNATARIO_CLGS  = aRighe_var_spe.CD_CDR_ASSEGNATARIO,
                CD_LINEA_ATTIVITA_CLGS    = aRighe_var_spe.CD_LINEA_ATTIVITA,
              CATEGORIA_DETTAGLIO      = CNRCTB050.DETTAGLIO_SCARICO -- SCR
       Where  ESERCIZIO         = Righe_var_spe.ESERCIZIO And
                PG_VARIAZIONE_PDG = Righe_var_spe.PG_VARIAZIONE_PDG And
                PG_RIGA           = Righe_var_spe.PG_RIGA;

End If;

End;

------------------------------------------------------------------------------------------
---------------------------- RIBALTAMENTO SU ACCENTRATORE --------------------------------
------------------------------------------------------------------------------------------

Procedure ribaltaSuAccentratPDGG_spe_Int(
  aEsercizio              number,
  aCdCentroResponsabilita varchar2,
  aCDR                    cdr%rowtype,
  aCDRArea                cdr%rowtype,
  aDett                   PDG_MODULO_SPESE_GEST%Rowtype,
  RIGHE_VAR_ACCENTRATE    PDG_VARIAZIONE_RIGA_GEST%Rowtype,
  recParametriCnr         PARAMETRI_CNR%rowtype,
  aTSNow                  date,
  aUser                   varchar2
 ) is
  aLA_origine           linea_attivita%rowtype;
  aASS_LA_CLASS         ass_la_class_voci%rowtype;
  ACDRLINEA_DETT        LINEA_ATTIVITA.CD_CENTRO_RESPONSABILITA%Type;
  ALINEA_DETT           LINEA_ATTIVITA.CD_LINEA_aTTIVITA%Type;
  aCV                   classificazione_voci%Rowtype;
  aLACollegataS         linea_attivita%rowtype;
  aAssLAEsercizioS      ass_linea_attivita_esercizio%rowtype;
  aDestS                pdg_modulo_spese_gest%rowtype;
  aAssPdgVarCDRE        ass_pdg_variazione_cdr%Rowtype;
  aAssPdgVarCDRS        ass_pdg_variazione_cdr%Rowtype;
  aDettaglioAttuale     pdg_modulo_spese_gest%rowtype;
  aDettaglioNuovo       pdg_modulo_spese_gest%rowtype;
  aRighe_var_spe        PDG_VARIAZIONE_RIGA_GEST%rowtype;
  aTestata_mod_sac      pdg_modulo%rowtype;
  aCDRPersonale         cdr%rowtype;
  aLASAUOP              linea_attivita%rowtype;
  ID_VARIAZIONE         NUMBER;
  LIVELLO_COFOG         NUMBER:=0;
  cofogFin              Varchar2(10);
begin
  If recParametriCNR.esercizio is null Then
     IBMERR001.RAISE_ERR_GENERICO('Parametri CNR per l''esercizio '||aEsercizio||' inesistenti!');
  End If;

  LIVELLO_COFOG := recParametriCNR.LIVELLO_PDG_COFOG;

-- RECUPERO LA CLASSIFICAZIONE O DAL DETTAGLIO DEL PDGG O DALLA VOCE (PER LE VARIAZIONI)

    If adett.id_classificazione Is Not Null Then -- PIANO DI GESTIONE, NON VARIAZIONI
      Select *
      Into   aCV
      From   classificazione_voci
      Where  id_classificazione = adett.id_classificazione;
    Elsif RIGHE_VAR_ACCENTRATE.CD_ELEMENTO_VOCE Is Not Null Then -- VARIAZIONI
      Select ID_CLASSIFICAZIONE
      Into   ID_VARIAZIONE
      From   ELEMENTO_VOCE
      Where  ESERCIZIO        = RIGHE_VAR_ACCENTRATE.ESERCIZIO And
             TI_APPARTENENZA  = RIGHE_VAR_ACCENTRATE.TI_APPARTENENZA And
             TI_GESTIONE      = RIGHE_VAR_ACCENTRATE.TI_GESTIONE And
             CD_ELEMENTO_VOCE = RIGHE_VAR_ACCENTRATE.CD_ELEMENTO_VOCE;
      Select *
      Into   aCV
      From   classificazione_voci
      Where  id_classificazione = ID_VARIAZIONE;
    End If;

    -- Leggo la linea di attività creata dal CdR Assegnatario (che scarica su Accentratore)
    -- per l'ID_CLASSIFICAZIONE,  se esiste. Altrimenti la inserisce
    Begin
        If (LIVELLO_COFOG!=0) then
            select *
            into  aLA_origine
            from  linea_attivita
            Where CD_centro_responsabilita = Nvl(aDett.CD_CDR_ASSEGNATARIO, RIGHE_VAR_ACCENTRATE.CD_CDR_ASSEGNATARIO) And
                    cd_linea_attivita      = Nvl(aDett.cd_linea_attivita, RIGHE_VAR_ACCENTRATE.cd_linea_attivita) and
                    cd_cofog is not null;
        else
            select *
            into  aLA_origine
            from  linea_attivita
            Where CD_centro_responsabilita = Nvl(aDett.CD_CDR_ASSEGNATARIO, RIGHE_VAR_ACCENTRATE.CD_CDR_ASSEGNATARIO) And
                    cd_linea_attivita        = Nvl(aDett.cd_linea_attivita, RIGHE_VAR_ACCENTRATE.cd_linea_attivita);
        end if;
    Exception
        when NO_DATA_FOUND then
         IBMERR001.RAISE_ERR_GENERICO('Linea di attività del dettaglio del PdG gestionale ('||
                                    Nvl(aDett.cd_linea_attivita, RIGHE_VAR_ACCENTRATE.cd_linea_attivita)||') non trovata !');
    End;

    Declare
      progettoSAC varchar2(100) := CNRCTB015.getVal01PerChiave(aEsercizio, 'MODULO_SPECIALE', 'MODULO_SAC');
      aLaTipoNatura  natura.tipo%Type;
    Begin
        If progettoSAC is null Then
         IBMERR001.RAISE_ERR_GENERICO('Progetto di default per la SAC non trovato!');
        End If;

        -- Leggo il CDR del personale e la sua linea SAUOP

        aCDRPersonale := CNRCTB020.GETCDRPERSONALE(aEsercizio);

        If nvl(recParametriCnr.fl_nuovo_pdg,'N') = 'Y' Then
          If aLa_origine.cd_programma is null or aLa_origine.cd_missione is null Then
           IBMERR001.RAISE_ERR_GENERICO('Linea di attività del dettaglio del PdG gestionale ('||
                                      Nvl(aDett.cd_linea_attivita, RIGHE_VAR_ACCENTRATE.cd_linea_attivita)||') senza indicazione del programma o della missione !');
          End If;

          Begin
            Select tipo Into aLaTipoNatura
            From Natura
            Where CD_NATURA = aLa_origine.cd_natura;
          Exception
            When No_Data_Found Then
              IBMERR001.RAISE_ERR_GENERICO('Errore nella individuazione del tipo natura indicato sulla Gae di origine! Operazione non possibile!');
          End;

          Begin
            Select Distinct CD_CENTRO_RESPONSABILITA, CD_LINEA_ATTIVITA
            Into  ACDRLINEA_DETT, ALINEA_DETT
            From  V_LINEA_ATTIVITA_VALIDA, NATURA
            Where CD_CENTRO_RESPONSABILITA = aCV.CDR_ACCENTRATORE
            And   CD_TIPO_LINEA_ATTIVITA = CNRCTB010.TI_LA_PROP
            And   V_LINEA_ATTIVITA_VALIDA.CD_NATURA = NATURA.CD_NATURA
            And   NATURA.TIPO = aLaTipoNatura
            And   TI_GESTIONE = CNRCTB010.TI_GESTIONE_SPESE
            and    V_LINEA_ATTIVITA_VALIDA.esercizio = aEsercizio
            And   (aCV.CDR_ACCENTRATORE = aCDRPersonale.CD_CENTRO_RESPONSABILITA Or
            			(aCV.CDR_ACCENTRATORE != aCDRPersonale.CD_CENTRO_RESPONSABILITA and
                   (PG_PROGETTO = progettoSAC And
                    ((LIVELLO_COFOG=0 or cd_cofog=aLa_origine.cd_cofog)))
                  ))
            And   CD_PROGRAMMA = aLa_origine.cd_programma
            And   CD_MISSIONE = aLa_origine.cd_missione
            And   rownum < 2;
            -- Condizione inserita per evitare Too_Many_Rows.
            -- E' stato chiesto di prendere sempre una anche se ne esistono tante e di non far scattare l'errore
          Exception
            When No_Data_Found Then
              If aCV.CDR_ACCENTRATORE = aCDRPersonale.CD_CENTRO_RESPONSABILITA Then
                IBMERR001.RAISE_ERR_GENERICO('Linea di attività per il CDR accentratore '||aCV.CDR_ACCENTRATORE||' con Natura '||aLaTipoNatura||
                                             ', Programma '||aLa_origine.cd_programma||' e Missione '||aLa_origine.cd_missione||' non presente! Operazione non possibile!');
              Else
                Raise No_Data_Found;
              End If;
            When Too_Many_Rows Then
              IBMERR001.RAISE_ERR_GENERICO('Esiste più di una linea di attività per il CDR accentratore '||aCV.CDR_ACCENTRATORE||' con Natura '||aLaTipoNatura||
                                           ', Programma '||aLa_origine.cd_programma||' e Missione '||aLa_origine.cd_missione||'! Operazione non possibile!');
          End;
        ElsIf aCV.CDR_ACCENTRATORE = aCDRPersonale.CD_CENTRO_RESPONSABILITA Then
          aLASAUOP := CNRCTB010.getLASAUOP(aEsercizio, aCDRPersonale.cd_centro_responsabilita);
          ACDRLINEA_DETT := aLASAUOP.CD_CENTRO_RESPONSABILITA;
          ALINEA_DETT    := aLASAUOP.CD_LINEA_ATTIVITA;
        Else
          Select CD_CENTRO_RESPONSABILITA, CD_LINEA_ATTIVITA
          Into  ACDRLINEA_DETT, ALINEA_DETT
          From  ASS_LA_CLASS_VOCI
          Where CD_CDR_ORIGINE    = Nvl(aDett.CD_CDR_ASSEGNATARIO, RIGHE_VAR_ACCENTRATE.CD_CDR_ASSEGNATARIO) And
                  ID_CLASS_ORIGINE  = Nvl(aDett.ID_CLASSIFICAZIONE, aCV.ID_CLASSIFICAZIONE)  And
                  CD_NATURA_ORIGINE = aLA_origine.CD_NATURA and
                  ((LIVELLO_COFOG!=0 and cd_cofog=aLa_origine.cd_cofog) or LIVELLO_COFOG=0 );
        End If;

           select cd_cofog into cofogFin from linea_attivita
             where
              CD_CENTRO_RESPONSABILITA = ACDRLINEA_DETT and
              cd_linea_attivita = ALINEA_DETT;
          if (LIVELLO_COFOG!=0 and cofogFin is null) then
              update linea_attivita set cd_cofog= aLa_origine.cd_cofog
              where
              CD_CENTRO_RESPONSABILITA = ACDRLINEA_DETT and
              cd_linea_attivita = ALINEA_DETT;

           end if;
      Exception
        when NO_DATA_FOUND then

            aLACollegataS.CD_CENTRO_RESPONSABILITA      := aCV.CDR_ACCENTRATORE;
            aLACollegataS.CD_LINEA_ATTIVITA             := CNRCTB010.getNextCodice(CNRCTB010.TI_TIPO_LA_PROPRIA, aLACollegataS);
            aLACollegataS.CD_TIPO_LINEA_ATTIVITA        := CNRCTB010.TI_LA_PROP;
            aLACollegataS.denominazione                 := Null;--'Linea generata da '||aDett.CD_CDR_ASSEGNATARIO||' ('||aCDRArea.DS_CDR||') per la Voce '||aDett.ds_classificazione;

            If aCV.CDR_ACCENTRATORE = aCDRPersonale.CD_CENTRO_RESPONSABILITA Then
              aLACollegataS.CD_NATURA                     := '1';
            Else
              aLACollegataS.CD_NATURA                     := aLa_origine.cd_natura;
            End if;

            aLACollegataS.CD_FUNZIONE                   := aLa_origine.cd_funzione;
            aLACollegataS.ds_linea_attivita             := 'Linea generata da '||Nvl(aDett.CD_CDR_ASSEGNATARIO, RIGHE_VAR_ACCENTRATE.CD_CDR_ASSEGNATARIO)||
                                                           ' per la Voce '||aCV.ds_classificazione;
            aLACollegataS.ESERCIZIO_INIZIO              := aEsercizio;
            aLACollegataS.ESERCIZIO_FINE                := CNRCTB008.ESERCIZIO_INFINITO;
            aLACollegataS.CD_INSIEME_LA                 := Null;
            aLACollegataS.TI_GESTIONE                   := CNRCTB010.TI_GESTIONE_SPESE;
            aLACollegataS.DACR                          := aTSNow;
            aLACollegataS.UTCR                          := aUser;
            aLACollegataS.DUVA                          := aTSNow;
            aLACollegataS.UTUV                          := aUser;
            aLACollegataS.PG_VER_REC                    := 1;
            aLACollegataS.CD_CDR_COLLEGATO              := Null;
            aLACollegataS.CD_LA_COLLEGATO               := Null;
            aLACollegataS.PG_PROGETTO                   := progettoSAC;
            aLACollegataS.CD_RESPONSABILE_TERZO         := aLa_origine.CD_RESPONSABILE_TERZO;
            aLACollegataS.FL_LIMITE_ASS_OBBLIG          := 'Y'; -- DEFAULT NON SFONDABILE
            aLACollegataS.CD_COFOG                      := aLa_origine.cd_cofog;
            aLACollegataS.CD_PROGRAMMA                  := aLa_origine.cd_programma;
            aLACollegataS.CD_MISSIONE                   := aLa_origine.cd_missione;
            CNRCTB010.ins_LINEA_ATTIVITA(aLACollegataS);

	    INS_ASS_GAE_ESERCIZIO(recParametriCnr, aLACollegataS, aTSNow, aUser);

            If nvl(recParametriCnr.fl_nuovo_pdg,'N') = 'N' Then
              aASS_LA_CLASS.CD_CENTRO_RESPONSABILITA := aLACollegataS.CD_CENTRO_RESPONSABILITA;
              aASS_LA_CLASS.CD_LINEA_ATTIVITA        := aLACollegataS.CD_LINEA_ATTIVITA;
              aASS_LA_CLASS.CD_CDR_ORIGINE           := Nvl(aDett.CD_CDR_ASSEGNATARIO, RIGHE_VAR_ACCENTRATE.CD_CDR_ASSEGNATARIO);
              aASS_LA_CLASS.CD_NATURA_ORIGINE        := aLA_origine.CD_NATURA;
              aASS_LA_CLASS.ID_CLASS_ORIGINE         := Nvl(aDett.ID_CLASSIFICAZIONE, aCV.ID_CLASSIFICAZIONE);
              aASS_LA_CLASS.DS_ASSOCIAZIONE          := 'Associazione automatica per scarico su accentratore';
              aASS_LA_CLASS.UTCR                     := aUser;
              aASS_LA_CLASS.DACR                     := aTSNow;
              aASS_LA_CLASS.UTUV                     := aUser;
              aASS_LA_CLASS.DUVA                     := aTSNow;
              aASS_LA_CLASS.PG_VER_REC               := 1;
              aASS_LA_CLASS.CD_COFOG                 := aLa_origine.cd_cofog;
              CNRCTB010.ins_ASS_LA_CLASS_VOCI(aASS_LA_CLASS);
            End If;

--DBMS_OUTPUT.PUT_LINE ('INSERISCE QUESTA '||aLACollegataS.CD_CENTRO_RESPONSABILITA||' '||aLACollegataS.CD_LINEA_ATTIVITA);

-- MI SELEZIONO QUELLA INSERITA

            Select CD_CENTRO_RESPONSABILITA, CD_LINEA_ATTIVITA
            Into  ACDRLINEA_DETT, ALINEA_DETT
            From  linea_attivita
            Where CD_CENTRO_RESPONSABILITA = aLACollegataS.CD_CENTRO_RESPONSABILITA And
                  CD_LINEA_ATTIVITA        = aLACollegataS.CD_LINEA_ATTIVITA;

        End;

-- vedo se esiste già la riga dell'accentratore

If aDett.ESERCIZIO Is Not Null Then -- PIANO DI GESTIONE GESTIONALE, NON VARIAZIONE

        Begin
          Select *
          Into  aDettaglioAttuale
          From  PDG_MODULO_SPESE_GEST
          Where ESERCIZIO                = aEsercizio And
                CD_CENTRO_RESPONSABILITA = aDett.CD_CENTRO_RESPONSABILITA And
                PG_PROGETTO              = aDett.pg_progetto And
                ID_CLASSIFICAZIONE       = aCV.ID_CLASSIFICAZIONE And
                CD_CDS_AREA              = aDett.CD_CDS_AREA And
                PG_DETTAGLIO             = aDett.PG_DETTAGLIO And
                CD_CDR_ASSEGNATARIO      = aCV.CDR_ACCENTRATORE And
                CD_LINEA_ATTIVITA        = ALINEA_DETT And
                TI_APPARTENENZA          = aDett.TI_APPARTENENZA And
                TI_GESTIONE              = aDett.TI_GESTIONE And
                CD_ELEMENTO_VOCE         = aDett.CD_ELEMENTO_VOCE
          For Update NOWAIT;

----DBMS_OUTPUT.PUT_LINE ('VALORE ALA CDR '||Nvl(aLA.CD_CENTRO_RESPONSABILITA, 'NULLO')||' LA '|| Nvl(aLa.CD_LINEA_ATTIVITA, 'NULLA'));
-- se già esiste la incremento

          Update PDG_MODULO_SPESE_GEST
          Set    IM_SPESE_GEST_DECENTRATA_INT = nvl(aDettaglioAttuale.IM_SPESE_GEST_DECENTRATA_INT, 0) + Nvl(aDett.IM_SPESE_GEST_DECENTRATA_INT, 0),
                 IM_SPESE_GEST_DECENTRATA_EST = nvl(aDettaglioAttuale.IM_SPESE_GEST_DECENTRATA_EST, 0) + nvl(aDett.IM_SPESE_GEST_DECENTRATA_EST, 0),
                 IM_SPESE_GEST_ACCENTRATA_INT = nvl(aDettaglioAttuale.IM_SPESE_GEST_ACCENTRATA_INT, 0) + nvl(aDett.IM_SPESE_GEST_ACCENTRATA_INT, 0),
                 IM_SPESE_GEST_ACCENTRATA_EST = nvl(aDettaglioAttuale.IM_SPESE_GEST_ACCENTRATA_EST, 0) + nvl(aDett.IM_SPESE_GEST_ACCENTRATA_EST, 0),
                 IM_PAGAMENTI                 = nvl(aDettaglioAttuale.IM_PAGAMENTI,0) + nvl(aDett.IM_PAGAMENTI, 0)
          Where ESERCIZIO                = aEsercizio And
                CD_CENTRO_RESPONSABILITA = aDett.CD_CENTRO_RESPONSABILITA And
                PG_PROGETTO              = aDett.pg_progetto And
                ID_CLASSIFICAZIONE       = aCV.ID_CLASSIFICAZIONE And
                CD_CDS_AREA              = aDett.CD_CDS_AREA And
                PG_DETTAGLIO             = aDett.PG_DETTAGLIO And
                CD_CDR_ASSEGNATARIO      = aCV.CDR_ACCENTRATORE And
                CD_LINEA_ATTIVITA        = ALINEA_DETT And
                TI_APPARTENENZA          = aDett.TI_APPARTENENZA And
                TI_GESTIONE              = aDett.TI_GESTIONE And
                CD_ELEMENTO_VOCE         = aDett.CD_ELEMENTO_VOCE;
         Exception
           When No_Data_Found Then
                -- se non esiste la creo e Inserisco la riga per L'Accentratore
             Begin
                aDettaglioNuovo.ESERCIZIO                     := aDett.esercizio;
                aDettaglioNuovo.CD_CENTRO_RESPONSABILITA      := aDett.CD_CENTRO_RESPONSABILITA;
                aDettaglioNuovo.PG_PROGETTO                   := aDett.pg_progetto;
                aDettaglioNuovo.ID_CLASSIFICAZIONE            := aDett.ID_CLASSIFICAZIONE;
                aDettaglioNuovo.CD_CDS_AREA                   := aDett.CD_CDS_AREA;
                aDettaglioNuovo.CD_CDR_ASSEGNATARIO           := ACDRLINEA_DETT; -- ACCENTRATORE
                aDettaglioNuovo.CD_LINEA_ATTIVITA             := ALINEA_DETT;
                aDettaglioNuovo.TI_APPARTENENZA               := aDett.TI_APPARTENENZA;
                aDettaglioNuovo.TI_GESTIONE                   := aDett.TI_GESTIONE;
                aDettaglioNuovo.CD_ELEMENTO_VOCE              := aDett.CD_ELEMENTO_VOCE;
                aDettaglioNuovo.DT_REGISTRAZIONE              := aDett.DT_REGISTRAZIONE;
                aDettaglioNuovo.DESCRIZIONE                   := aDett.DESCRIZIONE;
                aDettaglioNuovo.ORIGINE                       := aDett.ORIGINE;              -- cioè DIR
                aDettaglioNuovo.CATEGORIA_DETTAGLIO           := aDett.CATEGORIA_DETTAGLIO;  -- cioè PRE
                aDettaglioNuovo.FL_SOLA_LETTURA               := 'Y';
                aDettaglioNuovo.IM_SPESE_GEST_DECENTRATA_INT  := 0;
                aDettaglioNuovo.IM_SPESE_GEST_DECENTRATA_EST  := 0;
                aDettaglioNuovo.IM_SPESE_GEST_ACCENTRATA_INT  := aDett.IM_SPESE_GEST_ACCENTRATA_INT;
                aDettaglioNuovo.IM_SPESE_GEST_ACCENTRATA_EST  := aDett.IM_SPESE_GEST_ACCENTRATA_EST;
                aDettaglioNuovo.IM_PAGAMENTI                  := 0;
                aDettaglioNuovo.CD_CDR_ASSEGNATARIO_CLGS      := aDett.CD_CDR_ASSEGNATARIO;
                aDettaglioNuovo.CD_LINEA_ATTIVITA_CLGS        := aDett.CD_LINEA_ATTIVITA;
                aDettaglioNuovo.PG_PROGETTO_CLGS              := aDett.PG_PROGETTO;
                aDettaglioNuovo.ESERCIZIO_PDG_VARIAZIONE      := aDett.ESERCIZIO_PDG_VARIAZIONE;
                aDettaglioNuovo.PG_VARIAZIONE_PDG             := aDett.PG_VARIAZIONE_PDG;
                aDettaglioNuovo.UTCR                          := aUser;
                aDettaglioNuovo.DACR                          := aTSNow;
                aDettaglioNuovo.UTUV                          := aUser;
                aDettaglioNuovo.DUVA                          := aTSNow;
                aDettaglioNuovo.PG_VER_REC                    := 1;
                aDettaglioNuovo.PG_DETTAGLIO                  := aDett.PG_DETTAGLIO;
                CNRCTB051.ins_PDG_MODULO_SPESE_GEST (aDettaglioNuovo);

             Exception when dup_val_on_index then
                    null;
             End;
        End;

Elsif RIGHE_VAR_ACCENTRATE.ESERCIZIO Is Not Null Then -- VARIAZIONE, NON PDG GESTIONALE

        -- Se il dettaglio proviene da una variazione PDG di un istituto carico l'associazione tra la variazione PDG e il CDR dell'area

    Begin
      select  *
      into    aAssPdgVarCDRS
      from    ass_pdg_variazione_cdr
      where   ESERCIZIO = RIGHE_VAR_ACCENTRATE.ESERCIZIO And
                PG_VARIAZIONE_PDG = RIGHE_VAR_ACCENTRATE.PG_VARIAZIONE_PDG And
                CD_CENTRO_RESPONSABILITA = ACDRLINEA_DETT;
    Exception
       When NO_DATA_FOUND Then
         aAssPdgVarCDRS.ESERCIZIO                := RIGHE_VAR_ACCENTRATE.ESERCIZIO;
         aAssPdgVarCDRS.PG_VARIAZIONE_PDG        := RIGHE_VAR_ACCENTRATE.PG_VARIAZIONE_PDG;
         aAssPdgVarCDRS.CD_CENTRO_RESPONSABILITA := ACDRLINEA_DETT;
         aAssPdgVarCDRS.IM_ENTRATA               := 0;
         aAssPdgVarCDRS.IM_SPESA                 := 0;
         aAssPdgVarCDRS.DACR                     := aTSNow;
         aAssPdgVarCDRS.UTCR                     := aUser;
         aAssPdgVarCDRS.DUVA                     := aTSNow;
         aAssPdgVarCDRS.UTUV                     := aUser;
         aAssPdgVarCDRS.PG_VER_REC               := 1;
         CNRCTB050.ins_ASS_PDG_VARIAZIONE_CDR(aAssPdgVarCDRS);
    End;

         aRighe_var_spe := NULL;

   -- Inserisco la riga per L'Area (scaricata)

         aRighe_var_spe.ESERCIZIO                        := RIGHE_VAR_ACCENTRATE.ESERCIZIO;
         aRighe_var_spe.PG_VARIAZIONE_PDG                := RIGHE_VAR_ACCENTRATE.PG_VARIAZIONE_PDG;

         Select Nvl(Max(PG_RIGA), 0) + 1
         Into   aRighe_var_spe.PG_RIGA
         From   pdg_variazione_riga_gest
         Where  ESERCIZIO = RIGHE_VAR_ACCENTRATE.Esercizio And
                PG_VARIAZIONE_PDG = RIGHE_VAR_ACCENTRATE.PG_VARIAZIONE_PDG;

         aRighe_var_spe.CD_CDR_ASSEGNATARIO              := ACDRLINEA_DETT;
         aRighe_var_spe.CD_LINEA_ATTIVITA                := ALINEA_DETT;
         aRighe_var_spe.CD_CDS_AREA                      := RIGHE_VAR_ACCENTRATE.CD_CDS_AREA;
         aRighe_var_spe.TI_APPARTENENZA                  := RIGHE_VAR_ACCENTRATE.TI_APPARTENENZA;
         aRighe_var_spe.TI_GESTIONE                      := RIGHE_VAR_ACCENTRATE.TI_GESTIONE;
         aRighe_var_spe.CD_ELEMENTO_VOCE                 := RIGHE_VAR_ACCENTRATE.CD_ELEMENTO_VOCE;
         aRighe_var_spe.DT_REGISTRAZIONE                 := RIGHE_VAR_ACCENTRATE.DT_REGISTRAZIONE;
         aRighe_var_spe.DESCRIZIONE                      := RIGHE_VAR_ACCENTRATE.DESCRIZIONE;
         aRighe_var_spe.CATEGORIA_DETTAGLIO              := RIGHE_VAR_ACCENTRATE.CATEGORIA_DETTAGLIO;
         aRighe_var_spe.IM_ENTRATA                       := 0;
         aRighe_var_spe.IM_SPESE_GEST_DECENTRATA_INT     := 0;
         aRighe_var_spe.IM_SPESE_GEST_DECENTRATA_EST     := 0;
         aRighe_var_spe.IM_SPESE_GEST_ACCENTRATA_INT     := RIGHE_VAR_ACCENTRATE.IM_SPESE_GEST_ACCENTRATA_INT;
         aRighe_var_spe.IM_SPESE_GEST_ACCENTRATA_EST     := RIGHE_VAR_ACCENTRATE.IM_SPESE_GEST_ACCENTRATA_EST;
         aRighe_var_spe.PG_RIGA_CLGS                     := RIGHE_VAR_ACCENTRATE.PG_RIGA;
         aRighe_var_spe.CD_CDR_ASSEGNATARIO_CLGS         := RIGHE_VAR_ACCENTRATE.CD_CDR_ASSEGNATARIO;
         aRighe_var_spe.CD_LINEA_ATTIVITA_CLGS           := RIGHE_VAR_ACCENTRATE.CD_LINEA_ATTIVITA;
         aRighe_var_spe.DACR                             := aTSNow;
         aRighe_var_spe.UTCR                             := aUser;
         aRighe_var_spe.DUVA                             := aTSNow;
         aRighe_var_spe.UTUV                             := aUser;
         aRighe_var_spe.PG_VER_REC                       := 1;

         CNRCTB051.ins_PDG_VARIAZIONE_RIGA_GEST (aRighe_var_spe);

        -- Aggiorno il dettaglio ORIGINALE con:
        -- la RIGA generata (+ CDR/LINEA GENERATI);
        -- la Categoria_dettaglio "Scaricato"

       Update PDG_VARIAZIONE_RIGA_GEST
       Set    PG_RIGA_CLGS              = aRighe_var_spe.PG_RIGA,
                CD_CDR_ASSEGNATARIO_CLGS  = aRighe_var_spe.CD_CDR_ASSEGNATARIO,
                CD_LINEA_ATTIVITA_CLGS    = aRighe_var_spe.CD_LINEA_ATTIVITA,
              CATEGORIA_DETTAGLIO      = CNRCTB050.DETTAGLIO_SCARICO -- SCR
       Where  ESERCIZIO         = RIGHE_VAR_ACCENTRATE.ESERCIZIO And
                PG_VARIAZIONE_PDG = RIGHE_VAR_ACCENTRATE.PG_VARIAZIONE_PDG And
                PG_RIGA           = RIGHE_VAR_ACCENTRATE.PG_RIGA;

End If;

End;


 Procedure ribaltaSuAreaPDG(
  aEsercizio number,
  aCdCentroResponsabilita varchar2,
  aUser varchar2
 ) is
  aCDRPrimo cdr%rowtype;
  aCDR cdr%rowtype;
  aCDRArea cdr%rowtype;
  aUOCDS unita_organizzativa%rowtype;
  aTSNow date;
  aEVCollegato elemento_voce%rowtype;
  aStatoRibaltamento char(1);
  aPDG pdg_preventivo%rowtype;
  aFlagRibaltato boolean;
  recParametriCNR PARAMETRI_CNR%Rowtype;
 begin
  recParametriCNR := CNRUTL001.getRecParametriCnr(aEsercizio);

  If recParametriCNR.esercizio is null Then
     IBMERR001.RAISE_ERR_GENERICO('Parametri CNR per l''esercizio '||aEsercizio||' inesistenti!');
  End If;

  aCDRPrimo:=CNRCTB020.GETCDRVALIDO(aEsercizio,aCdCentroResponsabilita);

  -- Verifica che il CDR non sia un CDR di AREA

  aUOCDS:=CNRCTB020.GETUOCDS(aCDRPrimo);

  if aUOCDS.cd_tipo_unita = CNRCTB020.TIPO_AREA then
   IBMERR001.RAISE_ERR_GENERICO('Ribaltamento non permesso per CDR appartenente ad area!');
  end if;

  if aCDRPrimo.livello <> 1 then
   IBMERR001.RAISE_ERR_GENERICO('CDR non di primo livello!');
  end if;

  -- Verifica che il PDG del CDR non sia già stato ribaltato sull'area

  select fl_ribaltato_su_area into aStatoRibaltamento from pdg_preventivo
   where
        esercizio = aEsercizio
  and cd_centro_responsabilita = aCdCentroResponsabilita;

  if aStatoRibaltamento = 'Y' then
   IBMERR001.RAISE_ERR_GENERICO('Ribaltamento del cdr '||aCdCentroResponsabilita||' già effettuato');
  end if;

  -- Verifica che il BILANCIO finanziario dell'ente sia stato approvato

  if CNRCTB054.isBilancioCnrApprovato(aEsercizio) = 'N' then
   IBMERR001.RAISE_ERR_GENERICO('Bilancio preventivo CNR non ancora approvato!');
  end if;

  if CNRCTB020.ISCDRENTE(aCDRPrimo) then
   IBMERR001.RAISE_ERR_GENERICO('Il CDR '||aCdCentroResponsabilita||' è un CDR ENTE!');
  end if;

  aTSNow:=sysdate;

  CNRCTB050.lockPdg(aEsercizio, aCDRPrimo.cd_centro_responsabilita);

  if not (CNRCTB050.getStato(aEsercizio, aCDRPrimo.cd_centro_responsabilita)=CNRCTB050.STATO_PDG_FINALE) then
   IBMERR001.raise_err_generico('Il piano di gestione di primo livello non è in stato definitivo!');
  end if;

  aFlagRibaltato:=false;

  -- Da qui in poi comincia la vera operazione di ribaltamento che va ripetuta su tutti i CDR figli
  -- del CDR di primo livello considerato

  for aPDG in CNRCTB055.TUTTI_PDG_LINEA(aEsercizio, aCDRPrimo) loop

   CNRCTB050.lockPdg(aEsercizio, aPDG.cd_centro_responsabilita);

   select * into aCDR from cdr where
    cd_centro_responsabilita = aPDG.cd_centro_responsabilita;

   -- estraggo l'area

   aCDRArea:=CNRCTB020.getCDRArea(aCDR);

   -- se l'area non viene trovata non c'è niente da ribaltare
   if aCDRArea.cd_centro_responsabilita is not null then

    CNRCTB050.lockPdg(aEsercizio, aCDRArea.cd_centro_responsabilita);

    -- Estraggo il conto di ricavo figurativo collegato

  aEVCollegato:=CNRCTB000.GETVOCERICFIGALTROCDR(aEsercizio);

    -- Ciclo sui dettagli del PDG con natura 5

    for aDett in CNRCTB050.DETTAGLI_PDG_NATURA_5(aEsercizio, aCDR.cd_centro_responsabilita) loop
   ribaltaSuAreaPDGInt(
      aEsercizio,
      aCdCentroResponsabilita,
      aCDR,
      aCDRArea,
      aEVCollegato,
      aDett,
      recParametriCNR,
      aTSNow,
      aUser
     );
    end loop;

  -- Che esistano o meno dettagli da scaricare sull'area, viene aggiornato lo stato del piano come scaricato su area
  -- Inoltre setto il flag aFlagRibaltato atrue per poi aggiornare lo stato di ribaltato su AREA del CDR di primo livello per indicare
  -- che la sua linea è stata ribaltata su AREA

     aFlagRibaltato:=true;
     update pdg_preventivo set
       fl_ribaltato_su_area = 'Y'
      ,duva=aTSNow
      ,utuv=aUser
      ,pg_ver_rec=pg_ver_rec+1
     where
          esercizio = aEsercizio
      and cd_centro_responsabilita =  aCDR.cd_centro_responsabilita;
   end if;
  end loop;

  if aFlagRibaltato = true then
   update pdg_preventivo set
     fl_ribaltato_su_area = 'Y'
    ,duva=aTSNow
    ,utuv=aUser
    ,pg_ver_rec=pg_ver_rec+1
   where
        esercizio = aEsercizio
    and cd_centro_responsabilita =  aCDRPrimo.cd_centro_responsabilita;
  end if;
 end;


Function getVoce_FdaEV (aEV elemento_voce%Rowtype, aLinea_attivita linea_attivita%Rowtype) Return  voce_f%Rowtype is

aVocef  voce_f%Rowtype;
aCDR    cdr%Rowtype;
UO_IN   unita_organizzativa%Rowtype;
CDS_IN  unita_organizzativa.cd_unita_organizzativa%Type;
cds_sac unita_organizzativa%Rowtype;

Begin

-- recupero il CDS SAC che mi serve dopo per

CDS_SAC := CNRCTB020.GETCDSSACVALIDO (aEv.esercizio);

-- prendo tutta la riga del CDR (della linea) da aggiornare

Select *
Into  aCDR
From  cdr
Where cd_centro_responsabilita = aLinea_attivita.cd_centro_responsabilita;

-- CDS del CDR da aggiornare

CDS_IN := CNRUTL001.GETCDSFROMCDR(aCDR.cd_centro_responsabilita);

-- UO del CDR da aggiornare

UO_IN := cnrctb020.getuo(aCDR);

------- LA FUNZIONE RESTITUISCE VALORI SOLO PER SPESE CDS ES ENTRATE CNR

If aEV.ti_gestione = 'S' Then -- SPESA

   If aEV.ti_appartenenza = 'C' Then -- SPESE PER IL BILANCIO DELL'ENTE

        aVocef := Null;
/*
      If CNRCTB020.ISCDRENTE(aCDR) Then -- spesa ente per SAC
         Select *
         Into   aVocef
         From   voce_f
         Where  esercizio = aEv.esercizio And
                ti_appartenenza = aEv.ti_appartenenza And
                ti_gestione = aEv.ti_gestione And
                cd_titolo_capitolo = aEv.cd_elemento_voce And
                cd_cds = '000' And
                cd_natura = aLinea_attivita.cd_natura And
                cd_funzione = aLinea_attivita.cd_funzione;
      Elsif Not CNRCTB020.ISCDRENTE(aCDR) Then -- spesa ente NON SAC
         Null;
      End If;
*/
   Elsif aEV.ti_appartenenza = 'D' Then -- SPESA CDS

--------------------- SPESE PER IL CDS

----DBMS_OUTPUT.put_line ('1. CDS IN '||CDS_IN||' SAC '||CDS_SAC.cd_unita_organizzativa);


      If CDS_IN = CDS_SAC.cd_unita_organizzativa Then -- CDS SAC
        Begin
         Select *
         Into   aVocef
         From   voce_f
         Where  esercizio = aEv.esercizio And
                ti_appartenenza = aEv.ti_appartenenza And
                ti_gestione = aEv.ti_gestione And
                cd_titolo_capitolo = aEv.cd_elemento_voce And
                cd_CENTRO_RESPONSABILITA = aLinea_attivita.cd_centro_responsabilita And
                cd_funzione = aLinea_attivita.cd_funzione;
        Exception
          When No_Data_Found Then
            IBMERR001.RAISE_ERR_GENERICO('1. Voce_f non trovata per Esercizio '||aEv.esercizio||
', App. '||aEv.ti_appartenenza||', gest. '||aEv.ti_gestione||', El. Voce '||aEv.cd_elemento_voce||
', Cdr '||aLinea_attivita.cd_centro_responsabilita||', Funzione '||aLinea_attivita.cd_funzione);
        End;

      Elsif CDS_IN != CDS_SAC.cd_unita_organizzativa Then -- ALTRI CDS
        Begin
         Select *
         Into   aVocef
         From   voce_f
         Where  esercizio = aEv.esercizio And
                ti_appartenenza = aEv.ti_appartenenza And
                ti_gestione = aEv.ti_gestione And
                cd_titolo_capitolo = aEv.cd_elemento_voce And
                cd_unita_organizzativa = UO_IN.CD_UNITA_ORGANIZZATIVA And
                cd_funzione = aLinea_attivita.cd_funzione;
        Exception
          When No_Data_Found Then
            IBMERR001.RAISE_ERR_GENERICO('2. Voce_f non trovata per Esercizio '||aEv.esercizio||
', App. '||aEv.ti_appartenenza||', gest. '||aEv.ti_gestione||', El. Voce '||aEv.cd_elemento_voce||
', UO '||UO_IN.CD_UNITA_ORGANIZZATIVA||', Funzione '||aLinea_attivita.cd_funzione);
        End;
      End If;
   End If;

Elsif aEV.ti_gestione = 'E' Then -- ENTRATA

   If aEV.ti_appartenenza = 'C' Then -- ENTRATA ENTE/di fatto cds

--------------------- ENTRATE PER IL CDS
        Begin
         Select *
         Into   aVocef
         From   voce_f
         Where  esercizio = aEv.esercizio And
                ti_appartenenza = aEv.ti_appartenenza And
                ti_gestione = aEv.ti_gestione And
                cd_titolo_capitolo = aEv.cd_elemento_voce And
                ti_voce = 'A' and
                (cd_unita_organizzativa = UO_IN.CD_UNITA_ORGANIZZATIVA or
                cd_unita_organizzativa is null);
        Exception
          When No_Data_Found Then
            IBMERR001.RAISE_ERR_GENERICO('3. Voce_f non trovata per Esercizio '||aEv.esercizio||
', App. '||aEv.ti_appartenenza||', gest. '||aEv.ti_gestione||', El. Voce '||aEv.cd_elemento_voce||
', UO '||UO_IN.CD_UNITA_ORGANIZZATIVA);
        End;
   Elsif aEV.ti_appartenenza = 'D' Then -- ENTRATA CDS

--------------------- ENTRATE PER IL BILANCIO DEL CNR

        aVocef := Null;

   End If;

End If; -- ENTRATA/SPESA

Return AVOCEF;

End;

Function getVoce_FdaEV (aEsercizio NUMBER, aTI_APPARTENENZA CHAR, aTI_GESTIONE CHAR, aCD_ELEMENTO_VOCE VARCHAR2,
                        acd_centro_responsabilita VARCHAR2, acd_linea_attivita VARCHAR2) Return  VARCHAR2 Is
aRecEv elemento_voce%Rowtype;
aRecLA linea_attivita%Rowtype;
aVoceLunga voce_f%Rowtype;

  recParametriCNR PARAMETRI_CNR%Rowtype;
begin
  recParametriCNR := CNRUTL001.getRecParametriCnr(aEsercizio);

If nvl(recParametriCnr.fl_nuovo_pdg,'N')='Y' Then
  return aCD_ELEMENTO_VOCE;
End If;

Select * Into aRecEv
From elemento_voce
Where ESERCIZIO = aEsercizio And
TI_APPARTENENZA = aTI_APPARTENENZA And
TI_GESTIONE = aTI_GESTIONE And
CD_ELEMENTO_VOCE = aCD_ELEMENTO_VOCE;

Select * Into aRecLA
From linea_attivita
Where cd_centro_responsabilita = acd_centro_responsabilita And
      cd_linea_attivita = acd_linea_attivita;

aVoceLunga := getVoce_FdaEV (aRecEV, aRecLA);

Return aVoceLunga.cd_voce;

End;

---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-----------------------                   NUOVA GESTIONE                  -------------------------
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------

 procedure ribaltaSuAreaPDG_da_gest(
  aEsercizio number,
  aCdCentroResponsabilita varchar2,
  aUser varchar2
 ) Is
  aCDRPrimo cdr%rowtype;
  aCDR cdr%rowtype;
  aCDRArea cdr%rowtype;
  aUOCDS unita_organizzativa%rowtype;
  aTSNow date;
  aEVCollegato elemento_voce%rowtype;
  aStatoRibaltamento char(1);
  aFlagRibaltato boolean;
  recParametriCNR PARAMETRI_CNR%Rowtype;
 begin
  recParametriCNR := CNRUTL001.getRecParametriCnr(aEsercizio);

  If recParametriCNR.esercizio is null Then
     IBMERR001.RAISE_ERR_GENERICO('Parametri CNR per l''esercizio '||aEsercizio||' inesistenti!');
  End If;

  aCDRPrimo:=CNRCTB020.GETCDRVALIDO(aEsercizio,aCdCentroResponsabilita);

  -- Verifica che il CDR non sia un CDR di AREA se si tratta ancora della vecchia gestione pdg
  If nvl(recParametriCnr.fl_nuovo_pdg,'N')='N' Then
    aUOCDS:=CNRCTB020.GETUOCDS(aCDRPrimo);

    if aUOCDS.cd_tipo_unita = CNRCTB020.TIPO_AREA then
     IBMERR001.RAISE_ERR_GENERICO('Ribaltamento non permesso per CDR appartenente ad area!');
    end if;
  End If;

--  if aCDRPrimo.livello <> 1 then
   --IBMERR001.RAISE_ERR_GENERICO('CDR non di primo livello!');
--  end if;

  if CNRCTB020.ISCDRENTE(aCDRPrimo) then
   IBMERR001.RAISE_ERR_GENERICO('Il CDR '||aCdCentroResponsabilita||' è un CDR ENTE!');
  end if;

  aTSNow:=sysdate;
-- VERIFICARE, PRIMA CONTROLLAVA CHE FOSSE CHIUSO, SOLO CHE LO STATO LO CAMBIA ALLA FINE.
-- FORSE è MEGLIO CHE LO CAMBI ALL'INIZIO.
  if not (CNRCTB050.getStato_PDG_ESERCIZIO(aEsercizio, aCDRPrimo.cd_centro_responsabilita)=CNRCTB050.STATO_PDG2_APERTO_GEST) then
   IBMERR001.raise_err_generico('1. Il piano di gestione del CdR '||aCDRPrimo.cd_centro_responsabilita||' non è in stato definitivo !');
  end if;

  -- Da qui in poi comincia la vera operazione di ribaltamento del CDR

   CNRCTB050.lockPdg_esercizio(aEsercizio, aCdCentroResponsabilita);

    -- Ciclo sui dettagli del PDGG ENTRATA da ribaltare su AREA (non c'entra più nulla la Natura 5)

    for aDett in CNRCTB050.PDGG_ETR_DA_RIB_SU_AREA(aEsercizio, aCDRPrimo.cd_centro_responsabilita) loop

        -- RECUPERO L'UNICO CDR DEL CDS AREA
       Begin
        Select cdr.*
        Into   aCDRArea
        From   cdr, unita_organizzativa uo
        Where  aDett.Cd_cds_Area = uo.cd_unita_padre And
               cdr.cd_unita_organizzativa = uo.cd_unita_organizzativa;
       Exception
        When No_Data_Found Then
             IBMERR001.RAISE_ERR_GENERICO('Il CDS Area '||aDett.Cd_cds_Area||' non possiede alcun CdR !');
        When Too_Many_Rows Then
             IBMERR001.RAISE_ERR_GENERICO('1. Il CDS Area '||aDett.Cd_cds_Area||' possiede più di un CdR !');
       End;

        -- lock anche del PDG esercizio dell'Area NON SERVE, L'AREA NON HA TESTATA
        --  CNRCTB050.lockPdg_esercizio(aEsercizio, aCDRArea.cd_centro_responsabilita);

  ribaltaSuAreaPDGG_etr_Int(aEsercizio, aCdCentroResponsabilita, aCDR, aCDRArea, aDett, Null, recParametriCNR, aTSNow, aUser);
    end loop;

    -- Ciclo sui dettagli del PDGG SPESA da ribaltare su AREA (non c'entra più nulla la Natura 5)

    for aDett in CNRCTB050.PDGG_SPE_DA_RIB_SU_AREA(aEsercizio, aCdCentroResponsabilita) loop

        -- RECUPERO L'UNICO CDR DEL CDS AREA
       Begin
        Select cdr.*
        Into   aCDRArea
        From   cdr, unita_organizzativa uo
        Where  cdr.cd_unita_organizzativa = uo.cd_unita_organizzativa And
               uo.cd_unita_padre = aDett.Cd_cds_Area;
       Exception
        When No_Data_Found Then
             IBMERR001.RAISE_ERR_GENERICO('Il CDS Area '||aDett.Cd_cds_Area||' non possiede alcun CdR !');
        When Too_Many_Rows Then
             IBMERR001.RAISE_ERR_GENERICO('2. Il CDS Area '||aDett.Cd_cds_Area||' possiede più di un CdR !');
       End;

        -- lock anche del PDG esercizio dell'Area, NON SERVE, L'AREA NON HA TESTATA
        --CNRCTB050.lockPdg_ESERCIZIO(aEsercizio, aCDRArea.cd_centro_responsabilita);

  ribaltaSuAreaPDGG_spe_Int(aEsercizio, aCdCentroResponsabilita, aCDR, aCDRArea, aDett, Null, recParametriCNR, aTSNow, aUser);
    end loop;

    -- Ciclo sui dettagli del PDGG SPESA da ribaltare su Accentratore

-- NUOVA GESTIONE !!!! Cursore di lettura dei dettagli del PDG Gestionale SPESA da ribaltare sul
--                     CdR Accentratore
-- aEs -> esercizio contabile
-- aCdCdr -> cd centro responsabilità

    for aDett in (select PDG.*
                From   PDG_MODULO_SPESE_GEST PDG, CLASSIFICAZIONE_VOCI CV
    where PDG.esercizio = aEsercizio
      And PDG.CD_CENTRO_RESPONSABILITA = aCdCentroResponsabilita
      And PDG.ID_CLASSIFICAZIONE = CV.ID_CLASSIFICAZIONE
      And pdg.CD_CDR_ASSEGNATARIO != Nvl(CV.CDR_ACCENTRATORE, pdg.CD_CDR_ASSEGNATARIO)
                  And origine = 'PRE'
                  And CATEGORIA_DETTAGLIO In ('DIR', 'STI')
                  And IM_SPESE_GEST_ACCENTRATA_INT + IM_SPESE_GEST_ACCENTRATA_EST > 0
                  for update nowait) Loop

        -- lock anche del PDG esercizio dell'Area NON SERVE !!!
        --CNRCTB050.lockPdg(aEsercizio, aDett.Cd_cds_Area);

  ribaltaSuAccentratPDGG_spe_Int(aEsercizio, aCdCentroResponsabilita, aCDR, aCDRArea, aDett, Null, recParametriCNR, aTSNow, aUser);
    end loop;

 End;

-- 27.04.2006 Ribaltamento delle variazioni al PdG competenza 2006

 Procedure ribaltaSuAreaPDG_da_gest_var(
  aEsercizio number,
  aPG_VARIAZIONE_PDG NUMBER,
  aUser varchar2
 ) Is

---- copiato dal pdgg

  aCDRPrimo cdr%rowtype;
  aCDR cdr%rowtype;
  aCDRArea cdr%rowtype;
  aUOCDS unita_organizzativa%rowtype;
  aTSNow date;
  aEVCollegato elemento_voce%rowtype;
  aStatoRibaltamento char(1);
  aFlagRibaltato boolean;

  recParametriCNR PARAMETRI_CNR%Rowtype;
Begin
  recParametriCNR := CNRUTL001.getRecParametriCnr(aEsercizio);

  If recParametriCNR.esercizio is null Then
     IBMERR001.RAISE_ERR_GENERICO('Parametri CNR per l''esercizio '||aEsercizio||' inesistenti!');
  End If;

-- MI GIRO LE RIGHE DI ENTRATA DELLA VARIAZIONE CHE DEVONO ESSERE SCARICATE SU AREA

For RIGHE_VAR_ENT In (Select *
                        From  PDG_VARIAZIONE_RIGA_GEST
            Where esercizio = aEsercizio
              And PG_VARIAZIONE_PDG = aPG_VARIAZIONE_PDG
              And TI_GESTIONE = CNRCTB001.GESTIONE_ENTRATE
              And CNRUTL001.getCdsFromCdr(CD_CDR_ASSEGNATARIO) != cd_cds_area
                          And CATEGORIA_DETTAGLIO = 'DIR'
                          For update nowait) Loop

  aCDRPrimo := CNRCTB020.getCDRPrimoLivello(CNRCTB020.GETCDRVALIDO(aEsercizio, RIGHE_VAR_ENT.CD_CDR_ASSEGNATARIO));

  -- Verifica che il CDR non sia un CDR di AREA

  aUOCDS := CNRCTB020.GETUOCDS(aCDRPrimo);

  if aUOCDS.cd_tipo_unita = CNRCTB020.TIPO_AREA then
   IBMERR001.RAISE_ERR_GENERICO('Ribaltamento non permesso per CDR appartenente ad area!');
  end if;

  if CNRCTB020.ISCDRENTE(aCDRPrimo) then
   IBMERR001.RAISE_ERR_GENERICO('Il CDR '||RIGHE_VAR_ENT.CD_CDR_ASSEGNATARIO||' è un CDR ENTE!');
  end if;

  aTSNow := sysdate;

  if not (CNRCTB050.getStato_PDG_ESERCIZIO(aEsercizio, aCDRPrimo.cd_centro_responsabilita) = CNRCTB050.STATO_PDG2_CHIUSO_GEST) then
   IBMERR001.raise_err_generico('Il piano di gestione del CdR '||aCDRPrimo.cd_centro_responsabilita||' non è in stato definitivo !');
  end if;

  -- Da qui in poi comincia la vera operazione di ribaltamento del CDR

       -- RECUPERO L'UNICO CDR DEL CDS AREA
       Begin
        Select cdr.*
        Into   aCDRArea
        From   cdr, unita_organizzativa uo
        Where  RIGHE_VAR_ENT.Cd_cds_Area = uo.cd_unita_padre And
               cdr.cd_unita_organizzativa = uo.cd_unita_organizzativa;
       Exception
        When No_Data_Found Then
             IBMERR001.RAISE_ERR_GENERICO('Il CDS Area '||RIGHE_VAR_ENT.Cd_cds_Area||' non possiede alcun CdR !');
        When Too_Many_Rows Then
             IBMERR001.RAISE_ERR_GENERICO('1. Il CDS Area '||RIGHE_VAR_ENT.Cd_cds_Area||' possiede più di un CdR !');
       End;

       ribaltaSuAreaPDGG_etr_Int(aEsercizio, RIGHE_VAR_ENT.CD_CDR_ASSEGNATARIO, aCDR, aCDRArea, Null, RIGHE_VAR_ENT, recParametriCNR, aTSNow, aUser);

End Loop; -- DELL'ENTRATA


-- MI GIRO LE RIGHE DI SPESA DELLA VARIAZIONE CHE DEVONO ESSERE SCARICATE SU AREA

For RIGHE_VAR_SPE In (Select *
                      From  PDG_VARIAZIONE_RIGA_GEST
                Where esercizio = aEsercizio
                  And PG_VARIAZIONE_PDG = aPG_VARIAZIONE_PDG
                  And TI_GESTIONE = CNRCTB001.GESTIONE_SPESE
                  And CNRUTL001.getCdsFromCdr(CD_CDR_ASSEGNATARIO) != cd_cds_area
                        And CATEGORIA_DETTAGLIO = 'DIR'
                      For update nowait) Loop

  aCDRPrimo := CNRCTB020.getCDRPrimoLivello(CNRCTB020.GETCDRVALIDO(aEsercizio, RIGHE_VAR_SPE.CD_CDR_ASSEGNATARIO));

  -- Verifica che il CDR non sia un CDR di AREA

  aUOCDS := CNRCTB020.GETUOCDS(aCDRPrimo);

  if aUOCDS.cd_tipo_unita = CNRCTB020.TIPO_AREA then
   IBMERR001.RAISE_ERR_GENERICO('Ribaltamento non permesso per CDR appartenente ad area!');
  end if;

  if CNRCTB020.ISCDRENTE(aCDRPrimo) then
   IBMERR001.RAISE_ERR_GENERICO('Il CDR '||RIGHE_VAR_SPE.CD_CDR_ASSEGNATARIO||' è un CDR ENTE!');
  end if;

  aTSNow := sysdate;

  if not (CNRCTB050.getStato_PDG_ESERCIZIO(aEsercizio, aCDRPrimo.cd_centro_responsabilita) = CNRCTB050.STATO_PDG2_CHIUSO_GEST) then
   IBMERR001.raise_err_generico('Il piano di gestione del CdR '||aCDRPrimo.cd_centro_responsabilita||' non è in stato definitivo !');
  end if;

  -- Da qui in poi comincia la vera operazione di ribaltamento del CDR

        -- RECUPERO L'UNICO CDR DEL CDS AREA
       Begin
        Select cdr.*
        Into   aCDRArea
        From   cdr, unita_organizzativa uo
        Where  cdr.cd_unita_organizzativa = uo.cd_unita_organizzativa And
               uo.cd_unita_padre = RIGHE_VAR_SPE.Cd_cds_Area;
       Exception
        When No_Data_Found Then
             IBMERR001.RAISE_ERR_GENERICO('Il CDS Area '||RIGHE_VAR_SPE.Cd_cds_Area||' non possiede alcun CdR !');
        When Too_Many_Rows Then
             IBMERR001.RAISE_ERR_GENERICO('2. Il CDS Area '||RIGHE_VAR_SPE.Cd_cds_Area||' possiede più di un CdR !');
       End;

        -- lock anche del PDG esercizio dell'Area, NON SERVE, L'AREA NON HA TESTATA
        --CNRCTB050.lockPdg_ESERCIZIO(aEsercizio, aCDRArea.cd_centro_responsabilita);

       ribaltaSuAreaPDGG_spe_Int(aEsercizio, RIGHE_VAR_SPE.CD_CDR_ASSEGNATARIO, aCDR, aCDRArea, Null, RIGHE_VAR_SPE, recParametriCNR, aTSNow, aUser);

End Loop; -- DELLA SPESA

-- Ciclo sui dettagli della Variazione da ribaltare su Accentratore

-- NUOVA GESTIONE !!!! Cursore di lettura dei dettagli del PDG Gestionale SPESA da ribaltare sul
--                     CdR Accentratore
-- aEs -> esercizio contabile
-- aCdCdr -> cd centro responsabilità

For RIGHE_VAR_ACCENTRATE in (Select PDG.*
                             From   PDG_VARIAZIONE_RIGA_GEST PDG, ELEMENTO_VOCE EV, CLASSIFICAZIONE_VOCI CV_VOCE
                           Where  PDG.ESERCIZIO = aEsercizio
                             And  PG_VARIAZIONE_PDG = aPG_VARIAZIONE_PDG
                             And  PDG.TI_GESTIONE = CNRCTB001.GESTIONE_SPESE
                               And  PDG.ESERCIZIO        = EV.ESERCIZIO
                               And  PDG.TI_APPARTENENZA  = EV.TI_APPARTENENZA
                               And  PDG.TI_GESTIONE      = EV.TI_GESTIONE
                               And  PDG.CD_ELEMENTO_VOCE = EV.CD_ELEMENTO_VOCE
                   And  EV.ID_CLASSIFICAZIONE = CV_VOCE.ID_CLASSIFICAZIONE
                   And  PDG.CD_CDR_ASSEGNATARIO != Nvl(CV_VOCE.CDR_ACCENTRATORE, PDG.CD_CDR_ASSEGNATARIO)
                               And  CATEGORIA_DETTAGLIO In ('DIR', 'STI')
                               And  IM_SPESE_GEST_ACCENTRATA_INT + IM_SPESE_GEST_ACCENTRATA_EST > 0
                               For Update Nowait) Loop
        aTSNow := sysdate;
  ribaltaSuAccentratPDGG_spe_Int(aEsercizio, RIGHE_VAR_ACCENTRATE.CD_CDR_ASSEGNATARIO, aCDR, aCDRArea, Null, RIGHE_VAR_ACCENTRATE, recParametriCNR, aTSNow, aUser);
End Loop;

End;


---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
--------------------------------- FINE COPIA DELLA VECCHIA GESTIONE -------------------------------
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------

 Procedure creasaldicdrlineavocedagest(
  aEsercizio number,
  aCdCentroResponsabilita varchar2,
  aUser VARCHAR2) Is

  aCDRPrimo cdr%rowtype;
  aCDR cdr%rowtype;
  aCDRArea cdr%rowtype;
  aCDSENTE    unita_organizzativa%rowtype;
  aUOCDS unita_organizzativa%rowtype;
  aTSNow date;
  aEVCollegato elemento_voce%rowtype;
  aStatoRibaltamento char(1);
  aFlagRibaltato boolean;
  aNuovoSaldo     Voce_f_saldi_cdr_linea%Rowtype;
  aElVoce       elemento_voce%Rowtype;
  aLinea        linea_attivita%Rowtype;
  aVoceLunga    voce_f%Rowtype;
  CDR_ACCENTRATORE_CLAS CDR.CD_CENTRO_RESPONSABILITA%TYPE;
  livello_pgd_dec_spe  number(1);
  livello_clas_spe  number(1);
  recParametriCNR PARAMETRI_CNR%Rowtype;
 begin
  recParametriCNR := CNRUTL001.getRecParametriCnr(aEsercizio);

  -- recupero il CDS ENTE
  select * into aCDSENTE
  from  unita_organizzativa
  Where cd_tipo_unita = CNRCTB020.TIPO_ENTE
    and fl_cds  ='Y';

  aCDSENTE := CNRCTB020.GETCDSVALIDO(aEsercizio,aCDSENTE.cd_unita_organizzativa);

----------- RIFA' TUTTI I CONTROLLI CHE FA PER IL RIBALTAMENTO SU AREA --------------

  aCDRPrimo:=CNRCTB020.GETCDRVALIDO(aEsercizio,aCdCentroResponsabilita);

  -- Verifica che il CDR non sia un CDR di AREA

  aUOCDS:=CNRCTB020.GETUOCDS(aCDRPrimo);
If nvl(recParametriCnr.fl_nuovo_pdg,'N')='N' Then
  if aUOCDS.cd_tipo_unita = CNRCTB020.TIPO_AREA then
   IBMERR001.RAISE_ERR_GENERICO('Ribaltamento non permesso per CDR appartenente ad area!');
  end if;
end if;
--  if aCDRPrimo.livello <> 1 then
--   IBMERR001.RAISE_ERR_GENERICO('CDR non di primo livello!');
--  end if;

  if CNRCTB020.ISCDRENTE(aCDRPrimo) then
   IBMERR001.RAISE_ERR_GENERICO('Il CDR '||aCdCentroResponsabilita||' è un CDR ENTE!');
  end if;

  aTSNow:=sysdate;

  if not (CNRCTB050.getStato_PDG_ESERCIZIO(aEsercizio, aCDRPrimo.cd_centro_responsabilita)=CNRCTB050.STATO_PDG2_APERTO_GEST) then
   IBMERR001.raise_err_generico('2. Il piano di gestione del CdR '||aCDRPrimo.cd_centro_responsabilita||' non è in stato definitivo !');
  end if;

  -- Da qui in poi comincia la vera operazione di CREAZIONE DEI SALDI
    CNRCTB050.lockPdg_esercizio(aEsercizio, aCdCentroResponsabilita); -- ???????????????????

    -- Ciclo sui dettagli del PDGG ENTRATA finali per i quali creare i SALDI

    for aDett in (Select * From PDG_MODULO_ENTRATE_GEST
      where esercizio = aEsercizio
        And CD_CENTRO_RESPONSABILITA = aCDRPrimo.cd_centro_responsabilita
                    And origine = 'PRE'
                    And CATEGORIA_DETTAGLIO != 'SCR'
                    For update nowait) Loop

Begin
  Select *
  Into   aElVoce
  From   elemento_voce
  Where  ESERCIZIO        = aDett.ESERCIZIO       and
         TI_APPARTENENZA  = aDett.TI_APPARTENENZA and
         TI_GESTIONE      = aDett.TI_GESTIONE     and
         CD_ELEMENTO_VOCE = aDett.CD_ELEMENTO_VOCE;
Exception
  When No_Data_Found Then
   IBMERR001.raise_err_generico('L''Elemento Voce indicato sul PdG gestionale '||aDett.ESERCIZIO||'/'||aDett.TI_APPARTENENZA||'/'||aDett.TI_GESTIONE||'/'||aDett.CD_ELEMENTO_VOCE||' non esiste !');
End;

Begin
  Select *
  Into   aLinea
  From   linea_attivita
  Where  cd_centro_responsabilita = aDett.cd_cdr_assegnatario And
         cd_linea_attivita        = aDett.cd_linea_attivita;
Exception
  When No_Data_Found Then
   IBMERR001.raise_err_generico('La Linea indicata sul PdG gestionale '||aDett.cd_cdr_assegnatario||'/'||aDett.cd_linea_attivita||' non esiste !');
End;

                    aNuovoSaldo.ESERCIZIO                 := aesercizio;
                    aNuovoSaldo.ESERCIZIO_RES             := aesercizio;
                    aNuovoSaldo.CD_CENTRO_RESPONSABILITA  := aDett.CD_CDR_ASSEGNATARIO;
                    aNuovoSaldo.CD_LINEA_ATTIVITA         := aDett.cd_linea_attivita;
                    aNuovoSaldo.TI_APPARTENENZA           := aDett.TI_APPARTENENZA;
                    aNuovoSaldo.TI_GESTIONE               := aDett.TI_GESTIONE;

                    If nvl(recParametriCnr.fl_nuovo_pdg,'N')='N' Then
                      aVoceLunga := getVoce_FdaEV(aElVoce, aLinea);
                      aNuovoSaldo.CD_VOCE := aVoceLunga.cd_voce;
                      aNuovoSaldo.cd_elemento_voce := aVoceLunga.cd_elemento_voce;
                    Else
                      aNuovoSaldo.CD_VOCE := aDett.CD_ELEMENTO_VOCE;
                      aNuovoSaldo.cd_elemento_voce := aDett.CD_ELEMENTO_VOCE;
                    End If;

                    CNRCTB054.RESET_IMPORTI_SALDI (aNuovoSaldo);

                    aNuovoSaldo.CD_ELEMENTO_VOCE          := aDett.CD_ELEMENTO_VOCE;
                    aNuovoSaldo.IM_STANZ_INIZIALE_A1      := aDett.IM_ENTRATA;
                    aNuovoSaldo.IM_STANZ_INIZIALE_A2      := 0;
                    aNuovoSaldo.IM_STANZ_INIZIALE_A3      := 0;
                    aNuovoSaldo.VARIAZIONI_PIU            := 0;
                    aNuovoSaldo.VARIAZIONI_MENO           := 0;
                    aNuovoSaldo.IM_STANZ_INIZIALE_CASSA   := aDett.IM_INCASSI;
                    aNuovoSaldo.VARIAZIONI_PIU_CASSA      := 0;
                    aNuovoSaldo.VARIAZIONI_MENO_CASSA     := 0;
                    aNuovoSaldo.IM_OBBL_ACC_COMP          := 0;
                    aNuovoSaldo.IM_STANZ_RES_IMPROPRIO    := 0;
                    aNuovoSaldo.VAR_PIU_STANZ_RES_IMP     := 0;
                    aNuovoSaldo.VAR_MENO_STANZ_RES_IMP    := 0;
                    aNuovoSaldo.IM_OBBL_RES_IMP           := 0;
                    aNuovoSaldo.VAR_PIU_OBBL_RES_IMP      := 0;
                    aNuovoSaldo.VAR_MENO_OBBL_RES_IMP     := 0;
                    aNuovoSaldo.IM_OBBL_RES_PRO           := 0;
                    aNuovoSaldo.VAR_PIU_OBBL_RES_PRO      := 0;
                    aNuovoSaldo.VAR_MENO_OBBL_RES_PRO     := 0;
                    aNuovoSaldo.IM_MANDATI_REVERSALI_PRO  := 0;
                    aNuovoSaldo.IM_MANDATI_REVERSALI_IMP  := 0;
                    aNuovoSaldo.IM_PAGAMENTI_INCASSI      := 0;
                    aNuovoSaldo.DACR                      := aTSNow;
                    aNuovoSaldo.UTCR                      := aUser;
                    aNuovoSaldo.DUVA                      := aTSNow;
                    aNuovoSaldo.UTUV                      := aUser;
                    aNuovoSaldo.PG_VER_REC                := 1;

                    CNRCTB054.crea_aggiorna_saldi (aNuovoSaldo, '053.creasaldicdrlineavocedagest 1', 'N');

                    If nvl(recParametriCnr.fl_nuovo_pdg,'N')!='Y' Then
                      --Aggiorno la tabella VOCE_F_SALDI_CMP
                      Declare
                        aSaldoCmp                 Voce_f_saldi_cmp%Rowtype;
                      Begin
                        Select * into aSaldoCmp from voce_f_saldi_cmp
                        Where CD_CDS = aCDSENTE.CD_UNITA_ORGANIZZATIVA
                        And   ESERCIZIO = aNuovoSaldo.ESERCIZIO
                        And   TI_APPARTENENZA=aNuovoSaldo.TI_APPARTENENZA
                        And   TI_GESTIONE=aNuovoSaldo.TI_GESTIONE
                        And   CD_VOCE=aNuovoSaldo.CD_VOCE
                        And   TI_COMPETENZA_RESIDUO=CNRCTB054.TI_COMPETENZA
                        For update nowait;

                        CNRCTB054.aggiornaStanziamentoResidui(aSaldoCmp,aNuovoSaldo.IM_STANZ_INIZIALE_A1,aUser,aTSNow);
                      Exception when NO_DATA_FOUND then
                        IBMERR001.RAISE_ERR_GENERICO('Capitolo finanziario non trovato:'||aNuovoSaldo.CD_VOCE);
                      End;
                    End If;
    end loop;

  Begin
    Select  Nvl(LIVELLO_PDG_DECIS_SPE, 0)
    Into    livello_pgd_dec_spe
    From    PARAMETRI_CNR
    Where   ESERCIZIO = aEsercizio;

    Select  max(nr_livello)
    Into    livello_clas_spe
    From    v_classificazione_voci
    Where   ESERCIZIO =aEsercizio
    AND FL_MASTRINO = 'Y'
    AND TI_GESTIONE = 'S';
  Exception
  When No_Data_Found Then
   IBMERR001.raise_err_generico('Parametri necessari al controllo dei limiti per l''esercizio '||aEsercizio||' non trovati !');
  End;

    -- Ciclo sui dettagli del PDGG SPESE finali per i quali creare i SALDI

    for aDett in (Select PDG.*
                  From PDG_MODULO_SPESE_GEST PDG--, CLASSIFICAZIONE_VOCI CV
      where PDG.esercizio = aEsercizio
        And PDG.CD_CENTRO_RESPONSABILITA = aCDRPrimo.cd_centro_responsabilita
--        And PDG.ID_CLASSIFICAZIONE = CV.ID_CLASSIFICAZIONE
                    And PDG.origine = 'PRE'
                    And PDG.CATEGORIA_DETTAGLIO != 'SCR'
--                    And Nvl(CV.CDR_ACCENTRATORE, CD_CDR_ASSEGNATARIO) = CD_CDR_ASSEGNATARIO
                    For update nowait) Loop

-- RECUPERO IL CDR ACCENTRATORE DELLA CLASSIFICAZIONE

Select CDR_ACCENTRATORE
Into   CDR_ACCENTRATORE_CLAS
From   CLASSIFICAZIONE_VOCI
Where  ID_CLASSIFICAZIONE = aDett.ID_CLASSIFICAZIONE;


Begin
  Select *
  Into   aElVoce
  From   elemento_voce
  Where  ESERCIZIO        = aDett.ESERCIZIO       and
         TI_APPARTENENZA  = aDett.TI_APPARTENENZA and
         TI_GESTIONE      = aDett.TI_GESTIONE     and
         CD_ELEMENTO_VOCE = aDett.CD_ELEMENTO_VOCE;
Exception
  When No_Data_Found Then
   IBMERR001.raise_err_generico('L''Elemento Voce indicato sul PdG gestionale '||aDett.ESERCIZIO||'/'||aDett.TI_APPARTENENZA||'/'||aDett.TI_GESTIONE||'/'||aDett.CD_ELEMENTO_VOCE||' non esiste !');
End;

Begin
  Select *
  Into   aLinea
  From   linea_attivita
  Where  cd_centro_responsabilita = aDett.cd_cdr_assegnatario And
         cd_linea_attivita        = aDett.cd_linea_attivita;
Exception
  When No_Data_Found Then
   IBMERR001.raise_err_generico('La Linea indicata sul PdG gestionale '||aDett.cd_cdr_assegnatario||'/'||aDett.cd_linea_attivita||' non esiste !');
End;

                    aNuovoSaldo.ESERCIZIO                 := aesercizio;
                    aNuovoSaldo.ESERCIZIO_RES             := aesercizio;
                    aNuovoSaldo.CD_CENTRO_RESPONSABILITA  := aDett.CD_CDR_ASSEGNATARIO;
                    aNuovoSaldo.CD_LINEA_ATTIVITA         := aDett.cd_linea_attivita;
                    aNuovoSaldo.TI_APPARTENENZA           := aDett.TI_APPARTENENZA;
                    aNuovoSaldo.TI_GESTIONE               := aDett.TI_GESTIONE;

                    If nvl(recParametriCnr.fl_nuovo_pdg,'N')='N' Then
                      aVoceLunga := getVoce_FdaEV(aElVoce, aLinea);
                      aNuovoSaldo.CD_VOCE := aVoceLunga.cd_voce;
                      aNuovoSaldo.cd_elemento_voce := aVoceLunga.cd_elemento_voce;
                   Else
                      aNuovoSaldo.CD_VOCE := aDett.CD_ELEMENTO_VOCE;
                      aNuovoSaldo.cd_elemento_voce := aDett.CD_ELEMENTO_VOCE;
                    End If;

                    CNRCTB054.RESET_IMPORTI_SALDI (aNuovoSaldo);

                    aNuovoSaldo.CD_ELEMENTO_VOCE          := aDett.CD_ELEMENTO_VOCE;

/* inizio pezzo aggiunto il 09.02.2006 alle 19.33 per test dopo 037 */

-- se l'assegnatario è anche l'accentratore stanzia tutte le colonne (acc + dec)
-- se l'assegnatario non è anche l'accentratore stanzia solo il decentrato
-- perchè si tratta di voce sia accentrata che decentrata
-- N.B. i dettagli di origine di quelli generati sull'accentratore restano DIR per le classificazioni
-- doppia (sia acc che dec) (((((deciso al momento)))))

If ((CDR_ACCENTRATORE_CLAS Is Null) Or
    (CDR_ACCENTRATORE_CLAS Is Not Null And CDR_ACCENTRATORE_CLAS = aDett.CD_CDR_ASSEGNATARIO)) Then

    aNuovoSaldo.IM_STANZ_INIZIALE_A1 := Nvl(aDett.IM_SPESE_GEST_DECENTRATA_INT, 0) +
                                        Nvl(aDett.IM_SPESE_GEST_DECENTRATA_EST, 0) +
                                        Nvl(aDett.IM_SPESE_GEST_ACCENTRATA_INT, 0) +
                                        Nvl(aDett.IM_SPESE_GEST_ACCENTRATA_EST, 0);
Elsif CDR_ACCENTRATORE_CLAS Is Not Null And CDR_ACCENTRATORE_CLAS != aDett.CD_CDR_ASSEGNATARIO Then
    aNuovoSaldo.IM_STANZ_INIZIALE_A1 := Nvl(aDett.IM_SPESE_GEST_DECENTRATA_INT, 0) +
                                        Nvl(aDett.IM_SPESE_GEST_DECENTRATA_EST, 0);
End If;

/* fine pezzo aggiunto il 09.02.2006 alle 19.33 per test dopo 037 */

                    aNuovoSaldo.IM_STANZ_INIZIALE_A2      := 0;
                    aNuovoSaldo.IM_STANZ_INIZIALE_A3      := 0;
                    aNuovoSaldo.VARIAZIONI_PIU            := 0;
                    aNuovoSaldo.VARIAZIONI_MENO           := 0;
                    aNuovoSaldo.IM_STANZ_INIZIALE_CASSA   := aDett.IM_PAGAMENTI;
                    aNuovoSaldo.VARIAZIONI_PIU_CASSA      := 0;
                    aNuovoSaldo.VARIAZIONI_MENO_CASSA     := 0;
                    aNuovoSaldo.IM_OBBL_ACC_COMP          := 0;
                    aNuovoSaldo.IM_STANZ_RES_IMPROPRIO    := 0;
                    aNuovoSaldo.VAR_PIU_STANZ_RES_IMP     := 0;
                    aNuovoSaldo.VAR_MENO_STANZ_RES_IMP    := 0;
                    aNuovoSaldo.IM_OBBL_RES_IMP           := 0;
                    aNuovoSaldo.VAR_PIU_OBBL_RES_IMP      := 0;
                    aNuovoSaldo.VAR_MENO_OBBL_RES_IMP     := 0;
                    aNuovoSaldo.IM_OBBL_RES_PRO           := 0;
                    aNuovoSaldo.VAR_PIU_OBBL_RES_PRO      := 0;
                    aNuovoSaldo.VAR_MENO_OBBL_RES_PRO     := 0;
                    aNuovoSaldo.IM_MANDATI_REVERSALI_PRO  := 0;
                    aNuovoSaldo.IM_MANDATI_REVERSALI_IMP  := 0;
                    aNuovoSaldo.IM_PAGAMENTI_INCASSI      := 0;
                    aNuovoSaldo.DACR                      := aTSNow;
                    aNuovoSaldo.UTCR                      := aUser;
                    aNuovoSaldo.DUVA                      := aTSNow;
                    aNuovoSaldo.UTUV                      := aUser;
                    aNuovoSaldo.PG_VER_REC                := 1;

                    CNRCTB054.crea_aggiorna_saldi (aNuovoSaldo, '053.creasaldicdrlineavocedagest 2', 'N');


                    If nvl(recParametriCnr.fl_nuovo_pdg,'N')!='Y' Then
                      --Aggiorno la tabella VOCE_F_SALDI_CMP
                      Declare
                        aSaldoCmp                 Voce_f_saldi_cmp%Rowtype;
                        CdsAssegnatario           unita_organizzativa.cd_unita_organizzativa%Type;
                      Begin
                        -- Recupero il CDS del CDR da aggiornare
                        CdsAssegnatario := CNRUTL001.GETCDSFROMCDR(aNuovoSaldo.CD_CENTRO_RESPONSABILITA);

                        Select * into aSaldoCmp from voce_f_saldi_cmp
                        Where CD_CDS = CdsAssegnatario
                        And   ESERCIZIO = aNuovoSaldo.ESERCIZIO
                        And   TI_APPARTENENZA=aNuovoSaldo.TI_APPARTENENZA
                        And   TI_GESTIONE=aNuovoSaldo.TI_GESTIONE
                        And   CD_VOCE=aNuovoSaldo.CD_VOCE
                        And   TI_COMPETENZA_RESIDUO=CNRCTB054.TI_COMPETENZA
                        For update nowait;

                        CNRCTB054.aggiornaStanziamentoResidui(aSaldoCmp,aNuovoSaldo.IM_STANZ_INIZIALE_A1,aUser,aTSNow);
                      Exception when NO_DATA_FOUND then
                        IBMERR001.RAISE_ERR_GENERICO('Capitolo finanziario non trovato:'||aNuovoSaldo.CD_VOCE);
                      End;
                    End If;

                  -- verifico che il livello utilizzato nel decisionale parte spese non sia il capitolo per aggiornare i limiti di spesa
                    if  livello_pgd_dec_spe!= livello_clas_spe then
                      -- Aggiornamento Limite spesa
                          aggiornaLimiteSpesa(aElVoce,aNuovoSaldo,aUser);
                    end if;
    end loop;
End;

 Procedure ribaltaSuAreaPDGVar(
  aEsercizio number,
  aCdCentroResponsabilita varchar2,
  aUser VARCHAR2,
  aEsVar NUMBER Default Null,
  aNumVar NUMBER Default Null
 ) is
  aCDRPrimo cdr%rowtype;
  aCDR cdr%rowtype;
  aCDRArea cdr%rowtype;
  aUOCDS unita_organizzativa%rowtype;
  aTSNow date;
  aEVCollegato elemento_voce%rowtype;
  aPDG pdg_preventivo%rowtype;
   recParametriCNR PARAMETRI_CNR%Rowtype;
 begin
  recParametriCNR := CNRUTL001.getRecParametriCnr(aEsercizio);

  If recParametriCNR.esercizio is null Then
     IBMERR001.RAISE_ERR_GENERICO('Parametri CNR per l''esercizio '||aEsercizio||' inesistenti!');
  End If;

  -- Verifica che il CDR non sia un CDR di AREA, in tal caso termina subito

  aCDRPrimo:=CNRCTB020.GETCDRVALIDO(aEsercizio,aCdCentroResponsabilita);

  aUOCDS:=CNRCTB020.GETUOCDS(aCDRPrimo);

  if aUOCDS.cd_tipo_unita = CNRCTB020.TIPO_AREA then
   return;
  end if;

  if aCDRPrimo.livello <> 1 then
   IBMERR001.RAISE_ERR_GENERICO('CDR non di primo livello!');
  end if;

  -- Verifica che il BILANCIO finanziario dell'ente sia stato approvato

  if CNRCTB054.isBilancioCnrApprovato(aEsercizio) = 'N' then
   IBMERR001.RAISE_ERR_GENERICO('Bilancio preventivo CNR non ancora approvato!');
  end if;

  if CNRCTB020.ISCDRENTE(aCDRPrimo) then
   IBMERR001.RAISE_ERR_GENERICO('Il CDR '||aCdCentroResponsabilita||' è un CDR ENTE!');
  end if;

  aTSNow:=sysdate;

  CNRCTB050.lockPdg(aEsercizio, aCDRPrimo.cd_centro_responsabilita);

  if not (CNRCTB050.getStato(aEsercizio, aCDRPrimo.cd_centro_responsabilita)=CNRCTB050.STATO_PDG_FINALE) then
   IBMERR001.raise_err_generico('Il piano di gestione di primo livello non è in stato definitivo!');
  end if;


  -- Da qui in poi comincia la vera operazione di ribaltamento che va ripetuta su tutti i CDR figli
  -- del CDR di primo livello considerato

  for aPDG in CNRCTB055.TUTTI_PDG_LINEA(aEsercizio, aCDRPrimo) loop

   CNRCTB050.lockPdg(aEsercizio, aPDG.cd_centro_responsabilita);

   select * into aCDR from cdr where
    cd_centro_responsabilita = aPDG.cd_centro_responsabilita;

   -- estraggo l'area

   aCDRArea:=CNRCTB020.getCDRArea(aCDR);

   -- se l'area non viene trovata non c'è niente da ribaltare
   if aCDRArea.cd_centro_responsabilita is not null then

    CNRCTB050.lockPdg(aEsercizio, aCDRArea.cd_centro_responsabilita);

    -- Estraggo il conto di ricavo figurativo collegato

  aEVCollegato:=CNRCTB000.GETVOCERICFIGALTROCDR(aEsercizio);

    -- Ciclo sui dettagli del PDG con natura 5
    If (aEsVar Is Not Null And aNumVar Is Not Null) Then
            for aDett in CNRCTB050.DETTAGLI_PDG_NATURA_5_VAR(aEsercizio, aCDR.cd_centro_responsabilita,aEsVar,aNumVar) loop
           ribaltaSuAreaPDGInt(
              aEsercizio,
              aCdCentroResponsabilita,
              aCDR,
              aCDRArea,
              aEVCollegato,
              aDett,
              recParametriCNR,
              aTSNow,
              aUser
             );
            end loop;

    Else
            for aDett in CNRCTB050.DETTAGLI_PDG_NATURA_5(aEsercizio, aCDR.cd_centro_responsabilita) loop
           ribaltaSuAreaPDGInt(
              aEsercizio,
              aCdCentroResponsabilita,
              aCDR,
              aCDRArea,
              aEVCollegato,
              aDett,
              recParametriCNR,
              aTSNow,
              aUser
             );
            end loop;
    End If;
   end if;
  end loop;
 end;

-- 28.04.2006 genera la variazione di bilancio ente da variazione al pdg approvata

Procedure genera_varente_da_Var_pdg (aEsercizio         NUMBER,
                                     aPG_VARIAZIONE     NUMBER,
                                     aUser              VARCHAR2,
                                     cds_var_bil    Out VARCHAR2,
                                     es_var_bil     Out NUMBER,
                                     ti_app_var_bil Out CHAR,
                                     pg_var_bil     Out NUMBER) Is

  aVar                  var_bilancio%rowtype;
  aVarDet               var_bilancio_det%rowtype;
  aTotVar               number(15,2);
  aOldVoceAgg           varchar2(30);
  aVoceF                voce_f%rowtype;
  aPgVar                number(10);
  aTSNow                DATE;
  TESTATA_CREATA        CHAR(1);
  aSaldoCdrLinea        voce_f_saldi_cdr_linea%Rowtype;
  aVAR_PDG              PDG_VARIAZIONE%Rowtype;
  aPdgVariazioneRigaEnte	PDG_VARIAZIONE_RIGA_GEST%Rowtype;
  variazione_da_fare    NUMBER;
  TIPO                  VAR_BILANCIO.TI_VARIAZIONE%Type;
  CAUSALE               VAR_BILANCIO.CD_CAUSALE_VAR_BILANCIO%Type;
  aVAR_TIPO             TIPO_VARIAZIONE%Rowtype;
  recParametriCNR       PARAMETRI_CNR%Rowtype;
  aAssPdgVariazioneCdrEnte    ass_pdg_variazione_cdr%Rowtype;
  ultima_riga          number:=0;
  aTotVarEnte               number(15,2);
Begin
				 Begin
	 		    Select  *
				    Into    aVAR_PDG
				    From    PDG_VARIAZIONE
				    Where   ESERCIZIO      = aEsercizio And
				            PG_VARIAZIONE_PDG  = aPG_Variazione;
				 Exception
			     When No_Data_Found Then
			        IBMERR001.RAISE_ERR_GENERICO('Attenzione !!! Non esiste la Variazione al PdG '||aEsercizio||'/'||aPG_VARIAZIONE);
			   End;

			   Begin
			    Select  *
			    Into    aVAR_TIPO
			    From    TIPO_VARIAZIONE
			    Where   ESERCIZIO      = aEsercizio And
			            CD_TIPO_VARIAZIONE  = aVAR_PDG.Tipologia;
			   Exception
			     When No_Data_Found Then
			        IBMERR001.RAISE_ERR_GENERICO('Attenzione !!! Non esiste la Tipologia '||aVAR_PDG.Tipologia||
			                                     ' indicata sulla Variazione '||aEsercizio||'/'||aPG_VARIAZIONE);
			   End;
			   aTSNow := sysdate;
   	recParametriCNR := CNRUTL001.getRecParametriCnr(aEsercizio);
   --27/11/2015: RafPag: Se è attiva la nuova gestione esco perchè non deve essere più creata
   --la variazione a livello Ente
   If recParametriCNR.fl_nuovo_pdg='Y' Then

   -- Rospuc 12/05/2017 inserimento automatico dettaglio variazione ente per le variazioni di prelievo o restituzione al fondo
	   		if aVAR_TIPO.TI_TIPO_VARIAZIONE In (CNRCTB054.TI_VARPDG_PRELIEVO_FONDI, CNRCTB054.TI_VARPDG_RESTITUZIONE_FONDI) Then
					Select  Sum(Nvl(IM_SPESE_GEST_DECENTRATA_INT, 0) + Nvl(IM_SPESE_GEST_DECENTRATA_EST, 0) +
                      Nvl(IM_SPESE_GEST_ACCENTRATA_INT, 0) + Nvl(IM_SPESE_GEST_ACCENTRATA_EST, 0)),max(PG_RIGA)
                         		into aTotVar, ultima_riga
                            From   PDG_VARIAZIONE_RIGA_GEST
				    Where   ESERCIZIO      = aEsercizio And
				            PG_VARIAZIONE_PDG  = aPG_Variazione and
				            categoria_dettaglio!='SCR';


				           if aTotVar > 0 then
									  	aTotVarEnte :=-aTotVar;
									  else
									  	aTotVarEnte :=abs(aTotVar);
									 end if;
									   --Riga CDR ente
								    aAssPdgVariazioneCdrEnte.ESERCIZIO:=aEsercizio;
								    aAssPdgVariazioneCdrEnte.PG_VARIAZIONE_PDG := aPG_Variazione;
								    aAssPdgVariazioneCdrEnte.CD_CENTRO_RESPONSABILITA:= cnrctb020.getcdcdrente;
								    aAssPdgVariazioneCdrEnte.IM_ENTRATA := 0;
								    aAssPdgVariazioneCdrEnte.IM_SPESA := aTotVarEnte;
								    aAssPdgVariazioneCdrEnte.DACR:=aTSNow;
								    aAssPdgVariazioneCdrEnte.UTCR:=aUser;
								    aAssPdgVariazioneCdrEnte.DUVA:=aTSNow;
								    aAssPdgVariazioneCdrEnte.UTUV:=aUser;
								    aAssPdgVariazioneCdrEnte.PG_VER_REC:=1;

				           CNRCTB050.ins_ASS_PDG_VARIAZIONE_CDR(aAssPdgVariazioneCdrEnte);

									 aPdgVariazioneRigaEnte.ESERCIZIO := aEsercizio;
							     aPdgVariazioneRigaEnte.PG_VARIAZIONE_PDG := aPG_Variazione;
							     aPdgVariazioneRigaEnte.PG_RIGA := ultima_riga+1;
							     aPdgVariazioneRigaEnte.CD_CDR_ASSEGNATARIO :=  cnrctb020.getcdcdrente;
							     aPdgVariazioneRigaEnte.CD_LINEA_ATTIVITA := CNRCTB015.getVal02PerChiave(0, 'LINEA_ATTIVITA_SPECIALE',  'LINEA_ATTIVITA_SPESA_ENTE');
							     aPdgVariazioneRigaEnte.CD_CDS_AREA := CNRUTL001.GETCDSFROMCDR(cnrctb020.getcdcdrente);
							     aPdgVariazioneRigaEnte.TI_APPARTENENZA := aVAR_PDG.TI_APPARTENENZA;
							     aPdgVariazioneRigaEnte.TI_GESTIONE := aVAR_PDG.TI_GESTIONE;
							     aPdgVariazioneRigaEnte.CD_ELEMENTO_VOCE := aVAR_PDG.CD_ELEMENTO_VOCE;
							     aPdgVariazioneRigaEnte.DT_REGISTRAZIONE := trunc(aTSNow);
							     aPdgVariazioneRigaEnte.CATEGORIA_DETTAGLIO := 'DIR';
							     aPdgVariazioneRigaEnte.DESCRIZIONE := 'Dettaglio automatico';
							     aPdgVariazioneRigaEnte.IM_SPESE_GEST_DECENTRATA_INT := aTotVarEnte;
							     aPdgVariazioneRigaEnte.IM_SPESE_GEST_DECENTRATA_EST := 0;
							     aPdgVariazioneRigaEnte.IM_SPESE_GEST_ACCENTRATA_INT := 0;
							     aPdgVariazioneRigaEnte.IM_SPESE_GEST_ACCENTRATA_EST := 0;
							     aPdgVariazioneRigaEnte.IM_ENTRATA := 0;
							     aPdgVariazioneRigaEnte.FL_VISTO_DIP_VARIAZIONI := 'N';
							     aPdgVariazioneRigaEnte.DACR:=aTSNow;
							     aPdgVariazioneRigaEnte.UTCR:=aUser;
							     aPdgVariazioneRigaEnte.DUVA:=aTSNow;
							     aPdgVariazioneRigaEnte.UTUV:=aUser;
							     aPdgVariazioneRigaEnte.PG_VER_REC:=1;

						     	CNRCTB051.ins_PDG_VARIAZIONE_RIGA_GEST(aPdgVariazioneRigaEnte);

						      begin
						          Select * Into aSaldoCdrLinea
       								From voce_f_saldi_cdr_linea
								       Where esercizio = aEsercizio
								       And   esercizio_res = aEsercizio
								       And   cd_centro_responsabilita = aPdgVariazioneRigaEnte.CD_CDR_ASSEGNATARIO
								       And   cd_linea_attivita = aPdgVariazioneRigaEnte.CD_LINEA_ATTIVITA
								       And   ti_appartenenza = aPdgVariazioneRigaEnte.TI_APPARTENENZA
								       And   ti_gestione = aPdgVariazioneRigaEnte.TI_GESTIONE
								       And   cd_elemento_voce = aPdgVariazioneRigaEnte.CD_ELEMENTO_VOCE;
								  exception when no_data_found then
								        IBMERR001.RAISE_ERR_GENERICO('Saldo iniziale Fondo Mancante ');
                  End;

									if(aTotVarEnte > 0 )then
									 Update voce_f_saldi_cdr_linea
						       Set VARIAZIONI_PIU = VARIAZIONI_PIU + Abs(aTotVarEnte),
						       			DUVA=aTSNow,
							          UTUV=aUser,
							     			PG_VER_REC=PG_VER_REC+1
						       Where
						       			esercizio = aSaldoCdrLinea.esercizio
						       And   esercizio_res = aSaldoCdrLinea.esercizio_res
						       And   cd_centro_responsabilita = aSaldoCdrLinea.CD_CENTRO_RESPONSABILITA
						       And   cd_linea_attivita = aSaldoCdrLinea.CD_LINEA_ATTIVITA
						       And   ti_appartenenza = aSaldoCdrLinea.TI_APPARTENENZA
						       And   ti_gestione = aSaldoCdrLinea.TI_GESTIONE
						       And   cd_elemento_voce = aSaldoCdrLinea.CD_ELEMENTO_VOCE
						       And   cd_voce = aSaldoCdrLinea.CD_VOCE;
									else
						       Update voce_f_saldi_cdr_linea
						       Set VARIAZIONI_MENO = VARIAZIONI_MENO + Abs(aTotVarEnte),
						       			DUVA=aTSNow,
							          UTUV=aUser,
							     			PG_VER_REC=PG_VER_REC+1
						       where
						      			esercizio = aSaldoCdrLinea.esercizio
						       And   esercizio_res = aSaldoCdrLinea.esercizio_res
						       And   cd_centro_responsabilita = aSaldoCdrLinea.CD_CENTRO_RESPONSABILITA
						       And   cd_linea_attivita = aSaldoCdrLinea.CD_LINEA_ATTIVITA
						       And   ti_appartenenza = aSaldoCdrLinea.TI_APPARTENENZA
						       And   ti_gestione = aSaldoCdrLinea.TI_GESTIONE
						       And   cd_elemento_voce = aSaldoCdrLinea.CD_ELEMENTO_VOCE
						       And   cd_voce = aSaldoCdrLinea.CD_VOCE;
									End if;

									return;
				   else
	     				return;
	     		end if;
     End If;

Begin
  Select 1
  Into   variazione_da_fare
  From   V_VAR_PDG_VOCE_CNR
  Where  ESERCIZIO = aVAR_PDG.ESERCIZIO And
         PG_VARIAZIONE_PDG = aVAR_PDG.PG_VARIAZIONE_PDG And
         CATEGORIA_DETTAGLIO In ('DIR', 'STI')
  Group By CD_VOCE_CNR
  Having Sum(Nvl(IM_SPESE_GEST_DECENTRATA_INT, 0) + Nvl(IM_SPESE_GEST_DECENTRATA_EST, 0) + Nvl(IM_SPESE_GEST_ACCENTRATA_INT, 0) +
             Nvl(IM_SPESE_GEST_ACCENTRATA_EST, 0)) != 0;
Exception
  When No_Data_Found Then
        variazione_da_fare := 0; -- la variazione al PDG non necessita di variazione al bilancio
  When Too_Many_Rows Then
        variazione_da_fare := 1;
End;

--------- LOOP SULLA VARIAZIONE AL PDG


If variazione_da_fare = 1 Then
-- DEVO CAPIRE CHE COS'E' DALLA TESTATA DELLA VARIZIONE AL PDG PER DARE IL GIUSTO ATTRIBUTO ALLA TESTATA DELLA VARIAZIONE AL BILANCIO

If aVAR_TIPO.TI_TIPO_VARIAZIONE In (CNRCTB054.TI_VARPDG_STORNO_S_IST_DIVERSI, CNRCTB054.TI_VARPDG_STORNO_S_STESSO_IST) Then
        TIPO := CNRCTB054.TI_VAR_STORNO_S;
        CAUSALE := CNRCTB054.CAU_VAR_STO_S_PDG;
Elsif aVAR_TIPO.TI_TIPO_VARIAZIONE In (CNRCTB054.TI_VARPDG_VAR_POS_STESSO_IST,  CNRCTB054.TI_VARPDG_VAR_NEG_STESSO_IST,
                                       CNRCTB054.TI_VARPDG_VAR_POS_IST_DIVERSI, CNRCTB054.TI_VARPDG_VAR_NEG_IST_DIVERSI) Then
        TIPO := CNRCTB054.TI_VAR_QUAD;
        CAUSALE := CNRCTB054.CAU_ECO_VAR_PDG;
Elsif aVAR_TIPO.TI_TIPO_VARIAZIONE In (CNRCTB054.TI_VARPDG_PRELIEVO_FONDI, CNRCTB054.TI_VARPDG_RESTITUZIONE_FONDI,
                                       CNRCTB054.TI_VARPDG_VAR_POS_FONDI, CNRCTB054.TI_VARPDG_VAR_NEG_FONDI) Then
        TIPO := CNRCTB054.TI_VAR_PREL_FON;
        CAUSALE := CNRCTB054.CAU_PREL_FON;
Else
        IBMERR001.RAISE_ERR_GENERICO('Attenzione !!! Tipologia della Variazione al PdG non coerente con le Variazioni di bilancio ('||aVAR_TIPO.TI_TIPO_VARIAZIONE||')');
End If;


For VAR_PDG_RAGGRUPPATE In (Select CD_VOCE_CNR, Sum(Nvl(IM_SPESE_GEST_DECENTRATA_INT, 0) + Nvl(IM_SPESE_GEST_DECENTRATA_EST, 0) +
                                                    Nvl(IM_SPESE_GEST_ACCENTRATA_INT, 0) + Nvl(IM_SPESE_GEST_ACCENTRATA_EST, 0)) TOT_VAR_ENTE
                            From   V_VAR_PDG_VOCE_CNR
                            Where  ESERCIZIO = aVAR_PDG.ESERCIZIO And
                                   PG_VARIAZIONE_PDG = aVAR_PDG.PG_VARIAZIONE_PDG And
                                   CATEGORIA_DETTAGLIO In ('DIR', 'STI')
                            Group By CD_VOCE_CNR
                            Having Sum(Nvl(IM_SPESE_GEST_DECENTRATA_INT, 0) + Nvl(IM_SPESE_GEST_DECENTRATA_EST, 0) +
                                       Nvl(IM_SPESE_GEST_ACCENTRATA_INT, 0) + Nvl(IM_SPESE_GEST_ACCENTRATA_EST, 0)) != 0) Loop


--------------------------- FASE FINALE, CREAZIONE DELLA VARIAZIONE ------------------------

-- Creo una variazione di bilancio con n dettagli corrispondenti ai dati raggruppati della variazione al PDG

  If Nvl(TESTATA_CREATA, 'N') = 'N' Then -- PER CREARE UNA SOLA TESTATA PER OGNI VARIAZIONE
    aPgVar := CNRCTB055.getPgVariazione(aVAR_PDG.ESERCIZIO, CNRCTB020.GETCDCDSENTE (aVAR_PDG.ESERCIZIO));
    -- Creo la TESTATA DELLA variazione
    aVar.CD_CDS           := CNRCTB020.GETCDCDSENTE (aVAR_PDG.ESERCIZIO);
    aVar.ESERCIZIO        := aVAR_PDG.ESERCIZIO;
    aVar.ESERCIZIO_IMPORTI:= aVAR_PDG.ESERCIZIO;
    aVar.TI_APPARTENENZA  := CNRCTB001.APPARTENENZA_CNR;
    aVar.PG_VARIAZIONE    := aPgVar;
    aVar.DS_VARIAZIONE    := 'Variazione Automatica per approvazione Variazione al PDG n. '||aVAR_PDG.ESERCIZIO||'/'||aVAR_PDG.PG_VARIAZIONE_PDG;
    aVar.DS_DELIBERA      := null;
    aVar.TI_VARIAZIONE    := TIPO;
    aVar.CD_CAUSALE_VAR_BILANCIO := CAUSALE;
    aVar.STATO            := CNRCTB054.STATO_VARIAZIONE_PROVVISORIA;
    aVar.DUVA             := aTSNow;
    aVar.UTUV             := aUser;
    aVar.DACR             := aTSNow;
    aVar.UTCR             := aUser;
    aVar.PG_VER_REC       := 1;
    aVar.ESERCIZIO_PDG_VARIAZIONE := aEsercizio;
    aVar.PG_VARIAZIONE_PDG := aPG_VARIAZIONE;
    CNRCTB054.INS_VAR_BILANCIO(aVar);
    TESTATA_CREATA := 'Y';
  End If;

-- inserita la testata occorre inserire le righe

     aVarDet := null;

     aVarDet.CD_CDS             := aVar.cd_cds;
     aVarDet.ESERCIZIO          := aVar.esercizio;
     aVarDet.TI_APPARTENENZA    := aVar.ti_appartenenza;
     aVarDet.PG_VARIAZIONE      := aVar.pg_variazione;
     aVarDet.TI_GESTIONE        := CNRCTB001.GESTIONE_SPESE;
     aVarDet.CD_VOCE            := VAR_PDG_RAGGRUPPATE.CD_VOCE_CNR;
     aVarDet.IM_VARIAZIONE      := VAR_PDG_RAGGRUPPATE.TOT_VAR_ENTE;
     aVarDet.DUVA               := aTSNow;
     aVarDet.UTUV               := aUser;
     aVarDet.DACR               := aTSNow;
     aVarDet.UTCR               := aUser;
     aVarDet.PG_VER_REC         := 1;

--Dbms_Output.put_line (aVar.cd_cds||' '||aVar.esercizio||' '||aVar.ti_appartenenza||' '||aVar.pg_variazione||' '||CNRCTB001.GESTIONE_SPESE||' '||VAR_STANZ_RAGGRUPPATE.CD_VOCE_CNR);

     CNRCTB054.INS_VAR_BILANCIO_DET(aVarDet);
     aTotVar := nvl(aTotVar, 0) + aVarDet.IM_VARIAZIONE;

-- NON OCCORRE AGGIORNARE I SALDI PER CDR/LINEA

End Loop;

  If (aVAR_TIPO.TI_TIPO_VARIAZIONE = CNRCTB054.TI_VARPDG_PRELIEVO_FONDI Or
      aVAR_TIPO.TI_TIPO_VARIAZIONE = CNRCTB054.TI_VARPDG_RESTITUZIONE_FONDI) AND NVL(aTotVar, 0) != 0 Then
     aVarDet := null;

     aVarDet.CD_CDS             := aVar.cd_cds;
     aVarDet.ESERCIZIO          := aVar.esercizio;
     aVarDet.TI_APPARTENENZA    := aVar.ti_appartenenza;
     aVarDet.PG_VARIAZIONE      := aVar.pg_variazione;
     aVarDet.TI_GESTIONE        := CNRCTB001.GESTIONE_SPESE;
     aVarDet.CD_VOCE            := aVAR_PDG.CD_ELEMENTO_VOCE;
     aVarDet.IM_VARIAZIONE      := -aTotVar;
     aVarDet.DUVA               := aTSNow;
     aVarDet.UTUV               := aUser;
     aVarDet.DACR               := aTSNow;
     aVarDet.UTCR               := aUser;
     aVarDet.PG_VER_REC         := 1;

     CNRCTB054.INS_VAR_BILANCIO_DET(aVarDet);
  End If;
Else
  If aVAR_TIPO.TI_TIPO_VARIAZIONE In (CNRCTB054.TI_VARPDG_VAR_POS_FONDI, CNRCTB054.TI_VARPDG_VAR_NEG_FONDI) Then
     Select Nvl(Sum(IM_ENTRATA), 0)
     Into aTotVar
     From Pdg_variazione_riga_gest
     Where esercizio = aVAR_PDG.esercizio
     And   pg_variazione_pdg = aVAR_PDG.pg_variazione_pdg
     And   ti_gestione = CNRCTB001.GESTIONE_ENTRATE;

     If aTotVar != 0 Then
        aPgVar := CNRCTB055.getPgVariazione(aVAR_PDG.ESERCIZIO, CNRCTB020.GETCDCDSENTE (aVAR_PDG.ESERCIZIO));
        -- Creo la TESTATA DELLA variazione
        aVar.CD_CDS           := CNRCTB020.GETCDCDSENTE (aVAR_PDG.ESERCIZIO);
        aVar.ESERCIZIO        := aVAR_PDG.ESERCIZIO;
        aVar.ESERCIZIO_IMPORTI:= aVAR_PDG.ESERCIZIO;
        aVar.TI_APPARTENENZA  := CNRCTB001.APPARTENENZA_CNR;
        aVar.PG_VARIAZIONE    := aPgVar;
        aVar.DS_VARIAZIONE    := 'Variazione Automatica per approvazione Variazione al PDG n. '||aVAR_PDG.ESERCIZIO||'/'||aVAR_PDG.PG_VARIAZIONE_PDG;
        aVar.DS_DELIBERA      := null;
        aVar.TI_VARIAZIONE    := CNRCTB054.TI_VAR_PREL_FON;
        aVar.CD_CAUSALE_VAR_BILANCIO := CNRCTB054.CAU_PREL_FON;
        aVar.STATO            := CNRCTB054.STATO_VARIAZIONE_PROVVISORIA;
        aVar.DUVA             := aTSNow;
        aVar.UTUV             := aUser;
        aVar.DACR             := aTSNow;
        aVar.UTCR             := aUser;
        aVar.PG_VER_REC       := 1;
        aVar.ESERCIZIO_PDG_VARIAZIONE := aEsercizio;
        aVar.PG_VARIAZIONE_PDG := aPG_VARIAZIONE;
        CNRCTB054.INS_VAR_BILANCIO(aVar);

        -- Creo il DETTAGLIO DELLA variazione
        aVarDet := null;

        aVarDet.CD_CDS             := aVar.cd_cds;
        aVarDet.ESERCIZIO          := aVar.esercizio;
        aVarDet.TI_APPARTENENZA    := aVar.ti_appartenenza;
        aVarDet.PG_VARIAZIONE      := aVar.pg_variazione;
        aVarDet.TI_GESTIONE        := CNRCTB001.GESTIONE_SPESE;
        aVarDet.CD_VOCE            := aVAR_PDG.CD_ELEMENTO_VOCE;
        aVarDet.IM_VARIAZIONE      := aTotVar;
        aVarDet.DUVA               := aTSNow;
        aVarDet.UTUV               := aUser;
        aVarDet.DACR               := aTSNow;
        aVarDet.UTCR               := aUser;
        aVarDet.PG_VER_REC         := 1;

        CNRCTB054.INS_VAR_BILANCIO_DET(aVarDet);
     End If;
  End If;
End If;

cds_var_bil    := aVar.cd_cds;
es_var_bil     := aVar.esercizio;
ti_app_var_bil := aVar.ti_appartenenza;
pg_var_bil     := aVar.pg_variazione;

End;

Procedure setdavistaredip (aEsercizio         pdg_variazione.esercizio%Type,
                           aPg_variazione_pdg pdg_variazione.pg_variazione_pdg%Type) Is
  rec_varpdg   pdg_variazione%Rowtype;
Begin
  Select * Into rec_varpdg
  From pdg_variazione
  Where esercizio = aEsercizio
  And   pg_variazione_pdg = aPg_variazione_pdg;

  setdavistaredip(rec_varpdg);
Exception
When Others Then Null;
End;

Procedure setdavistaredip (apdg_variazione pdg_variazione%Rowtype) is

GESTIONE_VISTO          CHAR(1);
SOGLIA                  NUMBER(15,2);
VISTO_PER_SALDO_MODULO  CHAR(1);
VISTO_PER_CLASS         CHAR(1);
CLASS_VISTO             NUMBER;
TOT_VARIAZIONE          NUMBER;
aTipoUnita              UNITA_ORGANIZZATIVA.cd_tipo_unita%Type;

Begin

-- METTO TUTTE LE RIGHE A "VISTATE" APPENA ENTRO, TANTO POI O NON C'E' GESTIONE O IN ASSENZA DI QUALSIASI ALTRO REQUISITO
-- E' CORRETTO CHE SIA COSI'.
-- LE RIGHE VENGONO MESSE A "DA VISTARE" SOLO NEI CASI IN CUI COSI' DEBBA ESSERE.

Update  pdg_variazione_riga_gest
Set     FL_VISTO_DIP_VARIAZIONI = 'Y'
Where   ESERCIZIO          = apdg_variazione.ESERCIZIO And
        PG_VARIAZIONE_PDG  = apdg_variazione.PG_VARIAZIONE_PDG;

Select  Nvl(FL_VISTO_DIP_VARIAZIONI, 'N'), Nvl(IMPORTO_MIN_VISTO_DIP, 0)
Into    GESTIONE_VISTO, SOGLIA
From    PARAMETRI_CNR
Where   ESERCIZIO = apdg_variazione.ESERCIZIO;

If GESTIONE_VISTO = 'Y' Then   -- SE C'E' GESTIONE VISTO IMPOSTO LE SINGOLE RIGHE DA VISTARE OPPURE NO A SECONDA DELLE NECESSITA'

   -- ESTRAGGO IL TOTALE COMPLESSIVO DELLA VARIAZIONE

   Select  Max(ABS_TOT_VARIAZIONE)
   Into    TOT_VARIAZIONE
   From    V_CONS_VAR_PDGG
   Where   ESERCIZIO          = apdg_variazione.ESERCIZIO And
           PG_VARIAZIONE_PDG  = apdg_variazione.PG_VARIAZIONE_PDG;

   -- ESTRAGGO I DUE TIPI DI CONTROLLI:

      -- PER SALDO MODULO DIVERSO DA ZERO;
      -- PER ID CLASSIFICAZIONE

   Select Nvl(FL_VISTO_DIP_SALDO_MODULO, 'N'), Nvl(FL_VISTO_DIP_CLASSIFICAZIONE, 'N')
   Into   VISTO_PER_SALDO_MODULO, VISTO_PER_CLASS
   From   TIPO_VARIAZIONE
   Where  ESERCIZIO = apdg_variazione.ESERCIZIO And
          CD_TIPO_VARIAZIONE = apdg_variazione.TIPOLOGIA;

   If VISTO_PER_SALDO_MODULO = 'N' Then

      -- SE E' PREVISTO IL VISTO PER CLASSIFICAZIONE E L'IMPORTO COMPLESSIVO SFONDA LA SOGLIA

      If VISTO_PER_CLASS = 'Y' And TOT_VARIAZIONE >= SOGLIA Then

           -- VEDO SE LA VARIAZIONE CONTIENE UNA CLASSIFICAZIONE CHE PREVEDE IL VISTO

                Select Count(0)
                Into   CLASS_VISTO
                From   V_CONS_VAR_PDGG V, CLASSIFICAZIONE_VOCI CV
                Where  V.ESERCIZIO          = apdg_variazione.ESERCIZIO And
                       V.PG_VARIAZIONE_PDG  = apdg_variazione.PG_VARIAZIONE_PDG And
                       V.ID_CLASSIFICAZIONE = CV.ID_CLASSIFICAZIONE And
                       CV.FL_VISTO_DIP_VARIAZIONI = 'Y';

                If CLASS_VISTO > 0 Then

                      For DETT_VARIAZIONE In (Select ESERCIZIO, PG_VARIAZIONE_PDG, PG_RIGA, CD_CDR_ASSEGNATARIO
                                              From   V_CONS_VAR_PDGG
                                              Where  ESERCIZIO          = apdg_variazione.ESERCIZIO And
                                                     PG_VARIAZIONE_PDG  = apdg_variazione.PG_VARIAZIONE_PDG) Loop


                        Begin
                    Select cd_tipo_unita
                    Into   aTipoUnita
                    From   unita_organizzativa
                    Where  cd_unita_organizzativa = CNRCTB020.getCDUO (DETT_VARIAZIONE.CD_CDR_ASSEGNATARIO);
                  Exception
                    When No_Data_Found Then
                       IBMERR001.RAISE_ERR_GENERICO('UO: '||CNRCTB020.getCDUO (DETT_VARIAZIONE.CD_CDR_ASSEGNATARIO)||' inesistente.');
                  End;

                  -- Caso CDS SAC
                  If aTipoUnita != CNRCTB020.TIPO_SAC Then
                                   -- E POI METTO A "DA VISTARE" SOLO QUELLE CHE LO SONO (le righe della SAC SI AUTOVISTANO)

                                   Update pdg_variazione_riga_gest
                                   Set    FL_VISTO_DIP_VARIAZIONI = 'N'
                                   Where  ESERCIZIO          = DETT_VARIAZIONE.ESERCIZIO And
                                          PG_VARIAZIONE_PDG  = DETT_VARIAZIONE.PG_VARIAZIONE_PDG And
                                          PG_RIGA            = DETT_VARIAZIONE.PG_RIGA;
                        End If;

                      End Loop;

                End If;  -- SE CONTIENE CLASSIFICAZIONI CHE PREVEDONO IL VISTO

      End If;   -- SE IL TOTALE DELLA VARIAZIONE SUPERA LA SOGLIA MINIMA PREVISTA ED E' PREVISTO IL VISTO PER CLASSIFICAZIONE

  Elsif VISTO_PER_SALDO_MODULO = 'Y' Then

      For MODULI_NON_PAREGGIATI In
          (Select pg_modulo,
                  Sum(IM_SPESE_GEST_DECENTRATA_INT) + Sum(IM_SPESE_GEST_DECENTRATA_EST) +
                  Sum(IM_SPESE_GEST_ACCENTRATA_INT) + Sum(IM_SPESE_GEST_ACCENTRATA_EST) saldo_spe,
                  Sum(IM_ENTRATA) saldo_ent
           From   V_CONS_VAR_PDGG
           Where  ESERCIZIO          = apdg_variazione.ESERCIZIO And
                  PG_VARIAZIONE_PDG  = apdg_variazione.PG_VARIAZIONE_PDG
           Group By pg_modulo
           Having Sum(IM_SPESE_GEST_DECENTRATA_INT) + Sum(IM_SPESE_GEST_DECENTRATA_EST) +
                  Sum(IM_SPESE_GEST_ACCENTRATA_INT) + Sum(IM_SPESE_GEST_ACCENTRATA_EST) != 0 Or
                  Sum(IM_ENTRATA) != 0) Loop

           For DETT_MODULI_NON_PAREGGIATI In (Select ESERCIZIO, PG_VARIAZIONE_PDG, PG_RIGA
                                              From   V_CONS_VAR_PDGG
                                              Where  ESERCIZIO  = apdg_variazione.ESERCIZIO And
                                                     PG_VARIAZIONE_PDG  = apdg_variazione.PG_VARIAZIONE_PDG And
                                                     PG_MODULO = MODULI_NON_PAREGGIATI.PG_MODULO) Loop

                   -- E POI METTO A "DA VISTARE" SOLO QUELLE CHE LO SONO

                   Update pdg_variazione_riga_gest
                   Set    FL_VISTO_DIP_VARIAZIONI = 'N'
                   Where  ESERCIZIO          = DETT_MODULI_NON_PAREGGIATI.ESERCIZIO And
                          PG_VARIAZIONE_PDG  = DETT_MODULI_NON_PAREGGIATI.PG_VARIAZIONE_PDG And
                          PG_RIGA            = DETT_MODULI_NON_PAREGGIATI.PG_RIGA;
           End Loop;

      End Loop;

  End If;

  Declare
    conta NUMBER := 0;
  Begin
    Select Count(0) Into conta
    From pdg_variazione_riga_gest
    Where  ESERCIZIO          = apdg_variazione.ESERCIZIO
    And    PG_VARIAZIONE_PDG  = apdg_variazione.PG_VARIAZIONE_PDG
    And    FL_VISTO_DIP_VARIAZIONI = 'N';

    If conta > 0 Then
      Update pdg_variazione
      Set FL_VISTO_DIP_VARIAZIONI = 'N'
      Where  ESERCIZIO          = apdg_variazione.ESERCIZIO
      And    PG_VARIAZIONE_PDG  = apdg_variazione.PG_VARIAZIONE_PDG;
    Else
      Update pdg_variazione
      Set FL_VISTO_DIP_VARIAZIONI = 'Y'
      Where  ESERCIZIO          = apdg_variazione.ESERCIZIO
      And    PG_VARIAZIONE_PDG  = apdg_variazione.PG_VARIAZIONE_PDG;
    End If;
  End;
Else
  --SE NON C'E' GESTIONE METTO ANCHE SULLA TESTATA IL FLAG A Y
  Update pdg_variazione
  Set FL_VISTO_DIP_VARIAZIONI = 'Y'
  Where  ESERCIZIO          = apdg_variazione.ESERCIZIO
  And    PG_VARIAZIONE_PDG  = apdg_variazione.PG_VARIAZIONE_PDG;
End If; -- SE NON C'E' GESTIONE ESCO DIRETTAMENTE

End;

procedure aggiornaLimiteSpesa(aElVoce elemento_voce%Rowtype,aDett Voce_f_saldi_cdr_linea%Rowtype,aUser VARCHAR2) Is
  fonteLinea    VARCHAR2(3);
  cds           unita_organizzativa.cd_unita_organizzativa%type;
    begin
        if (aElVoce.fl_limite_spesa ='Y') then
                 select tipo into fonteLinea
                 from natura,linea_attivita linea
                 where
                 natura.cd_natura = linea.cd_natura and
                 linea.cd_centro_responsabilita = aDett.cd_centro_responsabilita and
                 linea.cd_linea_attivita        = aDett.cd_linea_attivita;

                 select cd_unita_padre into cds
                 from cdr,unita_organizzativa uo
                 where
                 cdr.cd_centro_responsabilita = aDett.cd_centro_responsabilita and
                 cdr.cd_unita_organizzativa = uo.cd_unita_organizzativa;

                 aggiornaLimiteSpesaImp(aElVoce,aDett.ESERCIZIO,fonteLinea,cds,aDett.IM_STANZ_INIZIALE_A1,aUser);
      end if;
    exception when others then
          IBMERR001.RAISE_ERR_GENERICO('Errore in aggiorna limiti spesa.');
  end;

procedure aggiornaLimiteSpesaVAR(aEsercizio number,apg_variazione number,tipo VARCHAR2,aUser VARCHAR2) Is
  aElemento_voce Elemento_voce%rowtype;
  fonteLinea            natura.tipo%type;
  aCV                   classificazione_voci%Rowtype;
  ACDRLINEA_DETT        LINEA_ATTIVITA.CD_CENTRO_RESPONSABILITA%Type;
  ALINEA_DETT           LINEA_ATTIVITA.CD_LINEA_aTTIVITA%Type;
  aCDRPersonale         cdr%rowtype;
  aLASAUOP              linea_attivita%rowtype;
  cds           unita_organizzativa.cd_unita_organizzativa%type;
  RIGHE_VAR_SPE  PDG_VARIAZIONE_RIGA_GEST%rowtype;
  RIGHE_VAR_ACCENTRATE  PDG_VARIAZIONE_RIGA_GEST%rowtype;
  RIGHE_VAR_SPE_RES     VAR_STANZ_RES_RIGA%rowtype;
  im_variazione number;
  begin
  if(tipo = 'C') then
      For RIGHE_VAR_SPE In
     (Select * From  PDG_VARIAZIONE_RIGA_GEST
      Where esercizio = aEsercizio
        And PG_VARIAZIONE_PDG = apg_variazione
        And TI_GESTIONE = CNRCTB001.GESTIONE_SPESE
        And CATEGORIA_DETTAGLIO = 'DIR') Loop
      ACDRLINEA_DETT := null;
      ALINEA_DETT    := null;

      select * into aElemento_voce
      from elemento_voce e
      where
        e.esercizio         = RIGHE_VAR_SPE.esercizio and
        e.ti_appartenenza     = RIGHE_VAR_SPE.ti_appartenenza and
        e.ti_gestione       = RIGHE_VAR_SPE.ti_gestione and
        e.cd_elemento_voce  = RIGHE_VAR_SPE.cd_elemento_voce;
          if(aElemento_voce.fl_limite_spesa ='Y') then
               begin
                          Select PDG.* into RIGHE_VAR_ACCENTRATE
                             From   PDG_VARIAZIONE_RIGA_GEST PDG, ELEMENTO_VOCE EV, CLASSIFICAZIONE_VOCI CV_VOCE
                           Where  PDG.ESERCIZIO = aEsercizio
                             And  PG_VARIAZIONE_PDG = aPG_VARIAZIONE
                             and  pg_riga =RIGHE_VAR_SPE.pg_riga
                             And  PDG.TI_GESTIONE = CNRCTB001.GESTIONE_SPESE
                               And  PDG.ESERCIZIO        = EV.ESERCIZIO
                               And  PDG.TI_APPARTENENZA  = EV.TI_APPARTENENZA
                               And  PDG.TI_GESTIONE      = EV.TI_GESTIONE
                               And  PDG.CD_ELEMENTO_VOCE = EV.CD_ELEMENTO_VOCE
                               And  EV.ID_CLASSIFICAZIONE = CV_VOCE.ID_CLASSIFICAZIONE
                               And  PDG.CD_CDR_ASSEGNATARIO != Nvl(CV_VOCE.CDR_ACCENTRATORE, PDG.CD_CDR_ASSEGNATARIO)
                               And  CATEGORIA_DETTAGLIO In ('DIR', 'STI')
                               And  IM_SPESE_GEST_ACCENTRATA_INT + IM_SPESE_GEST_ACCENTRATA_EST > 0;

                             Select *
                                Into   aCV
                                From   classificazione_voci
                                Where  id_classificazione = aElemento_voce.ID_CLASSIFICAZIONE;

                            -- Leggo il CDR del personale e la sua linea SAUOP
                              aCDRPersonale := CNRCTB020.GETCDRPERSONALE(aEsercizio);
                              aLASAUOP := CNRCTB010.getLASAUOP(aEsercizio, aCDRPersonale.cd_centro_responsabilita);

                              If aCV.CDR_ACCENTRATORE = aCDRPersonale.CD_CENTRO_RESPONSABILITA Then
                                ACDRLINEA_DETT := aLASAUOP.CD_CENTRO_RESPONSABILITA;
                                ALINEA_DETT    := aLASAUOP.CD_LINEA_ATTIVITA;
                              End If;
                  exception
                    when no_data_found then
                     null;
                  end;
                  if(ACDRLINEA_DETT is null) then
                     If (aCV.CDR_ACCENTRATORE is not null) then
                        cds:=CNRUTL001.getCdsFromCdr(aCV.CDR_ACCENTRATORE);
                      else
                        if(CNRUTL001.getCdsFromCdr(RIGHE_VAR_SPE.CD_CDR_ASSEGNATARIO) != RIGHE_VAR_SPE.cd_cds_area) then
                          cds:=RIGHE_VAR_SPE.cd_cds_area;
                        else
                          cds:=CNRUTL001.getCdsFromCdr(RIGHE_VAR_SPE.CD_CDR_ASSEGNATARIO);
                        end if;
                     end if;
                  else
                       cds:= CNRUTL001.getCdsFromCdr(ACDRLINEA_DETT);
                  end if;

                  select tipo into fonteLinea
                  from natura,linea_attivita linea
                  where
                   natura.cd_natura = linea.cd_natura and
                   linea.cd_centro_responsabilita = nvl(ACDRLINEA_DETT,RIGHE_VAR_SPE.CD_CDR_ASSEGNATARIO) and
                   linea.cd_linea_attivita        = nvl(ALINEA_DETT,RIGHE_VAR_SPE.CD_linea_attivita);

                    select decode(stato,'PRD',1,-1)*(nvl(RIGHE_VAR_SPE.Im_spese_gest_accentrata_int,0)+
                                 nvl(RIGHE_VAR_SPE.Im_spese_gest_accentrata_est,0)+
                                 nvl(RIGHE_VAR_SPE.Im_spese_gest_decentrata_int,0)+
                                 nvl(RIGHE_VAR_SPE.Im_spese_gest_decentrata_est,0)) into im_variazione
                    from pdg_variazione
                    where
                      esercizio = RIGHE_VAR_SPE.esercizio and
                      pg_variazione_pdg = RIGHE_VAR_SPE.pg_variazione_pdg;

                      aggiornaLimiteSpesaImp(aElemento_voce,RIGHE_VAR_SPE.esercizio,fonteLinea,cds,im_variazione,aUser);
          end if; -- soggetta limiti

      End Loop; -- DELLA SPESA
    else  -- Residui
     For RIGHE_VAR_SPE_RES In
     (Select * From  VAR_STANZ_RES_RIGA
      Where esercizio = aEsercizio
        And PG_VARIAZIONE = apg_variazione
        And TI_GESTIONE = CNRCTB001.GESTIONE_SPESE) Loop

      ACDRLINEA_DETT := null;
      ALINEA_DETT    := null;

      select * into aElemento_voce
      from elemento_voce e
      where
        e.esercizio         = RIGHE_VAR_SPE_RES.esercizio_voce and
        e.ti_appartenenza   = RIGHE_VAR_SPE_RES.ti_appartenenza and
        e.ti_gestione       = RIGHE_VAR_SPE_RES.ti_gestione and
        e.cd_elemento_voce  = RIGHE_VAR_SPE_RES.cd_elemento_voce;
          if(aElemento_voce.fl_limite_spesa ='Y') then
                  cds:=CNRUTL001.getCdsFromCdr(RIGHE_VAR_SPE_RES.CD_CDR);

                  select tipo into fonteLinea
                  from natura,linea_attivita linea
                  where
                   natura.cd_natura = linea.cd_natura and
                   linea.cd_centro_responsabilita = RIGHE_VAR_SPE_RES.cd_cdr and
                   linea.cd_linea_attivita        = RIGHE_VAR_SPE_RES.CD_linea_attivita;

                  select decode(stato,'PRD',RIGHE_VAR_SPE_RES.im_variazione,-RIGHE_VAR_SPE_RES.im_variazione) into im_variazione
                  from var_stanz_res
                  where
                      esercizio = RIGHE_VAR_SPE_RES.esercizio and
                      pg_variazione = RIGHE_VAR_SPE_RES.pg_variazione;
                      aggiornaLimiteSpesaImp(aElemento_voce,RIGHE_VAR_SPE_RES.esercizio_res,fontelinea,cds,im_variazione,aUser);
          end if; -- soggetta limiti
       end loop;
     end if; -- residuo
end;
Procedure aggiornaLimiteSpesaImp(aDett elemento_voce%rowtype,aEsercizio number,fonteLinea natura.tipo%type,cds String,im_variazione number,aUser VARCHAR2) is
   aLimite       limite_spesa%Rowtype;
   aLimiteDet    limite_spesa_det%Rowtype;
   fonteAgg      natura.tipo%type:=null;
   begin
                begin
                  select * into aLimite
                  from Limite_spesa
                  where
                    esercizio         = aEsercizio              and
                    ti_appartenenza   = aDett.TI_APPARTENENZA   and
                    TI_GESTIONE       = aDett.TI_GESTIONE       and
                    CD_ELEMENTO_VOCE  = aDett.CD_ELEMENTO_VOCE  and
                    Fonte = fonteLinea;
                    fonteAgg:=fonteLinea;
                  exception when no_data_found then
                   begin
                    select * into aLimite
                    from Limite_spesa
                    where
                      esercizio         = aEsercizio              and
                      ti_appartenenza   = aDett.TI_APPARTENENZA   and
                      TI_GESTIONE       = aDett.TI_GESTIONE       and
                      CD_ELEMENTO_VOCE  = aDett.CD_ELEMENTO_VOCE  and
                      Fonte = '*';
                      fonteAgg:='*';
                    exception when no_data_found then
                      -- Presupponiamo che se non è in testata non è soggetta ai limite(per evitare di inserire dei  limiti fittizi per le fonte esterne)
                      -- IBMERR001.RAISE_ERR_GENERICO('Limite sul controllo della spesa non definito');
                      dbms_output.put_line('aggiorno limite '||aEsercizio||' '||cds||' '||aDett.TI_APPARTENENZA||' '||aDett.TI_GESTIONE||' '||aDett.CD_ELEMENTO_VOCE||' '||fonteLinea);
                      null;
                    end;
                 end;
                 if(fonteAgg is not null) then
                   Begin
                          select * into aLimiteDet
                          from Limite_spesa_det
                            where
                              esercizio         = aEsercizio              and
                              cd_cds            = cds                     and
                              ti_appartenenza   = aDett.TI_APPARTENENZA   and
                              TI_GESTIONE       = aDett.TI_GESTIONE       and
                              CD_ELEMENTO_VOCE  = aDett.CD_ELEMENTO_VOCE  and
                              Fonte = fonteAgg;
                    exception when no_data_found then
                          IBMERR001.RAISE_ERR_GENERICO('Limite sul controllo della spesa non definito per il CdS.');
                    end;
                    if ((aLimiteDet.impegni_assunti+IM_variazione)>aLimiteDet.importo_limite) then
                       IBMERR001.RAISE_ERR_GENERICO('Impossibile procedere al salvataggio, limiti di spesa non rispettati,'||' esercizio '||aEsercizio||
                       ' sulla voce '||aDett.cd_elemento_voce||'. Verificare i limiti sull''apposita consultazione.');
                    else
                      --pipe.send_message('aggiorno limite '||aEsercizio||' '||cds||' '||aDett.TI_APPARTENENZA||' '||aDett.TI_GESTIONE||' '||aDett.CD_ELEMENTO_VOCE||' '||fonteAgg);
                      update limite_spesa_det
                        set impegni_assunti = impegni_assunti+IM_variazione,
                            utuv  = aUser,
                            duva  = sysdate
                      where
                            esercizio         = aEsercizio              and
                            cd_cds            = cds                     and
                            ti_appartenenza   = aDett.TI_APPARTENENZA   and
                            TI_GESTIONE       = aDett.TI_GESTIONE       and
                            CD_ELEMENTO_VOCE  = aDett.CD_ELEMENTO_VOCE  and
                            fonte = fonteAgg;
                    end if;
              end if;
   end;
Procedure aggiornaLimiteSpesaDec(aEsercizio number,cdr VARCHAR2,stato VARCHAR2,aUser VARCHAR2) is
  livello_pgd_dec_spe  number(1);
  livello_clas_spe  number(1);
  aLimite       limite_spesa%Rowtype;
  aLimiteDet    limite_spesa_det%Rowtype;
  fonteAgg      natura.tipo%type:=null;
  segno number:=0;
Begin

  Begin
    Select  Nvl(LIVELLO_PDG_DECIS_SPE, 0)
    Into    livello_pgd_dec_spe
    From    PARAMETRI_CNR
    Where   ESERCIZIO = aEsercizio;

    Select  max(nr_livello)
    Into    livello_clas_spe
    From    v_classificazione_voci
    Where   ESERCIZIO = aEsercizio
    AND FL_MASTRINO = 'Y'
    AND TI_GESTIONE = 'S';
  Exception
  When No_Data_Found Then
   IBMERR001.raise_err_generico('Parametri necessari al controllo dei limiti per l''esercizio '||aEsercizio||' non trovati !');
  End;
  -- Verifico se l'aggiornamento dei limiti deve essere fatto in fase di decisionale
  if (livello_pgd_dec_spe = livello_clas_spe) then
    if(Stato='AC') then
      segno:=1;
    Elsif (stato='PC') then
      segno:=-1;
    end if;
     For RIGHE_SPE In
      (Select id_classificazione,cd_cds_area,
        sum(nvl(im_spese_gest_decentrata_int,0)) im_spese_gest_decentrata_int,
        sum(nvl(im_spese_gest_decentrata_est,0)) im_spese_gest_decentrata_est
        From  Pdg_modulo_spese
        Where esercizio = aEsercizio
          and cd_centro_responsabilita = cdr
          group by id_classificazione,cd_cds_area) Loop
          For RIGHE_VOCI In
           (select * from elemento_voce
           where
             fl_limite_spesa = 'Y' and
             id_classificazione = Righe_spe.id_classificazione) Loop
                if(nvl(RIGHE_SPE.im_spese_gest_decentrata_int,0)!=0) then
                  begin
                    select *  into aLimite from limite_spesa
                    where
                    esercizio     = RIGHE_VOCI.esercizio and
                    ti_gestione   = RIGHE_VOCI.ti_gestione and
                    ti_appartenenza   = RIGHE_VOCI.ti_appartenenza and
                    cd_elemento_voce  = RIGHE_VOCI.cd_elemento_voce and
                    fonte = 'FIN' ;
                    fonteAgg:='FIN';

                  exception when no_data_found then
                    begin
                      select *  into aLimite from limite_spesa
                      where
                      esercizio     = RIGHE_VOCI.esercizio and
                      ti_gestione   = RIGHE_VOCI.ti_gestione and
                      ti_appartenenza   = RIGHE_VOCI.ti_appartenenza and
                      cd_elemento_voce  = RIGHE_VOCI.cd_elemento_voce and
                      fonte = '*';
                      fonteAgg:='*';
                    exception when no_data_found then
                      null;
                    end;
                  end;
                  if(fonteAgg is not null) then
                   Begin
                          select * into aLimiteDet
                          from Limite_spesa_det
                            where
                              esercizio         = aEsercizio              and
                              cd_cds            = RIGHE_SPE.CD_CDS_AREA        and
                              ti_appartenenza   = RIGHE_VOCI.TI_APPARTENENZA   and
                              TI_GESTIONE       = RIGHE_VOCI.TI_GESTIONE       and
                              CD_ELEMENTO_VOCE  = RIGHE_VOCI.CD_ELEMENTO_VOCE  and
                              Fonte = fonteAgg;
                    exception when no_data_found then
                          IBMERR001.RAISE_ERR_GENERICO('Limite sul controllo della spesa non definito per il CdS.');
                    end;
                    if ((aLimiteDet.impegni_assunti+(RIGHE_SPE.im_spese_gest_decentrata_int*segno))>aLimiteDet.importo_limite) then
                       IBMERR001.RAISE_ERR_GENERICO('Impossibile procedere al salvataggio, limiti di spesa non rispettati,'||' esercizio '||aEsercizio||
                       ' sulla voce '||RIGHE_VOCI.cd_elemento_voce||'. Verificare i limiti sull''apposita consultazione.');
                    else
                      update limite_spesa_det
                        set impegni_assunti = impegni_assunti+(RIGHE_SPE.im_spese_gest_decentrata_int*segno),
                            utuv  = aUser,
                            duva  = sysdate
                      where
                            esercizio         = aEsercizio              and
                            cd_cds            = RIGHE_SPE.CD_CDS_AREA        and
                            ti_appartenenza   = RIGHE_VOCI.TI_APPARTENENZA   and
                            TI_GESTIONE       = RIGHE_VOCI.TI_GESTIONE       and
                            CD_ELEMENTO_VOCE  = RIGHE_VOCI.CD_ELEMENTO_VOCE  and
                            fonte = fonteAgg;
                    end if;
                 end if;  -- end if fonteAgg is not null
             end if;      --if(nvl(RIGHE_SPE.im_spese_gest_decentrata_int,0)!=0)
             fonteAgg:=null;
             if(nvl(RIGHE_SPE.im_spese_gest_decentrata_est,0)!=0) then
                  begin
                    select * into aLimite from limite_spesa
                    where
                    esercizio     = RIGHE_VOCI.esercizio and
                    ti_gestione   = RIGHE_VOCI.ti_gestione and
                    ti_appartenenza   = RIGHE_VOCI.ti_appartenenza and
                    cd_elemento_voce  = RIGHE_VOCI.cd_elemento_voce and
                    fonte = 'FES' ;
                    fonteAgg:='FES';
                exception when no_data_found then
                    begin
                      select * into aLimite from limite_spesa
                      where
                      esercizio     = RIGHE_VOCI.esercizio and
                      ti_gestione   = RIGHE_VOCI.ti_gestione and
                      ti_appartenenza   = RIGHE_VOCI.ti_appartenenza and
                      cd_elemento_voce  = RIGHE_VOCI.cd_elemento_voce and
                      fonte = '*';
                      fonteAgg:='*';
                    exception when no_data_found then
                      null;
                    end;
                 end;
                 if(fonteAgg is not null) then
                   Begin
                         select * into aLimiteDet
                         from Limite_spesa_det
                           where
                             esercizio         = aEsercizio              and
                             cd_cds            = RIGHE_SPE.CD_CDS_AREA        and
                             ti_appartenenza   = RIGHE_VOCI.TI_APPARTENENZA   and
                             TI_GESTIONE       = RIGHE_VOCI.TI_GESTIONE       and
                             CD_ELEMENTO_VOCE  = RIGHE_VOCI.CD_ELEMENTO_VOCE  and
                             Fonte = fonteAgg;
                    exception when no_data_found then
                          IBMERR001.RAISE_ERR_GENERICO('Limite sul controllo della spesa non definito per il CdS.');
                    end;
                    if ((aLimiteDet.impegni_assunti+(RIGHE_SPE.im_spese_gest_decentrata_est*segno))>aLimiteDet.importo_limite) then
                       IBMERR001.RAISE_ERR_GENERICO('Impossibile procedere al salvataggio, limiti di spesa non rispettati,'||' esercizio '||aEsercizio||
                       ' sulla voce '||RIGHE_VOCI.cd_elemento_voce||'. Verificare i limiti sull''apposita consultazione.');
                    else
                      update limite_spesa_det
                        set impegni_assunti = impegni_assunti+(RIGHE_SPE.im_spese_gest_decentrata_est*segno),
                            utuv  = aUser,
                            duva  = sysdate
                      where
                            esercizio         = aEsercizio              and
                            cd_cds            = RIGHE_SPE.CD_CDS_AREA        and
                            ti_appartenenza   = RIGHE_VOCI.TI_APPARTENENZA   and
                            TI_GESTIONE       = RIGHE_VOCI.TI_GESTIONE       and
                            CD_ELEMENTO_VOCE  = RIGHE_VOCI.CD_ELEMENTO_VOCE  and
                            fonte = fonteAgg;
                    end if;
                 end if;  -- end if fonteAgg is not null
               end if;  --if(nvl(RIGHE_SPE.im_spese_gest_decentrata_est,0)!=0)
          end loop; -- end loop RIGHE_VOCI
     End loop; -- end loop RIGHE_SPE
 end if;  -- end if livello_pgd_dec_spe = livello_clas_spe
end;
end;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy