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

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

There is a newer version: 6.6.11
Show newest version
--------------------------------------------------------
--  DDL for Package Body CNRMIG100
--------------------------------------------------------
create or replace PACKAGE BODY "CNRMIG100" is

lPgExec number;

function isRibaltamentoPDGPEffettuato (aEs number, aPgEsec number) return boolean is
--aPgEsecPrec integer;
conta_es      number;
conta_voce    number;
begin
	begin
	  select count(1)
	  into conta_es
	  from esercizio_base
		where esercizio = aEs;
  exception when NO_DATA_FOUND then
			 conta_es := 0;
	end;

	begin
  	select count(1)
	  into conta_voce
	  from elemento_voce
	  where esercizio = aEs;
  exception when NO_DATA_FOUND then
			 conta_voce := 0;
	end;

	if conta_es <> 0 or conta_voce <> 0 then
	   return true;
	else
		return false;
	end if;

  /* ribaltamento_log viene cancellata quindi non è attendibile fare questo controllo
	begin
		select pg_esecuzione into aPgEsecPrec
		from ribaltamento_log
		where esercizio   = aEs
		  and pg_esecuzione < aPgEsec
		  and stato 	  = 'P';
	exception when NO_DATA_FOUND then
		aPgEsecPrec := 0;
	end;

	if aPgEsecPrec <> 0 then
	   return true;
	else
		return false;
	end if;
  */
end;
----------------------------------------------------------------------------
function isRibaltamentoAltroEffettuato (aEs number, aPgEsec number) return boolean is
--aPgEsecPrec integer;
conta_gruppi   number;
begin
	begin
	  select count(1)
	  into conta_gruppi
	  from GRUPPO_CR
		where esercizio = aEs;
	exception when NO_DATA_FOUND then
			 conta_gruppi := 0;
	end;

  if conta_gruppi <> 0 then
	   return true;
	else
		return false;
	end if;

	/*
	begin
		select pg_esecuzione into aPgEsecPrec
		from ribaltamento_log
		where esercizio   = aEs
		  and pg_esecuzione < aPgEsec
		  and stato 	  = 'S';
	exception when NO_DATA_FOUND then
		aPgEsecPrec := 0;
	end;

	if aPgEsecPrec <> 0 then
	   return true;
	else
		return false;
	end if;
  */
end;
----------------------------------------------------------------------------
procedure startLogRibaltamento(aEs number, aPgEsec number, aDsProcesso varchar2, aUtcr varchar2) is
aRibLogDest ribaltamento_log%rowtype;
begin
	aRibLogDest.ESERCIZIO	  := aEs;
	aRibLogDest.PG_ESECUZIONE := aPgEsec;
	aRibLogDest.DS_PROCESSO   := aDsProcesso;
	aRibLogDest.START_EXEC	  := sysdate;
	aRibLogDest.STATO		  := 'I';
	aRibLogDest.UTCR		  := aUtcr;
	aRibLogDest.DACR		  := sysdate;
	aRibLogDest.UTUV		  := aUtcr;
	aRibLogDest.DUVA		  := sysdate;
	aRibLogDest.PG_VER_REC	  := 1;
	ins_ribaltamento_log(aRibLogDest);
end;
----------------------------------------------------------------------------
procedure endLogRibaltamentoPerPDGP(aEs number, aPgEsec number, aStato in out char, aMessage in out varchar2) is
begin

	if aStato = 'I' then
	   aStato := 'P';
	end if;

    update RIBALTAMENTO_LOG
	set END_EXEC   = sysdate,
		STATO 	   = aStato,
		UTUV	   = cgUtente,
		DUVA	   = sysdate,
		PG_VER_REC = pg_ver_rec + 1
	where esercizio     = aEs
	  and pg_esecuzione = aPgEsec;

	if aStato = 'P' then
		aMessage := 'Ribaltamento per PDGP completato con successo, verificare e eseguire commit';
		ibmutl200.loginf(aPgEsec,aMessage,'','');
	elsif aStato = 'W' then
		rollback;
		aMessage := 'Ribaltamento per PDGP completato, ma con problemi - vedi BATCH_LOG_RIGA con pg_esecuzione '||aPgEsec||'. Eseguito rollback.';
		ibmutl200.loginf(aPgEsec,aMessage,'','');
	else -- aStato = 'E'
		ibmutl200.LOGERR(aPgEsec,aMessage,'','');
		ibmerr001.RAISE_ERR_GENERICO(aMessage);
	end if;

end;
----------------------------------------------------------------------------
procedure endLogRibaltamentoAltro(aEs number, aPgEsec number, aStato in out char, aMessage in out varchar2) is
begin

	if aStato = 'I' then
	   aStato := 'S';
	end if;

    update RIBALTAMENTO_LOG
	set END_EXEC   = sysdate,
		STATO 	   = aStato,
		UTUV	   = cgUtente,
		DUVA	   = sysdate,
		PG_VER_REC = pg_ver_rec + 1
	where esercizio     = aEs
	  and pg_esecuzione = aPgEsec;

	if aStato = 'S' then
		aMessage := 'Ribaltamento completato con successo, verificare e eseguire commit';
		ibmutl200.loginf(aPgEsec,aMessage,'','');
	elsif aStato = 'W' then
		rollback;
		aMessage := 'Ribaltamento completato, ma con problemi - vedi BATCH_LOG_RIGA con pg_esecuzione '||aPgEsec||'. Eseguito rollback.';
		ibmutl200.loginf(aPgEsec,aMessage,'','');
	else -- aStato = 'E'
		ibmutl200.LOGERR(aPgEsec,aMessage,'','');
		ibmerr001.RAISE_ERR_GENERICO(aMessage);
	end if;

end;
----------------------------------------------------------------------------
procedure ins_RIBALTAMENTO_LOG (aDest RIBALTAMENTO_LOG%rowtype) is
  begin
   insert into RIBALTAMENTO_LOG (
     ESERCIZIO
    ,PG_ESECUZIONE
	,DS_PROCESSO
    ,START_EXEC
    ,END_EXEC
    ,STATO
    ,UTCR
    ,DACR
    ,UTUV
    ,DUVA
    ,PG_VER_REC
   ) values (
     aDest.ESERCIZIO
    ,aDest.PG_ESECUZIONE
	,aDest.DS_PROCESSO
    ,aDest.START_EXEC
    ,aDest.END_EXEC
    ,aDest.STATO
    ,aDest.UTCR
    ,aDest.DACR
    ,aDest.UTUV
    ,aDest.DUVA
    ,aDest.PG_VER_REC
    );
end;
----------------------------------------------------------------------------
procedure init_ribaltamento_altro(aEs number, aPgEsec number,aMessage in out varchar2) is
aEsPrec number;
stato_fine char(1) := 'I';
aNum number;
begin

	begin
		startLogRibaltamento(aEs, aPgEsec, dsProcesso_altro , cgUtente);

		if isRibaltamentoAltroEffettuato(aEs, aPgEsec) then
		   stato_fine := 'E';
		   aMessage := 'Lo script di ribaltamento è già stato eseguito con successo per l''esercizio '|| aEs ||': non è possibile eseguirlo nuovamente.';
		   endLogRibaltamentoAltro(aEs, aPgEsec, stato_fine, aMessage);
		end if;
		if Not isRibaltamentoPDGPEffettuato(aEs, aPgEsec) then
		   stato_fine := 'E';
		   aMessage := 'Non è stato ancora eseguito il ribaltamento per il PDGP per l''esercizio '|| aEs ||': non è possibile proseguire.';
		   endLogRibaltamentoAltro(aEs, aPgEsec, stato_fine, aMessage);
		end if;

		aEsPrec := aEs - 1;

  -- inizio spostamento in ribaltamento_altro rospuc
	-- Ribaltamento elemento voce
	aMessage := 'Ribaltamento dell''anagrafica dei capitoli sull''esercizio '||aEs||'. Lock tabelle ELEMENTO_VOCE, VOCE_F, VOCE_F_SALDI_CMP';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	for aElVoce in (select * from ELEMENTO_VOCE
				    where esercizio = aEsPrec
				    and not exists(select 1 from elemento_voce ev
				    where ev.esercizio				= aEs and
				    			ev.ti_gestione 			= elemento_voce.ti_gestione   and
				    			ev.ti_appartenenza  = elemento_voce.ti_appartenenza and
				    			ev.cd_elemento_voce = elemento_voce.cd_elemento_voce)
					order by ti_appartenenza, ti_gestione, cd_elemento_voce) loop -- ordine per RX_ELEMENTO_VOCE00
		begin

			insert into ELEMENTO_VOCE  (ESERCIZIO,
						    TI_APPARTENENZA,
						    TI_GESTIONE,
						    CD_ELEMENTO_VOCE,
						    CD_PROPRIO_ELEMENTO,
						    TI_ELEMENTO_VOCE,
						    FL_LIMITE_ASS_OBBLIG,
						    FL_VOCE_PERSONALE,
						    CD_PARTE,
						    DS_ELEMENTO_VOCE,
						    DACR,
						    UTUV,
						    UTCR,
						    DUVA,
						    PG_VER_REC,
						    CD_ELEMENTO_PADRE,
						    FL_PARTITA_GIRO,
						    CD_CAPOCONTO_FIN,
						    FL_VOCE_SAC,
						    FL_VOCE_NON_SOGG_IMP_AUT,
						    ESERCIZIO_CLA_E,
  						    COD_CLA_E,
  						    ESERCIZIO_CLA_S,
  						    COD_CLA_S,
  						    FL_RECON,
  						    FL_INV_BENI_PATR,
  						    ID_CLASSIFICAZIONE,
  						    CD_TIPO_SPESA_SAC,
  						    CD_TIPO_SPESA_IST,
  						    FL_VOCE_FONDO,
  						    FL_CHECK_TERZO_SIOPE,
  						    FL_INV_BENI_COMP,
  						    FL_LIMITE_SPESA,
  						    FL_PRELIEVO,
  						    FL_SOGGETTO_PRELIEVO,
  						    PERC_PRELIEVO_PDGP_ENTRATE,
  						    FL_SOLO_RESIDUO,
  						    FL_SOLO_COMPETENZA,
  						    FL_TROVATO,
  						    FL_AZZERA_RESIDUI,
  						    ESERCIZIO_ELEMENTO_PADRE,
  						    TI_APPARTENENZA_ELEMENTO_PADRE,
  						    TI_GESTIONE_ELEMENTO_PADRE,
  						    FL_MISSIONI,
  						    CD_UNITA_PIANO,
  						    CD_VOCE_PIANO,
  						    GG_DEROGA_OBBL_COMP_PRG_SCAD,
  						    GG_DEROGA_OBBL_RES_PRG_SCAD,
  						    FL_COMUNICA_PAGAMENTI,
  						    FL_LIMITE_COMPETENZA,
  						    BLOCCO_IMPEGNI_NATFIN)
			values (aEs,
				aElVoce.TI_APPARTENENZA,
				aElVoce.TI_GESTIONE,
				aElVoce.CD_ELEMENTO_VOCE,
				aElVoce.CD_PROPRIO_ELEMENTO,
				aElVoce.TI_ELEMENTO_VOCE,
				aElVoce.FL_LIMITE_ASS_OBBLIG,
				aElVoce.FL_VOCE_PERSONALE,
				aElVoce.CD_PARTE,
				aElVoce.DS_ELEMENTO_VOCE,
				sysdate,
				cgUtente,
				cgUtente,
				sysdate,
				1,
				aElVoce.CD_ELEMENTO_PADRE,
				aElVoce.FL_PARTITA_GIRO,
				aElVoce.CD_CAPOCONTO_FIN,
				aElVoce.FL_VOCE_SAC,
				aElVoce.FL_VOCE_NON_SOGG_IMP_AUT,
				Decode(aElVoce.COD_CLA_E,Null,Null,aEs),
  				aElVoce.COD_CLA_E,
  				Decode(aElVoce.COD_CLA_S,Null,Null,aEs),
  				aElVoce.COD_CLA_S,
  				aElVoce.FL_RECON,
  				aElVoce.FL_INV_BENI_PATR,
  				null,
  				aElVoce.CD_TIPO_SPESA_SAC,
  				aElVoce.CD_TIPO_SPESA_IST,
  				aElVoce.FL_VOCE_FONDO,
  				aElVoce.FL_CHECK_TERZO_SIOPE,
  				aElVoce.FL_INV_BENI_COMP,
  				aElVoce.FL_LIMITE_SPESA,
  				aElVoce.FL_PRELIEVO,
  				aElVoce.FL_SOGGETTO_PRELIEVO,
  				aElVoce.PERC_PRELIEVO_PDGP_ENTRATE,
  				aElVoce.FL_SOLO_RESIDUO,
  				aElVoce.FL_SOLO_COMPETENZA,
  				aElVoce.FL_TROVATO,
  				aElVoce.FL_AZZERA_RESIDUI,
  				aElVoce.ESERCIZIO_ELEMENTO_PADRE,
  				aElVoce.TI_APPARTENENZA_ELEMENTO_PADRE,
  				aElVoce.TI_GESTIONE_ELEMENTO_PADRE,
  				aElVoce.FL_MISSIONI,
  				aElVoce.CD_UNITA_PIANO,
  				aElVoce.CD_VOCE_PIANO,
  				aElVoce.GG_DEROGA_OBBL_COMP_PRG_SCAD,
  				aElVoce.GG_DEROGA_OBBL_RES_PRG_SCAD,
  				aElVoce.FL_COMUNICA_PAGAMENTI,
  				aElVoce.FL_LIMITE_COMPETENZA,
  				aElVoce.BLOCCO_IMPEGNI_NATFIN);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'ELEMENTO_VOCE con PK('||aEs||', '
					||aElVoce.TI_APPARTENENZA||', '
					||aElVoce.TI_GESTIONE||', '
					||aElVoce.CD_ELEMENTO_VOCE||') già esistente','','');
			stato_fine := 'W';
		end;
	end loop;
	-- all'inserimento di record in ELEMENTO_VOCE viene attivato un trigger
	-- che esplode l'anagrafica dei capitoli sul piano dei conti finanziario
	-- in VOCE_F

	-- Ribaltamento delle associazioni fra elementi voce
	aMessage := 'Ribaltamento delle associazioni fra elementi voce sull''esercizio '||aEs||'. Lock tabella ASS_EV_EV';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	for aAssEVEV in (select * from ASS_EV_EV
			 	 where esercizio = aEsPrec
			 	 and
			 	 not exists(select 1 from ass_ev_ev assNew where
					assNew.ESERCIZIO=aEs				and
					assNew.TI_APPARTENENZA=ASS_EV_EV.TI_APPARTENENZA							and
					assNew.TI_GESTIONE	=ASS_EV_EV.TI_GESTIONE										and
					assNew.CD_ELEMENTO_VOCE	=ASS_EV_EV.CD_ELEMENTO_VOCE						and
					assNew.CD_ELEMENTO_VOCE_COLL=ASS_EV_EV.CD_ELEMENTO_VOCE_COLL	and
					assNew.TI_APPARTENENZA_COLL =ASS_EV_EV.TI_APPARTENENZA_COLL		and
					assNew.TI_GESTIONE_COLL	=ASS_EV_EV.TI_GESTIONE_COLL		and
					assNew.CD_CDS	=ASS_EV_EV.CD_CDS							and
					assNew.CD_NATURA	= ASS_EV_EV.CD_NATURA			)) loop
		begin
			insert into ASS_EV_EV  (ESERCIZIO,
						TI_APPARTENENZA,
						TI_GESTIONE,
						CD_ELEMENTO_VOCE,
						CD_ELEMENTO_VOCE_COLL,
						TI_APPARTENENZA_COLL,
						TI_GESTIONE_COLL,
						CD_CDS,
						CD_NATURA,
						TI_ELEMENTO_VOCE,
						TI_ELEMENTO_VOCE_COLL,
						UTUV,
						DACR,
						UTCR,
						DUVA,
						PG_VER_REC)
			values (aEs,
				aAssEVEV.TI_APPARTENENZA,
				aAssEVEV.TI_GESTIONE,
				aAssEVEV.CD_ELEMENTO_VOCE,
				aAssEVEV.CD_ELEMENTO_VOCE_COLL,
				aAssEVEV.TI_APPARTENENZA_COLL,
				aAssEVEV.TI_GESTIONE_COLL,
				aAssEVEV.CD_CDS,
				aAssEVEV.CD_NATURA,
				aAssEVEV.TI_ELEMENTO_VOCE,
				aAssEVEV.TI_ELEMENTO_VOCE_COLL,
				cgUtente,
				sysdate,
				cgUtente,
				sysdate,
				1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'ASS_EV_EV con PK('||aEs||', '
					||aAssEVEV.TI_APPARTENENZA||', '
					||aAssEVEV.TI_GESTIONE||', '
					||aAssEVEV.CD_ELEMENTO_VOCE||', '
					||aAssEVEV.CD_ELEMENTO_VOCE_COLL||', '
					||aAssEVEV.TI_APPARTENENZA_COLL||', '
					||aAssEVEV.TI_GESTIONE_COLL||', '
					||aAssEVEV.CD_CDS||', '
					||aAssEVEV.CD_NATURA||') già esistente','','');
			stato_fine := 'W';
		end;
	end loop;

	-- Ribaltamento associazioni tra categorie e voci del piano dei conti
	aMessage := 'Ribaltamento associazioni tra categorie e voci del piano dei conti sull''esercizio '||aEs||'. Lock tabella CATEGORIA_GRUPPO_VOCE';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	for aCatGV in (select * from CATEGORIA_GRUPPO_VOCE
			   	   where esercizio = aEsPrec) loop
		begin
			insert into CATEGORIA_GRUPPO_VOCE  (CD_CATEGORIA_GRUPPO,
							    ESERCIZIO,
							    TI_APPARTENENZA,
							    TI_GESTIONE,
							    DACR,
							    UTCR,
							    DUVA,
							    UTUV,
							    PG_VER_REC,
							    CD_ELEMENTO_VOCE)
			values (aCatGV.CD_CATEGORIA_GRUPPO,
				aEs,
				aCatGV.TI_APPARTENENZA,
				aCatGV.TI_GESTIONE,
				sysdate,
				cgUtente,
				sysdate,
				cgutente,
				1,
				aCatGV.CD_ELEMENTO_VOCE);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'CATEGORIA_GRUPPO_VOCE con PK ('||aCatGV.CD_CATEGORIA_GRUPPO||', '
					 ||aEs||', '
					 ||aCatGV.TI_APPARTENENZA||', '
					 ||aCatGV.TI_GESTIONE||', '
					 ||aCatGV.CD_ELEMENTO_VOCE||') già esistente','','');
			stato_fine := 'W';
		end;
	end loop;
-- Ribaltamento classificazione voci
	declare
	   new_id NUMBER;
	   new_id_padre NUMBER:=Null;
	begin
	lock table classificazione_voci in exclusive mode nowait;
	aMessage := 'Ribaltamento Classificazione Voci in aggiunta sull''esercizio '||aEs||'. Lock tabella CLASSIFICAZIONE_VOCI';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');

	Select Max(id_classificazione)
	Into new_id
	From CLASSIFICAZIONE_VOCI;

	  for aClassV in (select * from CLASSIFICAZIONE_VOCI
			where esercizio = aEsPrec and not exists(select 1 from classificazione_voci class_new where
			class_new.esercizio=aEs and
			class_new.ti_gestione = classificazione_voci.ti_gestione  and
			class_new.cd_livello1 = classificazione_voci.cd_livello1  and
			nvl(class_new.cd_livello2,' ') = nvl(classificazione_voci.cd_livello2,' ')  and
      nvl(class_new.cd_livello3,' ') = nvl(classificazione_voci.cd_livello3,' ')  and
      nvl(class_new.cd_livello4,' ') = nvl(classificazione_voci.cd_livello4,' ')  and
      nvl(class_new.cd_livello5,' ') = nvl(classificazione_voci.cd_livello5,' ')  and
      nvl(class_new.cd_livello6,' ') = nvl(classificazione_voci.cd_livello6,' ')  and
      nvl(class_new.cd_livello7,' ') = nvl(classificazione_voci.cd_livello7,' ') )
			order by esercizio, ti_gestione, cd_livello1 Desc, cd_livello2 Desc ,cd_livello3 Desc ,
			cd_livello4 Desc, cd_livello5 Desc, cd_livello6 Desc, cd_livello7 Desc)
	  loop
		begin
			new_id := new_id + 1;
			insert into CLASSIFICAZIONE_VOCI (ID_CLASSIFICAZIONE,
							  ESERCIZIO,
							  TI_GESTIONE,
							  DS_CLASSIFICAZIONE,
							  CD_LIVELLO1,
							  CD_LIVELLO2,
							  CD_LIVELLO3,
							  CD_LIVELLO4,
							  CD_LIVELLO5,
							  CD_LIVELLO6,
							  CD_LIVELLO7,
							  ID_CLASS_PADRE,
							  FL_MASTRINO,
							  DUVA,
							  UTUV,
							  DACR,
							  UTCR,
							  PG_VER_REC,
							  FL_CLASS_SAC,
							  FL_SOLO_GESTIONE,
							  FL_ACCENTRATO,
							  FL_DECENTRATO,
							  CDR_ACCENTRATORE,
							  FL_PIANO_RIPARTO,
						  	  FL_ESTERNA_DA_QUADRARE_SAC,
						  	  FL_VISTO_DIP_VARIAZIONI,
						  	  TI_CLASSIFICAZIONE,
						  	  FL_PREV_OBB_ANNO_SUC,
						  	  IM_LIMITE_ASSESTATO)
			values (new_id,
				aEs,
				aClassV.TI_GESTIONE,
				aClassV.DS_CLASSIFICAZIONE,
				aClassV.CD_LIVELLO1,
				aClassV.CD_LIVELLO2,
				aClassV.CD_LIVELLO3,
				aClassV.CD_LIVELLO4,
				aClassV.CD_LIVELLO5,
				aClassV.CD_LIVELLO6,
				aClassV.CD_LIVELLO7,
				aClassV.ID_CLASS_PADRE,
				aClassV.FL_MASTRINO,
				sysdate,
				cgUtente,
				sysdate,
				cgutente,
				1,
				aClassV.FL_CLASS_SAC,
				aClassV.FL_SOLO_GESTIONE,
				aClassV.FL_ACCENTRATO,
				aClassV.FL_DECENTRATO,
				aClassV.CDR_ACCENTRATORE,
				aClassV.FL_PIANO_RIPARTO,
				aClassV.FL_ESTERNA_DA_QUADRARE_SAC,
				aClassV.FL_VISTO_DIP_VARIAZIONI,
				aclassV.TI_CLASSIFICAZIONE,
				aclassV.FL_PREV_OBB_ANNO_SUC,
				aclassV.IM_LIMITE_ASSESTATO);

			--Aggiorno l'elemento voce con la nuova classificazione creata
			update elemento_voce v
			set v.id_classificazione =  new_id
			where v.esercizio = aEs
			and (v.ti_appartenenza, v.ti_gestione, v.cd_elemento_voce) In
			     (Select a.ti_appartenenza, a.ti_gestione, a.cd_elemento_voce
			     From elemento_voce a
			     Where a.esercizio = aEsPrec
			       And a.id_classificazione = aClassV.id_classificazione);
		exception
		   when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'CLASSIFICAZIONE_VOCI con PK ('||new_id||') già esistente','','');
			stato_fine := 'W';
		   when OTHERS then
			ibmutl200.LOGWAR(aPgEsec,'SK_CLASSIFICAZIONE_VOCI violata per la classificazione ('||new_id||')','','');
			stato_fine := 'W';
		end;
	  end loop;
	end;

	-- Aggiornamento id_class_padre nel nuovo anno
	Declare
    	    rec_class 	CLASSIFICAZIONE_VOCI%Rowtype;
    	    new_padre   NUMBER;
	Begin
	   for aClassPadre in (select * from CLASSIFICAZIONE_VOCI
		    where esercizio = aEsPrec
		    And id_class_padre Is Not Null and exists(select 1 from classificazione_voci new_class
		    where
		    new_class.esercizio = aEs and
		    CLASSIFICAZIONE_VOCI.id_class_padre=new_class.id_class_padre)) loop
  		select *
		into rec_class
		From CLASSIFICAZIONE_VOCI
		where esercizio = aEsPrec
		and ti_gestione = aClassPadre.ti_gestione
		and id_classificazione = aClassPadre.id_class_padre;

		select id_classificazione
		into new_padre
		from CLASSIFICAZIONE_VOCI
		where esercizio = aEs
		and ti_gestione = rec_class.ti_gestione
		and cd_livello1 = rec_class.cd_livello1
		and ((rec_class.cd_livello2 Is Not Null And cd_livello2 = rec_class.cd_livello2)
	      	      Or
	      	     (rec_class.cd_livello2 Is Null And cd_livello2 Is Null))
		and ((rec_class.cd_livello3 Is Not Null And cd_livello3 = rec_class.cd_livello3)
	              Or
	             (rec_class.cd_livello3 Is Null And cd_livello3 Is Null))
		and ((rec_class.cd_livello4 Is Not Null And cd_livello4 = rec_class.cd_livello4)
	              Or
	             (rec_class.cd_livello4 Is Null And cd_livello4 Is Null))
		and ((rec_class.cd_livello5 Is Not Null And cd_livello5 = rec_class.cd_livello5)
	              Or
	             (rec_class.cd_livello5 Is Null And cd_livello5 Is Null))
		and ((rec_class.cd_livello6 Is Not Null And cd_livello6 = rec_class.cd_livello6)
	              Or
	             (rec_class.cd_livello6 Is Null And cd_livello6 Is Null))
		and ((rec_class.cd_livello7 Is Not Null And cd_livello7 = rec_class.cd_livello7)
	              Or
	             (rec_class.cd_livello7 Is Null And cd_livello7 Is Null));

		update CLASSIFICAZIONE_VOCI
		set id_class_padre = new_padre
		where esercizio = aEs
		and ti_gestione = aClassPadre.ti_gestione
		and cd_livello1 = aClassPadre.cd_livello1
		and ((aClassPadre.cd_livello2 Is Not Null And cd_livello2 = aClassPadre.cd_livello2)
	             Or
	             (aClassPadre.cd_livello2 Is Null And cd_livello2 Is Null))
		and ((aClassPadre.cd_livello3 Is Not Null And cd_livello3 = aClassPadre.cd_livello3)
	             Or
	             (aClassPadre.cd_livello3 Is Null And cd_livello3 Is Null))
		and ((aClassPadre.cd_livello4 Is Not Null And cd_livello4 = aClassPadre.cd_livello4)
	             Or
	             (aClassPadre.cd_livello4 Is Null And cd_livello4 Is Null))
		and ((aClassPadre.cd_livello5 Is Not Null And cd_livello5 = aClassPadre.cd_livello5)
	             Or
	             (aClassPadre.cd_livello5 Is Null And cd_livello5 Is Null))
		and ((aClassPadre.cd_livello6 Is Not Null And cd_livello6 = aClassPadre.cd_livello6)
	             Or
	             (aClassPadre.cd_livello6 Is Null And cd_livello6 Is Null))
		and ((aClassPadre.cd_livello7 Is Not Null And cd_livello7 = aClassPadre.cd_livello7)
	             Or
	             (aClassPadre.cd_livello7 Is Null And cd_livello7 Is Null));
   	End Loop;
	End;

	-- Ribaltamento per la Gestione SIOPE

	-- Ribaltamento dei codici siope
	aMessage := 'Ribaltamento Codici SIOPE sull''esercizio '||aEs||'. Lock tabella CODICI_SIOPE';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	For aCodSiope in (select * from CODICI_SIOPE
			  where esercizio = aEsPrec)
	Loop
		Begin
			insert into CODICI_SIOPE  (ESERCIZIO,
  						   TI_GESTIONE,
  						   CD_SIOPE,
  						   DESCRIZIONE,
  						   UTCR,
  						   DACR,
  						   UTUV,
  						   DUVA,
  						   PG_VER_REC)
			values (aEs,
  				aCodSiope.TI_GESTIONE,
  				aCodSiope.CD_SIOPE,
  				aCodSiope.DESCRIZIONE,
				cgUtente,
				sysdate,
				cgUtente,
				sysdate,
				1);
		Exception when dup_val_on_index then
			ibmutl200.logwar(aPgEsec,'Codice SIOPE con PK('||aEs||', '
							     	       ||aCodSiope.TI_GESTIONE||', '
								       ||aCodSiope.CD_SIOPE||') già inserito','','');
			stato_fine := 'W';
		End;
	End Loop;

	-- Ribaltamento delle associazioni fra tipologie istat e codici siope
	aMessage := 'Ribaltamento Associazione Tipologia ISTAT - Codici SIOPE sull''esercizio '||aEs||'. Lock tabella ASS_TIPOLOGIA_ISTAT_SIOPE';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	For aAssIstatSiope in (select * from ASS_TIPOLOGIA_ISTAT_SIOPE
			       where esercizio_siope = aEsPrec)
	Loop
		Begin
			insert into ASS_TIPOLOGIA_ISTAT_SIOPE  (PG_TIPOLOGIA,
								ESERCIZIO_SIOPE,
  						   		TI_GESTIONE_SIOPE,
  						   		CD_SIOPE,
  						   		UTCR,
  						   		DACR,
  						   		UTUV,
  						   		DUVA,
  						   		PG_VER_REC)
			values (aAssIstatSiope.PG_TIPOLOGIA,
				aEs,
  				aAssIstatSiope.TI_GESTIONE_SIOPE,
  				aAssIstatSiope.CD_SIOPE,
				cgUtente,
				sysdate,
				cgUtente,
				sysdate,
				1);
		Exception when dup_val_on_index then
			ibmutl200.logwar(aPgEsec,'Associazione Tipologia ISTAT - Codici SIOPE con PK('||aAssIstatSiope.PG_TIPOLOGIA||', '
							     	       				      ||aEs||', '
							     	                                      ||aAssIstatSiope.TI_GESTIONE_SIOPE||', '
								                                      ||aAssIstatSiope.CD_SIOPE||') già inserita','','');
			stato_fine := 'W';
		End;
	End Loop;

	-- Ribaltamento delle associazioni fra elementi voce e codici siope
	aMessage := 'Ribaltamento delle associazioni fra elementi voce e codici siope sull''esercizio '||aEs||'. Lock tabella ASS_EV_SIOPE';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	For aAssEVSiope in (select * from ASS_EV_SIOPE
			    where esercizio = aEsPrec) loop
		Begin
			insert into ASS_EV_SIOPE  (ESERCIZIO,
						   TI_APPARTENENZA,
						   TI_GESTIONE,
						   CD_ELEMENTO_VOCE,
						   ESERCIZIO_SIOPE,
						   TI_GESTIONE_SIOPE,
						   CD_SIOPE,
						   UTCR,
						   DACR,
						   UTUV,
						   DUVA,
						   PG_VER_REC)
			values (aEs,
				aAssEVSiope.TI_APPARTENENZA,
				aAssEVSiope.TI_GESTIONE,
				aAssEVSiope.CD_ELEMENTO_VOCE,
				aEs,
				aAssEVSiope.TI_GESTIONE_SIOPE,
				aAssEVSiope.CD_SIOPE,
				cgUtente,
				sysdate,
				cgUtente,
				sysdate,
				1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'ASS_EV_SIOPE con PK('||aEs||', '
					||aAssEVSiope.TI_APPARTENENZA||', '
					||aAssEVSiope.TI_GESTIONE||', '
					||aAssEVSiope.CD_ELEMENTO_VOCE||', '
					||aEs||', '
					||aAssEVSiope.TI_GESTIONE_SIOPE||', '
					||aAssEVSiope.CD_SIOPE||') già esistente','','');
			stato_fine := 'W';
		end;
	end loop;

	-- Ribaltamento delle associazioni fra contributi/ritenute e codici siope
	aMessage := 'Ribaltamento Associazione Contributi/ritenute - Codici SIOPE sull''esercizio '||aEs||'. Lock tabella ASS_TIPO_CONTR_RITENUTA_SIOPE';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	For aAssContrRitSiope in (Select * From ASS_TIPO_CONTR_RITENUTA_SIOPE
			          Where esercizio = aEsPrec)
	Loop
		Begin
			insert into ASS_TIPO_CONTR_RITENUTA_SIOPE  (ESERCIZIO,
								    CD_CONTRIBUTO_RITENUTA,
								    DT_INI_VALIDITA,
								    ESERCIZIO_SIOPE_S,
  						   		    TI_GESTIONE_SIOPE_S,
  						   		    CD_SIOPE_S,
  						   		    ESERCIZIO_SIOPE_E,
  						   		    TI_GESTIONE_SIOPE_E,
  						   		    CD_SIOPE_E,
  						   		    DACR,
  						   		    UTCR,
  						   		    DUVA,
  						   		    UTUV,
  						   		    PG_VER_REC)
			values (aEs,
				aAssContrRitSiope.CD_CONTRIBUTO_RITENUTA,
				aAssContrRitSiope.DT_INI_VALIDITA,
				aEs,
  				aAssContrRitSiope.TI_GESTIONE_SIOPE_S,
  				aAssContrRitSiope.CD_SIOPE_S,
  				aEs,
  				aAssContrRitSiope.TI_GESTIONE_SIOPE_E,
  				aAssContrRitSiope.CD_SIOPE_E,
				sysdate,
				cgUtente,
				sysdate,
				cgUtente,
				1);
		Exception when dup_val_on_index then
			ibmutl200.logwar(aPgEsec,'Associazione Contributi/ritenute - Codici SIOPE con PK('||aEs||', '
							     	       				      ||aAssContrRitSiope.CD_CONTRIBUTO_RITENUTA||', '
							     	                                      ||aAssContrRitSiope.DT_INI_VALIDITA||', '
							     	                                      ||aAssContrRitSiope.TI_GESTIONE_SIOPE_S||', '
							     	                                      ||aAssContrRitSiope.CD_SIOPE_S||', '
							     	                                      ||aAssContrRitSiope.TI_GESTIONE_SIOPE_E||', '
								                                      ||aAssContrRitSiope.CD_SIOPE_E||') già inserita','','');
			stato_fine := 'W';
		End;
	End Loop;

		-- Ribaltamento del piano dei conti E/P
		ribaltaEP(aEs, aEsPrec, aPgEsec, stato_fine, aMessage);

		-- Ribaltamento configurazione CORI per PDGP
		ribaltaCORI_pdgp(aEs, aEsPrec, aPgEsec, stato_fine, aMessage);
-- fine spostamento in ribaltamento  altro rospuc

		-- Ribaltamento FIRME sull'esercizio contabile destinazione
		-- a partire dall'esercizio precedente
		begin
			aMessage := 'Inserimento delle FIRME per l''esercizio base '||aEs||'. Lock tabella FIRME';
			ibmutl200.LOGINF(aPgEsec,aMessage,'','');
			insert into FIRME (ESERCIZIO,TIPO, FIRMA1, FIRMA2, FIRMA3, FIRMA4,
			                   DACR, UTCR, DUVA, UTUV, PG_VER_REC, DT_STAMPA)
			select aEs, TIPO, FIRMA1, FIRMA2, FIRMA3, FIRMA4,
			       sysdate,cgUtente,sysdate,cgUtente,1,NULL
			from FIRME
			where ESERCIZIO = aEsPrec;
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'FIRME per l''esercizio base '||aEs||' già esistenti','','');
			stato_fine := 'W';
		end;

		-- Ribaltamento ASS_INCARICO_ATTIVITA sull'esercizio contabile destinazione
		-- a partire dall'esercizio precedente
		-- archivio già caricato anche negli anni successivi
		begin
			aMessage := 'Inserimento di ASS_INCARICO_ATTIVITA per l''esercizio base '||aEs||'. Lock tabella ASS_INCARICO_ATTIVITA';
			ibmutl200.LOGINF(aPgEsec,aMessage,'','');
			insert into ASS_INCARICO_ATTIVITA (ESERCIZIO,CD_TIPO_INCARICO,CD_TIPO_ATTIVITA,TIPO_NATURA,CD_TIPO_LIMITE,
							   STATO,UTCR,DACR,UTUV,DUVA,PG_VER_REC)
			select  aEs,CD_TIPO_INCARICO,CD_TIPO_ATTIVITA,TIPO_NATURA,CD_TIPO_LIMITE,
			 	STATO,cgUtente,Sysdate,cgUtente,Sysdate,1
			from ASS_INCARICO_ATTIVITA
			where ESERCIZIO = aEsPrec;
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'ASS_INCARICO_ATTIVITA per l''esercizio base '||aEs||' già esistente','','');
			stato_fine := 'W';
		end;

		-- Ribaltamento configurazione CORI
		ribaltaCORI_altro(aEs, aEsPrec, aPgEsec, stato_fine, aMessage);

		-- Ribaltamento associazione tra UO e tipologie sezionali
		aMessage := 'Ribaltamento associazione tra UO e tipologie sezionali sull''esercizio '||aEs||'. Lock tabella SEZIONALE';
		ibmutl200.loginf(aPgEsec,aMessage,'','');
		for	aSez in (select * from SEZIONALE
				 	 where esercizio = aEsPrec
					   and cd_cds in (select cd_unita_organizzativa
					   	   		  	  from v_unita_organizzativa_valida
			 	 					  where fl_cds    = 'Y'
				   					    and esercizio = aEs)) loop
			begin
				 insert into SEZIONALE (CD_CDS,
							CD_UNITA_ORGANIZZATIVA,
							ESERCIZIO,
							CD_TIPO_SEZIONALE,
							TI_FATTURA,
							PRIMO,
							CORRENTE,
							ULTIMO,
							DACR,
							UTCR,
							DUVA,
							UTUV,
							PG_VER_REC)
				 		values (aSez.CD_CDS,
							aSez.CD_UNITA_ORGANIZZATIVA,
							aEs,
							aSez.CD_TIPO_SEZIONALE,
							aSez.TI_FATTURA,
							aSez.PRIMO,
							0,
							aSez.ULTIMO,
							sysdate,
							cgUtente,
							sysdate,
							cgUtente,
							1);
			exception when DUP_VAL_ON_INDEX then
				ibmutl200.LOGWAR(aPgEsec,'SEZIONALE con PK ('||aSez.CD_CDS||', '
						 ||aSez.CD_UNITA_ORGANIZZATIVA||', '
						 ||aEs||', '
						 ||aSez.CD_TIPO_SEZIONALE||', '
						 ||aSez.TI_FATTURA||') già inserito','','');
				stato_fine := 'W';
			end;
		end loop;

		-- Ribaltamento tabella causali di registrazione COGE
		aMessage := 'Ribaltamento tabella causali di registrazione COGE sull''esercizio '||aEs||'. Lock tabella CAUSALE_COGE';
		ibmutl200.loginf(aPgEsec,aMessage,'','');
		for aCC in (select * from causale_coge
				    where esercizio = aEsPrec) loop
			begin
				 insert into CAUSALE_COGE (ESERCIZIO,
							   CD_CAUSALE_COGE,
							   DS_CAUSALE,
							   TI_CAUSALE_COGE,
							   CENTRO_COSTO,
							   DT_CANCELLAZIONE,
							   DACR,
							   DUVA,
							   UTUV,
							   UTCR,
							   PG_VER_REC)
				 values (aEs,
					 aCC.CD_CAUSALE_COGE,
					 aCC.DS_CAUSALE,
					 aCC.TI_CAUSALE_COGE,
					 aCC.CENTRO_COSTO,
					 aCC.DT_CANCELLAZIONE,
					 sysdate,
					 sysdate,
					 cgUtente,
					 cgUtente,
					 1);
			exception when DUP_VAL_ON_INDEX then
				ibmutl200.logwar(aPgEsec,'Causale coge con PK('||aEs||', '||aCC.cd_causale_coge||') già inserita','','');
				stato_fine := 'W';
			end;
		end loop;

		-- ribaltamento tabella associativa tra la categoria di un bene e il tipo ammortamento
		aMessage := 'Ribaltamento associazione tra la categoria di un bene e il tipo ammortamento sull''esercizio '||aEs||'. Lock tabella ASS_TIPO_AMM_CAT_GRUP_INV';
		ibmutl200.loginf(aPgEsec,aMessage,'','');
		for aAssCatAmm in (select * from ASS_TIPO_AMM_CAT_GRUP_INV
				 	  	   where esercizio_competenza = aEsPrec) loop
			begin
				insert into ASS_TIPO_AMM_CAT_GRUP_INV (CD_TIPO_AMMORTAMENTO,
									TI_AMMORTAMENTO,
									CD_CATEGORIA_GRUPPO,
									ESERCIZIO_COMPETENZA,
									DT_CANCELLAZIONE,
									UTCR,
									DACR,
									UTUV,
									DUVA,
									PG_VER_REC)
				values (aAssCatAmm.CD_TIPO_AMMORTAMENTO,
					aAssCatAmm.TI_AMMORTAMENTO,
					aAssCatAmm.CD_CATEGORIA_GRUPPO,
					aEs,
					aAssCatAmm.DT_CANCELLAZIONE,
					cgUtente,
					sysdate,
					cgUtente,
					sysdate,
					1);
			exception when dup_val_on_index then
				ibmutl200.logwar(aPgEsec,'Associazione ammortamento-categoria bene con PK('||aAssCatAmm.cd_tipo_ammortamento||', '
													   ||aAssCatAmm.ti_ammortamento||', '
													   ||aAssCatAmm.cd_categoria_gruppo||', '
													   ||aEs||') già inserita','','');
				stato_fine := 'W';
			end;
		end loop;

		-- ribaltamento associazioni tra CODICE SIA in interfaccia di ritorno cassiere e codice CDS CIR
 		aMessage := 'Ribaltamento associazioni tra CODICE SIA in interfaccia di ritorno cassiere e codice CDS CIR sull''esercizio '||aEs||'. Lock tabella EXT_CASSIERE_CDS';
 		ibmutl200.loginf(aPgEsec,aMessage,'','');
 		for aExt in (select * from EXT_CASSIERE_CDS
 				 	 where esercizio = aEsPrec
 				 	 and cd_cds in (select cd_unita_organizzativa
							from v_unita_organizzativa_valida
							where fl_cds    = 'Y'
							and esercizio = aEs)) loop
 			begin
				insert into EXT_CASSIERE_CDS (ESERCIZIO,
							      CODICE_PROTO,
							      CD_CDS,
							      DACR,
							      UTCR,
							      DUVA,
							      UTUV,
							      PG_VER_REC,
							      codice_sia,
							      codice_cuc)
				values (aEs,
					aExt.CODICE_PROTO,
					aExt.CD_CDS,
					sysdate,
					cgUtente,
					sysdate,
					cgUtente,
					1,
				  aExt.CODICE_SIA,
          aExt.CODICE_CUC);
			exception when dup_val_on_index then
				ibmutl200.logwar(aPgEsec,'Associazione tra CODICE SIA in interfaccia di ritorno cassiere e codice CDS CIR con PK('||aEs||', '
													   ||aExt.codice_proto||') già inserita','','');
				stato_fine := 'W';
			end;
 		end loop;

    -- Ribaltamento anagrafiche per INTRASTAT
    ribaltaINTRASTAT(aEs, aEsPrec, aPgEsec, stato_fine, aMessage);

		-- ribaltamento Nazioni inserite nella BLACKLIST
 		aMessage := 'Ribaltamento Nazioni inserite nella BLACKLIST sull''esercizio '||aEs||'. Lock tabella NAZIONE_BLACKLIST';
 		ibmutl200.loginf(aPgEsec,aMessage,'','');
 		for aNaz in (select * from NAZIONE_BLACKLIST
 				 	 where esercizio = aEsPrec) loop
 			begin
				insert into NAZIONE_BLACKLIST (ESERCIZIO,
							      									 CD_CATASTALE,
																		   DS_NAZIONE,
																		   DACR,
																		   UTCR,
																		   DUVA,
																		   UTUV,
																		   PG_VER_REC,
																			 CD_NAZIONE)
				       values (aEs,
					             aNaz.CD_CATASTALE,
					             aNaz.DS_NAZIONE,
											 sysdate,
					             cgUtente,
					             sysdate,
					             cgUtente,
					             1,
					             aNaz.CD_NAZIONE);
			exception when dup_val_on_index then
				ibmutl200.logwar(aPgEsec,'Nazione inserita nella BLACKLIST con PK('||aEs||', '
													   ||aNaz.CD_CATASTALE||','||aNaz.CD_NAZIONE||') già inserita','','');
				stato_fine := 'W';
			end;
 		end loop;

		-- Update del log sul processo

		endLogRibaltamentoAltro(aEs, aPgEsec, stato_fine, aMessage );

	exception when OTHERS then
	    rollback;
		aMessage := 'Errore non gestito: '||DBMS_UTILITY.FORMAT_ERROR_STACK;
		ibmutl200.LOGERR(aPgEsec,aMessage,'','');
	end;

end;
----------------------------------------------------------------------------
procedure init_ribaltamento_altro(aEs number,aMessage in out varchar2) is
 aPgEsec  number;
begin
	aPgEsec := IBMUTL200.LOGSTART(TI_LOG_RIBALTAMENTO_ALTRO,dsProcesso_altro,null,cgUtente,null,null);
    init_ribaltamento_altro(aEs, aPgEsec, aMessage);
end;
----------------------------------------------------------------------------
procedure init_ribaltamento_pdgp(aEs number, aPgEsec number, aMessage in out varchar2) is
aEsPrec         number;
stato_fine      char(1) := 'I';
aNum            number;
new_val01       VARCHAR2(100);
begin
	begin
        dbms_output.put_line('0001');
		startLogRibaltamento(aEs, aPgEsec, dsProcesso_pdgp , cgUtente);

		if isRibaltamentoPDGPEffettuato(aEs, aPgEsec) then
		   stato_fine := 'E';
		   aMessage := 'Lo script di ribaltamento per il PDGP è già stato eseguito con successo per l''esercizio '|| aEs ||': non è possibile eseguirlo nuovamente.';
		   endLogRibaltamentoPerPDGP(aEs, aPgEsec, stato_fine, aMessage);
		end if;
		if isRibaltamentoAltroEffettuato(aEs, aPgEsec) then
		   stato_fine := 'E';
		   aMessage := 'Lo script di ribaltamento è già stato eseguito con successo per l''esercizio '|| aEs ||': non è possibile eseguire quello per il PDGP.';
		   endLogRibaltamentoPerPDGP(aEs, aPgEsec, stato_fine, aMessage);
		end if;

		aEsPrec := aEs - 1;

		begin
			 select 1 into aNum
			 from dual
			 where exists (select 1 from esercizio_base
			 	   		   where esercizio = aEs);
			 stato_fine := 'E';
			 aMessage := 'Esercizio base '||aEs||' già esistente: impossibile ribaltare';
			 endLogRibaltamentoPerPDGP(aEs, aPgEsec, stato_fine, aMessage);
		exception when NO_DATA_FOUND then
			 null;
		end;

		begin
			 select 1 into aNum
			 from dual
			 where exists (select 1 from elemento_voce
			 	   		   where esercizio = aEs);
			 stato_fine := 'E';
			 aMessage := 'Esistono elementi voce definiti sull''esercizio '||aEs||': impossibile ribaltare';
			 endLogRibaltamentoPerPDGP(aEs, aPgEsec, stato_fine, aMessage);
		exception when NO_DATA_FOUND then
			 null;
		end;

		-- Creazione esercizio base
		begin
			aMessage := 'Inserimento dell''esercizio base '||aEs||'. Lock tabella ESERCIZIO_BASE';
			ibmutl200.LOGINF(aPgEsec,aMessage,'','');

			insert into ESERCIZIO_BASE (ESERCIZIO, DACR, DUVA, UTUV, UTCR, PG_VER_REC)
			values (aEs,sysdate,sysdate,cgUtente,cgUtente,1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Esercizio base '||aEs||' già esistente','','');
			stato_fine := 'W';
		end;

		-- Creazione Parametri CNR
		begin
			aMessage := 'Inserimento dei Parametri CNR per l''esercizio base '||aEs||'. Lock tabella PARAMETRI_CNR';
			ibmutl200.LOGINF(aPgEsec,aMessage,'','');
			insert into PARAMETRI_CNR (ESERCIZIO,CD_TIPO_RAPPORTO,IMPORTO_FRANCHIGIA_OCCA,
					      	   DACR,UTCR,DUVA,UTUV,PG_VER_REC,FL_VERSAMENTI_CORI,VERSAMENTI_CORI_GIORNO,CD_TIPO_RAPPORTO_PROF,
					      	   LIVELLO_PDG_DECIS_SPE,LIVELLO_PDG_DECIS_ETR,LIVELLO_CONTRATT_PDG_SPE,FL_REGOLAMENTO_2006,FL_DIARIA_MISS_ITALIA,
					      	   FL_VISTO_DIP_VARIAZIONI,IMPORTO_MIN_VISTO_DIP,FL_MOTIVAZIONE_SU_IMP,IMPORTO_MAX_IMP,
					      	   FL_DEDUZIONE_IRPEF,FL_DEDUZIONE_FAMILY,FL_DETRAZIONI_ALTRE,FL_DETRAZIONI_FAMILY,
						         FL_APPROVATO_DEFINITIVO,FL_SIOPE,RICERCA_PROF_INT_GIORNI_PUBBL,RICERCA_PROF_INT_GIORNI_SCAD,FL_INCARICO,
						         OGGETTO_EMAIL_TERZI_CONGUA,CORPO_EMAIL_TERZI_CONGUA,CORPO_EMAIL,OGGETTO_EMAIL,FL_OBB_INTRASTAT,FL_CUP, CLAUSOLA_ORDINE,DATA_STIPULA_CONTRATTI,LIVELLO_PDG_COFOG,
						         FL_SIOPE_CUP,FL_CREDITO_IRPEF,FL_NUOVO_PDG,DATA_ATTIVAZIONE_NEW_VOCE,FL_TESORERIA_UNICA,FL_PUBBLICA_CONTRATTO,LIVELLO_PAT,LIVELLO_ECO,
						         FL_PDG_CODLAST,FL_PDG_CONTRATTAZIONE,FL_PDG_QUADRA_FONTI_ESTERNE,FL_NUOVA_GESTIONE_PG)
			select aEs, CD_TIPO_RAPPORTO,IMPORTO_FRANCHIGIA_OCCA,
			       sysdate,cgUtente,sysdate,cgUtente,1,FL_VERSAMENTI_CORI,VERSAMENTI_CORI_GIORNO,CD_TIPO_RAPPORTO_PROF,
			       LIVELLO_PDG_DECIS_SPE,LIVELLO_PDG_DECIS_ETR,LIVELLO_CONTRATT_PDG_SPE,FL_REGOLAMENTO_2006,FL_DIARIA_MISS_ITALIA,
			       FL_VISTO_DIP_VARIAZIONI,IMPORTO_MIN_VISTO_DIP,FL_MOTIVAZIONE_SU_IMP,IMPORTO_MAX_IMP,
			       FL_DEDUZIONE_IRPEF,FL_DEDUZIONE_FAMILY,FL_DETRAZIONI_ALTRE,FL_DETRAZIONI_FAMILY,
			       'N',FL_SIOPE,RICERCA_PROF_INT_GIORNI_PUBBL,RICERCA_PROF_INT_GIORNI_SCAD,FL_INCARICO,
		         NULL,NULL,NULL,NULL,FL_OBB_INTRASTAT,FL_CUP,CLAUSOLA_ORDINE,DATA_STIPULA_CONTRATTI,LIVELLO_PDG_COFOG,FL_SIOPE_CUP,'N'--FL_CREDITO_IRPEF
		         ,FL_NUOVO_PDG,null,FL_TESORERIA_UNICA,FL_PUBBLICA_CONTRATTO,LIVELLO_PAT,LIVELLO_ECO,
		         FL_PDG_CODLAST,FL_PDG_CONTRATTAZIONE,FL_PDG_QUADRA_FONTI_ESTERNE,FL_NUOVA_GESTIONE_PG
			from PARAMETRI_CNR
			where ESERCIZIO = aEsPrec;
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Parametri CNR per l''esercizio base '||aEs||' già esistenti','','');
			stato_fine := 'W';
		end;
dbms_output.put_line('0002');

		-- Definizione esercizio contabile dell'ente
		begin
			 aMessage := 'Inserimento dell''esercizio contabile '||aEs||' per l''ente. Lock tabelle ESERCIZIO, NUMERAZIONE_DOC_CONT';
			ibmutl200.LOGINF(aPgEsec,aMessage,'','');
			insert into ESERCIZIO (CD_CDS
				   				  ,ESERCIZIO
								  ,DS_ESERCIZIO
								  ,ST_APERTURA_CHIUSURA
								  ,DACR
								  ,UTCR
								  ,DUVA
								  ,UTUV
								  ,PG_VER_REC
								  ,IM_CASSA_INIZIALE)
			values (cnrctb020.getCDCDSENTE(aEs)
				   ,aEs
				   ,'Esercizio contabile '|| aEs
				   ,'I'
				   ,sysdate
				   ,cgUtente
				   ,sysdate
				   ,cgUtente
				   ,1
				   ,0);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Esercizio contabile '||aEs||' per l''ente già esistente','','');
			stato_fine := 'W';
		end;

		-- Aggiornamento numeratori doc cont
		CNRCTB018.AGGIORNANUMERATORI(aEs,cnrctb020.getCDCDSENTE(aEs), cgUtente);


		-- Ribaltamento LUNGHEZZA_CHIAVI
		/*lock table lunghezza_chiavi in exclusive mode nowait;
		aMessage := 'Ribaltamento lunghezze chiavi. Lock tabella LUNGHEZZA_CHIAVI';
		ibmutl200.LOGINF(aPgEsec,aMessage,'','');
		declare
			 lEs esercizio%rowtype;
		begin
			 select * into lEs
			 from esercizio
			 where cd_cds = cnrctb020.getCDCDSENTE(aEs)
			   and esercizio = aEs;
			 CNRCTB015.coie_LUNGHEZZA_CHIAVI (lEs);
		exception when dup_val_on_index then
				  null;
		end;*/

-- NOTA BENE: STANI
-- prima del 14 ottobre 2009 era qui il ribaltamento della CONFIGURAZIONE_CNR - SPOSTATA PIU' IN BASSO DOPO LA CLASSIFICAZIONE_VOCI

    -- Ribaltamento TIPO_VARIAZIONE sull'esercizio contabile destinazione
		-- a partire dall'esercizio precedente
		begin
			aMessage := 'Inserimento di TIPO_VARIAZIONE per l''esercizio base '||aEs||'. Lock tabella TIPO_VARIAZIONE';
			ibmutl200.LOGINF(aPgEsec,aMessage,'','');
			insert into TIPO_VARIAZIONE (ESERCIZIO,CD_TIPO_VARIAZIONE,DS_TIPO_VARIAZIONE,TI_TIPO_VARIAZIONE,
						     FL_UTILIZZABILE_ENTE,FL_UTILIZZABILE_AREA,FL_UTILIZZABILE_CDS,
  						     TI_APPROVAZIONE,DACR,UTCR,DUVA,UTUV,PG_VER_REC,
  						     FL_VISTO_DIP_SALDO_MODULO,FL_VISTO_DIP_CLASSIFICAZIONE,FL_VARIAZIONE_TRASFERIMENTO)
			select aEs,CD_TIPO_VARIAZIONE,DS_TIPO_VARIAZIONE,TI_TIPO_VARIAZIONE,
			       FL_UTILIZZABILE_ENTE,FL_UTILIZZABILE_AREA,FL_UTILIZZABILE_CDS,
  			       TI_APPROVAZIONE,sysdate,cgUtente,sysdate,cgUtente,1,
  			       FL_VISTO_DIP_SALDO_MODULO,FL_VISTO_DIP_CLASSIFICAZIONE,FL_VARIAZIONE_TRASFERIMENTO
			from TIPO_VARIAZIONE
			where ESERCIZIO = aEsPrec;
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'TIPO_VARIAZIONE per l''esercizio base '||aEs||' già esistente','','');
			stato_fine := 'W';
		end;
dbms_output.put_line('0003');

		-- Ribaltamento dell'anagrafica dei capitoli
		ribaltaEV(aEs, aEsPrec, aPgEsec, stato_fine, aMessage);
dbms_output.put_line('0004');

		-- Ribaltamento CONFIGURAZIONE_CNR sull'esercizio contabile destinazione
		-- a partire dall'esercizio precedente
		aMessage := 'Ribaltamento configurazione CNR sull''esercizio '||aEs||'. Lock tabella CONFIGURAZIONE_CNR';
		ibmutl200.LOGINF(aPgEsec,aMessage,'','');
		for aConfCNR in (select * from CONFIGURAZIONE_CNR
					 	 where esercizio = aEsPrec) Loop

                        If aConfCNR.cd_chiave_primaria = 'PIANO_RIPARTO' Then

                           Begin
                             Select new_cla.id_classificazione
                             Into   new_val01
                             From   classificazione_voci old_cla, classificazione_voci New_cla
                             Where  old_cla.id_classificazione = aConfCNR.val01 And
                                    old_cla.esercizio = aEsPrec And
                                    new_cla.esercizio = aEs And
                                    old_cla.TI_GESTIONE           =  new_cla.TI_GESTIONE And
                                    old_cla.CD_LIVELLO1           =  new_cla.CD_LIVELLO1 And
                                    Nvl(old_cla.CD_LIVELLO2, 'A') =  Nvl(new_cla.CD_LIVELLO2, 'A') And
                                    Nvl(old_cla.CD_LIVELLO3, 'A') =  Nvl(new_cla.CD_LIVELLO3, 'A') And
                                    Nvl(old_cla.CD_LIVELLO4, 'A') =  Nvl(new_cla.CD_LIVELLO4, 'A') And
                                    Nvl(old_cla.CD_LIVELLO5, 'A') =  Nvl(new_cla.CD_LIVELLO5, 'A') And
                                    Nvl(old_cla.CD_LIVELLO6, 'A') =  Nvl(new_cla.CD_LIVELLO6, 'A') And
                                    Nvl(old_cla.CD_LIVELLO7, 'A') =  Nvl(new_cla.CD_LIVELLO7, 'A');
                           Exception
                             When Others Then
                                   new_val01 := Null;
                           End;

                        Else
                           new_val01 := aConfCNR.VAL01;
                        End If;

			begin
				insert into CONFIGURAZIONE_CNR (ESERCIZIO,
								CD_UNITA_FUNZIONALE,
								CD_CHIAVE_PRIMARIA,
								CD_CHIAVE_SECONDARIA,
								VAL01,
								VAL02,
								VAL03,
								VAL04,
								IM01,
								IM02,
								DT01,
								DT02,
								DACR,
								UTCR,
								DUVA,
								UTUV,
								PG_VER_REC)
				values (aEs,
					aConfCNR.CD_UNITA_FUNZIONALE,
					aConfCNR.CD_CHIAVE_PRIMARIA,
					aConfCNR.CD_CHIAVE_SECONDARIA,
					new_val01,
					aConfCNR.VAL02,
					aConfCNR.VAL03,
					aConfCNR.VAL04,
					aConfCNR.IM01,
					aConfCNR.IM02,
					aConfCNR.DT01,
					aConfCNR.DT02,
					sysdate,
					cgUtente,
					sysdate,
					cgUtente,
					1);
			exception when DUP_VAL_ON_INDEX then
				ibmutl200.LOGWAR(aPgEsec,'CONFIGURAZIONE_CNR con PK('||aEs||', '
					         ||aConfCNR.CD_UNITA_FUNZIONALE||', '
						 ||aConfCNR.CD_CHIAVE_PRIMARIA||', '
						 ||aConfCNR.CD_CHIAVE_SECONDARIA||') già esistente','','');
				stato_fine := 'W';
			end;
		end loop;
dbms_output.put_line('0005');


		-- Ribaltamento della struttura organizzativa
		ribaltaStruttOrg(aEs, aEsPrec, aPgEsec, stato_fine, aMessage);
dbms_output.put_line('0006');

    -- Ribaltamento limiti di spesa
    ribaltaLimitiSpesa(aEs, aEsPrec, aPgEsec, stato_fine, aMessage);
/*  spostato in ribaltamento_altro  rospuc
		-- Ribaltamento del piano dei conti E/P
		ribaltaEP(aEs, aEsPrec, aPgEsec, stato_fine, aMessage);

		-- Ribaltamento configurazione CORI per PDGP
		ribaltaCORI_pdgp(aEs, aEsPrec, aPgEsec, stato_fine, aMessage);
*/
		-- Update del log sul processo

		endLogRibaltamentoPerPDGP(aEs, aPgEsec, stato_fine, aMessage );
dbms_output.put_line('0007');

	exception when OTHERS then
	    rollback;
		aMessage := 'Errore non gestito: '||DBMS_UTILITY.FORMAT_ERROR_STACK;
		ibmutl200.LOGERR(aPgEsec,aMessage,'','');
	end;

end;

procedure init_ribaltamento_pdgp(aEs number, aMessage in out varchar2) is
    aPgEsec  number;
begin
    aPgEsec := IBMUTL200.LOGSTART(TI_LOG_RIBALTAMENTO_PDGP,dsProcesso_pdgp,null,cgUtente,null,null);
    init_ribaltamento_pdgp(aEs, aPgEsec, aMessage);
end;
----------------------------------------------------------------------------
Procedure ribaltaEV(aEsDest number, aEsOrig number, aPgEsec number, aStato in out char, aMessage in out varchar2) is
begin
	-- Ribaltamento Classificazioni Entrate
	aMessage := 'Ribaltamento Classificazioni Entrate sull''esercizio '||aEsDest||'. Lock tabella CLASSIFICAZIONE_ENTRATE';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	for aClassE in (select * from CLASSIFICAZIONE_ENTRATE
			where esercizio = aEsOrig
			order by esercizio, codice_cla_e) loop
		begin
			insert into CLASSIFICAZIONE_ENTRATE (ESERCIZIO,
							     CODICE_CLA_E,
							     DESCRIZIONE,
							     FL_MASTRINO,
							     ESERCIZIO_PADRE,
							     CODICE_CLA_E_PADRE,
							     DACR,
							     UTCR,
							     DUVA,
							     UTUV,
							     PG_VER_REC)
			values (aEsDest,
				aClassE.CODICE_CLA_E,
				aClassE.DESCRIZIONE,
				aClassE.FL_MASTRINO,
				DECODE(aClassE.CODICE_CLA_E_PADRE, NULL, NULL,aEsDest),
				aClassE.CODICE_CLA_E_PADRE,
				sysdate,
				cgUtente,
				sysdate,
				cgutente,
				1);
		exception
		   when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'CLASSIFICAZIONE_ENTRATE con PK ('||aEsDest||', '||aClassE.CODICE_CLA_E||') già esistente','','');
			aStato := 'W';
		   when OTHERS then
			ibmutl200.LOGWAR(aPgEsec,'SK_CLASSIFICAZIONE_ENTRATE violata per la classificazione ('||aEsDest||', '||aClassE.CODICE_CLA_E||')','','');
			aStato := 'W';
		end;
	end loop;
	-- Ribaltamento Classificazioni Spese
	aMessage := 'Ribaltamento Classificazioni Spese sull''esercizio '||aEsDest||'. Lock tabella CLASSIFICAZIONE_SPESE';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	for aClassS in (select * from CLASSIFICAZIONE_SPESE
			where esercizio = aEsOrig
			order by esercizio, codice_cla_s) loop
		begin
			insert into CLASSIFICAZIONE_SPESE (ESERCIZIO,
							     CODICE_CLA_S,
							     DESCRIZIONE,
							     FL_MASTRINO,
							     ESERCIZIO_PADRE,
							     CODICE_CLA_S_PADRE,
							     DACR,
							     UTCR,
							     DUVA,
							     UTUV,
							     PG_VER_REC)
			values (aEsDest,
				aClassS.CODICE_CLA_S,
				aClassS.DESCRIZIONE,
				aClassS.FL_MASTRINO,
				DECODE(aClassS.CODICE_CLA_S_PADRE, NULL, NULL,aEsDest),
				aClassS.CODICE_CLA_S_PADRE,
				sysdate,
				cgUtente,
				sysdate,
				cgutente,
				1);
		exception
		   when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'CLASSIFICAZIONE_SPESE con PK ('||aEsDest||', '||aClassS.CODICE_CLA_S||') già esistente','','');
			aStato := 'W';
		   when OTHERS then
			ibmutl200.LOGWAR(aPgEsec,'SK_CLASSIFICAZIONE_SPESE violata per la classificazione ('||aEsDest||', '||aClassS.CODICE_CLA_S||')','','');
			aStato := 'W';
		end;
	end loop;

	-- Ribaltamento Parametri Livelli
        Begin
	   aMessage := 'Ribaltamento Parametri Livelli sull''esercizio '||aEsDest||'. Lock tabella PARAMETRI_LIVELLI';
	   ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	   insert into PARAMETRI_LIVELLI (ESERCIZIO,LIVELLI_ENTRATA,
	   				  LUNG_LIVELLO1E,DS_LIVELLO1E,
	   				  LUNG_LIVELLO2E,DS_LIVELLO2E,
	   				  LUNG_LIVELLO3E,DS_LIVELLO3E,
	   				  LUNG_LIVELLO4E,DS_LIVELLO4E,
	   				  LUNG_LIVELLO5E,DS_LIVELLO5E,
	   				  LUNG_LIVELLO6E,DS_LIVELLO6E,
	   				  LUNG_LIVELLO7E,DS_LIVELLO7E,
	   				  LIVELLI_SPESA,
	   				  LUNG_LIVELLO1S,DS_LIVELLO1S,
	   				  LUNG_LIVELLO2S,DS_LIVELLO2S,
	   				  LUNG_LIVELLO3S,DS_LIVELLO3S,
	   				  LUNG_LIVELLO4S,DS_LIVELLO4S,
	   				  LUNG_LIVELLO5S,DS_LIVELLO5S,
	   				  LUNG_LIVELLO6S,DS_LIVELLO6S,
	   				  LUNG_LIVELLO7S,DS_LIVELLO7S,
				      	  DACR,UTCR,DUVA,UTUV,PG_VER_REC)
		select aEsDest, LIVELLI_ENTRATA,
	   	  LUNG_LIVELLO1E,DS_LIVELLO1E,
	   	  LUNG_LIVELLO2E,DS_LIVELLO2E,
	   	  LUNG_LIVELLO3E,DS_LIVELLO3E,
	   	  LUNG_LIVELLO4E,DS_LIVELLO4E,
	   	  LUNG_LIVELLO5E,DS_LIVELLO5E,
	   	  LUNG_LIVELLO6E,DS_LIVELLO6E,
	   	  LUNG_LIVELLO7E,DS_LIVELLO7E,
	   	  LIVELLI_SPESA,
	   	  LUNG_LIVELLO1S,DS_LIVELLO1S,
	   	  LUNG_LIVELLO2S,DS_LIVELLO2S,
	   	  LUNG_LIVELLO3S,DS_LIVELLO3S,
	   	  LUNG_LIVELLO4S,DS_LIVELLO4S,
	   	  LUNG_LIVELLO5S,DS_LIVELLO5S,
	   	  LUNG_LIVELLO6S,DS_LIVELLO6S,
	   	  LUNG_LIVELLO7S,DS_LIVELLO7S,
		  Sysdate,cgUtente,sysdate,cgUtente,1
		from PARAMETRI_LIVELLI
		where ESERCIZIO = aEsOrig;
	Exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Parametri Livelli per l''esercizio base '||aEsDest||' già esistenti','','');
			aStato := 'W';
	End;

	-- Ribaltamento elemento voce
	aMessage := 'Ribaltamento dell''anagrafica dei capitoli sull''esercizio '||aEsDest||'. Lock tabelle ELEMENTO_VOCE, VOCE_F, VOCE_F_SALDI_CMP';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	for aElVoce in (select * from ELEMENTO_VOCE
				    where esercizio = aEsOrig
					order by ti_appartenenza, ti_gestione, cd_elemento_voce) loop -- ordine per RX_ELEMENTO_VOCE00
		begin
			insert into ELEMENTO_VOCE  (ESERCIZIO,
						    TI_APPARTENENZA,
						    TI_GESTIONE,
						    CD_ELEMENTO_VOCE,
						    CD_PROPRIO_ELEMENTO,
						    TI_ELEMENTO_VOCE,
						    FL_LIMITE_ASS_OBBLIG,
						    FL_VOCE_PERSONALE,
						    CD_PARTE,
						    DS_ELEMENTO_VOCE,
						    DACR,
						    UTUV,
						    UTCR,
						    DUVA,
						    PG_VER_REC,
						    CD_ELEMENTO_PADRE,
						    FL_PARTITA_GIRO,
						    CD_CAPOCONTO_FIN,
						    FL_VOCE_SAC,
						    FL_VOCE_NON_SOGG_IMP_AUT,
						    ESERCIZIO_CLA_E,
  						    COD_CLA_E,
  						    ESERCIZIO_CLA_S,
  						    COD_CLA_S,
  						    FL_RECON,
  						    FL_INV_BENI_PATR,
  						    ID_CLASSIFICAZIONE,
  						    CD_TIPO_SPESA_SAC,
  						    CD_TIPO_SPESA_IST,
  						    FL_VOCE_FONDO,
  						    FL_CHECK_TERZO_SIOPE,
  						    FL_INV_BENI_COMP,
  						    FL_LIMITE_SPESA,
  						    FL_PRELIEVO,
  						    FL_SOGGETTO_PRELIEVO,
  						    PERC_PRELIEVO_PDGP_ENTRATE,
  						    FL_SOLO_RESIDUO,
  						    FL_SOLO_COMPETENZA,
  						    FL_TROVATO,
  						    FL_AZZERA_RESIDUI,
  						    ESERCIZIO_ELEMENTO_PADRE,
  						    TI_APPARTENENZA_ELEMENTO_PADRE,
  						    TI_GESTIONE_ELEMENTO_PADRE,
  						    FL_MISSIONI,
  						    CD_UNITA_PIANO,
  						    CD_VOCE_PIANO,
  						    GG_DEROGA_OBBL_COMP_PRG_SCAD,
  						    GG_DEROGA_OBBL_RES_PRG_SCAD,
                            FL_COMUNICA_PAGAMENTI,
                            FL_LIMITE_COMPETENZA,
                            BLOCCO_IMPEGNI_NATFIN)
			values (aEsDest,
				aElVoce.TI_APPARTENENZA,
				aElVoce.TI_GESTIONE,
				aElVoce.CD_ELEMENTO_VOCE,
				aElVoce.CD_PROPRIO_ELEMENTO,
				aElVoce.TI_ELEMENTO_VOCE,
				aElVoce.FL_LIMITE_ASS_OBBLIG,
				aElVoce.FL_VOCE_PERSONALE,
				aElVoce.CD_PARTE,
				aElVoce.DS_ELEMENTO_VOCE,
				sysdate,
				cgUtente,
				cgUtente,
				sysdate,
				1,
				aElVoce.CD_ELEMENTO_PADRE,
				aElVoce.FL_PARTITA_GIRO,
				aElVoce.CD_CAPOCONTO_FIN,
				aElVoce.FL_VOCE_SAC,
				aElVoce.FL_VOCE_NON_SOGG_IMP_AUT,
				Decode(aElVoce.COD_CLA_E,Null,Null,aEsDest),
  				aElVoce.COD_CLA_E,
  				Decode(aElVoce.COD_CLA_S,Null,Null,aEsDest),
  				aElVoce.COD_CLA_S,
  				aElVoce.FL_RECON,
  				aElVoce.FL_INV_BENI_PATR,
  				null,
  				aElVoce.CD_TIPO_SPESA_SAC,
  				aElVoce.CD_TIPO_SPESA_IST,
  				aElVoce.FL_VOCE_FONDO,
  				aElVoce.FL_CHECK_TERZO_SIOPE,
  				aElVoce.FL_INV_BENI_COMP,
  				aElVoce.FL_LIMITE_SPESA,
  				aElVoce.FL_PRELIEVO,
  				aElVoce.FL_SOGGETTO_PRELIEVO,
  				aElVoce.PERC_PRELIEVO_PDGP_ENTRATE,
  				aElVoce.FL_SOLO_RESIDUO,
  				aElVoce.FL_SOLO_COMPETENZA,
  				aElVoce.FL_TROVATO,
  				aElVoce.FL_AZZERA_RESIDUI,
  				aElVoce.ESERCIZIO_ELEMENTO_PADRE,
  				aElVoce.TI_APPARTENENZA_ELEMENTO_PADRE,
  				aElVoce.TI_GESTIONE_ELEMENTO_PADRE,
  				aElVoce.FL_MISSIONI,
  				aElVoce.CD_UNITA_PIANO,
  				aElVoce.CD_VOCE_PIANO,
  				aElVoce.GG_DEROGA_OBBL_COMP_PRG_SCAD,
  				aElVoce.GG_DEROGA_OBBL_RES_PRG_SCAD,
                aElVoce.FL_COMUNICA_PAGAMENTI,
                aElVoce.FL_LIMITE_COMPETENZA,
                aElVoce.BLOCCO_IMPEGNI_NATFIN
  				);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'ELEMENTO_VOCE con PK('||aEsDest||', '
					||aElVoce.TI_APPARTENENZA||', '
					||aElVoce.TI_GESTIONE||', '
					||aElVoce.CD_ELEMENTO_VOCE||') già esistente','','');
			aStato := 'W';
		end;
	end loop;
	-- all'inserimento di record in ELEMENTO_VOCE viene attivato un trigger
	-- che esplode l'anagrafica dei capitoli sul piano dei conti finanziario
	-- in VOCE_F

	-- Ribaltamento delle associazioni elementi voce, funzioni e tipologia di cds
	aMessage := 'Ribaltamento delle associazioni elementi voce, funzioni e tipologia di cds sull''esercizio '||aEsDest||'. Lock tabella ASS_EV_FUNZ_TIPOCDS';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	for aAssEVF in (select * from ASS_EV_FUNZ_TIPOCDS
			 	 where esercizio = aEsOrig) loop
		begin
			insert into ASS_EV_FUNZ_TIPOCDS (ESERCIZIO,
							 CD_FUNZIONE,
							 CD_TIPO_UNITA,
							 CD_CONTO,
							 UTUV,
							 DACR,
							 UTCR,
							 DUVA,
							 PG_VER_REC)
			values (aEsDest,
				aAssEVF.CD_FUNZIONE,
				aAssEVF.CD_TIPO_UNITA,
				aAssEVF.CD_CONTO,
				cgUtente,
				sysdate,
				cgUtente,
				sysdate,
				1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'ASS_EV_FUNZ_TIPOCDS con PK('||aEsDest||', '
		   			  ||aAssEVF.CD_FUNZIONE||', '
					  ||aAssEVF.CD_TIPO_UNITA||', '
					  ||aAssEVF.CD_CONTO||') già esistente','','');
			aStato := 'W';
		end;
	end loop;
	-- all'inserimento di record in ASS_EV_FUNZ_TIPOCDS viene attivato un trigger
	-- che esplode l'anagrafica dei capitoli sul piano dei conti finanziario
	-- in VOCE_F

	-- Ribaltamento delle associazioni fra elementi voce
	aMessage := 'Ribaltamento delle associazioni fra elementi voce sull''esercizio '||aEsDest||'. Lock tabella ASS_EV_EV';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	for aAssEVEV in (select * from ASS_EV_EV
			 	 where esercizio = aEsOrig) loop
		begin
			insert into ASS_EV_EV  (ESERCIZIO,
						TI_APPARTENENZA,
						TI_GESTIONE,
						CD_ELEMENTO_VOCE,
						CD_ELEMENTO_VOCE_COLL,
						TI_APPARTENENZA_COLL,
						TI_GESTIONE_COLL,
						CD_CDS,
						CD_NATURA,
						TI_ELEMENTO_VOCE,
						TI_ELEMENTO_VOCE_COLL,
						UTUV,
						DACR,
						UTCR,
						DUVA,
						PG_VER_REC)
			values (aEsDest,
				aAssEVEV.TI_APPARTENENZA,
				aAssEVEV.TI_GESTIONE,
				aAssEVEV.CD_ELEMENTO_VOCE,
				aAssEVEV.CD_ELEMENTO_VOCE_COLL,
				aAssEVEV.TI_APPARTENENZA_COLL,
				aAssEVEV.TI_GESTIONE_COLL,
				aAssEVEV.CD_CDS,
				aAssEVEV.CD_NATURA,
				aAssEVEV.TI_ELEMENTO_VOCE,
				aAssEVEV.TI_ELEMENTO_VOCE_COLL,
				cgUtente,
				sysdate,
				cgUtente,
				sysdate,
				1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'ASS_EV_EV con PK('||aEsDest||', '
					||aAssEVEV.TI_APPARTENENZA||', '
					||aAssEVEV.TI_GESTIONE||', '
					||aAssEVEV.CD_ELEMENTO_VOCE||', '
					||aAssEVEV.CD_ELEMENTO_VOCE_COLL||', '
					||aAssEVEV.TI_APPARTENENZA_COLL||', '
					||aAssEVEV.TI_GESTIONE_COLL||', '
					||aAssEVEV.CD_CDS||', '
					||aAssEVEV.CD_NATURA||') già esistente','','');
			aStato := 'W';
		end;
	end loop;
/* spostato in ribaltamento_altro rospuc
	-- Ribaltamento associazioni tra categorie e voci del piano dei conti
	lock table categoria_gruppo_voce in exclusive mode nowait;
	aMessage := 'Ribaltamento associazioni tra categorie e voci del piano dei conti sull''esercizio '||aEsDest||'. Lock tabella CATEGORIA_GRUPPO_VOCE';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	for aCatGV in (select * from CATEGORIA_GRUPPO_VOCE
			   	   where esercizio = aEsOrig) loop
		begin
			insert into CATEGORIA_GRUPPO_VOCE  (CD_CATEGORIA_GRUPPO,
							    ESERCIZIO,
							    TI_APPARTENENZA,
							    TI_GESTIONE,
							    DACR,
							    UTCR,
							    DUVA,
							    UTUV,
							    PG_VER_REC,
							    CD_ELEMENTO_VOCE)
			values (aCatGV.CD_CATEGORIA_GRUPPO,
				aEsDest,
				aCatGV.TI_APPARTENENZA,
				aCatGV.TI_GESTIONE,
				sysdate,
				cgUtente,
				sysdate,
				cgutente,
				1,
				aCatGV.CD_ELEMENTO_VOCE);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'CATEGORIA_GRUPPO_VOCE con PK ('||aCatGV.CD_CATEGORIA_GRUPPO||', '
					 ||aEsDest||', '
					 ||aCatGV.TI_APPARTENENZA||', '
					 ||aCatGV.TI_GESTIONE||', '
					 ||aCatGV.CD_ELEMENTO_VOCE||') già esistente','','');
			aStato := 'W';
		end;
	end loop;
*/ -- fine spostamento in ribaltamento_altro rospuc
	-- Ribaltamento classificazione voci
	declare
	   new_id NUMBER;
	   new_id_padre NUMBER:=Null;
	begin
	lock table classificazione_voci in exclusive mode nowait;
	aMessage := 'Ribaltamento Classificazione Voci sull''esercizio '||aEsDest||'. Lock tabella CLASSIFICAZIONE_VOCI';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');

	Select Max(id_classificazione)
	Into new_id
	From CLASSIFICAZIONE_VOCI;

	  for aClassV in (select * from CLASSIFICAZIONE_VOCI
			where esercizio = aEsOrig
			order by esercizio, ti_gestione, cd_livello1 Desc, cd_livello2 Desc ,cd_livello3 Desc ,
			cd_livello4 Desc, cd_livello5 Desc, cd_livello6 Desc, cd_livello7 Desc)
	  loop
		begin
			new_id := new_id + 1;
			insert into CLASSIFICAZIONE_VOCI (ID_CLASSIFICAZIONE,
							  ESERCIZIO,
							  TI_GESTIONE,
							  DS_CLASSIFICAZIONE,
							  CD_LIVELLO1,
							  CD_LIVELLO2,
							  CD_LIVELLO3,
							  CD_LIVELLO4,
							  CD_LIVELLO5,
							  CD_LIVELLO6,
							  CD_LIVELLO7,
							  ID_CLASS_PADRE,
							  FL_MASTRINO,
							  DUVA,
							  UTUV,
							  DACR,
							  UTCR,
							  PG_VER_REC,
							  FL_CLASS_SAC,
							  FL_SOLO_GESTIONE,
							  FL_ACCENTRATO,
							  FL_DECENTRATO,
							  CDR_ACCENTRATORE,
							  FL_PIANO_RIPARTO,
						  	  FL_ESTERNA_DA_QUADRARE_SAC,
						  	  FL_VISTO_DIP_VARIAZIONI,
						  	  TI_CLASSIFICAZIONE,
						  	  FL_PREV_OBB_ANNO_SUC,
						  	  IM_LIMITE_ASSESTATO)
			values (new_id,
				aEsDest,
				aClassV.TI_GESTIONE,
				aClassV.DS_CLASSIFICAZIONE,
				aClassV.CD_LIVELLO1,
				aClassV.CD_LIVELLO2,
				aClassV.CD_LIVELLO3,
				aClassV.CD_LIVELLO4,
				aClassV.CD_LIVELLO5,
				aClassV.CD_LIVELLO6,
				aClassV.CD_LIVELLO7,
				null,
				aClassV.FL_MASTRINO,
				sysdate,
				cgUtente,
				sysdate,
				cgutente,
				1,
				aClassV.FL_CLASS_SAC,
				aClassV.FL_SOLO_GESTIONE,
				aClassV.FL_ACCENTRATO,
				aClassV.FL_DECENTRATO,
				aClassV.CDR_ACCENTRATORE,
				aClassV.FL_PIANO_RIPARTO,
				aClassV.FL_ESTERNA_DA_QUADRARE_SAC,
				aClassV.FL_VISTO_DIP_VARIAZIONI,
				aclassV.TI_CLASSIFICAZIONE,
				aclassV.FL_PREV_OBB_ANNO_SUC,
				aclassV.IM_LIMITE_ASSESTATO);

			--Aggiorno l'elemento voce con la nuova classificazione creata
			update elemento_voce v
			set v.id_classificazione =  new_id
			where v.esercizio = aEsDest
			and (v.ti_appartenenza, v.ti_gestione, v.cd_elemento_voce) In
			     (Select a.ti_appartenenza, a.ti_gestione, a.cd_elemento_voce
			     From elemento_voce a
			     Where a.esercizio = aEsOrig
			       And a.id_classificazione = aClassV.id_classificazione);
		exception
		   when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'CLASSIFICAZIONE_VOCI con PK ('||new_id||') già esistente','','');
			aStato := 'W';
		   when OTHERS then
			ibmutl200.LOGWAR(aPgEsec,'SK_CLASSIFICAZIONE_VOCI violata per la classificazione ('||new_id||')','','');
			aStato := 'W';
		end;
	  end loop;
	end;

	-- Aggiornamento id_class_padre nel nuovo anno
	Declare
    	    rec_class 	CLASSIFICAZIONE_VOCI%Rowtype;
    	    new_padre   NUMBER;
	Begin
	   for aClassPadre in (select * from CLASSIFICAZIONE_VOCI
		    where esercizio = aEsOrig
		    And id_class_padre Is Not Null)
  	   loop
  		select *
		into rec_class
		From CLASSIFICAZIONE_VOCI
		where esercizio = aEsOrig
		and ti_gestione = aClassPadre.ti_gestione
		and id_classificazione = aClassPadre.id_class_padre;

		select id_classificazione
		into new_padre
		from CLASSIFICAZIONE_VOCI
		where esercizio = aEsDest
		and ti_gestione = rec_class.ti_gestione
		and cd_livello1 = rec_class.cd_livello1
		and ((rec_class.cd_livello2 Is Not Null And cd_livello2 = rec_class.cd_livello2)
	      	      Or
	      	     (rec_class.cd_livello2 Is Null And cd_livello2 Is Null))
		and ((rec_class.cd_livello3 Is Not Null And cd_livello3 = rec_class.cd_livello3)
	              Or
	             (rec_class.cd_livello3 Is Null And cd_livello3 Is Null))
		and ((rec_class.cd_livello4 Is Not Null And cd_livello4 = rec_class.cd_livello4)
	              Or
	             (rec_class.cd_livello4 Is Null And cd_livello4 Is Null))
		and ((rec_class.cd_livello5 Is Not Null And cd_livello5 = rec_class.cd_livello5)
	              Or
	             (rec_class.cd_livello5 Is Null And cd_livello5 Is Null))
		and ((rec_class.cd_livello6 Is Not Null And cd_livello6 = rec_class.cd_livello6)
	              Or
	             (rec_class.cd_livello6 Is Null And cd_livello6 Is Null))
		and ((rec_class.cd_livello7 Is Not Null And cd_livello7 = rec_class.cd_livello7)
	              Or
	             (rec_class.cd_livello7 Is Null And cd_livello7 Is Null));

		update CLASSIFICAZIONE_VOCI
		set id_class_padre = new_padre
		where esercizio = aEsDest
		and ti_gestione = aClassPadre.ti_gestione
		and cd_livello1 = aClassPadre.cd_livello1
		and ((aClassPadre.cd_livello2 Is Not Null And cd_livello2 = aClassPadre.cd_livello2)
	             Or
	             (aClassPadre.cd_livello2 Is Null And cd_livello2 Is Null))
		and ((aClassPadre.cd_livello3 Is Not Null And cd_livello3 = aClassPadre.cd_livello3)
	             Or
	             (aClassPadre.cd_livello3 Is Null And cd_livello3 Is Null))
		and ((aClassPadre.cd_livello4 Is Not Null And cd_livello4 = aClassPadre.cd_livello4)
	             Or
	             (aClassPadre.cd_livello4 Is Null And cd_livello4 Is Null))
		and ((aClassPadre.cd_livello5 Is Not Null And cd_livello5 = aClassPadre.cd_livello5)
	             Or
	             (aClassPadre.cd_livello5 Is Null And cd_livello5 Is Null))
		and ((aClassPadre.cd_livello6 Is Not Null And cd_livello6 = aClassPadre.cd_livello6)
	             Or
	             (aClassPadre.cd_livello6 Is Null And cd_livello6 Is Null))
		and ((aClassPadre.cd_livello7 Is Not Null And cd_livello7 = aClassPadre.cd_livello7)
	             Or
	             (aClassPadre.cd_livello7 Is Null And cd_livello7 Is Null));
   	End Loop;
	End;

/* spostato in ribaltamento_altro rospuc
	-- Ribaltamento per la Gestione SIOPE
	-- Ribaltamento dei codici siope
	lock table CODICI_SIOPE in exclusive mode nowait;
	aMessage := 'Ribaltamento Codici SIOPE sull''esercizio '||aEsDest||'. Lock tabella CODICI_SIOPE';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	For aCodSiope in (select * from CODICI_SIOPE
			  where esercizio = aEsOrig)
	Loop
		Begin
			insert into CODICI_SIOPE  (ESERCIZIO,
  						   TI_GESTIONE,
  						   CD_SIOPE,
  						   DESCRIZIONE,
  						   UTCR,
  						   DACR,
  						   UTUV,
  						   DUVA,
  						   PG_VER_REC)
			values (aEsDest,
  				aCodSiope.TI_GESTIONE,
  				aCodSiope.CD_SIOPE,
  				aCodSiope.DESCRIZIONE,
				cgUtente,
				sysdate,
				cgUtente,
				sysdate,
				1);
		Exception when dup_val_on_index then
			ibmutl200.logwar(aPgEsec,'Codice SIOPE con PK('||aEsDest||', '
							     	       ||aCodSiope.TI_GESTIONE||', '
								       ||aCodSiope.CD_SIOPE||') già inserito','','');
			aStato := 'W';
		End;
	End Loop;

	-- Ribaltamento delle associazioni fra tipologie istat e codici siope
	lock table ASS_TIPOLOGIA_ISTAT_SIOPE in exclusive mode nowait;
	aMessage := 'Ribaltamento Associazione Tipologia ISTAT - Codici SIOPE sull''esercizio '||aEsDest||'. Lock tabella ASS_TIPOLOGIA_ISTAT_SIOPE';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	For aAssIstatSiope in (select * from ASS_TIPOLOGIA_ISTAT_SIOPE
			       where esercizio_siope = aEsOrig)
	Loop
		Begin
			insert into ASS_TIPOLOGIA_ISTAT_SIOPE  (PG_TIPOLOGIA,
								ESERCIZIO_SIOPE,
  						   		TI_GESTIONE_SIOPE,
  						   		CD_SIOPE,
  						   		UTCR,
  						   		DACR,
  						   		UTUV,
  						   		DUVA,
  						   		PG_VER_REC)
			values (aAssIstatSiope.PG_TIPOLOGIA,
				aEsDest,
  				aAssIstatSiope.TI_GESTIONE_SIOPE,
  				aAssIstatSiope.CD_SIOPE,
				cgUtente,
				sysdate,
				cgUtente,
				sysdate,
				1);
		Exception when dup_val_on_index then
			ibmutl200.logwar(aPgEsec,'Associazione Tipologia ISTAT - Codici SIOPE con PK('||aAssIstatSiope.PG_TIPOLOGIA||', '
							     	       				      ||aEsDest||', '
							     	                                      ||aAssIstatSiope.TI_GESTIONE_SIOPE||', '
								                                      ||aAssIstatSiope.CD_SIOPE||') già inserita','','');
			aStato := 'W';
		End;
	End Loop;

	-- Ribaltamento delle associazioni fra elementi voce e codici siope
	lock table ass_ev_siope in exclusive mode nowait;
	aMessage := 'Ribaltamento delle associazioni fra elementi voce e codici siope sull''esercizio '||aEsDest||'. Lock tabella ASS_EV_SIOPE';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	For aAssEVSiope in (select * from ASS_EV_SIOPE
			    where esercizio = aEsOrig) loop
		Begin
			insert into ASS_EV_SIOPE  (ESERCIZIO,
						   TI_APPARTENENZA,
						   TI_GESTIONE,
						   CD_ELEMENTO_VOCE,
						   ESERCIZIO_SIOPE,
						   TI_GESTIONE_SIOPE,
						   CD_SIOPE,
						   UTCR,
						   DACR,
						   UTUV,
						   DUVA,
						   PG_VER_REC)
			values (aEsDest,
				aAssEVSiope.TI_APPARTENENZA,
				aAssEVSiope.TI_GESTIONE,
				aAssEVSiope.CD_ELEMENTO_VOCE,
				aEsDest,
				aAssEVSiope.TI_GESTIONE_SIOPE,
				aAssEVSiope.CD_SIOPE,
				cgUtente,
				sysdate,
				cgUtente,
				sysdate,
				1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'ASS_EV_SIOPE con PK('||aEsDest||', '
					||aAssEVSiope.TI_APPARTENENZA||', '
					||aAssEVSiope.TI_GESTIONE||', '
					||aAssEVSiope.CD_ELEMENTO_VOCE||', '
					||aEsDest||', '
					||aAssEVSiope.TI_GESTIONE_SIOPE||', '
					||aAssEVSiope.CD_SIOPE||') già esistente','','');
			aStato := 'W';
		end;
	end loop;

	-- Ribaltamento delle associazioni fra contributi/ritenute e codici siope
	lock table ASS_TIPO_CONTR_RITENUTA_SIOPE in exclusive mode nowait;
	aMessage := 'Ribaltamento Associazione Contributi/ritenute - Codici SIOPE sull''esercizio '||aEsDest||'. Lock tabella ASS_TIPO_CONTR_RITENUTA_SIOPE';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	For aAssContrRitSiope in (Select * From ASS_TIPO_CONTR_RITENUTA_SIOPE
			          Where esercizio = aEsOrig)
	Loop
		Begin
			insert into ASS_TIPO_CONTR_RITENUTA_SIOPE  (ESERCIZIO,
								    CD_CONTRIBUTO_RITENUTA,
								    DT_INI_VALIDITA,
								    ESERCIZIO_SIOPE_S,
  						   		    TI_GESTIONE_SIOPE_S,
  						   		    CD_SIOPE_S,
  						   		    ESERCIZIO_SIOPE_E,
  						   		    TI_GESTIONE_SIOPE_E,
  						   		    CD_SIOPE_E,
  						   		    DACR,
  						   		    UTCR,
  						   		    DUVA,
  						   		    UTUV,
  						   		    PG_VER_REC)
			values (aEsDest,
				aAssContrRitSiope.CD_CONTRIBUTO_RITENUTA,
				aAssContrRitSiope.DT_INI_VALIDITA,
				aEsDest,
  				aAssContrRitSiope.TI_GESTIONE_SIOPE_S,
  				aAssContrRitSiope.CD_SIOPE_S,
  				aEsDest,
  				aAssContrRitSiope.TI_GESTIONE_SIOPE_E,
  				aAssContrRitSiope.CD_SIOPE_E,
				sysdate,
				cgUtente,
				sysdate,
				cgUtente,
				1);
		Exception when dup_val_on_index then
			ibmutl200.logwar(aPgEsec,'Associazione Contributi/ritenute - Codici SIOPE con PK('||aEsDest||', '
							     	       				      ||aAssContrRitSiope.CD_CONTRIBUTO_RITENUTA||', '
							     	                                      ||aAssContrRitSiope.DT_INI_VALIDITA||', '
							     	                                      ||aAssContrRitSiope.TI_GESTIONE_SIOPE_S||', '
							     	                                      ||aAssContrRitSiope.CD_SIOPE_S||', '
							     	                                      ||aAssContrRitSiope.TI_GESTIONE_SIOPE_E||', '
								                                      ||aAssContrRitSiope.CD_SIOPE_E||') già inserita','','');
			aStato := 'W';
		End;
	End Loop;
	*/ -- fine spostamento ribaltamento_altro rospuc
End;
----------------------------------------------------------------------------
procedure ribaltaStruttOrg(aEsDest number, aEsOrig number, aPgEsec number, aStato in out char, aMessage in out varchar2) is
parent_key_not_found exception;
pragma exception_init(parent_key_not_found,-2291);
begin

	aMessage := 'Creazione dell''esercizio contabile '||aEsDest||' per i CDS e impostazione delle percentuali di copertura '||cnrutil.getLabelObbligazioniMin()||'. Lock tabelle ESERCIZIO, PRC_COPERTURA_OBBLIG, NUMERAZIONE_DOC_CONT.';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	-- ciclo sui cds validi nel corso dell'esercizio di destinazione
	for aCds in (select * from v_unita_organizzativa_valida
			 	 where fl_cds    = 'Y'
				   and esercizio = aEsDest
				   and cd_unita_organizzativa <> cnrctb020.getCDCDSENTE(aEsDest)) loop
		-- creazione dell'esercizio contabile per il cds
		begin
			 aMessage := 'Inserimento esercizio contabile per CdS: '||aCds.cd_unita_organizzativa;
			 ibmutl200.LOGINF(aPgEsec,aMessage,'','');
			 insert into esercizio (CD_CDS,
									ESERCIZIO,
									DS_ESERCIZIO,
									ST_APERTURA_CHIUSURA,
									DACR,
									UTCR,
									DUVA,
									UTUV,
									PG_VER_REC,
									IM_CASSA_INIZIALE)
			 values (aCds.cd_unita_organizzativa
			 	   	,aEsDest
				   	,'Esercizio contabile '|| aEsDest
				   	,'I'
				   	,sysdate
				   	,cgUtente
				   	,sysdate
				   	,cgUtente
				   	,1
				   	,0); --- Viene settata alla chiusura dell'esercizio
dbms_output.put_line('0010 + '||aCds.cd_unita_organizzativa);

			 -- esplosione del piano dei conti in funzione dell'esercizio contabile appena creato
--			 ibmutl200.LOGINF(aPgEsec,'cnrctb001.creaEsplVociEsercizio('||aEsDest||','||aCds.cd_unita_organizzativa||','||cgUtente||')','','');
			 cnrctb001.creaEsplVociEsercizio(aEsDest, aCds.cd_unita_organizzativa, cgUtente);

		exception
		when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Esercizio contabile '||aEsDest||' per il CDS '||aCds.cd_unita_organizzativa||' già definito','','');
			aStato := 'W';
		end;
		-- impostazione delle percentuali di copertura obbligazioni
		begin
--			 ibmutl200.LOGINF(aPgEsec,'Impostazione percentuali copertura per cds:'||aCds.cd_unita_organizzativa,'','');
			 insert into prc_copertura_obblig  (ESERCIZIO,
												CD_UNITA_ORGANIZZATIVA,
												PRC_COPERTURA_OBBLIG_2,
												PRC_COPERTURA_OBBLIG_3,
												DACR,
												UTCR,
												DUVA,
												UTUV,
												PG_VER_REC)
			 select  aEsDest
			 		,prc.CD_UNITA_ORGANIZZATIVA
					,prc.PRC_COPERTURA_OBBLIG_2
					,prc.PRC_COPERTURA_OBBLIG_3
					,sysdate
					,cgUtente
					,sysdate
					,cgUtente
					,1
			 from prc_copertura_obblig prc
			 where prc.esercizio 	   	  	  = aEsOrig
			   and prc.CD_UNITA_ORGANIZZATIVA = aCds.cd_unita_organizzativa;

			  dbms_output.put_line('0011');
exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Percentuali di copertura '||cnrutil.getLabelObbl()||' per il CDS '||aCds.cd_unita_organizzativa|| ' per l''esercizio '|| aEsDest||' già impostate','','');
			aStato := 'W';
		end;

		-- aggiornamento dei numeratori dei documenti contabili in NUMERAZIONE_DOC_CONT
--		ibmutl200.LOGINF(aPgEsec,'CNRCTB018.AGGIORNANUMERATORI('||aEsDest||','||aCds.cd_unita_organizzativa||','|| cgUtente||')','','');
		CNRCTB018.AGGIORNANUMERATORI(aEsDest, aCds.cd_unita_organizzativa, cgUtente);
			  dbms_output.put_line('0012');

	end loop; -- fine ciclo sui cds
dbms_output.put_line('0013');

	aMessage := 'Creazione dei parametri CDS per l''esercizio contabile '||aEsDest||' per i CDS validi. Lock tabella PARAMETRI_CDS.';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	-- ciclo sui cds validi nel corso dell'esercizio di destinazione
	for aCds in (select * from v_unita_organizzativa_valida
			 	 where fl_cds    = 'Y'
				   and esercizio = aEsDest) loop
	   -- creazione dei parametri per il cds
	   Declare
		FL_LINEA_E	varchar2(1);
  		CD_CDR_LINEA_E	varchar2(30);
  		CD_LINEA_E	varchar2(10);
  		FL_LINEA_S	varchar2(1);
  		CD_CDR_LINEA_S	varchar2(30);
  		CD_LINEA_S	varchar2(10);
  	   Begin
  	   	--se la linea non è valida, ripulisco i campi
  	   	select FL_LINEA_PGIRO_E_CDS,CD_CDR_LINEA_PGIRO_E,CD_LINEA_PGIRO_E,
  		       FL_LINEA_PGIRO_S_CDS,CD_CDR_LINEA_PGIRO_S,CD_LINEA_PGIRO_S
  		into FL_LINEA_E,CD_CDR_LINEA_E,CD_LINEA_E,FL_LINEA_S,CD_CDR_LINEA_S,CD_LINEA_S
  		from parametri_cds
  		where CD_CDS = aCds.cd_unita_organizzativa
	          and ESERCIZIO = aEsOrig;
dbms_output.put_line('0014');

		 If CD_CDR_LINEA_E Is Not Null Or CD_LINEA_E Is Not Null Then
			 Declare
			   e   VARCHAR2(1);
			 Begin
			   Select '1'
			   Into e
			   From linea_attivita
			   Where cd_centro_responsabilita = CD_CDR_LINEA_E
			     And cd_linea_attivita = CD_LINEA_E
			     And esercizio_fine >= aEsDest;
			 Exception
			    When No_Data_Found Then
			       FL_LINEA_E := 'N';
			       CD_CDR_LINEA_E := Null;
			       CD_LINEA_E := Null;
			 End;
		 End If;
		 If CD_CDR_LINEA_S Is Not Null Or CD_LINEA_S Is Not Null Then
			 Declare
			   s   VARCHAR2(1);
			 Begin
			   Select '1'
			   Into s
			   From linea_attivita
			   Where cd_centro_responsabilita = CD_CDR_LINEA_S
			     And cd_linea_attivita = CD_LINEA_S
			     And esercizio_fine >= aEsDest;
			 Exception
			    When No_Data_Found Then
			       FL_LINEA_S := 'N';
			       CD_CDR_LINEA_S := Null;
			       CD_LINEA_S := Null;
			 End;
		 End If;
dbms_output.put_line('0014');

		begin
			insert into parametri_cds (CD_CDS,
						   ESERCIZIO,
 						   FL_COMMESSA_OBBLIGATORIA,
						   DACR,
						   UTCR,
					 	   DUVA,
						   UTUV,
						   PG_VER_REC,
						   FL_PROGETTO_NUMERATORE,
						   PROGETTO_NUMERATORE_CIFRE,
						   IM_SOGLIA_CONTRATTO_S,
						   IM_SOGLIA_CONTRATTO_E,
						   FL_OBBLIGO_PROTOCOLLO_INF,
						   FL_CONTRATTO_CESSATO,
						   BLOCCO_IMPEGNI_CDR_GAE,
  						   FL_APPROVA_VAR_PDG,
  						   FL_RIBALTATO,
  						   IM_SOGLIA_RIBALTAMENTO_RES_IMP,
  						   FL_APPROVA_VAR_STANZ_RES,
  						   IM_SOGLIA_CONSUMO_RESIDUO,
  						   FL_BLOCCO_ASS_IMP_IVA,
  						   FL_RIPORTA_AVANTI,
						   FL_RIPORTA_INDIETRO,
  						   FL_LINEA_PGIRO_E_CDS,
  						   CD_CDR_LINEA_PGIRO_E,
  						   CD_LINEA_PGIRO_E,
  						   FL_LINEA_PGIRO_S_CDS,
  						   CD_CDR_LINEA_PGIRO_S,
  						   CD_LINEA_PGIRO_S,
  						   FL_MOD_OBBL_RES,
  						   FL_BLOCCO_IBAN,
  						   FL_KIT_FIRMA_DIGITALE,
  						   CD_DIPARTIMENTO,
  						   FL_RIACCERTAMENTO,
  						   FL_RIOBBLIGAZIONE,
  						   FL_BLOCCO_IMPEGNI_NATFIN,
                           ABIL_PROGETTO_STRORG)
			 select aCds.cd_unita_organizzativa,
			 	aEsDest,
			 	FL_COMMESSA_OBBLIGATORIA,
			 	sysdate,
				cgUtente,
				sysdate,
				cgUtente,
				1,
				FL_PROGETTO_NUMERATORE,
				0,
				IM_SOGLIA_CONTRATTO_S,
				IM_SOGLIA_CONTRATTO_E,
				FL_OBBLIGO_PROTOCOLLO_INF,
				FL_CONTRATTO_CESSATO,
				BLOCCO_IMPEGNI_CDR_GAE,
  				FL_APPROVA_VAR_PDG,
  				FL_RIBALTATO,
  				IM_SOGLIA_RIBALTAMENTO_RES_IMP,
  				FL_APPROVA_VAR_STANZ_RES,
  				IM_SOGLIA_CONSUMO_RESIDUO,
  				FL_BLOCCO_ASS_IMP_IVA,
  				FL_RIPORTA_AVANTI,
				FL_RIPORTA_INDIETRO,
  				FL_LINEA_E,
  				CD_CDR_LINEA_E,
  				CD_LINEA_E,
  				FL_LINEA_S,
  				CD_CDR_LINEA_S,
  				CD_LINEA_S,
  				FL_MOD_OBBL_RES,
  				FL_BLOCCO_IBAN,
  				FL_KIT_FIRMA_DIGITALE,
  				cd_dipartimento,
  				FL_RIACCERTAMENTO,
  				FL_RIOBBLIGAZIONE,
  				FL_BLOCCO_IMPEGNI_NATFIN,
                ABIL_PROGETTO_STRORG
			 from parametri_cds
			 where CD_CDS = aCds.cd_unita_organizzativa
			   and ESERCIZIO = aEsOrig;
			  dbms_output.put_line('0015');

		exception
		when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Parametri CDS per l''esercizio contabile '||aEsDest||' e per il CDS '||aCds.cd_unita_organizzativa||' già definiti','','');
			aStato := 'W';
		end;
	   Exception
	      When No_Data_Found Then
			ibmutl200.LOGWAR(aPgEsec,'Parametri CDS per l''esercizio contabile '||aEsDest||' e per il CDS '||aCds.cd_unita_organizzativa||' non presenti nell''Esercizio di origine','','');
			aStato := 'W';
	   End;
	end loop;

	aMessage := 'Creazione della tabella CHIUSURA_COEP per l''esercizio contabile '||aEsDest||' per i CDS validi. Lock tabella CHIUSURA_COEP.';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	-- ciclo sui cds validi nel corso dell'esercizio di destinazione
	for aCds in (select * from v_unita_organizzativa_valida
			 	 where fl_cds    = 'Y'
				   and esercizio = aEsDest) loop
	   -- creazione dei parametri di chiusura coep per il cds
	   Begin
			insert into chiusura_coep (CD_CDS,
  						   ESERCIZIO,
						   STATO,
						   DACR,
						   UTCR,
						   DUVA,
						   UTUV,
						   PG_VER_REC)
			 select aCds.cd_unita_organizzativa,
			 	aEsDest,
			 	'A',
			 	sysdate,
				cgUtente,
				sysdate,
				cgUtente,
				1
			 from chiusura_coep
			 where CD_CDS = aCds.cd_unita_organizzativa
			   and ESERCIZIO = aEsOrig;
		exception
		when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Parametri di Chiusura coep per l''esercizio contabile '||aEsDest||' e per il CDS '||aCds.cd_unita_organizzativa||' già definiti','','');
			aStato := 'W';
		end;
	end loop;

	aMessage := 'Ribaltamento tabella di identificazione dei collegamenti tra conti di partita di giro su '||aEsDest||'. Lock tabella ASS_PARTITA_GIRO.';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	for aAssPgiro in (select * from ASS_PARTITA_GIRO
				  	  where esercizio = aEsOrig) loop
		begin
			insert into ASS_PARTITA_GIRO (ESERCIZIO,
										  TI_APPARTENENZA,
										  TI_GESTIONE,
										  CD_VOCE,
										  TI_APPARTENENZA_CLG,
										  TI_GESTIONE_CLG,
										  CD_VOCE_CLG,
										  DACR,
										  UTCR,
										  DUVA,
										  UTUV,
										  PG_VER_REC)
			values (aEsDest,
				    aAssPgiro.TI_APPARTENENZA,
				    aAssPgiro.TI_GESTIONE,
				    aAssPgiro.CD_VOCE,
				    aAssPgiro.TI_APPARTENENZA_CLG,
				    aAssPgiro.TI_GESTIONE_CLG,
				    aAssPgiro.CD_VOCE_CLG,
					sysdate,
					cgUtente,
					sysdate,
					cgUtente,
					1);
		exception
		when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'ASS_PARTITA_GIRO con PK( '||aEsDest||', '
									||aAssPgiro.TI_APPARTENENZA||', '
									||aAssPgiro.TI_GESTIONE||', '
									||aAssPgiro.CD_VOCE||') già esistente','','');
			aStato := 'W';
		when parent_key_not_found then
			ibmutl200.LOGWAR(aPgEsec,'Chiave padre non trovata per ASS_PARTITA_GIRO con PK('||aEsDest||', '
									||aAssPgiro.TI_APPARTENENZA||', '
									||aAssPgiro.TI_GESTIONE||', '
									||aAssPgiro.CD_VOCE||'). '||SQLERRM,'','');
			aStato := 'W';
		end;
	end loop; -- fine ciclo sulle associazioni

	-- Ribaltamento elenco dei CDS che sono gestiti in versamento via interfaccia
	aMessage := 'Ribaltamento elenco dei CDS che sono gestiti in versamento via interfaccia sull''esercizio '||aEsDest||'. Lock tabella LIQUID_CORI_INTERF_CDS';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	for aInterf in (select * from LIQUID_CORI_INTERF_CDS
				    where esercizio = aEsOrig
				      and cd_cds in (select cd_unita_organizzativa
						     from v_unita_organizzativa_valida
						     where fl_cds    = 'Y'
						      and esercizio = aEsDest)) loop
		begin
			insert into LIQUID_CORI_INTERF_CDS (CD_CDS,
												ESERCIZIO,
												DACR,
												UTCR,
												DUVA,
												UTUV,
												PG_VER_REC,
												TIPO)
			values (aInterf.cd_cds,
				    aEsDest,
					sysdate,
					cgUtente,
					sysdate,
				  	cgUtente,
					1,
					aInterf.tipo);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Cds '||aInterf.cd_cds||' già esistente per l''esercizio '||aEsDest,'','');
			aStato := 'W';
		end;
	end loop;

	-- Ribaltamento elenco dei CDS che in un determinato esercizio utilizzano l'interfaccia di generazione della liquidazione IVA
	aMessage := 'Ribaltamento elenco dei CDS che sono gestiti in versamento via interfaccia sull''esercizio '||aEsDest||'. Lock tabella LIQUID_IVA_INTERF_CDS';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	for aInterf in (select * from LIQUID_IVA_INTERF_CDS
				    where esercizio = aEsOrig
				      and cd_cds in (select cd_unita_organizzativa
						     from v_unita_organizzativa_valida
						     where fl_cds    = 'Y'
						      and esercizio = aEsDest)) loop
		begin
			insert into LIQUID_IVA_INTERF_CDS  (CD_CDS,
												ESERCIZIO,
												DACR,
												UTCR,
												DUVA,
												UTUV,
												PG_VER_REC)
			values (aInterf.cd_cds,
				    aEsDest,
					sysdate,
					cgUtente,
					sysdate,
				  	cgUtente,
					1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Cds '||aInterf.cd_cds||' già esistente per l''esercizio '||aEsDest,'','');
			aStato := 'W';
		end;
	end loop;
	-- Ribaltamento UO che hanno una gestione dell'IVA esterna
	aMessage := 'Ribaltamento UO che hanno una gestione dell''IVA esterna sull''esercizio '||aEsDest||'. Lock tabella LIQUID_IVA_ESTERNA';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	for aEsterna in (select * from LIQUID_IVA_ESTERNA
				           where esercizio = aEsOrig
				             and cd_unita_organizzativa in (select cd_unita_organizzativa
						                                        from v_unita_organizzativa_valida
						                                        where esercizio = aEsDest)) loop
		begin
			insert into LIQUID_IVA_ESTERNA  (ESERCIZIO,
			                                 CD_UNITA_ORGANIZZATIVA,
			                                 TIPO,
												               DACR,
												               UTCR,
												               DUVA,
												               UTUV,
												               PG_VER_REC)
			values (aEsDest,
			        aEsterna.cd_unita_organizzativa,
				      aEsterna.tipo,
					    sysdate,
					    cgUtente,
					    sysdate,
				  	  cgUtente,
					    1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'UO '||aEsterna.cd_unita_organizzativa||' già esistente per l''esercizio '||aEsDest,'','');
			aStato := 'W';
		end;
	end loop;

	-- Ribaltamento Dipartimento_peso
	aMessage := 'Ribaltamento Dipartimento peso sull''esercizio '||aEsDest||'. Lock tabella Dipartimento_peso';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	for aDati in (select * from Dipartimento_peso
				           where esercizio = aEsOrig) loop
		begin
			insert into Dipartimento_peso   (ESERCIZIO,
			                                 CD_DIPARTIMENTO,
			                                 DS_DIPARTIMENTO,
			                                 PESO,
												               DACR,
												               UTCR,
												               DUVA,
												               UTUV,
												               PG_VER_REC)
			values (aEsDest,
			        aDati.CD_DIPARTIMENTO,
				      aDati.Ds_DIPARTIMENTO,
				      aDati.peso,
					    sysdate,
					    cgUtente,
					    sysdate,
				  	  cgUtente,
					    1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Dipartimento peso già esistente per l''esercizio '||aEsDest,'','');
			aStato := 'W';
		end;
	end loop;

	--Ribaltamento ASS_UO_AREA
	aMessage := 'Creazione di ASS_UO_AREA per l''esercizio contabile '||aEsDest||' per le UO valide. Lock tabella ASS_UO_AREA.';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');

	for aDati In(Select * From  ASS_UO_AREA
		     Where esercizio = aEsOrig
		     And cd_unita_organizzativa In (select cd_unita_organizzativa
		      				    from v_unita_organizzativa_valida
			 	 		    where fl_cds    = 'N'
				   		    and esercizio = aEsDest)) Loop
		-- creazione dell'associazione
		begin
			insert into ASS_UO_AREA (ESERCIZIO,
  						 CD_UNITA_ORGANIZZATIVA,
  						 CD_AREA_RICERCA,
  						 FL_PRESIDENTE_AREA,
  					         UTCR,
  						 DACR,
  						 UTUV,
  						 DUVA,
  						 PG_VER_REC)
			values (aEsDest,
				aDati.CD_UNITA_ORGANIZZATIVA,
  				aDati.CD_AREA_RICERCA,
  				aDati.FL_PRESIDENTE_AREA,
				cgUtente,
				sysdate,
				cgUtente,
				sysdate,
				1);
		exception
		when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Associazione UO-AREA per l''esercizio contabile '||aEsDest||' e per la UO '||aDati.cd_unita_organizzativa||' già definiti','','');
			aStato := 'W';
		end;
	end loop;
	--Ribaltamento ASS_DIPARTIMENTO_AREA
	aMessage := 'Creazione di ASS_DIPARTIMENTO_AREA per l''esercizio contabile '||aEsDest||' per le Aree valide. Lock tabella ASS_DIPARTIMENTO_AREA.';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');

	for aDati In(Select * From  ASS_DIPARTIMENTO_AREA
		     Where esercizio = aEsOrig
		     And cd_cds_area In (select cd_unita_organizzativa
		      				    from v_unita_organizzativa_valida
			 	 		    where esercizio = aEsDest)) Loop
		-- creazione dell'associazione
		begin
			insert into ASS_DIPARTIMENTO_AREA (ESERCIZIO,
  						 	   CD_DIPARTIMENTO,
  						 	   CD_CDS_AREA,
  					         	   UTCR,
  						 	   DACR,
  						 	   UTUV,
  						 	   DUVA,
  						 	   PG_VER_REC)
			values (aEsDest,
				aDati.CD_DIPARTIMENTO,
  				aDati.CD_CDS_AREA,
				cgUtente,
				sysdate,
				cgUtente,
				sysdate,
				1);
		exception
		when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Associazione DIPARTIMENTO_AREA per l''esercizio contabile '||aEsDest||' e per il dipartimento '||aDati.CD_DIPARTIMENTO||' già definita','','');
			aStato := 'W';
		end;
	end loop;
end;
----------------------------------------------------------------------------
procedure ribaltaEP(aEsDest number, aEsOrig number, aPgEsec number, aStato in out char, aMessage in out varchar2) is
begin

	-- Ribaltamento conti E/P
	aMessage := 'Ribaltamento del piano dei conti E/P sull''esercizio '||aEsDest||'. Lock tabella VOCE_EP';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	for aVoceEP in (select * from VOCE_EP
				    where esercizio = aEsOrig
					order by cd_voce_ep) loop  -- order per RK_VOCE_EP00
		begin
			insert into VOCE_EP (ESERCIZIO,
								 CD_VOCE_EP,
								 NATURA_VOCE,
								 TI_VOCE_EP,
								 DS_VOCE_EP,
								 LIVELLO,
								 CD_PROPRIO_VOCE_EP,
								 FL_MASTRINO,
								 TI_SEZIONE,
								 RIEPILOGA_A,
								 RIAPRE_A_CONTO_ECONOMICO,
								 FL_A_PAREGGIO,
								 CONTO_SPECIALE,
								 DUVA,
								 UTUV,
								 DACR,
								 UTCR,
								 PG_VER_REC,
								 CD_VOCE_EP_PADRE,
								 id_classificazione)
			values (aEsDest,
					aVoceEP.CD_VOCE_EP,
					aVoceEP.NATURA_VOCE,
					aVoceEP.TI_VOCE_EP,
					aVoceEP.DS_VOCE_EP,
					aVoceEP.LIVELLO,
					aVoceEP.CD_PROPRIO_VOCE_EP,
					aVoceEP.FL_MASTRINO,
					aVoceEP.TI_SEZIONE,
					aVoceEP.RIEPILOGA_A,
					aVoceEP.RIAPRE_A_CONTO_ECONOMICO,
					aVoceEP.FL_A_PAREGGIO,
					aVoceEP.CONTO_SPECIALE,
					sysdate,
					cgUtente,
					sysdate,
					cgUtente,
					1,
					aVoceEP.CD_VOCE_EP_PADRE,
					NULL);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Voce E/P '||aVoceEP.CD_VOCE_EP||' già esistente per l''esercizio '||aEsDest,'','');
			aStato := 'W';
		end;
	end loop;

	-- Ribaltamento  delle associazioni entrate-ricavi spese-costi
	aMessage := 'Ribaltamento  delle associazioni entrate-ricavi spese-costi sull''esercizio '||aEsDest||'. Lock tabella ASS_EV_VOCEEP';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	for aAssEVEP in (select * from ASS_EV_VOCEEP
			 	 where esercizio = aEsOrig) loop
		begin
			 insert into ASS_EV_VOCEEP (ESERCIZIO,
										TI_APPARTENENZA,
										TI_GESTIONE,
										CD_ELEMENTO_VOCE,
										CD_VOCE_EP,
										UTUV,
										DACR,
										UTCR,
										PG_VER_REC,
										DUVA,
										CD_VOCE_EP_CONTR)
			 values (aEsDest,
			 		 aAssEVEP.TI_APPARTENENZA,
					 aAssEVEP.TI_GESTIONE,
					 aAssEVEP.CD_ELEMENTO_VOCE,
					 aAssEVEP.CD_VOCE_EP,
					 cgUtente,
					 sysdate,
					 cgUtente,
					 1,
					 sysdate,
					 aAssEVEP.CD_VOCE_EP_CONTR);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'ASS_EV_VOCEEP con PK ('||aEsDest||', '
															 ||aAssEVEP.TI_APPARTENENZA||', '
															 ||aAssEVEP.TI_GESTIONE||', '
															 ||aAssEVEP.CD_ELEMENTO_VOCE||', '
															 ||aAssEVEP.CD_VOCE_EP||') già inserita','','');
			aStato := 'W';
		end;
	end loop;

	-- Ribaltamento Parametri Livelli
        Begin
	   aMessage := 'Ribaltamento Parametri Livelli EP sull''esercizio '||aEsDest||'. Lock tabella PARAMETRI_LIVELLI_EP';
	   ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	   insert into PARAMETRI_LIVELLI_EP (ESERCIZIO,LIVELLI_ECO,
	   				  LUNG_LIVELLO1E,DS_LIVELLO1E,
	   				  LUNG_LIVELLO2E,DS_LIVELLO2E,
	   				  LUNG_LIVELLO3E,DS_LIVELLO3E,
	   				  LUNG_LIVELLO4E,DS_LIVELLO4E,
	   				  LUNG_LIVELLO5E,DS_LIVELLO5E,
	   				  LUNG_LIVELLO6E,DS_LIVELLO6E,
	   				  LUNG_LIVELLO7E,DS_LIVELLO7E,
	   				  LUNG_LIVELLO8E,DS_LIVELLO8E,
	   				  LIVELLI_PAT,
	   				  LUNG_LIVELLO1P,DS_LIVELLO1P,
	   				  LUNG_LIVELLO2P,DS_LIVELLO2P,
	   				  LUNG_LIVELLO3P,DS_LIVELLO3P,
	   				  LUNG_LIVELLO4P,DS_LIVELLO4P,
	   				  LUNG_LIVELLO5P,DS_LIVELLO5P,
	   				  LUNG_LIVELLO6P,DS_LIVELLO6P,
	   				  LUNG_LIVELLO7P,DS_LIVELLO7P,
	   				  LUNG_LIVELLO8P,DS_LIVELLO8P,
				      DACR,UTCR,DUVA,UTUV,PG_VER_REC)
		select aEsDest, LIVELLI_ECO,
	   	  LUNG_LIVELLO1E,DS_LIVELLO1E,
	   	  LUNG_LIVELLO2E,DS_LIVELLO2E,
	   	  LUNG_LIVELLO3E,DS_LIVELLO3E,
	   	  LUNG_LIVELLO4E,DS_LIVELLO4E,
	   	  LUNG_LIVELLO5E,DS_LIVELLO5E,
	   	  LUNG_LIVELLO6E,DS_LIVELLO6E,
	   	  LUNG_LIVELLO7E,DS_LIVELLO7E,
	   	  LUNG_LIVELLO8E,DS_LIVELLO8E,
	   	  LIVELLI_PAT,
	   	  LUNG_LIVELLO1P,DS_LIVELLO1P,
	   	  LUNG_LIVELLO2P,DS_LIVELLO2P,
	   	  LUNG_LIVELLO3P,DS_LIVELLO3P,
	   	  LUNG_LIVELLO4P,DS_LIVELLO4P,
	   	  LUNG_LIVELLO5P,DS_LIVELLO5P,
	   	  LUNG_LIVELLO6P,DS_LIVELLO6P,
	   	  LUNG_LIVELLO7P,DS_LIVELLO7P,
	   	  LUNG_LIVELLO8P,DS_LIVELLO8P,
	   	  Sysdate,cgUtente,sysdate,cgUtente,1
		from PARAMETRI_LIVELLI_EP
		where ESERCIZIO = aEsOrig;
	Exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Parametri Livelli EP per l''esercizio base '||aEsDest||' già esistenti','','');
			aStato := 'W';
	End;

	-- Ribaltamento classificazione voci ep
	declare
	   new_id NUMBER;
	   new_id_padre NUMBER:=Null;
	begin
	lock table classificazione_voci_ep in exclusive mode nowait;
	aMessage := 'Ribaltamento Classificazione Voci ep sull''esercizio '||aEsDest||'. Lock tabella CLASSIFICAZIONE_VOCI_EP';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');

	Select Max(id_classificazione)
	Into new_id
	From CLASSIFICAZIONE_VOCI_EP;

	  for aClassV in (select * from CLASSIFICAZIONE_VOCI_EP
			where esercizio = aEsOrig
			order by esercizio, tipo, cd_livello1 Desc, cd_livello2 Desc ,cd_livello3 Desc ,
			cd_livello4 Desc, cd_livello5 Desc, cd_livello6 Desc, cd_livello7 Desc, cd_livello8 Desc)
	  loop
		begin
			new_id := new_id + 1;
			insert into CLASSIFICAZIONE_VOCI_EP (ID_CLASSIFICAZIONE,
							  ESERCIZIO,
							  TIPO,
							  DS_CLASSIFICAZIONE,
							  CD_LIVELLO1,
							  CD_LIVELLO2,
							  CD_LIVELLO3,
							  CD_LIVELLO4,
							  CD_LIVELLO5,
							  CD_LIVELLO6,
							  CD_LIVELLO7,
							  CD_LIVELLO8,
							  ID_CLASS_PADRE,
							  FL_MASTRINO,
							  DUVA,
							  UTUV,
							  DACR,
							  UTCR,
							  PG_VER_REC)
			values (new_id,
				aEsDest,
				aClassV.TIPO,
				aClassV.DS_CLASSIFICAZIONE,
				aClassV.CD_LIVELLO1,
				aClassV.CD_LIVELLO2,
				aClassV.CD_LIVELLO3,
				aClassV.CD_LIVELLO4,
				aClassV.CD_LIVELLO5,
				aClassV.CD_LIVELLO6,
				aClassV.CD_LIVELLO7,
				aClassV.CD_LIVELLO8,
				null,
				aClassV.FL_MASTRINO,
				sysdate,
				cgUtente,
				sysdate,
				cgutente,
				1);

			--Aggiorno l'elemento voce con la nuova classificazione creata
			update VOCE_EP v
			set v.id_classificazione =  new_id
			where v.esercizio = aEsDest
			and (v.cd_voce_ep) In
			     (Select a.cd_voce_ep
			     From voce_ep a
			     Where a.esercizio = aEsOrig
			       And a.id_classificazione = aClassV.id_classificazione);
		exception
		   when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'CLASSIFICAZIONE_VOCI_EP con PK ('||new_id||') già esistente','','');
			aStato := 'W';
		   when OTHERS then
			ibmutl200.LOGWAR(aPgEsec,'SK_CLASSIFICAZIONE_VOCI_EP violata per la classificazione ('||new_id||')','','');
			aStato := 'W';
		end;
	  end loop;
	end;

	-- Aggiornamento id_class_padre nel nuovo anno
	Declare
    	    rec_class 	CLASSIFICAZIONE_VOCI_EP%Rowtype;
    	    new_padre   NUMBER;
	Begin
	   for aClassPadre in (select * from CLASSIFICAZIONE_VOCI_EP
		    where esercizio = aEsOrig
		    And id_class_padre Is Not Null)
  	   loop
  		select *
		into rec_class
		From CLASSIFICAZIONE_VOCI_EP
		where esercizio = aEsOrig
		and id_classificazione = aClassPadre.id_class_padre;

		select id_classificazione
		into new_padre
		from CLASSIFICAZIONE_VOCI_EP
		where esercizio = aEsDest
		and tipo = rec_class.tipo
		and cd_livello1 = rec_class.cd_livello1
		and ((rec_class.cd_livello2 Is Not Null And cd_livello2 = rec_class.cd_livello2)
	      	      Or
	      	     (rec_class.cd_livello2 Is Null And cd_livello2 Is Null))
		and ((rec_class.cd_livello3 Is Not Null And cd_livello3 = rec_class.cd_livello3)
	              Or
	             (rec_class.cd_livello3 Is Null And cd_livello3 Is Null))
		and ((rec_class.cd_livello4 Is Not Null And cd_livello4 = rec_class.cd_livello4)
	              Or
	             (rec_class.cd_livello4 Is Null And cd_livello4 Is Null))
		and ((rec_class.cd_livello5 Is Not Null And cd_livello5 = rec_class.cd_livello5)
	              Or
	             (rec_class.cd_livello5 Is Null And cd_livello5 Is Null))
		and ((rec_class.cd_livello6 Is Not Null And cd_livello6 = rec_class.cd_livello6)
	              Or
	             (rec_class.cd_livello6 Is Null And cd_livello6 Is Null))
		and ((rec_class.cd_livello7 Is Not Null And cd_livello7 = rec_class.cd_livello7)
	              Or
	             (rec_class.cd_livello7 Is Null And cd_livello7 Is Null))
	   and ((rec_class.cd_livello8 Is Not Null And cd_livello8 = rec_class.cd_livello8)
	              Or
	             (rec_class.cd_livello8 Is Null And cd_livello8 Is Null));

		update CLASSIFICAZIONE_VOCI_EP
		set id_class_padre = new_padre
		where esercizio = aEsDest
		and tipo = aClassPadre.tipo
		and cd_livello1 = aClassPadre.cd_livello1
		and ((aClassPadre.cd_livello2 Is Not Null And cd_livello2 = aClassPadre.cd_livello2)
	             Or
	             (aClassPadre.cd_livello2 Is Null And cd_livello2 Is Null))
		and ((aClassPadre.cd_livello3 Is Not Null And cd_livello3 = aClassPadre.cd_livello3)
	             Or
	             (aClassPadre.cd_livello3 Is Null And cd_livello3 Is Null))
		and ((aClassPadre.cd_livello4 Is Not Null And cd_livello4 = aClassPadre.cd_livello4)
	             Or
	             (aClassPadre.cd_livello4 Is Null And cd_livello4 Is Null))
		and ((aClassPadre.cd_livello5 Is Not Null And cd_livello5 = aClassPadre.cd_livello5)
	             Or
	             (aClassPadre.cd_livello5 Is Null And cd_livello5 Is Null))
		and ((aClassPadre.cd_livello6 Is Not Null And cd_livello6 = aClassPadre.cd_livello6)
	             Or
	             (aClassPadre.cd_livello6 Is Null And cd_livello6 Is Null))
		and ((aClassPadre.cd_livello7 Is Not Null And cd_livello7 = aClassPadre.cd_livello7)
	             Or
	             (aClassPadre.cd_livello7 Is Null And cd_livello7 Is Null))
	  and ((aClassPadre.cd_livello8 Is Not Null And cd_livello8 = aClassPadre.cd_livello8)
	             Or
	             (aClassPadre.cd_livello8 Is Null And cd_livello8 Is Null));
   	End Loop;
	End;

/*
	-- Ribaltamento associazione tra tipo di soggetto anagrafico e voce economica
	lock table ass_anag_voce_ep in exclusive mode nowait;
	aMessage := 'Ribaltamento  delle associazione tra tipo di soggetto anagrafico e voce economica sull''esercizio '||aEsDest||'. Lock tabella ASS_ANAG_VOCE_EP';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	for aAssAnagEP in (select * from ASS_ANAG_VOCE_EP
			 	   	   where esercizio = aEsOrig) loop
		begin
			 insert into ASS_ANAG_VOCE_EP  (ESERCIZIO,
											TI_TERZO,
											ITALIANO_ESTERO,
											TI_ENTITA,
											ENTE_ALTRO,
											CD_CLASSIFIC_ANAG,
											CD_VOCE_EP,
											UTCR,
											DACR,
											UTUV,
											DUVA,
											PG_VER_REC)
			 values (aEsDest,
			 		 aAssAnagEP.TI_TERZO,
					 aAssAnagEP.ITALIANO_ESTERO,
					 aAssAnagEP.TI_ENTITA,
					 aAssAnagEP.ENTE_ALTRO,
					 aAssAnagEP.CD_CLASSIFIC_ANAG,
					 aAssAnagEP.CD_VOCE_EP,
					 cgUtente,
					 sysdate,
					 cgUtente,
					 sysdate,
					 1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'ASS_ANAG_VOCE_EP con PK (' ||aEsDest||', '
																 ||aAssAnagEP.TI_TERZO||', '
																 ||aAssAnagEP.ITALIANO_ESTERO||', '
																 ||aAssAnagEP.TI_ENTITA||', '
																 ||aAssAnagEP.ENTE_ALTRO||','
																 ||aAssAnagEP.CD_CLASSIFIC_ANAG||') già inserita','','');
			aStato := 'W';
		end;
	end loop;
*/
	-- Ribaltamento associazione fra categoria inventariale e voce del piano economico
	aMessage := 'Ribaltamento associazione fra categoria inventariale e voce del piano economico';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	for aAssCatVoceEp in (select * from categoria_gruppo_voce_ep
					  	  where esercizio = aEsOrig) loop
		begin
			 insert into CATEGORIA_GRUPPO_VOCE_EP (CD_CATEGORIA_GRUPPO,
													ESERCIZIO,
													SEZIONE,
													CD_VOCE_EP,
													CD_VOCE_EP_CONTR,
													DACR,
													UTCR,
													DUVA,
													UTUV,
													PG_VER_REC,
													TI_APPARTENENZA,
    											TI_GESTIONE,
    											CD_ELEMENTO_VOCE,
    											CD_VOCE_EP_PLUS,
    											CD_VOCE_EP_MINUS,
    											FL_DEFAULT)
			 values (aAssCatVoceEp.CD_CATEGORIA_GRUPPO,
			 		 aEsDest,
					 aAssCatVoceEp.SEZIONE,
					 aAssCatVoceEp.CD_VOCE_EP,
					 aAssCatVoceEp.CD_VOCE_EP_CONTR,
					 sysdate,
					 cgUtente,
					 sysdate,
					 cgUtente,
					 1,
					 aAssCatVoceEp.TI_APPARTENENZA,
					 aAssCatVoceEp.TI_GESTIONE,
					 aAssCatVoceEp.CD_ELEMENTO_VOCE,
					 aAssCatVoceEp.CD_VOCE_EP_PLUS,
					 aAssCatVoceEp.CD_VOCE_EP_MINUS,
					 aAssCatVoceEp.FL_DEFAULT);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'CATEGORIA_GRUPPO_VOCE_EP con PK (' ||aAssCatVoceEp.CD_CATEGORIA_GRUPPO||', '
																 ||aEsDest||', '
																 ||aAssCatVoceEp.SEZIONE||') già inserita','','');
			aStato := 'W';
		end;
	end loop;

		-- Ribaltamento associazione CNR_ASS_CONTO_GRUPPO_EP
	aMessage := 'Ribaltamento associazione CNR_ASS_CONTO_GRUPPO_EP';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	for aAssContoGruppoEp in (select * from CNR_ASS_CONTO_GRUPPO_EP
					  	  where esercizio = aEsOrig) loop
		begin
			 insert into CNR_ASS_CONTO_GRUPPO_EP (ESERCIZIO,
                            CD_PIANO_GRUPPI,
                            CD_GRUPPO_EP,
                            CD_VOCE_EP,
                            SEZIONE,
                            DS_ASSOCIAZIONE,
                            SEGNO,
                            DUVA,
                            UTUV,
                            DACR,
                            UTCR,
                            PG_VER_REC)
			 values (aEsDest,
					     aAssContoGruppoEp.CD_PIANO_GRUPPI,
               aAssContoGruppoEp.CD_GRUPPO_EP,
               aAssContoGruppoEp.CD_VOCE_EP,
               aAssContoGruppoEp.SEZIONE,
               aAssContoGruppoEp.DS_ASSOCIAZIONE,
               aAssContoGruppoEp.SEGNO,
               sysdate,
					     cgUtente,
					     sysdate,
					     cgUtente,
					     1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'CNR_ASS_CONTO_GRUPPO_EP con PK (' ||aEsDest||', '
																 ||aAssContoGruppoEp.CD_PIANO_GRUPPI||', '
																 ||aAssContoGruppoEp.CD_GRUPPO_EP||', '
																 ||aAssContoGruppoEp.CD_VOCE_EP||') già inserita','','');
			aStato := 'W';
		end;
	end loop;

end;
----------------------------------------------------------------------------
procedure ribaltaCORI_altro(aEsDest number, aEsOrig number, aPgEsec number, aStato in out char, aMessage in out varchar2) is
uoEnte unita_organizzativa%rowtype;
begin
	-- Ribaltamento record con Pk ('999',aEsOrig,'999.0000',0) in LIQUID_CORI
	uoEnte:=CNRCTB020.GETUOENTE(aEsDest);
	aMessage := 'Ribaltamento record con Pk ('||cnrctb020.getCDCDSENTE(aEsDest)||','||aEsOrig||','||uoEnte.cd_unita_organizzativa||',0) in LIQUID_CORI sull''esercizio '||aEsDest||'. Lock tabella LIQUID_CORI';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	begin
		 insert into LIQUID_CORI (CD_CDS,
					ESERCIZIO,
					CD_UNITA_ORGANIZZATIVA,
					PG_LIQUIDAZIONE,
					DT_DA,
					DT_A,
					STATO,
					DACR,
					UTCR,
					DUVA,
					UTUV,
					PG_VER_REC,
					DA_ESERCIZIO_PRECEDENTE)
		 select lc.CD_CDS,
		 	aEsDest,
			lc.CD_UNITA_ORGANIZZATIVA,
			lc.PG_LIQUIDAZIONE,
			IBMUTL001.getAddMonth(dt_da,12),
			IBMUTL001.getAddMonth(dt_a,12),
			lc.STATO,
			sysdate,
			cgUtente,
			sysdate,
			cgUtente,
			1,
			lc.DA_ESERCIZIO_PRECEDENTE
		 from liquid_cori lc
		 where lc.CD_CDS  		 = cnrctb020.getCDCDSENTE(aEsDest)
		   and lc.ESERCIZIO 		 = aEsOrig
		   and lc.CD_UNITA_ORGANIZZATIVA = uoEnte.cd_unita_organizzativa
		   and lc.PG_LIQUIDAZIONE 	 = 0;
	exception when DUP_VAL_ON_INDEX then
		ibmutl200.LOGWAR(aPgEsec,'LIQUID_CORI con PK('||cnrctb020.getCDCDSENTE(aEsDest)||','||aEsOrig||','||uoEnte.cd_unita_organizzativa||',0) già inserita','','');
		aStato := 'W';
	end;


	-- Ribaltamento definizioni gruppi CORI
	aMessage := 'Ribaltamento definizioni gruppi CORI sull''esercizio '||aEsDest||'. Lock tabella GRUPPO_CR';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	for aGrCR in (select * from GRUPPO_CR
			       where esercizio = aEsOrig) loop
		begin
			 insert into GRUPPO_CR (ESERCIZIO,
						CD_GRUPPO_CR,
						DS_GRUPPO_CR,
						FL_ACCENTRATO,
						DACR,
						UTCR,
						DUVA,
						UTUV,
						PG_VER_REC,
						FL_ANNO_PREC,
						FL_F24ONLINE,
						FL_F24ONLINE_PREVID,
						CD_TRIBUTO_ERARIO,
						CD_TIPO_RIGA_F24,
						CD_MATRICOLA_INPS)
			 values (aEsDest,
			 	aGrCR.CD_GRUPPO_CR,
			 	aGrCR.DS_GRUPPO_CR,
			 	aGrCR.FL_ACCENTRATO,
				sysdate,
				cgUtente,
				sysdate,
				cgUtente,
				1,
				aGrCR.FL_ANNO_PREC,
				aGrCR.FL_F24ONLINE,
				aGrCR.FL_F24ONLINE_PREVID,
				aGrCR.CD_TRIBUTO_ERARIO,
				aGrCR.CD_TIPO_RIGA_F24,
				aGrCR.CD_MATRICOLA_INPS);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Gruppo CORI '||aGrCR.CD_GRUPPO_CR||' già inserito per l''esercizio '||aEsDest,'','');
			aStato := 'W';
		end;
	end loop;

	-- Ribaltamento dettagli gruppo CORI
	aMessage := 'Ribaltamento dettagli gruppo CORI sull''esercizio '||aEsDest||'. Lock tabella GRUPPO_CR_DET';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	for	aGrCRDet in (select * from GRUPPO_CR_DET
				 	 where esercizio = aEsOrig) loop
		begin
			 insert into GRUPPO_CR_DET (ESERCIZIO,
						    CD_GRUPPO_CR,
						    CD_REGIONE,
						    PG_COMUNE,
						    CD_TERZO_VERSAMENTO,
						    CD_MODALITA_PAGAMENTO,
						    PG_BANCA,
						    DACR,
						    UTCR,
						    DUVA,
						    UTUV,
						    PG_VER_REC)
			 values (aEsDest,
			 	 aGrCRDet.CD_GRUPPO_CR,
			 	 aGrCRDet.CD_REGIONE,
			 	 aGrCRDet.PG_COMUNE,
			 	 aGrCRDet.CD_TERZO_VERSAMENTO,
			 	 aGrCRDet.CD_MODALITA_PAGAMENTO,
			 	 aGrCRDet.PG_BANCA,
				 sysdate,
				 cgUtente,
				 sysdate,
				 cgUtente,
				 1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'GRUPPO_CR_DET con PK ('||aEsDest||', '
					||aGrCRDet.CD_GRUPPO_CR||', '
					||aGrCRDet.CD_REGIONE||', '
					||aGrCRDet.PG_COMUNE||') già inserito','','');
			aStato := 'W';
		end;
	end loop;

	-- Ribaltamento regole in deroga per UO
	aMessage := 'Ribaltamento regole in deroga per UO sull''esercizio '||aEsDest||'. Lock tabella GRUPPO_CR_UO';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	for	aGrCRUO in (select * from GRUPPO_CR_UO
				    where esercizio = aEsOrig) loop
		begin
			 insert into GRUPPO_CR_UO (ESERCIZIO,
						   CD_GRUPPO_CR,
						   CD_UNITA_ORGANIZZATIVA,
						   FL_ACCENTRATO,
						   DACR,
						   UTCR,
						   DUVA,
						   UTUV,
						   PG_VER_REC)
			 values (aEsDest,
			 	aGrCRUO.CD_GRUPPO_CR,
			 	aGrCRUO.CD_UNITA_ORGANIZZATIVA,
			 	aGrCRUO.FL_ACCENTRATO,
				sysdate,
				cgUtente,
				sysdate,
				cgUtente,
				1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'GRUPPO_CR_UO con PK ('||aEsDest||', '
					||aGrCRUO.CD_GRUPPO_CR||', '
					||aGrCRUO.CD_UNITA_ORGANIZZATIVA||') già inserito','','');
			aStato := 'W';
		end;
	end loop;

	-- Ribaltamento associazione CORI e relativo gruppo
	aMessage := 'Ribaltamento associazione CORI e relativo gruppo sull''esercizio '||aEsDest||'. Lock tabella TIPO_CR_BASE';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	for	aTiCR in (select * from TIPO_CR_BASE
			  	  where esercizio = aEsOrig) loop
		begin
			 insert into TIPO_CR_BASE (ESERCIZIO,
						   CD_CONTRIBUTO_RITENUTA,
						   CD_GRUPPO_CR,
						   DACR,
						   UTCR,
						   DUVA,
						   UTUV,
						   PG_VER_REC)
			 values (aEsDest,
			 	aTiCR.CD_CONTRIBUTO_RITENUTA,
			 	aTiCR.CD_GRUPPO_CR,
				sysdate,
				cgUtente,
				sysdate,
				cgUtente,
				1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Contributo ritenuta '||aTiCR.CD_CONTRIBUTO_RITENUTA||' già definito per esercizio '||aEsDest,'','');
			aStato := 'W';
		end;
	end loop;

	-- Ribaltamento archivio per liquidazione stipendi
	aMessage := 'Ribaltamento archivio per liquidazione stipendi sull''esercizio '||aEsDest||'. Lock tabella STIPENDI_COFI';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	For	i In 1..15 Loop
		begin
			 insert into STIPENDI_COFI  (ESERCIZIO,
						     MESE,
						     STATO,
						     DACR,
						     UTCR,
						     DUVA,
						     UTUV,
						     PG_VER_REC)
			 values (aEsDest,
			 	 i,
				 'I',
				 sysdate,
				 cgUtente,
				 sysdate,
				 cgUtente,
				 1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Mese '||i||' già definito per esercizio '||aEsDest,'','');
			aStato := 'W';
		end;
	End Loop;

	-- Ribaltamento informazioni relative alla regione per liquidazione CORI stipendiali
	aMessage := 'Ribaltamento informazioni relative alla regione per liquidazione CORI stipendiali sull''esercizio '||aEsDest||'. Lock tabella STIPENDI_COFI_CORI_REG';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	for	aStip in (select * from STIPENDI_COFI_CORI_REG
			  	  where esercizio = aEsOrig) loop
		begin
			 insert into STIPENDI_COFI_CORI_REG (ESERCIZIO,
							     CD_CONTRIBUTO_RITENUTA,
							     TI_ENTE_PERCIPIENTE,
							     CD_REGIONE,
							     DACR,
							     UTCR,
							     DUVA,
							     UTUV,
							     PG_VER_REC)
			 values (aEsDest,
			 	aStip.CD_CONTRIBUTO_RITENUTA,
				aStip.TI_ENTE_PERCIPIENTE,
				aStip.CD_REGIONE,
				sysdate,
				cgUtente,
				sysdate,
				cgUtente,
				1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'Contributo ritenuta '||aStip.CD_CONTRIBUTO_RITENUTA||' di tipo '||aStip.TI_ENTE_PERCIPIENTE||' già definito per esercizio '||aEsDest,'','');
			aStato := 'W';
		end;
	end loop;
End;
----------------------------------------------------------------------------
procedure ribaltaCORI_pdgp(aEsDest number, aEsOrig number, aPgEsec number, aStato in out char, aMessage in out varchar2) is
begin

	-- Ribaltamento associazioni tipo cori ed EV
	aMessage := 'Ribaltamento associazioni tipo cori ed EV sull''esercizio '||aEsDest||'. Lock tabella ASS_TIPO_CORI_EV';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	for aAssCoriEV in (select * from ASS_TIPO_CORI_EV
			 	 where esercizio = aEsOrig) loop
		begin
			 insert into ASS_TIPO_CORI_EV(
					ESERCIZIO,
					TI_APPARTENENZA,
					TI_GESTIONE,
					TI_ENTE_PERCEPIENTE,
					CD_CONTRIBUTO_RITENUTA,
					CD_ELEMENTO_VOCE,
					UTCR,
					DACR,
					UTUV,
					DUVA,
					PG_VER_REC)
			 values (aEsDest,
			 		 aAssCoriEV.TI_APPARTENENZA,
					 aAssCoriEV.TI_GESTIONE,
					 aAssCoriEV.TI_ENTE_PERCEPIENTE,
					 aAssCoriEV.CD_CONTRIBUTO_RITENUTA,
					 aAssCoriEV.CD_ELEMENTO_VOCE,
					 cgUtente,
					 sysdate,
					 cgUtente,
					 sysdate,
					 1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'ASS_TIPO_CORI_EV con PK ('||aEsDest||', '
					||aAssCoriEV.TI_APPARTENENZA||', '
					||aAssCoriEV.TI_GESTIONE||', '
					||aAssCoriEV.TI_ENTE_PERCEPIENTE||', '
					||aAssCoriEV.CD_CONTRIBUTO_RITENUTA||') già inserita','','');
			aStato := 'W';
		end;
	end loop;

	-- Ribaltamento associazione tipo cori e conto EP
	aMessage := 'Ribaltamento associazione tipo cori e conto EP sull''esercizio '||aEsDest||'. Lock tabella ASS_TIPO_CORI_VOCE_EP';
	ibmutl200.loginf(aPgEsec,aMessage,'','');
	for aAssCoriEP in (select * from ASS_TIPO_CORI_VOCE_EP
			 	 where esercizio = aEsOrig) loop
		begin
			 insert into ASS_TIPO_CORI_VOCE_EP (ESERCIZIO,
							    CD_CONTRIBUTO_RITENUTA,
								TI_ENTE_PERCEPIENTE,
								SEZIONE,
								CD_VOCE_EP,
								CD_VOCE_EP_CONTR,
								DACR,
								UTCR,
								DUVA,
								UTUV,
								PG_VER_REC)
			 values (aEsDest,
			 		 aAssCoriEP.CD_CONTRIBUTO_RITENUTA,
			 		 aAssCoriEP.TI_ENTE_PERCEPIENTE,
			 		 aAssCoriEP.SEZIONE,
			 		 aAssCoriEP.CD_VOCE_EP,
			 		 aAssCoriEP.CD_VOCE_EP_CONTR,
					 sysdate,
					 cgUtente,
					 sysdate,
					 cgUtente,
					 1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'ASS_TIPO_CORI_VOCE_EP con PK ('||aEsDest||','
					||aAssCoriEP.CD_CONTRIBUTO_RITENUTA||','
					||aAssCoriEP.TI_ENTE_PERCEPIENTE||','
					||aAssCoriEP.SEZIONE||' già inserita','','');
			aStato := 'W';
		end;
	end loop;

end;
----------------------------------------------------------------------------
procedure ribaltaINTRASTAT(aEsDest number, aEsOrig number, aPgEsec number, aStato in out char, aMessage in out varchar2) is
   id   number:=0;
begin
	-- Ribaltamento NATURA_TRANSAZIONE
	lock table NATURA_TRANSAZIONE in exclusive mode nowait;
	aMessage := 'Ribaltamento NATURA_TRANSAZIONE sull''esercizio '||aEsDest||'. Lock tabella NATURA_TRANSAZIONE';
	ibmutl200.loginf(aPgEsec,aMessage,'','');

	select max(id_natura_transazione)
	into id
	from NATURA_TRANSAZIONE;

	for aNaturaTransazione in (select * from NATURA_TRANSAZIONE
			 	 where esercizio = aEsOrig
			 	 order by id_natura_transazione) loop
		begin
			 id:=id+1;
			 insert into NATURA_TRANSAZIONE(
					ID_NATURA_TRANSAZIONE,
          ESERCIZIO,
          CD_NATURA_TRANSAZIONE,
          CD_OPER_TRIANGOLARE,
          DS_NATURA_TRANSAZIONE,
          DACR,
          UTCR,
          DUVA,
          UTUV,
          PG_VER_REC)
			 values (id,
			         aEsDest,
               aNaturaTransazione.CD_NATURA_TRANSAZIONE,
               aNaturaTransazione.CD_OPER_TRIANGOLARE,
               aNaturaTransazione.DS_NATURA_TRANSAZIONE,
					     sysdate,
					     cgUtente,
					     sysdate,
					     cgUtente,
					     1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'NATURA_TRANSAZIONE con PK ('||id||') già inserita','','');
			aStato := 'W';
		end;
	end loop;
	-- Ribaltamento MODALITA_TRASPORTO
	aMessage := 'Ribaltamento MODALITA_TRASPORTO sull''esercizio '||aEsDest||'. Lock tabella MODALITA_TRASPORTO';
	ibmutl200.loginf(aPgEsec,aMessage,'','');

	for aModalitaTrasporto in (select * from MODALITA_TRASPORTO
			 	 where esercizio = aEsOrig) loop
		begin
			 insert into MODALITA_TRASPORTO(
					ESERCIZIO,
					CD_MODALITA_TRASPORTO,
					DS_MODALITA_TRASPORTO,
          DACR,
          UTCR,
          DUVA,
          UTUV,
          PG_VER_REC)
			 values (aEsDest,
			 		     aModalitaTrasporto.CD_MODALITA_TRASPORTO,
					     aModalitaTrasporto.DS_MODALITA_TRASPORTO,
					     sysdate,
					     cgUtente,
					     sysdate,
					     cgUtente,
					     1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'MODALITA_TRASPORTO con PK ('||aEsDest||', '
					||aModalitaTrasporto.CD_MODALITA_TRASPORTO||') già inserita','','');
			aStato := 'W';
		end;
	end loop;
	-- Ribaltamento CONDIZIONE_CONSEGNA
	aMessage := 'Ribaltamento CONDIZIONE_CONSEGNA sull''esercizio '||aEsDest||'. Lock tabella CONDIZIONE_CONSEGNA';
	ibmutl200.loginf(aPgEsec,aMessage,'','');

	for aCondizioneConsegna in (select * from CONDIZIONE_CONSEGNA
			 	 where esercizio = aEsOrig) loop
		begin
			 insert into CONDIZIONE_CONSEGNA(
					ESERCIZIO,
					CD_INCOTERM,
					CD_GRUPPO,
					DS_CONDIZIONE_CONSEGNA,
          DACR,
          UTCR,
          DUVA,
          UTUV,
          PG_VER_REC)
			 values (aEsDest,
			 		     aCondizioneConsegna.CD_INCOTERM,
					     aCondizioneConsegna.CD_GRUPPO,
					     aCondizioneConsegna.DS_CONDIZIONE_CONSEGNA,
					     sysdate,
					     cgUtente,
					     sysdate,
					     cgUtente,
					     1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'CONDIZIONE_CONSEGNA con PK ('||aEsDest||', '
					||aCondizioneConsegna.CD_INCOTERM||') già inserita','','');
			aStato := 'W';
		end;
	end loop;
	-- Ribaltamento NOMENCLATURA_COMBINATA
	lock table NOMENCLATURA_COMBINATA in exclusive mode nowait;
	aMessage := 'Ribaltamento NOMENCLATURA_COMBINATA sull''esercizio '||aEsDest||'. Lock tabella NOMENCLATURA_COMBINATA';
	ibmutl200.loginf(aPgEsec,aMessage,'','');

	select max(id_nomenclatura_combinata)
	into id
	from NOMENCLATURA_COMBINATA;

	for aNomenclatura in (select * from NOMENCLATURA_COMBINATA
			 	 where esercizio = aEsOrig
			 	   and esercizio_fine >= aEsDest
			 	 order by id_nomenclatura_combinata) loop
		begin
			 id:=id+1;
			 insert into NOMENCLATURA_COMBINATA(
					ID_NOMENCLATURA_COMBINATA,
					ESERCIZIO,
					CD_NOMENCLATURA_COMBINATA,
					DS_NOMENCLATURA_COMBINATA,
					LIVELLO,
					DACR,
					UTCR,
					DUVA,
					UTUV,
					PG_VER_REC,
					ESERCIZIO_INIZIO,
					ESERCIZIO_FINE,
          UNITA_SUPPLEMENTARI)
			 values (id,
					     aEsDest,
					     aNomenclatura.CD_NOMENCLATURA_COMBINATA,
					     aNomenclatura.DS_NOMENCLATURA_COMBINATA,
					     aNomenclatura.LIVELLO,
					     sysdate,
					     cgUtente,
					     sysdate,
					     cgUtente,
					     1,
					     aNomenclatura.ESERCIZIO_INIZIO,
					     aNomenclatura.ESERCIZIO_FINE,
               aNomenclatura.UNITA_SUPPLEMENTARI);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'NOMENCLATURA_COMBINATA con PK ('||id||') già inserita','','');
			aStato := 'W';
		end;
	end loop;
	-- Ribaltamento MODALITA_EROGAZIONE
	aMessage := 'Ribaltamento MODALITA_EROGAZIONE sull''esercizio '||aEsDest||'. Lock tabella MODALITA_EROGAZIONE';
	ibmutl200.loginf(aPgEsec,aMessage,'','');

	for aModalitaErogazione in (select * from MODALITA_EROGAZIONE
			 	 where esercizio = aEsOrig) loop
		begin
			 insert into MODALITA_EROGAZIONE(
					ESERCIZIO,
					CD_MODALITA_EROGAZIONE,
					DS_MODALITA_EROGAZIONE,
          DACR,
          UTCR,
          DUVA,
          UTUV,
          PG_VER_REC)
			 values (aEsDest,
			 		     aModalitaErogazione.CD_MODALITA_EROGAZIONE,
					     aModalitaErogazione.DS_MODALITA_EROGAZIONE,
					     sysdate,
					     cgUtente,
					     sysdate,
					     cgUtente,
					     1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'MODALITA_EROGAZIONE con PK ('||aEsDest||', '
					||aModalitaErogazione.CD_MODALITA_EROGAZIONE||') già inserita','','');
			aStato := 'W';
		end;
	end loop;
	-- Ribaltamento MODALITA_INCASSO
	aMessage := 'Ribaltamento MODALITA_INCASSO sull''esercizio '||aEsDest||'. Lock tabella MODALITA_INCASSO';
	ibmutl200.loginf(aPgEsec,aMessage,'','');

	for aModalitaIncasso in (select * from MODALITA_INCASSO
			 	 where esercizio = aEsOrig) loop
		begin
			 insert into MODALITA_INCASSO(
					ESERCIZIO,
					CD_MODALITA_INCASSO,
					DS_MODALITA_INCASSO,
          DACR,
          UTCR,
          DUVA,
          UTUV,
          PG_VER_REC)
			 values (aEsDest,
			 		     aModalitaIncasso.CD_MODALITA_INCASSO,
					     aModalitaIncasso.DS_MODALITA_INCASSO,
					     sysdate,
					     cgUtente,
					     sysdate,
					     cgUtente,
					     1);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'MODALITA_INCASSO con PK ('||aEsDest||', '
					||aModalitaIncasso.CD_MODALITA_INCASSO||') già inserita','','');
			aStato := 'W';
		end;
	end loop;
	-- Ribaltamento CODICI_CPA
	lock table CODICI_CPA in exclusive mode nowait;
	aMessage := 'Ribaltamento CODICI_CPA sull''esercizio '||aEsDest||'. Lock tabella CODICI_CPA';
	ibmutl200.loginf(aPgEsec,aMessage,'','');

	select max(id_cpa)
	into id
	from CODICI_CPA;

	for aCodiciCPA in (select * from CODICI_CPA
			 	 where esercizio = aEsOrig
			 	 order by id_cpa) loop
		begin
			 id:=id+1;
			 insert into CODICI_CPA(
					ID_CPA,
					ESERCIZIO,
					CD_CPA,
					DS_CPA,
					LIVELLO,
					DACR,
					UTCR,
					DUVA,
					UTUV,
					PG_VER_REC,
					TI_BENE_SERVIZIO,
					FL_UTILIZZABILE)
			 values (id,
					     aEsDest,
					     aCodiciCPA.CD_CPA,
					     aCodiciCPA.DS_CPA,
					     aCodiciCPA.LIVELLO,
					     sysdate,
					     cgUtente,
					     sysdate,
					     cgUtente,
					     1,
					     aCodiciCPA.TI_BENE_SERVIZIO,
					     aCodiciCPA.FL_UTILIZZABILE);
		exception when DUP_VAL_ON_INDEX then
			ibmutl200.LOGWAR(aPgEsec,'CODICI_CPA con PK ('||id||') già inserito','','');
			aStato := 'W';
		end;
	end loop;
end;
----------------------------------------------------------------------------
procedure ribaltaLimitiSpesa(aEsDest number, aEsOrig number, aPgEsec number, aStato in out char, aMessage in out varchar2) is
parent_key_not_found exception;
pragma exception_init(parent_key_not_found,-2291);
begin
  -- Ribaltamento tabella LIMITE_SPESA
	aMessage := 'Ribaltamento dei limiti di spesa sull''esercizio '||aEsDest||'. Lock tabella LIMITE_SPESA';
	ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	for aLimitiSpesa in (select * from LIMITE_SPESA
			 	               where esercizio = aEsOrig) loop
			--inserimento testata
		  begin
			  insert into LIMITE_SPESA  (ESERCIZIO,
                                   TI_APPARTENENZA,
                                   TI_GESTIONE,
                                   CD_ELEMENTO_VOCE,
                                   FONTE,
                                   IMPORTO_LIMITE,
                                   IMPORTO_ASSEGNATO,
                                   UTCR,
                                   DACR,
                                   UTUV,
                                   DUVA,
                                   PG_VER_REC,
                                   ESERCIZIO_VOCE)
			  values (aEsDest,
				        aLimitiSpesa.TI_APPARTENENZA,
                aLimitiSpesa.TI_GESTIONE,
                aLimitiSpesa.CD_ELEMENTO_VOCE,
                aLimitiSpesa.FONTE,
                0,
                0,
				        cgUtente,
				        sysdate,
				        cgUtente,
				        sysdate,
				        1,
				        aEsDest);
		  exception when DUP_VAL_ON_INDEX then
			  ibmutl200.LOGWAR(aPgEsec,'LIMITE_SPESA con PK('||aEsDest||', '
					||aLimitiSpesa.TI_APPARTENENZA||', '
					||aLimitiSpesa.TI_GESTIONE||', '
					||aLimitiSpesa.CD_ELEMENTO_VOCE||', '
					||aLimitiSpesa.FONTE||') già esistente','','');
			  aStato := 'W';
		  end;
		  --inserimento dettagli
      aMessage := 'Creazione dei limiti di spesa nell''esercizio contabile '||aEsDest||' per i CDS. Lock tabelle LIMITE_SPESA_DET.';
	    ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	    -- ciclo sui cds validi nel corso dell'esercizio di destinazione
	    for aCds in (select * from v_unita_organizzativa_valida
	          		 	 where fl_cds    = 'Y'
	         			     and esercizio = aEsDest
	       		   	     and cd_unita_organizzativa <> '999') loop
	       	begin
	       		 aMessage := 'Inserimento limiti di spesa per CdS: '||aCds.cd_unita_organizzativa;
	       		 ibmutl200.LOGINF(aPgEsec,aMessage,'','');
	       		 insert into LIMITE_SPESA_DET (ESERCIZIO,
                                            CD_CDS,
                                            TI_APPARTENENZA,
                                            TI_GESTIONE,
                                            CD_ELEMENTO_VOCE,
                                            FONTE,
                                            IMPORTO_LIMITE,
                                            IMPEGNI_ASSUNTI,
                                            UTCR,
                                            DACR,
                                            UTUV,
                                            DUVA,
                                            PG_VER_REC,
                                            IMPORTO_INIZIALE,
                                            ESERCIZIO_VOCE)
              values (aEsDest,
                      aCds.cd_unita_organizzativa,
				              aLimitiSpesa.TI_APPARTENENZA,
                      aLimitiSpesa.TI_GESTIONE,
                      aLimitiSpesa.CD_ELEMENTO_VOCE,
                      aLimitiSpesa.FONTE,
                      0,
                      0,
				              cgUtente,
				              sysdate,
				              cgUtente,
				              sysdate,
				              1,
				              0,
				              aEsDest);
		      exception when DUP_VAL_ON_INDEX then
			         ibmutl200.LOGWAR(aPgEsec,'LIMITI_SPESA con PK('||aEsDest||', '
				       	||aCds.cd_unita_organizzativa||', '
				       	||aLimitiSpesa.TI_APPARTENENZA||', '
				       	||aLimitiSpesa.TI_GESTIONE||', '
				       	||aLimitiSpesa.CD_ELEMENTO_VOCE||', '
				       	||aLimitiSpesa.FONTE||') già esistente','','');
			         aStato := 'W';
	       	end;
	    end loop; -- fine ciclo sui cds
	end loop;  -- fine ciclo aLimitiSpesa

end;

procedure INSERIMENTO_PROGETTI(aEs number, pg_exec number) as
aEsPrec         number;
aMessage varchar2(500);
aUser varchar2(20);
BEGIN
    aEsPrec := aEs - 1;
     aUser:=IBMUTL200.getUserFromLog(pg_exec);

    INSERT INTO PROGETTO_SIP
        (ESERCIZIO, PG_PROGETTO, TIPO_FASE, ESERCIZIO_PROGETTO_PADRE, PG_PROGETTO_PADRE, TIPO_FASE_PROGETTO_PADRE, CD_PROGETTO, DS_PROGETTO,
        CD_TIPO_PROGETTO, CD_UNITA_ORGANIZZATIVA, CD_RESPONSABILE_TERZO, DT_INIZIO, DT_FINE, DT_PROROGA, IMPORTO_PROGETTO, IMPORTO_DIVISA,
        CD_DIVISA, NOTE, STATO, CONDIVISO, DURATA_PROGETTO, LIVELLO, CD_DIPARTIMENTO, FL_PIANO_TRIENNALE, FL_UTILIZZABILE,
        CD_PROGRAMMA, CD_MISSIONE, PG_PROGETTO_OTHER_FIELD, DACR, UTCR, DUVA, UTUV, PG_VER_REC)
        SELECT aEs, PG_PROGETTO, TIPO_FASE, aEs, PG_PROGETTO_PADRE, TIPO_FASE_PROGETTO_PADRE, CD_PROGETTO, DS_PROGETTO,
        CD_TIPO_PROGETTO, CD_UNITA_ORGANIZZATIVA, CD_RESPONSABILE_TERZO, DT_INIZIO, DT_FINE, DT_PROROGA, IMPORTO_PROGETTO, IMPORTO_DIVISA,
        CD_DIVISA, NOTE, STATO, CONDIVISO, DURATA_PROGETTO, LIVELLO, CD_DIPARTIMENTO, FL_PIANO_TRIENNALE, FL_UTILIZZABILE,
        CD_PROGRAMMA, CD_MISSIONE, PG_PROGETTO_OTHER_FIELD, TRUNC(SYSDATE), aUser, TRUNC(SYSDATE), aUser, 1
        FROM PROGETTO_SIP
        WHERE ESERCIZIO = aEsPrec
        AND LIVELLO = 1
        AND (PG_PROGETTO, TIPO_FASE) NOT IN
        (SELECT PG_PROGETTO, TIPO_FASE FROM PROGETTO_SIP WHERE ESERCIZIO = aEs);

    INSERT INTO PROGETTO_SIP
        (ESERCIZIO, PG_PROGETTO, TIPO_FASE, ESERCIZIO_PROGETTO_PADRE, PG_PROGETTO_PADRE, TIPO_FASE_PROGETTO_PADRE, CD_PROGETTO, DS_PROGETTO,
        CD_TIPO_PROGETTO, CD_UNITA_ORGANIZZATIVA, CD_RESPONSABILE_TERZO, DT_INIZIO, DT_FINE, DT_PROROGA, IMPORTO_PROGETTO, IMPORTO_DIVISA,
        CD_DIVISA, NOTE, STATO, CONDIVISO, DURATA_PROGETTO, LIVELLO, CD_DIPARTIMENTO, FL_PIANO_TRIENNALE, FL_UTILIZZABILE,
        CD_PROGRAMMA, CD_MISSIONE, PG_PROGETTO_OTHER_FIELD, DACR, UTCR, DUVA, UTUV, PG_VER_REC)
        SELECT aEs, PG_PROGETTO, TIPO_FASE, aEs, PG_PROGETTO_PADRE, TIPO_FASE_PROGETTO_PADRE, CD_PROGETTO, DS_PROGETTO,
        CD_TIPO_PROGETTO, CD_UNITA_ORGANIZZATIVA, CD_RESPONSABILE_TERZO, DT_INIZIO, DT_FINE, DT_PROROGA, IMPORTO_PROGETTO, IMPORTO_DIVISA,
        CD_DIVISA, NOTE, STATO, CONDIVISO, DURATA_PROGETTO, LIVELLO, CD_DIPARTIMENTO, FL_PIANO_TRIENNALE, FL_UTILIZZABILE,
        CD_PROGRAMMA, CD_MISSIONE, PG_PROGETTO_OTHER_FIELD, TRUNC(SYSDATE), aUser, TRUNC(SYSDATE), aUser, 1
        FROM PROGETTO_SIP
        WHERE ESERCIZIO = aEsPrec
        AND LIVELLO = 2
        AND (PG_PROGETTO, TIPO_FASE) NOT IN
        (SELECT PG_PROGETTO, TIPO_FASE FROM PROGETTO_SIP WHERE ESERCIZIO = aEs);

    INSERT INTO PROGETTO_SIP
        (ESERCIZIO, PG_PROGETTO, TIPO_FASE, ESERCIZIO_PROGETTO_PADRE, PG_PROGETTO_PADRE, TIPO_FASE_PROGETTO_PADRE, CD_PROGETTO, DS_PROGETTO,
        CD_TIPO_PROGETTO, CD_UNITA_ORGANIZZATIVA, CD_RESPONSABILE_TERZO, DT_INIZIO, DT_FINE, DT_PROROGA, IMPORTO_PROGETTO, IMPORTO_DIVISA,
        CD_DIVISA, NOTE, STATO, CONDIVISO, DURATA_PROGETTO, LIVELLO, CD_DIPARTIMENTO, FL_PIANO_TRIENNALE, FL_UTILIZZABILE,
        CD_PROGRAMMA, CD_MISSIONE, PG_PROGETTO_OTHER_FIELD, DACR, UTCR, DUVA, UTUV, PG_VER_REC)
        SELECT aEs, PG_PROGETTO, TIPO_FASE, aEs, PG_PROGETTO_PADRE, TIPO_FASE_PROGETTO_PADRE, CD_PROGETTO, DS_PROGETTO,
        CD_TIPO_PROGETTO, CD_UNITA_ORGANIZZATIVA, CD_RESPONSABILE_TERZO, DT_INIZIO, DT_FINE, DT_PROROGA, IMPORTO_PROGETTO, IMPORTO_DIVISA,
        CD_DIVISA, NOTE, STATO, CONDIVISO, DURATA_PROGETTO, LIVELLO, CD_DIPARTIMENTO, FL_PIANO_TRIENNALE, FL_UTILIZZABILE,
        CD_PROGRAMMA, CD_MISSIONE, PG_PROGETTO_OTHER_FIELD, TRUNC(SYSDATE), aUser, TRUNC(SYSDATE), aUser, 1
        FROM PROGETTO_SIP
        WHERE ESERCIZIO = aEsPrec
        AND LIVELLO = 3
        AND (PG_PROGETTO, TIPO_FASE) NOT IN
        (SELECT PG_PROGETTO, TIPO_FASE FROM PROGETTO_SIP WHERE ESERCIZIO = aEs);
    aMessage := 'Aggiornamento  progetti. Inseriti ';
    ibmutl200.LOGINF(pg_exec,aMessage,'','');
end;

procedure AGGIORMENTO_PROGETTI(aEs number, pg_exec number) as
   aTSNow date;
   aUser varchar2(20);
   aMessage varchar2(500);
   P_INDEX NUMBER := 0;
   CONTA_INS NUMBER := 0;
begin
   aTSNow:=sysdate;
   aUser:=IBMUTL200.getUserFromLog(pg_exec);

   --Inserisco sui progetti le voci di bilancio nuove create associate ai piani economici e che prevedono l'inserimento automatico e non manuale
   INSERT INTO ASS_PROGETTO_PIAECO_VOCE
      (PG_PROGETTO, CD_UNITA_ORGANIZZATIVA, CD_VOCE_PIANO, ESERCIZIO_PIANO, ESERCIZIO_VOCE, TI_APPARTENENZA, TI_GESTIONE, CD_ELEMENTO_VOCE, DACR, UTCR, DUVA, UTUV, PG_VER_REC)
   SELECT A.PG_PROGETTO, B.CD_UNITA_PIANO, B.CD_VOCE_PIANO, A.ESERCIZIO_PIANO,
          B.ESERCIZIO, B.TI_APPARTENENZA, B.TI_GESTIONE, B.CD_ELEMENTO_VOCE, aTSNow, aUser, aTSNow, aUser, 0
   FROM PROGETTO_PIANO_ECONOMICO A, ELEMENTO_VOCE B, VOCE_PIANO_ECONOMICO_PRG C
   WHERE A.CD_UNITA_ORGANIZZATIVA = C.CD_UNITA_ORGANIZZATIVA
   AND   A.CD_VOCE_PIANO = C.CD_VOCE_PIANO
   AND   B.CD_UNITA_PIANO = C.CD_UNITA_ORGANIZZATIVA
   AND   B.CD_VOCE_PIANO = C.CD_VOCE_PIANO
   AND   A.ESERCIZIO_PIANO = B.ESERCIZIO
   AND   C.FL_ADD_VOCIBIL = 'N'
   AND   A.ESERCIZIO_PIANO = aEs
   AND   NOT EXISTS(SELECT 1 FROM ASS_PROGETTO_PIAECO_VOCE D
                    WHERE D.PG_PROGETTO = A.PG_PROGETTO
                    AND   D.CD_UNITA_ORGANIZZATIVA = A.CD_UNITA_ORGANIZZATIVA
                    AND   D.CD_VOCE_PIANO = A.CD_VOCE_PIANO
                    AND   D.ESERCIZIO_PIANO = A.ESERCIZIO_PIANO);

   aMessage := 'Aggiornamento voci su piano economico progetti. Inseriti '||sql%rowcount||' record.';
   ibmutl200.LOGINF(pg_exec,aMessage,'','');

   --Inserisco sulle rimodulazioni dei progetti le voci di bilancio nuove create associate ai piani economici e che prevedono l'inserimento automatico e non manuale
   FOR REC IN (SELECT DISTINCT A.PG_PROGETTO, A.PG_RIMODULAZIONE, B.CD_UNITA_PIANO, B.CD_VOCE_PIANO, A.ESERCIZIO_PIANO
               FROM PROGETTO_RIMODULAZIONE_PPE A, PROGETTO_RIMODULAZIONE PR, ELEMENTO_VOCE B, VOCE_PIANO_ECONOMICO_PRG C
               WHERE A.CD_UNITA_ORGANIZZATIVA = C.CD_UNITA_ORGANIZZATIVA
               AND   A.CD_VOCE_PIANO = C.CD_VOCE_PIANO
               AND   B.CD_UNITA_PIANO = C.CD_UNITA_ORGANIZZATIVA
               AND   B.CD_VOCE_PIANO = C.CD_VOCE_PIANO
               AND   A.ESERCIZIO_PIANO = B.ESERCIZIO
               AND   C.FL_ADD_VOCIBIL = 'N'
               AND   A.PG_PROGETTO = PR.PG_PROGETTO
               AND   A.PG_RIMODULAZIONE = PR.PG_RIMODULAZIONE
               AND   PR.STATO NOT IN ('A', 'R')
               AND   A.ESERCIZIO_PIANO = aEs
               AND   (A.IM_VAR_SPESA_FINANZIATO > 0 OR A.IM_VAR_SPESA_COFINANZIATO > 0 OR A.IM_STOASS_SPESA_FINANZIATO > 0 OR A.IM_STOASS_SPESA_COFINANZIATO > 0)
               AND   NOT EXISTS(SELECT 1 FROM PROGETTO_RIMODULAZIONE_VOCE D
                                WHERE D.PG_PROGETTO = A.PG_PROGETTO
                                AND   D.PG_RIMODULAZIONE = A.PG_RIMODULAZIONE
                                AND   D.CD_UNITA_ORGANIZZATIVA = A.CD_UNITA_ORGANIZZATIVA
                                AND   D.CD_VOCE_PIANO = A.CD_VOCE_PIANO
                                AND   D.ESERCIZIO_PIANO = A.ESERCIZIO_PIANO)
               AND   NOT EXISTS(SELECT 1 FROM ASS_PROGETTO_PIAECO_VOCE E
                                WHERE E.PG_PROGETTO = A.PG_PROGETTO
                                AND   E.CD_UNITA_ORGANIZZATIVA = A.CD_UNITA_ORGANIZZATIVA
                                AND   E.CD_VOCE_PIANO = A.CD_VOCE_PIANO
                                AND   E.ESERCIZIO_PIANO = A.ESERCIZIO_PIANO)) LOOP

       P_INDEX := 0;

       FOR DET IN (SELECT A.PG_PROGETTO, A.PG_RIMODULAZIONE, B.CD_UNITA_PIANO, B.CD_VOCE_PIANO, A.ESERCIZIO_PIANO,
       	               B.ESERCIZIO, B.TI_APPARTENENZA, B.TI_GESTIONE, B.CD_ELEMENTO_VOCE
                   FROM PROGETTO_RIMODULAZIONE_PPE A, PROGETTO_RIMODULAZIONE PR, ELEMENTO_VOCE B, VOCE_PIANO_ECONOMICO_PRG C
                   WHERE A.CD_UNITA_ORGANIZZATIVA = C.CD_UNITA_ORGANIZZATIVA
                   AND   A.CD_VOCE_PIANO = C.CD_VOCE_PIANO
                   AND   B.CD_UNITA_PIANO = C.CD_UNITA_ORGANIZZATIVA
                   AND   B.CD_VOCE_PIANO = C.CD_VOCE_PIANO
                   AND   A.ESERCIZIO_PIANO = B.ESERCIZIO
                   AND   C.FL_ADD_VOCIBIL = 'N'
                   AND   A.PG_PROGETTO = PR.PG_PROGETTO
                   AND   A.PG_RIMODULAZIONE = PR.PG_RIMODULAZIONE
                   AND   PR.STATO NOT IN ('A', 'R')
                   AND   A.ESERCIZIO_PIANO = aEs
                   AND   (A.IM_VAR_SPESA_FINANZIATO > 0 OR A.IM_VAR_SPESA_COFINANZIATO > 0 OR A.IM_STOASS_SPESA_FINANZIATO > 0 OR A.IM_STOASS_SPESA_COFINANZIATO > 0)
                   AND   NOT EXISTS(SELECT 1 FROM PROGETTO_RIMODULAZIONE_VOCE D
                                    WHERE D.PG_PROGETTO = A.PG_PROGETTO
                    				AND   D.PG_RIMODULAZIONE = A.PG_RIMODULAZIONE
                                    AND   D.CD_UNITA_ORGANIZZATIVA = A.CD_UNITA_ORGANIZZATIVA
                                    AND   D.CD_VOCE_PIANO = A.CD_VOCE_PIANO
                                    AND   D.ESERCIZIO_PIANO = A.ESERCIZIO_PIANO)
                   AND   NOT EXISTS(SELECT 1 FROM ASS_PROGETTO_PIAECO_VOCE E
                                    WHERE E.PG_PROGETTO = A.PG_PROGETTO
                                    AND   E.CD_UNITA_ORGANIZZATIVA = A.CD_UNITA_ORGANIZZATIVA
                                    AND   E.CD_VOCE_PIANO = A.CD_VOCE_PIANO
                                    AND   E.ESERCIZIO_PIANO = A.ESERCIZIO_PIANO)
                   AND   A.PG_PROGETTO = REC.PG_PROGETTO
                   AND   A.PG_RIMODULAZIONE = REC.PG_RIMODULAZIONE
                   AND   B.CD_UNITA_PIANO = REC.CD_UNITA_PIANO
                   AND   B.CD_VOCE_PIANO = REC.CD_VOCE_PIANO
                   AND   A.ESERCIZIO_PIANO = REC.ESERCIZIO_PIANO) LOOP

           P_INDEX := P_INDEX + 1;
           INSERT INTO PROGETTO_RIMODULAZIONE_VOCE
               (PG_PROGETTO, PG_RIMODULAZIONE, CD_UNITA_ORGANIZZATIVA, CD_VOCE_PIANO, ESERCIZIO_PIANO,
                PG_VARIAZIONE, ESERCIZIO_VOCE, TI_APPARTENENZA, TI_GESTIONE, CD_ELEMENTO_VOCE, TI_OPERAZIONE, IM_VAR_SPESA_FINANZIATO, IM_VAR_SPESA_COFINANZIATO, DACR, UTCR, DUVA, UTUV, PG_VER_REC)
           VALUES(DET.PG_PROGETTO, DET.PG_RIMODULAZIONE, DET.CD_UNITA_PIANO, DET.CD_VOCE_PIANO, DET.ESERCIZIO_PIANO,
                P_INDEX, DET.ESERCIZIO, DET.TI_APPARTENENZA, DET.TI_GESTIONE, DET.CD_ELEMENTO_VOCE, 'A', 0, 0,
                aTSNow, aUser, aTSNow, aUser, 0);

           CONTA_INS := CONTA_INS + SQL%ROWCOUNT;
       END LOOP;
   END LOOP;
   aMessage := 'Aggiornamento voci su rimodulazione piano economico progetti. Inseriti '||sql%rowcount||' record.';
   ibmutl200.LOGINF(pg_exec,aMessage,'','');
end;

procedure JOB_RIBALTAMENTO_PDGP(job number, pg_exec number, next_date date, aEs number) as
    aTSNow date;
    aUser varchar2(20);
    aMessage varchar2(500);
begin
    aTSNow:=sysdate;
    aUser:=IBMUTL200.getUserFromLog(pg_exec);
    lPgExec := pg_exec;

    -- Aggiorna le info di testata del log
    IBMUTL210.logStartExecutionUpd(lPgExec, TI_LOG_RIBALTAMENTO_PDGP, job, 'Batch di ribaltamento configurazione, str.organizzativa, anagrafica capitoli e piano dei conti. Start:'||to_char(aTSNow,'YYYY/MM/DD HH-MI-SS'));

	if aEs = 0 then
	   ibmutl200.logErr(lPgExec,'Esercizio zero non gestito', '', '');
	else
	   insert into numerazione_base (ESERCIZIO, COLONNA, TABELLA, CD_CORRENTE, CD_MASSIMO, DUVA, UTUV, DACR, UTCR, PG_VER_REC, CD_INIZIALE )
	   (select aEs, COLONNA, TABELLA, 0, CD_MASSIMO, aTSNow, aUser, aTSNow, aUser, 1, CD_INIZIALE
	    FROM numerazione_base
	    WHERE Esercizio = aEs - 1
	    AND TABELLA IN ('VAR_STANZ_RES' , 'VAR_STANZ_RES$'));

	   INIT_RIBALTAMENTO_pdgp(aEs,pg_exec,aMessage);
	   AGGIORMENTO_PROGETTI(aEs,pg_exec);

       ibmutl200.logInf(pg_exec,aMessage, '', '');
       ibmutl200.logInf(pg_exec,'Batch di ribaltamento configurazione, str.organizzativa, anagrafica capitoli e piano dei conti.', 'End:'||to_char(sysdate,'YYYY/MM/DD HH-MI-SS'), '');
    end if;
 end;
----------------------------------------------------------------------------

procedure JOB_RIBALTAMENTO_ALTRO_PDGP(job number, pg_exec number, next_date date, aEs number) as
    aTSNow date;
    aUser varchar2(20);
    aMessage varchar2(500);
begin
    aTSNow:=sysdate;
    aUser:=IBMUTL200.getUserFromLog(pg_exec);
    lPgExec := pg_exec;

    -- Aggiorna le info di testata del log
    IBMUTL210.logStartExecutionUpd(lPgExec, TI_LOG_RIBALTAMENTO_PDGP, job, 'Batch di ribaltamento inizio Anno. Start:'||to_char(aTSNow,'YYYY/MM/DD HH-MI-SS'));

    if aEs = 0 then
       ibmutl200.logErr(lPgExec,'Esercizio zero non gestito', '', '');
    else
       init_ribaltamento_altro( aEs,pg_exec,aMessage);
       ibmutl200.logInf(pg_exec,aMessage, '', '');
       ibmutl200.logInf(pg_exec,'Batch  di ribaltamento inizio Anno.', 'End:'||to_char(sysdate,'YYYY/MM/DD HH-MI-SS'), '');
    end if;
 end;
 ----------------------------------------------------------------------------
 end;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy