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

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

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

  CREATE OR REPLACE PACKAGE BODY "CNRCTB206" is

 -- Verifica che l'esercizio finanziario sia chiuso per tutti i CDS
 function checkChiusuraEsFin(pg_exec number, aEs number) return boolean is
 begin
	  for aLCds in (select * from v_unita_organizzativa_valida where fl_cds = 'Y' and esercizio = aEs) loop
       -- Se l'esercizio finanziario non è chiuso per tutti i cds la modalita diventa di prova
       if not CNRCTB008.ISESERCIZIOCHIUSO(aEs,aLCds.cd_unita_organizzativa) then
        IBMUTL200.logErr(pg_exec, 'Non tutti gli esercizio finanziari sono chiusi: la modalità di esecuzione rimane in prova',null,null);
		return false;
       end if;
      end loop;
      return true;
 end;

 procedure chiusuraCogeCoanCds(pg_exec number, modalitaProva char, aEs number, aCdCds varchar2, aUser varchar2, aTSNow date) is
  aCCoep chiusura_coep%rowtype;
  aNumRigaStart number;
  aNumErr number;
  aStatoFinale CHAR(1):=CNRCTB200.STATO_PROVA_CHIUSURA;
 begin
  begin
   rollback;
   IBMUTL015.setRbsBig;

   aNumRigaStart:=1;

   if modalitaProva = 'N' then
    begin
     select nvl(pg_riga + 1,1) into aNumRigaStart from batch_log_riga where pg_esecuzione = pg_exec;
    exception when NO_DATA_FOUND then
     null;
    end;
   end if;
   -- Se l'esercizio n+1 non e aperto
   if not CNRCTB008.ISESERCIZIOAPERTO(aEs+1,aCdCds) then
    IBMERR001.RAISE_ERR_GENERICO('L''esercizio finanziario ('||(aEs+1)||') per il cds:'||aCdCds||' deve essere aperto');
   end if;

    begin
	 aCCoep:=CNRCTB200.GETCHIUSURACOEP(aEs,aCdCds);
     -- Se la chiusura COEP e gia stata fatta in prova e necessario che sia stata ANNULLATA per rieseguirla
	 if aCCoep.stato <> CNRCTB200.STATO_PROVA_ANNULLATA then
      IBMERR001.RAISE_ERR_GENERICO('Prova di chiusura o chiusura economica definitiva gia'' eseguita in esercizio finanziario ('||aEs||') per il cds:'||aCdCds||' deve essere chiuso per chiudere l''esercizio economico in modo definitivo');
	 end if;
	exception when NO_DATA_FOUND then
     -- Se si tratta della prima operazione di chiusura (definitiva o simulata) crea il record nella tabella CHIUSURA COEP
     aCCoep.CD_CDS:=aCdCds;
     aCCoep.ESERCIZIO:=aEs;
     aCCoep.STATO:=CNRCTB200.STATO_PROVA_ANNULLATA;
     aCCoep.DACR:=aTSNow;
     aCCoep.UTCR:=aUser;
     aCCoep.DUVA:=aTSNow;
     aCCoep.UTUV:=aUser;
     aCCoep.PG_VER_REC:=1;
     CNRCTB200.ins_CHIUSURA_COEP(aCCoep);
    end;
    IBMUTL015.commitRbsBig;
    Begin
     -- annulla l'eventuale Ammortamento gia' calcolato
     CNRCTB400.annullaAmmortBeniInv (pg_exec, aEs, aCdCds, aUser, aTSNow);
     IBMUTL015.commitRbsBig;
     -- Ammortamento finanziario
     IBMUTL200.logInf(pg_exec, 'START AMMORTAMENTO CDS-'||aCdCds,null,null);
     CNRCTB400.ammortamentoBeniInv (pg_exec, aEs, aCdCds, aUser, aTSNow);
     IBMUTL015.commitRbsBig;
     regAmmortamentoCOGE(modalitaProva, aEs, aCdCds, aUser, aTSNow);
     IBMUTL200.logInf(pg_exec, 'FINE REG. AMMORTAMENTO COGE CDS-'||aCdCds,null,null);
    exception when OTHERS then
Dbms_Output.PUT_LINE ('OTHERS 1');
     IBMUTL015.rollbackRbsBig;
     IBMUTL200.logErr(pg_exec, DBMS_UTILITY.FORMAT_ERROR_STACK,null,null);
    end;

    IBMUTL200.logInf(pg_exec, 'START RISCONTI P1 e P2 CDS-'||aCdCds,null,null);

    Begin

     for aDocTst in (select * from v_doc_amm_coge_tsta a
                     Where  esercizio = aEs
   		        and cd_cds_origine = aCdCds
   		        and dt_a_competenza_coge >= to_date('0101'||(aEs+1),'DDMMYYYY')
   		        and stato_coge = CNRCTB100.STATO_COEP_CON
 		     ) loop

      regRiscontiCOGE(modalitaProva, aDocTst, aUser, aTSNow);
     end loop;
     IBMUTL200.logInf(pg_exec, 'OK RISCONTI P1 e P2 CDS-'||aCdCds,null,null);
    exception when OTHERS then
Dbms_Output.PUT_LINE ('OTHERS 2');
     IBMUTL015.rollbackRbsBig;
     IBMUTL200.logErr(pg_exec, DBMS_UTILITY.FORMAT_ERROR_STACK,null,null);
    end;

    IBMUTL200.logInf(pg_exec, 'START CONTO ECON. CDS-'||aCdCds,null,null);
    begin
     chiusuraContoEconomicoCOGE(modalitaProva, aEs, aCdCds, aUser, aTSNow);
     IBMUTL200.logInf(pg_exec, 'OK CHIUSURA CONTO ECON. CDS-'||aCdCds,null,null);
    exception when OTHERS then
Dbms_Output.PUT_LINE ('OTHERS 3');
     IBMUTL015.rollbackRbsBig;
     IBMUTL200.logErr(pg_exec, DBMS_UTILITY.FORMAT_ERROR_STACK,null,null);
    end;

    IBMUTL200.logInf(pg_exec, 'START CHIUSURA STATO PATR. CDS-'||aCdCds,null,null);
    begin
     chiusuraStatoPatrimonialeCOGE(modalitaProva, aEs, aCdCds, aUser, aTSNow);
     IBMUTL200.logInf(pg_exec, 'OK CHIUSURA STATO PATR. CDS-'||aCdCds,null,null);
    exception when OTHERS then
Dbms_Output.PUT_LINE ('OTHERS 4');
     IBMUTL015.rollbackRbsBig;
     IBMUTL200.logErr(pg_exec, DBMS_UTILITY.FORMAT_ERROR_STACK,null,null);
    end;

    IBMUTL200.logInf(pg_exec, 'START RILEVAZIONE UTILE CDS-'||aCdCds,null,null);
    begin
     rilevazioneUtilePerditaCOGE(modalitaProva, aEs, aCdCds, aUser, aTSNow);
     IBMUTL200.logInf(pg_exec, 'OK RILEVAZIONE UTILE CDS-'||aCdCds,null,null);
    exception when OTHERS then
Dbms_Output.PUT_LINE ('OTHERS 5');
     IBMUTL015.rollbackRbsBig;
     IBMUTL200.logErr(pg_exec, DBMS_UTILITY.FORMAT_ERROR_STACK,null,null);
    end;

    IBMUTL200.logInf(pg_exec, 'START RIPERTURA STATO PATR. CDS-'||aCdCds,null,null);
    begin
     riaperturaStPatrimonialeCOGE(modalitaProva, aEs+1, aCdCds, aUser, aTSNow);
     IBMUTL200.logInf(pg_exec, 'OK RIPERTURA STATO PATR. CDS-'||aCdCds,null,null);
    exception when OTHERS then
Dbms_Output.PUT_LINE ('OTHERS 6');
     IBMUTL015.rollbackRbsBig;
     IBMUTL200.logErr(pg_exec, DBMS_UTILITY.FORMAT_ERROR_STACK,null,null);
    end;

    IBMUTL200.logInf(pg_exec, 'START SCRITTURA RATEI P2 CDS-'||aCdCds,null,null);

    begin
     for aDocTst in (select distinct a.*
                     From v_doc_amm_coge_tsta a, scrittura_partita_doppia
                     Where a.esercizio = aEs+1 And
                           a.cd_cds_origine = aCdCds And
                           scrittura_partita_doppia.esercizio = aEs And -- Esercizio in chiusura
 	                   scrittura_partita_doppia.cd_cds_documento  =a.cd_cds And
 			   scrittura_partita_doppia.cd_uo_documento = a.cd_unita_organizzativa And
 			   scrittura_partita_doppia.esercizio_documento_amm = a.esercizio And
 			   scrittura_partita_doppia.cd_tipo_documento  = a.cd_tipo_documento And
 			   scrittura_partita_doppia.pg_numero_documento  =a.pg_numero_documento And
 			   scrittura_partita_doppia.cd_causale_coge = CNRCTB200.CAU_RATEI) Loop
      regDocAmmRateiParte2COGE(modalitaProva, aDocTst, aUser, aTSNow);
     end loop;
     IBMUTL200.logInf(pg_exec, 'OK SCRITTURA RATEI P2 CDS-'||aCdCds,null,null);
     IBMUTL015.commitRbsBig;
Exception when OTHERS then
Dbms_Output.PUT_LINE ('OTHERS 7');
IBMUTL015.rollbackRbsBig;
IBMUTL200.logErr(pg_exec, DBMS_UTILITY.FORMAT_ERROR_STACK,null,null);
    end;

    -- Tentativo di chiusura definitiva per il cds specifico
    if modalitaProva = 'N' then
     -- Verifica che non ci siano errori nelle operazioni di chiusura
	 aNumErr:=0;
     select count(*) into aNumErr from batch_log_riga
	  where
	       pg_esecuzione = pg_exec
	   and ti_messaggio = IBMUTL200.TI_ERRORE
	   and pg_riga >= aNumRigaStart;

     begin
      if aNumErr > 0 then
       IBMERR001.RAISE_ERR_GENERICO('La chiusura del cds: '||aCdCds||' e stata effettuata in prova essendo stati sollevati errori');
 	  end if;
	  -- Verifica che non siano state effettuate altre scritture nel frattempo
	  checkChiudibilitaDef(aEs, aCdCds);
	  -- Verifica che non siano stati riaperti esercizi finanziari nel frattempo
	  if checkChiusuraEsFin(pg_exec, aEs) then
       aStatoFinale:=CNRCTB200.STATO_CHIUSURA_DEF;
	  end if;
	 exception when OTHERS then
      IBMUTL015.rollbackRbsBig;
      IBMUTL200.logErr(pg_exec, DBMS_UTILITY.FORMAT_ERROR_STACK,'Chiusura definitiva esercizio fallita per CDS:'||aCdCds,null);
     end;
	end if;
   exception when OTHERS then
Dbms_Output.PUT_LINE ('others aa');
    IBMUTL015.rollbackRbsBig;
    IBMUTL200.logErr(pg_exec, DBMS_UTILITY.FORMAT_ERROR_STACK,null,null);
  end;

  begin
   -- Aggiorna lo stato di chiusura COEP
   update chiusura_coep set
    stato = aStatoFinale,
    utuv=aUser,
    duva=aTSNow,
    pg_ver_rec=pg_ver_rec+1
   where
   	     esercizio=aEs
 	 and cd_cds=aCdCds;
   IBMUTL015.commitRbsBig;
  exception when OTHERS then
Dbms_Output.PUT_LINE ('others bb');
   IBMUTL015.rollbackRbsBig;
   IBMUTL200.logErr(pg_exec, DBMS_UTILITY.FORMAT_ERROR_STACK,null,null);
  end;
 End;

 procedure job_chiusuraCogeCoan(job number, pg_exec number, next_date date, modalitaProva char, aEs number, aCdCds varchar2) is
  aUser varchar2(20);
  aTSNow date;
  aMod varchar2(50);
  aCCoep chiusura_coep%rowtype;
  locModalitaProva char;
 begin
  rollback;
  aTSNow:=sysdate;
  IBMUTL015.setRbsBig;
  aUser:=IBMUTL200.getUserFromLog(pg_exec);

  if modalitaProva = 'Y' then
   aMod:='prova';
  else
   aMod:='definitiva';
  end if;

  -- Aggiorna le info di testata del log
  IBMUTL210.logStartExecutionUpd(pg_exec, TIPO_LOG_JOB_CHIUSURA_COGE, job, 'Batch di chiusura economica in modalita '||aMod||'. Cds: '||aCdCds||' Start:'||to_char(aTSNow,'YYYY/MM/DD HH-MI-SS'));
  if aCdCds is null then
   IBMERR001.RAISE_ERR_GENERICO('CDS non specificato');
  end if;
  -- Controlla che in modalità definitiva, l'esercizio finanziario sia chiuso per tutti i CDS
  for aCds in (select * from v_unita_organizzativa_valida where fl_cds = 'Y' and esercizio = aEs and cd_unita_organizzativa=decode(aCdCds,'*',cd_unita_organizzativa,aCdCds)) loop
   locModalitaProva:=modalitaProva;
   if modalitaProva = 'N' then
    if not checkChiusuraEsFin(pg_exec, aEs) then
        locModalitaProva:='Y';
    end if;
   end if;
   if locModalitaProva = 'N' then
    CNRCTB800.ACQUISISCISEMSTATICOCDS(aEs,aCds.cd_unita_organizzativa,CNRCTB200.SEMAFORO_CHIUSURA,aUser);
   end if;
   chiusuraCogeCoanCds(pg_exec, locModalitaProva, aEs, aCds.cd_unita_organizzativa, aUser, aTSNow);
   if locModalitaProva = 'N' then
    CNRCTB800.LIBERASEMSTATICOCDS(aEs,aCds.cd_unita_organizzativa,CNRCTB200.SEMAFORO_CHIUSURA,aUser);
   end if;
  end loop;
  IBMUTL200.logInf(pg_exec,'FINE JOB CHIUSURACOGECOAN','Termine esecuzione','Termine esecuzione');
 End;


 procedure job_annullaChiusuraCOGECOAN(job number, pg_exec number, next_date date, aEs number, aCdCds varchar2) is
  aListaMovimenti CNRCTB200.movimentiList;
  aListaMovimentiAn CNRCTB200.movAnalitList;
  aScritturaAn scrittura_analitica%rowtype;
  aScrittura scrittura_partita_doppia%rowtype;
  aUser varchar2(20);
  aTSNow date;
  aCCoep chiusura_coep%rowtype;
 begin
  rollback;
  aTSNow:=sysdate;
  aUser:=IBMUTL200.getUserFromLog(pg_exec);
  IBMUTL015.setRbsBig;

  -- Aggiorna le info di testata del log
  IBMUTL210.logStartExecutionUpd(pg_exec, TIPO_LOG_JOB_CHIUSURA_COGE, job, 'Batch di annullamento chiusura economica Cds: '||aCdCds||' Start:'||to_char(aTSNow,'YYYY/MM/DD HH-MI-SS'));

  if aCdCds is null then
   IBMERR001.RAISE_ERR_GENERICO('CDS non specificato');
  End if;

  for aCds in (select * from v_unita_organizzativa_valida where fl_cds = 'Y' and esercizio = aEs and cd_unita_organizzativa=decode(aCdCds,'*',cd_unita_organizzativa,aCdCds)) loop
   begin
    begin
	 aCCoep:=CNRCTB200.GETCHIUSURACOEP(aEs,aCds.cd_unita_organizzativa);
	 if
	        aCCoep.stato = CNRCTB200.STATO_CHIUSURA_DEF
	 then
      IBMERR001.RAISE_ERR_GENERICO('L''esercizio economico ('||aEs||') e'' chiuso definitivamente per il cds:'||aCds.cd_unita_organizzativa);
     elsif aCCoep.stato = CNRCTB200.STATO_PROVA_ANNULLATA then
      IBMERR001.RAISE_ERR_GENERICO('L''esercizio economico ('||aEs||') non e'' stato chiuso in prova per il cds:'||aCds.cd_unita_organizzativa);
     end if;
    exception when NO_DATA_FOUND then
     IBMERR001.RAISE_ERR_GENERICO('L''esercizio economico ('||aEs||') non e mai stato chiuso (definitivamente o in prova) per il cds:'||aCds.cd_unita_organizzativa);
	end;
 	-- Annullamento ammortamento finanziario
   	-- r.p. viene annullato al rilancio
   	-- CNRCTB400.annullaAmmortBeniInv (pg_exec, aEs, aCds.cd_unita_organizzativa, aUser, aTSNow);
  	--  IBMUTL015.commitRbsBig;
       -- Eliminazione scritture in esercizio che viene chiuso
    for aScr in (select * from scrittura_partita_doppia where
                      esercizio = aEs
				  and cd_cds = aCds.cd_unita_organizzativa
				  and cd_causale_coge in (
				   CNRCTB200.CAU_RISCONTI,
				   CNRCTB200.CAU_CHIUSURA_CONTO_ECONOMICO,
				   CNRCTB200.CAU_CHIUSURA_ST_PATRIMONIALE,
				   CNRCTB200.CAU_DET_UTILE_PERDITA,
				   CNRCTB200.CAU_AMMORTAMENTO
				  )
			   ) loop
      aListaMovimenti.delete;
	  aScrittura:=aScr;
      CNRCTB200.GETSCRITTURAEPLOCK(aScrittura,aListaMovimenti);
      CNRCTB200.ELIMINASCRITTCOGE(aScrittura,aListaMovimenti,aUser,aTSNow);
     end loop;
    -- Eliminazione scritture in esercizio che viene aperto
    for aScr in (select * from scrittura_partita_doppia where
                      esercizio = aEs+1
				  and cd_cds = aCds.cd_unita_organizzativa
				  and cd_causale_coge in (
				   CNRCTB200.CAU_RIAPERTURA_CONTI,
				   CNRCTB200.CAU_RATEI_P2,
				   CNRCTB200.CAU_RISCONTI_P2
				  )
			   ) loop
     aListaMovimenti.delete;
	 aScrittura:=aScr;
     CNRCTB200.GETSCRITTURAEPLOCK(aScrittura,aListaMovimenti);
     CNRCTB200.ELIMINASCRITTCOGE(aScrittura,aListaMovimenti,aUser,aTSNow);
    end loop;
    for aScr2 in (select * from scrittura_analitica where esercizio = aEs and cd_cds = aCds.cd_unita_organizzativa and origine_scrittura = CNRCTB200.ORIGINE_CHIUSURA for update nowait) loop
     aListaMovimentiAn.delete;
     aScritturaAn:=aScr2;
     CNRCTB200.GETSCRITTURAANLOCK(aScritturaAn,aListaMovimentiAn);
     CNRCTB200.ELIMINASCRITTCOAN(aScritturaAn,aListaMovimentiAn,aUser,aTSNow);
    end loop;
	update chiusura_coep set
	 stato = CNRCTB200.STATO_PROVA_ANNULLATA,
	 utuv=aUser,
	 duva=aTSNow,
	 pg_ver_rec=pg_ver_rec+1
	where
   	      esercizio=aCCoep.esercizio
	  and cd_cds=aCCoep.cd_cds;
    IBMUTL015.commitRbsBig;
   exception when others then
    IBMUTL015.rollbackRbsBig;
    IBMUTL200.logErr(pg_exec, DBMS_UTILITY.FORMAT_ERROR_STACK,null,null);
   end;
  end loop;
  IBMUTL200.logInf(pg_exec,'FINE','Termine esecuzione','Termine esecuzione');
 end;

 procedure chiusuraContoEconomicoCOGE(modalitaProva char, aEs number, aCdCds varchar2, aUser varchar2, aTSNow date) is
  aVoceEP voce_ep%rowtype;
  aVocePP voce_ep%rowtype;
  aScrittura scrittura_partita_doppia%rowtype;
  aListaMovimenti CNRCTB200.movimentiList;
 begin
  if modalitaProva is null or modalitaProva not in ('Y','N') then
   IBMERR001.RAISE_ERR_GENERICO('Modalita operazione non correttamente specificata');
  end if;

  -- L'operazione deve effettuare n-scritture che per CDS e UO girino il saldo sul conto economico di Profitti/Perdite
  for aUO in (select distinct cd_cds, cd_unita_organizzativa, cd_terzo
              From   saldo_coge
              where  esercizio =aEs and
                     cd_cds = aCdCds
              order by cd_cds, cd_unita_organizzativa, cd_terzo) loop
   aListaMovimenti.delete;
   for aSaldo in (select a.* from saldo_coge a, voce_ep b,parametri_cnr
                  Where     a.cd_voce_ep =b.cd_voce_ep
			and a.cd_cds = aUO.cd_cds
                        And a.esercizio = aEs -- stani 15.12.2004
			and a.cd_unita_organizzativa = aUO.cd_unita_organizzativa
			and a.cd_terzo = aUO.cd_terzo
			and a.esercizio = b.esercizio
			 and parametri_cnr.esercizio = A.ESERCIZIO and
        ((parametri_cnr.fl_nuovo_pdg ='Y' and  b.livello=1) or
        ( parametri_cnr.fl_nuovo_pdg='N' and b.livello=3 ) )
			and (b.natura_voce in ('EEC','EER')  or (RIEPILOGA_A ='CEC'))-- Conto di costo o di ricavo
   ) loop
    aVoceEp:=CNRCTB002.GETVOCEEP(aSaldo.esercizio,aSaldo.cd_voce_ep);
    aVocePP:=CNRCTB002.GETVOCEEPCONTOECONOMICO(aEs);
    if aSaldo.tot_dare > aSaldo.tot_avere then
	 CNRCTB204.buildMovPrinc(aSaldo.cd_cds,aSaldo.esercizio,aSaldo.cd_unita_organizzativa,aVoceEP,abs(aSaldo.tot_dare-aSaldo.tot_avere),CNRCTB200.IS_AVERE,to_date('3112'||aEs,'DDMMYYYY'),to_date('3112'||aEs,'DDMMYYYY'),0,aSaldo.ti_istituz_commerc,aListaMovimenti,aUser,aTSnow);
	 CNRCTB204.buildMovPrinc(aSaldo.cd_cds,aSaldo.esercizio,aSaldo.cd_unita_organizzativa,aVocePP,abs(aSaldo.tot_dare-aSaldo.tot_avere),CNRCTB200.IS_DARE,to_date('3112'||aEs,'DDMMYYYY'),to_date('3112'||aEs,'DDMMYYYY'),0,aSaldo.ti_istituz_commerc,aListaMovimenti,aUser,aTSnow);
    elsif aSaldo.tot_dare < aSaldo.tot_avere then
	 CNRCTB204.buildMovPrinc(aSaldo.cd_cds,aSaldo.esercizio,aSaldo.cd_unita_organizzativa,aVoceEP,abs(aSaldo.tot_dare-aSaldo.tot_avere),CNRCTB200.IS_DARE,to_date('3112'||aEs,'DDMMYYYY'),to_date('3112'||aEs,'DDMMYYYY'),0,aSaldo.ti_istituz_commerc,aListaMovimenti,aUser,aTSnow);
	 CNRCTB204.buildMovPrinc(aSaldo.cd_cds,aSaldo.esercizio,aSaldo.cd_unita_organizzativa,aVocePP,abs(aSaldo.tot_dare-aSaldo.tot_avere),CNRCTB200.IS_AVERE,to_date('3112'||aEs,'DDMMYYYY'),to_date('3112'||aEs,'DDMMYYYY'),0,aSaldo.ti_istituz_commerc,aListaMovimenti,aUser,aTSnow);
    end if;
   end loop; -- del saldo
   aScrittura:=null;
   aScrittura.CD_CDS:=aCdCds;
   aScrittura.ESERCIZIO:=aEs;
   aScrittura.CD_UNITA_ORGANIZZATIVA:=aUO.cd_unita_organizzativa;
   aScrittura.ORIGINE_SCRITTURA:=CNRCTB200.ORIGINE_CHIUSURA;
   aScrittura.CD_TIPO_DOCUMENTO:=null;
   aScrittura.CD_CAUSALE_COGE:=CNRCTB200.CAU_CHIUSURA_CONTO_ECONOMICO;
   -- La chiave del documento viene costruita per concatenazione delle componenti della chiave del buono di scarico
   aScrittura.CD_COMP_DOCUMENTO:='CDS-'||aCdCds||' UO-'||aUO.cd_unita_organizzativa;
   aScrittura.CD_CDS_DOCUMENTO:=aCdCds;
   aScrittura.CD_UO_DOCUMENTO:=aUO.cd_unita_organizzativa;
   aScrittura.PG_NUMERO_DOCUMENTO:=NULL;
   aScrittura.IM_SCRITTURA:=null; -- Impostato come totale di sezione in realizzazione della scrittura
   aScrittura.DT_CONTABILIZZAZIONE:=to_date('3112'||aEs,'DDMMYYYY');
   aScrittura.DT_PAGAMENTO:=null;
   aScrittura.DT_CANCELLAZIONE:=null;
   aScrittura.TI_SCRITTURA:=CNRCTB200.TI_SCRITTURA_SINGOLA;
   aScrittura.CD_TERZO:=aUO.cd_terzo;
   aScrittura.STATO:=CNRCTB200.STATO_DEFINITIVO;
   aScrittura.CD_DIVISA:=NULL;
   aScrittura.COSTO_PLURIENNALE:=null; -- chi lo valorizza e come non e chiaro
   aScrittura.PG_ENTE:=null; -- serve a rinumerare le scritture  livello di ENTE
   aScrittura.DS_SCRITTURA := 'Chiusura Conto Economico per CDS '||auo.cd_cds||', UO '||
                              auo.cd_unita_organizzativa||' e Terzo '||auo.cd_terzo;
   aScrittura.PG_SCRITTURA_ANNULLATA:=null; -- codice della scrittura annullata in effettuazione storno
   aScrittura.ATTIVA:='Y';
   aScrittura.ESERCIZIO_DOCUMENTO_AMM:=null;
   aScrittura.DACR:=aTSNow;
   aScrittura.UTCR:=aUser;
   -- Registro la scrittura
   CNRCTB200.CREASCRITTCOGE(aScrittura,aListaMovimenti);
  end loop; --del cds/uo/terzo
 end;

 procedure chiusuraStatoPatrimonialeCOGE(modalitaProva char, aEs number, aCdCds varchar2, aUser varchar2, aTSNow date) is
  aVoceEP voce_ep%rowtype;
  aVoceSPI voce_ep%rowtype;
  aListaScritture CNRCTB200.scrittureList;
  aScrittura scrittura_partita_doppia%rowtype;
  aListaMovimenti CNRCTB200.movimentiList;
 begin
  if modalitaProva is null or modalitaProva not in ('Y','N') then
   IBMERR001.RAISE_ERR_GENERICO('Modalita operazione non correttamente specificata');
  end if;

  -- L'operazione deve effettuare n-scritture che per CDS e UO girino il saldo sul conto economico di Profitti/Perdite
  for aUO in (select distinct cd_cds, cd_unita_organizzativa, cd_terzo
              From saldo_coge where esercizio =aEs and cd_cds = aCdCds order by cd_cds, cd_unita_organizzativa, cd_terzo) loop
   aListaMovimenti.delete;
   for aSaldo in (select a.* from saldo_coge a, voce_ep b,parametri_cnr where
                a.cd_voce_ep =b.cd_voce_ep
			and a.cd_cds = aUO.cd_cds
			and a.cd_unita_organizzativa = aUO.cd_unita_organizzativa
      And a.esercizio = aEs -- stani 15.12.2004
      and parametri_cnr.esercizio = A.ESERCIZIO and
      -- necessario per riportare solo i conti nuovi (purtroppo vista la ricostruzione deb/cred i saldi dei vecchi conti si azzerano a livello di ente non di uo
     ((parametri_cnr.fl_nuovo_pdg ='Y' and  b.livello=1) or
      ( parametri_cnr.fl_nuovo_pdg='N' and b.livello=3 ))
			and a.cd_terzo = aUO.cd_terzo
			and a.esercizio = b.esercizio
			and (b.natura_voce not in ('EEC','EER') or( b.natura_voce is null and b.RIEPILOGA_A !='CEC')) -- Conto di costo o di ricavo
   ) loop

    aVoceEp:=CNRCTB002.GETVOCEEP(aSaldo.esercizio,aSaldo.cd_voce_ep);
    aVoceSPI:=CNRCTB002.GETVOCEEPSTATOPATRIMONIALE(aEs);

    if aSaldo.tot_dare > aSaldo.tot_avere then
	 CNRCTB204.buildMovPrinc(aSaldo.cd_cds,aSaldo.esercizio,aSaldo.cd_unita_organizzativa,aVoceEP,abs(aSaldo.tot_dare-aSaldo.tot_avere),CNRCTB200.IS_AVERE,to_date('3112'||aEs,'DDMMYYYY'),to_date('3112'||aEs,'DDMMYYYY'),0,aSaldo.ti_istituz_commerc,aListaMovimenti,aUser,aTSnow);
	 CNRCTB204.buildMovPrinc(aSaldo.cd_cds,aSaldo.esercizio,aSaldo.cd_unita_organizzativa,aVoceSPI,abs(aSaldo.tot_dare-aSaldo.tot_avere),CNRCTB200.IS_DARE,to_date('3112'||aEs,'DDMMYYYY'),to_date('3112'||aEs,'DDMMYYYY'),0,aSaldo.ti_istituz_commerc,aListaMovimenti,aUser,aTSnow);
	elsif aSaldo.tot_dare < aSaldo.tot_avere then
	 CNRCTB204.buildMovPrinc(aSaldo.cd_cds,aSaldo.esercizio,aSaldo.cd_unita_organizzativa,aVoceEP,abs(aSaldo.tot_dare-aSaldo.tot_avere),CNRCTB200.IS_DARE,to_date('3112'||aEs,'DDMMYYYY'),to_date('3112'||aEs,'DDMMYYYY'),0,aSaldo.ti_istituz_commerc,aListaMovimenti,aUser,aTSnow);
	 CNRCTB204.buildMovPrinc(aSaldo.cd_cds,aSaldo.esercizio,aSaldo.cd_unita_organizzativa,aVoceSPI,abs(aSaldo.tot_dare-aSaldo.tot_avere),CNRCTB200.IS_AVERE,to_date('3112'||aEs,'DDMMYYYY'),to_date('3112'||aEs,'DDMMYYYY'),0,aSaldo.ti_istituz_commerc,aListaMovimenti,aUser,aTSnow);
	end if;
   end loop;
   aScrittura:=null;
   aScrittura.CD_CDS:=aCdCds;
   aScrittura.ESERCIZIO:=aEs;
   aScrittura.CD_UNITA_ORGANIZZATIVA:=aUO.cd_unita_organizzativa;
   aScrittura.ORIGINE_SCRITTURA:=CNRCTB200.ORIGINE_CHIUSURA;
   aScrittura.CD_TIPO_DOCUMENTO:=null;
   aScrittura.CD_CAUSALE_COGE:=CNRCTB200.CAU_CHIUSURA_ST_PATRIMONIALE;
   -- La chiave del documento viene costruita per concatenazione delle componenti della chiave del buono di scarico
   aScrittura.CD_COMP_DOCUMENTO:='CDS-'||aCdCds||' UO-'||aUO.cd_unita_organizzativa;
   aScrittura.CD_CDS_DOCUMENTO:=aCdCds;
   aScrittura.CD_UO_DOCUMENTO:=aUO.cd_unita_organizzativa;
   aScrittura.PG_NUMERO_DOCUMENTO:=NULL;
   aScrittura.IM_SCRITTURA:=null; -- Impostato come totale di sezione in realizzazione della scrittura
   aScrittura.DT_CONTABILIZZAZIONE:=to_date('3112'||aEs,'DDMMYYYY');
   aScrittura.DT_PAGAMENTO:=null;
   aScrittura.DT_CANCELLAZIONE:=null;
   aScrittura.TI_SCRITTURA:=CNRCTB200.TI_SCRITTURA_SINGOLA;
   aScrittura.CD_TERZO:=aUO.cd_terzo;
   aScrittura.STATO:=CNRCTB200.STATO_DEFINITIVO;
   aScrittura.CD_DIVISA:=NULL;
   aScrittura.COSTO_PLURIENNALE:=null; -- chi lo valorizza e come non e chiaro
   aScrittura.PG_ENTE:=null; -- serve a rinumerare le scritture  livello di ENTE
   aScrittura.DS_SCRITTURA := 'Chiusura Stato Patrimoniale per CDS '||auo.cd_cds||', UO '||
                              auo.cd_unita_organizzativa||' e Terzo '||auo.cd_terzo;
   aScrittura.PG_SCRITTURA_ANNULLATA:=null; -- codice della scrittura annullata in effettuazione storno
   aScrittura.ATTIVA:='Y';
   aScrittura.ESERCIZIO_DOCUMENTO_AMM:=null;
   aScrittura.DACR:=aTSNow;
   aScrittura.UTCR:=aUser;
   -- Registro la scrittura
   CNRCTB200.CREASCRITTCOGE(aScrittura,aListaMovimenti);
  end loop;
 end;

 procedure rilevazioneUtilePerditaCOGE(modalitaProva char, aEs number, aCdCds varchar2, aUser varchar2, aTSNow date) is
  aScrittura scrittura_partita_doppia%rowtype;
  aListaMovimenti CNRCTB200.movimentiList;
  aNewScrittura scrittura_partita_doppia%rowtype;
  aNewListaMovimenti CNRCTB200.movimentiList;
  aListaScritture CNRCTB200.scrittureList;
  aVoceEpContoEcon voce_ep%rowtype;
  aVoceEpStPatr voce_ep%rowtype;
  aVoceEpUtilePerdita voce_ep%rowtype;

 begin

  if modalitaProva is null or modalitaProva not in ('Y','N') then
   IBMERR001.RAISE_ERR_GENERICO('Modalita operazione non correttamente specificata');
  end if;

  aVoceEpContoEcon      :=      CNRCTB002.GETVOCEEPCONTOECONOMICO(aEs);
  aVoceEpStPatr         :=      CNRCTB002.GETVOCEEPSTATOPATRIMONIALE(aEs);
  aVoceEpUtilePerdita   :=      CNRCTB002.GETVOCEEPUTILEPERDITAESERCIZIO(aEs);

-- giro su CONTO ECONOMICO

CNRCTB204.getScrittureLock(aEs, aCdCds, CNRCTB200.CAU_CHIUSURA_CONTO_ECONOMICO, CNRCTB200.ORIGINE_CHIUSURA, aListaScritture);

For i in 1..aListaScritture.count loop

   CNRCTB200.GETSCRITTURAEPLOCK(aListaScritture(i),aListaMovimenti);
   aNewListaMovimenti.delete;

   for j in 1..aListaMovimenti.count loop

    if aVoceEpContoEcon.cd_voce_ep = aListaMovimenti(j).cd_voce_ep then
     aListaMovimenti(j).esercizio := aEs;
     aListaMovimenti(j).dt_da_competenza_coge := to_date('3112'||aEs,'DDMMYYYY');
     aListaMovimenti(j).dt_a_competenza_coge := to_date('3112'||aEs,'DDMMYYYY');
     aListaMovimenti(j).sezione := CNRCTB200.GETSEZIONEOPPOSTA(aListaMovimenti(j).sezione);
     aNewListaMovimenti(aNewListaMovimenti.count+1) := aListaMovimenti(j);
    end if;
   end loop;

-- procedure rilevazioneUtilePerditaCOGE
   CNRCTB204.BUILDCHIUSURASCRITTURA(aCdCds, aEs, aListaScritture(i).cd_unita_organizzativa,
                                    aVoceEpUtilePerdita, to_date('3112'||aEs,'DDMMYYYY'),
                                    to_date('3112'||aEs,'DDMMYYYY'),
                                    aNewListaMovimenti(aNewListaMovimenti.count).cd_terzo,
                                    CNRCTB100.TI_PROMISCUO,
                                    --CNRCTB100.TI_ISTITUZIONALE,
                                    aNewListaMovimenti,aUser,aTSNow);

   aListaScritture(i).esercizio:=aEs;
   aListaScritture(i).dt_contabilizzazione:=to_date('3112'||aEs,'DDMMYYYY');
   aListaScritture(i).cd_causale_coge:=CNRCTB200.CAU_DET_UTILE_PERDITA;
   aListaScritture(i).utuv:=aUser;
   aListaScritture(i).utcr:=aUser;
   aListaScritture(i).duva:=aTSNow;
   aListaScritture(i).dacr:=aTSNow;
   aListaScritture(i).pg_ver_rec:=1;
   aNewScrittura:=aListaScritture(i);
   -- Registro la scrittura
   CNRCTB200.CREASCRITTCOGE(aNewScrittura,aNewListaMovimenti);
End loop;

aNewListaMovimenti.delete;
aListaScritture.delete;

-- giro su STATO PATRIMONIALE

  CNRCTB204.getScrittureLock(aEs, aCdCds, CNRCTB200.CAU_CHIUSURA_ST_PATRIMONIALE, CNRCTB200.ORIGINE_CHIUSURA, aListaScritture);
  for i in 1..aListaScritture.count loop

   CNRCTB200.GETSCRITTURAEPLOCK(aListaScritture(i),aListaMovimenti);
   aNewListaMovimenti.delete;
   for j in 1..aListaMovimenti.count loop

    if aVoceEpStPatr.cd_voce_ep = aListaMovimenti(j).cd_voce_ep then
     aListaMovimenti(j).esercizio:=aEs;
     aListaMovimenti(j).dt_da_competenza_coge:=to_date('3112'||aEs,'DDMMYYYY');
     aListaMovimenti(j).dt_a_competenza_coge:=to_date('3112'||aEs,'DDMMYYYY');
     aListaMovimenti(j).sezione:=CNRCTB200.GETSEZIONEOPPOSTA(aListaMovimenti(j).sezione);
     aNewListaMovimenti(aNewListaMovimenti.count+1):=aListaMovimenti(j);
    end if;
   end loop;
-- procedure rilevazioneUtilePerditaCOGE
   CNRCTB204.BUILDCHIUSURASCRITTURA(aCdCds,aEs,aListaScritture(i).cd_unita_organizzativa,
                                    aVoceEpUtilePerdita,to_date('3112'||aEs,'DDMMYYYY'),
                                    to_date('3112'||aEs,'DDMMYYYY'),
                                    aNewListaMovimenti(aNewListaMovimenti.count).cd_terzo,
                                    CNRCTB100.TI_PROMISCUO,
                                    --CNRCTB100.TI_ISTITUZIONALE,
                                    aNewListaMovimenti,aUser,aTSNow);
   aListaScritture(i).esercizio:=aEs;
   aListaScritture(i).dt_contabilizzazione:=to_date('3112'||aEs,'DDMMYYYY');
   aListaScritture(i).cd_causale_coge:=CNRCTB200.CAU_DET_UTILE_PERDITA;
   aListaScritture(i).utuv:=aUser;
   aListaScritture(i).utcr:=aUser;
   aListaScritture(i).utcr:=aTSNow;
   aListaScritture(i).utcr:=aTSNow;
   aNewScrittura:=aListaScritture(i);
   -- Registro la scrittura
   CNRCTB200.CREASCRITTCOGE(aNewScrittura,aNewListaMovimenti);
  end loop;
 end;


 procedure riaperturaStPatrimonialeCOGE(modalitaProva char, aEsNext number, aCdCds varchar2, aUser varchar2, aTSNow date) is
  aVoceEP voce_ep%rowtype;
  aVoceSPI voce_ep%rowtype;
  aScrittura scrittura_partita_doppia%rowtype;
  aListaMovimenti CNRCTB200.movimentiList;
  aListaScritture CNRCTB200.scrittureList;
  aNewListaMovimenti CNRCTB200.movimentiList;
  aNewScrittura scrittura_partita_doppia%rowtype;
 begin
  if modalitaProva is null or modalitaProva not in ('Y','N') then
   IBMERR001.RAISE_ERR_GENERICO('Modalita operazione non correttamente specificata');
  end if;

  CNRCTB204.getScrittureLock(aEsNext-1, aCdCds, CNRCTB200.CAU_CHIUSURA_ST_PATRIMONIALE,CNRCTB200.ORIGINE_CHIUSURA, aListaScritture);
  for i in 1..aListaScritture.count loop
   CNRCTB200.GETSCRITTURAEPLOCK(aListaScritture(i),aListaMovimenti);
   aNewListaMovimenti.delete;
   for j in 1..aListaMovimenti.count loop
    dbms_output.put_line('riapro '||aListaMovimenti(j).cd_voce_ep);
    aListaMovimenti(j).esercizio:=aEsNext;
    aListaMovimenti(j).dt_da_competenza_coge:=to_date('0101'||aEsNext,'DDMMYYYY');
    aListaMovimenti(j).dt_a_competenza_coge:=to_date('0101'||aEsNext,'DDMMYYYY');
    aListaMovimenti(j).sezione:=CNRCTB200.GETSEZIONEOPPOSTA(aListaMovimenti(j).sezione);
    aNewListaMovimenti(aNewListaMovimenti.count+1):=aListaMovimenti(j);
   end loop;
   aListaScritture(i).esercizio:=aEsNext;
   aListaScritture(i).dt_contabilizzazione:=to_date('0101'||aEsNext,'DDMMYYYY');
   aListaScritture(i).cd_causale_coge:=CNRCTB200.CAU_RIAPERTURA_CONTI;
   aListaScritture(i).utuv:=aUser;
   aListaScritture(i).utcr:=aUser;
   aListaScritture(i).duva:=aTSNow;
   aListaScritture(i).dacr:=aTSNow;
   aListaScritture(i).pg_ver_rec:=1;
   aNewScrittura:=aListaScritture(i);
   -- Registro la scrittura
   CNRCTB200.CREASCRITTCOGE(aNewScrittura,aNewListaMovimenti);
  end loop;
 end;

 procedure regAmmortamentoCOGE(modalitaProva char, aEs number, aCdCds varchar2, aUser varchar2, aTSNow date) is
  aCatGruppoVoceEp CATEGORIA_GRUPPO_VOCE_EP%rowtype;
  aVoceEPCG voce_ep%rowtype;
  aVoceEPCGContr voce_ep%rowtype;
  aListaScritture CNRCTB200.scrittureList;
  aScrittura scrittura_partita_doppia%rowtype;
  aListaMovimenti CNRCTB200.movimentiList;
  aResiduo number(15,2);
  aTotDistr number(15,2);
  aImpLaCdr number(15,2);
  aLa linea_attivita%rowtype;
  lMovimenti CNRCTB200.movAnalitList;
  rScrittura scrittura_analitica%rowtype;
  aNumMov number(15,2);
  aTempMov movimento_coan%rowtype;
  recParametriCNR PARAMETRI_CNR%Rowtype;
begin
  recParametriCNR := CNRUTL001.getRecParametriCnr(aEs);

   CNRCTB204.GETSCRITTUREAMMORTAMENTOLOCK(aEs,aCdCds,aListaScritture);
   if aListaScritture.count > 0 then
    IBMERR001.RAISE_ERR_GENERICO('Scrittura di ammortamento gia eseguita per cds:'||aCdCds||' in esercizio '||aEs);
   end if;


  lock table categoria_gruppo_invent in exclusive mode;

    For aAmmInv In(Select * From AMMORTAMENTO_BENE_INV
  Where CD_CDS_UBICAZIONE       =aCdCds FOR UPDATE NOWAIT) Loop
  Null;
  End Loop;
 For aBeneInv In(Select * From INVENTARIO_BENI
  Where cd_cds =aCdCds FOR UPDATE NOWAIT) Loop
  	Null;
  End Loop;

   for aInventario in (select * from id_inventario) loop

    for aInventBene in (select c.cd_cds,c.cd_unita_organizzativa, b.cd_categoria_padre categoria,
                        C.TI_COMMERCIALE_ISTITUZIONALE, sum(a.im_movimento_ammort) im_ammortamento
                        from ammortamento_bene_inv a, categoria_gruppo_invent b, inventario_beni c
                        Where  c.pg_inventario = aInventario.pg_inventario
                           and c.nr_inventario = a.nr_inventario
                           and c.progressivo = a.progressivo
                           and c.cd_cds = aCdCds
                    	   And a.pg_inventario = aInventario.pg_inventario
                    	   And a.cd_cds_ubicazione = c.cd_cds
                    	   and a.esercizio = aEs
                    	   And a.fl_storno ='N'
                    	   and a.cd_categoria_gruppo  =b.cd_categoria_gruppo
                    	   and recParametriCNR.fl_nuovo_pdg = 'N'
                     	group by c.cd_cds,c.cd_unita_organizzativa, b.cd_categoria_padre,
                     	         TI_COMMERCIALE_ISTITUZIONALE
                     	 union
                     	  select c.cd_cds,c.cd_unita_organizzativa, c.cd_categoria_gruppo categoria,
                        C.TI_COMMERCIALE_ISTITUZIONALE, sum(a.im_movimento_ammort) im_ammortamento
                        from ammortamento_bene_inv a, inventario_beni c
                        Where  c.pg_inventario = aInventario.pg_inventario
                           and c.nr_inventario = a.nr_inventario
                           and c.progressivo = a.progressivo
                           and c.cd_cds = aCdCds
                    	   And a.pg_inventario = aInventario.pg_inventario
                    	   And a.cd_cds_ubicazione = c.cd_cds
                    	   and a.esercizio = aEs
                    	   And a.fl_storno ='N'
                    	   and recParametriCNR.fl_nuovo_pdg = 'Y'
                     	group by c.cd_cds,c.cd_unita_organizzativa, c.cd_categoria_gruppo,TI_COMMERCIALE_ISTITUZIONALE) loop

     begin
      select * into aCatGruppoVoceEp
      from  CATEGORIA_GRUPPO_VOCE_EP
      Where cd_categoria_gruppo = aInventBene.categoria
        And sezione = CNRCTB200.IS_DARE
        And ESERCIZIO = aEs
        and fl_default ='Y' ;
     exception when NO_DATA_FOUND then
      IBMERR001.RAISE_ERR_GENERICO('Nessun conto economico associato a categoria:'||aInventBene.categoria);
     end;

     aListaMovimenti.delete;
     aVoceEPCG:=CNRCTB002.getVoceEp(aCatGruppoVoceEp.esercizio,aCatGruppoVoceEp.cd_voce_ep);
     aVoceEPCGContr:=CNRCTB002.getVoceEp(aCatGruppoVoceEp.esercizio,aCatGruppoVoceEp.cd_voce_ep_contr);

-- procedure regAmmortamentoCOGE
     CNRCTB204.buildMovPrinc(aInventBene.cd_cds,aEs,aInventBene.cd_unita_organizzativa,aVoceEPCG,
                             aInventBene.im_ammortamento,CNRCTB200.IS_DARE,
                             to_date('3112'||aEs,'DDMMYYYY'),to_date('3112'||aEs,'DDMMYYYY'),0,
                             aInventBene.TI_COMMERCIALE_ISTITUZIONALE, --CNRCTB100.TI_ISTITUZIONALE,
                             aListaMovimenti,aUser,aTSnow);

-- procedure regAmmortamentoCOGE
     CNRCTB204.buildMovPrinc(aInventBene.cd_cds,aEs,aInventBene.cd_unita_organizzativa,aVoceEPCGContr,
                             aInventBene.im_ammortamento,CNRCTB200.IS_AVERE,
                             to_date('3112'||aEs,'DDMMYYYY'),to_date('3112'||aEs,'DDMMYYYY'),0,
                             aInventBene.TI_COMMERCIALE_ISTITUZIONALE, --CNRCTB100.TI_ISTITUZIONALE,
                             aListaMovimenti,aUser,aTSnow);

     aScrittura:=null;
     aScrittura.CD_CDS:=aInventBene.cd_cds;
     aScrittura.ESERCIZIO:=aEs;
     aScrittura.CD_UNITA_ORGANIZZATIVA:=aInventBene.cd_unita_organizzativa;
     aScrittura.ORIGINE_SCRITTURA:=CNRCTB200.ORIGINE_CHIUSURA;
     aScrittura.CD_TIPO_DOCUMENTO:=null;
     aScrittura.CD_CAUSALE_COGE:=CNRCTB200.CAU_AMMORTAMENTO;
     -- La chiave del documento viene costruita per concatenazione delle componenti della chiave del buono di scarico
     aScrittura.CD_COMP_DOCUMENTO:='INVENTARIO-'||aInventario.pg_inventario||' CATEGORIA-'||aInventBene.categoria;
     aScrittura.CD_CDS_DOCUMENTO:=aInventBene.cd_cds;
     aScrittura.CD_UO_DOCUMENTO:=aInventBene.cd_unita_organizzativa;
     aScrittura.PG_NUMERO_DOCUMENTO:=NULL;
     aScrittura.IM_SCRITTURA:=null; -- Impostato come totale di sezione in realizzazione della scrittura
     aScrittura.DT_CONTABILIZZAZIONE:=to_date('3112'||aEs,'DDMMYYYY');
     aScrittura.DT_PAGAMENTO:=null;
     aScrittura.DT_CANCELLAZIONE:=null;
     aScrittura.TI_SCRITTURA:=CNRCTB200.TI_SCRITTURA_SINGOLA;
     aScrittura.CD_TERZO:=0;
     aScrittura.STATO:=CNRCTB200.STATO_DEFINITIVO;
     aScrittura.CD_DIVISA:=NULL;
     aScrittura.COSTO_PLURIENNALE:=null; -- chi lo valorizza e come non e chiaro
     aScrittura.PG_ENTE:=null; -- serve a rinumerare le scritture  livello di ENTE

     aScrittura.DS_SCRITTURA := 'Scrittura di ammortamento per CDS '||aInventBene.cd_cds
                                ||', UO '||aInventBene.cd_unita_organizzativa||
                                ', Inventario '||aInventario.pg_inventario||', Categoria '||aInventBene.categoria;

     aScrittura.PG_SCRITTURA_ANNULLATA:=null; -- codice della scrittura annullata in effettuazione storno
     aScrittura.ATTIVA:='Y';
     aScrittura.ESERCIZIO_DOCUMENTO_AMM:=null;
     aScrittura.DACR:=aTSNow;
     aScrittura.UTCR:=aUser;
     -- Registro la scrittura
     CNRCTB200.CREASCRITTCOGE(aScrittura,aListaMovimenti);

	 -- Registrazione ammortamento in analitica
     For aInventBeneD in (select c.pg_inventario, c.nr_inventario, c.progressivo, c.cd_cds,
                                 c.cd_unita_organizzativa, aInventBene.categoria,
                                 a.im_movimento_ammort im_ammortamento
                          From  ammortamento_bene_inv a,  inventario_beni c
	                  Where     c.pg_inventario = aInventario.pg_inventario
                                and c.nr_inventario = a.nr_inventario
                                And c.progressivo = a.progressivo
		                            and c.cd_cds = aInventBene.cd_cds
                                and c.cd_unita_organizzativa = aInventBene.cd_unita_organizzativa
		                						And a.pg_inventario = aInventario.pg_inventario
		                						and a.esercizio = aEs
		                						And a.cd_cds_ubicazione = c.cd_cds
		                						and c.fl_ammortamento = 'Y'
		                order by c.cd_cds,c.cd_unita_organizzativa, aInventBene.categoria) Loop
	  aNumMov:=0;
	  aTotDistr:=0;
	  lMovimenti.delete;

      For aInvUtil in (select * from inventario_utilizzatori_la
                       Where  pg_inventario = aInventBeneD.pg_inventario
                          and nr_inventario = aInventBeneD.nr_inventario
		-- Modifica del 16/11/2004
		-- I dati di utilizzatore sono sul bene padre (progressivo=0)
                          and progressivo = 0
                 	  for update nowait) loop

       aNumMov:=aNumMov+1;
       aTempMov:=null;
       aTempMov.CD_CDS := aScrittura.CD_CDS;
       aTempMov.ESERCIZIO := aScrittura.ESERCIZIO;
       aTempMov.CD_UNITA_ORGANIZZATIVA := aScrittura.CD_UNITA_ORGANIZZATIVA;
       aTempMov.PG_SCRITTURA := NULL;
       aTempMov.CD_VOCE_EP := aVoceEPCG.CD_VOCE_EP;
       aTempMov.PG_MOVIMENTO := NULL;
       aTempMov.SEZIONE := CNRCTB200.IS_DARE;
       aTempMov.CD_CENTRO_RESPONSABILITA :=  aInvUtil.CD_UTILIZZATORE_CDR;
       aImpLaCdr:=aInventBeneD.im_ammortamento*(aInvUtil.percentuale_utilizzo_cdr/100)*(aInvUtil.percentuale_utilizzo_la/100);
       aTotDistr:=aTotDistr+aImpLaCdr;
       aTempMov.IM_MOVIMENTO := aImpLaCdr;
	   select * into aLa
	   from  linea_attivita
	   Where cd_centro_responsabilita=aInvUtil.cd_utilizzatore_cdr And
	         cd_linea_attivita=aInvUtil.cd_linea_attivita;
       aTempMov.CD_TERZO := Null; --0;
       aTempMov.CD_FUNZIONE := aLa.CD_FUNZIONE;
       aTempMov.CD_NATURA := aLa.CD_NATURA;
       aTempMov.STATO :='D';
       aTempMov.DS_MOVIMENTO := 'Ammortamento bene inv n.'||aInvUtil.pg_inventario||' nr.'||aInvUtil.nr_inventario||' progr.'||aInventBeneD.progressivo;
       aTempMov.CD_LINEA_ATTIVITA :=  aInvUtil.CD_LINEA_ATTIVITA;
       aTempMov.PG_NUMERO_DOCUMENTO := null;
       aTempMov.TI_ISTITUZ_COMMERC := ainventbene.TI_COMMERCIALE_ISTITUZIONALE;
       lMovimenti(aNumMov):=aTempMov;

         End loop;  -- degli utilizzatori

	  -- Redistribuzione dei rotti
      if lMovimenti.count = 0 then
       IBMERR001.RAISE_ERR_GENERICO('Esistono beni per cui non sono definiti utilizzatori. Bene inv n.'||aInventBeneD.pg_inventario||' nr.'||aInventBeneD.nr_inventario||' progr.0');
      end if;

      if lMovimenti.count > 0 then
          if aTotDistr - aInventBeneD.im_ammortamento > 0 then
           lMovimenti(lMovimenti.count).IM_MOVIMENTO:=lMovimenti(lMovimenti.count).IM_MOVIMENTO-(aTotDistr - aInventBeneD.im_ammortamento);
          elsif aTotDistr - aInventBeneD.im_ammortamento < 0 then
           lMovimenti(lMovimenti.count).IM_MOVIMENTO:=lMovimenti(lMovimenti.count).IM_MOVIMENTO-(aTotDistr - aInventBeneD.im_ammortamento);
          else
           null;
          end if;
       rScrittura.CD_CDS := aScrittura.CD_CDS;
       rScrittura.ESERCIZIO := aScrittura.ESERCIZIO;
       rScrittura.CD_UNITA_ORGANIZZATIVA := aScrittura.CD_UNITA_ORGANIZZATIVA;
       rScrittura.PG_SCRITTURA := NULL;
       rScrittura.ORIGINE_SCRITTURA := CNRCTB200.ORIGINE_CHIUSURA;
       rScrittura.CD_TERZO := Null; --0;
       rScrittura.CD_CDS_DOCUMENTO := null;
       rScrittura.CD_UO_DOCUMENTO := null;
       rScrittura.CD_TIPO_DOCUMENTO := null;
       rScrittura.PG_NUMERO_DOCUMENTO := null;
       rScrittura.CD_COMP_DOCUMENTO := NULL;
       rScrittura.IM_SCRITTURA := 0;
       rScrittura.TI_SCRITTURA := CNRCTB200.TI_SCRITTURA_SINGOLA;
       rScrittura.DT_CONTABILIZZAZIONE := aScrittura.dt_contabilizzazione;
       rScrittura.DT_CANCELLAZIONE := NULL;
       rScrittura.STATO := CNRCTB200.STATO_DEFINITIVO;
       rScrittura.DS_SCRITTURA := 'Ammortamento bene inv n.'||aInventBeneD.pg_inventario||' nr.'||aInventBeneD.nr_inventario||' progr.'||aInventBeneD.progressivo;
       rScrittura.PG_SCRITTURA_ANNULLATA := NULL;
       rScrittura.ATTIVA := 'Y';
       rScrittura.ESERCIZIO_DOCUMENTO_AMM := null;
       rScrittura.DACR := aScrittura.dacr;
       rScrittura.UTCR := aScrittura.utcr;
       CNRCTB200.CREASCRITTCOAN(rScrittura,lMovimenti);
      end if;

    End loop;  -- degli ammortamenti
  End loop;  -- dei beni
End loop;  -- degli inventari

End;

 procedure regRiscontiCOGE(modalitaProva char, aDocTst V_DOC_AMM_COGE_TSTA%rowtype, aUser varchar2, aTSNow date) is
  aScrittura scrittura_partita_doppia%rowtype;
  aListaMovimenti CNRCTB200.movimentiList;
  aListaMovimentiNewEs CNRCTB200.movimentiList;
  aMovimento movimento_coge%rowtype;
  aContoEp voce_ep%rowtype;
  aContoRis voce_ep%rowtype;
  aListaScritture CNRCTB200.scrittureList;
  aListaScrittureP2 CNRCTB200.scrittureList;
  aListaScritturePrime CNRCTB200.scrittureList;
  aListaMovimentiPrimi CNRCTB200.movimentiList;
  aEsNext number(4);
  aFrazioneNext number(15,10);
  aPeriodoBase number(15,2);
  isProcessaCOEP boolean;
  aNewDa date;
 begin
  if modalitaProva is null or modalitaProva not in ('Y','N') then
   IBMERR001.RAISE_ERR_GENERICO('Modalita operazione non correttamente specificata');
  end if;

  -- Lock del documento
  CNRCTB100.LOCKDOCAMM(
   aDocTst.cd_tipo_documento,
   aDocTst.cd_cds,
   aDocTst.esercizio,
   aDocTst.cd_unita_organizzativa,
   aDocTst.pg_numero_documento
  );

  -- Se il documento NON ha data fine competenza coge in esercizio successivo esco
  if not (aDocTst.dt_a_competenza_coge >= to_date('0101'||(aDocTst.esercizio+1),'DDMMYYYY')) then
   return;
  end if;

  -- cerca eventuali scritture gia registrate per il documento

  begin
   CNRCTB204.getScritturePEPLock(aDocTst,CNRCTB200.CAU_RISCONTI,aListaScritture);
  exception when NO_DATA_FOUND then
   null;
  end;
  -- Se la scrittura di risconto e gia stata fatta sollevo eccezione
  if aListaScritture.count > 0 then
   IBMERR001.RAISE_ERR_GENERICO('Scrittura di risconto parte 1 gia effettuata per il documento '||CNRCTB204.getDescDocumento(aDocTst));
  end if;

  begin
   CNRCTB204.getScritturePEPLock(aDocTst.esercizio+1,aDocTst,CNRCTB200.CAU_RISCONTI_P2,aListaScrittureP2);
  exception when NO_DATA_FOUND then
   null;
  end;
  -- Se ls scrittura di risconto parte 2 gia stata fatta nel nuovo esercizio sollevo eccezione
  if aListaScrittureP2.count > 0 then
   IBMERR001.RAISE_ERR_GENERICO('Scrittura di risconto parte 2 gia effettuata per il documento '||CNRCTB204.getDescDocumento(aDocTst));
  end if;

  begin
   CNRCTB204.getScritturePEPLock(aDocTst,aListaScritturePrime);
  exception when NO_DATA_FOUND then
   IBMERR001.RAISE_ERR_GENERICO('Scrittura prima non trovata per documento '||CNRCTB204.getDescDocumento(aDocTst));
  end;

If aListaScritturePrime.count > 0 then

For i in 1 .. aListaScritturePrime.count loop

    aEsNext:=aListaScritturePrime(i).esercizio+1;
    CNRCTB200.getScritturaEPLOCK(aListaScritturePrime(i),aListaMovimentiPrimi);
    aListaMovimenti.delete;

   For j in 1 .. aListaMovimentiPrimi.count loop

     aContoEp:=CNRCTB002.GETVOCEEP(aListaScritturePrime(i).esercizio, aListaMovimentiPrimi(j).cd_voce_ep);
     if ((Upper(TRIM(aContoEp.NATURA_VOCE)) = 'EEC') Or (UPPER(trim(aContoEp.NATURA_VOCE)) = 'EER') or (Upper(TRIM(aContoEp.RIEPILOGA_A)) = 'CEC' )) then
       if aListaMovimentiPrimi(j).dt_a_competenza_coge >= to_date('0101'||aEsNext,'DDMMYYYY') then
       -- Estrae la parte di costo/ricavo da riscontare su esercizio futuro
       aPeriodoBase:=aListaMovimentiPrimi(j).dt_a_competenza_coge-aListaMovimentiPrimi(j).dt_da_competenza_coge+1;

         if to_date('0101'||aEsNext,'DDMMYYYY') > aListaMovimentiPrimi(j).dt_da_competenza_coge then
          aFrazioneNext:=aListaMovimentiPrimi(j).dt_a_competenza_coge-to_date('0101'||aEsNext,'DDMMYYYY')+1;
          aNewDa:=to_date('0101'||aEsNext,'DDMMYYYY');
         else
          aFrazioneNext:=aListaMovimentiPrimi(j).dt_a_competenza_coge-aListaMovimentiPrimi(j).dt_da_competenza_coge+1;
          aNewDa:=aListaMovimentiPrimi(j).dt_da_competenza_coge;
         end if;

       aFrazioneNext:=aFrazioneNext/aPeriodoBase;

-- se il costo/ricavo è totalmente anno successivo
-- storna anche l'imputazione del conto sull'anno successivo
-- per toglierla totalmente dal saldo che chiuderà

If aListaMovimentiPrimi(j).dt_da_competenza_coge >= to_date('0101'||aEsNext,'DDMMYYYY') Then

       CNRCTB204.buildMovPrinc(aListaScritturePrime(i).cd_cds,aListaScritturePrime(i).esercizio,
                               aListaScritturePrime(i).cd_unita_organizzativa,aContoEp,
                               aListaMovimentiPrimi(j).im_movimento*aFrazioneNext,
                               CNRCTB200.getsezioneopposta(aListaMovimentiPrimi(j)),
                               aNewDa,
                               aListaMovimentiPrimi(j).dt_a_competenza_coge,
                               aListaScritturePrime(i).cd_terzo,
                               aListaMovimentiPrimi(j).ti_istituz_commerc,aListaMovimenti,aUser,aTSnow);

Else

-- se il costo/ricavo è a cavallo tra anno corrente e anno successivo
-- storna la quota sull'anno corrente per toglierla dal saldo che chiuderà

       CNRCTB204.buildMovPrinc(aListaScritturePrime(i).cd_cds,aListaScritturePrime(i).esercizio,
                               aListaScritturePrime(i).cd_unita_organizzativa,aContoEp,
                               aListaMovimentiPrimi(j).im_movimento*aFrazioneNext,
                               CNRCTB200.getsezioneopposta(aListaMovimentiPrimi(j)),
                               to_date('3112'||aListaScritturePrime(i).esercizio,'DDMMYYYY'),--aNewDa,
                               to_date('3112'||aListaScritturePrime(i).esercizio,'DDMMYYYY'),--aListaMovimentiPrimi(j).dt_a_competenza_coge,
                               aListaScritturePrime(i).cd_terzo,
                               aListaMovimentiPrimi(j).ti_istituz_commerc,aListaMovimenti,aUser,aTSnow);
End If;

       CNRCTB204.buildMovPrinc(aListaScritturePrime(i).cd_cds,aEsNext,
                               aListaScritturePrime(i).cd_unita_organizzativa,aContoEp,
                               aListaMovimentiPrimi(j).im_movimento*aFrazioneNext,
                               aListaMovimentiPrimi(j).sezione,
                               aNewDa,
                               aListaMovimentiPrimi(j).dt_a_competenza_coge,
                               aListaScritturePrime(i).cd_terzo,
                               aListaMovimentiPrimi(j).ti_istituz_commerc,aListaMovimentiNewEs,
                               aUser,aTSnow);
       end if;
     End if;

    end loop; -- J

    if aListaMovimenti.count = 0 then
	 return;
    end if;
    if CNRCTB204.getSezioneChiusuraScr(aListaMovimenti) = CNRCTB200.IS_DARE then
     aContoRis:=CNRCTB002.GETVOCEEPRISCONTIATTIVI(aListaScritturePrime(i).esercizio);
    else
     aContoRis:=CNRCTB002.GETVOCEEPRISCONTIPASSIVI(aListaScritturePrime(i).esercizio);
    end if;

	-- Crea scrittura risconto parte 1
--  procedure regRiscontiCOGE
    CNRCTB204.buildChiusuraScrittura(aListaScritturePrime(i).cd_cds,aListaScritturePrime(i).esercizio,
	                             aListaScritturePrime(i).cd_unita_organizzativa,aContoRis,
	                             to_date('3112'||(aEsNext-1),'DDMMYYYY'),
	                             to_date('3112'||(aEsNext-1),'DDMMYYYY'),
	                             aListaScritturePrime(i).cd_terzo,
                                     --CNRCTB200.TI_ISTITUZIONALE,
                                     aDocTst.TI_ISTITUZ_COMMERC,
                                     aListaMovimenti,aUser,aTSnow);

    aScrittura:=null;
    aScrittura:=aListaScritturePrime(i);
    aScrittura.pg_scrittura:=null;
    aScrittura.cd_causale_coge:=CNRCTB200.CAU_RISCONTI;
    aScrittura.DT_CONTABILIZZAZIONE:=to_date('3112'||aDocTst.esercizio,'DDMMYYYY');
    aScrittura.UTUV:=aUser;
    aScrittura.UTCR:=aUser;
    aScrittura.DACR:=aTSNow;
    aScrittura.DUVA:=aTSNow;
    aScrittura.PG_VER_REC:=1;
    CNRCTB200.CREASCRITTCOGE(aScrittura,aListaMovimenti);
	-- Crea scrittura risconto parte 2
--  procedure regRiscontiCOGE
    CNRCTB204.buildChiusuraScrittura(aListaScritturePrime(i).cd_cds,aEsNext,
                                     aListaScritturePrime(i).cd_unita_organizzativa,aContoRis,
                                     To_Date('0101'||aEsNext,'DDMMYYYY'),
                                     to_date('0101'||aEsNext,'DDMMYYYY'),
                                     aListaScritturePrime(i).cd_terzo,
                                     --    CNRCTB200.TI_ISTITUZIONALE,
                                     aDocTst.TI_ISTITUZ_COMMERC,
                                     aListaMovimentiNewEs,aUser,aTSnow);
    aScrittura:=null;
    aScrittura:=aListaScritturePrime(i);
    aScrittura.pg_scrittura:=null;
    aScrittura.esercizio:=aEsNext;
    aScrittura.cd_causale_coge:=CNRCTB200.CAU_RISCONTI_P2;
    aScrittura.DT_CONTABILIZZAZIONE:=to_date('0101'||aEsNext,'DDMMYYYY');
    aScrittura.UTUV:=aUser;
    aScrittura.UTCR:=aUser;
    aScrittura.DACR:=aTSNow;
    aScrittura.DUVA:=aTSNow;
    aScrittura.PG_VER_REC:=1;
    CNRCTB200.CREASCRITTCOGE(aScrittura,aListaMovimentiNewEs);
   end loop;
  end if;
 end;


Procedure regDocAmmRateiParte2COGE(modalitaProva char, aDocTst V_DOC_AMM_COGE_TSTA%rowtype, aUser varchar2, aTSNow date) is
  aScrittura scrittura_partita_doppia%rowtype;
  aMovimento movimento_coge%rowtype;
  aListaMovimenti CNRCTB200.movimentiList;
  aNewListMov   CNRCTB200.movimentiList;
  aNewMov       movimento_coge%rowtype;
  aVoceEp voce_ep%rowtype;
  aVoceIVAEp voce_ep%rowtype;
  aListaScritture CNRCTB200.scrittureList;
  aListaScrittureP2 CNRCTB200.scrittureList;
  aListaMovimentiP2 CNRCTB200.movimentiList;
  aListaVecchieScrittureP2 CNRCTB200.scrittureList;
  aNewListaScrittureP2 CNRCTB200.scrittureList;
  aDoc v_doc_amm_coge_riga%rowtype;
  a NUMBER := 0;
  tot_doc NUMBER := 0;

Begin

Dbms_Output.PUT_LINE ('Entro con il documento '||aDocTst.CD_TIPO_DOCUMENTO||' '||aDocTst.CD_CDS||' '||aDocTst.CD_UNITA_ORGANIZZATIVA||' '||aDocTst.ESERCIZIO||' '||
aDocTst.CD_CDS_ORIGINE||' '||aDocTst.CD_UO_ORIGINE||' '||aDocTst.PG_NUMERO_DOCUMENTO);

if modalitaProva is null or modalitaProva not in ('Y','N') then
   IBMERR001.RAISE_ERR_GENERICO('Modalita operazione non correttamente specificata');
End if;

  -- Lock del documento
CNRCTB100.LOCKDOCAMM(
   aDocTst.cd_tipo_documento,
   aDocTst.cd_cds,
   aDocTst.esercizio,
   aDocTst.cd_unita_organizzativa,
   aDocTst.pg_numero_documento);

  -- Se la competenza non e fuori esercizio non effettua operazioni

If Not (CNRCTB204.getCompetenzaFuoriEsercizio(aDocTst) Or CNRCTB204.getCompetenzaacavalloconEsPrec(aDocTst)) Then
Dbms_Output.PUT_LINE ('RETURN 1');
   Return;
End If;

Savepoint CNRCTB205_SP_002;

  -- cerca eventuali scritture gia registrate per il documento
  -- se la competenza è fuori esercizio cerca i ratei parte 1

CNRCTB204.getScritturePEPLock(aDocTst.esercizio-1, aDocTst, CNRCTB200.CAU_RATEI, aListaScritture);

Dbms_Output.PUT_LINE ('DI TESTATE RATEO DA CHIUDERE TROVA N. '||aListaScritture.count||' RIGHE');

CNRCTB204.getScritturePEPLock(aDocTst.esercizio, aDocTst, CNRCTB200.CAU_RATEI_P2, aListaScrittureP2);

-- Se esistono scritture di rateo parte 2 solleva eccezione
--If aListaScrittureP2.count > 0 then
   --IBMERR001.RAISE_ERR_GENERICO('Scrittura di rateo parte 2 gia effettuata per il documento '||CNRCTB204.getDescDocumento(aDocTst));
--End if;

For i in 1 .. aListaScritture.count loop
   aNewListMov.delete;
   aScrittura:=aListaScritture(i);
   aListaMovimenti.delete;
   CNRCTB200.GETSCRITTURAEPLOCK(aScrittura,aListaMovimenti);

Dbms_Output.PUT_LINE ('DI RIGHE RATEO DA CHIUDERE TROVA N. '||aListaMovimenti.count||' RIGHE');

   aScrittura.esercizio := aScrittura.esercizio+1;
   aScrittura.dt_contabilizzazione := to_date('0101'||(aScrittura.esercizio),'DDMMYYYY'); --Trunc(aTSNow); -- stani
   aScrittura.cd_causale_coge := CNRCTB200.CAU_RATEI_P2;
   aScrittura.ti_scrittura := CNRCTB200.TI_SCRITTURA_PRIMA;
   aScrittura.utcr := aUser;
   aScrittura.utuv := aUser;
   aScrittura.duva := aTSNow;
   aScrittura.dacr := aTSNow;
   aScrittura.pg_ver_rec := 1;

   For j in 1 .. aListaMovimenti.count Loop

    --If aListaMovimenti(j).fl_mov_terzo = 'Y' Then
    If aListaMovimenti(j).CD_VOCE_EP In (CNRCTB015.getVal01PerChiave(aScrittura.esercizio, 'VOCEEP_SPECIALE','RATEI_PASSIVI'),
                                         CNRCTB015.getVal01PerChiave(aScrittura.esercizio, 'VOCEEP_SPECIALE','RATEI_ATTIVI'),
                                         CNRCTB015.getVal01PerChiave(aScrittura.esercizio, 'VOCEEP_SPECIALE','FATTURE_DA_EMETTERE'),
                                         CNRCTB015.getVal01PerChiave(aScrittura.esercizio, 'VOCEEP_SPECIALE','FATTURE_DA_RICEVERE')) Then

Dbms_Output.PUT_LINE ('riga '||j);

         aNewMov                     := aListaMovimenti(j);

	 aNewMov.esercizio           := aScrittura.esercizio;
	 aNewMov.fl_mov_terzo        := null;
	 aNewMov.ti_istituz_commerc  := aListaMovimenti(j).ti_istituz_commerc;
	 aNewMov.sezione             := CNRCTB200.GETSEZIONEOPPOSTA(aNewMov.sezione);

         aNewListMov(aNewListMov.Count+1) := aNewMov;
 	 --exit;

-- per ogni riga fa l'eventuale parte iva solo se prevista

   If aDocTst.cd_tipo_documento = CNRCTB100.TI_FATTURA_ATTIVA Or aDocTst.cd_tipo_documento = CNRCTB100.TI_FATTURA_PASSIVA
      Or aDocTst.cd_tipo_documento = CNRCTB100.TI_COMPENSO Then

-- 20.06.2006 STANI LE SCRITTURE DI RATEI PARTE 2 DEVONO ALIMENTARE L'IVA (trascurata alla contabilizzazione (205))
--            MA "NON" I COSTI PER RITENUTE CARICO ENTE PER I COMPENSI (CHE VENGONO PRESE L'ANNO PRIMA)
					declare
						fl_split  char(1):='N';
						begin	
					   If  aDocTst.cd_tipo_documento = CNRCTB100.TI_FATTURA_ATTIVA Then
							select FL_LIQUIDAZIONE_DIFFERITA into fl_split
							from fattura_attiva
							where  
							fattura_attiva.ti_fattura =  aDocTst.ti_fattura and
					    fattura_attiva.esercizio = aDocTst.ESERCIZIO and
					    fattura_attiva.cd_cds_origine = aDocTst.CD_CDS_ORIGINE and
					    fattura_attiva.cd_uo_origine = aDocTst.CD_UO_ORIGINE and
					    fattura_attiva.pg_fattura_attiva = aDocTst.PG_NUMERO_DOCUMENTO;
						else 
						  fl_split:='N';
						end if;
						if  (fl_split = 'N')  then 
                 For aDocCori in (Select *
                                  From   V_DOC_AMM_COGE_CORI
                                  Where  cd_cds                 = aDocTst.cd_cds And
                                         cd_unita_organizzativa = aDocTst.cd_unita_organizzativa And
                                         esercizio              = aDocTst.esercizio And
                                         pg_numero_documento    = aDocTst.pg_numero_documento And
                                         cd_tipo_documento      = aDocTst.cd_tipo_documento And
                                         cd_contributo_ritenuta = CNRCTB015.GETVAL01PERCHIAVE(CNRCTB575.TI_CORI_SPECIALE,CNRCTB575.TI_CORI_IVA) And
            -- AGGIUNTO IL 21.06.2006 PERCHE', PER I COMPENSI, METTEVA ANCHE I CONTRIBUTI CARICO PERCIPIENTE COME COSTI
                                         cd_terzo               = aListaMovimenti(j).cd_terzo And
                                         TI_ISTITUZ_COMMERC     = aListaMovimenti(j).TI_ISTITUZ_COMMERC) Loop

                    aNewMov := aNewListMov(aNewListMov.Count);
                    aVoceIVAEp := CNRCTB204.trovaContoEp(aDocTst, aDocCori);
                    aNewMov.cd_voce_ep := aVoceIVAEp.cd_voce_ep;
                    -- 20.06.2006 STANI LE SCRITTURE DI RATEI PARTE 2 METTEVA SULL'IVA LO STESSO IMPORTO RIAPERTO DEL CONTO RATEI-FATT. DA EM.-FATT. DA RIC
                    --            PERCHE' NON RICOPRIVA L'IMPORTO
                    aNewMov.IM_MOVIMENTO := aDocCori.AMMONTARE;
            	    aNewMov.sezione := CNRCTB204.getSezione(aDocTst, aDocCori);

                    aNewListMov(aNewListMov.Count+1) := aNewMov;
                 End Loop;
     End if;
     end;
   End If;  -- del tipo documento per il giro sull'iva
			aNewMov := aNewListMov(aNewListMov.Count);
      tot_doc:=aNewListMov(aNewListMov.Count).IM_MOVIMENTO;
	For aCDoc In (Select  cd_terzo,TI_APPARTENENZA_EV,ti_gestione_ev,cd_elemento_voce_ev,SUM(IM_IMPONIBILE)  TOT
              From V_DOC_AMM_COGE_RIGA
              Where  cd_cds = aDocTst.cd_cds
                 And cd_unita_organizzativa = aDocTst.cd_unita_organizzativa
                 And esercizio = aDocTst.esercizio
    	         And pg_numero_documento = aDocTst.pg_numero_documento
    	         And cd_tipo_documento = aDocTst.cd_tipo_documento
    	         AND NOT EXISTS(SELECT 1 FROM SCRITTURA_PARTITA_DOPPIA WHERE
    	            CD_CAUSALE_COGE=CNRCTB200.CAU_RATEI_P2 AND
    	            SCRITTURA_PARTITA_DOPPIA.ESERCIZIO=aScrittura.esercizio and
								    cd_cds_documento = aDocTst.cd_cds
							    and esercizio_documento_amm = aDocTst.esercizio
								and cd_uo_documento = aDocTst.cd_unita_organizzativa
								and pg_numero_documento = aDocTst.pg_numero_documento
								and cd_tipo_documento = aDocTst.cd_tipo_documento
								and origine_scrittura = CNRCTB200.ORIGINE_DOCUMENTO_AMM
								and im_scrittura = tot_doc
								and attiva = 'Y')
    	         group by cd_terzo,TI_APPARTENENZA_EV,ti_gestione_ev,cd_elemento_voce_ev) Loop
    	         	--if (avoceEp.cd_voce_ep is not null) then
    	         	  --    aVoceEp:=null;
										  --exit;
								--end if;
               --aVoceEp:=null;
		Dbms_Output.PUT_LINE ('inizio loop sui V_DOC_AMM_COGE_RIGA per terzo '||Acdoc.cd_terzo||' '||acdoc.cd_elemento_voce_ev||' '||to_Char(aNewListMov(aNewListMov.Count).IM_MOVIMENTO)||' tot '||to_char(aCDoc.tot));
					      begin

                  select * into aDoc from V_DOC_AMM_COGE_RIGA
									                Where   cd_cds = aDocTst.cd_cds
									 		    and cd_unita_organizzativa = aDocTst.cd_unita_organizzativa
									 		    and esercizio = aDocTst.esercizio
									 		    and pg_numero_documento = aDocTst.pg_numero_documento
									 		    And cd_tipo_documento = aDocTst.cd_tipo_documento
									 		    and im_imponibile = tot_doc
									 	            and cd_terzo = aCDoc.cd_terzo
									 	            and (cd_elemento_voce_ev = aCDoc.cd_elemento_voce_ev ); -- COmpenso senza calcolo iva
											   -- and fl_pgiro = 'N';
										aVoceEp := CNRCTB204.trovaContoEp(aDocTst,aDoc);
									exception
											when no_data_found then
											  if(aVoceEp.cd_voce_ep is null) then
					      		   	dbms_output.put_line('no data');
												 select * into aDoc from V_DOC_AMM_COGE_RIGA
									                Where   cd_cds = aDocTst.cd_cds
									 		    and cd_unita_organizzativa = aDocTst.cd_unita_organizzativa
									 		    and esercizio = aDocTst.esercizio
									 		    and pg_numero_documento = aDocTst.pg_numero_documento
									 		    And cd_tipo_documento = aDocTst.cd_tipo_documento
									 	            and cd_terzo = aCDoc.cd_terzo
									 	             and (cd_elemento_voce_ev = aCDoc.cd_elemento_voce_ev ) -- COmpenso senza calcolo iva
											    --and fl_pgiro = 'N'
											    and rownum=1;
				             		aVoceEp := CNRCTB204.trovaContoEp(aDocTst,aDoc);
				                end if;
				             end;
				             Dbms_Output.PUT_LINE ('rateo '||aVoceEp.cd_voce_ep);
				             aNewListMov(aNewListMov.Count) := aNewMov;
		end loop;
		Dbms_Output.put_line ('aaaa');


   --aVoceEp := CNRCTB204.TROVACONTOANAG(aScrittura.esercizio, aNewListMov(aNewListMov.count).cd_terzo, aScrittura.cd_tipo_documento, aDocTst.ti_fattura,null,aNewListMov(aNewListMov.count).cd_voce_ep);
  	if(aVoceEp.cd_voce_ep not in ('A00068')) then
       aVoceEp := CNRCTB204.trovaContoContrEp(aScrittura.esercizio, null, null, null,aVoceEp.cd_voce_ep);
   -- else
     --   aNewListMov(aNewListMov.count-1).im_movimento := aNewListMov(aNewListMov.count-1).im_movimento+aNewListMov(aNewListMov.count).im_movimento;
    end if;
--Dbms_Output.put_line ('bbbb count '||aNewListMov.count||' '||aNewListMov(Count).sezione);

   CNRCTB204.BUILDCHIUSURASCRITTURA(aScrittura.cd_cds, aScrittura.esercizio, aScrittura.cd_unita_organizzativa, aVoceEp,
                                    aNewListMov(aNewListMov.count).dt_da_competenza_coge, aNewListMov(aNewListMov.count).dt_a_competenza_coge,
                                    aNewListMov(aNewListMov.count).cd_terzo,
                                    aNewListMov(aNewListMov.count).ti_istituz_commerc, aNewListMov, aUser, aTSNow);
      aVoceEp:=null;
    End If; -- del conto rateo/fatt. da emettere/ricevere

Dbms_Output.put_line ('end loop');

   End Loop; -- delle righe di ratei da chiudere

   If aNewListMov.count = 0 then
    return;
   End if;

   CNRCTB200.CREASCRITTCOGE(aScrittura, aNewListMov);
   aNewListaScrittureP2(aNewListaScrittureP2.count+1) := aScrittura;
End Loop;

If not CNRCTB200.isModificata(aListaVecchieScrittureP2, aNewListaScrittureP2) Then
   rollback to savepoint CNRCTB205_SP_002;
End If;
Dbms_Output.PUT_LINE ('FINE');
End;

 -- Operazioni di controllo per chiusura economica definitiva del CDS
 -- L'operazione viene fatta in una transazione
 --
 -- 1. Non devono esserci scritture con numerazione superiore alla prima scrittura generata in chiusura

 procedure checkChiudibilitaDef(aEs number, aCdCds varchar2) is
  aNumScrPostChiusura number;
  aPgStartChiusura number;
 begin
  if aCdCds is null then
   IBMERR001.RAISE_ERR_GENERICO('CDS non specificato');
  end if;

  for aUO in (select * from v_unita_organizzativa_valida where
             esercizio=aEs
		 and cd_unita_padre=aCdCds
		 order by cd_unita_organizzativa)
  loop
   -- Blocca numerazioni COGE e COAN
   for aNum in (select * from numerazione_coge_coan where
                      esercizio = aEs
				  and cd_cds = aCdCds
				  and cd_unita_organizzativa=aUO.cd_unita_organizzativa
				for update nowait
   ) loop
    null;
   end loop;
   aPgStartChiusura:=0;
   begin
    select min(pg_scrittura) into aPgStartChiusura from scrittura_partita_doppia
    where
                      esercizio = aEs
				  and cd_cds = aCdCds
				  and cd_unita_organizzativa=aUO.cd_unita_organizzativa
				  and cd_causale_coge in (
				    CNRCTB200.CAU_RISCONTI,
				    CNRCTB200.CAU_CHIUSURA_CONTO_ECONOMICO,
				    CNRCTB200.CAU_CHIUSURA_ST_PATRIMONIALE,
				    CNRCTB200.CAU_DET_UTILE_PERDITA,
				    CNRCTB200.CAU_AMMORTAMENTO
				  );
	exception when NO_DATA_FOUND then
     null;
	end;
	aNumScrPostChiusura:=0;
    select count(*) into aNumScrPostChiusura from scrittura_partita_doppia where
                      esercizio = aEs
				  and cd_cds = aCdCds
				  and cd_unita_organizzativa=aUO.cd_unita_organizzativa
				  and cd_causale_coge not in
				  (
				   CNRCTB200.CAU_RISCONTI,
				   CNRCTB200.CAU_CHIUSURA_CONTO_ECONOMICO,
				   CNRCTB200.CAU_CHIUSURA_ST_PATRIMONIALE,
				   CNRCTB200.CAU_DET_UTILE_PERDITA,
				   CNRCTB200.CAU_AMMORTAMENTO
				  )
				  and pg_scrittura > aPgStartChiusura;
   if aNumScrPostChiusura > 0 then
    IBMERR001.RAISE_ERR_GENERICO('Durante l''operazione di chiusura sono state registrate delle scritture economiche in cds:'||aCdCds||' per esercizio '||aEs);
   end if;
   aPgStartChiusura:=0;
   begin
    select min(pg_scrittura) into aPgStartChiusura from scrittura_analitica
    where
                      esercizio = aEs
				  and cd_cds = aCdCds
				  and cd_unita_organizzativa=aUO.cd_unita_organizzativa
				  and origine_scrittura = CNRCTB200.ORIGINE_CHIUSURA;
	exception when NO_DATA_FOUND then
     null;
	end;
	aNumScrPostChiusura := 0;
    select count(*) into aNumScrPostChiusura from scrittura_analitica where
                      esercizio = aEs
				  and cd_cds = aCdCds
				  and cd_unita_organizzativa=aUO.cd_unita_organizzativa
				  and origine_scrittura <> CNRCTB200.ORIGINE_CHIUSURA
				  and pg_scrittura > aPgStartChiusura;
   if aNumScrPostChiusura > 0 then
    IBMERR001.RAISE_ERR_GENERICO('Durante l''operazione di chiusura sono state registrate delle scritture analitiche in cds:'||aCdCds||' per esercizio '||aEs);
   end if;
  end loop;
 end;
end;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy