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

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

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

  CREATE OR REPLACE PACKAGE BODY "CNRCTB061_APPOGGIO" is

 Procedure ins_ASS_CDP_PDGP (aDest ASS_CDP_PDGP%rowtype) is
 Begin
   Insert into ASS_CDP_PDGP (
     ESERCIZIO
    ,TI_COSTI_SPESE
    ,ID_MATRICOLA
    ,CD_CENTRO_RESPONSABILITA
    ,PG_PROGETTO_COSTI
    ,PG_RIGA
    ,PG_PROGETTO_SPESE
    ,ID_CLASSIFICAZIONE
    ,CD_CDS_AREA
    ,DACR
    ,UTCR
    ,DUVA
    ,UTUV
    ,PG_VER_REC
   ) Values (
     aDest.ESERCIZIO
    ,aDest.TI_COSTI_SPESE
    ,aDest.ID_MATRICOLA
    ,aDest.CD_CENTRO_RESPONSABILITA
    ,aDest.PG_PROGETTO_COSTI
    ,aDest.PG_RIGA
    ,aDest.PG_PROGETTO_SPESE
    ,aDest.ID_CLASSIFICAZIONE
    ,aDest.CD_CDS_AREA
    ,aDest.DACR
    ,aDest.UTCR
    ,aDest.DUVA
    ,aDest.UTUV
    ,aDest.PG_VER_REC
    );
 End;

 Procedure ins_ASS_CDP_PDGP_ROUND (aDest ASS_CDP_PDGP_ROUND%rowtype) Is
 Begin
   Insert into ASS_CDP_PDGP_ROUND (
     ESERCIZIO
    ,CD_CDR_ROOT
    ,TI_APPARTENENZA
    ,TI_GESTIONE
    ,CD_ELEMENTO_VOCE
    ,CD_CENTRO_RESPONSABILITA
    ,CD_LINEA_ATTIVITA
    ,ID_MATRICOLA
    ,IM_ARR_A1
    ,IM_ARR_A2
    ,IM_ARR_A3
    ,IM_ARR_A1_NON_DISTR
    ,IM_ARR_A2_NON_DISTR
    ,IM_ARR_A3_NON_DISTR
    ,PG_PROGETTO_COSTI
    ,PG_PROGETTO_SPESE
    ,ID_CLASSIFICAZIONE
    ,CD_CDS_AREA
    ,DACR
    ,UTUV
    ,UTCR
    ,DUVA
    ,PG_VER_REC
   ) Values (
     aDest.ESERCIZIO
    ,aDest.CD_CDR_ROOT
    ,aDest.TI_APPARTENENZA
    ,aDest.TI_GESTIONE
    ,aDest.CD_ELEMENTO_VOCE
    ,aDest.CD_CENTRO_RESPONSABILITA
    ,aDest.CD_LINEA_ATTIVITA
    ,aDest.ID_MATRICOLA
    ,aDest.IM_ARR_A1
    ,aDest.IM_ARR_A2
    ,aDest.IM_ARR_A3
    ,aDest.IM_ARR_A1_NON_DISTR
    ,aDest.IM_ARR_A2_NON_DISTR
    ,aDest.IM_ARR_A3_NON_DISTR
    ,aDest.PG_PROGETTO_COSTI
    ,aDest.PG_PROGETTO_SPESE
    ,aDest.ID_CLASSIFICAZIONE
    ,aDest.CD_CDS_AREA
    ,aDest.DACR
    ,aDest.UTUV
    ,aDest.UTCR
    ,aDest.DUVA
    ,aDest.PG_VER_REC
    );
 End;

 -- Imposta gli importi sul dettaglio di PDG da creare
 Procedure setImporto(aASSCDPLA V_CDP_SPACCATO_CDR_LA_VOCE%rowtype,
                      aDestS in out pdg_modulo_spese%rowtype) is
   aCDRPersonale cdr%Rowtype;
   aLATmp linea_attivita%rowtype;
 Begin
   -- Leggo il CDR del personale e lock del PDG

   aCDRPersonale:=CNRCTB020.GETCDRPERSONALE;

   -- Leggo la linea di attivita per aggiornare gli importi del PDGP in base alla natura
   Select * into aLATmp from linea_attivita
   Where cd_linea_attivita = aASSCDPLA.cd_linea_attivita
   And   cd_centro_responsabilita = aASSCDPLA.cd_cdr;

   If aDestS.cd_centro_responsabilita=aCDRPersonale.cd_centro_responsabilita Then
      If aLATmp.cd_natura = '2' Or aLATmp.cd_natura = '3' Then
         aDestS.IM_SPESE_GEST_DECENTRATA_EST:=Nvl(aDestS.IM_SPESE_GEST_DECENTRATA_EST, 0) +
                                              Nvl(aASSCDPLA.im_a1, 0);
      Else
         aDestS.IM_SPESE_GEST_DECENTRATA_INT:=Nvl(aDestS.IM_SPESE_GEST_DECENTRATA_INT, 0) +
                                              Nvl(aASSCDPLA.im_a1, 0);
      End If;
   Else
      If aLATmp.cd_natura = '2' Or aLATmp.cd_natura = '3' Then
         aDestS.IM_SPESE_GEST_ACCENTRATA_EST:=Nvl(aDestS.IM_SPESE_GEST_ACCENTRATA_EST, 0) +
                                              Nvl(aASSCDPLA.im_a1, 0);
      Else
         aDestS.IM_SPESE_GEST_ACCENTRATA_INT:=Nvl(aDestS.IM_SPESE_GEST_ACCENTRATA_INT, 0) +
                                              Nvl(aASSCDPLA.im_a1, 0);
      End If;
   End If;
   --Serve per evitare che alcuni importi abbiano valore null
   aDestS.IM_SPESE_GEST_DECENTRATA_EST:=Nvl(aDestS.IM_SPESE_GEST_DECENTRATA_EST, 0);
   aDestS.IM_SPESE_GEST_DECENTRATA_INT:=Nvl(aDestS.IM_SPESE_GEST_DECENTRATA_INT, 0);
   aDestS.IM_SPESE_GEST_ACCENTRATA_EST:=Nvl(aDestS.IM_SPESE_GEST_ACCENTRATA_EST, 0);
   aDestS.IM_SPESE_GEST_ACCENTRATA_INT:=Nvl(aDestS.IM_SPESE_GEST_ACCENTRATA_INT, 0);
 End;

 -- Imposta gli importi sul dettaglio di PDG da creare
 Procedure setImporto(aASSCDPLA V_CDP_SPACCATO_CDR_LA_VOCE%rowtype,
                      aDestS in out pdg_modulo_spese_gest%rowtype) is
   aCDRPersonale cdr%Rowtype;
   aLATmp linea_attivita%rowtype;
 Begin
   -- Leggo il CDR del personale e lock del PDG

   aCDRPersonale:=CNRCTB020.GETCDRPERSONALE;

   -- Leggo la linea di attivita per aggiornare gli importi del PDGP in base alla natura
   Select * into aLATmp from linea_attivita
   Where cd_linea_attivita = aASSCDPLA.cd_linea_attivita
   And   cd_centro_responsabilita = aASSCDPLA.cd_cdr;

   If aDestS.cd_centro_responsabilita=aCDRPersonale.cd_centro_responsabilita Then
      If aLATmp.cd_natura = '2' Or aLATmp.cd_natura = '3' Then
         aDestS.IM_SPESE_GEST_DECENTRATA_EST:=Nvl(aDestS.IM_SPESE_GEST_DECENTRATA_EST, 0) +
                                              Nvl(aASSCDPLA.im_a1, 0);
      Else
         aDestS.IM_SPESE_GEST_DECENTRATA_INT:=Nvl(aDestS.IM_SPESE_GEST_DECENTRATA_INT, 0) +
                                              Nvl(aASSCDPLA.im_a1, 0);
      End If;
   Else
      If aLATmp.cd_natura = '2' Or aLATmp.cd_natura = '3' Then
         aDestS.IM_SPESE_GEST_ACCENTRATA_EST:=Nvl(aDestS.IM_SPESE_GEST_ACCENTRATA_EST, 0) +
                                              Nvl(aASSCDPLA.im_a1, 0);
      Else
         aDestS.IM_SPESE_GEST_ACCENTRATA_INT:=Nvl(aDestS.IM_SPESE_GEST_ACCENTRATA_INT, 0) +
                                              Nvl(aASSCDPLA.im_a1, 0);
      End If;
   End If;
   --Serve per evitare che alcuni importi abbiano valore null
   aDestS.IM_SPESE_GEST_DECENTRATA_EST:=Nvl(aDestS.IM_SPESE_GEST_DECENTRATA_EST, 0);
   aDestS.IM_SPESE_GEST_DECENTRATA_INT:=Nvl(aDestS.IM_SPESE_GEST_DECENTRATA_INT, 0);
   aDestS.IM_SPESE_GEST_ACCENTRATA_EST:=Nvl(aDestS.IM_SPESE_GEST_ACCENTRATA_EST, 0);
   aDestS.IM_SPESE_GEST_ACCENTRATA_INT:=Nvl(aDestS.IM_SPESE_GEST_ACCENTRATA_INT, 0);
 End;

 Procedure setImportoTFR(aASSCDPLA V_CDP_SPACCATO_CDR_LA_VOCE%rowtype, aDestC in out pdg_modulo_costi%Rowtype,
                         isTempoDeterminato Boolean) is
 Begin
   If isTempoDeterminato Then
     aDestC.IM_CF_TFR_DET:=Nvl(aDestC.IM_CF_TFR_DET, 0) + Nvl(aASSCDPLA.im_a1, 0);
   Else
     aDestC.IM_CF_TFR:=Nvl(aDestC.IM_CF_TFR, 0) + Nvl(aASSCDPLA.im_a1, 0);
   End If;
   --Serve per evitare che alcuni importi abbiano valore null
   aDestC.IM_CF_TFR:=Nvl(aDestC.IM_CF_TFR,0);
   aDestC.IM_CF_TFR_DET:=Nvl(aDestC.IM_CF_TFR_DET, 0);
 End;

 -- Funzione di accantonamento dei rotti di scarico
 Procedure fill_round_table(aASSCDPLA V_CDP_SPACCATO_CDR_LA_VOCE%rowtype, aTSNow date, aUser varchar2) is
   aAssCdpPdgPRnd ASS_CDP_PDGP_ROUND%rowtype;
   aLATmp linea_attivita%rowtype;
 Begin
   If aASSCDPLA.IM_RND_A1 = 0 and aASSCDPLA.IM_RND_A2 = 0 and aASSCDPLA.IM_RND_A3 = 0 Then
      Return;
   End if;

   aAssCdpPdgPRnd:=Null;
   aAssCdpPdgPRnd.ESERCIZIO:=aASSCDPLA.Esercizio;
   aAssCdpPdgPRnd.CD_CDR_ROOT:=aASSCDPLA.cd_cdr_root;
   aAssCdpPdgPRnd.TI_APPARTENENZA:=aASSCDPLA.ti_appartenenza;
   aAssCdpPdgPRnd.TI_GESTIONE:=aASSCDPLA.TI_GESTIONE;
   aAssCdpPdgPRnd.CD_ELEMENTO_VOCE:=aASSCDPLA.cd_elemento_voce;
   aAssCdpPdgPRnd.CD_CENTRO_RESPONSABILITA:=aASSCDPLA.cd_cdr;
   aAssCdpPdgPRnd.CD_LINEA_ATTIVITA:=aASSCDPLA.cd_linea_attivita;
   aAssCdpPdgPRnd.ID_MATRICOLA:=aASSCDPLA.ti_rapporto;

   Begin
     Select * into aAssCdpPdgPRnd
     From ass_cdp_pdgp_round
     Where ESERCIZIO=aAssCdpPdgPRnd.esercizio
     And   CD_CDR_ROOT=aAssCdpPdgPRnd.cd_cdr_root
     And   TI_APPARTENENZA=aAssCdpPdgPRnd.ti_appartenenza
     And   TI_GESTIONE=aAssCdpPdgPRnd.ti_gestione
     And   CD_ELEMENTO_VOCE=aAssCdpPdgPRnd.cd_elemento_voce
     And   CD_CENTRO_RESPONSABILITA=aAssCdpPdgPRnd.cd_centro_responsabilita
     And   CD_LINEA_ATTIVITA=aAssCdpPdgPRnd.cd_linea_attivita
     And   ID_MATRICOLA=aAssCdpPdgPRnd.id_matricola
     For update nowait;

     Update ass_cdp_pdgp_round
     Set IM_ARR_A1=IM_ARR_A1+aASSCDPLA.im_rnd_a1,
         IM_ARR_A2=IM_ARR_A2+aASSCDPLA.im_rnd_a2,
         IM_ARR_A3=IM_ARR_A3+aASSCDPLA.im_rnd_a3,
         utuv=aUser,
         duva=aTSNow,
         pg_ver_rec = pg_ver_rec + 1
     Where ESERCIZIO=aAssCdpPdgPRnd.esercizio
     And   CD_CDR_ROOT=aAssCdpPdgPRnd.cd_cdr_root
     And   TI_APPARTENENZA=aAssCdpPdgPRnd.ti_appartenenza
     And   TI_GESTIONE=aAssCdpPdgPRnd.ti_gestione
     And   CD_ELEMENTO_VOCE=aAssCdpPdgPRnd.cd_elemento_voce
     And   CD_CENTRO_RESPONSABILITA=aAssCdpPdgPRnd.cd_centro_responsabilita
     And   CD_LINEA_ATTIVITA=aAssCdpPdgPRnd.cd_linea_attivita
     And   ID_MATRICOLA=aAssCdpPdgPRnd.id_matricola;
   Exception
     When NO_DATA_FOUND Then
       aAssCdpPdgPRnd.IM_ARR_A1:=aASSCDPLA.im_rnd_a1;
       aAssCdpPdgPRnd.IM_ARR_A2:=aASSCDPLA.im_rnd_a2;
       aAssCdpPdgPRnd.IM_ARR_A3:=aASSCDPLA.im_rnd_a3;
       aAssCdpPdgPRnd.IM_ARR_A1_NON_DISTR:=0;
       aAssCdpPdgPRnd.IM_ARR_A2_NON_DISTR:=0;
       aAssCdpPdgPRnd.IM_ARR_A3_NON_DISTR:=0;
       aAssCdpPdgPRnd.DACR:=aTSNow;
       aAssCdpPdgPRnd.UTUV:=aUser;
       aAssCdpPdgPRnd.UTCR:=aUser;
       aAssCdpPdgPRnd.DUVA:=aTSNow;
       aAssCdpPdgPRnd.PG_VER_REC:=1;
       ins_ASS_CDP_PDGP_ROUND(aAssCdpPdgPRnd);
   End;
 End;

 Procedure scaricaCDPSuPdgP(aEsercizio number, aCdCdr varchar2, aUser varchar2) is
   aCDRRUO cdr%Rowtype;
   aUO unita_organizzativa%Rowtype;

   aPdgModulo pdg_modulo%Rowtype;

   aAssCosti ass_cdp_pdgp%Rowtype;
   aAssSpese ass_cdp_pdgp%Rowtype;

   Type typeModuloSpese Is Table Of pdg_modulo_spese%Rowtype Index By BINARY_INTEGER;
   tabModuloSpese typeModuloSpese;
   trovatoModuloSpese Boolean := False;

   Type typeAssCdpPdgP Is Table Of ass_cdp_pdgp%Rowtype Index By BINARY_INTEGER;
   tabAssCdpPdgP typeAssCdpPdgP;

   aDestS    pdg_modulo_spese%Rowtype;
   aDestC    pdg_modulo_costi%Rowtype;

   aTSNow DATE;
   aModuloTmp progetto_prev%Rowtype;

   aNum NUMBER(8);

   aVoce elemento_voce%Rowtype;
   aVoceTFR elemento_voce%Rowtype;
   aVoceTFRTEMPODET elemento_voce%Rowtype;
   aVoceONERICNR elemento_voce%Rowtype;
   aVoceONERICNRTEMPODET elemento_voce%Rowtype;
   aParCNR parametri_cnr%Rowtype;
   aCdClassificazione v_classificazione_voci_all.cd_classificazione%Type;
   aAllVociClassificazione v_classificazione_voci_all%Rowtype;
   aAllVociClassificazioneDef v_classificazione_voci_all%Rowtype;
   isTempoDeterminato Boolean;

   aLATmp  linea_attivita%Rowtype;
   aModulo progetto_prev%Rowtype;
   isDettRedistrRottiFound Boolean;
   isProcessato Boolean;
   isVoceTFR Boolean;
   matricola_err         VARCHAR2(32000);
   aCDRPersonale cdr%Rowtype;
 Begin
   aTSNow:=sysdate;

   -- Leggo il CDR
   aCDRRUO:=CNRCTB020.GETCDRVALIDO(aEsercizio, aCdCdr);

   -- Leggo la UO del CDR
   aUO := CNRCTB020.getUO(aCDRRUO);

   if to_number(aCDRRUO.cd_proprio_cdr) != 0 then
     IBMERR001.RAISE_ERR_GENERICO('Operazione permessa solo su cdr di tipo RUO!');
   end if;

   -- Leggo il CDR del personale

   aCDRPersonale:=CNRCTB020.GETCDRPERSONALE;

   -- Lock del PDG del CDR in processo
   CNRCTB051.LOCKPDGP(aEsercizio, aCdCdr);

   Select count(*) into aNum
   From ass_cdp_pdgp
   Where esercizio = aEsercizio
   And   ti_costi_spese = CNRCTB061_APPOGGIO.TAB_COSTI
   And   cd_centro_responsabilita in (Select cd_centro_responsabilita
                                      From V_PDGP_CDR_RUO_NRUO
                                      Where esercizio = aEsercizio
 		                      And   cd_cdr_root =  aCdCdr
 		                      And   (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		                             cd_unita_organizzativa = aUO.cd_unita_organizzativa));

   If aNum > 0 then
     IBMERR001.RAISE_ERR_GENERICO('Operazione gia effettuata su cdr '||aCdCdr);
   End if;

   -- Controllo modificabilita PDGP CDR Personale

   For aPDGP in PDGP_CON_CONFIG_SCR(aEsercizio, aCDRRUO.cd_centro_responsabilita, aUO) loop
     If not (aPDGP.stato in (
 	    CNRCTB051.STATO_PDGP_APERTURA,
 	    CNRCTB051.STATO_PDGP_ADEGUAMENTO)) Then

       -- Leggo il modulo per recuperare la descrizione
       Select * into aModuloTmp from progetto_prev
       Where pg_progetto = aPDGP.pg_progetto
       And   esercizio = aEsercizio;

       IBMERR001.RAISE_ERR_GENERICO('Il piano di gestione preliminare del CDR NRUO '||aPDGP.cd_centro_responsabilita||
                                    ' per il modulo '||aModuloTmp.cd_progetto||' ('||aModuloTmp.cd_progetto_sip||')'||
                                    ' non e'' in stato di apertura o di adeguamento!');
     End If;
   End Loop;

   -- Il totale di scarico configurato dei dipendenti dell'UO e 100%  (comprendento le quote verso altre UO accettate)

   For aUOCDS In (Select * From UNITA_ORGANIZZATIVA
                  Where cd_unita_padre = aUO.cd_unita_padre
                  And  (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		        cd_unita_organizzativa = aUO.cd_unita_organizzativa)) Loop
       Select count(*) into aNum
       From V_CDP_TOT_PRC a, (Select id_matricola,
                                     Nvl(Sum(IM_A1), 0) IM_A1,
                                     Nvl(Sum(IM_A2), 0) IM_A2,
                                     Nvl(Sum(IM_A3), 0) IM_A3
                              From COSTO_DEL_DIPENDENTE
                              Where COSTO_DEL_DIPENDENTE.esercizio = aEsercizio
                              And   COSTO_DEL_DIPENDENTE.mese = 0
                              And   (COSTO_DEL_DIPENDENTE.cd_unita_organizzativa = aUOCDS.cd_unita_organizzativa or
                                     COSTO_DEL_DIPENDENTE.cd_unita_organizzativa in (Select V_CDP_MATRICOLA_UO.cd_unita_organizzativa
                                                                                     from ass_cdp_uo, V_CDP_MATRICOLA_UO
                                                                                     Where ass_cdp_uo.stato In ('X', 'Y')
                                                                                     and   ass_cdp_uo.esercizio = COSTO_DEL_DIPENDENTE.esercizio
                                                                                     and   ass_cdp_uo.mese = COSTO_DEL_DIPENDENTE.mese
                                                                                     and   ass_cdp_uo.id_matricola = COSTO_DEL_DIPENDENTE.id_matricola
                                                                                     and   ass_cdp_uo.esercizio = V_CDP_MATRICOLA_UO.esercizio
                                                                                     and   ass_cdp_uo.mese = V_CDP_MATRICOLA_UO.mese
                                                                                     And   ass_cdp_uo.id_matricola = V_CDP_MATRICOLA_UO.id_matricola))
                              Group By id_matricola) b
       Where a.esercizio = aEsercizio
       And   a.mese = 0
       And   a.cd_unita_organizzativa = aUOCDS.cd_unita_organizzativa
       And   a.id_matricola = b.id_matricola
       And  ((b.im_a1 != 0 And prc_a1 < 100) Or
             (b.im_a2 != 0 And prc_a2 < 100) Or
             (b.im_a3 != 0 And prc_a3 < 100));

       If aNum > 0 Then
          For rec_err In (Select Distinct a.id_matricola
                          From V_CDP_TOT_PRC a, (Select id_matricola,
                                                         Nvl(Sum(IM_A1), 0) IM_A1,
                                                         Nvl(Sum(IM_A2), 0) IM_A2,
                                                         Nvl(Sum(IM_A3), 0) IM_A3
                                                 From COSTO_DEL_DIPENDENTE
                                                 Where COSTO_DEL_DIPENDENTE.esercizio = aEsercizio
                                                 And   COSTO_DEL_DIPENDENTE.mese = 0
                                                 And   (COSTO_DEL_DIPENDENTE.cd_unita_organizzativa = aUOCDS.cd_unita_organizzativa or
                                                        COSTO_DEL_DIPENDENTE.cd_unita_organizzativa in (Select V_CDP_MATRICOLA_UO.cd_unita_organizzativa
                                                                                                        from ass_cdp_uo, V_CDP_MATRICOLA_UO
                                                                                                        Where ass_cdp_uo.stato In ('X', 'Y')
                                                                                                        and   ass_cdp_uo.esercizio = COSTO_DEL_DIPENDENTE.esercizio
                                                                                                        and   ass_cdp_uo.mese = COSTO_DEL_DIPENDENTE.mese
                                                                                                        and   ass_cdp_uo.id_matricola = COSTO_DEL_DIPENDENTE.id_matricola
                                                                                                        and   ass_cdp_uo.esercizio = V_CDP_MATRICOLA_UO.esercizio
                                                                                                        and   ass_cdp_uo.mese = V_CDP_MATRICOLA_UO.mese
                                                                                                        And   ass_cdp_uo.id_matricola = V_CDP_MATRICOLA_UO.id_matricola))
                                                 Group By id_matricola) b
                          Where a.esercizio = aEsercizio
                          And   a.mese = 0
                          And   a.cd_unita_organizzativa = aUOCDS.cd_unita_organizzativa
                          And   a.id_matricola = b.id_matricola
                          And  ((b.im_a1 != 0 And prc_a1 < 100) Or
                                (b.im_a2 != 0 And prc_a2 < 100) Or
                                (b.im_a3 != 0 And prc_a3 < 100))) Loop

--              Dbms_Output.put_line('rec_err.id_matricola: '||rec_err.id_matricola);
              matricola_err := matricola_err||' - '||rec_err.id_matricola;
--              Dbms_Output.put_line('matricola_err: '||matricola_err);
          End Loop;
          IBMERR001.RAISE_ERR_GENERICO('La configurazione di scarico dei dipendenti dell''UO '||aUOCDS.cd_unita_organizzativa||' non e'' completa per n. '||anum||' matricola/e ('||matricola_err||')');
       End If;
   End Loop;

   -- Carico la voce del piano TFR e ONERICNR per il personale a tempo indeterminato

   aVoceTFR:=CNRCTB000.GETVOCETFR(aEsercizio);
   aVoceONERICNR:=CNRCTB000.GETVOCEONERICNR(aEsercizio);

   -- Carico la voce del piano TFR e ONERICNR per il personale a tempo determinato

   aVoceTFRTEMPODET:=CNRCTB000.GETVOCETFRTEMPODET(aEsercizio);
   aVoceONERICNRTEMPODET:=CNRCTB000.GETVOCEONERICNRTEMPODET(aEsercizio);


   -- Leggo i parametri per conoscere il livello classificazione di inserimento

   Begin
     Select * into aParCNR from parametri_cnr
     Where esercizio = aEsercizio;
   Exception
     When No_Data_Found Then
        IBMERR001.RAISE_ERR_GENERICO('Mancano i parametri CNR per l''esercizio '||aEsercizio||
                                     'necessari per la determinazione del livello classificazione da utilizzare per '||
                                     'il caricamento del PdgP. Impossibile lo scarico.');
   End;

   -- Start dello scarico su PDG dei costi del personale

   For aASSCDPLA In (
       Select * From V_CDP_SPACCATO_CDR_LA_VOCE Where
 	          esercizio = aEsercizio
 		  And mese = 0
 		  And cd_cdr_root In (Select cd_centro_responsabilita from V_PDGP_CDR_RUO_NRUO
                                      Where esercizio = aEsercizio
 		                      And cd_cdr_root =  aCdCdr
 		                      And   (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		                             cd_unita_organizzativa = aUO.cd_unita_organizzativa))
 		  Order by cd_cdr) loop  -- Cicla sulle configurazioni di scarico

     -- Determina il tipo di rapporto dalla tabella COSTO_DEL_DIPENDENTE

     isTempoDeterminato:=false;
     If aASSCDPLA.ti_rapporto = CDP_TI_RAPP_DETERMINATO Then
       isTempoDeterminato:=true;
     End if;

     -- Leggo la linea di attivita per aggiornare il dettaglio del PDG con funzione e natura
     Begin
       Select * into aLATmp from linea_attivita
       Where cd_linea_attivita = aASSCDPLA.cd_linea_attivita
       And   cd_centro_responsabilita = aASSCDPLA.cd_cdr;
     Exception
       When No_Data_Found Then
          IBMERR001.RAISE_ERR_GENERICO('E'' stato imputato, nella ripartizione dei costi del personale, un codice G.A.E. '||
 aASSCDPLA.cd_linea_attivita||' per il cdr '||aASSCDPLA.cd_cdr||' inesistente. Impossibile lo scarico.');
     End;

     If aLaTmp.cd_natura = '5' then
        IBMERR001.RAISE_ERR_GENERICO('Esiste una ripartizione dei CDP su G.A.E. di natura 5. Impossibile lo scarico.');
     End if;

     -- Leggo il modulo associato alla Linea di Attività
     If aLaTmp.pg_progetto Is Null then
          IBMERR001.RAISE_ERR_GENERICO('E'' stato imputato, nella ripartizione dei costi del personale, un codice G.A.E. '||
 aASSCDPLA.cd_linea_attivita||' al quale non risulta associato alcun modulo. Impossibile lo scarico.');
     End if;

     Begin
       Select * into aModulo from progetto_prev
       Where pg_progetto = aLATmp.pg_progetto
       And   esercizio = aEsercizio;
     Exception
       When No_Data_Found Then
          IBMERR001.RAISE_ERR_GENERICO('E'' stato imputato, nella ripartizione dei costi del personale, un codice G.A.E. '||
 aASSCDPLA.cd_linea_attivita||' al quale risulta associato un progressivo modulo ('||aLATmp.pg_progetto||') inesistente. Impossibile lo scarico.');
     End;

     If aLaTmp.cd_natura = '5' then
        IBMERR001.RAISE_ERR_GENERICO('Esiste una ripartizione dei CDP su G.A.E. di natura 5. Impossibile lo scarico.');
     End if;

     -- Leggo la voce per recuperare la classificazione
     Begin
       Select * into aVoce from elemento_voce
       Where esercizio = aASSCDPLA.esercizio
       And   ti_appartenenza = aASSCDPLA.ti_appartenenza
       And   ti_gestione = aASSCDPLA.ti_gestione
       And   cd_elemento_voce = aASSCDPLA.cd_elemento_voce;
     Exception
       When No_Data_Found Then
          IBMERR001.RAISE_ERR_GENERICO('E'' stata indicata, nei costi del personale, un codice elemento voce '||
                                       aASSCDPLA.cd_elemento_voce||' inesistente. Impossibile lo scarico.');
     End;

     If aVoce.id_classificazione Is Null then
        IBMERR001.RAISE_ERR_GENERICO('Manca la classificazione sulla voce '||aVoce.cd_elemento_voce||' dell''esercizio '||aVoce.esercizio||'. Impossibile lo scarico.');
     End if;

     -- Leggo tutta la classificazione per reperire i suoi livelli precedenti
     Begin
       Select * into aAllVociClassificazione from v_classificazione_voci_all
       Where id_classificazione = aVoce.id_classificazione;
     Exception
       When No_Data_Found Then
          IBMERR001.RAISE_ERR_GENERICO('E'' stata indicata, nei costi del personale, un codice elemento voce '||
                                       aASSCDPLA.cd_elemento_voce||' con classificazione ('||aVoce.id_classificazione||
                                       ') non presente nella tabella corrispondente. Impossibile lo scarico.');
     End;

     aCdClassificazione := Null;
     -- Individuo la classificazione da utilizzare
     If aParCNR.LIVELLO_PDG_DECIS_SPE = 1 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv1;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 2 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv2;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 3 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv3;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 4 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv4;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 5 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv5;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 6 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv6;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 7 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv7;
     End If;

     If aCdClassificazione Is Null Then
        IBMERR001.RAISE_ERR_GENERICO('E'' stata indicata, nei costi del personale, un codice elemento voce '||
                                     aASSCDPLA.cd_elemento_voce||' con classificazione ('||aVoce.id_classificazione||
                                     ') che ha generato anomalia nella ricerca del codice livello necessario per il '||
                                     'caricamento del PdgP. Impossibile lo scarico.'||aParCNR.LIVELLO_PDG_DECIS_SPE);
     End If;

     -- Leggo la classificazione finale da inserire in PDG_MODULO_SPESE
     Begin
       Select * into aAllVociClassificazioneDef from v_classificazione_voci_all
       Where esercizio = aASSCDPLA.esercizio
       And   ti_gestione = aASSCDPLA.ti_gestione
       And   cd_classificazione = aCdClassificazione;
     Exception
       When No_Data_Found Then
          IBMERR001.RAISE_ERR_GENERICO('E'' stata indicata, nei costi del personale, un codice elemento voce '||
                                       aASSCDPLA.cd_elemento_voce||' con classificazione ('||aVoce.id_classificazione||
                                       ') che ha generato anomalia nella ricerca del livello necessario per il '||
                                       'caricamento del PdgP. Impossibile lo scarico.');
     End;

     isVoceTFR:=False;
     If aASSCDPLA.cd_elemento_voce = aVoceTFR.cd_elemento_voce Or
        aASSCDPLA.cd_elemento_voce = aVoceTFRTEMPODET.cd_elemento_voce Then
        isVoceTFR:=True;
     End If;

     Begin
       -- Leggo il PDG_MODULO per decidere se inserirlo in quanto necessario per caricare il resto dei dati
       Select * into aPdgModulo from pdg_modulo
       Where esercizio = aEsercizio
       And   cd_centro_responsabilita = aCDRRUO.cd_centro_responsabilita
       And   pg_progetto = aLATmp.pg_progetto;
     Exception
       When No_Data_Found Then
          IBMERR001.RAISE_ERR_GENERICO('Non risulta essere caricato nel PdgP il modulo '
                                       ||aModulo.cd_progetto||' ('||aModulo.cd_progetto_sip||') '||
                                       'associato al Cdr '||aLATmp.cd_centro_responsabilita||'. '||
                                       'Impossibile lo scarico.');
     End;

     Begin
       -- Leggo il modulo_costi per decidere se inserire o aggiornare
       Select * into aDestC from pdg_modulo_costi
       Where esercizio = aPdgModulo.esercizio
       And   cd_centro_responsabilita = aPdgModulo.cd_centro_responsabilita
       And   pg_progetto = aPdgModulo.pg_progetto;

       If isVoceTFR then
          setImportoTFR(aASSCDPLA, aDestC, isTempoDeterminato);

          Update pdg_modulo_costi
          Set RIS_ES_PREC_TIT_I       = aDestC.RIS_ES_PREC_TIT_I,
              RIS_ES_PREC_TIT_II      = aDestC.RIS_ES_PREC_TIT_II,
              RIS_PRES_ES_PREC_TIT_I  = aDestC.RIS_PRES_ES_PREC_TIT_I,
              RIS_PRES_ES_PREC_TIT_II = aDestC.RIS_PRES_ES_PREC_TIT_II,
              IM_COSTI_GENERALI       = aDestC.IM_COSTI_GENERALI,
              IM_CF_TFR               = aDestC.IM_CF_TFR,
              IM_CF_TFR_DET           = aDestC.IM_CF_TFR_DET,
              IM_CF_AMM_IMMOBILI      = aDestC.IM_CF_AMM_IMMOBILI,
              IM_CF_AMM_ATTREZZ       = aDestC.IM_CF_AMM_ATTREZZ,
              IM_CF_AMM_ALTRO         = aDestC.IM_CF_AMM_ALTRO,
              utuv=aUser,
              duva=aTSNow,
              pg_ver_rec = pg_ver_rec + 1
          Where esercizio = aDestC.esercizio
          And   cd_centro_responsabilita = aDestC.cd_centro_responsabilita
          And   pg_progetto = aDestC.pg_progetto;
       End If;
     Exception
       When No_Data_Found Then
         aDestC:=null;
         aDestC.ESERCIZIO:=aPdgModulo.Esercizio;
         aDestC.CD_CENTRO_RESPONSABILITA:=aPdgModulo.cd_centro_responsabilita;
         aDestC.PG_PROGETTO:=aPdgModulo.pg_progetto;

         CNRCTB051.resetCampiImporto(aDestC);

         If isVoceTFR then
            setImportoTFR(aASSCDPLA, aDestC, isTempoDeterminato);
         End If;

         aDestC.DACR:=aTSNow;
         aDestC.UTCR:=aUser;
         aDestC.DUVA:=aTSNow;
         aDestC.UTUV:=aUser;
         aDestC.PG_VER_REC:=1;
         CNRCTB051.ins_PDG_MODULO_COSTI (aDestC);
     End;

     aAssCosti:=Null;
     Begin
       Select * into aAssCosti From ASS_CDP_PDGP
       Where ESERCIZIO = aDestC.Esercizio
       And   TI_COSTI_SPESE = CNRCTB061_APPOGGIO.TAB_COSTI
       And   ID_MATRICOLA = aASSCDPLA.ti_rapporto
       And   CD_CENTRO_RESPONSABILITA = aDestC.cd_centro_responsabilita
       And   PG_PROGETTO_COSTI = aDestC.pg_progetto
       And   PG_PROGETTO_SPESE Is Null;
     Exception
       When No_Data_Found Then
         aAssCosti.ESERCIZIO:=aDestC.Esercizio;
         aAssCosti.TI_COSTI_SPESE:=CNRCTB061_APPOGGIO.TAB_COSTI;
         aAssCosti.ID_MATRICOLA:=aASSCDPLA.ti_rapporto;
         aAssCosti.CD_CENTRO_RESPONSABILITA:=aDestC.cd_centro_responsabilita;
         aAssCosti.PG_PROGETTO_COSTI:=aDestC.pg_progetto;
         aAssCosti.PG_PROGETTO_SPESE:=Null;
         aAssCosti.ID_CLASSIFICAZIONE:=Null;
         aAssCosti.CD_CDS_AREA:=Null;
         aAssCosti.PG_RIGA:=0;
         aAssCosti.DACR:=aTSNow;
         aAssCosti.UTCR:=aUser;
         aAssCosti.DUVA:=aTSNow;
         aAssCosti.UTUV:=aUser;
         aAssCosti.PG_VER_REC:=1;

         tabAssCdpPdgP(tabAssCdpPdgP.count+1):=aAssCosti;

         -- Accantonamento degli arrotondamenti dovuti allo scarico corrente (per elemento voce e tipo rapporto)
         fill_round_table(aASSCDPLA, aTSNow, aUser);
     End;

     If Not (isVoceTFR) Then
       Begin
         -- Leggo il modulo_spese per decidere se inserire o aggiornare
         Select * into aDestS from pdg_modulo_spese
         Where esercizio = aDestC.esercizio
         And   cd_centro_responsabilita = aDestC.cd_centro_responsabilita
         And   pg_progetto = aDestC.pg_progetto
         And   id_classificazione = aAllVociClassificazioneDef.id_classificazione
         And   cd_cds_area = aUO.cd_unita_padre;

         IBMERR001.RAISE_ERR_GENERICO('Risulta gia'' caricato nel PdgP per il modulo '
                                      ||aModuloTmp.cd_progetto||' ('||aModuloTmp.cd_progetto_sip||') '||
                                      'associato al Cdr '||aDestC.cd_centro_responsabilita||' un dettaglio sulla '||
                                      'classificazione '||aAllVociClassificazioneDef.cd_classificazione||'. '||
                                      'Impossibile lo scarico.');
       Exception
         When No_Data_Found Then
           aDestS:=null;
           aDestS.ESERCIZIO:=aDestC.Esercizio;
           aDestS.CD_CENTRO_RESPONSABILITA:=aDestC.cd_centro_responsabilita;
           aDestS.PG_PROGETTO:=aDestC.pg_progetto;
           aDestS.ID_CLASSIFICAZIONE:=aAllVociClassificazioneDef.id_classificazione;
           aDestS.CD_CDS_AREA:=aUO.cd_unita_padre;

           CNRCTB051.resetCampiImporto(aDestS);

           setImporto(aASSCDPLA, aDestS);

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

           trovatoModuloSpese := False;
           For i In 1..tabModuloSpese.count Loop
             If tabModuloSpese(i).ESERCIZIO = aDestS.ESERCIZIO And
                tabModuloSpese(i).CD_CENTRO_RESPONSABILITA = aDestS.CD_CENTRO_RESPONSABILITA And
                tabModuloSpese(i).PG_PROGETTO = aDestS.PG_PROGETTO And
                tabModuloSpese(i).ID_CLASSIFICAZIONE = aDestS.ID_CLASSIFICAZIONE And
                tabModuloSpese(i).CD_CDS_AREA = aDestS.CD_CDS_AREA Then
                tabModuloSpese(i).IM_SPESE_GEST_DECENTRATA_EST := Nvl(tabModuloSpese(i).IM_SPESE_GEST_DECENTRATA_EST, 0) +
                                                                  Nvl(aDestS.IM_SPESE_GEST_DECENTRATA_EST, 0);
                tabModuloSpese(i).IM_SPESE_GEST_DECENTRATA_INT := Nvl(tabModuloSpese(i).IM_SPESE_GEST_DECENTRATA_INT, 0) +
                                                                  Nvl(aDestS.IM_SPESE_GEST_DECENTRATA_INT, 0);
                tabModuloSpese(i).IM_SPESE_GEST_ACCENTRATA_EST := Nvl(tabModuloSpese(i).IM_SPESE_GEST_ACCENTRATA_EST, 0) +
                                                                  Nvl(aDestS.IM_SPESE_GEST_ACCENTRATA_EST, 0);
                tabModuloSpese(i).IM_SPESE_GEST_ACCENTRATA_INT := Nvl(tabModuloSpese(i).IM_SPESE_GEST_ACCENTRATA_INT, 0) +
                                                                  Nvl(aDestS.IM_SPESE_GEST_ACCENTRATA_INT, 0);
                trovatoModuloSpese := True;
                Exit;
             End If;
           End Loop;
           If Not trovatoModuloSpese Then
             tabModuloSpese(tabModuloSpese.count+1):=aDestS;
           End If;

           aAssSpese:=Null;
           aAssSpese.ESERCIZIO:=aDestS.Esercizio;
           aAssSpese.TI_COSTI_SPESE:=CNRCTB061_APPOGGIO.TAB_COSTI;
           aAssSpese.ID_MATRICOLA:=aASSCDPLA.ti_rapporto;
           aAssSpese.CD_CENTRO_RESPONSABILITA:=aDestS.cd_centro_responsabilita;
           aAssSpese.PG_PROGETTO_COSTI:=aDestS.pg_progetto;
           aAssSpese.PG_RIGA:=0;
           aAssSpese.PG_PROGETTO_SPESE:=aDestS.pg_progetto;
           aAssSpese.ID_CLASSIFICAZIONE:=aDestS.id_classificazione;
           aAssSpese.CD_CDS_AREA:=aDestS.cd_cds_area;
           aAssSpese.DACR:=aTSNow;
           aAssSpese.UTCR:=aUser;
           aAssSpese.DUVA:=aTSNow;
           aAssSpese.UTUV:=aUser;
           aAssSpese.PG_VER_REC:=1;

           tabAssCdpPdgP(tabAssCdpPdgP.count+1):=aAssSpese;
       End;
     End If;

     Update ass_cdp_la
     Set stato = STATO_CDP_PDGP_SCARICATO,
         dt_scarico = aTSNow,
         utuv=aUser,
         duva=aTSNow,
         pg_ver_rec = pg_ver_rec + 1
     Where esercizio = aASSCDPLA.esercizio
     And   mese = 0
     And   cd_linea_attivita = aASSCDPLA.cd_linea_attivita
     And   stato = STATO_CDP_NON_SCARICATO
     And   cd_centro_responsabilita In (Select cd_centro_responsabilita from V_PDGP_CDR_RUO_NRUO
                                        Where esercizio = aEsercizio
 		                        And cd_cdr_root =  aCdCdr
 		                        And (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		                             cd_unita_organizzativa = aUO.cd_unita_organizzativa));
   End loop;

   --Carico la tabella PDG_MODULO_SPESE con i valori conservati nella PLSQLTABLE
   For i In 1..tabModuloSpese.count Loop
     Begin
       -- Leggo il modulo_spese per inserire il dettaglio....se lo trovo sollevo una eccezione
       Select * into aDestS from pdg_modulo_spese
       Where esercizio = tabModuloSpese(i).esercizio
       And   cd_centro_responsabilita = tabModuloSpese(i).cd_centro_responsabilita
       And   pg_progetto = tabModuloSpese(i).pg_progetto
       And   id_classificazione = tabModuloSpese(i).id_classificazione
       And   cd_cds_area = tabModuloSpese(i).cd_cds_area;

       Begin
         Select * into aModulo from progetto_prev
         Where pg_progetto = tabModuloSpese(i).pg_progetto
         And   esercizio = tabModuloSpese(i).esercizio;
       Exception
         When No_Data_Found Then
           IBMERR001.RAISE_ERR_GENERICO('E'' stato imputato, nella ripartizione dei costi del personale, un codice G.A.E. '||
                                       ' al quale risulta associato un progressivo modulo ('||
                                       tabModuloSpese(i).pg_progetto||') inesistente. Impossibile lo scarico.');
       End;

       Begin
         Select * into aAllVociClassificazioneDef from v_classificazione_voci_all
         Where esercizio = tabModuloSpese(i).esercizio
         And   id_classificazione = tabModuloSpese(i).id_classificazione;
       Exception
         When No_Data_Found Then
            IBMERR001.RAISE_ERR_GENERICO('E'' stata indicata, nei costi del personale, un codice elemento voce '||
                                         'con classificazione ('||tabModuloSpese(i).id_classificazione||
                                         ') inesistente. Impossibile lo scarico.');
       End;

       IBMERR001.RAISE_ERR_GENERICO('Risulta gia'' caricato nel PdgP per il modulo '||
                                    aModuloTmp.cd_progetto||' ('||aModuloTmp.cd_progetto_sip||')  '||
                                    'associato al Cdr '||tabModuloSpese(i).cd_centro_responsabilita||' un dettaglio sulla '||
                                    'classificazione '||aAllVociClassificazioneDef.cd_classificazione||'. '||
                                    'Impossibile lo scarico.');
     Exception
       When No_Data_Found Then
          CNRCTB051.INS_PDG_MODULO_SPESE(tabModuloSpese(i));
     End;
   End Loop;

   --Carico la tabella ASS_CDP_PDGP con i valori conservati nella PLSQLTABLE relativamente alla sola
   --tabella PDG_MODULO_SPESE
   For i In 1..tabAssCdpPdgP.count Loop
     Select Nvl(Max(pg_riga), 0) + 1 Into tabAssCdpPdgP(i).pg_riga
     From ASS_CDP_PDGP
     Where ESERCIZIO = tabAssCdpPdgP(i).Esercizio
     And   TI_COSTI_SPESE = tabAssCdpPdgP(i).ti_costi_spese
     And   ID_MATRICOLA = tabAssCdpPdgP(i).id_matricola
     And   CD_CENTRO_RESPONSABILITA = tabAssCdpPdgP(i).cd_centro_responsabilita
     And   PG_PROGETTO_COSTI = tabAssCdpPdgP(i).pg_progetto_costi;

     INS_ASS_CDP_PDGP(tabAssCdpPdgP(i));
   End Loop;

   -- Distribuzione dei rotti su dettagli creati
   For aAssCdpPdgPRnd In (Select * From ass_cdp_pdgp_round
                          Where esercizio = aEsercizio
 		          And   cd_cdr_root = aCDRRUO.cd_centro_responsabilita
 		          For update nowait) loop  -- Cicla sulle configurazioni dei ROTTI

     isDettRedistrRottiFound:=false;

     -- Leggo la voce per recuperare la classificazione
     Begin
       Select * into aVoce from elemento_voce
       Where esercizio = aAssCdpPdgPRnd.esercizio
       And   ti_appartenenza = aAssCdpPdgPRnd.ti_appartenenza
       And   ti_gestione = aAssCdpPdgPRnd.ti_gestione
       And   cd_elemento_voce = aAssCdpPdgPRnd.cd_elemento_voce;
     Exception
       When No_Data_Found Then
          IBMERR001.RAISE_ERR_GENERICO('E'' stata indicata, nei costi del personale, un codice elemento voce '||
                                       aAssCdpPdgPRnd.cd_elemento_voce||' inesistente. Impossibile lo scarico.');
     End;

     If aVoce.id_classificazione Is Null then
        IBMERR001.RAISE_ERR_GENERICO('Manca la classificazione sulla voce '||aVoce.cd_elemento_voce||' dell''esercizio '||aVoce.esercizio||'. Impossibile lo scarico.');
     End if;

     -- Leggo tutta la classificazione per reperire i suoi livelli precedenti
     Begin
       Select * into aAllVociClassificazione from v_classificazione_voci_all
       Where id_classificazione = aVoce.id_classificazione;
     Exception
       When No_Data_Found Then
          IBMERR001.RAISE_ERR_GENERICO('E'' stata indicata, nei costi del personale, un codice elemento voce '||
                                       aAssCdpPdgPRnd.cd_elemento_voce||' con classificazione ('||aVoce.id_classificazione||
                                       ') non presente nella tabella corrispondente. Impossibile lo scarico.');
     End;

     aCdClassificazione := Null;
     -- Individuo la classificazione da utilizzare
     If aParCNR.LIVELLO_PDG_DECIS_SPE = 1 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv1;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 2 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv2;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 3 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv3;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 4 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv4;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 5 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv5;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 6 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv6;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 7 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv7;
     End If;

     If aCdClassificazione Is Null Then
        IBMERR001.RAISE_ERR_GENERICO('E'' stata indicata, nei costi del personale, un codice elemento voce '||
                                     aAssCdpPdgPRnd.cd_elemento_voce||' con classificazione ('||aVoce.id_classificazione||
                                     ') che ha generato anomalia nella ricerca del codice livello necessario per il '||
                                     'caricamento del PdgP. Impossibile lo scarico.'||aParCNR.LIVELLO_PDG_DECIS_SPE);
     End If;

     -- Leggo la classificazione finale da utilizzare per cercare in PDG_MODULO_SPESE
     Begin
       Select * into aAllVociClassificazioneDef from v_classificazione_voci_all
       Where esercizio = aAssCdpPdgPRnd.esercizio
       And   ti_gestione = aAssCdpPdgPRnd.ti_gestione
       And   cd_classificazione = aCdClassificazione;
     Exception
       When No_Data_Found Then
          IBMERR001.RAISE_ERR_GENERICO('E'' stata indicata, nei costi del personale, un codice elemento voce '||
                                       aAssCdpPdgPRnd.cd_elemento_voce||' con classificazione ('||aVoce.id_classificazione||
                                       ') che ha generato anomalia nella ricerca del livello necessario per il '||
                                       'caricamento del PdgP. Impossibile lo scarico.');
     End;

     isVoceTFR:=False;
     If aAssCdpPdgPRnd.cd_elemento_voce = aVoceTFR.cd_elemento_voce Or
        aAssCdpPdgPRnd.cd_elemento_voce = aVoceTFRTEMPODET.cd_elemento_voce Then
        isVoceTFR:=True;
     End If;

     -- Leggo la linea di attivita per recuperare il modulo
     Begin
       Select * into aLATmp from linea_attivita
       Where cd_linea_attivita = aAssCdpPdgPRnd.cd_linea_attivita
       And   cd_centro_responsabilita = aAssCdpPdgPRnd.cd_centro_responsabilita;
     Exception
       When No_Data_Found Then
          IBMERR001.RAISE_ERR_GENERICO('E'' stato imputato, nella ripartizione dei costi del personale, un codice G.A.E. '||
 aAssCdpPdgPRnd.cd_linea_attivita||' per il cdr '||aAssCdpPdgPRnd.cd_centro_responsabilita||' inesistente. Impossibile lo scarico.');
     End;

     If isVoceTFR Then
        For aModSpeDet In (Select p.* From pdg_modulo_costi p
                           Where p.esercizio=aAssCdpPdgPRnd.esercizio
                           And   p.cd_centro_responsabilita=aAssCdpPdgPRnd.cd_cdr_root
                           And   p.pg_progetto = aLATmp.pg_progetto
                           And   Exists (Select 1 From ass_cdp_pdgp
 		                        Where ESERCIZIO=p.esercizio
                                         And   ID_MATRICOLA=aAssCdpPdgPRnd.id_matricola
                                         And   CD_CENTRO_RESPONSABILITA=p.cd_centro_responsabilita
                                         And   PG_PROGETTO=p.pg_progetto)) Loop
           isProcessato:=false;

           If Not isProcessato And
              aAssCdpPdgPRnd.ID_MATRICOLA = CDP_TI_RAPP_DETERMINATO Then

              If (aModSpeDet.IM_CF_TFR_DET=0 and aAssCdpPdgPRnd.im_arr_a1 <> 0) Or
                  aModSpeDet.IM_CF_TFR_DET+aAssCdpPdgPRnd.im_arr_a1 < 0 Then
                 Null;
              Else
                 Update pdg_modulo_costi
                 Set IM_CF_TFR_DET=IM_CF_TFR_DET+aAssCdpPdgPRnd.im_arr_a1,
                     utuv=aUser,
                     duva=aTSNow,
                     pg_ver_rec = pg_ver_rec + 1
 	         Where ESERCIZIO=aModSpeDet.esercizio
                 And   CD_CENTRO_RESPONSABILITA=aModSpeDet.cd_centro_responsabilita
                 And   PG_PROGETTO=aModSpeDet.pg_progetto;

                 isProcessato:=True;
              End If;
           End If;

 	  If Not isProcessato And
              Not aAssCdpPdgPRnd.ID_MATRICOLA = CDP_TI_RAPP_DETERMINATO Then

              If (aModSpeDet.IM_CF_TFR=0 and aAssCdpPdgPRnd.im_arr_a1 <> 0) Or
                  aModSpeDet.IM_CF_TFR+aAssCdpPdgPRnd.im_arr_a1 < 0 Then
                 Null;
              Else
                 Update pdg_modulo_costi
                 Set IM_CF_TFR=IM_CF_TFR+aAssCdpPdgPRnd.im_arr_a1,
                     utuv=aUser,
                     duva=aTSNow,
                     pg_ver_rec = pg_ver_rec + 1
                 Where ESERCIZIO=aModSpeDet.esercizio
                 And   CD_CENTRO_RESPONSABILITA=aModSpeDet.cd_centro_responsabilita
                 And   PG_PROGETTO=aModSpeDet.pg_progetto;

                 isProcessato:=True;
              End If;
           End If;
           If isProcessato Then
 	     Update ass_cdp_pdgp_round
 	     Set pg_progetto_costi = aModSpeDet.pg_progetto,
 	         im_arr_a1_non_distr = round(aAssCdpPdgPRnd.im_arr_a1 - round(aAssCdpPdgPRnd.im_arr_a1,2),30),
 	         im_arr_a2_non_distr = round(aAssCdpPdgPRnd.im_arr_a2 - round(aAssCdpPdgPRnd.im_arr_a2,2),30),
 	         im_arr_a3_non_distr = round(aAssCdpPdgPRnd.im_arr_a3 - round(aAssCdpPdgPRnd.im_arr_a3,2),30),
                 utuv=aUser,
                 duva=aTSNow,
                 pg_ver_rec = pg_ver_rec + 1
              Where ESERCIZIO=aAssCdpPdgPRnd.esercizio
              And   CD_CDR_ROOT=aAssCdpPdgPRnd.cd_cdr_root
              And   TI_APPARTENENZA=aAssCdpPdgPRnd.ti_appartenenza
              And   TI_GESTIONE=aAssCdpPdgPRnd.ti_gestione
              And   CD_ELEMENTO_VOCE=aAssCdpPdgPRnd.cd_elemento_voce
              And   CD_CENTRO_RESPONSABILITA=aAssCdpPdgPRnd.cd_centro_responsabilita
 	      And   ID_MATRICOLA=aAssCdpPdgPRnd.id_matricola;

              isDettRedistrRottiFound:=True;
              Exit;
           End if;
        End Loop;
     End If;

     If Not isVoceTFR And Not isDettRedistrRottiFound Then

        For aModSpeDet In (Select p.* From pdg_modulo_spese p
                           Where p.esercizio=aAssCdpPdgPRnd.esercizio
                           And   p.cd_centro_responsabilita=aAssCdpPdgPRnd.cd_cdr_root
                           And   p.pg_progetto = aLATmp.pg_progetto
                           And   p.id_classificazione = aAllVociClassificazioneDef.id_classificazione
                           And   p.cd_cds_area = aUO.cd_unita_padre
                           And   Exists (Select 1 From ass_cdp_pdgp
 		                         Where ESERCIZIO=p.esercizio
                                         And   ID_MATRICOLA=aAssCdpPdgPRnd.id_matricola
                                         And   CD_CENTRO_RESPONSABILITA=p.cd_centro_responsabilita
                                         And   PG_PROGETTO_SPESE=p.pg_progetto
                                         And   ID_CLASSIFICAZIONE=p.id_classificazione
                                         And   CD_CDS_AREA = p.cd_cds_area)) Loop

           isProcessato:=False;

           If Not isProcessato And
              aModSpeDet.cd_centro_responsabilita=aCDRPersonale.cd_centro_responsabilita And
              (aLATmp.cd_natura = '2' Or aLATmp.cd_natura = '3') Then
              If (aModSpeDet.IM_SPESE_GEST_DECENTRATA_EST=0 and aAssCdpPdgPRnd.im_arr_a1 <> 0) Or
                  aModSpeDet.IM_SPESE_GEST_DECENTRATA_EST+aAssCdpPdgPRnd.im_arr_a1 < 0 Then
                  Null;
              Else
                 Update pdg_modulo_spese
                 Set IM_SPESE_GEST_DECENTRATA_EST=IM_SPESE_GEST_DECENTRATA_EST+aAssCdpPdgPRnd.im_arr_a1,
                     utuv=aUser,
                     duva=aTSNow,
                     pg_ver_rec = pg_ver_rec + 1
 	         Where ESERCIZIO=aModSpeDet.esercizio
                 And   CD_CENTRO_RESPONSABILITA=aModSpeDet.cd_centro_responsabilita
                 And   PG_PROGETTO=aModSpeDet.pg_progetto
                 And   ID_CLASSIFICAZIONE=aModSpeDet.id_classificazione
                 And   CD_CDS_AREA=aModSpeDet.cd_cds_area;

                 isProcessato:=True;
              End If;
           End If;
           If Not isProcessato And
              aModSpeDet.cd_centro_responsabilita=aCDRPersonale.cd_centro_responsabilita And
              Not (aLATmp.cd_natura = '2' Or aLATmp.cd_natura = '3') Then
              If (aModSpeDet.IM_SPESE_GEST_DECENTRATA_INT=0 and aAssCdpPdgPRnd.im_arr_a1 <> 0) Or
                  aModSpeDet.IM_SPESE_GEST_DECENTRATA_INT+aAssCdpPdgPRnd.im_arr_a1 < 0 Then
                  Null;
              Else
                 Update pdg_modulo_spese
                 Set IM_SPESE_GEST_DECENTRATA_INT=IM_SPESE_GEST_DECENTRATA_INT+aAssCdpPdgPRnd.im_arr_a1,
                     utuv=aUser,
                     duva=aTSNow,
                     pg_ver_rec = pg_ver_rec + 1
  	         Where ESERCIZIO=aModSpeDet.esercizio
                 And   CD_CENTRO_RESPONSABILITA=aModSpeDet.cd_centro_responsabilita
                 And   PG_PROGETTO=aModSpeDet.pg_progetto
                 And   ID_CLASSIFICAZIONE=aModSpeDet.id_classificazione
                 And   CD_CDS_AREA=aModSpeDet.cd_cds_area;

                 isProcessato:=True;
              End If;
           End If;
           If Not isProcessato And
              Not aModSpeDet.cd_centro_responsabilita=aCDRPersonale.cd_centro_responsabilita And
              (aLATmp.cd_natura = '2' Or aLATmp.cd_natura = '3') Then
              If (aModSpeDet.IM_SPESE_GEST_ACCENTRATA_EST=0 and aAssCdpPdgPRnd.im_arr_a1 <> 0) Or
                  aModSpeDet.IM_SPESE_GEST_ACCENTRATA_EST+aAssCdpPdgPRnd.im_arr_a1 < 0 Then
                  Null;
              Else
                 Update pdg_modulo_spese
                 Set IM_SPESE_GEST_ACCENTRATA_EST=IM_SPESE_GEST_ACCENTRATA_EST+aAssCdpPdgPRnd.im_arr_a1,
                     utuv=aUser,
                     duva=aTSNow,
                     pg_ver_rec = pg_ver_rec + 1
 	         Where ESERCIZIO=aModSpeDet.esercizio
                 And   CD_CENTRO_RESPONSABILITA=aModSpeDet.cd_centro_responsabilita
                 And   PG_PROGETTO=aModSpeDet.pg_progetto
                 And   ID_CLASSIFICAZIONE=aModSpeDet.id_classificazione
                 And   CD_CDS_AREA=aModSpeDet.cd_cds_area;

                 isProcessato:=True;
              End If;
           End If;
           If Not isProcessato And
              Not aModSpeDet.cd_centro_responsabilita=aCDRPersonale.cd_centro_responsabilita And
              Not (aLATmp.cd_natura = '2' Or aLATmp.cd_natura = '3') Then
              If (aModSpeDet.IM_SPESE_GEST_ACCENTRATA_INT=0 and aAssCdpPdgPRnd.im_arr_a1 <> 0) Or
                  aModSpeDet.IM_SPESE_GEST_ACCENTRATA_INT+aAssCdpPdgPRnd.im_arr_a1 < 0 Then
                  Null;
              Else
                 Update pdg_modulo_spese
                 Set IM_SPESE_GEST_ACCENTRATA_INT=IM_SPESE_GEST_ACCENTRATA_INT+aAssCdpPdgPRnd.im_arr_a1,
                     utuv=aUser,
                     duva=aTSNow,
                     pg_ver_rec = pg_ver_rec + 1
 	         Where ESERCIZIO=aModSpeDet.esercizio
                 And   CD_CENTRO_RESPONSABILITA=aModSpeDet.cd_centro_responsabilita
                 And   PG_PROGETTO=aModSpeDet.pg_progetto
                 And   ID_CLASSIFICAZIONE=aModSpeDet.id_classificazione
                 And   CD_CDS_AREA=aModSpeDet.cd_cds_area;

                 isProcessato:=True;
              End If;
           End If;
           If isProcessato Then
 	     Update ass_cdp_pdgp_round
 	     Set pg_progetto_spese = aModSpeDet.pg_progetto,
 	         id_classificazione = aModSpeDet.id_classificazione,
 	         cd_cds_area = aModSpeDet.cd_cds_area,
 	         im_arr_a1_non_distr = round(aAssCdpPdgPRnd.im_arr_a1 - round(aAssCdpPdgPRnd.im_arr_a1,2),30),
 	         im_arr_a2_non_distr = round(aAssCdpPdgPRnd.im_arr_a2 - round(aAssCdpPdgPRnd.im_arr_a2,2),30),
 	         im_arr_a3_non_distr = round(aAssCdpPdgPRnd.im_arr_a3 - round(aAssCdpPdgPRnd.im_arr_a3,2),30),
                 utuv=aUser,
                 duva=aTSNow,
                 pg_ver_rec = pg_ver_rec + 1
              Where ESERCIZIO=aAssCdpPdgPRnd.esercizio
              And   CD_CDR_ROOT=aAssCdpPdgPRnd.cd_cdr_root
              And   TI_APPARTENENZA=aAssCdpPdgPRnd.ti_appartenenza
              And   TI_GESTIONE=aAssCdpPdgPRnd.ti_gestione
              And   CD_ELEMENTO_VOCE=aAssCdpPdgPRnd.cd_elemento_voce
              And   CD_CENTRO_RESPONSABILITA=aAssCdpPdgPRnd.cd_centro_responsabilita
 	      And   CD_LINEA_ATTIVITA=aAssCdpPdgPRnd.cd_linea_attivita
 	      And   ID_MATRICOLA=aAssCdpPdgPRnd.id_matricola;

              isDettRedistrRottiFound:=True;
 	  End If;
        End Loop;
      End If;

      If not isDettRedistrRottiFound Then
        IBMERR001.RAISE_ERR_GENERICO('Impossibile redistribuire i rotti per cdr RUO: '||aAssCdpPdgPRnd.cd_cdr_root||' es: '||aAssCdpPdgPRnd.esercizio||' voce del piano: '||aAssCdpPdgPRnd.cd_elemento_voce||' tipo rapporto: '||aAssCdpPdgPRnd.id_matricola);
      End if;
   End loop;
 End;

 Procedure annullaCDPSuPdgP(aEsercizio number, aCdCdr varchar2, aUser varchar2) is
   aTSNow date;
   aCDRRUO cdr%Rowtype;
   aUO unita_organizzativa%Rowtype;
   aNum number(8);
   aModuloTmp progetto_prev%Rowtype;
 Begin
   aTSNow:=sysdate;

   -- Leggo il CDR

   aCDRRUO:=CNRCTB020.GETCDRVALIDO(aEsercizio, aCdCdr);

   -- Leggo la UO del CDR
   aUO := CNRCTB020.getUO(aCDRRUO);

   if to_number(aCDRRUO.cd_proprio_cdr) != 0 then
     IBMERR001.RAISE_ERR_GENERICO('Operazione permessa solo su CDR di tipo RUO!');
   end if;

   Select count(*) into aNum from ass_cdp_pdgp
   Where esercizio = aEsercizio
   And   ti_costi_spese = CNRCTB061_APPOGGIO.TAB_COSTI
   And   cd_centro_responsabilita in (Select cd_centro_responsabilita from V_PDGP_CDR_RUO_NRUO
                                      Where esercizio = aEsercizio
 		                      And cd_cdr_root =  aCdCdr
 		                      And   (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		                             cd_unita_organizzativa = aUO.cd_unita_organizzativa));

   if aNum = 0 then
     IBMERR001.RAISE_ERR_GENERICO('Operazione di scarico non ancora effettuata per cdr '||aCdCdr);
   end if;

   -- Controllo modificabilita PDG CDR RUO/NRUO
   For aPDGP in PDGP_CON_CONFIG_SCR(aEsercizio, aCDRRUO.cd_centro_responsabilita, aUO) loop
     If not (aPDGP.stato in (
 	    CNRCTB051.STATO_PDGP_APERTURA,
 	    CNRCTB051.STATO_PDGP_ADEGUAMENTO)) Then

       -- Leggo il modulo per recuperare la descrizione
       Select * into aModuloTmp from progetto_prev
       Where pg_progetto = aPDGP.pg_progetto
       And   esercizio = aEsercizio;

       IBMERR001.RAISE_ERR_GENERICO('Il piano di gestione preliminare del CDR NRUO '||aPDGP.cd_centro_responsabilita||
                                    ' per il modulo '||aModuloTmp.cd_progetto||' ('||aModuloTmp.cd_progetto_sip||') non e'' in stato di apertura o di adeguamento!');
     End if;
   End loop;

   -- Eliminazione del dettaglio principale nel CDR di origine
   For aAssCdpPdgP In (Select * from ass_cdp_pdgp
                       Where esercizio = aEsercizio
                       And   ti_costi_spese = CNRCTB061_APPOGGIO.TAB_COSTI
                       And   cd_centro_responsabilita in (Select cd_centro_responsabilita from V_PDGP_CDR_RUO_NRUO
                                                          Where esercizio = aEsercizio
 		                                          And   cd_cdr_root =  aCdCdr
                 		                          And  (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		                                                cd_unita_organizzativa = aUO.cd_unita_organizzativa))) Loop
     -- Prima le spese
     Delete From pdg_modulo_spese
     Where esercizio = aAssCdpPdgP.esercizio
     And   cd_centro_responsabilita = aAssCdpPdgP.cd_centro_responsabilita
     And   pg_progetto = aAssCdpPdgP.pg_progetto_spese
     And   id_classificazione = aAssCdpPdgP.id_classificazione
     And   cd_cds_area = aAssCdpPdgP.cd_cds_area;

     Update pdg_modulo_costi
     Set IM_CF_TFR     = 0,
         IM_CF_TFR_DET = 0,
         utuv=aUser,
         duva=aTSNow,
         pg_ver_rec = pg_ver_rec + 1
     Where esercizio = aAssCdpPdgP.esercizio
     And   cd_centro_responsabilita = aAssCdpPdgP.cd_centro_responsabilita
     And   pg_progetto = aAssCdpPdgP.pg_progetto_costi;

     Delete ass_cdp_pdgp
     Where esercizio = aAssCdpPdgP.esercizio
     And   cd_centro_responsabilita = aAssCdpPdgP.cd_centro_responsabilita
     And   pg_progetto_costi = aAssCdpPdgP.pg_progetto_costi;

     Delete ass_cdp_pdgp_round
     Where esercizio = aAssCdpPdgP.esercizio
     And   cd_cdr_root = aAssCdpPdgP.cd_centro_responsabilita
     And   pg_progetto_costi = aAssCdpPdgP.pg_progetto_costi;
   End Loop;

   Update ass_cdp_la
   Set stato = STATO_CDP_NON_SCARICATO,
       dt_scarico = Null,
       utuv = aUser,
       duva = aTSNow,
       pg_ver_rec = pg_ver_rec + 1
   Where esercizio = aEsercizio
   And   mese = 0
   And   cd_centro_responsabilita In (Select cd_centro_responsabilita from V_PDGP_CDR_RUO_NRUO
                                      Where esercizio = aEsercizio
 		                      And   cd_cdr_root =  aCdCdr
 		                      And  (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		                            cd_unita_organizzativa = aUO.cd_unita_organizzativa));
 End;

 Procedure ins_COSTO_DEL_DIPENDENTE (aDest COSTO_DEL_DIPENDENTE%rowtype) is
 Begin
   Insert into COSTO_DEL_DIPENDENTE (
     ESERCIZIO
    ,TI_PREV_CONS
    ,ID_MATRICOLA
    ,TI_APPARTENENZA
    ,TI_GESTIONE
    ,CD_ELEMENTO_VOCE
    ,CD_UNITA_ORGANIZZATIVA
    ,TI_RAPPORTO
    ,IM_A1
    ,IM_A2
    ,IM_A3
    ,IM_ONERI_CNR_A1
    ,IM_ONERI_CNR_A2
    ,IM_ONERI_CNR_A3
    ,IM_TFR_A1
    ,IM_TFR_A2
    ,IM_TFR_A3
    ,DT_SCARICO
    ,DACR
    ,UTCR
    ,UTUV
    ,DUVA
    ,PG_VER_REC
   ) values (
     aDest.ESERCIZIO
    ,aDest.TI_PREV_CONS
    ,aDest.ID_MATRICOLA
    ,aDest.TI_APPARTENENZA
    ,aDest.TI_GESTIONE
    ,aDest.CD_ELEMENTO_VOCE
    ,aDest.CD_UNITA_ORGANIZZATIVA
    ,aDest.TI_RAPPORTO
    ,aDest.IM_A1
    ,aDest.IM_A2
    ,aDest.IM_A3
    ,aDest.IM_ONERI_CNR_A1
    ,aDest.IM_ONERI_CNR_A2
    ,aDest.IM_ONERI_CNR_A3
    ,aDest.IM_TFR_A1
    ,aDest.IM_TFR_A2
    ,aDest.IM_TFR_A3
    ,aDest.DT_SCARICO
    ,aDest.DACR
    ,aDest.UTCR
    ,aDest.UTUV
    ,aDest.DUVA
    ,aDest.PG_VER_REC
    );
 End;

 Procedure scaricaCDPSuPdg(aEsercizio number, aCdCdr varchar2, aUser varchar2) is
   aCDRRUO cdr%Rowtype;
   aUO unita_organizzativa%Rowtype;

   aAssSpese ass_cdp_pdgp%Rowtype;

   Type typeModuloSpeseGest Is Table Of pdg_modulo_spese_gest%Rowtype Index By BINARY_INTEGER;
   tabModuloSpeseGest typeModuloSpeseGest;
   trovatoModuloSpeseGest Boolean := False;

   aDestS    pdg_modulo_spese_gest%Rowtype;

   aTSNow DATE;
   aDescrizione pdg_modulo_spese_gest.descrizione%Type := 'Inserimento automatico proveniente dallo scarico dei costi del personale.';
   aModuloTmp progetto_gest%Rowtype;

   aNum NUMBER(8);

   aVoce elemento_voce%Rowtype;
   aVoceTFR elemento_voce%Rowtype;
   aVoceTFRTEMPODET elemento_voce%Rowtype;
   aVoceONERICNR elemento_voce%Rowtype;
   aVoceONERICNRTEMPODET elemento_voce%Rowtype;
   aParCNR parametri_cnr%Rowtype;
   aCdClassificazione v_classificazione_voci_all.cd_classificazione%Type;
   aAllVociClassificazione v_classificazione_voci_all%Rowtype;
   aAllVociClassificazioneDef v_classificazione_voci_all%Rowtype;
   isTempoDeterminato Boolean;

   aLATmp  linea_attivita%Rowtype;
   aModulo progetto_gest%Rowtype;
   isDettRedistrRottiFound Boolean;
   isProcessato Boolean;
   isVoceTFR Boolean;
   aCDRPersonale cdr%Rowtype;
   esci exception;
 Begin
   aTSNow:=sysdate;

   -- Leggo il CDR
   aCDRRUO:=CNRCTB020.GETCDRVALIDO(aEsercizio, aCdCdr);

   -- Leggo la UO del CDR
   aUO := CNRCTB020.getUO(aCDRRUO);

   if to_number(aCDRRUO.cd_proprio_cdr) != 0 then
     IBMERR001.RAISE_ERR_GENERICO('Operazione permessa solo su cdr di tipo RUO!');
   end if;

   -- Leggo il CDR del personale

   aCDRPersonale:=CNRCTB020.GETCDRPERSONALE;

   Select count(*) into aNum
   From ass_cdp_pdgp
   Where esercizio = aEsercizio
   And   ti_costi_spese = CNRCTB061_APPOGGIO.TAB_COSTI
   And   cd_centro_responsabilita in (Select cd_centro_responsabilita
                                      From V_PDGP_CDR_RUO_NRUO
                                      Where esercizio = aEsercizio
 		                      And   cd_cdr_root =  aCdCdr
 		                      And  (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		                            cd_unita_organizzativa = aUO.cd_unita_organizzativa));

   If aNum = 0 then
     Select count(*) into aNum
     From V_CDP_SPACCATO_CDR_LA_VOCE
     Where esercizio = aEsercizio
     And mese = 0
     And cd_cdr_root In (Select cd_centro_responsabilita from V_PDGP_CDR_RUO_NRUO
                         Where esercizio = aEsercizio
       		         And   cd_cdr_root =  aCdCdr
       		         And  (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		               cd_unita_organizzativa = aUO.cd_unita_organizzativa));


     If aNum = 0 then
       --vuol dire che non ci sono costi da ripartire
       Raise esci;
     End If;
     IBMERR001.RAISE_ERR_GENERICO('Operazione di scarico sul PDGP non effettuata su cdr '||aCdCdr);
   End if;

   Select count(*) into aNum
   From ass_cdp_la
   Where esercizio = aEsercizio
   And   mese = 0
   And   cd_centro_responsabilita in (Select cd_centro_responsabilita
                                      From V_PDGP_CDR_RUO_NRUO
                                      Where esercizio = aEsercizio
 		                      And   cd_cdr_root =  aCdCdr
 		                      And  (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		                            cd_unita_organizzativa = aUO.cd_unita_organizzativa))
   And   stato != STATO_CDP_PDGP_SCARICATO;

   If aNum != 0 then
     IBMERR001.RAISE_ERR_GENERICO('Operazione non effettuata. Esistono dettagli (ASS_CDP_LA) non ancora scaricati sul PDGP');
   Else
     Update ass_cdp_la
     Set stato = STATO_CDP_NON_SCARICATO
     Where esercizio = aEsercizio
     And   mese = 0
     And   cd_centro_responsabilita in (Select cd_centro_responsabilita
                                        From V_PDGP_CDR_RUO_NRUO
                                        Where esercizio = aEsercizio
 	  	                        And   cd_cdr_root =  aCdCdr
 		                        And  (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		                              cd_unita_organizzativa = aUO.cd_unita_organizzativa));
   End if;

   -- Carico la voce del piano TFR e ONERICNR per il personale a tempo indeterminato

   aVoceTFR:=CNRCTB000.GETVOCETFR(aEsercizio);
   aVoceONERICNR:=CNRCTB000.GETVOCEONERICNR(aEsercizio);

   -- Carico la voce del piano TFR e ONERICNR per il personale a tempo determinato

   aVoceTFRTEMPODET:=CNRCTB000.GETVOCETFRTEMPODET(aEsercizio);
   aVoceONERICNRTEMPODET:=CNRCTB000.GETVOCEONERICNRTEMPODET(aEsercizio);

   -- Leggo i parametri per conoscere il livello classificazione di inserimento

   Begin
     Select * into aParCNR from parametri_cnr
     Where esercizio = aEsercizio;
   Exception
     When No_Data_Found Then
        IBMERR001.RAISE_ERR_GENERICO('Mancano i parametri CNR per l''esercizio '||aEsercizio||
                                     'necessari per la determinazione del livello classificazione da utilizzare per '||
                                     'il caricamento del Pdg. Impossibile lo scarico.');
   End;

   -- Lock del PDG del CDR in processo
   CNRCTB051.LOCKPDGP(aEsercizio, aCdCdr);

   -- Start dello scarico su PDG dei costi del personale
   For aASSCDPLA In (
     Select * From V_CDP_SPACCATO_CDR_LA_VOCE Where
 	          esercizio = aEsercizio
 		  And mese = 0
 		  And cd_cdr_root In (Select cd_centro_responsabilita from V_PDGP_CDR_RUO_NRUO
                                      Where esercizio = aEsercizio
 		                      And   cd_cdr_root =  aCdCdr
 		                      And  (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		                            cd_unita_organizzativa = aUO.cd_unita_organizzativa))
 		  Order by cd_cdr) loop  -- Cicla sulle configurazioni di scarico

     -- Determina il tipo di rapporto dalla tabella COSTO_DEL_DIPENDENTE

     isTempoDeterminato:=false;
     If aASSCDPLA.ti_rapporto = CDP_TI_RAPP_DETERMINATO Then
       isTempoDeterminato:=true;
     End if;

     -- Leggo la linea di attivita per aggiornare il dettaglio del PDG con funzione e natura
     Begin
       Select * into aLATmp from linea_attivita
       Where cd_linea_attivita = aASSCDPLA.cd_linea_attivita
       And   cd_centro_responsabilita = aASSCDPLA.cd_cdr;
     Exception
       When No_Data_Found Then
          IBMERR001.RAISE_ERR_GENERICO('E'' stato imputato, nella ripartizione dei costi del personale, un codice G.A.E. '||
 aASSCDPLA.cd_linea_attivita||' per il cdr '||aASSCDPLA.cd_cdr||' inesistente. Impossibile lo scarico.');
     End;

     If aLaTmp.cd_natura = '5' then
        IBMERR001.RAISE_ERR_GENERICO('Esiste una ripartizione dei CDP su G.A.E. di natura 5. Impossibile lo scarico.');
     End if;

     -- Leggo la voce per recuperare la classificazione
     Begin
       Select * into aVoce from elemento_voce
       Where esercizio = aASSCDPLA.esercizio
       And   ti_appartenenza = aASSCDPLA.ti_appartenenza
       And   ti_gestione = aASSCDPLA.ti_gestione
       And   cd_elemento_voce = aASSCDPLA.cd_elemento_voce;
     Exception
       When No_Data_Found Then
          IBMERR001.RAISE_ERR_GENERICO('E'' stata indicata, nei costi del personale, un codice elemento voce '||
                                       aASSCDPLA.cd_elemento_voce||' inesistente. Impossibile lo scarico.');
     End;

     If aVoce.id_classificazione Is Null then
        IBMERR001.RAISE_ERR_GENERICO('Manca la classificazione sulla voce '||aVoce.cd_elemento_voce||' dell''esercizio '||aVoce.esercizio||'. Impossibile lo scarico.');
     End if;

     -- Leggo tutta la classificazione per reperire i suoi livelli precedenti
     Begin
       Select * into aAllVociClassificazione from v_classificazione_voci_all
       Where id_classificazione = aVoce.id_classificazione;
     Exception
       When No_Data_Found Then
          IBMERR001.RAISE_ERR_GENERICO('E'' stata indicata, nei costi del personale, un codice elemento voce '||
                                       aASSCDPLA.cd_elemento_voce||' con classificazione ('||aVoce.id_classificazione||
                                       ') non presente nella tabella corrispondente. Impossibile lo scarico.');
     End;

     aCdClassificazione := Null;
     -- Individuo la classificazione da utilizzare
     If aParCNR.LIVELLO_PDG_DECIS_SPE = 1 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv1;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 2 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv2;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 3 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv3;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 4 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv4;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 5 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv5;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 6 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv6;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 7 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv7;
     End If;

     If aCdClassificazione Is Null Then
        IBMERR001.RAISE_ERR_GENERICO('E'' stata indicata, nei costi del personale, un codice elemento voce '||
                                     aASSCDPLA.cd_elemento_voce||' con classificazione ('||aVoce.id_classificazione||
                                     ') che ha generato anomalia nella ricerca del codice livello necessario per il '||
                                     'caricamento del Pdg. Impossibile lo scarico.'||aParCNR.LIVELLO_PDG_DECIS_SPE);
     End If;

     -- Leggo la classificazione finale da inserire in PDG_MODULO_SPESE
     Begin
       Select * into aAllVociClassificazioneDef from v_classificazione_voci_all
       Where esercizio = aASSCDPLA.esercizio
       And   ti_gestione = aASSCDPLA.ti_gestione
       And   cd_classificazione = aCdClassificazione;
     Exception
       When No_Data_Found Then
          IBMERR001.RAISE_ERR_GENERICO('E'' stata indicata, nei costi del personale, un codice elemento voce '||
                                       aASSCDPLA.cd_elemento_voce||' con classificazione ('||aVoce.id_classificazione||
                                       ') che ha generato anomalia nella ricerca del livello necessario per il '||
                                       'caricamento del PdgP. Impossibile lo scarico.');
     End;

     isVoceTFR:=False;
     If aASSCDPLA.cd_elemento_voce = aVoceTFR.cd_elemento_voce Or
        aASSCDPLA.cd_elemento_voce = aVoceTFRTEMPODET.cd_elemento_voce Then
        isVoceTFR:=True;
     End If;

     If Not (isVoceTFR) Then
        trovatoModuloSpeseGest := False;
        For i In 1..tabModuloSpeseGest.count Loop
          If tabModuloSpeseGest(i).ESERCIZIO = aEsercizio And
             tabModuloSpeseGest(i).CD_CENTRO_RESPONSABILITA = aCDRRUO.cd_centro_responsabilita And
             tabModuloSpeseGest(i).PG_PROGETTO = aLATmp.pg_progetto And
             tabModuloSpeseGest(i).ID_CLASSIFICAZIONE = aAllVociClassificazioneDef.id_classificazione And
             tabModuloSpeseGest(i).CD_CDS_AREA = aUO.cd_unita_padre And
             tabModuloSpeseGest(i).CD_CDR_ASSEGNATARIO = aASSCDPLA.cd_cdr And
             tabModuloSpeseGest(i).CD_LINEA_ATTIVITA = aASSCDPLA.cd_linea_attivita And
             tabModuloSpeseGest(i).TI_APPARTENENZA = aASSCDPLA.ti_appartenenza And
             tabModuloSpeseGest(i).TI_GESTIONE = aASSCDPLA.ti_gestione And
             tabModuloSpeseGest(i).CD_ELEMENTO_VOCE = aASSCDPLA.cd_elemento_voce Then
             tabModuloSpeseGest(i).IM_SPESE_GEST_DECENTRATA_EST := Nvl(tabModuloSpeseGest(i).IM_SPESE_GEST_DECENTRATA_EST, 0) +
                                                               Nvl(aDestS.IM_SPESE_GEST_DECENTRATA_EST, 0);
             tabModuloSpeseGest(i).IM_SPESE_GEST_DECENTRATA_INT := Nvl(tabModuloSpeseGest(i).IM_SPESE_GEST_DECENTRATA_INT, 0) +
                                                               Nvl(aDestS.IM_SPESE_GEST_DECENTRATA_INT, 0);
             tabModuloSpeseGest(i).IM_SPESE_GEST_ACCENTRATA_EST := Nvl(tabModuloSpeseGest(i).IM_SPESE_GEST_ACCENTRATA_EST, 0) +
                                                               Nvl(aDestS.IM_SPESE_GEST_ACCENTRATA_EST, 0);
             tabModuloSpeseGest(i).IM_SPESE_GEST_ACCENTRATA_INT := Nvl(tabModuloSpeseGest(i).IM_SPESE_GEST_ACCENTRATA_INT, 0) +
                                                               Nvl(aDestS.IM_SPESE_GEST_ACCENTRATA_INT, 0);
             trovatoModuloSpeseGest := True;
             Exit;
          End If;
        End Loop;
        If Not trovatoModuloSpeseGest Then
          aDestS:=null;
          aDestS.ESERCIZIO:=aEsercizio;
          aDestS.CD_CENTRO_RESPONSABILITA:=aCDRRUO.cd_centro_responsabilita;
          aDestS.PG_PROGETTO:=aLATmp.pg_progetto;
          aDestS.ID_CLASSIFICAZIONE:=aAllVociClassificazioneDef.id_classificazione;
          aDestS.CD_CDS_AREA:=aUO.cd_unita_padre;
          aDestS.CD_CDR_ASSEGNATARIO := aASSCDPLA.cd_cdr;
          aDestS.CD_LINEA_ATTIVITA := aASSCDPLA.cd_linea_attivita;
          aDestS.TI_APPARTENENZA := aASSCDPLA.ti_appartenenza;
          aDestS.TI_GESTIONE := aASSCDPLA.ti_gestione;
          aDestS.CD_ELEMENTO_VOCE := aASSCDPLA.cd_elemento_voce;
          aDestS.DT_REGISTRAZIONE := aTSNow;
          aDestS.DESCRIZIONE := aDescrizione;
          aDestS.ORIGINE := CNRCTB061_APPOGGIO.ORIGINE_PREVISIONE;
          aDestS.CATEGORIA_DETTAGLIO := CNRCTB061_APPOGGIO.CATEGORIA_STIPENDI;
          aDestS.FL_SOLA_LETTURA := 'Y';

          CNRCTB051.resetCampiImporto(aDestS);

          setImporto(aASSCDPLA, aDestS);

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

          tabModuloSpeseGest(tabModuloSpeseGest.count+1):=aDestS;
        End If;
     End If;

     Update ass_cdp_la
     Set stato = STATO_CDP_SCARICATO,
         dt_scarico = aTSNow,
         utuv=aUser,
         duva=aTSNow,
         pg_ver_rec = pg_ver_rec + 1
     Where esercizio = aEsercizio
     And   mese = 0
     And   cd_linea_attivita = aASSCDPLA.cd_linea_attivita
     And   stato = STATO_CDP_NON_SCARICATO
     And   cd_centro_responsabilita In (Select cd_centro_responsabilita from V_PDGP_CDR_RUO_NRUO
                                        Where esercizio = aEsercizio
 		                        And   cd_cdr_root =  aCdCdr
 		                        And  (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		                              cd_unita_organizzativa = aUO.cd_unita_organizzativa));
   End Loop;

   --Carico la tabella PDG_MODULO_SPESE_GEST con i valori conservati nella PLSQLTABLE
   For i In 1..tabModuloSpeseGest.count Loop
     Begin
       -- Leggo il modulo_spese per inserire il dettaglio....se lo trovo sollevo una eccezione
       Select * into aDestS from pdg_modulo_spese_gest
       Where esercizio = tabModuloSpeseGest(i).esercizio
       And   cd_centro_responsabilita = tabModuloSpeseGest(i).cd_centro_responsabilita
       And   pg_progetto = tabModuloSpeseGest(i).pg_progetto
       And   id_classificazione = tabModuloSpeseGest(i).id_classificazione
       And   cd_cds_area = tabModuloSpeseGest(i).cd_cds_area
       And   cd_cdr_assegnatario = tabModuloSpeseGest(i).cd_cdr_assegnatario
       And   cd_linea_attivita = tabModuloSpeseGest(i).cd_linea_attivita
       And   ti_appartenenza = tabModuloSpeseGest(i).ti_appartenenza
       And   ti_gestione = tabModuloSpeseGest(i).ti_gestione
       And   cd_elemento_voce = tabModuloSpeseGest(i).cd_elemento_voce;

       Begin
         Select * into aModulo from progetto_gest
         Where pg_progetto = tabModuloSpeseGest(i).pg_progetto
         And   esercizio = tabModuloSpeseGest(i).esercizio;
       Exception
         When No_Data_Found Then
           IBMERR001.RAISE_ERR_GENERICO('E'' stato imputato, nella ripartizione dei costi del personale, un codice G.A.E. '||
                                       ' al quale risulta associato un progressivo modulo ('||
                                       tabModuloSpeseGest(i).pg_progetto||') inesistente. Impossibile lo scarico.');
       End;

       Begin
         Select * into aAllVociClassificazioneDef from v_classificazione_voci_all
         Where esercizio = tabModuloSpeseGest(i).esercizio
         And   id_classificazione = tabModuloSpeseGest(i).id_classificazione;
       Exception
         When No_Data_Found Then
            IBMERR001.RAISE_ERR_GENERICO('E'' stata indicata, nei costi del personale, un codice elemento voce '||
                                         'con classificazione ('||tabModuloSpeseGest(i).id_classificazione||
                                         ') inesistente. Impossibile lo scarico.');
       End;

       IBMERR001.RAISE_ERR_GENERICO('Risulta gia'' caricato nel Pdg per il modulo '
                                    ||aModuloTmp.cd_progetto||' ('||aModuloTmp.cd_progetto_sip||') '||
                                    'associato al Cdr '||tabModuloSpeseGest(i).cd_centro_responsabilita||' e alla '||
                                    'classificazione '||aAllVociClassificazioneDef.cd_classificazione||
                                    ' un dettaglio sull''elemento voce '||tabModuloSpeseGest(i).cd_elemento_voce||
                                    ' per la G.a.e. '||tabModuloSpeseGest(i).cd_linea_attivita||'. '||
                                    'Impossibile lo scarico.');
     Exception
       When No_Data_Found Then
          Dbms_Output.put_line('inserisco - '||
          tabModuloSpeseGest(i).esercizio||' '||
          tabModuloSpeseGest(i).cd_centro_responsabilita||' '||
          tabModuloSpeseGest(i).pg_progetto ||' '||
          tabModuloSpeseGest(i).id_classificazione||' '||
          tabModuloSpeseGest(i).cd_cds_area);
          CNRCTB051.INS_PDG_MODULO_SPESE_GEST(tabModuloSpeseGest(i));
     End;
   End Loop;

   -- Distribuzione dei rotti su dettagli creati
   For aAssCdpPdgPRnd In (Select * From ass_cdp_pdgp_round
                          Where esercizio = aEsercizio
 		          And   cd_cdr_root = aCDRRUO.cd_centro_responsabilita
 		          And   pg_progetto_spese Is Not Null
 		          For update nowait) loop  -- Cicla sulle configurazioni dei ROTTI

     isDettRedistrRottiFound:=false;

     -- Leggo la voce per recuperare la classificazione
     Begin
       Select * into aVoce from elemento_voce
       Where esercizio = aAssCdpPdgPRnd.esercizio
       And   ti_appartenenza = aAssCdpPdgPRnd.ti_appartenenza
       And   ti_gestione = aAssCdpPdgPRnd.ti_gestione
       And   cd_elemento_voce = aAssCdpPdgPRnd.cd_elemento_voce;
     Exception
       When No_Data_Found Then
          IBMERR001.RAISE_ERR_GENERICO('E'' stata indicata, nei costi del personale, un codice elemento voce '||
                                       aAssCdpPdgPRnd.cd_elemento_voce||' inesistente. Impossibile lo scarico.');
     End;

     If aVoce.id_classificazione Is Null then
        IBMERR001.RAISE_ERR_GENERICO('Manca la classificazione sulla voce '||aVoce.cd_elemento_voce||' dell''esercizio '||aVoce.esercizio||'. Impossibile lo scarico.');
     End if;

     -- Leggo tutta la classificazione per reperire i suoi livelli precedenti
     Begin
       Select * into aAllVociClassificazione from v_classificazione_voci_all
       Where id_classificazione = aVoce.id_classificazione;
     Exception
       When No_Data_Found Then
          IBMERR001.RAISE_ERR_GENERICO('E'' stata indicata, nei costi del personale, un codice elemento voce '||
                                       aAssCdpPdgPRnd.cd_elemento_voce||' con classificazione ('||aVoce.id_classificazione||
                                       ') non presente nella tabella corrispondente. Impossibile lo scarico.');
     End;

     aCdClassificazione := Null;
     -- Individuo la classificazione da utilizzare
     If aParCNR.LIVELLO_PDG_DECIS_SPE = 1 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv1;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 2 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv2;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 3 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv3;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 4 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv4;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 5 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv5;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 6 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv6;
     ElsIf aParCNR.LIVELLO_PDG_DECIS_SPE = 7 Then
       aCdClassificazione := aAllVociClassificazione.cd_liv7;
     End If;

     If aCdClassificazione Is Null Then
        IBMERR001.RAISE_ERR_GENERICO('E'' stata indicata, nei costi del personale, un codice elemento voce '||
                                     aAssCdpPdgPRnd.cd_elemento_voce||' con classificazione ('||aVoce.id_classificazione||
                                     ') che ha generato anomalia nella ricerca del codice livello necessario per il '||
                                     'caricamento del Pdg. Impossibile lo scarico.'||aParCNR.LIVELLO_PDG_DECIS_SPE);
     End If;

     -- Leggo la classificazione finale da utilizzare per cercare in PDG_MODULO_SPESE_GEST
     Begin
       Select * into aAllVociClassificazioneDef from v_classificazione_voci_all
       Where esercizio = aAssCdpPdgPRnd.esercizio
       And   ti_gestione = aAssCdpPdgPRnd.ti_gestione
       And   cd_classificazione = aCdClassificazione;
     Exception
       When No_Data_Found Then
          IBMERR001.RAISE_ERR_GENERICO('E'' stata indicata, nei costi del personale, un codice elemento voce '||
                                       aAssCdpPdgPRnd.cd_elemento_voce||' con classificazione ('||aVoce.id_classificazione||
                                       ') che ha generato anomalia nella ricerca del livello necessario per il '||
                                       'caricamento del Pdg. Impossibile lo scarico.');
     End;

     isVoceTFR:=False;
     If aAssCdpPdgPRnd.cd_elemento_voce = aVoceTFR.cd_elemento_voce Or
        aAssCdpPdgPRnd.cd_elemento_voce = aVoceTFRTEMPODET.cd_elemento_voce Then
        isVoceTFR:=True;
     End If;

     -- Leggo la linea di attivita per recuperare il modulo
     Begin
       Select * into aLATmp from linea_attivita
       Where cd_linea_attivita = aAssCdpPdgPRnd.cd_linea_attivita
       And   cd_centro_responsabilita = aAssCdpPdgPRnd.cd_centro_responsabilita;
     Exception
       When No_Data_Found Then
          IBMERR001.RAISE_ERR_GENERICO('E'' stato imputato, nella ripartizione dei costi del personale, un codice G.A.E. '||
 aAssCdpPdgPRnd.cd_linea_attivita||' per il cdr '||aAssCdpPdgPRnd.cd_centro_responsabilita||' inesistente. Impossibile lo scarico.');
     End;

     If Not isVoceTFR Then
        For aModSpeDet In (Select p.* From pdg_modulo_spese_gest p
                           Where esercizio = aAssCdpPdgPRnd.esercizio
                           And   cd_centro_responsabilita = aAssCdpPdgPRnd.cd_cdr_root
                           And   pg_progetto = aAssCdpPdgPRnd.pg_progetto_spese
                           And   id_classificazione = aAssCdpPdgPRnd.id_classificazione
                           And   cd_cds_area = aAssCdpPdgPRnd.cd_cds_area
                           And   cd_cdr_assegnatario = aAssCdpPdgPRnd.cd_centro_responsabilita
                           And   cd_linea_attivita = aAssCdpPdgPRnd.cd_linea_attivita
                           And   ti_appartenenza = aAssCdpPdgPRnd.ti_appartenenza
                           And   ti_gestione = aAssCdpPdgPRnd.ti_gestione
                           And   cd_elemento_voce = aAssCdpPdgPRnd.cd_elemento_voce) Loop

           isProcessato:=False;

           If Not isProcessato And
              aModSpeDet.cd_centro_responsabilita=aCDRPersonale.cd_centro_responsabilita And
              (aLATmp.cd_natura = '2' Or aLATmp.cd_natura = '3') Then
              If (aModSpeDet.IM_SPESE_GEST_DECENTRATA_EST=0 and aAssCdpPdgPRnd.im_arr_a1 <> 0) Or
                  aModSpeDet.IM_SPESE_GEST_DECENTRATA_EST+aAssCdpPdgPRnd.im_arr_a1 < 0 Then
                  Null;
              Else
                 Update pdg_modulo_spese_gest
                 Set IM_SPESE_GEST_DECENTRATA_EST=IM_SPESE_GEST_DECENTRATA_EST+aAssCdpPdgPRnd.im_arr_a1,
                     utuv=aUser,
                     duva=aTSNow,
                     pg_ver_rec = pg_ver_rec + 1
                 Where esercizio = aAssCdpPdgPRnd.esercizio
                 And   cd_centro_responsabilita = aAssCdpPdgPRnd.cd_cdr_root
                 And   pg_progetto = aAssCdpPdgPRnd.pg_progetto_spese
                 And   id_classificazione = aAssCdpPdgPRnd.id_classificazione
                 And   cd_cds_area = aAssCdpPdgPRnd.cd_cds_area
                 And   cd_cdr_assegnatario = aAssCdpPdgPRnd.cd_centro_responsabilita
                 And   cd_linea_attivita = aAssCdpPdgPRnd.cd_linea_attivita
                 And   ti_appartenenza = aAssCdpPdgPRnd.ti_appartenenza
                 And   ti_gestione = aAssCdpPdgPRnd.ti_gestione
                 And   cd_elemento_voce = aAssCdpPdgPRnd.cd_elemento_voce;

                 isProcessato:=True;
              End If;
           End If;

           If Not isProcessato And
              aModSpeDet.cd_centro_responsabilita=aCDRPersonale.cd_centro_responsabilita And
              Not (aLATmp.cd_natura = '2' Or aLATmp.cd_natura = '3') Then
              If (aModSpeDet.IM_SPESE_GEST_DECENTRATA_INT=0 and aAssCdpPdgPRnd.im_arr_a1 <> 0) Or
                  aModSpeDet.IM_SPESE_GEST_DECENTRATA_INT+aAssCdpPdgPRnd.im_arr_a1 < 0 Then
                  Null;
              Else
                 Update pdg_modulo_spese_gest
                 Set IM_SPESE_GEST_DECENTRATA_INT=IM_SPESE_GEST_DECENTRATA_INT+aAssCdpPdgPRnd.im_arr_a1,
                     utuv=aUser,
                     duva=aTSNow,
                     pg_ver_rec = pg_ver_rec + 1
                 Where esercizio = aAssCdpPdgPRnd.esercizio
                 And   cd_centro_responsabilita = aAssCdpPdgPRnd.cd_cdr_root
                 And   pg_progetto = aAssCdpPdgPRnd.pg_progetto_spese
                 And   id_classificazione = aAssCdpPdgPRnd.id_classificazione
                 And   cd_cds_area = aAssCdpPdgPRnd.cd_cds_area
                 And   cd_cdr_assegnatario = aAssCdpPdgPRnd.cd_centro_responsabilita
                 And   cd_linea_attivita = aAssCdpPdgPRnd.cd_linea_attivita
                 And   ti_appartenenza = aAssCdpPdgPRnd.ti_appartenenza
                 And   ti_gestione = aAssCdpPdgPRnd.ti_gestione
                 And   cd_elemento_voce = aAssCdpPdgPRnd.cd_elemento_voce;

                 isProcessato:=True;
              End If;
           End If;

           If Not isProcessato And
              Not aModSpeDet.cd_centro_responsabilita=aCDRPersonale.cd_centro_responsabilita And
              (aLATmp.cd_natura = '2' Or aLATmp.cd_natura = '3') Then
              If (aModSpeDet.IM_SPESE_GEST_ACCENTRATA_EST=0 and aAssCdpPdgPRnd.im_arr_a1 <> 0) Or
                  aModSpeDet.IM_SPESE_GEST_ACCENTRATA_EST+aAssCdpPdgPRnd.im_arr_a1 < 0 Then
                  Null;
              Else
                 Update pdg_modulo_spese_gest
                 Set IM_SPESE_GEST_ACCENTRATA_EST=IM_SPESE_GEST_ACCENTRATA_EST+aAssCdpPdgPRnd.im_arr_a1,
                     utuv=aUser,
                     duva=aTSNow,
                     pg_ver_rec = pg_ver_rec + 1
                 Where esercizio = aAssCdpPdgPRnd.esercizio
                 And   cd_centro_responsabilita = aAssCdpPdgPRnd.cd_cdr_root
                 And   pg_progetto = aAssCdpPdgPRnd.pg_progetto_spese
                 And   id_classificazione = aAssCdpPdgPRnd.id_classificazione
                 And   cd_cds_area = aAssCdpPdgPRnd.cd_cds_area
                 And   cd_cdr_assegnatario = aAssCdpPdgPRnd.cd_centro_responsabilita
                 And   cd_linea_attivita = aAssCdpPdgPRnd.cd_linea_attivita
                 And   ti_appartenenza = aAssCdpPdgPRnd.ti_appartenenza
                 And   ti_gestione = aAssCdpPdgPRnd.ti_gestione
                 And   cd_elemento_voce = aAssCdpPdgPRnd.cd_elemento_voce;

                 isProcessato:=True;
              End If;
           End If;

           If Not isProcessato And
              Not aModSpeDet.cd_centro_responsabilita=aCDRPersonale.cd_centro_responsabilita And
              Not (aLATmp.cd_natura = '2' Or aLATmp.cd_natura = '3') Then
              If (aModSpeDet.IM_SPESE_GEST_ACCENTRATA_INT=0 and aAssCdpPdgPRnd.im_arr_a1 <> 0) Or
                  aModSpeDet.IM_SPESE_GEST_ACCENTRATA_INT+aAssCdpPdgPRnd.im_arr_a1 < 0 Then
                  Null;
              Else
                 Update pdg_modulo_spese_gest
                 Set IM_SPESE_GEST_ACCENTRATA_INT=IM_SPESE_GEST_ACCENTRATA_INT+aAssCdpPdgPRnd.im_arr_a1,
                     utuv=aUser,
                     duva=aTSNow,
                     pg_ver_rec = pg_ver_rec + 1
                 Where esercizio = aAssCdpPdgPRnd.esercizio
                 And   cd_centro_responsabilita = aAssCdpPdgPRnd.cd_cdr_root
                 And   pg_progetto = aAssCdpPdgPRnd.pg_progetto_spese
                 And   id_classificazione = aAssCdpPdgPRnd.id_classificazione
                 And   cd_cds_area = aAssCdpPdgPRnd.cd_cds_area
                 And   cd_cdr_assegnatario = aAssCdpPdgPRnd.cd_centro_responsabilita
                 And   cd_linea_attivita = aAssCdpPdgPRnd.cd_linea_attivita
                 And   ti_appartenenza = aAssCdpPdgPRnd.ti_appartenenza
                 And   ti_gestione = aAssCdpPdgPRnd.ti_gestione
                 And   cd_elemento_voce = aAssCdpPdgPRnd.cd_elemento_voce;

                 isProcessato:=True;
              End If;
           End If;
           If isProcessato Then
              isDettRedistrRottiFound:=True;
 	   End If;
        End Loop;

        If not isDettRedistrRottiFound Then
          IBMERR001.RAISE_ERR_GENERICO('Impossibile redistribuire i rotti per cdr RUO: '||aAssCdpPdgPRnd.cd_cdr_root||' es: '||aAssCdpPdgPRnd.esercizio||' voce del piano: '||aAssCdpPdgPRnd.cd_elemento_voce||' tipo rapporto: '||aAssCdpPdgPRnd.id_matricola);
        End if;
     End If;
   End loop;

   Select count(*) into aNum
   From ass_cdp_la
   Where esercizio = aEsercizio
   And   mese = 0
   And   cd_centro_responsabilita in (Select cd_centro_responsabilita
                                      From V_PDGP_CDR_RUO_NRUO
                                      Where esercizio = aEsercizio
 		                      And   cd_cdr_root =  aCdCdr
 		                      And  (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		                            cd_unita_organizzativa = aUO.cd_unita_organizzativa))
   And   Stato != STATO_CDP_SCARICATO;

   If aNum != 0 then
     IBMERR001.RAISE_ERR_GENERICO('Operazione non effettuata. Esistono dettagli (ASS_CDP_LA) che non sono stati scarictai al termine del processo');
   End if;
 Exception
   When esci then null;
 End;

 Procedure annullaCDPSuPdg(aEsercizio number, aCdCdr varchar2, aUser varchar2) is
   aCDRRUO cdr%Rowtype;
   aUO unita_organizzativa%Rowtype;
   aNum number(8);
   esci exception;
 Begin
   -- Leggo il CDR

   aCDRRUO:=CNRCTB020.GETCDRVALIDO(aEsercizio, aCdCdr);

   -- Leggo la UO del CDR
   aUO := CNRCTB020.getUO(aCDRRUO);

   if to_number(aCDRRUO.cd_proprio_cdr) != 0 then
     IBMERR001.RAISE_ERR_GENERICO('Operazione permessa solo su CDR di tipo RUO!');
   end if;

   Select count(*) into aNum from pdg_modulo_spese_gest
   Where esercizio = aEsercizio
   And   origine = CNRCTB061_APPOGGIO.ORIGINE_PREVISIONE
   And   categoria_dettaglio = CNRCTB061_APPOGGIO.CATEGORIA_STIPENDI
   And   cd_centro_responsabilita in (Select cd_centro_responsabilita from V_PDGP_CDR_RUO_NRUO
                                      Where esercizio = aEsercizio
 		                      And   cd_cdr_root =  aCdCdr
 		                      And  (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		                            cd_unita_organizzativa = aUO.cd_unita_organizzativa));

   if aNum = 0 then
     Select count(*) into aNum
     From V_CDP_SPACCATO_CDR_LA_VOCE
     Where esercizio = aEsercizio
     And mese = 0
     And cd_cdr_root In (Select cd_centro_responsabilita from V_PDGP_CDR_RUO_NRUO
                         Where esercizio = aEsercizio
     		         And   cd_cdr_root =  aCdCdr
 		         And  (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		               cd_unita_organizzativa = aUO.cd_unita_organizzativa));

     If aNum = 0 then
       --vuol dire che non ci sono costi da ripartire
       raise esci;
     End If;
     IBMERR001.RAISE_ERR_GENERICO('Operazione di scarico su Pdg non ancora effettuata per cdr '||aCdCdr);
   end if;

   Select count(*) into aNum
   From ass_cdp_la
   Where esercizio = aEsercizio
   And   mese = 0
   And   cd_centro_responsabilita in (Select cd_centro_responsabilita
                                      From V_PDGP_CDR_RUO_NRUO
                                      Where esercizio = aEsercizio
 		                      And   cd_cdr_root =  aCdCdr
 		                      And  (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		                            cd_unita_organizzativa = aUO.cd_unita_organizzativa))
   And   stato != STATO_CDP_SCARICATO;

   If aNum != 0 then
     IBMERR001.RAISE_ERR_GENERICO('Operazione non effettuata. Esistono dettagli (ASS_CDP_LA) che risultano non ancora scaricati sul PDG');
   Else
     Update ass_cdp_la
     Set stato = STATO_CDP_PDGP_SCARICATO
     Where esercizio = aEsercizio
     And   mese = 0
     And   cd_centro_responsabilita in (Select cd_centro_responsabilita
                                        From V_PDGP_CDR_RUO_NRUO
                                        Where esercizio = aEsercizio
 	  	                        And   cd_cdr_root =  aCdCdr
   		                        And  (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		                              cd_unita_organizzativa = aUO.cd_unita_organizzativa));
   End if;

   Delete pdg_modulo_spese_gest
   Where esercizio = aEsercizio
   And   origine = CNRCTB061_APPOGGIO.ORIGINE_PREVISIONE
   And   categoria_dettaglio = CNRCTB061_APPOGGIO.CATEGORIA_STIPENDI
   And   cd_centro_responsabilita in (Select cd_centro_responsabilita from V_PDGP_CDR_RUO_NRUO
                                      Where esercizio = aEsercizio
 		                      And cd_cdr_root =  aCdCdr
 		                      And  (aUO.cd_tipo_unita != CNRCTB020.TIPO_SAC Or
 		                            cd_unita_organizzativa = aUO.cd_unita_organizzativa));
 Exception
   When esci then null;
 End;
End;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy