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

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

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

  CREATE OR REPLACE PACKAGE BODY "CNRCTB001" is

-- Inserisce una riga nella tabella delle voci

 procedure insertVocePdc(aVoce voce_f%rowtype) as
 begin
  insert into VOCE_F (
    cd_cds,
    cd_titolo_capitolo,
    cd_sezione_capitolo,
    cd_voce,
	ds_voce,
	cd_parte,
    fl_mastrino,
    livello,
    ti_appartenenza,
    ti_gestione,
    ti_voce,
	cd_funzione,
	cd_natura,
	cd_unita_organizzativa,
	cd_centro_responsabilita,
    cd_categoria,
	cd_voce_padre,
    cd_proprio_voce,
    esercizio,
    cd_elemento_voce,
    dacr,
    duva,
    utcr,
    utuv,
    pg_ver_rec
  ) values (
    aVoce.cd_cds,
    aVoce.cd_titolo_capitolo,
    aVoce.cd_sezione_capitolo,
    aVoce.cd_voce,
	aVoce.ds_voce,
	aVoce.cd_parte,
    aVoce.fl_mastrino,
    aVoce.livello,
    aVoce.ti_appartenenza,
    aVoce.ti_gestione,
    aVoce.ti_voce,
	aVoce.cd_funzione,
	aVoce.cd_natura,
	aVoce.cd_unita_organizzativa,
	aVoce.cd_centro_responsabilita,
    aVoce.cd_categoria,
	aVoce.cd_voce_padre,
	aVoce.cd_proprio_voce,
    aVoce.esercizio,
    aVoce.cd_elemento_voce,
    aVoce.dacr,
    aVoce.dacr,
    aVoce.utcr,
    aVoce.utcr,
    1
   );
 end;

 -- Aggiorna la riga in VOCE_F

 procedure aggiornaVoce(aVoce IN voce_f%rowtype) is
 begin
  update VOCE_F set
	ds_voce = aVoce.ds_voce,
    duva = aVoce.duva,
    utuv = aVoce.utuv,
    pg_ver_rec = aVoce.pg_ver_rec + 1
  where
        cd_voce = aVoce.cd_voce
    and ti_gestione = aVoce.ti_gestione
	and ti_appartenenza = aVoce.ti_appartenenza
	and esercizio = aVoce.esercizio;
 end;

 -- Aggiorna la riga in ELEMENTO_VOCE

 procedure aggiornaElementoVoce(aEV IN elemento_voce%rowtype) is
 begin
  update ELEMENTO_VOCE set
	ds_elemento_voce = aEV.ds_elemento_voce,
    duva = aEV.duva,
    utuv = aEV.utuv,
    pg_ver_rec = aEV.pg_ver_rec + 1
  where
        cd_elemento_voce = aEV.cd_elemento_voce
    and ti_gestione = aEV.ti_gestione
	and ti_appartenenza = aEV.ti_appartenenza
	and esercizio = aEV.esercizio;
 end;

 -- Legge una riga per chiave primaria da VOCE_F

 procedure leggiVoce(aV IN OUT voce_f%rowtype) is
 begin
  select * into aV from voce_f where
        cd_voce = aV.cd_voce
    and ti_gestione = aV.ti_gestione
	and ti_appartenenza = aV.ti_appartenenza
	and esercizio = aV.esercizio;
 end;

 -- Legge una riga per chiave primaria da ELEMENTO_VOCE

 procedure leggiElementoVoce(aEV IN OUT elemento_voce%rowtype) is
 begin
  select * into aEV from elemento_voce where
        cd_elemento_voce = aEV.cd_elemento_voce
    and ti_gestione = aEV.ti_gestione
	and ti_appartenenza = aEV.ti_appartenenza
	and esercizio = aEV.esercizio;
 end;

 -- Funzionalità CORE

Procedure creaEsplVoci (aEV IN elemento_voce%rowtype) is

  aVoceS voce_f%rowtype;
  aVoceR voce_f%rowtype;
  aVoceC voce_f%rowtype;
  aVoceA voce_f%rowtype;
  aVoceAR voce_f%rowtype;
  aVoceTemp voce_f%rowtype;
  aUO unita_organizzativa%rowtype;
  aUOCDR unita_organizzativa%rowtype;
  aCDSSAC v_unita_organizzativa_valida%rowtype;
  aCDSAREA unita_organizzativa%rowtype;
  aVocePadre voce_f%rowtype;
  i number;
  aLiv number;
  isMastrino char(1);
  Begin

   if aEV.esercizio = 0 then
    return; -- Esercizio 0 non gestito
   end if;

   -- COPIA IN VOCE_F DELLE PARTI SENZA ESPLOSIONE
   -- TITOLO e CAPITOLO ENTRATA CDS

   If aEV.ti_elemento_voce in (TITOLO, CAPITOLO) and aEV.ti_gestione = GESTIONE_ENTRATE and aEV.ti_appartenenza = APPARTENENZA_CDS Then
    Begin
	  aVoceTemp.esercizio:=aEV.esercizio;
	  aVoceTemp.cd_voce:=aEV.cd_elemento_voce;
	  aVoceTemp.ti_gestione:=aEV.ti_gestione;
	  aVoceTemp.ti_appartenenza:=aEV.ti_appartenenza;

          leggiVoce(aVoceTemp);

	  if aVoceTemp.ds_voce!=aEV.ds_elemento_voce then
	   aVoceTemp.ds_voce:=aEV.ds_elemento_voce;
	   aVoceTemp.duva:=aEV.duva;
	   aVoceTemp.utuv:=aEV.utuv;
	   aggiornaVoce(aVoceTemp);
	  end if;
	  return;
	 exception when no_data_found then
      isMastrino:='N';
      if aEV.ti_elemento_voce = CAPITOLO then
       isMastrino:='Y';
      end if;
      aVoceTemp := creaVoceCorrispondente(aEV,1,isMastrino);
	  return;
    End;
   End If;

   -- PARTE E TITOLO e CAPITOLO PARTE 2, SPESA CDS

   If (aEV.ti_elemento_voce in (PARTE, TITOLO) Or aEV.ti_elemento_voce = CAPITOLO and aEV.cd_parte = PARTE2) And
       aEV.ti_gestione = GESTIONE_SPESE and aEV.ti_appartenenza = APPARTENENZA_CDS Then

	 Begin
	  aVoceTemp.esercizio:=aEV.esercizio;
	  aVoceTemp.cd_voce:=aEV.cd_elemento_voce;
	  aVoceTemp.ti_gestione:=aEV.ti_gestione;
	  aVoceTemp.ti_appartenenza:=aEV.ti_appartenenza;
          leggiVoce(aVoceTemp);
	  if aVoceTemp.ds_voce!=aEV.ds_elemento_voce then
	   aVoceTemp.ds_voce:=aEV.ds_elemento_voce;
	   aVoceTemp.duva:=aEV.duva;
	   aVoceTemp.utuv:=aEV.utuv;
	   aggiornaVoce(aVoceTemp);
	  end if;
	  return;
	 Exception when no_data_found then
           If aEV.ti_elemento_voce = PARTE then
	    aLiv:=1;
            isMastrino:='N';
           Else
	    aLiv:=2; -- Per titolo o capitolo (parte 2) il livello è 2
            If aEV.ti_elemento_voce = CAPITOLO then
		 isMastrino:='Y'; -- Il capitolo è l'ultimo livello per la parte 2
	    Else
		 isMastrino:='N';
            End if;
	   End if;

           aVoceTemp:=creaVoceCorrispondente(aEV,aLiv,isMastrino);
           return;
	 End;
   End If;

   -- TITOLO E CATEGORIA ENTRATA CNR

   If aEV.ti_elemento_voce in (TITOLO, CATEGORIA) and aEV.ti_gestione = GESTIONE_ENTRATE and aEV.ti_appartenenza = APPARTENENZA_CNR Then
      Begin
	  aVoceTemp.esercizio:=aEV.esercizio;
	  aVoceTemp.cd_voce:=aEV.cd_elemento_voce;
	  aVoceTemp.ti_gestione:=aEV.ti_gestione;
	  aVoceTemp.ti_appartenenza:=aEV.ti_appartenenza;
          leggiVoce(aVoceTemp);

          if aVoceTemp.ds_voce!=aEV.ds_elemento_voce then
	   aVoceTemp.ds_voce:=aEV.ds_elemento_voce;
	   aVoceTemp.duva:=aEV.duva;
	   aVoceTemp.utuv:=aEV.utuv;
	   aggiornaVoce(aVoceTemp);
	  end if;

	  return;
      Exception when no_data_found then
         if aEV.ti_elemento_voce = TITOLO then
	   aLiv:=1;
         else
	   aLiv:=2;
	 end if;
         aVoceTemp:=creaVoceCorrispondente(aEV,aLiv,'N');
	 Return;
      End;
   End If;

   -- PARTE, TITOLO, CAPITOLO (parte 2) SPESA CNR

   If (aEV.ti_elemento_voce in (PARTE, TITOLO) or aEV.ti_elemento_voce = CAPITOLO and aEV.cd_parte = PARTE2) And
       aEV.ti_gestione = GESTIONE_SPESE	and aEV.ti_appartenenza = APPARTENENZA_CNR Then
       Begin
	  aVoceTemp.esercizio:=aEV.esercizio;
	  aVoceTemp.cd_voce:=aEV.cd_elemento_voce;
	  aVoceTemp.ti_gestione:=aEV.ti_gestione;
	  aVoceTemp.ti_appartenenza:=aEV.ti_appartenenza;
          leggiVoce(aVoceTemp);
	  if aVoceTemp.ds_voce!=aEV.ds_elemento_voce then
	   aVoceTemp.ds_voce:=aEV.ds_elemento_voce;
	   aVoceTemp.duva:=aEV.duva;
	   aVoceTemp.utuv:=aEV.utuv;
	   aggiornaVoce(aVoceTemp);
	  end if;
	  return;
       Exception when no_data_found then
         isMastrino:='N';
         If aEV.ti_elemento_voce = PARTE then
           aLiv:=1;
         Elsif aEV.ti_elemento_voce in (TITOLO,CAPITOLO) then
           aLiv:=2;
	   If aEV.ti_elemento_voce = CAPITOLO then
             isMastrino:='Y';
	   End if;
         End if;
         aVoceTemp:=creaVoceCorrispondente(aEV,aLiv,isMastrino);
	  return;
       End;
   End If;

   -- CATEGORIA SPESA CNR

   If aEV.ti_elemento_voce = CATEGORIA and aEV.ti_gestione = GESTIONE_SPESE and aEV.ti_appartenenza = APPARTENENZA_CNR Then
     Begin
        --inserisco la categoria tra le voci
        aVoceS.cd_cds:=NULL;
        aVoceS.cd_titolo_capitolo:=aEV.cd_elemento_voce;
        aVoceS.cd_sezione_capitolo:=NULL;
        aVoceS.cd_voce:=aEV.cd_elemento_voce;
        aVoceS.cd_proprio_voce:=aEV.cd_proprio_elemento;
        aVoceS.cd_elemento_voce:=aEV.cd_elemento_voce;
        aVoceS.cd_parte:=aEV.cd_parte;
        aVoceS.ds_voce:=aEV.ds_elemento_voce;
        aVoceS.fl_mastrino:='N';
        aVoceS.livello:=3;
        aVoceS.ti_appartenenza:=aEV.ti_appartenenza;
        aVoceS.ti_gestione:=aEV.ti_gestione;
        aVoceS.ti_voce:=CATEGORIA;
        aVoceS.cd_funzione:=NULL;
        aVoceS.cd_unita_organizzativa:=NULL;
        aVoceS.cd_centro_responsabilita:=NULL;
        aVoceS.cd_categoria:=aEV.cd_proprio_elemento; -- Leggo dall'elemento_voce il codice della categoria
        aVoceS.cd_voce_padre:=aEV.cd_elemento_padre;
        aVoceS.cd_natura := NULL;
        aVoceS.esercizio:=aEV.esercizio;
        aVoceS.dacr:=aEV.dacr;
        aVoceS.utcr:=aEV.utcr;

        -- no mastrino, no elemento voce
        insertVocePdc(aVoceS);
        return;
     Exception when dup_val_on_index then
	 return;
     End;
   End If;

   -- COPIA IN VOCE_F DELLE PARTI CON ESPLOSIONE

   -- Esplosione CAPITOLI PARTE 1 SPESE CDS

   If aEV.ti_elemento_voce = CAPITOLO And aEV.ti_gestione = GESTIONE_SPESE And aEV.ti_appartenenza = APPARTENENZA_CDS And aEV.cd_parte = PARTE1 Then

   -- estraggo la voce padre a cui attaccare le voci generate

   select * into aVocePadre
   from voce_f
   where -- Leggo lockandolo il titolo sopra il capitolo
        esercizio = aEV.esercizio And
        ti_appartenenza = aEV.ti_appartenenza And
        ti_gestione = aEV.ti_gestione And
        cd_voce = aEV.cd_elemento_padre
        for update nowait;

   -- genero le sezioni sotto il titolo
   -- genero le sezioni solamente se sotto quelle sezioni saranno aggiunti capitoli

   For aFunzione in (Select b.cd_funzione, b.ds_funzione
                     From   funzione b
                     Where  FL_UTILIZZABILE = 'Y' And
                            Exists (Select 1
                                    From ass_ev_funz_tipocds a
                                    Where a.esercizio = aEV.esercizio And
                                          a.cd_funzione = b.cd_funzione And
                                          a.cd_conto = aEV.cd_elemento_voce And
                                          Exists (Select 1
                                                  From   v_unita_organizzativa_valida
                                                  Where  esercizio = a.esercizio And
                                                         cd_tipo_unita = a.cd_tipo_unita And
                                                         cd_tipo_unita != TIPO_ENTE And
                                                         fl_cds = 'N' And
                                                         fl_rubrica = 'Y'))) Loop -- loop sulle funzioni
    Begin
     --inserisco la sezione tra le voci
     aVoceS.cd_cds:=NULL;
     aVoceS.cd_titolo_capitolo:=aVocePadre.cd_titolo_capitolo;
     aVoceS.cd_sezione_capitolo:=NULL;
     aVoceS.cd_voce:=IBMUTL001.dotConcat(aVocePadre.cd_voce,aFunzione.cd_funzione);
     aVoceS.cd_proprio_voce:=aFunzione.cd_funzione;
     aVoceS.cd_elemento_voce:=aEV.cd_elemento_voce;
     aVoceS.cd_parte:=aEV.cd_parte;
     aVoceS.ds_voce:=aFunzione.ds_funzione;
     aVoceS.fl_mastrino:='N';
     aVoceS.livello:=3;
     aVoceS.ti_appartenenza:=aEV.ti_appartenenza;
     aVoceS.ti_gestione:=aEV.ti_gestione;
     aVoceS.ti_voce:=SEZIONE;
     aVoceS.cd_funzione:=aFunzione.cd_funzione;
     aVoceS.cd_unita_organizzativa:=NULL;
     aVoceS.cd_centro_responsabilita:=NULL;
     aVoceS.cd_categoria:=NULL;
     aVoceS.cd_voce_padre:=aVocePadre.cd_voce;
     aVoceS.cd_natura := NULL;
     aVoceS.esercizio:=aEV.esercizio;
     aVoceS.dacr:=aEV.dacr;
     aVoceS.utcr:=aEV.utcr;
-- no mastrino, no elemento voce
     insertVocePdc(aVoceS);
    Exception
      When dup_val_on_index Then NULL;
    End;

    -- genero le rubriche sotto le sezioni

    For aUO in (Select *
                From   v_unita_organizzativa_valida a
                Where  a.esercizio = aEV.esercizio And
                       a.fl_cds = 'N' And
                       a.fl_rubrica ='Y' And
                       a.cd_tipo_unita != TIPO_ENTE And
	               Exists (Select 1  -- Solo le rubriche che avranno capitoli vengono generate
	                       From  ass_ev_funz_tipocds b
	                       Where b.esercizio     = aEV.esercizio And
	                             b.cd_conto      = aEV.cd_elemento_voce And
	                             b.cd_funzione   = aFunzione.cd_funzione And
	                             b.cd_tipo_unita = a.cd_tipo_unita)) Loop -- loop sulle rubriche

     --inserisco la rubrica tra le voci
     Begin
      aVoceR.cd_cds:=aUO.cd_unita_padre;
      aVoceR.cd_titolo_capitolo:=aVoceS.cd_titolo_capitolo;
      aVoceR.cd_sezione_capitolo:=NULL;
      aVoceR.cd_voce:=IBMUTL001.dotConcat(aVoceS.cd_voce,aUO.cd_unita_organizzativa);
      aVoceR.cd_proprio_voce:=aUO.cd_unita_organizzativa;
      aVoceR.cd_elemento_voce:=aEV.cd_elemento_voce;
      aVoceR.cd_parte:=aEV.cd_parte;
      aVoceR.ds_voce:=aUO.ds_unita_organizzativa;
      aVoceR.fl_mastrino:='N';
      aVoceR.livello:=4;
      aVoceR.ti_appartenenza:=aEV.ti_appartenenza;
      aVoceR.ti_gestione:=aEV.ti_gestione;
      aVoceR.ti_voce:=RUBRICA;
      aVoceR.cd_funzione:=aFunzione.cd_funzione;
      aVoceR.cd_unita_organizzativa:=aUO.cd_unita_organizzativa;
      aVoceR.cd_centro_responsabilita:=NULL;
      aVoceR.cd_categoria:=NULL;
      aVoceR.cd_voce_padre:=aVoceS.cd_voce;
      aVoceR.cd_natura := NULL;
      aVoceR.esercizio:=aEV.esercizio;
      aVoceR.dacr:=aEV.dacr;
      aVoceR.utcr:=aEV.utcr;
-- no mastrino, no elemento voce
      insertVocePdc(aVoceR);
     Exception
        When dup_val_on_index Then NULL;
     End;

   -- Per ogni rubrica aggiunta inserisco il capitolo come voce

     Begin
      aVoceC.esercizio:=aEV.esercizio;
      aVoceC.ti_appartenenza:=aEV.ti_appartenenza;
      aVoceC.ti_gestione:=aEV.ti_gestione;
      aVoceC.cd_voce:=IBMUTL001.dotConcat(aVoceR.cd_voce,aEV.cd_proprio_elemento);
      leggiVoce(aVoceC);

       If aVoceC.ds_voce!=aEV.ds_elemento_voce Then
 	   aVoceC.ds_voce:=aEV.ds_elemento_voce; -- Se esiste già cambio solo la descrizione del capitolo
 	   aVoceC.duva:=aEV.duva;
 	   aVoceC.utuv:=aEV.utuv;
 	   aggiornaVoce(aVoceC);
       End If;
     Exception
        When No_Data_Found Then
           aVoceC.cd_proprio_voce:=aEV.cd_proprio_elemento;
           aVoceC.cd_elemento_voce:=aEV.cd_elemento_voce;
           aVoceC.cd_cds:=aUO.cd_unita_padre;
           aVoceC.cd_titolo_capitolo:=aEV.cd_elemento_voce;
           aVoceC.cd_sezione_capitolo:=IBMUTL001.dotConcat(aVoceS.cd_voce,aEV.cd_proprio_elemento);
           aVoceC.cd_parte:=aEV.cd_parte;
           aVoceC.ds_voce:=aEV.ds_elemento_voce;

           If(aUO.cd_tipo_unita=TIPOCDS_SAC) then
            aVoceC.fl_mastrino:='N';
           Else
            aVoceC.fl_mastrino:='Y';
           End If;

           aVoceC.livello:=5;
           aVoceC.ti_voce:=aEV.ti_elemento_voce;
           aVoceC.cd_funzione:=aFunzione.cd_funzione;
           aVoceC.cd_unita_organizzativa:=aUO.cd_unita_organizzativa;
           aVoceC.cd_centro_responsabilita:=NULL;
           aVoceC.cd_categoria:=NULL;
           aVoceC.cd_natura := NULL;
           aVoceC.cd_voce_padre:=aVoceR.cd_voce;
           aVoceC.dacr:=aEV.dacr;
           aVoceC.utcr:=aEV.utcr;

           -- se mastrino, elemento voce
           If aVoceC.fl_mastrino = 'Y' Then
            aVoceC.cd_elemento_voce := aEV.cd_elemento_voce;
           End If;

           insertVocePdc(aVoceC);
     End;

     -- Sotto il capitolo aggiungo gli articoli per il SAC: sono il cdr di primo e quelli a lui afferenti

     If aUO.cd_tipo_unita = TIPOCDS_SAC Then
       For aCDR In (Select cdrNR.cd_unita_organizzativa, cdrNR.cd_proprio_cdr, cdrNR.cd_centro_responsabilita, cdrNR.ds_cdr
                    From   v_cdr_valido cdrR, v_cdr_valido cdrNR
                    Where  cdrR.esercizio=aUO.esercizio And
                           cdrR.cd_unita_organizzativa = aUO.cd_unita_organizzativa And
                           cdrNR.esercizio=aUO.esercizio And
                          (cdrNR.cd_unita_organizzativa=aUO.cd_unita_organizzativa Or
                           cdrNR.cd_cdr_afferenza = cdrR.cd_centro_responsabilita)) Loop
	   -- loop sui CDR dell'UO
	   --inserisco l'articolo solo per il SAC

	   --leggo l'UO della rubrica o non rubrica
	   aUOCDR := CNRCTB020.GETUOVALIDA (aEV.esercizio,aCDR.cd_unita_organizzativa);

	Begin
         aVoceA.cd_cds:=aUO.cd_unita_padre;
         aVoceA.cd_titolo_capitolo:=aEV.cd_elemento_voce;
         aVoceA.cd_sezione_capitolo:=aVoceC.cd_sezione_capitolo;
         aVoceA.cd_voce:=IBMUTL001.dotConcat(aVoceC.cd_voce,aUOCDR.cd_proprio_unita);
         aVoceA.cd_proprio_voce:=aUOCDR.cd_proprio_unita;
         aVoceA.cd_elemento_voce:=aEV.cd_elemento_voce;
         aVoceA.cd_parte:=aEV.cd_parte;
         aVoceA.ds_voce:=aCDR.ds_cdr;
         aVoceA.fl_mastrino:='Y';
         aVoceA.livello:=6;
         aVoceA.ti_appartenenza:=aEV.ti_appartenenza;
         aVoceA.ti_gestione:=aEV.ti_gestione;
         aVoceA.ti_voce:=ARTICOLO;
         aVoceA.cd_funzione:=aFunzione.cd_funzione;
         aVoceA.cd_unita_organizzativa:=aUO.cd_unita_organizzativa;
         aVoceA.cd_centro_responsabilita:=aCDR.cd_centro_responsabilita;
         aVoceA.cd_categoria:=NULL;
         aVoceA.cd_voce_padre:=aVoceC.cd_voce;
         aVoceA.cd_natura := NULL;
         aVoceA.esercizio:=aEV.esercizio;
         aVoceA.dacr:=aEV.dacr;
         aVoceA.utcr:=aEV.utcr;

-- mastrino, elemento voce
         aVoceC.cd_elemento_voce := aEV.cd_elemento_voce;

         insertVocePdc(aVoceA);
	Exception
	  when dup_val_on_index Then Null;
	end;

      End Loop;  -- SUI CDR
     End If; -- TIPO UNITA = SAC

   End Loop; -- SULLE UO

End Loop; -- SULLE FUNZIONI

Return;

End If; -- If aEV.ti_elemento_voce = CAPITOLO And aEV.ti_gestione = GESTIONE_SPESE And aEV.ti_appartenenza = APPARTENENZA_CDS And aEV.cd_parte = PARTE1 Then


   -- ESPLOSIONE CAPITOLI PARTE 1 SPESE CNR CATEGORIA 2

   -- Come elemento voce ho un capitolo di spesa CNR

   If aEV.ti_elemento_voce = CAPITOLO And aEV.ti_gestione = GESTIONE_SPESE And aEV.ti_appartenenza = APPARTENENZA_CNR And aEV.cd_parte = PARTE1 Then

    -- Cerca l'eventuale esistenza di CDS SAC
    Begin
      Select *
      Into   aCDSSAC
      From   v_unita_organizzativa_valida
      Where  esercizio = aEV.esercizio And
             cd_tipo_unita = CNRCTB020.TIPO_SAC And
             fl_cds = 'Y';
    Exception
      When no_data_found then
	 aCDSSAC.cd_unita_organizzativa := NULL;
    End;

    -- privatizzo la categoria sopra il capitolo

    Select *
    Into   aVocePadre
    From   voce_f
    Where  esercizio = aEV.esercizio And
           ti_appartenenza = aEV.ti_appartenenza And
           ti_gestione = aEV.ti_gestione And
           cd_voce = aEV.cd_elemento_padre  -- Si tratta della categoria
 	   for update nowait;

    If aVocePadre.cd_categoria = CATEGORIA2_SPESE_CNR Then -- L'esplosione in voci da qui è gestita solo per CAT. 2

      For aFunzione In (Select *
                        From   Funzione
                        Where  FL_UTILIZZABILE = 'Y') Loop -- AGGIUNTO L'11/06/2009
                                                           -- loop sulle funzioni
       Begin
          --inserisco la sezione tra le voci
	  aVoceS:=NULL;
          aVoceS.cd_cds:=NULL;
          aVoceS.cd_titolo_capitolo:=aVocePadre.cd_titolo_capitolo;
          aVoceS.cd_sezione_capitolo:=NULL;
          aVoceS.cd_voce:=IBMUTL001.dotConcat(aVocePadre.cd_voce,aFunzione.cd_funzione);
          aVoceS.cd_proprio_voce:=aFunzione.cd_funzione;
          aVoceS.cd_elemento_voce:=aEV.cd_elemento_voce;
          aVoceS.cd_parte:=aEV.cd_parte;
          aVoceS.ds_voce := aFunzione.ds_funzione;
          aVoceS.fl_mastrino:='N';
          aVoceS.livello:=4;
          aVoceS.ti_appartenenza:=aEV.ti_appartenenza;
          aVoceS.ti_gestione:=aEV.ti_gestione;
          aVoceS.ti_voce:=SEZIONE;
          aVoceS.cd_funzione:=aFunzione.cd_funzione;
          aVoceS.cd_unita_organizzativa:=NULL;
          aVoceS.cd_centro_responsabilita:=NULL;
          aVoceS.cd_categoria:=CATEGORIA2_SPESE_CNR; -- la categoria è il terzo livello
          aVoceS.cd_voce_padre:=aVocePadre.cd_voce;
          aVoceS.cd_natura := NULL;
          aVoceS.esercizio:=aEV.esercizio;
          aVoceS.dacr:=aEV.dacr;
          aVoceS.utcr:=aEV.utcr;
-- no mastrino, no elemento voce
          insertVocePdc(aVoceS);
       Exception
         When Dup_Val_On_Index Then Null;
       End;

       -- Sotto la sezione crea la voce corrispondente al capitolo
       Begin
 	    aVoceC.esercizio:=aEV.esercizio;
 	    aVoceC.cd_voce:=IBMUTL001.dotConcat(aVoceS.cd_voce,aEV.cd_proprio_elemento);
 	    aVoceC.ti_gestione:=aEV.ti_gestione;
 	    aVoceC.ti_appartenenza:=aEV.ti_appartenenza;
            leggiVoce(aVoceC);

	    If aVoceC.ds_voce != aEV.ds_elemento_voce then
 	     aVoceC.ds_voce:=aEV.ds_elemento_voce;
 	     aVoceC.duva:=aEV.duva;
 	     aVoceC.utuv:=aEV.utuv;
 	     aggiornaVoce(aVoceC);
 	    End If;
	    -- return; -- <------ fix del 25/02/2002 NON DEVE RITORNARE A QUESTO PUNTO ALTRIMENTI ROMPE IL CICLO SULLE FUNZIONI
       Exception
 	  When No_Data_Found Then
             aVoceC.cd_cds:=NULL;
             aVoceC.cd_titolo_capitolo:=aEV.cd_elemento_voce;
             aVoceC.cd_sezione_capitolo:=NULL;
             aVoceC.cd_proprio_voce:=aEV.cd_proprio_elemento;
             aVoceC.cd_elemento_voce:=aEV.cd_elemento_voce;
             aVoceC.cd_parte:=aEV.cd_parte;
             aVoceC.ds_voce:=aEV.ds_elemento_voce;
             aVoceC.fl_mastrino:='N';
             aVoceC.livello:=5;
             aVoceC.ti_voce:=CAPITOLO;
             aVoceC.cd_funzione:=aVoceS.cd_funzione;
             aVoceC.cd_unita_organizzativa:=NULL;
             aVoceC.cd_centro_responsabilita:=NULL;
             aVoceC.cd_categoria:=aVocePadre.cd_categoria;
             aVoceC.cd_voce_padre:=aVoceS.cd_voce;
             aVoceC.cd_natura := NULL;
             aVoceC.dacr:=aEV.dacr;
             aVoceC.utcr:=aEV.utcr;

             -- no mastrino, no elemento voce
             insertVocePdc(aVoceC);

             For aNatura In (Select *
                             From   natura
                             Where  CD_NATURA In ('1', '2')) Loop -- loop sulle nature
                                                                  -- 17.06.2009 AGGIUNTO FILTRO SULLE NATURE PER LE VOCI SPESA "CNR"
                --inserisco la sezione tra le voci
                aVoceA.cd_cds:=NULL;
                aVoceA.cd_titolo_capitolo:=aEV.cd_elemento_voce;
                aVoceA.cd_sezione_capitolo:=NULL;
                aVoceA.cd_voce:=IBMUTL001.dotConcat(aVoceC.cd_voce,aNatura.cd_natura);
                aVoceA.cd_proprio_voce:=aNatura.cd_natura;
                aVoceA.cd_elemento_voce:=aEV.cd_elemento_voce;
                aVoceA.cd_parte:=aEV.cd_parte;
                aVoceA.ds_voce:=aNatura.ds_natura;
                aVoceA.fl_mastrino:='N';
                aVoceA.livello:=6;
                aVoceA.ti_appartenenza:=aEV.ti_appartenenza;
                aVoceA.ti_gestione:=aEV.ti_gestione;
                aVoceA.ti_voce:=ARTICOLO;
                aVoceA.cd_funzione:=aVoceS.cd_funzione;
                aVoceA.cd_unita_organizzativa:=NULL;
                aVoceA.cd_centro_responsabilita:=NULL;
                aVoceA.cd_categoria:=aVocePadre.cd_categoria;
                aVoceA.cd_voce_padre:=aVoceC.cd_voce;
                aVoceA.cd_natura := aNatura.cd_natura;
                aVoceA.esercizio:=aEV.esercizio;
                aVoceA.dacr:=aEV.dacr;
                aVoceA.utcr:=aEV.utcr;
                -- no mastrino, no elemento voce
                insertVocePdc(aVoceA);

                If aVoceA.cd_natura != NATURA_5 and (aCDSSAC.cd_unita_organizzativa is not null) Then

    	             Begin
    	               aVoceAR.esercizio:=aEV.esercizio;
                       aVoceAR.cd_voce:=IBMUTL001.dotConcat(aVoceA.cd_voce,aCDSSAC.cd_unita_organizzativa);
                       aVoceAR.ti_appartenenza:=aVoceA.ti_appartenenza;
                       aVoceAR.ti_gestione:=aVoceA.ti_gestione;
                       leggiVoce(aVoceAR);

    	               If aVoceAR.ds_voce!=descSottoArtCDSProprio(aCDSSAC.cd_unita_organizzativa,aVoceA) then
		           	 aVoceAR.ds_voce:=descSottoArtCDSProprio(aCDSSAC.cd_unita_organizzativa,aVoceA);
    	                aVoceAR.duva:=aEV.duva;
    	                aVoceAR.utuv:=aEV.utuv;
                        aggiornaVoce(aVoceAR);
                       End If;
	             Exception when no_data_found then
                       aVoceAR.cd_cds:=aCDSSAC.cd_unita_organizzativa;
                       aVoceAR.cd_titolo_capitolo:=aVoceA.cd_titolo_capitolo;
                       aVoceAR.cd_sezione_capitolo:=NULL;
                       aVoceAR.cd_proprio_voce:=aCDSSAC.cd_unita_organizzativa;
                       aVoceAR.cd_elemento_voce:=aEV.cd_elemento_voce;
                       aVoceAR.cd_parte:=aVoceA.cd_parte;
    	               aVoceAR.ds_voce:=descSottoArtCDSProprio(aCDSSAC.cd_unita_organizzativa,aVoceA);
                       aVoceAR.fl_mastrino:='Y';
                       aVoceAR.livello:=7;
                       aVoceAR.ti_voce:=SOTTOARTICOLO;
                       aVoceAR.cd_funzione:=aVoceA.cd_funzione;
                       aVoceAR.cd_unita_organizzativa:=NULL;
                       aVoceAR.cd_centro_responsabilita:=NULL;
                       aVoceAR.cd_categoria:=aVoceA.cd_categoria;
                       aVoceAR.cd_natura := aVoceA.cd_natura;
                       aVoceAR.cd_voce_padre:=aVoceA.cd_voce;
                       aVoceAR.dacr:=aEV.dacr;
                       aVoceAR.utcr:=aEV.utcr;
                       -- mastrino, elemento voce
                       aVoceAR.cd_elemento_voce := aVoceA.cd_titolo_capitolo;
                       insertVocePdc(aVoceAR);
                     End;
                End If;
            End Loop; -- sulle nature
       End;

End Loop; -- sulle funzioni

End If; -- If aVocePadre.cd_categoria = CATEGORIA2_SPESE_CNR Then -- L'esplosione in voci da qui è gestita solo per CAT. 2

Return;

End If; -- If aEV.ti_elemento_voce = CAPITOLO And aEV.ti_gestione = GESTIONE_SPESE And aEV.ti_appartenenza = APPARTENENZA_CNR And aEV.cd_parte = PARTE1 Then

-- Esplosione CAPITOLI ENTRATA CNR

If aEV.ti_elemento_voce = CAPITOLO And aEV.ti_gestione = GESTIONE_ENTRATE And aEV.ti_appartenenza = APPARTENENZA_CNR Then

   Begin
         aVoceC.esercizio:=aEV.esercizio;
         aVoceC.cd_voce:=aEV.cd_elemento_voce;
         aVoceC.ti_gestione:=aEV.ti_gestione;
         aVoceC.ti_appartenenza:=aEV.ti_appartenenza;
         leggiVoce(aVoceC);
         If aVoceC.ds_voce!=aEV.ds_elemento_voce Then
	      aVoceC.ds_voce:=aEV.ds_elemento_voce;
              aVoceC.duva:=aEV.duva;
              aVoceC.utuv:=aEV.utuv;
              aggiornaVoce(aVoceC);
         End If;
         Return;
   Exception
        When No_Data_Found Then

           aVoceC:=creaVoceCorrispondente(aEV,3,'N');
	   -- Sotto il capitolo della parte entrate del CNR vanno solamente le UO CDS
               /* For aUO In (Select *
                            From   v_unita_organizzativa_valida
                            Where  esercizio = aEV.esercizio And
                                   fl_cds = 'N' And
                                   cd_tipo_unita != TIPO_ENTE) Loop -- loop sulle nature */
	            --inserisco la natura sotto il conto tra le voci
                    aVoceA.cd_cds:= null;--aUO.cd_unita_padre;
                    aVoceA.cd_titolo_capitolo:=aVoceC.cd_voce;
                    aVoceA.cd_sezione_capitolo:=NULL;
                    aVoceA.cd_voce:=aEV.cd_elemento_voce||ARTICOLO;
                    aVoceA.cd_proprio_voce:=ARTICOLO;--aUO.cd_unita_organizzativa;
                    aVoceA.cd_elemento_voce:=aEV.cd_elemento_voce;
                    aVoceA.cd_parte:=NULL;
                    aVoceA.ds_voce:=aEV.ds_elemento_voce;
                    aVoceA.fl_mastrino:='Y';
                    aVoceA.livello:=4;
                    aVoceA.ti_appartenenza:=aEV.ti_appartenenza;
                    aVoceA.ti_gestione:=aEV.ti_gestione;
                    aVoceA.ti_voce:=ARTICOLO;
                    aVoceA.cd_funzione:=NULL;
                    aVoceA.cd_unita_organizzativa:= null;--aUO.cd_unita_organizzativa;
                    aVoceA.cd_centro_responsabilita:=NULL;
                    aVoceA.cd_categoria:=aVoceC.cd_categoria;  -- Eredita il codice della categoria dal padre
                    aVoceA.cd_voce_padre:=aVoceC.cd_voce;
                    aVoceA.cd_natura := NULL;
                    aVoceA.esercizio:=aEV.esercizio;
                    aVoceA.dacr:=aEV.dacr;
                    aVoceA.utcr:=aEV.utcr;

                   -- mastrino, elemento voce
                   aVoceA.cd_elemento_voce := aVoceC.cd_voce;

                   insertVocePdc(aVoceA);

               --End Loop;*/
   End;

   Return;

End If;

End;


Procedure eliminaEsplVoci(aEV IN elemento_voce%rowtype) is
   aVocePadre voce_f%rowtype;
  begin

   -- Blocco la tabella voce_f per l'eliminazione

   lock table voce_f in exclusive mode nowait;

   -- Eliminazione da voce_f della voce corrispondente a quella eliminata in elemento_voce
   -- I vincoli sulla struttura di voce_f ed elemento_voce producono in cascata l'eliminazione
   -- dei nodi figli

   if -- Nel caso di CAPITOLO di SPESA CDS PARTE 1 devo entrare in VOCE_F sul campo cd_titolo_capitolo
        aEV.ti_elemento_voce = CAPITOLO
	and aEV.ti_gestione = GESTIONE_SPESE
	and aEV.ti_appartenenza = APPARTENENZA_CDS
	and aEV.cd_parte = PARTE1
   then
    delete from voce_f
    Where esercizio = aEV.esercizio
     and  ti_appartenenza = aEV.ti_appartenenza
     And  ti_gestione = aEV.ti_gestione
     and  cd_titolo_capitolo = aEV.cd_elemento_voce
     and  ti_voce = aEV.ti_elemento_voce;
   elsif -- Eliminazione delle tipologie di intervento (PARTE 1 CATEGORIA 2)
        aEV.ti_elemento_voce = CAPITOLO
	and aEV.ti_gestione = GESTIONE_SPESE
	and aEV.ti_appartenenza = APPARTENENZA_CNR
	and aEV.cd_parte = PARTE1
   then
    delete from voce_f where
         esercizio = aEV.esercizio
     and cd_categoria = CATEGORIA2_SPESE_CNR
     and cd_titolo_capitolo = aEV.cd_elemento_voce
     and ti_appartenenza = aEV.ti_appartenenza
     and ti_gestione = aEV.ti_gestione
	 and ti_voce = aEV.ti_elemento_voce;
   else
    delete from voce_f where
         esercizio = aEV.esercizio
     and cd_voce = aEV.cd_elemento_voce
     and ti_appartenenza = aEV.ti_appartenenza
     and ti_gestione = aEV.ti_gestione
	 and ti_voce = aEV.ti_elemento_voce;
   end if;
 end;

Function creaVoceCorrispondente(aEV elemento_voce%rowtype, aLivello number, isMastrino char) return voce_f%rowtype is
  aVoceT voce_f%rowtype;
  aVoceC voce_f%rowtype;
  aVocePadre voce_f%rowtype;
Begin

  Begin
    Select *
    Into   aVocePadre
    From   voce_f
    Where  esercizio       = aEV.esercizio And
           ti_appartenenza = aEV.ti_appartenenza And
           ti_gestione     = aEV.ti_gestione And
           cd_voce         = aEV.cd_elemento_padre;
  Exception
    When No_Data_Found Then -- Potrebbe essere che l'elemento voce non abbia padri
      Null;
  End;

  --inserisco l'elemento voce tra le voci
  aVoceC.cd_cds:=NULL;
  aVoceC.cd_titolo_capitolo:=aEV.cd_elemento_voce;
  aVoceC.cd_sezione_capitolo:=NULL;
  aVoceC.cd_voce:=aEV.cd_elemento_voce;
  aVoceC.cd_elemento_voce:=aEV.cd_elemento_voce;
  aVoceC.cd_proprio_voce:=aEV.cd_proprio_elemento;
  aVoceC.cd_parte:=aEV.cd_parte;
  aVoceC.ds_voce:=aEV.ds_elemento_voce;
  aVoceC.fl_mastrino:=isMastrino;
  aVoceC.livello:=aLivello;
  aVoceC.ti_appartenenza:=aEV.ti_appartenenza;
  aVoceC.ti_gestione:=aEV.ti_gestione;
  aVoceC.ti_voce:=aEV.ti_elemento_voce;
  aVoceC.cd_funzione:=NULL;
  aVoceC.cd_unita_organizzativa:=NULL;
  aVoceC.cd_centro_responsabilita:=NULL;

  aVoceC.cd_categoria := NULL;

  -- Quando inserisco la categoria 2 nelle voce CNR SPESA setto l'attributo cd_categoria
  -- che sarà ereditato dai figli di tali voci

  if
     (
          aEV.ti_appartenenza=APPARTENENZA_CNR
	  and aEV.ti_elemento_voce = CATEGORIA
	  and aEV.ti_gestione = GESTIONE_SPESE
     ) or
     (
          aEV.ti_appartenenza=APPARTENENZA_CNR
	  and aEV.ti_elemento_voce = CATEGORIA
	  and aEV.ti_gestione = GESTIONE_ENTRATE
     )  then
   aVoceC.cd_categoria := aEV.cd_proprio_elemento;
  elsif   aEV.ti_appartenenza=APPARTENENZA_CNR
	  and aEV.ti_elemento_voce = CAPITOLO
	  and aEV.ti_gestione = GESTIONE_ENTRATE
  then
   aVoceC.cd_categoria := aVocePadre.cd_proprio_voce; -- setta il codice della categoria sul capitolo di entrata CNR
  else
   aVoceC.cd_categoria := aVocePadre.cd_categoria;
  end if;

  aVoceC.cd_voce_padre:=aVocePadre.cd_voce;
  aVoceC.cd_natura := NULL;
  aVoceC.esercizio:=aEV.esercizio;
  aVoceC.dacr:=aEV.dacr;
  aVoceC.utcr:=aEV.utcr;

-- se mastrino, elemento voce da fare
   If isMastrino = 'Y' Then
      aVoceC.cd_elemento_voce := aEV.cd_elemento_voce;
   End If;

  insertVocePdc(aVoceC);
  return aVoceC;
 end;



-- ***************************************************************************
-- ESPLOSIONE VOCI PER MODIFICHE SU UNITA_ORGANIZZATIVA **********************
-- Aggiornamento del PDC Finanziario per modifiche Struttura organizzativa
-- Non gestisce le aree se non per la modifica della descrizione del SOTTOART.
-- ***************************************************************************

 procedure creaEsplVociUO(aEs number, aCdUO varchar2, aUser varchar2) is
  aUO unita_organizzativa%rowtype;
  aUOCDR unita_organizzativa%rowtype;
  aVocePadre voce_f%rowtype;
  aVoceC voce_f%rowtype;
  aVoceR voce_f%rowtype;
  aVoceS voce_f%rowtype;
  aVoceA voce_f%rowtype;
  aVoceAR voce_f%rowtype;
  aEVPadre elemento_voce%rowtype;
  aEV elemento_voce%rowtype;
  aUtcr varchar2(20);
  aUtuv varchar2(20);
  aDacr date;
  aDuva date;
 begin
  aUO:=CNRCTB020.getUOValida(aEs, aCdUO);

  if aUser is not null then
   aUtcr:=aUser;
   aUtuv:=aUser;
   aDacr:=sysdate;
   aDuva:=sysdate;
  else
   aUtcr:=aUO.utcr;
   aUtuv:=aUO.utuv;
   aDacr:=aUO.dacr;
   aDuva:=aUO.duva;
  end if;

  -- se si tratta di ENTE non devo effettuare aggiornamenti

  if(aUO.cd_tipo_unita = TIPO_ENTE) then
   return;
  end if;

  -- se si tratta di CDS AREA aggiorno la descrizione del sottoarticolo corrispondente
  -- sotto la parte 1 delle spese CNR categoria 1

  if(aUO.fl_cds = 'Y' and aUO.cd_tipo_unita = TIPOCDS_AREA) then
   for aSottoarticolo in (select 1 from voce_f where
         esercizio = aEs
     and ti_voce = SOTTOARTICOLO
	 and ti_gestione = GESTIONE_SPESE
	 and ti_appartenenza = APPARTENENZA_CNR
	 and cd_categoria = CATEGORIA1_SPESE_CNR
     and cd_proprio_voce = aUO.cd_unita_organizzativa
	 for update nowait) loop
    NULL;
   end loop;

   update voce_f set
         ds_voce = aUO.ds_unita_organizzativa,
         duva = aDuva,
	     utuv = aUtuv,
		 pg_ver_rec = pg_ver_rec + 1
   where
         esercizio = aEs
     and ti_voce = SOTTOARTICOLO
	 and ti_gestione = GESTIONE_SPESE
	 and ti_appartenenza = APPARTENENZA_CNR
	 and cd_categoria = CATEGORIA1_SPESE_CNR
     and cd_proprio_voce = aUO.cd_unita_organizzativa;
  end if;

  -- se si tratta di CDS non AREA e non SAC alimento il capitolo di spesa del CNR per Categoria I

  if(aUO.fl_cds = 'Y' and aUO.cd_tipo_unita != TIPOCDS_AREA and aUO.cd_tipo_unita != TIPOCDS_SAC) then

   -- leggo la categoria sopra la sezione

   for aVocePadre in (select * from voce_f where
         esercizio = aEs
     and ti_voce = CATEGORIA
	 and ti_gestione = GESTIONE_SPESE
	 and ti_appartenenza = APPARTENENZA_CNR
	 and cd_categoria = CATEGORIA1_SPESE_CNR for update nowait) loop -- Parte 1 - Titolo x - Categoria 1

	 for aFunzione in (select cd_funzione, ds_funzione
	                   From funzione
	                   Where FL_UTILIZZABILE = 'Y') loop -- loop sulle funzioni
      begin
       --inserisco la sezione tra le voci
       aVoceS.cd_cds:=NULL;
       aVoceS.cd_titolo_capitolo:=aVocePadre.cd_titolo_capitolo;
       aVoceS.cd_sezione_capitolo:=NULL;
       aVoceS.cd_voce:=IBMUTL001.dotConcat(aVocePadre.cd_voce,aFunzione.cd_funzione);
       aVoceS.cd_proprio_voce:=aFunzione.cd_funzione;
       aVoceS.cd_elemento_voce:=aVocePadre.cd_elemento_voce;
       aVoceS.cd_parte:=aVocePadre.cd_parte;
       aVoceS.ds_voce:=aFunzione.ds_funzione;
       aVoceS.fl_mastrino:='N';
       aVoceS.livello:=4;
       aVoceS.ti_appartenenza:=aVocePadre.ti_appartenenza;
       aVoceS.ti_gestione:=aVocePadre.ti_gestione;
       aVoceS.ti_voce:=SEZIONE;
       aVoceS.cd_funzione:=aFunzione.cd_funzione;
       aVoceS.cd_unita_organizzativa:=NULL;
       aVoceS.cd_centro_responsabilita:=NULL;
       aVoceS.cd_categoria:=aVocePadre.cd_categoria;
       aVoceS.cd_voce_padre:=aVocePadre.cd_voce;
       aVoceS.cd_natura := NULL;
       aVoceS.esercizio:=aVocePadre.esercizio;
       aVoceS.dacr:=aDacr;
       aVoceS.utcr:=aUtcr;

-- no mastrino, no elemento voce
       insertVocePdc(aVoceS);

  	  exception when dup_val_on_index then
  	   NULL;
  	  end;

	-- Crea la voce corrispondente al capitolo in VOCE_F (in questo caso il CDS)

	  begin -- Imposto la chiave primaria di voce_f
       aVoceC.esercizio:=aEs;
       aVoceC.cd_voce:=IBMUTL001.dotConcat(aVoceS.cd_voce,aUO.cd_unita_organizzativa);
       aVoceC.ti_appartenenza:=aVoceS.ti_appartenenza;
       aVoceC.ti_gestione:=aVoceS.ti_gestione;
       leggiVoce(aVoceC); -- leggo la voce
	   if aVoceC.ds_voce!=aUO.ds_unita_organizzativa then
	    aVoceC.ds_voce:=aUO.ds_unita_organizzativa;
	    aVoceC.duva:=aDuva;
	    aVoceC.utuv:=aUtuv;
	    aggiornaVoce(aVoceC);
	   end if;
	  exception when no_data_found then -- se la voce non c'è la inserisco
       aVoceC.cd_proprio_voce:=aUO.cd_unita_organizzativa;
       aVoceC.cd_elemento_voce:=aVoceS.cd_elemento_voce;
       aVoceC.cd_cds:=aUO.cd_unita_organizzativa;
       aVoceC.cd_titolo_capitolo:=aVoceS.cd_titolo_capitolo;
       aVoceC.cd_sezione_capitolo:=NULL;
       aVoceC.cd_parte:=aVoceS.cd_parte;
       aVoceC.ds_voce:=aUO.ds_unita_organizzativa;
       aVoceC.fl_mastrino:='N';
       aVoceC.livello:=5;
       aVoceC.ti_voce:=CAPITOLO;
       aVoceC.cd_funzione:=aFunzione.cd_funzione;
       aVoceC.cd_unita_organizzativa:=NULL;
       aVoceC.cd_centro_responsabilita:=NULL;
       aVoceC.cd_categoria:=aVoceS.cd_categoria;
       aVoceC.cd_natura := NULL;
       aVoceC.cd_voce_padre:=aVoceS.cd_voce;
       aVoceC.dacr:=aDacr;
       aVoceC.utcr:=aUtcr;

-- no mastrino, no elemento voce
       insertVocePdc(aVoceC);

	  end;
      for aNatura in (select * from natura) loop -- loop sulle nature
       begin
        --inserisco la sezione tra le voci
        aVoceA.esercizio:=aEs;
        aVoceA.cd_voce:=IBMUTL001.dotConcat(aVoceC.cd_voce,aNatura.cd_natura);
        aVoceA.ti_appartenenza:=aVoceS.ti_appartenenza;
        aVoceA.ti_gestione:=aVoceS.ti_gestione;
        leggiVoce(aVoceA);
	    if aVoceA.ds_voce!=aNatura.ds_natura then
		 aVoceA.ds_voce:=aNatura.ds_natura;
	     aVoceA.duva:=aDuva;
	     aVoceA.utuv:=aUtuv;
	     aggiornaVoce(aVoceA);
        end if;
	   exception when no_data_found then
        aVoceA.cd_cds:=aUO.cd_unita_organizzativa;
        aVoceA.cd_titolo_capitolo:=aVoceC.cd_titolo_capitolo;
        aVoceA.cd_sezione_capitolo:=NULL;
        aVoceA.cd_proprio_voce:=aNatura.cd_natura;
        aVoceA.cd_elemento_voce:=aVoceC.cd_elemento_voce;
        aVoceA.cd_parte:=aVoceC.cd_parte;
        aVoceA.ds_voce:=aNatura.ds_natura;
        aVoceA.fl_mastrino:='N';
        aVoceA.livello:=6;
        aVoceA.ti_voce:=ARTICOLO;
        aVoceA.cd_funzione:=aFunzione.cd_funzione;
        aVoceA.cd_unita_organizzativa:=NULL;
        aVoceA.cd_centro_responsabilita:=NULL;
        aVoceA.cd_categoria:=aVoceC.cd_categoria;
        aVoceA.cd_natura := aNatura.cd_natura;
        aVoceA.cd_voce_padre:=aVoceC.cd_voce;
        aVoceA.dacr:=aDacr;
        aVoceA.utcr:=aUtcr;

-- no mastrino, no elemento voce
        insertVocePdc(aVoceA);

	   end;
		-- Sotto l'articolo inserisco il sottoarticolo = al CDS per nature 1-4
       if aNatura.cd_natura != NATURA_5 then
    	   begin
    	    aVoceAR.esercizio:=aEs;
            aVoceAR.cd_voce:=IBMUTL001.dotConcat(aVoceA.cd_voce,aVoceC.cd_proprio_voce);
            aVoceAR.ti_appartenenza:=aVoceA.ti_appartenenza;
            aVoceAR.ti_gestione:=aVoceA.ti_gestione;
            leggiVoce(aVoceAR);
			if aVoceAR.ds_voce!=descSottoArtCDSProprio(aVoceC.cd_proprio_voce,aVoceA) then
    	     aVoceAR.ds_voce:=descSottoArtCDSProprio(aVoceC.cd_proprio_voce,aVoceA);
    	     aVoceAR.duva:=aUO.duva;
    	     aVoceAR.utuv:=aUO.utuv;
             aggiornaVoce(aVoceAR);
            end if;
		   exception when no_data_found then
            aVoceAR.cd_cds:=aVoceC.cd_proprio_voce;
            aVoceAR.cd_titolo_capitolo:=aVoceA.cd_titolo_capitolo;
            aVoceAR.cd_sezione_capitolo:=NULL;
            aVoceAR.cd_proprio_voce:=aUO.cd_unita_organizzativa;
            aVoceAR.cd_elemento_voce:=aVoceA.cd_elemento_voce;
            aVoceAR.cd_parte:=aVoceA.cd_parte;
    	    aVoceAR.ds_voce:=descSottoArtCDSProprio(aVoceC.cd_proprio_voce,aVoceA);
            aVoceAR.fl_mastrino:='Y';
            aVoceAR.livello:=7;
            aVoceAR.ti_voce:=SOTTOARTICOLO;
            aVoceAR.cd_funzione:=aVoceA.cd_funzione;
            aVoceAR.cd_unita_organizzativa:=NULL;
            aVoceAR.cd_centro_responsabilita:=NULL;
            aVoceAR.cd_categoria:=aVoceA.cd_categoria;
            aVoceAR.cd_natura := aVoceA.cd_natura;
            aVoceAR.cd_voce_padre:=aVoceA.cd_voce;
            aVoceAR.dacr:=aDacr;
            aVoceAR.utcr:=aUtcr;

-- mastrino, elemento voce da fare
            aVoceAR.cd_elemento_voce := aVoceA.cd_titolo_capitolo;
            insertVocePdc(aVoceAR);

           end;
       end if;
	  end loop;
	 end loop;
	end loop;

   end if;


  -- se si tratta di CDS SAC alimento il sottoarticolo di spesa del CNR per Categoria II

  if(aUO.fl_cds = 'Y' and aUO.cd_tipo_unita = TIPOCDS_SAC) then

   -- leggo la categoria sopra la sezione

   for aArticolo in (select * from voce_f where
         esercizio = aEs
     and ti_voce = ARTICOLO
	 and ti_gestione = GESTIONE_SPESE
	 and ti_appartenenza = APPARTENENZA_CNR
	 and cd_categoria = CATEGORIA2_SPESE_CNR for update nowait) loop -- Parte 1 - Titolo x - Categoria 2
	   -- Sotto l'articolo inserisco il sottoarticolo = al CDS per nature 1-4
       if aArticolo.cd_natura != NATURA_5 then
    	   begin
    	    aVoceAR.esercizio:=aEs;
            aVoceAR.cd_voce:=IBMUTL001.dotConcat(aArticolo.cd_voce,aUO.cd_unita_organizzativa);
            aVoceAR.ti_appartenenza:=aArticolo.ti_appartenenza;
            aVoceAR.ti_gestione:=aArticolo.ti_gestione;
            leggiVoce(aVoceAR);
    	    if aVoceAR.ds_voce!='CDS-'||aUO.cd_unita_organizzativa||' nat.'||aArticolo.ds_voce then
			 aVoceAR.ds_voce:='CDS-'||aUO.cd_unita_organizzativa||' nat.'||aArticolo.ds_voce;
    	     aVoceAR.duva:=aDuva;
    	     aVoceAR.utuv:=aUtuv;
             aggiornaVoce(aVoceAR);
            end if;
		   exception when no_data_found then
            aVoceAR.cd_cds:=aUO.cd_unita_organizzativa;
            aVoceAR.cd_titolo_capitolo:=aArticolo.cd_titolo_capitolo;
            aVoceAR.cd_sezione_capitolo:=NULL;
            aVoceAR.cd_proprio_voce:=aUO.cd_unita_organizzativa;
            aVoceAR.cd_elemento_voce:=aArticolo.cd_elemento_voce;
            aVoceAR.cd_parte:=aArticolo.cd_parte;
    	    aVoceAR.ds_voce:='CDS-'||aUO.cd_unita_organizzativa||' nat.'||aArticolo.ds_voce;
            aVoceAR.fl_mastrino:='Y';
            aVoceAR.livello:=7;
            aVoceAR.ti_voce:=SOTTOARTICOLO;
            aVoceAR.cd_funzione:=aArticolo.cd_funzione;
            aVoceAR.cd_unita_organizzativa:=NULL;
            aVoceAR.cd_centro_responsabilita:=NULL;
            aVoceAR.cd_categoria:=aArticolo.cd_categoria;
            aVoceAR.cd_natura := aArticolo.cd_natura;
            aVoceAR.cd_voce_padre:=aArticolo.cd_voce;
            aVoceAR.dacr:=aDacr;
            aVoceAR.utcr:=aUtcr;

-- mastrino, elemento voce
            aVoceAR.CD_ELEMENTO_VOCE := aArticolo.cd_titolo_capitolo;
            insertVocePdc(aVoceAR);

           end;
       end if;
	end loop;
   end if;

   -- Entrate CNR aggiungo l'UO CDS come ARTICOLO
  -- NON NECESSARIO eliminata la Uo nella costruzione del cd_voce di entrata 14/10/2014
  /*
  if(aUO.fl_cds = 'N') then
    for aVoceC in (select * from voce_f where
           esercizio = aEs
       and ti_voce = CAPITOLO
	   and ti_gestione = GESTIONE_ENTRATE
	   and ti_appartenenza = APPARTENENZA_CNR for update nowait
    ) loop
	    --inserisco l'UO come Articolo sotto il Capitolo
	 begin -- Imposto la chiave primaria di voce_f
      aVoceA.esercizio:=aEs;
      aVoceA.cd_voce:=IBMUTL001.dotConcat(aVoceC.cd_voce,aUO.cd_unita_organizzativa);
      aVoceA.ti_appartenenza:=aVoceC.ti_appartenenza;
      aVoceA.ti_gestione:=aVoceC.ti_gestione;
      leggiVoce(aVoceA); -- leggo la voce
	  if aVoceA.ds_voce!=aUO.ds_unita_organizzativa then
	   aVoceA.ds_voce:=aUO.ds_unita_organizzativa;
	   aVoceA.duva:=aDuva;
	   aVoceA.utuv:=aUtuv;
	   aggiornaVoce(aVoceA);
	  end if;
	 exception when no_data_found then -- se la voce non c'è la inserisco
        aVoceA.cd_cds:=aUO.cd_unita_padre;
        aVoceA.cd_titolo_capitolo:=aVoceC.cd_voce;
        aVoceA.cd_sezione_capitolo:=NULL;
        aVoceA.cd_proprio_voce:=aUO.cd_unita_organizzativa;
        aVoceA.cd_elemento_voce:=aVoceC.cd_elemento_voce;
        aVoceA.cd_parte:=NULL;
	aVoceA.ds_voce:=aUO.ds_unita_organizzativa;
        aVoceA.fl_mastrino:='Y';
        aVoceA.livello:=4;
        aVoceA.ti_voce:=ARTICOLO;
        aVoceA.cd_funzione:=NULL;
        aVoceA.cd_unita_organizzativa:=aUO.cd_unita_organizzativa;
        aVoceA.cd_centro_responsabilita:=NULL;
        aVoceA.cd_categoria:=aVoceC.cd_categoria; -- Imposta il codice di categoria sull'articolo di entrata CNR
        aVoceA.cd_natura := NULL;
        aVoceA.cd_voce_padre:=aVoceC.cd_voce;
        aVoceA.dacr:=aDacr;
        aVoceA.utcr:=aUtcr;

-- mastrino, elemento voce da fare
        aVoceA.cd_elemento_voce := aVoceC.cd_voce;
        insertVocePdc(aVoceA);

      end;
     end loop;
    end if;
    */
   -- Spese CDS aggiungo l'UO rubrica come RUBRICA

    if(aUO.fl_cds = 'N' and aUO.fl_rubrica = 'Y') then
     for aVoceT in (select /*+ index (voce_f px_voce_f) */ * from voce_f where
           esercizio = aEs
       and ti_voce = TITOLO
	   and ti_gestione = GESTIONE_SPESE
	   and ti_appartenenza = APPARTENENZA_CDS for update nowait) loop  -- loop su Titoli

      for aFunzione in (select * from funzione
                        Where FL_UTILIZZABILE = 'Y') loop -- loop su funzioni

	   for aEV in (select * from elemento_voce a where
	          a.esercizio = aEs
          and a.ti_elemento_voce = CAPITOLO
	      and a.ti_gestione = GESTIONE_SPESE
	      and a.ti_appartenenza = APPARTENENZA_CDS
		  and a.cd_elemento_padre = aVoceT.cd_voce
	      and exists (select 1 from ass_ev_funz_tipocds b where -- Inserisco solo se trovo nella tabella degli incroci
	            b.esercizio = a.esercizio
	        and b.cd_conto = a.cd_elemento_voce
	        and b.cd_funzione = aFunzione.cd_funzione
	        and b.cd_tipo_unita = aUO.cd_tipo_unita
	      )
      	 ) loop -- loop sui titoli capitoli esistenti nella tabella degli incroci

         --inserisco la sezione tra le voci

		 begin
          aVoceS.cd_cds:=NULL;
          aVoceS.cd_titolo_capitolo:=aVoceT.cd_titolo_capitolo; -- fix 20020127
          aVoceS.cd_sezione_capitolo:=NULL;
          aVoceS.cd_voce:=IBMUTL001.dotConcat(aVoceT.cd_voce,aFunzione.cd_funzione);
          aVoceS.cd_proprio_voce:=aFunzione.cd_funzione;
          aVoceS.cd_elemento_voce:=aVoceT.cd_elemento_voce;
          aVoceS.cd_parte:=aVoceT.cd_parte;
          aVoceS.ds_voce:=aFunzione.ds_funzione;
          aVoceS.fl_mastrino:='N';
          aVoceS.livello:=3;
          aVoceS.ti_appartenenza:=aEV.ti_appartenenza;
          aVoceS.ti_gestione:=aEV.ti_gestione;
          aVoceS.ti_voce:=SEZIONE;
          aVoceS.cd_funzione:=aFunzione.cd_funzione;
          aVoceS.cd_unita_organizzativa:=NULL;
          aVoceS.cd_centro_responsabilita:=NULL;
          aVoceS.cd_categoria:=NULL;
          aVoceS.cd_voce_padre:=aVoceT.cd_voce;
          aVoceS.cd_natura := NULL;
          aVoceS.esercizio:=aEV.esercizio;
          aVoceS.dacr:=aDacr;
          aVoceS.utcr:=aUtcr;

-- no mastrino, no elemento voce
          insertVocePdc(aVoceS);

         exception when dup_val_on_index then
          NULL;
         end;

         -- genero le rubriche sotto le sezioni

      	 begin -- Imposto la chiave primaria di voce_f
          aVoceR.esercizio:=aEs;
          aVoceR.cd_voce:=IBMUTL001.dotConcat(aVoceS.cd_voce,aUO.cd_unita_organizzativa);
          aVoceR.ti_appartenenza:=aVoceS.ti_appartenenza;
          aVoceR.ti_gestione:=aVoceS.ti_gestione;
          leggiVoce(aVoceR); -- leggo la voce
		  if aVoceR.ds_voce!=aUO.ds_unita_organizzativa then
           aVoceR.ds_voce:=aUO.ds_unita_organizzativa;
           aVoceR.duva:=aDuva;
           aVoceR.utuv:=aUtuv;
           aggiornaVoce(aVoceR);
      	  end if;
		 exception when no_data_found then -- se la voce non c'è la inserisco
          aVoceR.cd_cds:=aUO.cd_unita_padre;
          aVoceR.cd_titolo_capitolo:=aVoceS.cd_titolo_capitolo;
          aVoceR.cd_sezione_capitolo:=NULL;
          aVoceR.cd_proprio_voce:=aUO.cd_unita_organizzativa;
          aVoceR.cd_elemento_voce:=aVoceS.cd_elemento_voce;
          aVoceR.cd_parte:=aVoceS.cd_parte;
          aVoceR.ds_voce:=aUO.ds_unita_organizzativa;
          aVoceR.fl_mastrino:='N';
          aVoceR.livello:=4;
          aVoceR.ti_voce:=RUBRICA;
          aVoceR.cd_funzione:=aFunzione.cd_funzione;
          aVoceR.cd_unita_organizzativa:=aUO.cd_unita_organizzativa;
          aVoceR.cd_centro_responsabilita:=NULL;
          aVoceR.cd_categoria:=NULL;
          aVoceR.cd_natura := NULL;
          aVoceR.cd_voce_padre:=aVoceS.cd_voce;
          aVoceR.dacr:=aDacr;
          aVoceR.utcr:=aUtcr;

-- no mastrino, no elemento voce
          insertVocePdc(aVoceR);

         end;

         -- Per ogni rubrica aggiunta inserisco il capitolo come voce

         begin
          aVoceC.esercizio:=aEV.esercizio;
          aVoceC.ti_appartenenza:=aVoceR.ti_appartenenza;
          aVoceC.ti_gestione:=aVoceR.ti_gestione;
          aVoceC.cd_voce:=IBMUTL001.dotConcat(aVoceR.cd_voce,aEV.cd_proprio_elemento);
          leggiVoce(aVoceC);
		  if aVoceC.ds_voce!=aEV.ds_elemento_voce then
           aVoceC.ds_voce:=aEV.ds_elemento_voce;
           aVoceC.duva:=aDuva;
           aVoceC.utuv:=aUtuv;
           aggiornaVoce(aVoceC);
          end if;
     exception when no_data_found then
          aVoceC.cd_proprio_voce:=aEV.cd_proprio_elemento;
          aVoceC.cd_cds:=aUO.cd_unita_padre;
          aVoceC.cd_titolo_capitolo:=aEV.cd_elemento_voce;
          aVoceC.cd_sezione_capitolo:=IBMUTL001.dotConcat(aVoceS.cd_voce,aEV.cd_proprio_elemento);
          aVoceC.cd_elemento_voce:=aVoceR.cd_elemento_voce;
          aVoceC.cd_parte:=aVoceR.cd_parte;
          aVoceC.ds_voce:=aEV.ds_elemento_voce;
	  if(aUO.cd_tipo_unita=TIPOCDS_SAC) then
           aVoceC.fl_mastrino:='N';
          else
           aVoceC.fl_mastrino:='Y';
          end if;
          aVoceC.livello:=5;
          aVoceC.ti_voce:=aEV.ti_elemento_voce;
          aVoceC.cd_funzione:=aFunzione.cd_funzione;
          aVoceC.cd_unita_organizzativa:=aUO.cd_unita_organizzativa;
          aVoceC.cd_centro_responsabilita:=NULL;
          aVoceC.cd_categoria:=NULL;
          aVoceC.cd_natura := NULL;
          aVoceC.cd_voce_padre:=aVoceR.cd_voce;
          aVoceC.dacr:=aDacr;
          aVoceC.utcr:=aUtcr;

-- se mastrino, elemento voce da fare
          If aVoceC.fl_mastrino = 'Y' Then
             aVoceC.cd_elemento_voce := aEV.cd_elemento_voce;
          End If;

          insertVocePdc(aVoceC);

         end;

          -- Sotto il capitolo aggiungo gli articoli per il SAC
		  -- I cdr sono sia il cdr di I livello che quelli di secondo che a lui afferiscono

         if(aUO.cd_tipo_unita=TIPOCDS_SAC) then
          for aCDR in (select cdrNR.* from v_cdr_valido cdrR, v_cdr_valido cdrNR where
			     cdrR.esercizio=aEs
			 and cdrR.cd_unita_organizzativa = aUO.cd_unita_organizzativa
			 and cdrNR.esercizio=aEs
             and (
			     cdrNR.cd_unita_organizzativa=aUO.cd_unita_organizzativa
			  or cdrNR.cd_cdr_afferenza = cdrR.cd_centro_responsabilita
			 )
         ) loop
		  begin
            -- loop sui CDR dell'UO
            --inserisco l'articolo solo per il SAC

	         --leggo l'UO della rubrica o non rubrica
        	 aUOCDR:=CNRCTB020.GETUOVALIDA(aEV.esercizio,aCDR.cd_unita_organizzativa);

			 aVoceA.cd_cds:=aUO.cd_unita_padre;
             aVoceA.cd_titolo_capitolo:=aVoceC.cd_titolo_capitolo;
             aVoceA.cd_sezione_capitolo:=aVoceC.cd_sezione_capitolo;
             aVoceA.cd_voce:=IBMUTL001.dotConcat(aVoceC.cd_voce,aUOCDR.cd_proprio_unita);
             aVoceA.cd_proprio_voce:=aUOCDR.cd_proprio_unita;
             aVoceA.cd_elemento_voce:=aVoceC.cd_elemento_voce;
             aVoceA.cd_parte:=aVoceC.cd_parte;
             aVoceA.ds_voce:=aCDR.ds_cdr;
             aVoceA.fl_mastrino:='Y';
             aVoceA.livello:=6;
             aVoceA.ti_appartenenza:=aVoceC.ti_appartenenza;
             aVoceA.ti_gestione:=aVoceC.ti_gestione;
             aVoceA.ti_voce:=ARTICOLO;
             aVoceA.cd_funzione:=aFunzione.cd_funzione;
             aVoceA.cd_unita_organizzativa:=aUO.cd_unita_organizzativa;
             aVoceA.cd_centro_responsabilita:=aCDR.cd_centro_responsabilita;
             aVoceA.cd_categoria:=NULL;
             aVoceA.cd_voce_padre:=aVoceC.cd_voce;
             aVoceA.cd_natura := NULL;
             aVoceA.esercizio:=aEV.esercizio;
             aVoceA.dacr:=aDacr;
             aVoceA.utcr:=aUtcr;

-- mastrino, elemento voce da fare
             aVoceA.cd_elemento_voce := aVoceC.cd_titolo_capitolo;

             insertVocePdc(aVoceA);

		   exception when dup_val_on_index then
			null;
		   end;
          end loop;
         end if;
	   end loop;
  	  end loop;
     end loop;
	end if;
 end;


-- ***************************************************************************
-- ESPLOSIONE SOTTOARTICOLI AREA
-- ***************************************************************************

  procedure creaEsplSottArtArea(aEsercizio number, aCdArea varchar2, aUser varchar2) is
   aCDSPresidenteArea unita_organizzativa%rowtype;
   aCDSArea unita_organizzativa%rowtype;
   aCDSSAC unita_organizzativa%rowtype;
   aUO unita_organizzativa%rowtype;
   aVoceAR voce_f%rowtype;
   aTSNow date;
  begin
   aTSNow:=sysdate;

   aCDSArea:=CNRCTB020.getUOValida(aEsercizio,aCdArea);

   select * into aCDSArea from unita_organizzativa where
	    cd_unita_organizzativa = aCdArea
	and cd_tipo_unita = CNRCTB020.TIPO_AREA
	and fl_cds = 'Y';

   aCDSSAC:=CNRCTB020.getCDSSACValido(aEsercizio);

   -- Leggo il CDS attualmente presidente dell'area per l'esercizio aEsercizio

   aCDSPresidenteArea:=CNRCTB020.getCDSPresidenteArea(aEsercizio, aCDSArea);
   if aCDSPresidenteArea.cd_unita_organizzativa is null then
     -- Se il presidente dell'area in processo non è definito, elimino l'attuale
	 -- esplosione in sottoarticoli dell'area in VOCE_F

     for aSottArt in (select * from voce_f where -- Lock dei sottoarticoli interessati
          esercizio = aEsercizio
      and ti_appartenenza = APPARTENENZA_CNR
      and ti_gestione = GESTIONE_SPESE
      and ti_voce = SOTTOARTICOLO
      and cd_proprio_voce = aCdArea for update nowait) loop
       NULL;
     end loop;

     delete from voce_f where
          esercizio = aEsercizio
      and ti_appartenenza = APPARTENENZA_CNR
      and ti_gestione = GESTIONE_SPESE
      and ti_voce = SOTTOARTICOLO
      and cd_proprio_voce = aCdArea;
    return;
   end if;

   -- Leggo da voce_f tutti i sottoarticoli corrispondenti all'area in processo

   for aSottArt in (select * from voce_f where
        esercizio = aEsercizio
	and ti_appartenenza = APPARTENENZA_CNR
	and ti_gestione = GESTIONE_SPESE
	and ti_voce = SOTTOARTICOLO
	and cd_proprio_voce = aCdArea for update nowait) loop
    if aSottArt.cd_cds = aCDSPresidenteArea.cd_unita_organizzativa then
	 return; -- se il presidente corrente risulta già esploso in sottoarticoli dell'area esco
	end if;
   end loop;

   -- Se arrivo qui significa che il nuovo presidente di area non corrisponde all'esplosione
   -- corrente in sottoarticoli. Quindi elimino l'esplosione corrente.

   delete from voce_f where
        esercizio = aEsercizio
	and ti_appartenenza = APPARTENENZA_CNR
	and ti_gestione = GESTIONE_SPESE
	and ti_voce = SOTTOARTICOLO
	and cd_proprio_voce = aCdArea;

   -- Genera l'esplosione in sottoarticoli sotto il nuovo presidente dell'area

   for aCapitolo in (select * from voce_f where
              esercizio = aEsercizio
    	  and ti_appartenenza = APPARTENENZA_CNR
      	  and ti_gestione = GESTIONE_SPESE
          and cd_categoria = CATEGORIA1_SPESE_CNR
          and cd_proprio_voce = aCDSPresidenteArea.cd_unita_organizzativa
          and ti_voce = CAPITOLO for update nowait
       ) loop
     for aArticolo in (select * from voce_f where
              esercizio = aEsercizio
    	  and ti_appartenenza = APPARTENENZA_CNR
      	  and ti_gestione = GESTIONE_SPESE
          and cd_voce_padre = aCapitolo.cd_voce
          and ti_voce = ARTICOLO for update nowait
       ) loop
       begin
          aVoceAR.esercizio:=aEsercizio;
          aVoceAR.cd_voce:=IBMUTL001.dotConcat(aArticolo.cd_voce,aCDSArea.cd_unita_organizzativa);
          aVoceAR.ti_appartenenza:=aArticolo.ti_appartenenza;
          aVoceAR.ti_gestione:=aArticolo.ti_gestione;
          leggiVoce(aVoceAR);
          aVoceAR.ds_voce:=descSottoArtCDSArea(aCDSArea.cd_unita_organizzativa,aArticolo);
          aVoceAR.duva:=aTSNow;
          aVoceAR.utuv:=aUser;
          aggiornaVoce(aVoceAR);
         exception when no_data_found then
          aVoceAR.cd_cds:=aCapitolo.cd_proprio_voce;
          aVoceAR.cd_titolo_capitolo:=aArticolo.cd_titolo_capitolo;
          aVoceAR.cd_sezione_capitolo:=NULL;
          aVoceAR.cd_proprio_voce:=aCDSArea.cd_unita_organizzativa;
          aVoceAR.cd_elemento_voce:=aArticolo.cd_elemento_voce;
          aVoceAR.cd_parte:=aArticolo.cd_parte;
          aVoceAR.ds_voce:=descSottoArtCDSArea(aCDSArea.cd_unita_organizzativa,aArticolo);
          aVoceAR.fl_mastrino:='Y';
          aVoceAR.livello:=7;
          aVoceAR.ti_voce:=SOTTOARTICOLO;
          aVoceAR.cd_funzione:=aArticolo.cd_funzione;
          aVoceAR.cd_unita_organizzativa:=NULL;
          aVoceAR.cd_centro_responsabilita:=NULL;
          aVoceAR.cd_categoria:=aArticolo.cd_categoria;
          aVoceAR.cd_natura := aArticolo.cd_natura;
          aVoceAR.cd_voce_padre:=aArticolo.cd_voce;
          aVoceAR.dacr:=aTSNow;
          aVoceAR.utcr:=aUser;

-- mastrino, elemento voce da fare
          aVoceAR.cd_elemento_voce := aArticolo.cd_titolo_capitolo;
          insertVocePdc(aVoceAR);

      end;
     end loop;
   end loop;
  end;

-- ***************************************************************************
-- ESPLOSIONE INDOTTA DA MODIFICA TABELLA CDR
-- ***************************************************************************

 procedure creaEsplVociCDR(aEs number, aCdCDR varchar2, aUser varchar2) is
  aCDR cdr%rowtype;
  aCDRPrimo cdr%rowtype;
  aUO unita_organizzativa%rowtype;
  aUOCDR unita_organizzativa%rowtype;
  aVoceA voce_f%rowtype;
  aVoceR voce_f%rowtype;
  aUtcr varchar2(20);
  aUtuv varchar2(20);
  aDuva date;
  aDacr date;
 begin

  aCDR:=CNRCTB020.getCDRValido(aEs, aCdCDR);

  if aUser is not null then
   aUtcr:=aUser;
   aUtuv:=aUser;
   aDacr:=sysdate;
   aDuva:=sysdate;
  else
   aUtcr:=aCDR.utcr;
   aUtuv:=aCDR.utuv;
   aDacr:=aCDR.dacr;
   aDuva:=aCDR.duva;
  end if;

  if aCDR.cd_cdr_afferenza is not null then
   aCDRPrimo:=CNRCTB020.getCDRValido(aEs, aCDR.cd_cdr_afferenza);
  end if;

  -- Aggiornamento indotto da creazione o modifica di CDR
  -- Estrae la rubrica a cui il cdr in inserimento appartiene

  aUOCDR:=CNRCTB020.GETUOVALIDA(aEs,aCDR.cd_unita_organizzativa);

  if aCDR.cd_cdr_afferenza is not null then
   aUO:=CNRCTB020.GETUOVALIDA(aEs,aCDRPrimo.cd_unita_organizzativa);
  else
   aUO:=CNRCTB020.GETUOVALIDA(aEs,aCDR.cd_unita_organizzativa);
  end if;

  -- Se l'UO è di tipo ENTE esco senza alcuna azione

  if(aUO.cd_tipo_unita != TIPOCDS_SAC) then
   return;
  end if;

  -- Leggo l'UO collegata per determinare il tipo di CDS

  for aVoceT in (select *  from voce_f where -- ciclo sui titoli
           esercizio = aEs
       and cd_parte = PARTE1
	   and ti_voce = TITOLO
	   and ti_gestione = GESTIONE_SPESE
	   and ti_appartenenza = APPARTENENZA_CDS for update nowait) loop  -- loop su Titoli
   for aVoceS in (select /*+ index (voce_f rx_voce_f00) */ * from voce_f where -- ciclo sulle sezioni
           esercizio = aEs
       and ti_voce = SEZIONE
       and cd_voce_padre = aVoceT.cd_voce
	   and ti_gestione = GESTIONE_SPESE
	   and ti_appartenenza = APPARTENENZA_CDS for update nowait) loop  -- loop su Titoli
    begin
	  select * into aVoceR from voce_f where -- estraggo la rubrica
            esercizio = aEs
        and cd_voce = IBMUTL001.DOTCONCAT(aVoceS.cd_voce,aUO.cd_unita_organizzativa)
        and ti_voce = RUBRICA
	    and ti_gestione = GESTIONE_SPESE
	    and ti_appartenenza = APPARTENENZA_CDS for update nowait;

     for aVocePadre in (select /*+ index (voce_f rx_voce_f00) */ * from voce_f where
            esercizio = aEs
        and cd_voce_padre = aVoceR.cd_voce
        and ti_voce = CAPITOLO
	    and ti_gestione = GESTIONE_SPESE
	    and ti_appartenenza = APPARTENENZA_CDS for update nowait) loop  -- loop sui capitoli
     --inserisco o modifico l'articolo
      begin
        aVoceA.esercizio:=aEs;
        aVoceA.ti_appartenenza:=aVocePadre.ti_appartenenza;
        aVoceA.ti_gestione:=aVocePadre.ti_gestione;
        aVoceA.cd_voce:=IBMUTL001.dotConcat(aVocePadre.cd_voce,aUOCDR.cd_proprio_unita);
        leggiVoce(aVoceA);
        aVoceA.ds_voce:=aCDR.ds_cdr;
        aVoceA.duva:=aDuva;
        aVoceA.utuv:=aUtuv;
        aggiornaVoce(aVoceA);
      exception when no_data_found then
        aVoceA.cd_cds:=aUO.cd_unita_padre;
        aVoceA.cd_titolo_capitolo:=aVocePadre.cd_titolo_capitolo;
        aVoceA.cd_sezione_capitolo:=aVocePadre.cd_sezione_capitolo;
        aVoceA.cd_proprio_voce:=aUOCDR.cd_proprio_unita;
        aVoceA.cd_elemento_voce:=aVocePadre.cd_elemento_voce;
        aVoceA.cd_parte:=aVocePadre.cd_parte;
        aVoceA.ds_voce:=aCDR.ds_cdr;
        aVoceA.fl_mastrino:='Y';
        aVoceA.livello:=6;
        aVoceA.ti_voce:=ARTICOLO;
        aVoceA.cd_funzione:=aVocePadre.cd_funzione;
        aVoceA.cd_unita_organizzativa:=aUO.cd_unita_organizzativa;
        aVoceA.cd_centro_responsabilita:=aCDR.cd_centro_responsabilita;
        aVoceA.cd_categoria:=NULL;
        aVoceA.cd_natura := NULL;
        aVoceA.cd_voce_padre:=aVocePadre.cd_voce;
        aVoceA.dacr:=aDacr;
        aVoceA.utcr:=aUtcr;

-- mastrino, elemento voce da fare
        aVoceA.cd_elemento_voce := aVocePadre.cd_titolo_capitolo;
        insertVocePdc(aVoceA);

	  end;
     end loop;
    exception when no_data_found then
	 NULL;
	end;
   end loop;
  end loop;
 end;

-- *****************************************************************************************
-- Esplode in voci l'aggiunta di una nuova associazione tra elemento_voce/funzione/tipo_cds
-- *****************************************************************************************

 procedure creaEsplIncroci(aASSEVFUNZTIPOCDS IN ass_ev_funz_tipocds%rowtype) is

  aVoceS voce_f%rowtype;
  aVoceR voce_f%rowtype;
  aVoceC voce_f%rowtype;
  aVoceA voce_f%rowtype;
  aUO unita_organizzativa%rowtype;
  aVocePadre voce_f%rowtype;
  aEV elemento_voce%rowtype;
  aUOCDR unita_organizzativa%rowtype;
  i number;
  begin

   -- esplosione parte 1 spese CDS

   -- Estraggo il titolo_capitolo da elemento_voce

   begin
    select * into aEV from elemento_voce where
         esercizio = aASSEVFUNZTIPOCDS.esercizio
	 and ti_gestione = GESTIONE_SPESE
     and ti_appartenenza = APPARTENENZA_CDS
	 and ti_elemento_voce = CAPITOLO
	 and cd_elemento_voce = aASSEVFUNZTIPOCDS.cd_conto for update nowait;
   exception when no_data_found then
    return; -- Se l'elemento voce non è stato ancora definito esco
   end;

   -- estraggo la voce padre a cui attaccare le voci generate (TITOLO)

   select * into aVocePadre from voce_f where
        esercizio = aEV.esercizio
    and cd_voce = aEV.cd_elemento_padre
	and ti_gestione = aEV.ti_gestione
	and ti_appartenenza = aEV.ti_appartenenza for update nowait;

   -- genero le sezioni

   for aFunzione in (select cd_funzione, ds_funzione
                     from Funzione
                     Where  cd_funzione = aASSEVFUNZTIPOCDS.cd_funzione And
                            FL_UTILIZZABILE = 'Y' And
                                exists (select 1 from v_unita_organizzativa_valida
                                        Where esercizio = aASSEVFUNZTIPOCDS.esercizio And
                                              cd_tipo_unita = aASSEVFUNZTIPOCDS.cd_tipo_unita And
                                              cd_tipo_unita != TIPO_ENTE And fl_cds = 'N' And
                                              fl_rubrica = 'Y')
   ) loop -- loop sulle funzioni
    begin
     --inserisco la sezione tra le voci
     aVoceS.cd_cds:=NULL;
     aVoceS.cd_titolo_capitolo:=aVocePadre.cd_titolo_capitolo;
     aVoceS.cd_sezione_capitolo:=NULL;
     aVoceS.cd_voce:=IBMUTL001.dotConcat(aVocePadre.cd_voce,aFunzione.cd_funzione);
     aVoceS.cd_proprio_voce:=aFunzione.cd_funzione;
     aVoceS.cd_elemento_voce:=aVocePadre.cd_elemento_voce;
     aVoceS.cd_parte:=aVocePadre.cd_parte;
     aVoceS.ds_voce:=aFunzione.ds_funzione;
     aVoceS.fl_mastrino:='N';
     aVoceS.livello:=3;
     aVoceS.ti_appartenenza:=aEV.ti_appartenenza;
     aVoceS.ti_gestione:=aEV.ti_gestione;
     aVoceS.ti_voce:=SEZIONE;
     aVoceS.cd_funzione:=aFunzione.cd_funzione;
     aVoceS.cd_unita_organizzativa:=NULL;
     aVoceS.cd_centro_responsabilita:=NULL;
     aVoceS.cd_voce_padre:=aVocePadre.cd_voce;
     aVoceS.cd_natura := NULL;
     aVoceS.esercizio:=aEV.esercizio;
     aVoceS.dacr:=aASSEVFUNZTIPOCDS.dacr;
     aVoceS.utcr:=aASSEVFUNZTIPOCDS.utcr;

-- no mastrino, no elemento voce
     insertVocePdc(aVoceS);

	exception when dup_val_on_index then
	 NULL;
	end;

	-- genero le rubriche sotto le sezioni

    for aUO in (select * from v_unita_organizzativa_valida where
	     esercizio = aEV.esercizio
	 and fl_cds = 'N'
	 and fl_rubrica='Y'
	 and cd_tipo_unita = aASSEVFUNZTIPOCDS.cd_tipo_unita
     and cd_tipo_unita != TIPO_ENTE
	) loop -- loop sulle rubriche
	 --inserisco la rubrica tra le voci
	 begin
      aVoceR.cd_cds:=aUO.cd_unita_padre;
      aVoceR.cd_titolo_capitolo:=aVoceS.cd_titolo_capitolo;
      aVoceR.cd_sezione_capitolo:=NULL;
      aVoceR.cd_voce:=IBMUTL001.dotConcat(aVoceS.cd_voce,aUO.cd_unita_organizzativa);
      aVoceR.cd_proprio_voce:=aUO.cd_unita_organizzativa;
      aVoceR.cd_elemento_voce:=aVoceS.cd_elemento_voce;
      aVoceR.cd_parte:=aVocePadre.cd_parte;
      aVoceR.ds_voce:=aUO.ds_unita_organizzativa;
      aVoceR.fl_mastrino:='N';
      aVoceR.livello:=4;
      aVoceR.ti_appartenenza:=aEV.ti_appartenenza;
      aVoceR.ti_gestione:=aEV.ti_gestione;
      aVoceR.ti_voce:=RUBRICA;
      aVoceR.cd_funzione:=aFunzione.cd_funzione;
      aVoceR.cd_unita_organizzativa:=aUO.cd_unita_organizzativa;
      aVoceR.cd_centro_responsabilita:=NULL;
      aVoceR.cd_voce_padre:=aVoceS.cd_voce;
      aVoceR.cd_natura := NULL;
      aVoceR.esercizio:=aEV.esercizio;
      aVoceR.dacr:=aASSEVFUNZTIPOCDS.dacr;
      aVoceR.utcr:=aASSEVFUNZTIPOCDS.utcr;

-- no mastrino, no elemento voce
      insertVocePdc(aVoceR);

	 exception when dup_val_on_index then
	  NULL;
	 end;

	 -- Per ogni rubrica aggiunta inserisco il capitolo come voce

	 begin
      aVoceC.esercizio:=aEV.esercizio;
      aVoceC.ti_appartenenza:=aVoceR.ti_appartenenza;
      aVoceC.ti_gestione:=aVoceR.ti_gestione;
      aVoceC.cd_voce:=IBMUTL001.dotConcat(aVoceR.cd_voce,aEV.cd_proprio_elemento);
      leggiVoce(aVoceC);
	  aVoceC.ds_voce:=aEV.ds_elemento_voce;
	  aVoceC.duva:=aASSEVFUNZTIPOCDS.duva;
	  aVoceC.utuv:=aASSEVFUNZTIPOCDS.utuv;
	  aggiornaVoce(aVoceC);
	 exception when no_data_found then
      aVoceC.cd_proprio_voce:=aEV.cd_proprio_elemento;
      aVoceC.cd_elemento_voce:=aVoceR.cd_elemento_voce;
      aVoceC.cd_cds:=aUO.cd_unita_padre;
      aVoceC.cd_titolo_capitolo:=aEV.cd_elemento_voce;
      aVoceC.cd_sezione_capitolo:=IBMUTL001.dotConcat(aVoceS.cd_voce,aEV.cd_proprio_elemento);
      aVoceC.cd_parte:=aVoceR.cd_parte;
      aVoceC.ds_voce:=aEV.ds_elemento_voce;
      if(aUO.cd_tipo_unita=TIPOCDS_SAC) then
       aVoceC.fl_mastrino:='N';
      else
       aVoceC.fl_mastrino:='Y';
      end if;
      aVoceC.livello:=5;
      aVoceC.ti_voce:=aEV.ti_elemento_voce;
      aVoceC.cd_funzione:=aFunzione.cd_funzione;
      aVoceC.cd_unita_organizzativa:=aUO.cd_unita_organizzativa;
      aVoceC.cd_centro_responsabilita:=NULL;
      aVoceC.cd_natura := NULL;
      aVoceC.cd_voce_padre:=aVoceR.cd_voce;
      aVoceC.dacr:=aASSEVFUNZTIPOCDS.dacr;
      aVoceC.utcr:=aASSEVFUNZTIPOCDS.utcr;

-- se mastrino, elemento voce da fare
      If aVoceC.fl_mastrino ='Y' Then
        aVoceC.cd_elemento_voce := aEV.cd_elemento_voce;
      End If;

      insertVocePdc(aVoceC);

     end;

	  -- Sotto il capitolo aggiungo gli articoli per il SAC

	 if(aUO.cd_tipo_unita=TIPOCDS_SAC) then
      for aCDR in (select cdrNR.cd_unita_organizzativa, cdrNR.cd_proprio_cdr, cdrNR.cd_centro_responsabilita, cdrNR.ds_cdr from v_cdr_valido cdrR, v_cdr_valido cdrNR where
			     cdrR.esercizio=aUO.esercizio
			 and cdrR.cd_unita_organizzativa = aUO.cd_unita_organizzativa
			 and cdrNR.esercizio=aUO.esercizio
             and (
			     cdrNR.cd_unita_organizzativa=aUO.cd_unita_organizzativa
			  or cdrNR.cd_cdr_afferenza = cdrR.cd_centro_responsabilita
			 )
	  ) loop
	   -- loop sui CDR dell'UO
	   -- inserisco l'articolo solo per il SAC

	   --leggo l'UO della rubrica o non rubrica
	   aUOCDR:=CNRCTB020.GETUOVALIDA(aEV.esercizio,aCDR.cd_unita_organizzativa);
	   begin
         aVoceA.cd_cds:=aUO.cd_unita_padre;
         aVoceA.cd_titolo_capitolo:=aVoceC.cd_titolo_capitolo;
         aVoceA.cd_sezione_capitolo:=aVoceC.cd_sezione_capitolo;
         aVoceA.cd_voce:=IBMUTL001.dotConcat(aVoceC.cd_voce,aUOCDR.cd_proprio_unita);
         aVoceA.cd_proprio_voce:=aUOCDR.cd_proprio_unita;
         aVoceA.cd_elemento_voce:=aVoceC.cd_elemento_voce;
         aVoceA.cd_parte:=aVoceC.cd_parte;
         aVoceA.ds_voce:=aCDR.ds_cdr;
         aVoceA.fl_mastrino:='Y';
         aVoceA.livello:=6;
         aVoceA.ti_appartenenza:=aVoceC.ti_appartenenza;
         aVoceA.ti_gestione:=aVoceC.ti_gestione;
         aVoceA.ti_voce:=ARTICOLO;
         aVoceA.cd_funzione:=aFunzione.cd_funzione;
         aVoceA.cd_unita_organizzativa:=aUO.cd_unita_organizzativa;
         aVoceA.cd_centro_responsabilita:=aCDR.cd_centro_responsabilita;
         aVoceA.cd_voce_padre:=aVoceC.cd_voce;
         aVoceA.cd_natura := NULL;
         aVoceA.esercizio:=aEV.esercizio;
         aVoceA.dacr:=aASSEVFUNZTIPOCDS.dacr;
         aVoceA.utcr:=aASSEVFUNZTIPOCDS.utcr;

-- mastrino, elemento voce da fare
         aVoceA.cd_elemento_voce := aVoceC.cd_titolo_capitolo;
         insertVocePdc(aVoceA);

	   exception when Dup_Val_On_Index then
		 null;
	   end;
      end loop;
	 end if;
	end loop;
   end loop;
  end;

 procedure creaEsplVociEsercizio(aEs number, aCdCDS varchar2, aUser varchar2) is
  aEsercizio esercizio%rowtype;
  aUtcr varchar2(20);
 begin
  begin
   select * into aEsercizio from esercizio where
	 esercizio = aEs
	 and cd_cds = aCdCDS;
  exception when NO_DATA_FOUND then
   return;
  end;

  if aUser is not null then
   aUtcr:=aUser;
  else
   aUtcr:=aEsercizio.utcr;
  end if;

  for aCDS in
   (select * from v_unita_organizzativa_valida where
         esercizio = aEs
	 and cd_unita_organizzativa = aCdCDS
	 and fl_cds = 'Y'
	 and cd_tipo_unita != CNRCTB020.TIPO_ENTE order by cd_unita_organizzativa) loop
   CREAESPLVOCIUO(aEs,aCdCds,aUtcr);
   for aUO in
    (select * from v_unita_organizzativa_valida where
          esercizio = aEs
	  and cd_unita_padre = aCDS.cd_unita_organizzativa
	  and fl_cds = 'N'
	  and cd_tipo_unita != CNRCTB020.TIPO_ENTE order by cd_unita_organizzativa) loop
	CREAESPLVOCIUO(aEs,aUO.cd_unita_organizzativa,aUtcr);
    for aCDR in
     (select * from v_cdr_valido where
           esercizio = aEs
	   and cd_unita_organizzativa = aUO.cd_unita_organizzativa order by cd_centro_responsabilita) loop
	 CREAESPLVOCICDR(aEs,aCDR.cd_centro_responsabilita,aUtcr);
	end loop;
   end loop;
  end loop;
 end;

 procedure eliminaEsplIncroci(aASSEVFUNZTIPOCDS IN ass_ev_funz_tipocds%rowtype) is
  aNum number;
 begin
   -- Le condizioni di eliminazione di un incrocio sono:

   -- non esiste nell'anno specificato in PDG_PREVENTIVO_SPE_DET alcun record corrispondente all'incrocio aASSEVFUNZTIPOCDS

   aNum:=0;
   select count(*) into aNum from pdg_preventivo_spe_det a, linea_attivita b, cdr c, unita_organizzativa d where
        b.cd_centro_responsabilita = a.cd_centro_responsabilita
	and b.cd_linea_attivita=a.cd_linea_attivita
    and c.cd_centro_responsabilita = a.cd_centro_responsabilita
	and d.cd_unita_organizzativa = c.cd_unita_organizzativa
	and d.cd_tipo_unita = aASSEVFUNZTIPOCDS.cd_tipo_unita
	and b.cd_funzione = aASSEVFUNZTIPOCDS.cd_funzione
	and a.esercizio = aASSEVFUNZTIPOCDS.esercizio
	and a.ti_gestione=GESTIONE_SPESE
	and a.ti_appartenenza=APPARTENENZA_CDS
	and a.cd_elemento_voce = aASSEVFUNZTIPOCDS.cd_conto;

   if aNum > 0 then
    IBMERR001.RAISE_ERR_GENERICO('Associazione tra voce del piano funzione e tipo di CDS non eliminabile perchè utilizzata');
   end if;

   -- Blocco la tabella voce_f per l'eliminazione

   lock table voce_f in exclusive mode nowait;

   -- Elimina dalla tabella delle voci tutte quelle voci di spesa CDS parte I
   -- che non hanno più una corrispondenza nella tabella ASS_EV_FUNZ_TIPOCDS

   delete from voce_f where
        esercizio = aASSEVFUNZTIPOCDS.esercizio
    and ti_appartenenza = APPARTENENZA_CDS
    and ti_gestione = GESTIONE_SPESE
    and cd_parte = PARTE1
	and ti_voce = CAPITOLO
	and cd_funzione = aASSEVFUNZTIPOCDS.cd_funzione
    and cd_titolo_capitolo = aASSEVFUNZTIPOCDS.cd_conto
	and cd_unita_organizzativa in (select cd_unita_organizzativa from v_unita_organizzativa_valida where
	     esercizio = aASSEVFUNZTIPOCDS.esercizio
	 and cd_tipo_unita = aASSEVFUNZTIPOCDS.cd_tipo_unita
	 and cd_tipo_unita != TIPO_ENTE
	 and fl_rubrica = 'Y'
	 and fl_cds = 'N'
	);
  end;

 function descSottoArtCDSProprio(aCodiceSA varchar2, aArticolo voce_f%rowtype) return varchar2 is
 begin
  return 'CDS '||aCodiceSA||' Natura '||aArticolo.cd_natura||'-'||aArticolo.ds_voce;
 end;

 function descSottoArtCDSArea(aCodiceSA varchar2, aArticolo voce_f%rowtype) return varchar2 is
 begin
  return 'AREA '||aCodiceSA||' Natura '||aArticolo.cd_natura||'-'||aArticolo.ds_voce;
 end;


end;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy