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

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

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

  CREATE OR REPLACE PACKAGE BODY "CNRCTB048" is

Function getcdsribaltato (aEs NUMBER, aCDS VARCHAR2) Return VARCHAR2 Is
rib_sn CHAR(1);
Begin
 Select Nvl(fl_ribaltato, 'N')
 Into RIB_SN
 From parametri_cds
 Where esercizio = aEs And
       cd_cds = aCDS;
 Return RIB_SN;
Exception
 When No_Data_Found Then
   Return 'N';
End;

function isDocModificato(aObb obbligazione%rowtype,aObbNew obbligazione%rowtype) return char is
aNum number;
aScad obbligazione_scadenzario%rowtype;
begin
  -- confronto campi significativi testata
If (aObbNew.fl_pgiro = 'N') Or
   (aObbNew.fl_pgiro = 'Y' and CNRCTB035.ISAPREPGIRO(aObbNew) And aObbNew.cd_tipo_documento_cont <> CNRCTB018.TI_DOC_IMP_RES) Or
   (aObbNew.fl_pgiro = 'Y' and aObbNew.cd_tipo_documento_cont = CNRCTB018.TI_DOC_IMP_RES) Then

     If Not (aObbNew.im_obbligazione = CNRCTB048.GETIMNONRISCONTRATO(aObb.cd_cds,aObb.esercizio,aObb.esercizio_originale,aObb.pg_obbligazione,aObb.ti_gestione) And
        aObbNew.stato_obbligazione = aObb.stato_obbligazione And -- con l'ipotesi che pluriennali ribaltate restino provvisorie
	aObbNew.dt_cancellazione is null) then
	      return 'Y';
     End If;

End If;

  if aObbNew.cd_terzo = aObb.cd_terzo Then
     --Verifico se sono state aggiunte modifiche ai residui (record in OBBLIGAZIONE_MODIFICA)
	  Declare
	    contaRec NUMBER := 0;
	  Begin
	    Select Count(0) Into contaRec
	    From obbligazione_modifica
	    Where cd_cds = aObbNew.Cd_cds
	    And   esercizio = aObbNew.esercizio
	    And   esercizio_originale = aObbNew.esercizio_originale
	    And   pg_obbligazione = aObbNew.pg_obbligazione;

            If contaRec > 0 Then
               return 'Y';
            End If;
	  End;
	  -- rp 29/01/2010 ignoro lo stato del mandato in quanto non deve essere cmq 'deriportabile'
         Declare
	    contaRec NUMBER := 0;
	  Begin
	    Select Count(0) Into contaRec
	    From mandato_riga
	    Where cd_cds = aObbNew.Cd_cds
	    And   esercizio_obbligazione = aObbNew.esercizio
	    And   esercizio_ori_obbligazione = aObbNew.esercizio_originale
	    And   pg_obbligazione = aObbNew.pg_obbligazione;

            If contaRec > 0 Then
               return 'Y';
            End If;
	  End;
      -- confronto le scadenze
	  for aScadNew in (select * from obbligazione_scadenzario
	  	  		   	   where cd_cds  		 = aObbNew.cd_cds
					     and esercizio 		 = aObbNew.esercizio
					     and esercizio_originale 	 = aObbNew.esercizio_originale
						 and pg_obbligazione = aObbNew.pg_obbligazione) loop

		if aScadNew.pg_obbl_scad_ori_riporto is null then
		   return 'Y';  -- se una scadenza non ha ori riporto, è stata aggiunta
		end if;

		aScad:=CNRCTB048.getOldScad(aObbNew,aScadNew);
		if (aObbNew.fl_pgiro = 'N')
		   or
		   (aObbNew.fl_pgiro = 'Y' and CNRCTB035.ISAPREPGIRO(aObbNew) and aObbNew.cd_tipo_documento_cont <> CNRCTB018.TI_DOC_IMP_RES)
		   or
		   (aObbNew.fl_pgiro = 'Y' and aObbNew.cd_tipo_documento_cont = CNRCTB018.TI_DOC_IMP_RES)
		then
			  if not (aScadNew.im_scadenza = aScad.im_scadenza - aScad.im_associato_doc_contabile
			  	 	 and
					 aScadNew.im_associato_doc_amm = aScad.im_associato_doc_amm - aScad.im_associato_doc_contabile
					 and
					 aScadNew.im_associato_doc_contabile = 0) then
				return 'Y';
			  end if;
		end if;

                -- S.F. 25/02/2009 Eliminato il controllo perchè la data di scadenza non è una informazione sostanziale per
                --                 impedire il riporta indietro
/*
		if aScadNew.dt_scadenza = CNRCTB048.getDtScadenza(aScad.esercizio + 1,aScad.DT_SCADENZA) then
			-- confronto dettagli scadenze:1 no
			-- potrebbe essere cambiata LdA per mappatura
			-- e l'imputazione finanziaria con riporto evoluto
			return 'N';
		else  -- una scadenza è cambiata
			return 'Y';
		end if;
*/

	  end loop; -- scadenze

	  -- S.F. 25/02/2009 In assenza di uno qualsiasi dei casi in cui il documento è cambiato ritorna "N"
          return 'N';

  else  -- è cambiata la testata
  	  return 'Y';
  end if;
end;

function isDocModificato(aAcc accertamento%rowtype,aAccNew accertamento%rowtype) return char is
aScad accertamento_scadenzario%rowtype;
esisteAltraScadRiportata number;
Begin
  -- confronto campi significativi testata
  If (aAccNew.fl_pgiro = 'N') Or
     (aAccNew.fl_pgiro = 'Y' and CNRCTB035.ISAPREPGIRO(aAccNew) and aAccNew.cd_tipo_documento_cont <> CNRCTB018.TI_DOC_ACC_RES) Or
     (aAccNew.fl_pgiro = 'Y' and aAccNew.cd_tipo_documento_cont = CNRCTB018.TI_DOC_ACC_RES) Then

      If Not (aAccNew.im_accertamento =
                    CNRCTB048.GETIMNONRISCONTRATO(aAcc.cd_cds,aAcc.esercizio,aAcc.esercizio_originale,aAcc.pg_accertamento,aAcc.ti_gestione) And
              aAccNew.dt_cancellazione Is null) Then
		Return 'Y';
      End If;
  End If;

  If aAccNew.cd_terzo = aAcc.cd_terzo Then

     --Verifico se sono state aggiunte modifiche ai residui (record in OBBLIGAZIONE_MODIFICA)
	  Declare
	    contaRec NUMBER := 0;
	  Begin
	    Select Count(0) Into contaRec
	    From accertamento_modifica
	    Where cd_cds = aAccNew.Cd_cds
	    And   esercizio = aAccNew.esercizio
	    And   esercizio_originale = aAccNew.esercizio_originale
	    And   pg_accertamento = aAccNew.pg_accertamento;

            If contaRec > 0 Then
               return 'Y';
            End If;
	  End;
         -- rp 29/01/2010 ignoro lo stato del reversale in quanto non deve essere cmq 'deriportabile'
         Declare
	    contaRec NUMBER := 0;
	  Begin
	    Select Count(0) Into contaRec
	    From reversale_riga
	    Where cd_cds = aAccNew.Cd_cds
	    And   esercizio_accertamento = aAccNew.esercizio
	    And   esercizio_ori_accertamento = aAccNew.esercizio_originale
	    And   pg_accertamento = aAccNew.pg_accertamento;

            If contaRec > 0 Then
               return 'Y';
            End If;
	  End;
      -- confronto le scadenze
	  For aScadNew in (select *
	                   from  accertamento_scadenzario
	  	           where cd_cds = aAccNew.cd_cds And
	  	                 esercizio = aAccNew.esercizio And
	  	                 esercizio_originale = aAccNew.esercizio_originale And
	  	                 pg_accertamento = aAccNew.pg_accertamento
                           order by pg_accertamento_scadenzario) Loop

		if aScadNew.pg_acc_scad_ori_riporto is null then
		   return 'Y';  -- se una scadenza non ha ori riporto, è stata aggiunta
		end if;

		-- escludo da ulteriori controlli scadenze tali che:
		-- 		   - il documento è ACR_RES
		-- 		   - l'importo è nullo
		--		   - esiste una scadenza successiva con pari scad_ori_riporto
		-- per gestione del riporto in avanti di acr/acr_res dopo deriporto senza
		-- cancellazione fisica

		Begin
			select 1 into esisteAltraScadRiportata
			from dual
			where exists (select 1
				      from accertamento_scadenzario
				      where cd_cds 		= aScadNew.cd_cds And
				            esercizio 	        = aScadNew.esercizio And
				            esercizio_originale = aScadNew.esercizio_originale And
				            pg_accertamento 	= aScadNew.pg_accertamento And
				            pg_accertamento_scadenzario > aScadNew.pg_accertamento_scadenzario And
				            pg_acc_scad_ori_riporto 	= aScadNew.pg_acc_scad_ori_riporto);
		Exception when NO_DATA_FOUND then
			esisteAltraScadRiportata := 0;
		End;

		if not (aAccNew.cd_tipo_documento_cont = CNRCTB018.TI_DOC_ACC_RES And aScadNew.im_scadenza = 0 And esisteAltraScadRiportata = 1) Then
			aScad:=CNRCTB048.getOldScad(aAccNew,aScadNew);

			if (aAccNew.fl_pgiro = 'N') Or
			   (aAccNew.fl_pgiro = 'Y' and CNRCTB035.ISAPREPGIRO(aAccNew) and aAccNew.cd_tipo_documento_cont <> CNRCTB018.TI_DOC_ACC_RES) or
			   (aAccNew.fl_pgiro = 'Y' and aAccNew.cd_tipo_documento_cont = CNRCTB018.TI_DOC_ACC_RES) then

				  If Not (aScadNew.im_scadenza = aScad.im_scadenza - aScad.im_associato_doc_contabile and
				          aScadNew.im_associato_doc_amm = aScad.im_associato_doc_amm - aScad.im_associato_doc_contabile and
				          aScadNew.im_associato_doc_contabile = 0) Then
					return 'Y';
				  End If;
			end if;

                -- S.F. 25/02/2009 Eliminato il controllo perchè la data di scadenza non è una informazione sostanziale per
                --                 impedire il riporta indietro
/*
			if aScadNew.dt_scadenza_incasso = CNRCTB048.getDtScadenza(aScad.esercizio + 1, aScad.DT_SCADENZA_INCASSO) Then
				-- confronto dettagli scadenze:2 no
				-- potrebbe essere cambiata LdA per mappatura
				-- e l'imputazione finanziaria per riporto evoluto
				return 'N';
			else  -- una scadenza è cambiata
				return 'Y';

			end if;
*/

		end if;

	  End Loop; -- scadenze

          -- S.F. 25/02/2009 In assenza di uno qualsiasi dei casi in cui il documento è cambiato ritorna "N"
          return 'N';

  Else  -- è cambiata la testata (IL TERZO DELLA TESTATA)
  	  Return 'Y';
  End If;
End;

 procedure checkEsercizio(aEs number, aCdCds varchar2) is
 aNum number;
 begin
 -- condizione sull'esercizio per poter ribaltare doc cont:
 -- l'esercizio corrente è aperto, esiste l'esercizio successivo
  if not CNRCTB008.ISESERCIZIOAPERTO(aEs,aCdCds) then
   IBMERR001.RAISE_ERR_GENERICO('L''esercizio '||(aEs)||' non è aperto per il cds:'||aCdCds);
  end if;
--   if CNRCTB008.ISESERCIZIOCHIUSO(aEs,aCdCds) then
--    IBMERR001.RAISE_ERR_GENERICO('L''esercizio corrente '||aEs||' è chiuso per il cds:'||aCdCds);
--   end if;
  begin
  	   select 1 into aNum
	   from dual
	   where exists (select 1 from esercizio
	                 where cd_cds = aCdCds
					   and esercizio = aEs + 1);
  exception when no_data_found then
       ibmerr001.RAISE_ERR_GENERICO('L''esecizio '||(aEs+1)||'non è definito per il cds '||aCdCds);
  end;
 end;

 procedure checkDeRiportaScadEsNext(aObb obbligazione%rowtype, aObbScad obbligazione_scadenzario%rowtype, aObbNext obbligazione%rowtype, aObbScadNext obbligazione_scadenzario%rowtype) is
 aEsLP number;
 begin
  -- Controlla che i doc amministrativi collegati non siano stati pagati nel nuovo anno
  for aDocAmm in (select distinct
                    cd_tipo_documento_amm,
					cd_cds,
					esercizio,
					cd_unita_organizzativa,pg_documento_amm,
					ti_associato_manrev,
					is_sola_testata
				  from V_DOC_AMM_OBB
				    where
					      cd_cds_obbligazione         = aObbScadNext.cd_cds
					  and esercizio_obbligazione	  = aObbScadNext.esercizio
					  and esercizio_ori_obbligazione  = aObbScadNext.esercizio_originale
					  and pg_obbligazione		  = aObbScadNext.pg_obbligazione
					  and pg_obbligazione_scadenzario = aObbScadNext.pg_obbligazione_scadenzario
				  ) loop
	CNRCTB100.lockdocamm(aDocAmm.cd_tipo_documento_amm,aDocAmm.cd_cds,aDocAmm.esercizio,aDocAmm.cd_unita_organizzativa,aDocAmm.pg_documento_amm);
	-- se fattura passiva, verifico non sia stata associata una lettera di pagamento estero
	if aDocAmm.cd_tipo_documento_amm = CNRCTB100.TI_FATTURA_PASSIVA then
	   select esercizio_lettera into aEsLP
	   from fattura_passiva
	   where cd_cds = aDocAmm.cd_cds
	     and cd_unita_organizzativa = aDocAmm.cd_unita_organizzativa
		 and esercizio 				= aDocAmm.esercizio
		 and pg_fattura_passiva		= aDocAmm.pg_documento_amm;
	   if aEsLP > aDocAmm.esercizio then
          If cnrutil.isLabelObbligazione() Then
	   	    ibmerr001.RAISE_ERR_GENERICO('L''obbligazione '||CNRCTB035.getDesc(aObbNext)||' risulta associata a lettera di pagamento estero emessa nel nuovo esercizio');
       	  Else
	   	    ibmerr001.RAISE_ERR_GENERICO('L''impegno '||CNRCTB035.getDesc(aObbNext)||' risulta associato a lettera di pagamento estero emessa nel nuovo esercizio');
      	  End If;
	   end if;
	end if;
    -- Ciclo sulle righe (eventualemten fittizie ...)
    for aDocAmmRiga in (select * from V_DOC_AMM_OBB
				    where
					      cd_tipo_documento_amm       = aDocAmm.cd_tipo_documento_amm
					  and esercizio                   = aDocAmm.esercizio
					  and pg_documento_amm		  = aDocAmm.pg_documento_amm
					  and cd_cds			  = aDocAmm.cd_cds
					  and cd_unita_organizzativa      = aDocAmm.cd_unita_organizzativa
					  and cd_cds_obbligazione         = aObbScadNext.cd_cds
					  and esercizio_obbligazione	  = aObbScadNext.esercizio
					  and esercizio_ori_obbligazione  = aObbScadNext.esercizio_originale
					  and pg_obbligazione		  = aObbScadNext.pg_obbligazione
					  and pg_obbligazione_scadenzario = aObbScadNext.pg_obbligazione_scadenzario
					) loop
	      CNRCTB100.lockdocammRiga(aDocAmmRiga.cd_tipo_documento_amm,aDocAmmRiga.cd_cds,aDocAmmRiga.esercizio,aDocAmmRiga.cd_unita_organizzativa,aDocAmmRiga.pg_documento_amm,aDocAmmRiga.pg_riga);
          if aDocAmmRiga.esercizio = aObbNext.esercizio then
              If cnrutil.isLabelObbligazione() Then
                ibmerr001.RAISE_ERR_GENERICO('L''obbligazione '||CNRCTB035.getDesc(aObbNext)||' risulta associata a documento amministrativi emessi nel nuovo esercizio');
           	  Else
                ibmerr001.RAISE_ERR_GENERICO('L''impegno '||CNRCTB035.getDesc(aObbNext)||' risulta associato a documento amministrativi emessi nel nuovo esercizio');
          	  End If;
          end if;
          if aDocAmmRiga.stato_cofi = CNRCTB100.STATO_GEN_COFI_TOT_MR then
              If cnrutil.isLabelObbligazione() Then
                ibmerr001.RAISE_ERR_GENERICO('L''obbligazione '||CNRCTB035.getDesc(aObbNext)||' risulta associata a documento amministrativo (in parte) pagato nel nuovo esercizio');
           	  Else
                ibmerr001.RAISE_ERR_GENERICO('L''impegno '||CNRCTB035.getDesc(aObbNext)||' risulta associato a documento amministrativo (in parte) pagato nel nuovo esercizio');
          	  End If;
          end if;
          if not (aDocAmmRiga.ti_associato_manrev = CNRCTB100.TI_NON_ASSOC_MAN_REV) then
		   declare
		    lNum number;
		   begin
		   	select 1 into lNum
			from dual
			where exists (select 1 from mandato_riga
				  		  where cd_cds 				= aObbScadNext.cd_cds
						    and esercizio_obbligazione 		= aObbScadNext.esercizio
						    and esercizio_ori_obbligazione      = aObbScadNext.esercizio_originale
						    and pg_obbligazione 		= aObbScadNext.pg_obbligazione
						    and pg_obbligazione_scadenzario     = aObbScadNext.pg_obbligazione_scadenzario
						    and cd_cds_doc_amm 			= aDocAmmRiga.cd_cds
						    and cd_uo_doc_amm 			= aDocAmmRiga.cd_unita_organizzativa
						    and esercizio_doc_amm 		= aDocAmmRiga.esercizio
						    and cd_tipo_documento_amm 		= aDocAmmRiga.cd_tipo_documento_amm
						    and pg_doc_amm 			= aDocAmmRiga.pg_documento_amm);
			-- se esiste un mandato (anche annullato) legato alla scadenza nel nuovo esercizio
			-- allora l'obbligazione non può essere riportata indietro
            If cnrutil.isLabelObbligazione() Then
    			ibmerr001.RAISE_ERR_GENERICO('L''obbligazione '||CNRCTB035.getDesc(aObbNext)||' risulta essere o essere stata (parzialmente) pagata nel nuovo esercizio');
            Else
    			ibmerr001.RAISE_ERR_GENERICO('L''impegno '||CNRCTB035.getDesc(aObbNext)||' risulta essere o essere stata (parzialmente) pagato nel nuovo esercizio');
            End If;
		   exception when no_data_found then
		   	null; -- se il mandato (annullato) è sulla vecchia scadenza allora si può tornare indietro
		   end;
          end if;
	end loop;
  end loop;
 end;

 procedure checkDeRiportaEsNext(aObb in out obbligazione%rowtype, aObbNext obbligazione%rowtype) is
  aNum number;
  aAcc accertamento%rowtype;
  aAccScad accertamento_scadenzario%rowtype;
  aAccScadVoce accertamento_scad_voce%rowtype;
  aObbScad obbligazione_scadenzario%rowtype;
  aObbScadVoce obbligazione_scad_voce%rowtype;
  fl_par       parametri_cds.FL_RIPORTA_INDIETRO%Type;
 begin

  Begin
   Select Nvl(FL_RIPORTA_INDIETRO, 'N')
   Into   FL_PAR
   From   PARAMETRI_CDS PAR
   Where  PAR.CD_CDS = aObbNext.CD_CDS And
          PAR.ESERCIZIO = aObbNext.ESERCIZIO;

   If FL_PAR = 'N' Then
     ibmerr001.RAISE_ERR_GENERICO('Il CDS '||aObbNext.CD_CDS||' non è abilitato a riportare indietro documenti dall''esercizio '||aObbNext.ESERCIZIO||'.');
   End If;

  Exception
   When No_Data_Found Then
        ibmerr001.RAISE_ERR_GENERICO('Il CDS '||aObbNext.CD_CDS||' non possiede parametri per l''esercizio '||aObbNext.ESERCIZIO);
  End;

  -- Check documento riportato
  -- se pgiro cds, almeno una dele due parti deve essere riportata
  If aObb.fl_pgiro = 'Y' and not (aObb.cd_tipo_documento_cont in (CNRCTB018.TI_DOC_IMP_RES, CNRCTB018.TI_DOC_IMP)) Then
  	  if CNRCTB035.isAprePgiro(aObb) then
	  	 CNRCTB035.GETPGIROCDS(aObb,aObbScad,aObbScadVoce,aAcc,aAccScad,aAccScadVoce);
	  else
	  	 CNRCTB035.GETPGIROCDSINV(aObb,aObbScad,aObbScadVoce,aAcc,aAccScad,aAccScadVoce);
	  end if;
	  if not (aObb.riportato = 'Y' or aAcc.riportato = 'Y') then
	  	 ibmerr001.RAISE_ERR_GENERICO('L''annotazione su partita di giro non è riportata '||CNRCTB035.getDesc(aObb));
	  end if;
  Else
	  if not (aObb.riportato = 'Y') then
          If cnrutil.isLabelObbligazione() Then
            ibmerr001.RAISE_ERR_GENERICO('L''obbligazione non è riportata '||CNRCTB035.getDesc(aObb));
       	  Else
            ibmerr001.RAISE_ERR_GENERICO('L''impegno non è riportato '||CNRCTB035.getDesc(aObb));
      	  End If;
	  end if;
  End If;

  -- Verifica che non esistano variazioni formali
  begin
   select 1 into aNum from dual where exists (
    select 1 from
	VARIAZIONE_FORMALE_IMP where
     	      cd_cds = aObbNext.cd_cds
		  and esercizio = aObbNext.esercizio
		  and esercizio_originale = aObbNext.esercizio_originale
		  and pg_obbligazione = aObbNext.pg_obbligazione
   );
   ibmerr001.RAISE_ERR_GENERICO('Esistono variazioni formali per l'''||cnrutil.getLabelObbligazioneMin()||' nel nuovo esercizio '||CNRCTB035.getDesc(aObbNext));
  exception when NO_DATA_FOUND then
   null;
  end;

  -- verifico se il documento è stato modificato nel nuovo esercizio rispetto a quanto riportato

  if CNRCTB048.isDocModificato(aObb,aObbNext) = 'Y' then
    If cnrutil.isLabelObbligazione() Then
      ibmerr001.RAISE_ERR_GENERICO('L''obbligazione è stata modificata nel nuovo esercizio, non può essere riportata indietro '||CNRCTB035.GETDESC(aObbNext));
    Else
      ibmerr001.RAISE_ERR_GENERICO('L''impegno è stata modificato nel nuovo esercizio, non può essere riportato indietro '||CNRCTB035.GETDESC(aObbNext));
    End If;
  end if;

  -- verifica se esiste un ordine sull'obbligazione emesso nel nuovo esercizio
  begin
  	   select 1 into aNum from dual
	   where exists (select 1 from ordine
	   		 		 where cd_cds = aObbNext.cd_cds
					   and esercizio = aObbNext.esercizio
					   and esercizio_ori_obbligazione = aObbNext.esercizio_originale
					   and pg_obbligazione = aObbNext.pg_obbligazione);
	   ibmerr001.RAISE_ERR_GENERICO('Esiste un ordine emesso sull'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.getDesc(aObbNext));
  exception when NO_DATA_FOUND then
    null;
  end;
 end;

 procedure checkDeRiportaScadEsNext(aAcc accertamento%rowtype, aAccScad accertamento_scadenzario%rowtype, aAccNext accertamento%rowtype, aAccScadNext accertamento_scadenzario%rowtype) is
 begin
  -- Controlla che i doc amministrativi collegati non siano stati pagati nel nuovo anno
  for aDocAmm in (select distinct
                    cd_tipo_documento_amm,
					cd_cds,
					esercizio,
					cd_unita_organizzativa,pg_documento_amm,
					ti_associato_manrev,
					is_sola_testata
                  from V_DOC_AMM_ACC
				    where cd_cds_accertamento         = aAccScadNext.cd_cds
					  and esercizio_accertamento	  = aAccScadNext.esercizio
					  and esercizio_ori_accertamento  = aAccScadNext.esercizio_originale
					  and pg_accertamento			  = aAccScadNext.pg_accertamento
					  and pg_accertamento_scadenzario = aAccScadNext.pg_accertamento_scadenzario
				) loop
	CNRCTB100.lockdocamm(aDocAmm.cd_tipo_documento_amm,aDocAmm.cd_cds,aDocAmm.esercizio,aDocAmm.cd_unita_organizzativa,aDocAmm.pg_documento_amm);
    -- Ciclo sulle righe (eventualemten fittizie ...)
    for aDocAmmRiga in (select * from V_DOC_AMM_ACC
				    where
					      cd_tipo_documento_amm       = aDocAmm.cd_tipo_documento_amm
					  and esercizio                   = aDocAmm.esercizio
					  and pg_documento_amm			  = aDocAmm.pg_documento_amm
					  and cd_cds					  = aDocAmm.cd_cds
					  and cd_unita_organizzativa      = aDocAmm.cd_unita_organizzativa
					  and cd_cds_accertamento         = aAccScadNext.cd_cds
					  and esercizio_accertamento	  = aAccScadNext.esercizio
					  and esercizio_ori_accertamento  = aAccScadNext.esercizio_originale
					  and pg_accertamento			  = aAccScadNext.pg_accertamento
					  and pg_accertamento_scadenzario = aAccScadNext.pg_accertamento_scadenzario
	) loop
	     CNRCTB100.lockdocammRiga(aDocAmmRiga.cd_tipo_documento_amm,aDocAmmRiga.cd_cds,aDocAmmRiga.esercizio,aDocAmmRiga.cd_unita_organizzativa,aDocAmmRiga.pg_documento_amm,aDocAmmRiga.pg_riga);
        if aDocAmmRiga.esercizio = aAccNext.esercizio then
         ibmerr001.RAISE_ERR_GENERICO('L''accertamento '||CNRCTB035.getDesc(aAccNext)||' risulta associato a documento amministrativi emessi nel nuovo esercizio');
		end if;
        if aDocAmmRiga.stato_cofi = CNRCTB100.STATO_GEN_COFI_TOT_MR then
         ibmerr001.RAISE_ERR_GENERICO('L''accertamento '||CNRCTB035.getDesc(aAccNext)||' risulta associato a documento amministrativo (in parte) pagato nel nuovo esercizio');
        end if;
        if not (aDocAmmRiga.ti_associato_manrev = CNRCTB100.TI_NON_ASSOC_MAN_REV) then
		 declare
		  lNum number;
		 begin
		  select 1 into lNum
		  from dual
		  where exists (select 1 from reversale_riga
		  			    where cd_cds = aAccScadNext.cd_cds
						  and esercizio_accertamento 	  = aAccScadNext.esercizio
						  and esercizio_ori_accertamento  = aAccScadNext.esercizio_originale
						  and pg_accertamento 		 	  = aAccScadNext.pg_accertamento
						  and pg_accertamento_scadenzario = aAccScadNext.pg_accertamento_scadenzario
						  and cd_cds_doc_amm 			  = aDocAmmRiga.cd_cds
						  and cd_uo_doc_amm				  = aDocAmmRiga.cd_unita_organizzativa
						  and esercizio_doc_amm			  = aDocAmmRiga.esercizio
						  and cd_tipo_documento_amm		  = aDocAmmRiga.cd_tipo_documento_amm
						  and pg_doc_amm				  = aDocAmmRiga.pg_documento_amm);
		  -- se esiste una reversale (anche annullata) collegata all'accertamento
		  -- nel nuovo esercizio, non è possibile tornare indietro

		  ibmerr001.RAISE_ERR_GENERICO('L''accertamento '||CNRCTB035.getDesc(aAccNext)||' risulta essere o essere stato (parzialmente) pagato nel nuovo esercizio');
		 exception when NO_DATA_FOUND then
		  null;  -- se la reversale (annullata) è sulla vecchia scadenza allora posso tornare indietro
		 end;
        end if;
	end loop;
  end loop;
 end;

 procedure checkDeRiportaEsNext(aAcc in out accertamento%rowtype, aAccNext accertamento%rowtype) is
  aNum number;
  aAccScad accertamento_scadenzario%rowtype;
  aAccScadVoce accertamento_scad_voce%rowtype;
  aObb obbligazione%rowtype;
  aObbScad obbligazione_scadenzario%rowtype;
  aObbScadVoce obbligazione_scad_voce%rowtype;
  fl_par       parametri_cds.FL_RIPORTA_INDIETRO%Type;

 begin

  Begin
   Select Nvl(FL_RIPORTA_INDIETRO, 'N')
   Into   FL_PAR
   From   PARAMETRI_CDS PAR
   Where  PAR.CD_CDS = aAccNext.CD_CDS And
          PAR.ESERCIZIO = aAccNext.ESERCIZIO;

   If FL_PAR = 'N' Then
     ibmerr001.RAISE_ERR_GENERICO('Il CDS '||aAccNext.CD_CDS||' non è abilitato a riportare indietro documenti dall''esercizio '||aAccNext.ESERCIZIO||'.');
   End If;

  Exception
   When No_Data_Found Then
        ibmerr001.RAISE_ERR_GENERICO('Il CDS '||aAccNext.CD_CDS||' non possiede parametri per l''esercizio '||aAccNext.ESERCIZIO);
  End;

  -- Check documento riportato
  -- se pgiro cds, almeno una dele due parti deve essere riportata
  if aAcc.fl_pgiro = 'Y' and not (aAcc.cd_tipo_documento_cont in (CNRCTB018.TI_DOC_ACC_RES, CNRCTB018.TI_DOC_ACC))
  then
  	  if CNRCTB035.isAprePgiro(aAcc) then
	  	 CNRCTB035.GETPGIROCDS(aAcc,aAccScad,aAccScadVoce,aObb,aObbScad,aObbScadVoce);
	  else
	  	 CNRCTB035.GETPGIROCDSINV(aAcc,aAccScad,aAccScadVoce,aObb,aObbScad,aObbScadVoce);
	  end if;
	  if not (aObb.riportato = 'Y' or aAcc.riportato = 'Y') then
	  	 ibmerr001.RAISE_ERR_GENERICO('L''annotazione su partita di giro non è riportata '||CNRCTB035.getDesc(aObb));
	  end if;
  else
	  if not (aAcc.riportato = 'Y') then
	   ibmerr001.RAISE_ERR_GENERICO('L'''||cnrutil.getLabelObbligazioneMin()||' non è riportata '||CNRCTB035.getDesc(aObb));
	  end if;
  end if;

  -- Verifica che non esistano variazioni formali
  begin
   select 1 into aNum from dual where exists (
    select 1 from VARIAZIONE_FORMALE_ACC where
     	      cd_cds = aAccNext.cd_cds
		  and esercizio = aAccNext.esercizio
		  and esercizio_originale  = aAccNext.esercizio_originale
		  and pg_accertamento = aAccNext.pg_accertamento
   );
   ibmerr001.RAISE_ERR_GENERICO('Esistono variazioni formali per l''accertamento nel nuovo esercizio'||CNRCTB035.getDesc(aAccNext));
  exception when NO_DATA_FOUND then
   null;
  end;
  -- verifico se il documento è stato modificato nel nuovo esercizio
  -- rispetto a quanto riportato
  if CNRCTB048.isDocModificato(aAcc,aAccNext) = 'Y' then
    ibmerr001.RAISE_ERR_GENERICO('L''accertamento è stato modificato nel nuovo esercizio, non può essere riportato indietro '||CNRCTB035.GETDESC(aAccNext));
  end if;
 end;

 procedure aggiornaDocAmm(aScad         obbligazione_scadenzario%rowtype,
		  	  aObbScadNext  obbligazione_scadenzario%rowtype,
			  aUser         varchar2,
			  aTSNow        date) is
 begin
	for aDocAmm in (select distinct cd_tipo_documento_amm,cd_cds,esercizio,cd_unita_organizzativa,pg_documento_amm, is_sola_testata from V_DOC_AMM_OBB d
				    where cd_cds_obbligazione         = aScad.cd_cds
					  and esercizio_obbligazione	  = aScad.esercizio
					  and esercizio_ori_obbligazione  = aScad.esercizio_originale
					  and pg_obbligazione		  = aScad.pg_obbligazione
					  and pg_obbligazione_scadenzario = aScad.pg_obbligazione_scadenzario
					  and not exists (select 1
		   	   	   		   	  from mandato_riga mriga,
						   	       mandato man
 	   	   	   		   		  where mriga.CD_CDS = aScad.cd_cds
						           and mriga.ESERCIZIO_OBBLIGAZIONE = aScad.esercizio
        		     				   and mriga.ESERCIZIO_ORI_OBBLIGAZIONE  = aScad.esercizio_originale
							   and mriga.PG_OBBLIGAZIONE	  = aScad.pg_obbligazione
							   and mriga.PG_OBBLIGAZIONE_SCADENZARIO = aScad.pg_obbligazione_scadenzario
							   and mriga.CD_CDS_DOC_AMM	 = d.cd_cds
							   and mriga.CD_UO_DOC_AMM	 = d.cd_unita_organizzativa
							   and mriga.ESERCIZIO_DOC_AMM	 = d.esercizio
							   and mriga.CD_TIPO_DOCUMENTO_AMM = d.cd_tipo_documento_amm
							   and mriga.PG_DOC_AMM	= d.pg_documento_amm
							   and man.cd_cds 	= mriga.cd_cds
							   and man.esercizio  	= mriga.esercizio
							   and man.pg_mandato 	= mriga.pg_mandato
							   and man.stato 	= 'P'
					  )
				   ) loop
        if aDocAmm.is_sola_testata = 'Y' then
         CNRCTB100.updatedocamm(aDocAmm.cd_tipo_documento_amm,aDocAmm.cd_cds,aDocAmm.esercizio,aDocAmm.cd_unita_organizzativa,aDocAmm.pg_documento_amm,
		  '
		    cd_cds_obbligazione = '''||aObbScadNext.cd_cds||''',
		    esercizio_obbligazione = '||aObbScadNext.esercizio||',
		    esercizio_ori_obbligazione = '||aObbScadNext.esercizio_originale||',
		    pg_obbligazione = '||aObbScadNext.pg_obbligazione||',
		    pg_obbligazione_scadenzario = '||aObbScadNext.pg_obbligazione_scadenzario||'
		  ',
		  null,
		  aUser,
		  aTsNow
		 );
		else
		 -- Aggiorna il pg_ver_rec della testata
         CNRCTB100.updatedocamm(aDocAmm.cd_tipo_documento_amm,aDocAmm.cd_cds,aDocAmm.esercizio,aDocAmm.cd_unita_organizzativa,aDocAmm.pg_documento_amm,
          '',
		  null,
		  aUser,
		  aTsNow
		 );
		 -- Cicla sulle righe del documento e le aggiorna
	     for aDocAmmRiga in (select * from V_DOC_AMM_OBB
				    where
					      cd_tipo_documento_amm       = aDocAmm.cd_tipo_documento_amm
					  and esercizio                   = aDocAmm.esercizio
					  and pg_documento_amm		  = aDocAmm.pg_documento_amm
					  and cd_cds			  = aDocAmm.cd_cds
					  and cd_unita_organizzativa      = aDocAmm.cd_unita_organizzativa
					  and cd_cds_obbligazione         = aScad.cd_cds
					  and esercizio_obbligazione	  = aScad.esercizio
					  and esercizio_ori_obbligazione  = aScad.esercizio_originale
					  and pg_obbligazione		  = aScad.pg_obbligazione
					  and pg_obbligazione_scadenzario = aScad.pg_obbligazione_scadenzario
					) loop
          CNRCTB100.updatedocammriga(aDocAmmRiga.cd_tipo_documento_amm,aDocAmmRiga.cd_cds,aDocAmmRiga.esercizio,aDocAmmRiga.cd_unita_organizzativa,aDocAmmRiga.pg_documento_amm,aDocAmmRiga.pg_riga,
		   '
		    cd_cds_obbligazione = '''||aObbScadNext.cd_cds||''',
		    esercizio_obbligazione = '||aObbScadNext.esercizio||',
		    esercizio_ori_obbligazione = '||aObbScadNext.esercizio_originale||',
		    pg_obbligazione = '||aObbScadNext.pg_obbligazione||',
		    pg_obbligazione_scadenzario = '||aObbScadNext.pg_obbligazione_scadenzario||'
		   ',
		   null,
		   aUser,
		   aTsNow
          );
		 end loop;
        end if;
	end loop;
 end;

 procedure aggiornaDocAmm(aScad accertamento_scadenzario%rowtype,
		  				 aAccScadNext accertamento_scadenzario%rowtype,
						 aUser varchar2,
						 aTSNow date) is
 begin
	for aDocAmm in (select distinct cd_tipo_documento_amm,cd_cds,esercizio,cd_unita_organizzativa,pg_documento_amm, is_sola_testata from V_DOC_AMM_ACC
				    where cd_cds_accertamento         = aScad.cd_cds
					  and esercizio_accertamento	  = aScad.esercizio
					  and esercizio_ori_accertamento  = aScad.esercizio_originale
					  and pg_accertamento			  = aScad.pg_accertamento
					  and pg_accertamento_scadenzario = aScad.pg_accertamento_scadenzario
					) loop
        if aDocAmm.is_sola_testata = 'Y' then
         CNRCTB100.updatedocamm(aDocAmm.cd_tipo_documento_amm,aDocAmm.cd_cds,aDocAmm.esercizio,aDocAmm.cd_unita_organizzativa,aDocAmm.pg_documento_amm,
		  '
		    cd_cds_accertamento = '''||aAccScadNext.cd_cds||''',
		    esercizio_accertamento = '||aAccScadNext.esercizio||',
		    esercizio_ori_accertamento = '||aAccScadNext.esercizio_originale||',
		    pg_accertamento = '||aAccScadNext.pg_accertamento||',
		    pg_accertamento_scadenzario = '||aAccScadNext.pg_accertamento_scadenzario||'
		  ',
		  null,
		  aUser,
		  aTsNow
		 );
		else
          CNRCTB100.updatedocamm(aDocAmm.cd_tipo_documento_amm,aDocAmm.cd_cds,aDocAmm.esercizio,aDocAmm.cd_unita_organizzativa,aDocAmm.pg_documento_amm,
          '',
    	  null,
    	  aUser,
    	  aTsNow
    	 );
     	 for aDocAmmRiga in (select * from V_DOC_AMM_ACC
				    where
					      cd_tipo_documento_amm       = aDocAmm.cd_tipo_documento_amm
					  and esercizio                   = aDocAmm.esercizio
					  and pg_documento_amm			  = aDocAmm.pg_documento_amm
					  and cd_cds					  = aDocAmm.cd_cds
					  and cd_unita_organizzativa     = aDocAmm.cd_unita_organizzativa
                      and cd_cds_accertamento         = aScad.cd_cds
					  and esercizio_accertamento	  = aScad.esercizio
					  and esercizio_ori_accertamento  = aScad.esercizio_originale
					  and pg_accertamento			  = aScad.pg_accertamento
					  and pg_accertamento_scadenzario = aScad.pg_accertamento_scadenzario
          ) loop
           CNRCTB100.updatedocammriga(aDocAmmRiga.cd_tipo_documento_amm,aDocAmmRiga.cd_cds,aDocAmmRiga.esercizio,aDocAmmRiga.cd_unita_organizzativa,aDocAmmRiga.pg_documento_amm,aDocAmmRiga.pg_riga,
   		   '
		     cd_cds_accertamento = '''||aAccScadNext.cd_cds||''',
		     esercizio_accertamento = '||aAccScadNext.esercizio||',
		     esercizio_ori_accertamento = '||aAccScadNext.esercizio_originale||',
		     pg_accertamento = '||aAccScadNext.pg_accertamento||',
		     pg_accertamento_scadenzario = '||aAccScadNext.pg_accertamento_scadenzario||'
		   ',
		   null,
		   aUser,
		   aTsNow
          );
         end loop;
		end if;
	end loop;
 end;

Procedure checkNoRiporta(aObb obbligazione%rowtype) Is
  aNum number;

Begin

For aDocAmm In (Select Distinct cd_tipo_documento_amm, cd_cds, esercizio, cd_unita_organizzativa, pg_documento_amm,
 				stato_pagamento_fondo_eco, stato_coge, stato_coan
		from   V_DOC_AMM_OBB
        	Where  cd_cds_obbligazione    = aObb.cd_cds And
        	       esercizio_obbligazione	= aObb.esercizio And
        	       esercizio_ori_obbligazione  = aObb.esercizio_originale And
        	       pg_obbligazione  = aObb.pg_obbligazione) Loop

    CNRCTB100.lockdocamm(aDocAmm.cd_tipo_documento_amm,aDocAmm.cd_cds,aDocAmm.esercizio,aDocAmm.cd_unita_organizzativa,aDocAmm.pg_documento_amm);

    If aDocAmm.stato_pagamento_fondo_eco <> CNRCTB100.STATO_NO_PFONDOECO Then
	 -- se il doc amm è assegnato a fondo ma non ancora associato deve essere
	 -- possibile riportare il documento contabile
	 -- se il doc amm è già legato a spesa del fondo, non si può riportare
	 Begin
	 	 select 1 into aNum
		 from dual
		 where exists (select 1
			       from  fondo_spesa
			       where cd_tipo_documento_amm = aDocAmm.cd_tipo_documento_amm And
			             cd_cds_doc_amm		   = aDocAmm.cd_cds And
			             cd_uo_doc_amm		   = aDocAmm.cd_unita_organizzativa And
			             esercizio_doc_amm	   = aDocAmm.esercizio And
			             pg_documento_amm	   = aDocAmm.pg_documento_amm);
		 IBMERR001.RAISE_ERR_GENERICO('L'''||cnrutil.getLabelObbligazioniMin()||' '||CNRCTB035.GETDESC(aObb)||' risulta associata a fondo economale');
	 Exception when no_data_found then
	 	 null;
	 End;
    End If;

    If aDocAmm.cd_tipo_documento_amm in (CNRCTB100.TI_GEN_CORI_VER_SPESA) then
           IBMERR001.RAISE_ERR_GENERICO('L'''||cnrutil.getLabelObbligazioniMin()||' '||CNRCTB035.GETDESC(aObb)||' è gestito in automatico alla liquidazione CORI o è di liquidazione IVA');
    End If;
  -- Rospuc 07/12/2016 Omessa contabilizzazione
	-- controlli commentati per test
	-- ATT!! TOGLIERE COMMENTI!!!
    If aDocAmm.stato_coge not in (CNRCTB100.STATO_COEP_CON,CNRCTB100.STATO_COEP_EXC) then
	   ibmerr001.RAISE_ERR_GENERICO('L'''||cnrutil.getLabelObbligazioniMin()||' '||CNRCTB035.GETDESC(aObb)||' risulta associato a documento amministrativo da contabilizzare ('||
                   aDocAmm.cd_tipo_documento_amm||'/'||aDocAmm.cd_cds||'/'||aDocAmm.esercizio||'/'||aDocAmm.cd_unita_organizzativa||'/'||
                   aDocAmm.pg_documento_amm||')');
    End if;

    If aDocAmm.stato_coan not in (CNRCTB100.STATO_COEP_CON,CNRCTB100.STATO_COEP_EXC) then
	   ibmerr001.RAISE_ERR_GENERICO('L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' risulta associato a documento amministrativo da contabilizzare ('||
               aDocAmm.cd_tipo_documento_amm||'/'||aDocAmm.cd_cds||'/'||aDocAmm.esercizio||'/'||aDocAmm.cd_unita_organizzativa||'/'||
               aDocAmm.pg_documento_amm||')');
    End If;
   -- fine  Rospuc 07/12/2016 Omessa contabilizzazione
End Loop;

  -- Verifica che l'obbligazione non sia collegata a fondo economale

For aSpesa in (Select *
               From  fondo_spesa
               Where cd_cds_obbligazione = aObb.cd_cds And
                     esercizio_obbligazione=aObb.esercizio And
                     esercizio_ori_obbligazione=aObb.esercizio_originale And
                     pg_obbligazione=aObb.pg_obbligazione) Loop
    IBMERR001.RAISE_ERR_GENERICO('L''obbligazione '||CNRCTB035.GETDESC(aObb)||' risulta associato a spese non documentate del fondo economale');
End Loop;


If aObb.fl_pgiro = 'Y' Then

-- Verifica che l'obbligazione non sia collegata a CORI di compenso ...
-- 25.10.2007 S.F. ... ma sono se ha importi da ribaltare (A CAUSA DEL NUOVO RIBALTAMENTO DELLE PARTITE DI GIRO,
-- DAVA ERRORE SE L'ACCERTAMENTO SI TRASCINAVA QUESTO NEL NUOVO ANNO ANCHE SE DEVE ESSERE CREATO A ZERO)

   Begin
--    If cnrctb048.getImNonPagatoRiscosso(aObb.Cd_Cds, aObb.Esercizio, aObb.esercizio_originale, aObb.pg_obbligazione, 'S') > 0 Then
       Select distinct 1
       Into   aNum
       From   contributo_ritenuta
       Where  cd_cds_obbligazione = aObb.cd_cds And
              esercizio_obbligazione = aObb.esercizio And
              esercizio_ori_obbligazione = aObb.esercizio_originale And
              pg_obbligazione = aObb.pg_obbligazione;
       IBMERR001.RAISE_ERR_GENERICO('L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' risulta associato a CORI di compensi');
--    End If;
   Exception
     When NO_DATA_FOUND Then Null;
   End;


   -- Verifica che l'obbligazione non sia di liquidazione_cori
   For aGruppoCentro in (Select *
                         From liquid_gruppo_centro
                         Where cd_cds_obb_accentr = aObb.cd_cds And
                               esercizio_obb_accentr=aObb.esercizio And
                               esercizio_ori_obb_accentr=aObb.esercizio_originale And
                               pg_obb_accentr=aObb.pg_obbligazione) Loop
     IBMERR001.RAISE_ERR_GENERICO('L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' risulta parte di liquidazione CORI accentrata (l''obbligazione è presente in LIQUID_GRUPPO_CENTRO)');
   End Loop;

   -- Verifica che l'obbligazione non sia di liquidazione_iva_accentrata
   For aGruppoCentro in (Select *
                         From  liquidazione_iva_centro
                         Where cd_cds_obb_accentr = aObb.cd_cds And
                               esercizio_obb_accentr=aObb.esercizio And
                               esercizio_ori_obb_accentr=aObb.esercizio_originale And
                               pg_obb_accentr=aObb.pg_obbligazione) Loop
    IBMERR001.RAISE_ERR_GENERICO('L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' risulta parte di liquidazione IVA al centro (l''obbligazione è presente in LIQUIDAZIONE_IVA_CENTRO)');
   End Loop;
End If; -- l'if partita di giro

End;

 procedure checkNoRiporta(aAcc accertamento%rowtype) is
  aNum number;
 begin
  for aDocAmm in (select distinct
                    cd_tipo_documento_amm,
					cd_cds,
					esercizio,
					cd_unita_organizzativa,
					pg_documento_amm,
					stato_cofi,
					stato_coge,
					stato_coan
				  from V_DOC_AMM_ACC
				    where
					      cd_cds_accertamento         = aAcc.cd_cds
					  and esercizio_accertamento	  = aAcc.esercizio
					  and esercizio_ori_accertamento  = aAcc.esercizio_originale
					  and pg_accertamento			  = aAcc.pg_accertamento
				  ) loop
	CNRCTB100.lockdocamm(aDocAmm.cd_tipo_documento_amm,aDocAmm.cd_cds,aDocAmm.esercizio,aDocAmm.cd_unita_organizzativa,aDocAmm.pg_documento_amm);
    if aDocAmm.cd_tipo_documento_amm in (CNRCTB100.TI_GEN_CORI_VER_ENTRATA) then
     IBMERR001.RAISE_ERR_GENERICO('L''accertamento '||CNRCTB035.GETDESC(aAcc)||' è gestito in automatico alla liquidazione CORI');
	end if;
	/*RP 07/12/2016 Omessa contabilizzazione
	-- controlli commentati per test
	-- ATT!! TOGLIERE COMMENTI!!!
	if aDocAmm.stato_coge not in (CNRCTB100.STATO_COEP_CON,CNRCTB100.STATO_COEP_EXC) Then
	   If aDocAmm.stato_cofi != CNRCTB100.STATO_GEN_COFI_ANN Then
	     ibmerr001.RAISE_ERR_GENERICO('L''accertamento '||CNRCTB035.GETDESC(aAcc)||' risulta associato a documento amministrativo da contabilizzare in economica ('||
               aDocAmm.cd_tipo_documento_amm||'/'||aDocAmm.cd_cds||'/'||aDocAmm.esercizio||'/'||aDocAmm.cd_unita_organizzativa||'/'||
               aDocAmm.pg_documento_amm||')');
           Else
	     ibmerr001.RAISE_ERR_GENERICO('L''accertamento '||CNRCTB035.GETDESC(aAcc)||' risulta associato a un dettaglio annullato di documento amministrativo da contabilizzare in economica ('||
               aDocAmm.cd_tipo_documento_amm||'/'||aDocAmm.cd_cds||'/'||aDocAmm.esercizio||'/'||aDocAmm.cd_unita_organizzativa||'/'||
               aDocAmm.pg_documento_amm||')');
           End If;
	end if;

	if aDocAmm.stato_coan not in (CNRCTB100.STATO_COEP_CON,CNRCTB100.STATO_COEP_EXC) then
	   ibmerr001.RAISE_ERR_GENERICO('L''accertamento '||CNRCTB035.GETDESC(aAcc)||' risulta associato a documento amministrativo da contabilizzare in analitica ('||
               aDocAmm.cd_tipo_documento_amm||'/'||aDocAmm.cd_cds||'/'||aDocAmm.esercizio||'/'||aDocAmm.cd_unita_organizzativa||'/'||
               aDocAmm.pg_documento_amm||')');
	end if;
	*/
  end loop;
  -- Verifica che l'accertamento non sia collegata a CORI di compenso
  if aAcc.fl_pgiro = 'Y' then
   begin
    select distinct 1 into aNum from contributo_ritenuta where
	        cd_cds_accertamento = aAcc.cd_cds
        and esercizio_accertamento = aAcc.esercizio
        and esercizio_ori_accertamento  = aAcc.esercizio_originale
	    and pg_accertamento = aAcc.pg_accertamento;
    IBMERR001.RAISE_ERR_GENERICO('L''accertamento '||CNRCTB035.GETDESC(aAcc)||' risulta associato a CORI di compensi');
   exception when NO_DATA_FOUND then
    null;
   end;
   -- Verifica che l'obbligazione non sia di liquidazione_cori
   for aGruppoCentro in (select * from liquid_gruppo_centro_comp where
                               cd_cds_acc_accentr = aAcc.cd_cds
							   and esercizio_acc_accentr=aAcc.esercizio
							   and esercizio_ori_acc_accentr=aAcc.esercizio_originale
							   and pg_acc_accentr=aAcc.pg_accertamento)
   loop
    IBMERR001.RAISE_ERR_GENERICO('L''accertamento '||CNRCTB035.GETDESC(aAcc)||' risulta parte di liquidazione CORI accentrata');
   end loop;
  end if;
 end;

Procedure checkRiportaEsNext(aAcc accertamento%rowtype, controlloRibalt boolean, controlloVoce boolean) Is
aErrMsn varchar2(4000);
aDt     date;
aUo     unita_organizzativa%rowtype;
aEs     number;
aNum    number;
fl_par  parametri_cds.FL_RIPORTA_INDIETRO%Type;
fl_ria  parametri_cds.FL_RIACCERTAMENTO%Type;
begin
  Begin
   Select Nvl(FL_RIPORTA_AVANTI, 'N'), Nvl(FL_RIACCERTAMENTO, 'Y')
   Into   FL_PAR, FL_RIA
   From   PARAMETRI_CDS PAR
   Where  PAR.CD_CDS = aAcc.CD_CDS_origine And
          PAR.ESERCIZIO = aAcc.ESERCIZIO;

   If FL_PAR = 'N' Then
     ibmerr001.RAISE_ERR_GENERICO('Il CDS '||aAcc.CD_CDS||' non è abilitato a riportare avanti documenti dall''esercizio '||aAcc.ESERCIZIO||'.');
   End If;

   If aAcc.cd_tipo_documento_cont = CNRCTB018.TI_DOC_ACC_RES And FL_RIA = 'Y' And aAcc.STATO_RESIDUO is null and aAcc.FL_PGIRO='N' Then
     ibmerr001.RAISE_ERR_GENERICO('L''accertamento '||CNRCTB035.GETDESC(aAcc)||' è un documento privo dello stato. Ribaltamento non possibile!');
   End If;

  Exception
   When No_Data_Found Then
        ibmerr001.RAISE_ERR_GENERICO('Il CDS '||aAcc.CD_CDS||' non possiede parametri per l''esercizio '||aAcc.ESERCIZIO);
  End;

	aEs := aAcc.esercizio + 1;

	-- documento già riportato
	if aAcc.riportato = 'Y' then
	   aErrMsn := 'L''accertamento '||CNRCTB035.GETDESC(aAcc)||' è un documento già riportato nel nuovo esercizio';
	   ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
	end if;

	-- verifico se il documento ha importo nullo
	-- se non è pgiro, o se origine di pgiro
	if (aAcc.fl_pgiro = 'Y' and CNRCTB035.ISAPREPGIRO(aAcc))
	   or
	   (aAcc.fl_pgiro = 'N')
	then
		if aAcc.im_accertamento = 0 then
		   aErrMsn := 'L''accertamento '||CNRCTB035.GETDESC(aAcc)||' non viene riportato in quanto ha importo nullo';
		   ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
		end if;
	end if;

	-- verifico se il documento è ribaltabile
	if controlloRibalt then
		if isEligibileRibalt(CNRCTB001.GESTIONE_ENTRATE,
		   					 aAcc.cd_cds,
							 aAcc.esercizio,
							 aAcc.esercizio_originale,
							 aAcc.pg_accertamento) = 'N' Then
                  If isAccEsaurito (aAcc) Then
 		     aErrMsn := 'L''accertamento '||CNRCTB035.GETDESC(aAcc)||' non è un documento ribaltabile. '||
' Esso risulta completamente riscosso.';
		     ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
                  Elsif  getImPagRiscNonRiscontrato(aAcc.cd_cds, aAcc.esercizio, aAcc.esercizio_originale, aAcc.pg_accertamento, 'E') > 0 Then
 		     aErrMsn := 'L''accertamento '||CNRCTB035.GETDESC(aAcc)||' non è un documento ribaltabile. '||
' Verificare che le reversali associate alle scadenze riscosse dell''Accertamento siano totalmente riscontrate. La quota non riscontrata risulta di '||Ltrim(Rtrim(To_Char(getImPagRiscNonRiscontrato(aAcc.cd_cds, aAcc.esercizio, aAcc.esercizio_originale, aAcc.pg_accertamento, 'E'), '999g999g999g999g999g990d00')))||'.';
		     ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
                  Else
		   aErrMsn := 'L''accertamento '||CNRCTB035.GETDESC(aAcc)||' non è un documento ribaltabile per cause generiche.';
		   ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
                  End If;
		end if;
	end if;


	-- verifico se il documento è associato a pratiche CORI, IVA, FONDO ECONOMALE
	checkNoRiporta(aAcc);

	-- verifico la validità del terzo nell'anno su cui si ribalta
	select dt_fine_rapporto into aDt
	from terzo
	where cd_terzo = aAcc.cd_terzo;
	if to_number(to_char(aDt,'YYYY')) < aEs then
	   aErrMsn := 'L''accertamento '||CNRCTB035.GETDESC(aAcc)||' non può essere riportato: terzo '||aAcc.cd_terzo||' non valido nell''esercizio '||aEs;
	   ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
	end if;

	-- verifico la validità della voce_f sul nuovo esercizio
	-- se non ribalto con cambio imputazione finanziaria
	if controlloVoce then
	    declare
		  recParametriCNR PARAMETRI_CNR%Rowtype;
        begin
          recParametriCNR := CNRUTL001.getRecParametriCnr(aEs);
		  if recParametriCNR.fl_nuovo_pdg is null or recParametriCNR.fl_nuovo_pdg='N' Then
  			select dacr into aDt
			from voce_f
			where esercizio       = aEs
			  and ti_appartenenza = aAcc.ti_appartenenza
			  and ti_gestione	  = aAcc.ti_gestione
			  and cd_voce		  = aAcc.cd_voce;
		  End If;
		exception when NO_DATA_FOUND then
			aErrMsn := 'L''accertamento '||CNRCTB035.GETDESC(aAcc)||' non può essere riportato: capitolo '||aAcc.cd_voce||' non esistente sull''esercizio '||aEs;
			ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
		end;
	end if;

	-- verifico la validità dell'unità organizzativa sul nuovo esercizio
	aUo := CNRCTB020.GETUOVALIDA(aEs, aAcc.cd_unita_organizzativa);

end;

procedure checkRiportaEsNext(aObb obbligazione%rowtype, controlloRibalt boolean) is
--aObbV v_obbligazione_accertamento%rowtype;
aDt date;
aUO unita_organizzativa%rowtype;
aErrMsn varchar2(4000);
aEs number;
aNum number;

fl_par  parametri_cds.FL_RIPORTA_INDIETRO%Type;

Begin

  Begin
   Select Nvl(FL_RIPORTA_AVANTI, 'N')
   Into   FL_PAR
   From   PARAMETRI_CDS PAR
   Where  PAR.CD_CDS = aObb.CD_CDS And
          PAR.ESERCIZIO = aObb.ESERCIZIO;

   If FL_PAR = 'N' Then
     ibmerr001.RAISE_ERR_GENERICO('Il CDS '||aObb.CD_CDS||' non è abilitato a riportare avanti documenti dall''esercizio '||aObb.ESERCIZIO||'.');
   End If;

  Exception
   When No_Data_Found Then
        ibmerr001.RAISE_ERR_GENERICO('Il CDS '||aObb.CD_CDS||' non possiede parametri per l''esercizio '||aObb.ESERCIZIO);
  End;

	aEs := aObb.esercizio + 1;

	-- documento già riportato
	if aObb.riportato = 'Y' then
	   aErrMsn := 'L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' è un documento già riportato nel nuovo esercizio';
	   ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
	end if;


	-- verifico se il documento ha importo nullo
	-- solo se no pgiro, o se origine di pgiro
	if (aObb.fl_pgiro = 'N')
	   or
	   (aObb.fl_pgiro = 'Y' and CNRCTB035.ISAPREPGIRO(aObb))
	then
		if aObb.im_obbligazione = 0 then
		   aErrMsn := 'L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' non viene riportato in quanto ha importo nullo';
		   ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
		end if;
	end if;

    -- verifico se il documento è provvisorio e non ha determina allegata se deve essere obbligatoria la determina
    If aObb.stato_obbligazione = cnrctb035.STATO_PROVVISORIO and
       (aObb.FL_DETERMINA_ALLEGATA ='N' OR TO_CHAR(aObb.DT_DETERMINA_ALLEGATA,'YYYY') > aObb.esercizio) then
       Declare
           pRibaltaDeterminaObblig parametri_cds.fl_ribalta_determina_obblig%type;
           pFlDeterminaAllegata aObb.FL_DETERMINA_ALLEGATA%type := 'N';
           pDtDeterminaAllegata aObb.DT_DETERMINA_ALLEGATA%type;
       Begin
           Select fl_ribalta_determina_obblig
           into pRibaltaDeterminaObblig
           from parametri_cds
           where esercizio = aObb.esercizio
           and   cd_cds = aObb.cd_cds;

           If pRibaltaDeterminaObblig = 'Y' Then
              pFlDeterminaAllegata := aObb.FL_DETERMINA_ALLEGATA;
              pDtDeterminaAllegata := aObb.DT_DETERMINA_ALLEGATA;

              If pFlDeterminaAllegata ='N' Then
                 --devo verificare che la delibera non sia stata collegata su obbligazioni simili di anni precedenti
                 Begin
                    Select FL_DETERMINA_ALLEGATA, DT_DETERMINA_ALLEGATA
                    into pFlDeterminaAllegata, pDtDeterminaAllegata
                    from obbligazione
                    where esercizio < aObb.esercizio
                    and   esercizio_originale = aObb.esercizio_originale
                    and   cd_cds = aObb.cd_cds
                    and   pg_obbligazione = aObb.pg_obbligazione
                    and   FL_DETERMINA_ALLEGATA = 'Y';
                 Exception
                    When too_many_rows Then
                       aErrMsn := 'L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' è un documento Provvisorio su cui sono state collegate troppe determine.';
                       ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
                    When no_data_found Then
                       null;
                 End;
              End If;

              If pFlDeterminaAllegata ='N' OR TRUNC(pDtDeterminaAllegata) > TRUNC(sysdate) Then
	             If pFlDeterminaAllegata ='N' Then
    	            aErrMsn := 'L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' è un documento Provvisorio senza determina.';
	             Else
                  	aErrMsn := 'L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' è un documento Provvisorio con determina avente data protocollo superiore alla data odierna.';
              	 End if;
                 ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
	          End if;
           End if;
       End;
    End If;

	-- verifico se il documento è ribaltabile
	if controlloRibalt then
		if isEligibileRibalt(CNRCTB001.GESTIONE_SPESE,
		   					 aObb.cd_cds,
							 aObb.esercizio,
							 aObb.esercizio_originale,
							 aObb.pg_obbligazione) = 'N' then
                  If isObbEsaurita (aObb) Then
		   aErrMsn := 'L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' non è un documento ribaltabile. '||
' Risulta completamente pagato.';
		   ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
		     ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
                  Elsif  getImPagRiscNonRiscontrato(aObb.cd_cds, aObb.esercizio, aObb.esercizio_originale, aObb.pg_obbligazione, 'S') > 0 Then
		   aErrMsn := 'L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' non è un documento ribaltabile. '||
' Verificare che i mandati associati alle scadenze pagate dell''Impegno siano totalmente riscontrati. La quota non riscontrata risulta di '||Ltrim(Rtrim(To_Char(getImPagRiscNonRiscontrato(aObb.cd_cds, aObb.esercizio, aObb.esercizio_originale, aObb.pg_obbligazione, 'S'), '999g999g999g999g999g990d00')))||'.';
		   ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
                  Else
		   aErrMsn := 'L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' non è un documento ribaltabile per cause generiche.';
		   ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
                  End If;
		end if;
	end if;

	-- verifico se il documento è associato a pratiche CORI, IVA, FONDO ECONOMALE
	checkNoRiporta(aObb);

	-- verifico la validità del terzo sull'esercizio su cui si ribalta
	select dt_fine_rapporto into aDt
	from terzo
	where cd_terzo = aObb.cd_terzo;

	if to_number(to_char(aDt,'YYYY')) < aEs then
	   aErrMsn := 'L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' non può essere riportata: terzo '||aObb.cd_terzo||' non valido nell''esercizio '||aEs;
	   ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
	end if;

	-- verifico la validità dell'unità organizzativa sul nuovo esercizio
	aUo := CNRCTB020.GETUOVALIDA(aEs, aObb.cd_unita_organizzativa);

end;

Function getImNonRiscontrato(aCdCds varchar2, aEs number, aEsOri number, aPg number, aTiGestione varchar2) return number is
  aIm number;
 begin
	select im_acc_obb - im_riscontrato into aIm
	from v_obbligazione_accertamento
	where cd_cds      = aCdCds
	  and esercizio   = aEs
	  and esercizio_ori_acc_obb = aEsOri
	  and pg_acc_obb  = aPg
	  and ti_gestione = aTiGestione;

	return aIm;
end;

function getImPagRiscNonRiscontrato(aCdCds varchar2, aEs number, aEsOri number, aPg number, aTiGestione varchar2) return number Is
  aIm number;
 begin
	select IM_ASSOCIATO_REV_MAN - im_riscontrato into aIm
	from v_obbligazione_accertamento
	where cd_cds      = aCdCds
	  and esercizio   = aEs
	  and esercizio_ori_acc_obb = aEsOri
	  and pg_acc_obb  = aPg
	  and ti_gestione = aTiGestione;

	return aIm;
end;



Function getImNonPagatoRiscosso(aCdCds varchar2, aEs number, aEsOri number, aPg number, aTiGestione varchar2) return number is
  aIm number;
 begin
	select im_acc_obb - IM_ASSOCIATO_REV_MAN
	into aIm
	from v_obbligazione_accertamento
	where cd_cds      = aCdCds
	  and esercizio   = aEs
	  and esercizio_ori_acc_obb = aEsOri
	  and pg_acc_obb  = aPg
	  and ti_gestione = aTiGestione;

	return aIm;
end;

function getImRiscontratoManRev(aCdCds varchar2, aEs number, aPg number, aTipo varchar2) return number Is
  aIm number;
Begin
 If aTipo = 'R' Then
   Select nvl(sum(SOSPESO_DET_ETR.IM_ASSOCIATO), 0)
   Into   aIm
   From   SOSPESO_DET_ETR
   Where  SOSPESO_DET_ETR.TI_SOSPESO_RISCONTRO = 'R' AND
          SOSPESO_DET_ETR.STATO        = 'N' AND
          SOSPESO_DET_ETR.ti_entrata_spesa = 'E' And
          SOSPESO_DET_ETR.CD_CDS       = aCdCds AND
          SOSPESO_DET_ETR.ESERCIZIO    = aEs AND
          SOSPESO_DET_ETR.PG_REVERSALE = aPg;
 Elsif aTipo = 'M' Then
   Select nvl(sum(SOSPESO_DET_USC.IM_ASSOCIATO), 0)
   Into   aIm
   From   SOSPESO_DET_USC
   Where  SOSPESO_DET_USC.TI_SOSPESO_RISCONTRO = 'R' AND
          SOSPESO_DET_USC.STATO        = 'N' AND
          SOSPESO_DET_usc.ti_entrata_spesa = 'S' And
          SOSPESO_DET_USC.CD_CDS       = aCdCds AND
          SOSPESO_DET_USC.ESERCIZIO    = aEs AND
          SOSPESO_DET_USC.PG_MANDATO   = aPg;
 End If;

 return aIm;
End;


function getStatoRibaltabileScad(aEs number,aScad obbligazione_scadenzario%rowtype) return varchar2 is
isRibaltabile char(1);
aStato char(1);
begin
	if (aScad.im_scadenza > aScad.im_associato_doc_contabile) then
	   isRibaltabile := 'Y';
	else
	   isRibaltabile := 'N';
	end if;
	return isRibaltabile;
end;

function getStatoRibaltabileScad(aEs number,aScad accertamento_scadenzario%rowtype) return varchar2 is
isRibaltabile char(1);
aStato char(1);
begin
	if (aScad.im_scadenza > aScad.im_associato_doc_contabile) then
	   isRibaltabile := 'Y';
	else
	   isRibaltabile := 'N';
	end if;
	return isRibaltabile;
end;

function getPg(aObb obbligazione%rowtype, aEs number, aUser varchar2) return number is
aPgNext number;
begin
-- SF 21.11.2006 con la nuova gestione dell'esercizio originale il numero del documento non cambia più.

aPgNext := aObb.pg_obbligazione;

/*
 If aObb.cd_tipo_documento_cont = CNRCTB018.TI_DOC_IMP_RES then
	aPgNext := aObb.pg_obbligazione;
 Elsif aObb.cd_tipo_documento_cont = CNRCTB018.TI_DOC_IMP then
-- 	aPgNext := aObb.esercizio*1000000+aObb.pg_obbligazione;
	aPgNext := aObb.pg_obbligazione;
 Elsif aObb.cd_tipo_documento_cont = CNRCTB018.TI_DOC_OBB then
 	--aPgNext := CNRCTB018.getNextNumDocCont(aObb.cd_tipo_documento_cont, aEs, aObb.cd_cds, aUser);
        -- 03.01.2006 nuova gestione stani
--        aPgNext := aObb.esercizio * 1000000 + aObb.pg_obbligazione;
	aPgNext := aObb.pg_obbligazione;
 End if;
*/
 Return aPgNext;
End;

function getPg(aAcc accertamento%rowtype, aEs number, aUser varchar2) return number is
aPgNext number;
begin
 If aAcc.cd_tipo_documento_cont = CNRCTB018.TI_DOC_ACC_RES then
		aPgNext := aAcc.pg_accertamento;
 Elsif aAcc.cd_tipo_documento_cont = CNRCTB018.TI_DOC_ACC then
--		aPgNext := aAcc.esercizio*1000000+aAcc.pg_accertamento;
		aPgNext := aAcc.pg_accertamento;
 Elsif aAcc.cd_tipo_documento_cont = CNRCTB018.TI_DOC_ACC_PGIRO_RES then
		aPgNext := aAcc.pg_accertamento;
 Elsif (aAcc.cd_tipo_documento_cont = CNRCTB018.TI_DOC_ACC_PLUR And aAcc.esercizio_competenza = aAcc.esercizio) then
		aPgNext := CNRCTB018.GETNEXTNUMDOCCONT(CNRCTB018.TI_DOC_ACC, aEs, aAcc.cd_cds, aUser);
 Elsif (aAcc.cd_tipo_documento_cont = CNRCTB018.TI_DOC_ACC_PLUR And aAcc.esercizio_competenza > aAcc.esercizio) then
		aPgNext := CNRCTB018.GETNEXTNUMDOCCONT(aAcc.cd_tipo_documento_cont,aEs,aAcc.cd_cds,aUser);
 End If;
 Return aPgNext;
End;

function getDtScadenza(aEs number,aDt_scadenza date) return date is
aDt date;
begin
	 if to_number(to_char(aDt_scadenza,'YYYY')) >= aEs then
	 	aDt := aDt_scadenza;
	 else
	 	aDt := to_date('3112'||aEs,'DDMMYYYY');
	 end if;
	 return aDt;
end;

function getLdA(aDettScad obbligazione_scad_voce%rowtype, aObb obbligazione%rowtype, aEs obbligazione.esercizio%type) return v_linea_attivita_valida%rowtype is
  aLda v_linea_attivita_valida%rowtype;
begin
  if (aObb.cd_tipo_documento_cont In (CNRCTB018.TI_DOC_OBB, CNRCTB018.TI_DOC_OBB_RES_PRO) and aObb.fl_pgiro = 'N') then
    begin
      select * into aLdA
	  from v_linea_attivita_valida la
	  where la.ESERCIZIO = aEs
	  And  (la.CD_CENTRO_RESPONSABILITA, la.CD_LINEA_ATTIVITA) in
	  		(select mla.cd_centro_responsabilita, mla.cd_linea_attivita
			 from  mappatura_la mla
	  		 where esercizio_ori = aDettScad.esercizio
	  		 And   cd_centro_responsabilita_ori = aDettScad.cd_centro_responsabilita
	  		 And   cd_linea_attivita_ori = aDettScad.cd_linea_attivita);
   	  return aLdA;
    exception
      when NO_DATA_FOUND then
  	    null;
    end;
  end if;

  begin
	select * into aLdA
  	from v_linea_attivita_valida
  	where esercizio = aEs
  	and   cd_centro_responsabilita = aDettScad.cd_centro_responsabilita
  	and   cd_linea_attivita		 = aDettScad.cd_linea_attivita;
  exception
    when NO_DATA_FOUND then
      null;
  end;

  return aLda;
end;

function getLdA(aDettScad accertamento_scad_voce%rowtype, aAcc accertamento%rowtype, aEs accertamento.esercizio%type) return v_linea_attivita_valida%rowtype is
  aLda v_linea_attivita_valida%rowtype;
begin
  if aAcc.cd_tipo_documento_cont in (CNRCTB018.TI_DOC_ACC_RES, CNRCTB018.TI_DOC_ACC) and aAcc.fl_pgiro = 'N' then
    begin
	  select * into aLdA
	  from v_linea_attivita_valida la
	  where la.ESERCIZIO = aEs
      And (la.CD_CENTRO_RESPONSABILITA, la.CD_LINEA_ATTIVITA) in
		  (select mla.cd_centro_responsabilita, mla.cd_linea_attivita
		   from mappatura_la mla
		   where esercizio_ori 			 	= aDettScad.esercizio
		   and cd_centro_responsabilita_ori = aDettScad.cd_centro_responsabilita
		   and cd_linea_attivita_ori		= aDettScad.cd_linea_attivita);
   	  return aLdA;
    exception
      when NO_DATA_FOUND then
  	    null;
    end;
  end if;

  begin
	select * into aLdA
	from v_linea_attivita_valida
	where esercizio = aEs
	and   cd_centro_responsabilita = aDettScad.cd_centro_responsabilita
	and   cd_linea_attivita		 = aDettScad.cd_linea_attivita;
  exception
    when NO_DATA_FOUND then
     null;
  end;

  return aLda;
end;

function getVoceF(aObb obbligazione%rowtype,
		 		  aLdA v_linea_attivita_valida%rowtype,
				  aDettScad obbligazione_scad_voce%rowtype,
				  aEs number) return voce_f%rowtype is
aVoce voce_f%rowtype;
aCdTipoUnita varchar2(20);
begin
	select cd_tipo_unita into aCdTipoUnita
	from unita_organizzativa
	where cd_unita_organizzativa = aObb.cd_cds
	  and fl_cds = 'Y';

	if aObb.cd_tipo_documento_cont in (CNRCTB018.TI_DOC_IMP, CNRCTB018.TI_DOC_IMP_RES, CNRCTB018.TI_DOC_OBB_PGIRO, CNRCTB018.TI_DOC_OBB_PGIRO_RES) then
	    -- non dipende dalla linea di attività, che è fittizia
	    select * into aVoce
		from voce_f
		where esercizio    	  = aEs
		  and ti_appartenenza = aDettScad.ti_appartenenza
		  and ti_gestione	  = aDettScad.ti_gestione
		  and cd_voce		  = aDettScad.cd_voce;
	else
		if aCdTipoUnita = CNRCTB020.TIPO_SAC then
		   if aObb.fl_spese_costi_altrui = 'Y' then
		   -- indipendentemente da LdA e CdR, il capitolo resta quello originale
			    select * into aVoce
				from voce_f
				where esercizio    	  = aEs
				  and ti_appartenenza = aDettScad.ti_appartenenza
				  and ti_gestione	  = aDettScad.ti_gestione
				  and cd_voce		  = aDettScad.cd_voce;
		   else
				select * into aVoce
				from voce_f
				where esercizio    		       = aEs
				  and ti_appartenenza 	 	   = aObb.ti_appartenenza
				  and ti_gestione 		 	   = aObb.ti_gestione
				  and cd_titolo_capitolo 	   = aObb.cd_elemento_voce
				  and cd_funzione		 	   = aLda.cd_funzione
				  and cd_centro_responsabilita = aLda.cd_centro_responsabilita;
		   end if;
		else
		   if aObb.fl_spese_costi_altrui = 'Y' then
		   -- indipendentemente da LdA e CdR, il capitolo resta quello originale
			    select * into aVoce
				from voce_f
				where esercizio    	  = aEs
				  and ti_appartenenza = aDettScad.ti_appartenenza
				  and ti_gestione	  = aDettScad.ti_gestione
				  and cd_voce		  = aDettScad.cd_voce;
		   else
				select * into aVoce
				from voce_f
				where esercizio    		       = aEs
				  and ti_appartenenza 	 	   = aObb.ti_appartenenza
				  and ti_gestione 		 	   = aObb.ti_gestione
				  and cd_unita_organizzativa   = aObb.cd_unita_organizzativa
				  and cd_titolo_capitolo 	   = aObb.cd_elemento_voce
				  and cd_funzione		 	   = aLda.cd_funzione;
		   end if;
		end if;
	end if;

	return aVoce;
end;

function getVoceF(aObb obbligazione%rowtype,
		 		  aLdA v_linea_attivita_valida%rowtype,
				  aEV elemento_voce%rowtype,
				  aDettScad obbligazione_scad_voce%rowtype,
				  aEs number) return voce_f%rowtype is
aVoce voce_f%rowtype;
aCdTipoUnita varchar2(20);
oldLda linea_attivita%rowtype;
begin
	select cd_tipo_unita into aCdTipoUnita
	from unita_organizzativa
	where cd_unita_organizzativa = aObb.cd_cds
	  and fl_cds = 'Y';

	if aObb.cd_tipo_documento_cont in (CNRCTB018.TI_DOC_IMP, CNRCTB018.TI_DOC_IMP_RES, CNRCTB018.TI_DOC_OBB_PGIRO) then
		-- non dipende dalla linea di attività, che è fittizia
	    select * into aVoce
		from voce_f
		where esercizio    	  = aEs
		  and ti_appartenenza = aEV.ti_appartenenza
		  and ti_gestione	  = aEV.ti_gestione
		  and cd_titolo_capitolo = aEV.cd_elemento_voce;
	else
		if aCdTipoUnita = CNRCTB020.TIPO_SAC then
		   if aObb.fl_spese_costi_altrui = 'Y' then
		   -- ricostruito in funzione del nuovo elemento voce, e della vecchia LdA
		   	    select * into oldLda
				from linea_attivita
				where cd_centro_responsabilita = aDettScad.cd_centro_responsabilita
				  and cd_linea_attivita = aDettScad.cd_linea_attivita;

				select * into aVoce
				from voce_f
				where esercizio    		       = aEs
				  and ti_appartenenza 	 	   = aEV.ti_appartenenza
				  and ti_gestione 		 	   = aEV.ti_gestione
				  and cd_titolo_capitolo 	   = aEV.cd_elemento_voce
				  and cd_funzione		 	   = oldLda.cd_funzione
				  and cd_centro_responsabilita = oldLda.cd_centro_responsabilita;
--
-- 			    select * into aVoce
-- 				from voce_f
-- 				where esercizio    	  = aEs
-- 				  and ti_appartenenza = aDettScad.ti_appartenenza
-- 				  and ti_gestione	  = aDettScad.ti_gestione
-- 				  and cd_voce		  = aDettScad.cd_voce;
		   else
				select * into aVoce
				from voce_f
				where esercizio    		       = aEs
				  and ti_appartenenza 	 	   = aEV.ti_appartenenza
				  and ti_gestione 		 	   = aEV.ti_gestione
				  and cd_titolo_capitolo 	   = aEV.cd_elemento_voce
				  and cd_funzione		 	   = aLda.cd_funzione
				  and cd_centro_responsabilita = aLda.cd_centro_responsabilita;
		   end if;
		else
		   if aObb.fl_spese_costi_altrui = 'Y' then
		   -- ricostruito in funzione del nuovo elemento voce, e della vecchia LdA
		   	    select * into oldLda
				from linea_attivita
				where cd_centro_responsabilita = aDettScad.cd_centro_responsabilita
				  and cd_linea_attivita = aDettScad.cd_linea_attivita;

				select * into aVoce
				from voce_f
				where esercizio    		       = aEs
				  and ti_appartenenza 	 	   = aEV.ti_appartenenza
				  and ti_gestione 		 	   = aEV.ti_gestione
				  and cd_titolo_capitolo 	   = aEV.cd_elemento_voce
				  and cd_funzione		 	   = oldLda.cd_funzione;

		   else
				select * into aVoce
				from voce_f
				where esercizio    		       = aEs
				  and ti_appartenenza 	 	   = aEV.ti_appartenenza
				  and ti_gestione 		 	   = aEV.ti_gestione
				  and cd_unita_organizzativa   = aObb.cd_unita_organizzativa
				  and cd_titolo_capitolo 	   = aEV.cd_elemento_voce
				  and cd_funzione		 	   = aLda.cd_funzione;
		   end if;
		end if;
	end if;

	return aVoce;
end;

function getPgVerRec(aObbNext obbligazione%rowtype) return number is
aNum number;
begin
 if aObbNext.cd_tipo_documento_cont In (CNRCTB018.TI_DOC_IMP_RES, CNRCTB018.TI_DOC_OBB_RES_PRO, CNRCTB018.TI_DOC_OBB_PGIRO_RES) then
   Select nvl(max(pg_storico_),1)
   Into aNum
   from obbligazione_s
   where cd_cds    = aObbNext.cd_cds
     and esercizio = aObbNext.esercizio
     and esercizio_originale = aObbNext.esercizio_originale
     and pg_obbligazione = aObbNext.pg_obbligazione;
 else
     aNum := 1; -- per competenza la numerazione è sempre rigenerata
                -- non capiterà più ! 04.01.2006 stani
 end if;
 return aNum;
end;

function getPgVerRec(aAccNext accertamento%rowtype) return number is
aNum number;
begin
	if aAccNext.cd_tipo_documento_cont In (CNRCTB018.TI_DOC_ACC_RES, CNRCTB018.TI_DOC_ACC_PGIRO_RES) then
		select nvl(max(pg_storico_),1) into aNum
		from accertamento_s
		where cd_cds 	      = aAccNext.cd_cds
		  and esercizio	   	  = aAccNext.esercizio
		  and esercizio_originale = aAccNext.esercizio_originale
		  and pg_accertamento = aAccNext.pg_accertamento;
	else
		aNum := 1; -- per competenza la numerazione è sempre rigenerata
	end if;
	return aNum;
end;


procedure creaTestataObb(aObb obbligazione%rowtype, aObbNext in out obbligazione%rowtype, aEs number, aUser varchar2, aTSNow date) is
aIm number;
aPg number;
begin
    aIm := getImNonRiscontrato(aObb.cd_cds,aObb.esercizio,aObb.esercizio_originale,aObb.pg_obbligazione,aObb.ti_gestione);
-- dal 2006 restituisce sempre lo stesso pg_documento dell'esercizio precedente (praticamente è inutile la chiamata)
    aPg := getPg(aObb,aEs,aUser);

    aObbNext.CD_CDS				  :=aObb.CD_CDS;
    aObbNext.ESERCIZIO				  :=aEs;
    aObbNext.ESERCIZIO_ORIGINALE	 	  :=aObb.ESERCIZIO_ORIGINALE;
    aObbNext.PG_OBBLIGAZIONE		 	  :=aPg;
    aObbNext.CD_UNITA_ORGANIZZATIVA	 	  :=aObb.CD_UNITA_ORGANIZZATIVA;
    aObbNext.CD_CDS_ORIGINE			  :=aObb.CD_CDS_ORIGINE;
    aObbNext.CD_UO_ORIGINE			  :=aObb.CD_UO_ORIGINE;
    aObbNext.DT_REGISTRAZIONE		 	  :=to_date('0101'||aEs,'DDMMYYYY');
    aObbNext.DS_OBBLIGAZIONE		 	  :=aObb.DS_OBBLIGAZIONE;
    aObbNext.NOTE_OBBLIGAZIONE		 	  :=aObb.NOTE_OBBLIGAZIONE;
    aObbNext.CD_TERZO				  :=aObb.CD_TERZO;
    aObbNext.IM_OBBLIGAZIONE		 	  :=aIm;
    aObbNext.IM_COSTI_ANTICIPATI	 	  :=aObb.IM_COSTI_ANTICIPATI;

    aObbNext.ESERCIZIO_CONTRATTO  := aObb.ESERCIZIO_CONTRATTO;
    aObbNext.STATO_CONTRATTO      := aObb.STATO_CONTRATTO    ;
    aObbNext.PG_CONTRATTO         := aObb.PG_CONTRATTO       ;

    aObbNext.ESERCIZIO_REP        := aObb.ESERCIZIO_REP ;
    aObbNext.PG_REPERTORIO        := aObb.PG_REPERTORIO ;

	if aObb.esercizio_competenza <= aEs then
	   -- non viene generata una nuova obbligazione pluriennale
	   aObbNext.ESERCIZIO_COMPETENZA   	  :=aEs;
	else
	   -- è un'obbligazione pluriennale
	   aObbNext.ESERCIZIO_COMPETENZA	  := aObb.ESERCIZIO_COMPETENZA;
	end if;
    aObbNext.STATO_OBBLIGAZIONE		 	  :=aObb.STATO_OBBLIGAZIONE;
    aObbNext.CD_RIFERIMENTO_CONTRATTO	  :=aObb.CD_RIFERIMENTO_CONTRATTO;
    aObbNext.DT_SCADENZA_CONTRATTO	 	  :=aObb.DT_SCADENZA_CONTRATTO;
    aObbNext.FL_CALCOLO_AUTOMATICO	 	  := 'N'; -- aObb.FL_CALCOLO_AUTOMATICO;
    aObbNext.CD_FONDO_RICERCA		 	  :=aObb.CD_FONDO_RICERCA;
    aObbNext.FL_SPESE_COSTI_ALTRUI	 	  :=aObb.FL_SPESE_COSTI_ALTRUI;
    aObbNext.FL_PGIRO				  :=aObb.FL_PGIRO;
    aObbNext.RIPORTATO				  :='N';
    aObbNext.DACR				  :=aTSNow;
    aObbNext.UTCR				  :=aUser;
    aObbNext.DUVA				  :=aTSNow;
    aObbNext.UTUV				  :=aUser;
    aObbNext.PG_VER_REC				  :=getPgVerRec(aObbNext);-- per gestione storico
    aObbNext.CD_CDS_ORI_RIPORTO		 	  :=aObb.CD_CDS;
    aObbNext.ESERCIZIO_ORI_RIPORTO		  :=aObb.ESERCIZIO;
    aObbNext.ESERCIZIO_ORI_ORI_RIPORTO		  :=aObb.ESERCIZIO_ORIGINALE;
    aObbNext.PG_OBBLIGAZIONE_ORI_RIPORTO          :=aObb.PG_OBBLIGAZIONE;
    aObbNext.MOTIVAZIONE                          :=aObb.MOTIVAZIONE;

    aObbNext.FL_NETTO_SOSPESO   := aObb.FL_NETTO_SOSPESO ;
    aObbNext.FL_GARA_IN_CORSO   := aObb.FL_GARA_IN_CORSO ;
    aObbNext.DS_GARA_IN_CORSO   := aObb.DS_GARA_IN_CORSO ;
    aObbNext.stato_coge_docamm := aObb.stato_coge_docamm;
    aObbNext.stato_coge_doccont := aObb.stato_coge_doccont;
    aObbNext.FL_DETERMINA_ALLEGATA   := 'N' ;
End;

procedure creaScadObb(aObbNext obbligazione%rowtype,
		  			  aScad obbligazione_scadenzario%rowtype,
					  aObbScadNext in out obbligazione_scadenzario%rowtype,
					  aEs number,
					  aUser varchar2,
					  aTSNow date) is
aDt date;
begin
	aDt := getDtScadenza(aEs,aScad.DT_SCADENZA);

	aObbScadNext.CD_CDS	   	   			    :=aObbNext.CD_CDS;
	aObbScadNext.ESERCIZIO				   	:=aObbNext.ESERCIZIO;
	aObbScadNext.DT_SCADENZA				:=aDt;
	aObbScadNext.DS_SCADENZA				:=aScad.DS_SCADENZA;
	aObbScadNext.IM_SCADENZA				:=aScad.IM_SCADENZA - aScad.IM_ASSOCIATO_DOC_CONTABILE ;
	aObbScadNext.IM_ASSOCIATO_DOC_AMM	   	:=aScad.IM_ASSOCIATO_DOC_AMM - aScad.IM_ASSOCIATO_DOC_CONTABILE ;
	aObbScadNext.IM_ASSOCIATO_DOC_CONTABILE :=0;
	aObbScadNext.DACR					   	:=aTSNow;
	aObbScadNext.UTCR					   	:=aUser;
	aObbScadNext.DUVA					   	:=aTSNow;
	aObbScadNext.UTUV					   	:=aUser;
	aObbScadNext.PG_VER_REC				   	:=1;
	aObbScadNext.PG_OBBL_SCAD_ORI_RIPORTO   :=aScad.PG_OBBLIGAZIONE_SCADENZARIO;

end;

procedure creaScadDettObb(aObbScadNext obbligazione_scadenzario%rowtype,
		  			   	  aDettScad obbligazione_scad_voce%rowtype,
					   	  aObbScadDettNext in out obbligazione_scad_voce%rowtype,
					   	  aUser varchar2,
					   	  aTSNow date) is
begin
	aObbScadDettNext.CD_CDS					  :=aObbScadNext.CD_CDS;
	aObbScadDettNext.ESERCIZIO				  :=aObbScadNext.ESERCIZIO;
	aObbScadDettNext.TI_APPARTENENZA		  :=aDettScad.TI_APPARTENENZA;
	aObbScadDettNext.TI_GESTIONE			  :=aDettScad.TI_GESTIONE;
-- 	aObbScadDettNext.CD_VOCE				  :=aDettScad.CD_VOCE;
-- 	aObbScadDettNext.CD_CENTRO_RESPONSABILITA :=aDettScad.CD_CENTRO_RESPONSABILITA;
-- 	aObbScadDettNext.CD_LINEA_ATTIVITA		  :=aDettScad.CD_LINEA_ATTIVITA;
	aObbScadDettNext.IM_VOCE				  :=aDettScad.IM_VOCE;
	aObbScadDettNext.CD_FONDO_RICERCA		  :=aDettScad.CD_FONDO_RICERCA;
	aObbScadDettNext.DACR					  :=aTSNow;
	aObbScadDettNext.UTCR					  :=aUser;
	aObbScadDettNext.DUVA					  :=aTSNow;
	aObbScadDettNext.UTUV					  :=aUser;
	aObbScadDettNext.PG_VER_REC				  :=1;
end;

procedure creaTestataAcc(aAcc accertamento%rowtype, aAccNext in out accertamento%rowtype, aEs number, aUser varchar2, aTSNow date) is
aIm number;
aPg number;
begin
	aIm := getImNonRiscontrato(aAcc.cd_cds,aAcc.esercizio,aAcc.esercizio_originale,aAcc.pg_accertamento,aAcc.ti_gestione);
	aPg := getPg(aAcc, aEs, aUser);

	aAccNext.CD_CDS	   			          :=aAcc.CD_CDS;
	aAccNext.ESERCIZIO			      	  :=aEs;
	aAccNext.ESERCIZIO_ORIGINALE		      	  :=aAcc.ESERCIZIO_ORIGINALE;
	aAccNext.PG_ACCERTAMENTO	      	  :=aPg;
	aAccNext.CD_UNITA_ORGANIZZATIVA   	  :=aAcc.CD_UNITA_ORGANIZZATIVA;
	aAccNext.CD_CDS_ORIGINE		      	  :=aAcc.CD_CDS_ORIGINE;
	aAccNext.CD_UO_ORIGINE			  	  :=aAcc.CD_UO_ORIGINE;
-- 	aAccNext.TI_APPARTENENZA		  	  :=aAcc.TI_APPARTENENZA;
-- 	aAccNext.TI_GESTIONE			  	  :=aAcc.TI_GESTIONE;
-- 	aAccNext.CD_ELEMENTO_VOCE		  	  :=aAcc.CD_ELEMENTO_VOCE;
-- 	aAccNext.CD_VOCE				  	  :=aAcc.CD_VOCE;
	aAccNext.DT_REGISTRAZIONE		  	  :=to_date('0101'||aEs,'DDMMYYYY');
	aAccNext.DS_ACCERTAMENTO		  	  :=aAcc.DS_ACCERTAMENTO;
	aAccNext.NOTE_ACCERTAMENTO		  	  :=aAcc.NOTE_ACCERTAMENTO;
	aAccNext.CD_TERZO				  	  :=aAcc.CD_TERZO;
	aAccNext.IM_ACCERTAMENTO		  	  :=aIm;
	aAccNext.DT_CANCELLAZIONE		  	  :=aAcc.DT_CANCELLAZIONE;
	aAccNext.CD_RIFERIMENTO_CONTRATTO 	  :=aAcc.CD_RIFERIMENTO_CONTRATTO;
	aAccNext.DT_SCADENZA_CONTRATTO	  	  :=aAcc.DT_SCADENZA_CONTRATTO;
	aAccNext.CD_FONDO_RICERCA		  	  :=aAcc.CD_FONDO_RICERCA;
	aAccNext.FL_PGIRO				  	  :=aAcc.FL_PGIRO;
	aAccNext.RIPORTATO				  	  :='N';
	aAccNext.DACR					  	  :=aTSNow;
	aAccNext.UTCR					  	  :=aUser;
	aAccNext.DUVA					  	  :=aTSNow;
	aAccNext.UTUV					  	  :=aUser;
	aAccNext.PG_VER_REC				  	  :=getPgVerRec(aAccNext); -- per gestione storico
	aAccNext.CD_CDS_ORI_RIPORTO		  	  :=aAcc.CD_CDS;
	aAccNext.ESERCIZIO_ORI_RIPORTO	  	  :=aAcc.ESERCIZIO;
	aAccNext.ESERCIZIO_ORI_ORI_RIPORTO  	  :=aAcc.ESERCIZIO_ORIGINALE;
	aAccNext.PG_ACCERTAMENTO_ORI_RIPORTO  :=aAcc.PG_ACCERTAMENTO;

  aAccNext.ESERCIZIO_CONTRATTO := aAcc.ESERCIZIO_CONTRATTO;
  aAccNext.STATO_CONTRATTO     := aAcc.STATO_CONTRATTO    ;
  aAccNext.PG_CONTRATTO        := aAcc.PG_CONTRATTO       ;

  aAccNext.FL_NETTO_SOSPESO   := aAcc.FL_NETTO_SOSPESO ;
  aAccNext.stato_coge_docamm := aAcc.stato_coge_docamm;
  aAccNext.stato_coge_doccont := aAcc.stato_coge_doccont;

	if aAcc.esercizio_competenza <= aEs then
	    aAccNext.ESERCIZIO_COMPETENZA	  := aEs;
	else
		aAccNext.ESERCIZIO_COMPETENZA	  :=aAcc.ESERCIZIO_COMPETENZA;
	end if;
--	aAccNext.PG_ACCERTAMENTO_ORIGINE	 :=aAcc.PG_ACCERTAMENTO_ORIGINE;

end;

procedure creaScadAcc(aAccNext accertamento%rowtype,
		  			  aScad accertamento_scadenzario%rowtype,
					  aAccScadNext in out accertamento_scadenzario%rowtype,
					  aEs number,
					  aUser varchar2,
					  aTSNow date) is
aDt date;
begin
	aDt := getDtScadenza(aEs,aScad.DT_SCADENZA_INCASSO);

	aAccScadNext.CD_CDS						   :=aAccNext.CD_CDS;
	aAccScadNext.ESERCIZIO					   :=aAccNext.ESERCIZIO;
-- 	aAccScadNext.PG_ACCERTAMENTO			   :=aAccNext.PG_ACCERTAMENTO;
-- 	aAccScadNext.PG_ACCERTAMENTO_SCADENZARIO   :=aScad.PG_ACCERTAMENTO_SCADENZARIO;
	aAccScadNext.DT_SCADENZA_EMISSIONE_FATTURA :=aDt;
	aAccScadNext.DT_SCADENZA_INCASSO		   :=aDt;
	aAccScadNext.DS_SCADENZA				   :=aScad.DS_SCADENZA;
	aAccScadNext.IM_SCADENZA				   :=aScad.IM_SCADENZA - aScad.IM_ASSOCIATO_DOC_CONTABILE;
	aAccScadNext.IM_ASSOCIATO_DOC_AMM		   :=aScad.IM_ASSOCIATO_DOC_AMM - aScad.IM_ASSOCIATO_DOC_CONTABILE;
	aAccScadNext.IM_ASSOCIATO_DOC_CONTABILE	   :=0;
	aAccScadNext.DACR						   :=aTSNow;
	aAccScadNext.UTCR						   :=aUser;
	aAccScadNext.DUVA						   :=aTSNow;
	aAccScadNext.UTUV						   :=aUser;
	aAccScadNext.PG_VER_REC					   :=1;
	aAccScadNext.PG_ACC_SCAD_ORI_RIPORTO	   :=aScad.PG_ACCERTAMENTO_SCADENZARIO;
end;

procedure creaScadDettAcc(aAccScadNext accertamento_scadenzario%rowtype,
		  aDettScad accertamento_scad_voce%rowtype,
		  aAccDettScadNext in out accertamento_scad_voce%rowtype,
		  aUser varchar2,
		  aTSNow date) is
begin
	aAccDettScadNext.CD_CDS	  	  			  	 :=aAccScadNext.CD_CDS;
	aAccDettScadNext.ESERCIZIO					 :=aAccScadNext.ESERCIZIO;
-- 	aAccDettScadNext.CD_CENTRO_RESPONSABILITA 	 :=aDettScad.CD_CENTRO_RESPONSABILITA;
-- 	aAccDettScadNext.CD_LINEA_ATTIVITA		  	 :=aDettScad.CD_LINEA_ATTIVITA;
	aAccDettScadNext.IM_VOCE				  	 :=aDettScad.IM_VOCE;
	aAccDettScadNext.CD_FONDO_RICERCA		  	 :=aDettScad.CD_FONDO_RICERCA;
	aAccDettScadNext.DACR					  	 :=aTSNow;
	aAccDettScadNext.UTCR					  	 :=aUser;
	aAccDettScadNext.DUVA					  	 :=aTSNow;
	aAccDettScadNext.UTUV					  	 :=aUser;
	aAccDettScadNext.PG_VER_REC				  	 :=1;

end;

 function getDocRiportato(aObb obbligazione%rowtype) return obbligazione%rowtype is
  aObbNew obbligazione%rowtype;
 begin
  begin
   select * into aObbNew
   from obbligazione
   Where cd_cds_ori_riporto  =aObb.cd_cds And
         esercizio_ori_riporto = aObb.esercizio And
         esercizio_ori_ori_riporto  =aObb.esercizio_originale And
         pg_obbligazione_ori_riporto=aObb.pg_obbligazione
   for update nowait;
  exception
   when NO_DATA_FOUND then
    IBMERR001.RAISE_ERR_GENERICO('Documento riportato in nuovo esercizio non trovato collegato a:'||CNRCTB035.getDesc(aObb));
   when TOO_MANY_ROWS then
    IBMERR001.RAISE_ERR_GENERICO('Esiste più di un documento nel nuovo esercizio corrispondente al documento:'||CNRCTB035.getDesc(aObb));
  end;
  return aObbNew;
 end;

 function getOldScad(aObbNew obbligazione%rowtype, aObbScadNew obbligazione_scadenzario%rowtype) return obbligazione_scadenzario%rowtype is
  aObbScad obbligazione_scadenzario%rowtype;
 begin
  begin
   select * into aObbScad from obbligazione_scadenzario where
             cd_cds  =aObbNew.cd_cds_ori_riporto
		 and esercizio = aObbNew.esercizio_ori_riporto
		 and esercizio_originale=aObbNew.esercizio_ori_ori_riporto
		 and pg_obbligazione=aObbNew.pg_obbligazione_ori_riporto
		 and pg_obbligazione_scadenzario=aObbScadNew.pg_obbl_scad_ori_riporto
   for update nowait;
  exception
   when NO_DATA_FOUND then
    IBMERR001.RAISE_ERR_GENERICO('Scadenza di documento corrispondente a scadenza riportata:'||CNRCTB035.getDesc(aObbNew, aObbScadNew)||' non trovata');
  end;
  return aObbScad;
 end;

 function getOldScad(aAccNew accertamento%rowtype, aAccScadNew accertamento_scadenzario%rowtype) return accertamento_scadenzario%rowtype is
  aAccScad accertamento_scadenzario%rowtype;
 begin
  begin
   select * into aAccScad from accertamento_scadenzario where
             cd_cds  =aAccNew.cd_cds_ori_riporto
		 and esercizio = aAccNew.esercizio_ori_riporto
		 and esercizio_originale=aAccNew.esercizio_ori_ori_riporto
		 and pg_accertamento=aAccNew.pg_accertamento_ori_riporto
		 and pg_accertamento_scadenzario=aAccScadNew.pg_acc_scad_ori_riporto
   for update nowait;
  exception
   when NO_DATA_FOUND then
    IBMERR001.RAISE_ERR_GENERICO('Scadenza di documento corrispondente a scadenza riportata:'||CNRCTB035.getDesc(aAccNew, aAccScadNew)||' non trovata');
  end;
  return aAccScad;
 end;

 function getDocRiportato(aAcc accertamento%rowtype) return accertamento%rowtype is
  aAccNew accertamento%rowtype;
 begin
  begin
   select * into aAccNew from accertamento where
             cd_cds_ori_riporto  =aAcc.cd_cds
		 and esercizio_ori_riporto = aAcc.esercizio
		 and esercizio_ori_ori_riporto=aAcc.esercizio_originale
		 and pg_accertamento_ori_riporto=aAcc.pg_accertamento
   for update nowait;
  exception
   when NO_DATA_FOUND then
    IBMERR001.RAISE_ERR_GENERICO('Documento riportato in nuovo esercizio non trovato colleato a:'||CNRCTB035.getDesc(aAcc));
   when TOO_MANY_ROWS then
    IBMERR001.RAISE_ERR_GENERICO('Esiste più di un documento nel nuovo esercizio corrispondente al documento:'||CNRCTB035.getDesc(aAcc));
  end;
  return aAccNew;
 end;

 function getDocOrigine(aObbNew obbligazione%rowtype) return obbligazione%rowtype is
  aObb obbligazione%rowtype;
 begin
  begin
   select * into aObb from obbligazione where
             cd_cds  =aObbNew.cd_cds_ori_riporto
		 and esercizio = aObbNew.esercizio_ori_riporto
		 and esercizio_originale=aObbNew.esercizio_ori_ori_riporto
		 and pg_obbligazione=aObbNew.pg_obbligazione_ori_riporto
   for update nowait;
  exception
   when NO_DATA_FOUND then
    IBMERR001.RAISE_ERR_GENERICO('Documento di origine non trovato collegato a:'||CNRCTB035.getDesc(aObbNew));
   when TOO_MANY_ROWS then
    IBMERR001.RAISE_ERR_GENERICO('Esiste più di un documento di origine corrispondente al documento:'||CNRCTB035.getDesc(aObbNew));
  end;
  return aObb;
 end;

 function getDocOrigine(aAccNew accertamento%rowtype) return accertamento%rowtype is
  aAcc accertamento%rowtype;
 begin
  begin
   select * into aAcc from accertamento where
             cd_cds  =aAccNew.cd_cds_ori_riporto
		 and esercizio = aAccNew.esercizio_ori_riporto
		 and esercizio_originale=aAccNew.esercizio_ori_ori_riporto
		 and pg_accertamento=aAccNew.pg_accertamento_ori_riporto
   for update nowait;
  exception
   when NO_DATA_FOUND then
    IBMERR001.RAISE_ERR_GENERICO('Documento di origine non trovato collegato a:'||CNRCTB035.getDesc(aAccNew));
   when TOO_MANY_ROWS then
    IBMERR001.RAISE_ERR_GENERICO('Esiste più di un documento di origine corrispondente al documento:'||CNRCTB035.getDesc(aAccNew));
  end;
  return aAcc;
 end;

procedure aggiornaAccNext(aAccNext accertamento%rowtype) is
aLocAcc accertamento%rowtype;
begin
	aLocAcc := aAccNext;
    -- lock del documento esistente
    cnrctb035.LOCKDOCFULL(aLocAcc);

	update accertamento
	set CD_TIPO_DOCUMENTO_CONT	 = aAccNext.cd_tipo_documento_cont,
		CD_UNITA_ORGANIZZATIVA	 = aAccNext.cd_unita_organizzativa,
		CD_CDS_ORIGINE			 = aAccNext.cd_cds_origine,
		CD_UO_ORIGINE			 = aAccNext.cd_uo_origine,
		TI_APPARTENENZA			 = aAccNext.ti_appartenenza,
		TI_GESTIONE				 = aAccNext.ti_gestione,
		CD_ELEMENTO_VOCE		 = aAccNext.cd_elemento_voce,
		CD_VOCE					 = aAccNext.cd_voce,
		DT_REGISTRAZIONE		 = aAccNext.dt_registrazione,
		DS_ACCERTAMENTO			 = aAccNext.ds_accertamento,
		NOTE_ACCERTAMENTO		 = aAccNext.note_accertamento,
		CD_TERZO				 = aAccNext.cd_terzo,
		IM_ACCERTAMENTO			 = aAccNext.im_accertamento,
		DT_CANCELLAZIONE		 = aAccNext.dt_cancellazione,
		CD_RIFERIMENTO_CONTRATTO = aAccNext.cd_riferimento_contratto,
		DT_SCADENZA_CONTRATTO	 = aAccNext.dt_scadenza_contratto,
		CD_FONDO_RICERCA		 = aAccNext.cd_fondo_ricerca,
		FL_PGIRO				 = aAccNext.fl_pgiro,
		RIPORTATO				 = aAccNext.riportato,
		DUVA					 = aAccNext.duva,
		UTUV					 = aAccNext.utuv,
		PG_VER_REC				 = pg_ver_rec + 1,
		CD_CDS_ORI_RIPORTO		 = aAccNext.cd_cds_ori_riporto,
		ESERCIZIO_ORI_RIPORTO	 = aAccNext.esercizio_ori_riporto,
		ESERCIZIO_ORI_ORI_RIPORTO	 = aAccNext.esercizio_ori_ori_riporto,
		PG_ACCERTAMENTO_ORI_RIPORTO = aAccNext.pg_accertamento_ori_riporto,
		ESERCIZIO_COMPETENZA		= aAccNext.esercizio_competenza,
		PG_ACCERTAMENTO_ORIGINE		= aAccNext.pg_accertamento_origine
	where cd_cds          = aAccNext.cd_cds
	  and esercizio 	  = aAccNext.esercizio
	  and esercizio_originale = aAccNext.esercizio_originale
	  and pg_accertamento = aAccNext.pg_accertamento;

end;

procedure aggiornaImpNext(aObbNext obbligazione%rowtype) is
aLocObb obbligazione%rowtype;
begin
	aLocObb := aObbNext;
    -- lock del documento esistente
    cnrctb035.LOCKDOCFULL(aLocObb);

	update obbligazione
	set CD_TIPO_DOCUMENTO_CONT       = aObbNext.cd_tipo_documento_cont,
		CD_UNITA_ORGANIZZATIVA		 = aObbNext.cd_unita_organizzativa,
		CD_CDS_ORIGINE				 = aObbNext.cd_cds_origine,
		CD_UO_ORIGINE				 = aObbNext.cd_uo_origine,
		CD_TIPO_OBBLIGAZIONE		 = aObbNext.cd_tipo_obbligazione,
		TI_APPARTENENZA				 = aObbNext.ti_appartenenza,
		TI_GESTIONE					 = aObbNext.ti_gestione,
		CD_ELEMENTO_VOCE			 = aObbNext.cd_elemento_voce,
		DT_REGISTRAZIONE			 = aObbNext.dt_registrazione,
		DS_OBBLIGAZIONE				 = aObbNext.ds_obbligazione,
		NOTE_OBBLIGAZIONE			 = aObbNext.note_obbligazione,
		CD_TERZO					 = aObbNext.cd_terzo,
		IM_OBBLIGAZIONE				 = aObbNext.im_obbligazione,
		IM_COSTI_ANTICIPATI			 = aObbNext.im_costi_anticipati,
		ESERCIZIO_COMPETENZA		 = aObbNext.esercizio_competenza,
		STATO_OBBLIGAZIONE			 = aObbNext.stato_obbligazione,
		DT_CANCELLAZIONE			 = aObbNext.dt_cancellazione,
		CD_RIFERIMENTO_CONTRATTO	 = aObbNext.cd_riferimento_contratto,
		DT_SCADENZA_CONTRATTO		 = aObbNext.dt_scadenza_contratto,
		FL_CALCOLO_AUTOMATICO		 = aObbNext.fl_calcolo_automatico,
		CD_FONDO_RICERCA			 = aObbNext.cd_fondo_ricerca,
		FL_SPESE_COSTI_ALTRUI		 = aObbNext.fl_spese_costi_altrui,
		FL_PGIRO					 = aObbNext.fl_pgiro,
		RIPORTATO					 = aObbNext.riportato,
		DUVA						 = aObbNext.duva,
		UTUV						 = aObbNext.utuv,
		PG_VER_REC					 = pg_ver_rec + 1,
		CD_CDS_ORI_RIPORTO			 = aObbNext.cd_cds_ori_riporto,
		ESERCIZIO_ORI_RIPORTO		 = aObbNext.esercizio_ori_riporto,
		ESERCIZIO_ORI_ORI_RIPORTO	 = aObbNext.esercizio_ori_ori_riporto,
		PG_OBBLIGAZIONE_ORI_RIPORTO	 = aObbNext.pg_obbligazione_ori_riporto
	where cd_cds = aObbNext.cd_cds
	  and esercizio = aObbNext.esercizio
	  and esercizio_originale = aObbNext.esercizio_originale
	  and pg_obbligazione = aObbNext.pg_obbligazione;

end;


procedure aggiornaScadImpNext(
		  aObbNext obbligazione%rowtype,
		  aObbScadNext obbligazione_scadenzario%rowtype,
		  posizione number,
		  ListaObbScadVoceNext CNRCTB035.scadVoceListS,
		  isControlloBloccante boolean) is
begin
-- solo per impegni!!!
-- => un solo livello di scadenza e scad voce
	 if ListaObbScadVoceNext.count > 0 then -- dovrebbe essere count = 1
	 	update obbligazione_scadenzario
		set DT_SCADENZA                 = aObbScadNext.dt_scadenza,
			DS_SCADENZA					= aObbScadNext.ds_scadenza,
			IM_SCADENZA					= aObbScadNext.im_scadenza,
			IM_ASSOCIATO_DOC_AMM		= aObbScadNext.im_associato_doc_amm,
			IM_ASSOCIATO_DOC_CONTABILE	= aObbScadNext.im_associato_doc_contabile,
			DUVA						= aObbScadNext.duva,
			UTUV						= aObbScadNext.utuv,
			PG_VER_REC					= pg_ver_rec + 1,
			PG_OBBL_SCAD_ORI_RIPORTO	= aObbScadNext.pg_obbl_scad_ori_riporto
		where cd_cds 					  = aObbNext.cd_cds
		  and esercizio 				  = aObbNext.esercizio
		  and esercizio_originale = aObbNext.esercizio_originale
		  and pg_obbligazione 			  = aObbNext.pg_obbligazione
		  and pg_obbligazione_scadenzario = posizione;

		for i in 1..ListaObbScadVoceNext.count loop
			update obbligazione_scad_voce
			set TI_APPARTENENZA			 = ListaObbScadVoceNext(i).ti_appartenenza,
				TI_GESTIONE				 = ListaObbScadVoceNext(i).ti_gestione,
				CD_VOCE					 = ListaObbScadVoceNext(i).cd_voce,
				CD_CENTRO_RESPONSABILITA = ListaObbScadVoceNext(i).cd_centro_responsabilita,
				CD_LINEA_ATTIVITA		 = ListaObbScadVoceNext(i).cd_linea_attivita,
				IM_VOCE					 = ListaObbScadVoceNext(i).im_voce,
				CD_FONDO_RICERCA		 = ListaObbScadVoceNext(i).cd_fondo_ricerca,
				DUVA					 = ListaObbScadVoceNext(i).duva,
				UTUV					 = ListaObbScadVoceNext(i).utuv,
				PG_VER_REC				 = pg_ver_rec + 1
			where cd_cds 				      = aObbNext.cd_cds
			  and esercizio 				  = aObbNext.esercizio
			  and esercizio_originale = aObbNext.esercizio_originale
			  and pg_obbligazione 			  = aObbNext.pg_obbligazione
			  and pg_obbligazione_scadenzario = posizione;

			-- aggiorno i saldi
			if aObbNext.esercizio = aObbNext.esercizio_competenza then
			-- obbligazione non pluriennale => aggiorno i saldi
			   CNRCTB035.aggiornaSaldoDettScad(aObbNext,ListaObbScadVoceNext(i),ListaObbScadVoceNext(i).im_voce, isControlloBloccante,ListaObbScadVoceNext(i).utuv, ListaObbScadVoceNext(i).duva);
			end if;

		end loop;
	 end if;
end;

-- restituisce true se l'accertamento è stato completamente incassato
Function isAccEsaurito (aAcc accertamento%Rowtype) Return Boolean Is
 tot_associato_rev  NUMBER;

Begin
 Select Sum(b.im_associato_doc_contabile)
 Into   tot_associato_rev
 From   accertamento a, accertamento_scadenzario b
 Where  a.cd_cds = aAcc.cd_cds And
        a.esercizio = aAcc.esercizio And
        a.esercizio_originale = aAcc.esercizio_originale And
	a.pg_accertamento = aAcc.pg_accertamento And
	a.cd_cds = b.cd_cds And
	a.esercizio = b.esercizio And
	a.esercizio_originale = b.esercizio_originale And
	a.pg_accertamento = b.pg_accertamento And
	a.DT_CANCELLAZIONE is Null And
	a.riportato = 'N';

 If  tot_associato_rev = aAcc.im_accertamento Then
    Return True;
 Else
    Return False;
 End If;
End;

-- restituisce true se l'obbligazione è stata completamente incassata
Function isObbEsaurita (aObb obbligazione%Rowtype) Return Boolean Is
 tot_associato_man  NUMBER;
Begin
 Select Sum(b.im_associato_doc_contabile)
 Into   tot_associato_man
 From   obbligazione a, obbligazione_scadenzario b
 Where  a.cd_cds = aObb.cd_cds And
        a.esercizio = aObb.esercizio And
        a.esercizio_originale = aObb.esercizio_originale And
	a.pg_obbligazione = aObb.pg_obbligazione And
	a.cd_cds = b.cd_cds And
	a.esercizio = b.esercizio And
	a.esercizio_originale = b.esercizio_originale And
	a.pg_obbligazione = b.pg_obbligazione And
	a.DT_CANCELLAZIONE is Null And
	a.riportato = 'N';

 If  tot_associato_man = aObb.im_obbligazione Then
    Return True;
 Else
    Return False;
 End If;
End;

end;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy