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

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

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

  CREATE OR REPLACE PACKAGE BODY "CNRCTB130" AS

 procedure chiudiFondo(
  aCdCds varchar2,
  aEsercizio number,
  aCdUnitaOrganizzativa varchar2,
  aCdCodiceFondo varchar2,
  aUser varchar2
 ) is
   aPgCall number;
   aFondo fondo_economale%rowtype;
   aFondoSpesa fondo_spesa%rowtype;
   aVsxFondo vsx_reintegro_fondo%rowtype;
   aCount number;
   aTSNow date;
   aReversale reversale%rowtype;
--   aImReversaleChiusura number;
 begin
  aTSNow:=sysdate;
  begin

  -- Recupera il Fondo Economale
     select * into aFondo from fondo_economale a where
	   cd_cds = aCdCds
	   and cd_unita_organizzativa = aCdUnitaOrganizzativa
       and esercizio = aEsercizio
 	   and cd_codice_fondo = aCdCodiceFondo
     for update nowait;
  exception when NO_DATA_FOUND then
   IBMERR001.RAISE_ERR_GENERICO('Fondo economale non trovato');
  end;

--   -- Controlla che il Fondo Economale sia in stato "Aperto"
--   if aFondo.fl_aperto = 'N' then
--      IBMERR001.RAISE_ERR_GENERICO('Fondo economale non aperto');
--   end if;

--   -- Controlla che tutte le spese associate a documenti siano state reintegrate
--   select count(*) into aNumSpeseSuCompensi from
-- 				  fondo_spesa b
--                where
-- 			         b.esercizio = aEsercizio
-- 			     and b.cd_cds = aCdCds
-- 				 and b.cd_unita_organizzativa =aCdUnitaOrganizzativa
-- 				 and b.cd_codice_fondo = aCdCodiceFondo
-- 				 and b.fl_reintegrata = 'N'
-- 				 and b.fl_documentata = 'Y'
-- 				 and b.cd_tipo_documento_amm = CNRCTB100.TI_COMPENSO;
--
--   if aNumSpeseSuCompensi > 0 then
--      IBMERR001.RAISE_ERR_GENERICO('Alcune spese associate a compensi non sono state reintegrate');
--   end if;

  if aFondo.fl_rev_da_emettere = 'N' then
     IBMERR001.RAISE_ERR_GENERICO('La Reversale di chiusura del Fondo non deve essere creata.');
  end if;
  -- Controlla i Capitoli Finanziari delle annotazioni su PGiro relative al Fondo Economale
  chkAnnotazoniPGiro (aCdCds, aEsercizio, aCdUnitaOrganizzativa, aCdCodiceFondo);


	 creaReversaleChiusuraFondo( aFondo, aReversale, /*aImReversaleChiusura, */aUser, aPgCall );

	 --update fondo
	update fondo_economale set
	   pg_reversale = aReversale.pg_reversale,
	   fl_rev_da_emettere = 'N',
	   duva = aTSNow,
	   utuv = aTSNow,
	pg_ver_rec=pg_ver_rec+1
	where
	   esercizio = aEsercizio
	   and cd_cds = aCdCds
	   and cd_unita_organizzativa = aCdUnitaOrganizzativa
	and cd_codice_fondo = aCdCodiceFondo;

 end;


 PROCEDURE annullaReintegroSpeseFondo
      (
       aCdCdsMandato varchar2,
       aEsMandato varchar2,
       aPgMandato number,
       aImMandato number,
	   aUser varchar2,
	   aTSNow date
      ) is
  aFondo fondo_economale%rowtype;
 begin

  begin
   select * into aFondo from fondo_economale a where
    exists (select 1 from fondo_spesa a1 where
	                a1.cd_cds = a.cd_cds
				and a1.cd_unita_organizzativa = a.cd_unita_organizzativa
                and a1.esercizio = a.esercizio
				and a1.cd_codice_fondo = a.cd_codice_fondo
				and a1.cd_cds_mandato = aCdCdsMandato
				and a1.esercizio_mandato = aEsMandato
				and a1.pg_mandato = aPgMandato)
    for update nowait;
  exception when NO_DATA_FOUND then
   IBMERR001.RAISE_ERR_GENERICO('Fondo economale da aggiornare per annullamento mandato n.'||aPgMandato||' del cds:'||aCdCdsMandato||' es:'||aEsMandato||' non trovato');
  end;

  if aFondo.fl_aperto = 'N' then
     IBMERR001.RAISE_ERR_GENERICO('Impossibile annullare il reintegro di spese di un fondo economale non aperto');
  end if;

  update fondo_economale
   set
    im_residuo_fondo=im_residuo_fondo-aImMandato,
    im_totale_reintegri=im_totale_reintegri-aImMandato,
    im_totale_spese=im_totale_spese+aImMandato,
    utuv=aUser,
    duva=aTSNow,
    pg_ver_rec=pg_ver_rec+1
  where
       esercizio=aFondo.esercizio
   and cd_cds=aFondo.cd_cds
   and cd_unita_organizzativa=aFondo.cd_unita_organizzativa
   and cd_codice_fondo=aFondo.cd_codice_fondo;


  -- Aggiornamento

  for aSpesa in (select * from fondo_spesa where
                      esercizio=aFondo.esercizio
                  and cd_cds=aFondo.cd_cds
                  and cd_unita_organizzativa=aFondo.cd_unita_organizzativa
                  and cd_codice_fondo=aFondo.cd_codice_fondo
                  and cd_cds_mandato = aCdCdsMandato
				  and esercizio_mandato = aEsMandato
                  and pg_mandato = aPgMandato
				  for update nowait
			  ) loop
   update fondo_spesa set
	 CD_CDS_MANDATO=null,
     ESERCIZIO_MANDATO=null,
     PG_MANDATO=null,
     FL_REINTEGRATA='N',
     UTUV=aUser,
	 DUVA=aTSnow,
	 PG_VER_REC=PG_VER_REC+1
   where
        cd_cds=aSpesa.cd_cds
    and esercizio = aSpesa.esercizio
	and cd_unita_organizzativa=aSpesa.cd_unita_organizzativa
    and cd_codice_fondo=aSpesa.cd_codice_fondo
	and pg_fondo_spesa=aSpesa.pg_fondo_spesa;
  end loop;
 end;

 procedure vsx_reintegraSpeseFondo(
       pgCall NUMBER
 ) is
 begin
 	  vsx_reintegraChiudiSpeseFondo( pgCall, CNRCTB038.TI_MAN_PAG);
 end;

 procedure vsx_reintegraChiudiSpeseFondo(
       pgCall NUMBER,
	   aTiMandato VARCHAR2
 ) is
   aEs number(4);
   aCdCds varchar2(30);
   aCdUo varchar2(30);
   aCdCodiceFondo varchar2(10);
   aNumNonCollegateObblig number;
   aNumReintegrate number;
   aObb obbligazione%rowtype;
   aTotCollegatoScad number(15,2);
   aUser varchar2(20);
   aTSNow date;
   aGen documento_generico%rowtype;
   aGenRiga documento_generico_riga%rowtype;
   aListGenRighe CNRCTB100.docGenRigaList;
   aIRigaMan number;
   aTotMandato number(15,2);
   aMan mandato%rowtype;
   aManRiga mandato_riga%rowtype;
   aManPComp mandato%rowtype;
   aListRigheManP CNRCTB038.righeMandatoList;
   aFE fondo_economale%rowtype;
   aDivisaEuro varchar2(30);
   i number;
   aCdModPag varchar2(10);
   aPgBanca number(8);
   aAnagTst anagrafico%rowtype;
   aTerzoCompenso number(8);
  aTotSpese number(15,2);
  aDataRegistrazione date;
 begin
  aTSNow:=sysdate;
  aTotMandato:=0;
  aIRigaMan:=0;

  for aPar in (select distinct cd_cds, esercizio, cd_uo, cd_codice_fondo, utcr
                from vsx_reintegro_fondo
				   where pg_call = pgCall) loop
   aEs:=aPar.esercizio;
   aCdCds:=aPar.cd_cds;
   aCdUo:=aPar.cd_uo;
   aCdCodiceFondo:=aPar.cd_codice_fondo;
   aUser:=aPar.utcr;
  end loop;


  -- Recupera il Fondo Economale
  select * into aFE from fondo_economale where
                    esercizio=aEs
				and cd_cds=aCdCds
				and cd_unita_organizzativa=aCdUo
				and cd_codice_fondo=aCdCodiceFondo
   for update nowait;

  -- Controlla che tutte le spese da reintegrare siano collegate ad una obbligazione
  select count(*) into aNumNonCollegateObblig from
				  fondo_spesa b
               where
			         b.esercizio = aEs
			     and b.cd_cds = aCdCds
				 and b.cd_unita_organizzativa =aCdUo
				 and b.cd_codice_fondo = aCdCodiceFondo
				 and b.fl_documentata = 'N'
				 and pg_obbligazione is null
			   	 and exists (select 1 from vsx_reintegro_fondo
                    	         where
                                       pg_call = pgCall
                    			   and cd_cds = b.cd_cds
                    			   and cd_uo =b.cd_unita_organizzativa
                    			   and esercizio = b.esercizio
                    			   and cd_codice_fondo = b.cd_codice_fondo
                    			   and pg_fondo_spesa = b.pg_fondo_spesa
            			);

  if aNumNonCollegateObblig > 0 then
   IBMERR001.RAISE_ERR_GENERICO('Alcune spese da reintegrare risultano non ancora collegate ad '||cnrutil.getLabelObbligazioniMin());
  end if;

  -- Controlla che non ci siano spese già reintegrate
  select count(*) into aNumReintegrate from
				  fondo_spesa b
               where
			         b.esercizio = aEs
			     and b.cd_cds = aCdCds
				 and b.cd_unita_organizzativa =aCdUo
				 and b.cd_codice_fondo = aCdCodiceFondo
				 and b.fl_reintegrata = 'Y'
			   	 and exists (select 1 from vsx_reintegro_fondo
                    	         where
                                       pg_call = pgCall
                    			   and cd_cds = b.cd_cds
                    			   and cd_uo =b.cd_unita_organizzativa
                    			   and esercizio = b.esercizio
                    			   and cd_codice_fondo = b.cd_codice_fondo
                    			   and pg_fondo_spesa = b.pg_fondo_spesa
            			);
  if aNumReintegrate > 0 then
   IBMERR001.RAISE_ERR_GENERICO('Alcune spese risultano già reintegrate');
  end if;

  -- Recupera la Data che sarà utilizzata per la registrazione dei documenti.
  --  La data dipende dal'Esercizio di scrivania e dalla SYSDATE;
  aDataRegistrazione:= CNRCTB008.GETTIMESTAMPCONTABILE(aEs, aTSNow);

  aMan.CD_CDS:=aCdCds;
  aMan.ESERCIZIO:=aEs;
  aMan.CD_UNITA_ORGANIZZATIVA:=aCdUo;
  aMan.CD_CDS_ORIGINE:=aCdCds;
  aMan.CD_UO_ORIGINE:=aCdUo;
  aMan.CD_TIPO_DOCUMENTO_CONT:=CNRCTB018.TI_DOC_MAN;
  aMan.TI_MANDATO:=aTiMandato;
  aMan.TI_COMPETENZA_RESIDUO:=CNRCTB038.TI_MAN_COMP;
  if aTiMandato = CNRCTB038.TI_MAN_REG then
     aMan.DS_MANDATO:='Mandato di regolarizzazione per reintegro fondo economale: '||aEs||'-'||aCdUo||' n.'||aCdCodiceFondo;
     aMan.STATO:=CNRCTB038.STATO_MAN_PAG;
  else
     aMan.DS_MANDATO:='Mandato per reintegro fondo economale: '||aEs||'-'||aCdUo||' n.'||aCdCodiceFondo;
     aMan.STATO:=CNRCTB038.STATO_MAN_EME;
  end if;
  aMan.DT_EMISSIONE:=TRUNC(aDataRegistrazione); 	 -- TRUNC(aTSNow);
  aMan.IM_RITENUTE:=0;
--  aMan.DT_TRASMISSIONE:=;
--  aMan.DT_PAGAMENTO:=;
--  aMan.DT_ANNULLAMENTO:=;
  aMan.UTCR:=aUser;
  aMan.DACR:=aTSNow;
  aMan.UTUV:=aUser;
  aMan.DUVA:=aTSNow;
  aMan.PG_VER_REC:=1;
  aMan.STATO_TRASMISSIONE:=CNRCTB038.STATO_MAN_TRASCAS_NODIST;

  -- Ciclo sulle scadenze di obbligazioni collegate a spese selezionate come da reintegrare

  -- Reset obligazione
  aObb:=null;
  aListGenRighe.delete;
  aGen:=null;
  aGenRIga:=null;
  aDivisaEuro:=CNRCTB015.GETVAL01PERCHIAVE(CNRCTB100.CCNR_DIVISA,CNRCTB100.CCNR_EURO);
  i:=0;
  for aKObbScad in (select distinct a.cd_cds, a.esercizio, a.esercizio_originale, a.pg_obbligazione, a.pg_obbligazione_scadenzario, a.im_scadenza, a.im_associato_doc_amm from
                  obbligazione_scadenzario a,
				  fondo_spesa b
               where
			         b.esercizio = aEs
			     and b.cd_cds = aCdCds
				 and b.cd_unita_organizzativa =aCdUo
				 and b.cd_codice_fondo = aCdCodiceFondo
				 and b.fl_documentata = 'N'
				 and a.cd_cds = b.cd_cds_obbligazione
				 and a.esercizio = b.esercizio
				 and a.esercizio_originale = b.esercizio_ori_obbligazione
				 and a.pg_obbligazione = b.pg_obbligazione
				 and a.pg_obbligazione_scadenzario = b.pg_obbligazione_scadenzario
			   	 and exists (select 1 from vsx_reintegro_fondo
                    	         where
                                       pg_call = pgCall
                    			   and cd_cds = b.cd_cds
                    			   and cd_uo =b.cd_unita_organizzativa
                    			   and esercizio = b.esercizio
                    			   and cd_codice_fondo = b.cd_codice_fondo
                    			   and pg_fondo_spesa = b.pg_fondo_spesa
            			)

  ) loop
   if
              aObb.cd_cds is not null
    	  and aObb.esercizio is not null
    	  and aObb.esercizio_originale is not null
    	  and aObb.pg_obbligazione is not null
          and aObb.esercizio is not null
    	  and
		  (
		       aObb.cd_cds <> aKObbScad.cd_cds
		    or aObb.esercizio <> aKObbScad.esercizio
	    or aObb.esercizio_originale <> aKObbScad.esercizio_originale
    	    or aObb.pg_obbligazione <> aKObbScad.pg_obbligazione
	      )
	  or
         	  aObb.esercizio is null
   then
    if aGen.esercizio is not null then
     -- Creo il documento generico del giro precedente
     CNRCTB110.CREAGENERICO(aGen,aListGenRighe);
     for aIndex in 1 .. aListRigheManP.count loop
      if aListRigheManP(aIndex).PG_DOC_AMM is null then
	   aListRigheManP(aIndex).PG_DOC_AMM:=aGen.pg_documento_generico;
      end if;
	 end loop;
    end if;

	aListGenRighe.delete;
	aGen:=null;
	aGenRIga:=null;
    i:=0;

    -- Lettura lockante dell'obbligazione nuova
    begin
 	 select * into aObb from obbligazione where
           cd_cds = aKObbScad.cd_cds
 	  and esercizio = aKObbScad.esercizio
 	  and esercizio_originale = aKObbScad.esercizio_originale
 	  and pg_obbligazione = aKObbScad.pg_obbligazione
      for update nowait;
    exception when NO_DATA_FOUND then
     IBMERR001.RAISE_ERR_GENERICO(cnrutil.getLabelObbligazione()||' non trovata');
    end;

    aCdModPag:=null;
    aPgBanca:=null;

	-- Estraggo le modalità di pagamento più recenti per il terzo specificato in obbligazione
	CNRCTB080.getModPagUltime(aObb.cd_terzo, aCdModPag, aPgBanca);

	aAnagTst:=CNRCTB080.GETANAG(aObb.cd_terzo);

    -- Creo la testata del nuovo generico per l'obbligazione in processo

    aGen.CD_CDS:=aObb.cd_cds;
    aGen.CD_UNITA_ORGANIZZATIVA:=aObb.cd_unita_organizzativa;
    aGen.ESERCIZIO:=aObb.esercizio;
    aGen.CD_TIPO_DOCUMENTO_AMM:=CNRCTB100.TI_GEN_REINTEGRO_FONDO;
    aGen.CD_CDS_ORIGINE:=aObb.cd_cds;
    aGen.CD_UO_ORIGINE:=aObb.cd_unita_organizzativa;
    aGen.DATA_REGISTRAZIONE:=TRUNC(aDataRegistrazione);	-- trunc(aTSNow);
    aGen.DS_DOCUMENTO_GENERICO:='Reintegro fondo economale: '||aEs||'-'||aCdUo||' n.'||aCdCodiceFondo;
    aGen.TI_ISTITUZ_COMMERC:=CNRCTB100.TI_ISTITUZIONALE;
    -- aGen.IM_TOTALE:=null; -- calcolato da motore di gen. doc. gen.
    aGen.STATO_COFI:=CNRCTB100.STATO_GEN_COFI_TOT_MR;
	-- Fix errore 757 i generici di reintegro vanno in coep come prime scritture
    aGen.STATO_COGE:=CNRCTB100.STATO_COEP_INI;
    aGen.STATO_COAN:=CNRCTB100.STATO_COEP_INI;
    aGen.CD_DIVISA:=aDivisaEuro;
    aGen.CAMBIO:=1;
    --   aGen.ESERCIZIO_LETTERA:=0;
    --   aGen.PG_LETTERA:=0;
    aGen.DACR:=aTSNow;
    aGen.UTCR:=aUser;
    aGen.DUVA:=aTSNow;
    aGen.UTUV:=aUser;
    aGen.PG_VER_REC:=1;
    aGen.DT_SCADENZA:=TRUNC(aDataRegistrazione);	  -- aTSNow;
    aGen.STATO_PAGAMENTO_FONDO_ECO:=CNRCTB100.STATO_NO_PFONDOECO;
    aGen.TI_ASSOCIATO_MANREV:=CNRCTB100.TI_ASSOC_TOT_MAN_REV ;
   end if;



   -- Check che la scadenza sia completamente coperta da spese che appartengono al gruppo delle selezionate per il reintegro

   select sum(b.im_ammontare_spesa) into aTotCollegatoScad from
				  fondo_spesa b
               where
			         b.esercizio = aEs
			     and b.cd_cds = aCdCds
				 and b.cd_unita_organizzativa =aCdUo
				 and b.cd_codice_fondo = aCdCodiceFondo
				 and b.fl_documentata = 'N'
				 and b.cd_cds_obbligazione = aKObbScad.cd_cds
                                 and b.esercizio_ori_obbligazione = aKObbScad.esercizio_originale
				 and b.pg_obbligazione = aKObbScad.pg_obbligazione
				 and b.pg_obbligazione_scadenzario = aKObbScad.pg_obbligazione_scadenzario
			   	 and exists (select 1 from vsx_reintegro_fondo
                    	         where
                                       pg_call = pgCall
                    			   and cd_cds = b.cd_cds
                    			   and cd_uo =b.cd_unita_organizzativa
                    			   and esercizio = b.esercizio
                    			   and cd_codice_fondo = b.cd_codice_fondo
                    			   and pg_fondo_spesa = b.pg_fondo_spesa
   );
   if aKObbScad.im_scadenza != aTotCollegatoScad then
    IBMERR001.RAISE_ERR_GENERICO('La scadenza di '||cnrutil.getLabelObbligazioneMin()||': '||aKObbScad.pg_obbligazione_scadenzario||' dell''obbligazione: '||aKObbScad.pg_obbligazione||' non risulta completamente coperta da spese selezionate per il reintegro');
   end if;

   if aKObbScad.im_scadenza != aKObbScad.im_associato_doc_amm then
    IBMERR001.RAISE_ERR_GENERICO('L''importo associato a documenti amministrativi risulta diverso dall''importo della scadenza: '||aKObbScad.pg_obbligazione_scadenzario||' dell'''||cnrutil.getLabelObbligazioneMin()||': '||aKObbScad.pg_obbligazione);
   end if;

   aGenRiga.CD_CDS:=aGen.CD_CDS;
   aGenRiga.CD_UNITA_ORGANIZZATIVA:=aGen.CD_UNITA_ORGANIZZATIVA;
   aGenRiga.ESERCIZIO:=aGen.ESERCIZIO;
   aGenRiga.CD_TIPO_DOCUMENTO_AMM:=aGen.CD_TIPO_DOCUMENTO_AMM;
   aGenRiga.DS_RIGA:=aGen.DS_DOCUMENTO_GENERICO;
   aGenRiga.IM_RIGA_DIVISA:=aKObbScad.IM_SCADENZA;
   aGenRiga.IM_RIGA:=aKObbScad.IM_SCADENZA;
   aGenRiga.CD_TERZO:=aObb.cd_terzo;
--   aGenRiga.CD_TERZO_CESSIONARIO:=aGen.CD_TERZO_CESSIONARIO;
--   aGenRiga.CD_TERZO_UO_CDS:=aGen.CD_TERZO_UO_CDS;

   aGenRiga.RAGIONE_SOCIALE:=aAnagTst.RAGIONE_SOCIALE;
   aGenRiga.NOME:=aAnagTst.NOME;
   aGenRiga.COGNOME:=aAnagTst.COGNOME;
   aGenRiga.CODICE_FISCALE:=aAnagTst.CODICE_FISCALE;
   aGenRiga.PARTITA_IVA:=aAnagTst.PARTITA_IVA;

   aGenRiga.CD_MODALITA_PAG:=aCdModPag;
   aGenRiga.PG_BANCA:=aPgBanca;
--   aGenRiga.CD_TERMINI_PAG:=aCompenso.CD_TERMINI_PAG;
--   aGenRiga.CD_TERMINI_PAG_UO_CDS:=aCompenso.CD_TERMINI_PAG_UO_CDS;
--   aGenRiga.PG_BANCA_UO_CDS:=aGen.PG_BANCA_UO_CDS;
--   aGenRiga.CD_MODALITA_PAG_UO_CDS:=aGen.CD_MODALITA_PAG_UO_CDS;
--   aGenRiga.NOTE:=aGen.NOTE;
   aGenRiga.DT_DA_COMPETENZA_COGE:=TRUNC(aDataRegistrazione);			  -- TRUNC(aTSNow);
   aGenRiga.DT_A_COMPETENZA_COGE:=TRUNC(aDataRegistrazione);			  -- TRUNC(aTSNow);
   aGenRiga.STATO_COFI:=aGen.STATO_COFI;
--   aGenRiga.DT_CANCELLAZIONE:=
   aGenRiga.CD_CDS_OBBLIGAZIONE:=aKObbScad.CD_CDS;
   aGenRiga.ESERCIZIO_OBBLIGAZIONE:=aKObbScad.ESERCIZIO;
   aGenRiga.ESERCIZIO_ORI_OBBLIGAZIONE:=aKObbScad.ESERCIZIO_ORIGINALE;
   aGenRiga.PG_OBBLIGAZIONE:=aKObbScad.PG_OBBLIGAZIONE;
   aGenRiga.PG_OBBLIGAZIONE_SCADENZARIO:=aKObbScad.PG_OBBLIGAZIONE_SCADENZARIO;
--   aGenRiga.CD_CDS_ACCERTAMENTO:=aAcc.CD_CDS;
--   aGenRiga.ESERCIZIO_ACCERTAMENTO:=aAcc.ESERCIZIO;
--   aGenRiga.ESERCIZIO_ORI_ACCERTAMENTO:=aAcc.ESERCIZIO_ORIGINALE;
--   aGenRiga.PG_ACCERTAMENTO:=aAcc.PG_ACCERTAMENTO;
--   aGenRiga.PG_ACCERTAMENTO_SCADENZARIO:=null;
   aGenRiga.DACR:=aGen.DACR;
   aGenRiga.UTCR:=aGen.UTCR;
   aGenRiga.UTUV:=aGen.UTUV;
   aGenRiga.DUVA:=aGen.DUVA;
   aGenRiga.PG_VER_REC:=aGen.PG_VER_REC;
   aGenRiga.TI_ASSOCIATO_MANREV:=aGen.TI_ASSOCIATO_MANREV;
   i:=i+1;
   aListGenRighe(i):=aGenRiga;

   -- Generazione righe mandato

   aManRiga:=null;
   aManRiga.CD_CDS:=aGen.cd_cds;
   aManRiga.ESERCIZIO:=aGen.esercizio;
   aManRiga.ESERCIZIO_OBBLIGAZIONE:=aGenRiga.esercizio_obbligazione;
   aManRiga.ESERCIZIO_ORI_OBBLIGAZIONE:=aGenRiga.esercizio_ori_obbligazione;
   aManRiga.PG_OBBLIGAZIONE:=aGenRiga.pg_obbligazione;
   aManRiga.PG_OBBLIGAZIONE_SCADENZARIO:=aGenRiga.pg_obbligazione_scadenzario;
   aManRiga.CD_CDS_DOC_AMM:=aGen.cd_cds;
   aManRiga.CD_UO_DOC_AMM:=aGen.cd_unita_organizzativa;
   aManRiga.ESERCIZIO_DOC_AMM:=aGen.esercizio;
   aManRiga.CD_TIPO_DOCUMENTO_AMM:=aGen.cd_tipo_documento_amm;
   aManRiga.DS_MANDATO_RIGA:=aMan.ds_mandato;
   aManRiga.STATO:=aMan.stato;
   aManRiga.CD_TERZO:=aFE.cd_terzo;
   -- Fix del 27/01/2004 - se il mandato è di regolarizzazione pg_banca e CD_MODALITA_PAG devono essere a null
   if aMan.ti_mandato <> CNRCTB038.TI_MAN_REG then
    aManRiga.PG_BANCA:=aFE.pg_banca;
    aManRiga.CD_MODALITA_PAG:=aFE.cd_modalita_pag;
   end if;
   aManRiga.IM_MANDATO_RIGA:=aKObbScad.IM_SCADENZA;
   aManRiga.IM_RITENUTE_RIGA:=0;
   aManRiga.FL_PGIRO:='N';
   aManRiga.UTCR:=aUser;
   aManRiga.DACR:=aTSNow;
   aManRiga.UTUV:=aUser;
   aManRiga.DUVA:=aTSNow;
   aManRiga.PG_VER_REC:=1;
   aIRigaMan:=aIRigaMan+1;
   aTotMandato:=aTotMandato+aManRiga.im_mandato_riga;
   aListRigheManP(aIRigaMan):=aManRiga;
  end loop;

  -- Creo il documento generico dell'ultimo giro
  if aGen.esercizio is not null then
   CNRCTB110.CREAGENERICO(aGen,aListGenRighe);
   for aIndex in 1 .. aListRigheManP.count loop
    if aListRigheManP(aIndex).PG_DOC_AMM is null then
     aListRigheManP(aIndex).PG_DOC_AMM:=aGen.pg_documento_generico;
    end if;
   end loop;
  end if;
  -- ===================================================================
  -- Sezione relativa alle spese DOCUMENTATE (non derivanti da compensi)
  -- ===================================================================
  for aSpesa1 in (select * from
				  fondo_spesa b
               where
			         b.esercizio = aEs
			     and b.cd_cds = aCdCds
				 and b.cd_unita_organizzativa =aCdUo
				 and b.cd_codice_fondo = aCdCodiceFondo
				 and b.cd_tipo_documento_amm != CNRCTB100.TI_COMPENSO
				 and pg_obbligazione is null
			   	 and exists (select 1 from vsx_reintegro_fondo
                    	         where
                                       pg_call = pgCall
                    			   and cd_cds = b.cd_cds
                    			   and cd_uo =b.cd_unita_organizzativa
                  			   and esercizio = b.esercizio
                    			   and cd_codice_fondo = b.cd_codice_fondo
                    			   and pg_fondo_spesa = b.pg_fondo_spesa
            			)
  ) loop
   -- Lock del documento in processo
   CNRCTB100.lockDocAmm(
    aSpesa1.cd_tipo_documento_amm,
    aSpesa1.cd_cds_doc_amm,
    aSpesa1.esercizio_doc_amm,
    aSpesa1.cd_uo_doc_amm,
    aSpesa1.pg_documento_amm
   );
   for aDocRiga in (select * from v_doc_amm_cofi_fondo_riga where
                         esercizio = aSpesa1.esercizio_doc_amm
				     and cd_tipo_documento_amm = aSpesa1.cd_tipo_documento_amm
					 and cd_cds = aSpesa1.cd_cds_doc_amm
					 and cd_unita_organizzativa = aSpesa1.cd_uo_doc_amm
					 and pg_documento = aSpesa1.pg_documento_amm
   ) loop
    -- Generazione righe mandato
    aManRiga:=null;
    aManRiga.CD_CDS:=aDocRiga.cd_cds;
    aManRiga.ESERCIZIO:=aSpesa1.esercizio; --aDocRiga.esercizio;
    aManRiga.ESERCIZIO_OBBLIGAZIONE:=aDocRiga.esercizio_obbligazione;
    aManRiga.ESERCIZIO_ORI_OBBLIGAZIONE:=aDocRiga.esercizio_ori_obbligazione;
    aManRiga.PG_OBBLIGAZIONE:=aDocRiga.pg_obbligazione;
    aManRiga.PG_OBBLIGAZIONE_SCADENZARIO:=aDocRiga.pg_obbligazione_scadenzario;
    aManRiga.CD_CDS_DOC_AMM:=aDocRiga.cd_cds;
    aManRiga.CD_UO_DOC_AMM:=aDocRiga.cd_unita_organizzativa;
    aManRiga.ESERCIZIO_DOC_AMM:=aDocRiga.esercizio;
    aManRiga.CD_TIPO_DOCUMENTO_AMM:=aDocRiga.cd_tipo_documento_amm;
    aManRiga.PG_DOC_AMM:=aDocRiga.pg_documento;
    aManRiga.DS_MANDATO_RIGA:=aMan.ds_mandato;
    aManRiga.STATO:=aMan.stato;
    aManRiga.CD_TERZO:=aFE.cd_terzo;
	if aMan.ti_mandato <> CNRCTB038.TI_MAN_REG then
       aManRiga.PG_BANCA:=aFE.pg_banca;
       aManRiga.CD_MODALITA_PAG:=aFE.cd_modalita_pag;
	end if;
    aManRiga.IM_MANDATO_RIGA:=aDocRiga.im_scadenza;
    aManRiga.IM_RITENUTE_RIGA:=0;
    aManRiga.FL_PGIRO:='N';
    aManRiga.UTCR:=aUser;
    aManRiga.DACR:=aTSNow;
    aManRiga.UTUV:=aUser;
    aManRiga.DUVA:=aTSNow;
    aManRiga.PG_VER_REC:=1;
    aIRigaMan:=aIRigaMan+1;
    aTotMandato:=aTotMandato+aManRiga.im_mandato_riga;
    aListRigheManP(aIRigaMan):=aManRiga;
	select * into aObb from obbligazione where
	     cd_cds = aDocRiga.cd_cds_obbligazione
	 and esercizio=aDocRiga.esercizio_obbligazione
	 and esercizio_originale = aDocRiga.esercizio_ori_obbligazione
	 and pg_obbligazione = aDocRiga.pg_obbligazione
	for update nowait;
   end loop;

   CNRCTB100.updateDocAmm(
    aSpesa1.cd_tipo_documento_amm,
    aSpesa1.cd_cds_doc_amm,
    aSpesa1.esercizio_doc_amm,
    aSpesa1.cd_uo_doc_amm,
    aSpesa1.pg_documento_amm,
    ' stato_cofi = '''||CNRCTB100.STATO_COM_COFI_TOT_MR||''', ti_associato_manrev = '''||CNRCTB100.TI_ASSOC_TOT_MAN_REV||'''',
    null,
    aUser,
    aTSNow
   );

   for aDR in (select * from v_doc_amm_riga_key where
                         esercizio = aSpesa1.esercizio_doc_amm
				     and cd_tipo_documento_amm = aSpesa1.cd_tipo_documento_amm
					 and cd_cds = aSpesa1.cd_cds_doc_amm
					 and cd_unita_organizzativa = aSpesa1.cd_uo_doc_amm
					 and pg_documento = aSpesa1.pg_documento_amm) loop
    CNRCTB100.updateDocAmmRiga(
     aSpesa1.cd_tipo_documento_amm,
     aSpesa1.cd_cds_doc_amm,
     aSpesa1.esercizio_doc_amm,
     aSpesa1.cd_uo_doc_amm,
     aSpesa1.pg_documento_amm,
     aDR.progressivo_riga,
     ' stato_cofi = '''||CNRCTB100.STATO_COM_COFI_TOT_MR||'''',
	 null,
     aUser,
     aTSNow
    );
   end loop;

  end loop;

  aMan.IM_MANDATO:=aTotMandato;
  if aTiMandato = CNRCTB038.TI_MAN_REG then
    aMan.IM_PAGATO:=aTotMandato;
  else
    aMan.IM_PAGATO:=0;
  end if;

  if aTotMandato <> 0 then
     CNRCTB037.generaDocumento(aMan,aListRigheManP);
     if aTiMandato = CNRCTB038.TI_MAN_REG then

-- 	    -- Calcola la somma delle spese non reintegrate, che sarà l'importo dell'accertamento.
-- 		   select sum(b.im_ammontare_spesa) into aTotSpese from
-- 						  fondo_spesa b
-- 		               where b.esercizio = aEs
-- 					     and b.cd_cds = aCdCds
-- 						 and b.cd_unita_organizzativa = aCdUo
-- 						 and b.cd_codice_fondo = aCdCodiceFondo
-- 					   	 and exists (select 1 from vsx_reintegro_fondo
-- 		                    	         where
-- 		                                       pg_call = pgCall
-- 		                    			   and cd_cds = b.cd_cds
-- 		                    			   and cd_uo =b.cd_unita_organizzativa
-- 		                    			   and esercizio = b.esercizio
-- 		                    			   and cd_codice_fondo = b.cd_codice_fondo
-- 		                    			   and pg_fondo_spesa = b.pg_fondo_spesa
-- 		   );

	-- Aggiorna il campo IM_PAGAMENTI_INCASSI su VOCE_F_SALDI_CMP
	    CNRCTB037.RISCONTROMANDATO (aMan.esercizio, aMan.cd_cds, aMan.pg_mandato, 'I', aMan.utcr);

        creaReversaleRegolarizzazione( aMan, aFE, pgCall );
     end if;
   end if;

  -- Aggiornamento

  for aPar in (select * from vsx_reintegro_fondo
				   where pg_call = pgCall
			  ) loop
   update fondo_spesa set
	 CD_CDS_MANDATO=aMan.cd_cds,
     ESERCIZIO_MANDATO=aMan.esercizio,
     PG_MANDATO=aMan.pg_mandato,
     FL_REINTEGRATA='Y',
     UTUV=aUser,
	 DUVA=aTSnow,
	 PG_VER_REC=PG_VER_REC+1
   where
        cd_cds=aPar.cd_cds
    and esercizio = aPar.esercizio
	and cd_unita_organizzativa=apar.cd_uo
    and cd_codice_fondo=aPar.cd_codice_fondo
	and pg_fondo_spesa=aPar.pg_fondo_spesa
    and (
	    cd_tipo_documento_amm != CNRCTB100.TI_COMPENSO
     or cd_tipo_documento_amm is null
	);
  end loop;


  -- ===============================================================
  -- Sezione relativa alle spese DOCUMENTATE (DA COMPENSI)
  -- ===============================================================
  for aSpesa in (select * from
				  fondo_spesa b
               where
			         esercizio = aEs
			     and cd_cds = aCdCds
				 and cd_unita_organizzativa =aCdUo
				 and cd_codice_fondo = aCdCodiceFondo
				 and cd_tipo_documento_amm = CNRCTB100.TI_COMPENSO
				 and pg_obbligazione is null
			   	 and exists (select 1 from vsx_reintegro_fondo
                    	         where
                                       pg_call = pgCall
                    			   and cd_cds = b.cd_cds
                    			   and cd_uo =b.cd_unita_organizzativa
                  			       and esercizio = b.esercizio
                    			   and cd_codice_fondo = b.cd_codice_fondo
                    			   and pg_fondo_spesa = b.pg_fondo_spesa
            			))
  loop
   CNRCTB100.lockDocAmm(
    aSpesa.cd_tipo_documento_amm,
    aSpesa.cd_cds_doc_amm,
    aSpesa.esercizio_doc_amm,
    aSpesa.cd_uo_doc_amm,
    aSpesa.pg_documento_amm
   );
   CNRCTB560.CONTABILIZZACOMPENSOCOFIFONDO(
    aSpesa.cd_cds_doc_amm,
	aSpesa.cd_uo_doc_amm,
    aSpesa.esercizio,
    aSpesa.esercizio_doc_amm,
	aSpesa.pg_documento_amm,
	aUser,
	aManPComp
   );
   if aManPComp.pg_mandato is null then
    IBMERR001.RAISE_ERR_GENERICO('Compenso da reintegrare via fondo senza mandato principale non supportato!');
   end if;

   --Poichè il mandato di reintegro di un "COMPENSO" viene generato con il terzo percipiente e la sua modalità di pagamento
   --associata nel compenso e solo dopo viene modificato il terzo e la modalità di pagamento mettendo quelle
   --dell'economo, occorre ripetre il controllo sulla tracciabilità dei pagamenti.
   Begin
      for aManRigaComp in (
         select * from mandato_riga
         where cd_cds = aManPComp.cd_cds
	         and esercizio = aManPComp.esercizio
	         and pg_mandato = aManPComp.pg_mandato)
      loop
          cnrctb037.verificaTracciabilitaPag(aManPComp.esercizio,
                                             aManPComp.dt_emissione,
                                             aFE.cd_modalita_pag,
                                             aManRigaComp.cd_tipo_documento_amm,
                                             aManPComp.im_mandato - aManPComp.im_ritenute);
      end loop;
      for aManCoriComp in (
          select * from mandato a
          where cd_cds = aManPComp.cd_cds
	          and esercizio = aManPComp.esercizio
            and exists (select 1 from ass_mandato_mandato
                        where cd_cds = aManPComp.cd_cds
	                        and esercizio = aManPComp.esercizio
	                        and pg_mandato =  aManPComp.pg_mandato
                          and cd_cds_coll = a.cd_cds
	                        and esercizio_coll = a.esercizio
	                        and pg_mandato_coll =  a.pg_mandato))
      loop
            for aManRigaCoriComp in (
                select * from mandato_riga
                where cd_cds = aManCoriComp.cd_cds
	                and esercizio = aManCoriComp.esercizio
	                and pg_mandato = aManCoriComp.pg_mandato)
            loop
                   cnrctb037.verificaTracciabilitaPag(aManCoriComp.esercizio,
                                                      aManCoriComp.dt_emissione,
                                                      aFE.cd_modalita_pag,
                                                      aManRigaCoriComp.cd_tipo_documento_amm,
                                                      aManCoriComp.im_mandato - aManCoriComp.im_ritenute);
            end loop;
      end loop;
   End;

   select cd_terzo into aTerzoCompenso from compenso where
         esercizio = aSpesa.esercizio_doc_amm
	 and cd_cds = aSpesa.cd_cds_doc_amm
	 and cd_unita_organizzativa = aSpesa.cd_uo_doc_amm
	 and pg_compenso = aSpesa.pg_documento_amm;

   -- Aggiornare sul mandato di pagamento: il terzo, la descrizone in modo da uniformarli a quelle del mandato di reintegro.
   update mandato set
       ds_mandato = 'Mandato di reintegro fondo economale (spesa da compenso): '||aEs||'-'||aCdUo||' n.'||aCdCodiceFondo
   where
        cd_cds = aManPComp.cd_cds
	and esercizio = aManPComp.esercizio
	and pg_mandato = aManPComp.pg_mandato;
   update mandato_terzo set
       cd_terzo = aFE.cd_terzo
   where
        cd_cds = aManPComp.cd_cds
	and esercizio = aManPComp.esercizio
	and pg_mandato = aManPComp.pg_mandato
    and cd_terzo = aTerzoCompenso;
   update mandato_riga set
     CD_TERZO=aFE.cd_terzo
    ,PG_BANCA=aFE.pg_banca
    ,CD_MODALITA_PAG=aFE.cd_modalita_pag
   where
        cd_cds = aManPComp.cd_cds
	and esercizio = aManPComp.esercizio
	and pg_mandato = aManPComp.pg_mandato
	and cd_terzo = aTerzoCompenso;
   -- Aggiorna l'indicazione sul terzo nelle reversali collegate
   for aRevCoriComp in (
    select * from reversale a where
         cd_cds = aManPComp.cd_cds
	 and esercizio = aManPComp.esercizio
     and exists (select 1 from ass_mandato_reversale where
           cd_cds_mandato = aManPComp.cd_cds
	   and esercizio_mandato = aManPComp.esercizio
	   and pg_mandato =  aManPComp.pg_mandato
       and cd_cds_reversale = a.cd_cds
	   and esercizio_reversale = a.esercizio
	   and pg_reversale =  a.pg_reversale
	 )
   ) loop
    update reversale_riga set
      CD_TERZO=aFE.cd_terzo
    where
         cd_cds = aRevCoriComp.cd_cds
	 and esercizio = aRevCoriComp.esercizio
	 and pg_reversale = aRevCoriComp.pg_reversale
	 and cd_terzo = aTerzoCompenso;
    update reversale_terzo set
       cd_terzo = aFE.cd_terzo
    where
         cd_cds = aRevCoriComp.cd_cds
	 and esercizio = aRevCoriComp.esercizio
	 and pg_reversale = aRevCoriComp.pg_reversale
     and cd_terzo = aTerzoCompenso;
   end loop;

   for aManCoriComp in (
    select * from mandato a where
         cd_cds = aManPComp.cd_cds
	 and esercizio = aManPComp.esercizio
     and exists (select 1 from ass_mandato_mandato where
           cd_cds = aManPComp.cd_cds
	   and esercizio = aManPComp.esercizio
	   and pg_mandato =  aManPComp.pg_mandato
       and cd_cds_coll = a.cd_cds
	   and esercizio_coll = a.esercizio
	   and pg_mandato_coll =  a.pg_mandato
	 )
   ) loop
    update mandato_riga set
      CD_TERZO=aFE.cd_terzo
     ,PG_BANCA=aFE.pg_banca
     ,CD_MODALITA_PAG=aFE.cd_modalita_pag
    where
         cd_cds = aManCoriComp.cd_cds
	 and esercizio = aManCoriComp.esercizio
	 and pg_mandato = aManCoriComp.pg_mandato
	 and cd_terzo = aTerzoCompenso;
    update mandato_terzo set
       cd_terzo = aFE.cd_terzo
    where
         cd_cds = aManCoriComp.cd_cds
	 and esercizio = aManCoriComp.esercizio
	 and pg_mandato = aManCoriComp.pg_mandato
     and cd_terzo = aTerzoCompenso;
   end loop;

   aTotMandato:=aTotMandato+aManPComp.im_mandato;
   update fondo_spesa set
	 CD_CDS_MANDATO=aManPComp.cd_cds,
     ESERCIZIO_MANDATO=aManPComp.esercizio,
     PG_MANDATO=aManPComp.pg_mandato,
     FL_REINTEGRATA='Y',
     UTUV=aUser,
	 DUVA=aTSnow,
	 PG_VER_REC=PG_VER_REC+1
   where
        cd_cds=aSpesa.cd_cds
    and esercizio = aSpesa.esercizio
	and cd_unita_organizzativa=aSpesa.cd_unita_organizzativa
    and cd_codice_fondo=aSpesa.cd_codice_fondo
	and pg_fondo_spesa=aSpesa.pg_fondo_spesa
    and cd_tipo_documento_amm = CNRCTB100.TI_COMPENSO;
  end loop; -- FINE SEZIONE DERIVANTE DA COMPENSO

  update fondo_economale
   set
    im_residuo_fondo=im_residuo_fondo+aTotMandato,
    im_totale_reintegri=im_totale_reintegri+aTotMandato,
    im_totale_spese=im_totale_spese-aTotMandato,
    utuv=aUser,
    duva=aTSNow,
    pg_ver_rec=pg_ver_rec+1
  where
       esercizio=aEs
   and cd_cds=aCdCds
   and cd_unita_organizzativa=aCdUo
   and cd_codice_fondo=aCdCodiceFondo;

 end; -- FINE vsx_reintegraChiudiSpeseFondo



  procedure creaReversaleRegolarizzazione( aMan MANDATO%rowtype,
  										   aFondo FONDO_ECONOMALE%rowtype,
										   aPgCall number ) is
  aImReversale number(15,2);
--  aImResiduoDoc number(15,2);
  aImDispScadenza number(15,2);
  aCdTerzoUO number(8);
  aCdModPagUO varchar2(10);
  aPgBancaUO number(10);
  aTSNow date;
  aUser varchar2(20);
  aEuro varchar2(30);
  aGen documento_generico%rowtype;
  aGenRiga documento_generico_riga%rowtype;
  aListGenRighe CNRCTB100.docGenRigaList;
  aRev reversale%rowtype;
  aRevRiga reversale_riga%rowtype;
  aRevRighe CNRCTB038.righeReversaleList;
  aListaAcrScad CNRCTB035.scadAcrList;
  docCount number;
  revCount number;
  aDataRegistrazione date;
  aAccert accertamento%rowtype;
  aAccertScad accertamento_scadenzario%rowtype;
  aObblig obbligazione%rowtype;
  aObbligScad obbligazione_scadenzario%rowtype;
 -- aTotSpese number(15,2);
 -- aAccertTronc accertamento%rowtype;
   aEs number(4);
   aCdCds varchar2(30);
   aCdUo varchar2(30);
   aCdCodiceFondo varchar2(10);
  begin
    aImReversale:=aMan.im_mandato;
   --estrae il terzo UO
   CNRCTB080.getTerzoPerUO(aFondo.cd_unita_organizzativa, aCdTerzoUO, aCdModPagUO, aPgBancaUO,aFondo.esercizio);
   aTSNow:=aMan.dacr;
   aEuro:=CNRCTB015.GETVAL01PERCHIAVE(CNRCTB100.CCNR_DIVISA,CNRCTB100.CCNR_EURO);
   aUser:=aMan.utcr;

   aEs:=aFondo.esercizio;
   aCdCds:=aFondo.cd_cds;
   aCdUo:=aFondo.cd_unita_organizzativa;
   aCdCodiceFondo:=aFondo.cd_codice_fondo;

  -- Recupera la Data che sarà utilizzata per la registrazione dei documenti.
  --  La data dipende dal'Esercizio di scrivania e dalla SYSDATE;
  aDataRegistrazione:= aMan.dt_emissione;

	-- creo documento generico di entrata per regolarizzazione
   aGen:=null;
   aGen.CD_TIPO_DOCUMENTO_AMM:=CNRCTB100.TI_GENERICO_REGOLA_E;
   aGen.CD_CDS:=aFondo.cd_cds;
   aGen.CD_UNITA_ORGANIZZATIVA:=aFondo.cd_unita_organizzativa;
   aGen.ESERCIZIO:=aFondo.esercizio;
   aGen.CD_CDS_ORIGINE:=aFondo.cd_cds;
   aGen.CD_UO_ORIGINE:=aFondo.cd_unita_organizzativa;
   aGen.DATA_REGISTRAZIONE:=TRUNC(aDataRegistrazione);    -- TRUNC(aTSNow);
   aGen.DT_DA_COMPETENZA_COGE:=TRUNC(aDataRegistrazione); -- TRUNC(aTSNow);
   aGen.DT_A_COMPETENZA_COGE:=TRUNC(aDataRegistrazione);  -- TRUNC(aTSNow);
   aGen.DS_DOCUMENTO_GENERICO:='Generico di regolarizzazione spese fondo economale: '||aFondo.esercizio||'-'||aFondo.cd_unita_organizzativa||' n.'||aFondo.cd_codice_fondo;
   aGen.TI_ISTITUZ_COMMERC:=CNRCTB100.TI_ISTITUZIONALE;
   aGen.IM_TOTALE:=aImReversale;
   aGen.STATO_COFI:=CNRCTB100.STATO_GEN_COFI_TOT_MR;
   aGen.STATO_COGE:=CNRCTB100.STATO_COEP_EXC;
   aGen.STATO_COAN:=CNRCTB100.STATO_COEP_EXC;
   aGen.CD_DIVISA:=aEuro;
   aGen.CAMBIO:=1;
--   aGen.ESERCIZIO_LETTERA:=0;
--   aGen.PG_LETTERA:=0;
   aGen.DACR:=aTSNow;
   aGen.UTCR:=aUser;
   aGen.DUVA:=aTSNow;
   aGen.UTUV:=aUser;
   aGen.PG_VER_REC:=1;
   aGen.DT_SCADENZA:=TRUNC(aDataRegistrazione); -- TRUNC(aTSNow);
   aGen.STATO_PAGAMENTO_FONDO_ECO:=CNRCTB100.STATO_NO_PFONDOECO;
   aGen.TI_ASSOCIATO_MANREV:=CNRCTB100.TI_ASSOC_TOT_MAN_REV ;

   docCount:=1;
--   aImResiduoDoc := aImReversale;

   -- Crea una annotazione di giro tronca in parte entrate (Accertamento), per le spese non
   --  reintegrate
   aAccert:=null;

	-- Crea l'accertamento scadenzario relativo all'accertamento creato in precedenza
   aAccertScad:=null;

   -- Crea l'obbligazione in pgiro tronca relativa all'accertamento precedentemente creato
   aObblig:=null;

   -- Creo l'obbligazione_scadenzario
   aObbligScad:=null;

   creaAnnotPGiroTroncEntrata(aPgCall, aFondo, aAccert, aAccertScad, aObblig, aObbligScad, aUser, aMan.im_mandato, true);

   -- Crea la riga del documento generico
   aGenRiga:=null;
   aGenRiga.CD_CDS:=aGen.CD_CDS;
   aGenRiga.CD_UNITA_ORGANIZZATIVA:=aGen.CD_UNITA_ORGANIZZATIVA;
   aGenRiga.ESERCIZIO:=aGen.ESERCIZIO;
   aGenRiga.CD_TIPO_DOCUMENTO_AMM:=aGen.CD_TIPO_DOCUMENTO_AMM;
   aGenRiga.DS_RIGA:=aGen.DS_DOCUMENTO_GENERICO;
   aGenRiga.IM_RIGA_DIVISA:=aAccert.IM_ACCERTAMENTO; -- (Tot Spese) ??? CORRETTO ???
   aGenRiga.IM_RIGA:=aGenRiga.IM_RIGA_DIVISA;
   aGenRiga.CD_TERZO_UO_CDS:=aCdTerzoUO;
   aGenRiga.CD_TERZO:=aFondo.CD_TERZO;
   aGenRiga.RAGIONE_SOCIALE:=null;
   aGenRiga.NOME:=null;
   aGenRiga.COGNOME:=null;
   aGenRiga.CODICE_FISCALE:=null;
   aGenRiga.PARTITA_IVA:=null;
   aGenRiga.DT_DA_COMPETENZA_COGE:=TRUNC(aDataRegistrazione); -- TRUNC(aTSNow);
   aGenRiga.DT_A_COMPETENZA_COGE:=TRUNC(aDataRegistrazione);   -- TRUNC(aTSNow);
   aGenRiga.STATO_COFI:=aGen.STATO_COFI;
   aGenRiga.CD_CDS_ACCERTAMENTO:=aAccert.CD_CDS;	   -- aListaAcrScad.CD_CDS;
   aGenRiga.ESERCIZIO_ACCERTAMENTO:=aAccert.ESERCIZIO; -- aListaAcrScad.ESERCIZIO;
   aGenRiga.ESERCIZIO_ORI_ACCERTAMENTO:=aAccert.ESERCIZIO_ORIGINALE; -- aListaAcrScad.ESERCIZIO_ORIGINALE;
   aGenRiga.PG_ACCERTAMENTO:=aAccert.PG_ACCERTAMENTO;  -- aListaAcrScad.PG_ACCERTAMENTO;
   aGenRiga.PG_ACCERTAMENTO_SCADENZARIO:=aAccertScad.PG_ACCERTAMENTO_SCADENZARIO;  -- aListaAcrScad.PG_ACCERTAMENTO_SCADENZARIO;
   aGenRiga.PG_BANCA_UO_CDS:=aPgBancaUO;
   aGenRiga.CD_MODALITA_PAG_UO_CDS:=aCdModPagUO;
   aGenRiga.DACR:=aGen.DACR;
   aGenRiga.UTCR:=aGen.UTCR;
   aGenRiga.UTUV:=aGen.UTUV;
   aGenRiga.DUVA:=aGen.DUVA;
   aGenRiga.PG_VER_REC:=aGen.PG_VER_REC;
   aGenRiga.TI_ASSOCIATO_MANREV:=aGen.TI_ASSOCIATO_MANREV;


   aListGenRighe(docCount):=aGenRiga;


   CNRCTB110.creaGenericoAggObbAcc(aGen,aListGenRighe);

--- creo la reversale di regolarizzazione
   aRev.CD_CDS:=aFondo.cd_cds;
   aRev.ESERCIZIO:=aFondo.esercizio;
   aRev.CD_UNITA_ORGANIZZATIVA:=aFondo.cd_unita_organizzativa;
   aRev.CD_CDS_ORIGINE:=aFondo.cd_cds;
   aRev.CD_UO_ORIGINE:=aFondo.cd_unita_organizzativa;
   aRev.CD_TIPO_DOCUMENTO_CONT:=CNRCTB018.TI_DOC_REV;
   aRev.TI_REVERSALE:=CNRCTB038.TI_REV_REG;
   aRev.TI_COMPETENZA_RESIDUO:=CNRCTB038.TI_MAN_COMP;
   aRev.DS_REVERSALE:='Regolarizzazione spese fondo economale: '||aFondo.esercizio||'-'||aFondo.cd_unita_organizzativa||' n.'||aFondo.cd_codice_fondo;
   aRev.STATO:=CNRCTB038.STATO_REV_PAG;
   aRev.DT_EMISSIONE:=TRUNC(aDataRegistrazione); -- TRUNC(aTSNow);
   -- Fix errore 757 la reversale di regolarizzazione in chiusura del fondo è esclusa COEP
   aRev.STATO_COGE := CNRCTB100.STATO_COEP_EXC;
--   aRev.DT_TRASMISSIONE:=;
--   aRev.DT_INCASSO:=;
--   aRev.DT_ANNULLAMENTO:=;
   aRev.IM_REVERSALE:=aImReversale ;
   aRev.IM_INCASSATO:=aImReversale ;
   aRev.DACR:=aTSNow;
   aRev.UTCR:=aUser;
   aRev.DUVA:=aTSNow;
   aRev.UTUV:=aUser;
   aRev.PG_VER_REC:=1;
   aRev.STATO_TRASMISSIONE:=CNRCTB038.STATO_REV_TRASCAS_NODIST;

   revCount:=1;
	-- per ogni riga di doc.generico creato per la chiusra del fondo viene creata una riga di reversale
   for i in 1 .. aListGenRighe.count loop
      aRevRiga:=null;
      aRevRiga.CD_CDS:=aRev.cd_cds;
      aRevRiga.ESERCIZIO:=aRev.esercizio;
      aRevRiga.ESERCIZIO_ACCERTAMENTO:=aListGenRighe(i).esercizio;
      aRevRiga.ESERCIZIO_ORI_ACCERTAMENTO:=aListGenRighe(i).esercizio_ori_accertamento;
      aRevRiga.PG_ACCERTAMENTO:=aListGenRighe(i).pg_accertamento;
      aRevRiga.PG_ACCERTAMENTO_SCADENZARIO:=aListGenRighe(i).pg_accertamento_scadenzario;
      aRevRiga.CD_CDS_DOC_AMM:=aGen.cd_cds;
      aRevRiga.CD_UO_DOC_AMM:=aGen.cd_unita_organizzativa;
      aRevRiga.ESERCIZIO_DOC_AMM:=aGen.esercizio;
      aRevRiga.CD_TIPO_DOCUMENTO_AMM:=aGen.cd_tipo_documento_amm;
      aRevRiga.PG_DOC_AMM:=aGen.pg_documento_generico;
      aRevRiga.DS_REVERSALE_RIGA:=aRev.ds_reversale;
      aRevRiga.STATO:=aRev.STATO;
      aRevRiga.CD_TERZO:=aFondo.cd_terzo;
      aRevRiga.CD_TERZO_UO:=aGenRiga.cd_terzo_uo_cds;
      ---aRevRiga.PG_BANCA:=aGenRiga.pg_banca_uo_cds;
      ---aRevRiga.CD_MODALITA_PAG:=aGenRiga.cd_modalita_pag_uo_cds;
      aRevRiga.IM_REVERSALE_RIGA:=aListGenRighe(i).im_riga;
      aRevRiga.FL_PGIRO:='Y';
      aRevRiga.UTCR:=aUser;
      aRevRiga.DACR:=aTSNow;
      aRevRiga.UTUV:=aUser;
      aRevRiga.DUVA:=aTSNow;
      aRevRiga.PG_VER_REC:=1;
      aRevRighe(i):=aRevRiga;
      revCount:=revCount+1;
   end loop;

   cnrctb037.GENERAREVERSALE( aRev,aRevRighe);
   cnrctb038.ins_ASS_MANDATO_REVERSALE ( aMan, aMan.pg_mandato, aRev);

   -- Aggiorna il campo IM_PAGAMENTI_INCASSI su VOCE_F_SALDI_CMP
   CNRCTB037.RISCONTROREVERSALE (aRev.esercizio, aRev.cd_cds, aRev.pg_reversale, 'I', aMan.utcr);


  end;

  procedure ins_VSX_REINTEGRO_FONDO (aDest VSX_REINTEGRO_FONDO%rowtype) is
  begin
   insert into VSX_REINTEGRO_FONDO (
     PG_CALL
    ,PAR_NUM
    ,PROC_NAME
    ,MESSAGETOUSER
    ,CD_CDS
    ,CD_UO
    ,ESERCIZIO
    ,CD_CODICE_FONDO
    ,PG_FONDO_SPESA
    ,UTCR
    ,DACR
    ,UTUV
    ,DUVA
    ,PG_VER_REC
   ) values (
     aDest.PG_CALL
    ,aDest.PAR_NUM
    ,aDest.PROC_NAME
    ,aDest.MESSAGETOUSER
    ,aDest.CD_CDS
    ,aDest.CD_UO
    ,aDest.ESERCIZIO
    ,aDest.CD_CODICE_FONDO
    ,aDest.PG_FONDO_SPESA
    ,aDest.UTCR
    ,aDest.DACR
    ,aDest.UTUV
    ,aDest.DUVA
    ,aDest.PG_VER_REC
    );
 end;

 procedure creaReversaleChiusuraFondo(aFondo  in out FONDO_ECONOMALE%rowtype,
 				      aRev    in out reversale%rowtype,
				      aUser   varchar2,
				      aPgCall number) is
-- aImResiduoDoc number(15,2);
  aImDispScadenza number(15,2);
  aCdTerzoUO number(8);
  aCdModPagUO varchar2(10);
  aPgBancaUO number(10);
  aTSNow date;
  aEuro varchar2(30);
  aGen documento_generico%rowtype;
  aGenRiga documento_generico_riga%rowtype;
  aListGenRighe CNRCTB100.docGenRigaList;
  aRevRiga reversale_riga%rowtype;
  aRevRighe CNRCTB038.righeReversaleList;
  aListaAcrScad CNRCTB035.scadAcrList;
  docCount number;
  revCount number;
  aSospeso sospeso%rowtype;
  aSospesoDet sospeso_det_etr%rowtype;

  aAccert         accertamento%rowtype;
  aAccertScad     accertamento_scadenzario%rowtype;
  aAccertScadVoce accertamento_scad_voce%Rowtype;

  aObblig         obbligazione%rowtype;
  aObbligScad     obbligazione_scadenzario%rowtype;
  aObbligScadVoce obbligazione_scad_voce%rowtype;

  aDataRegistrazione date;

  aAccertRiportata accertamento%rowtype;
  aObbligRiportata obbligazione%rowtype;

  aAccertPerRev accertamento%rowtype;
  aEsRev number(4);

  parametri_esercizio parametri_cnr%rowtype;
 begin
   parametri_esercizio:=CNRUTL001.getRecParametriCnr(aFondo.ESERCIZIO);
  --estrae il terzo UO
   CNRCTB080.getTerzoPerUO(aFondo.cd_unita_organizzativa, aCdTerzoUO, aCdModPagUO, aPgBancaUO,aFondo.esercizio);
   aTSNow:=sysdate;
   aEuro:=CNRCTB015.GETVAL01PERCHIAVE(CNRCTB100.CCNR_DIVISA,CNRCTB100.CCNR_EURO);

   -- Recupera la Data che sarà utilizzata per la registrazione dei documenti.
   --  La data dipende dal'Esercizio di scrivania e dalla SYSDATE;
   aDataRegistrazione:= CNRCTB008.GETTIMESTAMPCONTABILE(aFondo.esercizio_reversale, aTSNow);

   -- Crea una annotazione di giro tronca in parte entrate (Accertamento), per le spese non reintegrate
   aAccert := null;
   -- Crea l'accertamento scadenzario relativo all'accertamento creato in precedenza
   aAccertScad := null;

   -- Crea l'obbligazione in pgiro tronca relativa all'accertamento precedentemente creato
   aObblig := null;
   -- Creo l'obbligazione_scadenzario
   aObbligScad := null;

   creaAnnotPGiroTroncEntrata (aPgCall, aFondo, aAccert, aAccertScad, aObblig, aObbligScad, aUser, null, false);

   aAccertPerRev := null;

   	-- Controlla la data di scrivania

   if (aFondo.esercizio = aFondo.esercizio_reversale)  then
        -- L'esercizio di scrivania corrisponde alla data odierna.
	-- L'esercizio della Reversale sarà uguale all'esercizio del Fondo.
   	aEsRev := aFondo.esercizio;
	aAccertPerRev := aAccert;
   else
        -- L'esercizio di scrivania è diverso dalla data odierna.
	-- L'esercizio della Reversale sarà successivo a quello di scrivania
   	aEsRev:= aFondo.esercizio_reversale;

        -- 10.01.2008 remmata per nuova gestione
   	-- Riporta l'annot. su pgiro tronca nell'esercizio successivo
	--CNRCTB046.RIPPGIROCDS (aAccert, aAccertRiportata, aDataRegistrazione, aUser);

        CNRCTB035.getPgiroCds(aAccert, aAccertScad, aAccertScadVoce, aObblig, aObbligScad, aObbligScadVoce);

        -- 10.01.2008 SF NUOVA GESTIONE RIBALTAMENTO PARTITE DI GIRO
        CNRCTB046.ripPgiroCdsEntrambe(aObblig, aObbligScad, aObbligScadVoce, aAccert, aAccertScad, aAccertScadVoce, Null, Null, CNRCTB001.GESTIONE_ENTRATE,
                                                      aTSNow, aUser, aObbligRiportata, aAccertRiportata);


	-- L'accertamento che sarà utilizzato per la creazione della Reversale e degli altri docum.
	-- sarà l'accertamento riportato.
	aAccertPerRev:= aAccertRiportata;
   end if;


	-- creo documento generico di entrata per chiusura del fondo economale
   aGen:=null;
   aGen.CD_TIPO_DOCUMENTO_AMM:=CNRCTB100.TI_GEN_CHIUSURA_FONDO;
   aGen.CD_CDS:=aFondo.cd_cds;
   aGen.CD_UNITA_ORGANIZZATIVA:=aFondo.cd_unita_organizzativa;
   aGen.ESERCIZIO:=aEsRev;
   aGen.CD_CDS_ORIGINE:=aFondo.cd_cds;
   aGen.CD_UO_ORIGINE:=aFondo.cd_unita_organizzativa;
   aGen.DATA_REGISTRAZIONE:=TRUNC(aDataRegistrazione);		 -- TRUNC(aTSNow);
   aGen.DT_DA_COMPETENZA_COGE:=TRUNC(aDataRegistrazione);	 -- TRUNC(aTSNow);
   aGen.DT_A_COMPETENZA_COGE:=TRUNC(aDataRegistrazione);	 -- TRUNC(aTSNow);
   aGen.DS_DOCUMENTO_GENERICO:='Generico di chiusura fondo economale: '||aFondo.esercizio||'-'||aFondo.cd_unita_organizzativa||' n.'||aFondo.cd_codice_fondo;
   aGen.TI_ISTITUZ_COMMERC:=CNRCTB100.TI_ISTITUZIONALE;
   aGen.IM_TOTALE:=aAccertPerRev.im_accertamento;	   -- aImReversale;
   aGen.STATO_COFI:=CNRCTB100.STATO_GEN_COFI_TOT_MR;
   aGen.STATO_COGE:=CNRCTB100.STATO_COEP_EXC;
   aGen.STATO_COAN:=CNRCTB100.STATO_COEP_EXC;
   aGen.CD_DIVISA:=aEuro;
   aGen.CAMBIO:=1;
--   aGen.ESERCIZIO_LETTERA:=0;
--   aGen.PG_LETTERA:=0;
   aGen.DACR:=aTSNow;
   aGen.UTCR:=aUser;
   aGen.DUVA:=aTSNow;
   aGen.UTUV:=aUser;
   aGen.PG_VER_REC:=1;
   aGen.DT_SCADENZA:=TRUNC(aDataRegistrazione);		     -- TRUNC(aTSNow);
   aGen.STATO_PAGAMENTO_FONDO_ECO:=CNRCTB100.STATO_NO_PFONDOECO;
   aGen.TI_ASSOCIATO_MANREV:=CNRCTB100.TI_ASSOC_TOT_MAN_REV ;

   docCount:=1;
--   aImResiduoDoc := aImReversale;



   -- Crea la riga del documento generico
   aGenRiga:=null;
   aGenRiga.CD_CDS:=aGen.CD_CDS;
   aGenRiga.CD_UNITA_ORGANIZZATIVA:=aGen.CD_UNITA_ORGANIZZATIVA;
   aGenRiga.ESERCIZIO:=aGen.ESERCIZIO;
   aGenRiga.CD_TIPO_DOCUMENTO_AMM:=aGen.CD_TIPO_DOCUMENTO_AMM;
   aGenRiga.DS_RIGA:=aGen.DS_DOCUMENTO_GENERICO;
   aGenRiga.IM_RIGA_DIVISA:=aAccertPerRev.IM_ACCERTAMENTO; -- (Tot Spese) ??? CORRETTO ???
   aGenRiga.IM_RIGA:=aGenRiga.IM_RIGA_DIVISA;
   aGenRiga.CD_TERZO_UO_CDS:=aCdTerzoUO;
   aGenRiga.CD_TERZO:=aFondo.CD_TERZO;
   aGenRiga.RAGIONE_SOCIALE:=null;
   aGenRiga.NOME:=null;
   aGenRiga.COGNOME:=null;
   aGenRiga.CODICE_FISCALE:=null;
   aGenRiga.PARTITA_IVA:=null;
   aGenRiga.DT_DA_COMPETENZA_COGE:=TRUNC(aDataRegistrazione); -- TRUNC(aTSNow);
   aGenRiga.DT_A_COMPETENZA_COGE:=TRUNC(aDataRegistrazione);   -- TRUNC(aTSNow);
   aGenRiga.STATO_COFI:=aGen.STATO_COFI;
   aGenRiga.CD_CDS_ACCERTAMENTO:=aAccertPerRev.CD_CDS;	   -- aListaAcrScad.CD_CDS;
   aGenRiga.ESERCIZIO_ACCERTAMENTO:=aAccertPerRev.ESERCIZIO; -- aListaAcrScad.ESERCIZIO;
   aGenRiga.ESERCIZIO_ORI_ACCERTAMENTO:=aAccertPerRev.ESERCIZIO_ORIGINALE;  -- aListaAcrScad.ESERCIZIO_ORIGINALE;
   aGenRiga.PG_ACCERTAMENTO:=aAccertPerRev.PG_ACCERTAMENTO;  -- aListaAcrScad.PG_ACCERTAMENTO;
   aGenRiga.PG_ACCERTAMENTO_SCADENZARIO:=aAccertScad.PG_ACCERTAMENTO_SCADENZARIO;  -- aListaAcrScad.PG_ACCERTAMENTO_SCADENZARIO;
   aGenRiga.PG_BANCA_UO_CDS:=aPgBancaUO;
   aGenRiga.CD_MODALITA_PAG_UO_CDS:=aCdModPagUO;
   aGenRiga.DACR:=aGen.DACR;
   aGenRiga.UTCR:=aGen.UTCR;
   aGenRiga.UTUV:=aGen.UTUV;
   aGenRiga.DUVA:=aGen.DUVA;
   aGenRiga.PG_VER_REC:=aGen.PG_VER_REC;
   aGenRiga.TI_ASSOCIATO_MANREV:=aGen.TI_ASSOCIATO_MANREV;


   aListGenRighe(docCount):=aGenRiga;

   CNRCTB110.creaGenericoAggObbAcc(aGen,aListGenRighe);

--- creo la reversale di chiusura fondo
   aRev.CD_CDS:=aFondo.cd_cds;
   aRev.ESERCIZIO:=aEsRev; 	  -- Esercizio stabilito in base al sospeso scelto dall'utente
   aRev.CD_UNITA_ORGANIZZATIVA:=aFondo.cd_unita_organizzativa;
   aRev.CD_CDS_ORIGINE:=aFondo.cd_cds;
   aRev.CD_UO_ORIGINE:=aFondo.cd_unita_organizzativa;
   aRev.CD_TIPO_DOCUMENTO_CONT:=CNRCTB018.TI_DOC_REV;
   aRev.TI_REVERSALE:=CNRCTB038.TI_REV_SOS;
   aRev.TI_COMPETENZA_RESIDUO:=CNRCTB038.TI_MAN_COMP;
   aRev.DS_REVERSALE:='Chiusura fondo economale: '||aFondo.esercizio||'-'||aFondo.cd_unita_organizzativa||' n.'||aFondo.cd_codice_fondo;
   aRev.STATO:=CNRCTB038.STATO_REV_EME;
   aRev.DT_EMISSIONE:=TRUNC(aDataRegistrazione);		 -- TRUNC(aTSNow);
   aRev.STATO_COGE := CNRCTB100.STATO_COEP_INI;
--   aRev.DT_TRASMISSIONE:=;
--   aRev.DT_INCASSO:=;
--   aRev.DT_ANNULLAMENTO:=;
   aRev.IM_REVERSALE:=aAccertPerRev.im_accertamento;			 -- aImReversale;
   aRev.IM_INCASSATO:=0;
   aRev.DACR:=aTSNow;
   aRev.UTCR:=aUser;
   aRev.DUVA:=aTSNow;
   aRev.UTUV:=aUser;
   aRev.PG_VER_REC:=1;
   aRev.STATO_TRASMISSIONE:=CNRCTB038.STATO_REV_TRASCAS_NODIST;

   revCount:=1;
	-- per ogni riga di doc.generico creato per la chiusra del fondo viene creata una riga di reversale
   for i in 1 .. aListGenRighe.count loop
   aRevRiga:=null;
   aRevRiga.CD_CDS:=aRev.cd_cds;
   aRevRiga.ESERCIZIO:=aRev.esercizio;
   aRevRiga.ESERCIZIO_ACCERTAMENTO:=aAccertPerRev.esercizio;
   aRevRiga.ESERCIZIO_ORI_ACCERTAMENTO:=aAccertPerRev.esercizio_originale;
   aRevRiga.PG_ACCERTAMENTO:=aAccertPerRev.pg_accertamento;
   aRevRiga.PG_ACCERTAMENTO_SCADENZARIO:=aAccertScad.pg_accertamento_scadenzario;
   aRevRiga.CD_CDS_DOC_AMM:=aGen.cd_cds;
   aRevRiga.CD_UO_DOC_AMM:=aGen.cd_unita_organizzativa;
   aRevRiga.ESERCIZIO_DOC_AMM:=aGen.esercizio;
   aRevRiga.CD_TIPO_DOCUMENTO_AMM:=aGen.cd_tipo_documento_amm;
   aRevRiga.PG_DOC_AMM:=aGen.pg_documento_generico;
   aRevRiga.DS_REVERSALE_RIGA:=aRev.ds_reversale;
   aRevRiga.STATO:=aRev.STATO;
   aRevRiga.CD_TERZO:=aFondo.cd_terzo;
   aRevRiga.CD_TERZO_UO:=aGenRiga.cd_terzo_uo_cds;
   aRevRiga.PG_BANCA:=aGenRiga.pg_banca_uo_cds;
   aRevRiga.CD_MODALITA_PAG:=aGenRiga.cd_modalita_pag_uo_cds;
   aRevRiga.IM_REVERSALE_RIGA:=aAccertPerRev.im_accertamento;
   aRevRiga.FL_PGIRO:='Y';
   aRevRiga.UTCR:=aUser;
   aRevRiga.DACR:=aTSNow;
   aRevRiga.UTUV:=aUser;
   aRevRiga.DUVA:=aTSNow;
   aRevRiga.PG_VER_REC:=1;
   aRevRighe(i):=aRevRiga;
   revCount:=revCount+1;
   end loop;

   cnrctb037.GENERAREVERSALE( aRev,aRevRighe);
	if (parametri_esercizio.fl_tesoreria_unica='Y' ) then
   aSospeso.cd_cds:= CNRCTB020.GETCDCDSENTE (aFondo.esercizio);
  else
   aSospeso.cd_cds:= aFondo.cd_cds;
  end if;
   aSospeso.esercizio:= aFondo.esercizio_reversale;
   aSospeso.cd_sospeso:= aFondo.cd_sospeso;
   aSospeso.ti_entrata_spesa:= aFondo.ti_es_sospeso;
   aSospeso.ti_sospeso_riscontro:= aFondo.ti_sr_sospeso;

   cnrctb037.GENERADETT_ETR_SOSPESO( aRev,aSospeso, aUser);

end;

procedure chiudiSpese(
  aCdCds varchar2,
  aEsercizio number,
  aCdUnitaOrganizzativa varchar2,
  aCdCodiceFondo varchar2,
  aUser varchar2
 ) is
   aPgCall number;
   aFondo fondo_economale%rowtype;
   aFondoSpesa fondo_spesa%rowtype;
   aVsxFondo vsx_reintegro_fondo%rowtype;
   aCount number;
   aTSNow date;
   aReversale reversale%rowtype;
--   aImReversaleChiusura number(15,2);
   aFl_rev_da_emettere char(1);
   aNumSpeseSuCompensi number;
 begin
  aTSNow:=sysdate;
  begin

  -- Recupera il Fondo Economale
     select * into aFondo from fondo_economale a where
	   cd_cds = aCdCds
	   and cd_unita_organizzativa = aCdUnitaOrganizzativa
       and esercizio = aEsercizio
 	   and cd_codice_fondo = aCdCodiceFondo
     for update nowait;
  exception when NO_DATA_FOUND then
   IBMERR001.RAISE_ERR_GENERICO('Fondo economale non trovato');
  end;

  -- Controlla che il Fondo sia in stato "Aperto"
  if aFondo.fl_aperto = 'N' then
     IBMERR001.RAISE_ERR_GENERICO('Fondo economale non aperto');
  end if;

    -- Controlla che tutte le spese associate a documenti siano state reintegrate
  select count(*) into aNumSpeseSuCompensi from
				  fondo_spesa b
               where
			         b.esercizio = aEsercizio
			     and b.cd_cds = aCdCds
				 and b.cd_unita_organizzativa =aCdUnitaOrganizzativa
				 and b.cd_codice_fondo = aCdCodiceFondo
				 and b.fl_reintegrata = 'N'
				 and b.fl_documentata = 'Y'
				 and b.cd_tipo_documento_amm = CNRCTB100.TI_COMPENSO;

  if aNumSpeseSuCompensi > 0 then
     IBMERR001.RAISE_ERR_GENERICO('Alcune spese associate a compensi non sono state reintegrate');
  end if;

  -- Controlla i Capitoli Finanziari delle annotazioni su PGiro relative al Fondo Economale
  chkAnnotazoniPGiro (aCdCds, aEsercizio, aCdUnitaOrganizzativa, aCdCodiceFondo);

  -- Controlla l'importo residuo del Fondo, per impostare il flag FL_REV_DA_EMETTERE
  if aFondo.IM_RESIDUO_FONDO = 0 then
  	 aFl_rev_da_emettere := 'N';
  else
  	 aFl_rev_da_emettere:= 'Y';
  end if;

  -- Aggiorna il FL_REV_DA_EMETTERE
  update fondo_economale
  		 set FL_REV_DA_EMETTERE = aFl_rev_da_emettere,
		 	 fl_aperto = 'N'
		 where cd_cds = aCdCds
		 and cd_unita_organizzativa = aCdUnitaOrganizzativa
       	 and esercizio = aEsercizio
 	   	 and cd_codice_fondo = aCdCodiceFondo;


  aPgCall := IBMUTL020.vsx_get_pg_call();
  aCount := 0;

  -- Cicla sul Fondo_spesa ed inserisce nella VSX_REINTEGRO_FONDO le spese non reintegrate
  for aFondoSpesa in (select * from fondo_spesa where
                esercizio=aEsercizio
                and cd_cds=aCdCds
                and cd_unita_organizzativa=aCdUnitaOrganizzativa
                and cd_codice_fondo=aCdCodiceFondo
		  		and fl_reintegrata = 'N'
			  ) loop
     aVsxFondo.PG_CALL:=aPgCall;
     aVsxFondo.PAR_NUM:=aCount;
     aVsxFondo.PROC_NAME:=PROC_NAME_CHIUDI_FONDO;
--     aVsxFondo.MESSAGETOUSER:=;
     aVsxFondo.CD_CDS:=aCdCds;
     aVsxFondo.CD_UO:=aCdUnitaOrganizzativa;
     aVsxFondo.ESERCIZIO:=aEsercizio;
     aVsxFondo.CD_CODICE_FONDO:=aCdCodiceFondo;
     aVsxFondo.PG_FONDO_SPESA:=aFondoSpesa.pg_fondo_spesa;
     aVsxFondo.UTCR:=aUser;
     aVsxFondo.DACR:=sysdate;
     aVsxFondo.UTUV:=aUser;
     aVsxFondo.DUVA:=sysdate;
     aVsxFondo.PG_VER_REC:=0;
	 ins_VSX_REINTEGRO_FONDO( aVsxFondo );

	 aCount:=aCount + 1;
  	 end loop;

   -- Reintegra le spese non ancora reintegrate
   if aCount > 0 then
      vsx_reintegraChiudiSpeseFondo( aPgCall, CNRCTB038.TI_MAN_REG );

      delete from vsx_reintegro_fondo
      where
  	    pg_call = aPgCall and
	    par_num >= 0 and
	    par_num < aCount;

   end if;

 end;

 procedure chkAnnotazoniPGiro(
  aCdCds varchar2,
  aEsercizio number,
  aCdUnitaOrganizzativa varchar2,
  aCdCodiceFondo varchar2
 ) is
 aNumAnnotaz number;
 cd_elemento_voce varchar2(20);
 aObbligazione OBBLIGAZIONE%rowtype;
 begin
 -- Cicla sulla vista V_ASS_MANDATO_FONDO_ECO per recuperare tutti i Mandati associati al Fondo Econ.
 for aV_fondo_econ in (SELECT *
	  			   	   FROM V_ASS_MANDATO_FONDO_ECO
					   WHERE CD_CDS    = aCdCds
					   AND 	 ESERCIZIO = aEsercizio
					   AND 	 CD_UNITA_ORGANIZZATIVA = aCdUnitaOrganizzativa
					   AND 	 CD_CODICE_FONDO = aCdCodiceFondo
					   ) loop

        -- Per ogni riga di mandato, recupera l'obbligazione corrispondente
		for aObblig in (SELECT o.*
						FROM MANDATO_RIGA r,
							 OBBLIGAZIONE o
						WHERE r.CD_CDS    = o.CD_CDS
						AND   r.ESERCIZIO_OBBLIGAZIONE = o.ESERCIZIO
						AND   r.ESERCIZIO_ORI_OBBLIGAZIONE = o.ESERCIZIO_ORIGINALE
						AND   r.PG_OBBLIGAZIONE = o.PG_OBBLIGAZIONE
						AND   r.CD_CDS 	  = aV_fondo_econ.CD_CDS
						AND   r.ESERCIZIO = aV_fondo_econ.ESERCIZIO
						AND   r.PG_MANDATO= aV_fondo_econ.PG_MANDATO
						 ) loop

-- 				-- Per ogni riga di mandato, recupera l'obbligazione corrispondente
-- 				SELECT o.* into aObbligazione
-- 				FROM MANDATO_RIGA r,
-- 					 OBBLIGAZIONE o
-- 				WHERE r.CD_CDS    = o.CD_CDS
-- 				AND   r.ESERCIZIO_OBBLIGAZIONE = o.ESERCIZIO
-- 				AND   r.ESERCIZIO_ORI_OBBLIGAZIONE = o.ESERCIZIO_ORIGINALE
-- 				AND   r.PG_OBBLIGAZIONE = o.PG_OBBLIGAZIONE
-- 				AND   r.CD_CDS 	  = aV_fondo_econ.CD_CDS
-- 				AND   r.ESERCIZIO = aV_fondo_econ.ESERCIZIO
-- 				AND   r.PG_MANDATO= aV_fondo_econ.PG_MANDATO;

				-- Controlla che il CD_ELEMENTO_VOCE sia sempre lo stesso
				if (cd_elemento_voce is null) then
				   cd_elemento_voce := aObblig.CD_ELEMENTO_VOCE;
				else if (cd_elemento_voce <> aObblig.CD_ELEMENTO_VOCE) then
					 IBMERR001.RAISE_ERR_GENERICO('Le annotazioni su partita di giro collegate ai documenti di apertura del Fondo Economale sono state create su capitoli finanziari differenti.');
				end if;
				end if;
		end loop;

	end loop;

 end;

 procedure creaAnnotPGiroTroncEntrata(
   aPgCall number,
   aFondo fondo_economale%rowtype,
   aAccert IN OUT accertamento%rowtype,
   aAccertScad IN OUT accertamento_scadenzario%rowtype,
   aObblig IN OUT obbligazione%rowtype,
   aObbligScad IN OUT obbligazione_scadenzario%rowtype,
   aUser varchar2,
   aImporto number,
   reintegro boolean
 ) is
   aEs number(4);
   aCdCds varchar2(30);
   aCdUo varchar2(30);
   aCdCodiceFondo varchar2(10);
  aDataRegistrazione date;
  aTotSpese number(15,2);
  aAccertTronc accertamento%rowtype;
  aMandato  mandato%rowtype;
  aTSNow date;
  aDsAccert varchar2 (300);
  parametri_esercizio parametri_cnr%rowtype;
 begin
   aTSNow:=sysdate;
   aEs:=aFondo.esercizio;
   aCdCds:=aFondo.cd_cds;
   aCdUo:=aFondo.cd_unita_organizzativa;
   aCdCodiceFondo:=aFondo.cd_codice_fondo;
	parametri_esercizio:=CNRUTL001.getRecParametriCnr(aEs);
  -- Recupera la Data che sarà utilizzata per la registrazione dei documenti.
  --  La data dipende dal'Esercizio di scrivania e dalla SYSDATE;
  aDataRegistrazione:= CNRCTB008.GETTIMESTAMPCONTABILE(aEs, sysdate);

   -- Recupera l'accertamento relativo all'obbligazione legata alla spesa di apertura del Fondo
   select acc.* into aAccertTronc
	from fondo_economale fe
		 ,mandato_riga man_r
		 ,obbligazione obb
	 	 ,ass_obb_acr_pgiro ass
	 	 ,accertamento acc
	where fe.CD_CDS    = aCdCds
	and   fe.ESERCIZIO = aEs
	and   fe.CD_UNITA_ORGANIZZATIVA = aCdUo
	and   fe.CD_CODICE_FONDO 		= aCdCodiceFondo
	-- Join Fondo - Mand. Riga
	and   man_r.CD_CDS    = fe.CD_CDS
	and   man_r.ESERCIZIO = fe.ESERCIZIO
	and   man_r.PG_MANDATO= fe.PG_MANDATO
	-- Join Mand. Riga - Obbligazione
	and   obb.CD_CDS    = man_r.CD_CDS
	and   obb.ESERCIZIO = man_r.ESERCIZIO_OBBLIGAZIONE
	and   obb.ESERCIZIO_ORIGINALE = man_r.ESERCIZIO_ORI_OBBLIGAZIONE
	and   obb.PG_OBBLIGAZIONE = man_r.PG_OBBLIGAZIONE
	-- Join ass_obb_acr_pgiro - obbligazione
	and   ass.CD_CDS    = obb.CD_CDS
	and   ass.ESERCIZIO = obb.ESERCIZIO
	and   ass.ESERCIZIO_ORI_OBBLIGAZIONE = obb.ESERCIZIO_ORIGINALE
	and   ass.PG_OBBLIGAZIONE = obb.PG_OBBLIGAZIONE
	-- Join ass_obb_acr_pgiro - accertamento
	and   acc.CD_CDS    = ass.CD_CDS
	and   acc.ESERCIZIO = ass.ESERCIZIO
	and   acc.ESERCIZIO_ORIGINALE = ass.ESERCIZIO_ORI_ACCERTAMENTO
	and   acc.PG_ACCERTAMENTO = ass.PG_ACCERTAMENTO;

	aDsAccert:= null;

	if (reintegro) then -- La procedura è stata chiamata per il Reintegro delle Spese per la Chiusura del Fondo
--	    -- Calcola la somma delle spese non reintegrate, che sarà l'importo dell'accertamento.
-- 		   select sum(b.im_ammontare_spesa) into aTotSpese from
-- 						  fondo_spesa b
-- 		               where b.esercizio = aEs
-- 					     and b.cd_cds = aCdCds
-- 						 and b.cd_unita_organizzativa = aCdUo
-- 						 and b.cd_codice_fondo = aCdCodiceFondo
-- 					   	 and exists (select 1 from vsx_reintegro_fondo
-- 		                    	         where
-- 		                                       pg_call = aPgCall
-- 		                    			   and cd_cds = b.cd_cds
-- 		                    			   and cd_uo =b.cd_unita_organizzativa
-- 		                    			   and esercizio = b.esercizio
-- 		                    			   and cd_codice_fondo = b.cd_codice_fondo
-- 		                    			   and pg_fondo_spesa = b.pg_fondo_spesa
-- 		   							);
		aTotSpese:= aImporto;

		aDsAccert:= 'Annotazione d''Entrata su Partita di Giro per regolarizzazione spese fondo economale: '||aFondo.esercizio||'-'||aFondo.cd_unita_organizzativa||' n.'||aFondo.cd_codice_fondo;
    else -- (reintegro = false) -- La procedura è stata chiamata per la Chiusura del Fondo
	   begin

		   select m.* into aMandato
			from mandato m
			where exists (select 1 from fondo_spesa fs
				where
				      m.cd_cds    = fs.cd_cds
				and   m.esercizio = fs.esercizio
				and	  m.pg_mandato= fs.PG_MANDATO
				and   fs.esercizio= aEs
				and   fs.cd_cds   = aCdCds
				and   fs.cd_unita_organizzativa = aCdUo
				and   fs.cd_codice_fondo = aCdCodiceFondo
				and   m.TI_MANDATO  = 'R');

-- 		 select m.* into aMandato
-- 			from fondo_spesa fs
-- 				,mandato m
-- 			where m.cd_cds    = fs.cd_cds
-- 			and   m.esercizio = fs.esercizio
-- 			and	  m.pg_mandato= fs.PG_MANDATO
-- 			and   fs.esercizio= aEs
-- 			and   fs.cd_cds   = aCdCds
-- 			and   fs.cd_unita_organizzativa = aCdUo
-- 			and   fs.cd_codice_fondo = aCdCodiceFondo
-- 			and m.TI_MANDATO  = 'R';

         aTotSpese:= aFondo.im_ammontare_fondo - aMandato.im_mandato;

	   exception when NO_DATA_FOUND then
	   		aTotSpese:= aFondo.im_ammontare_fondo;
	   end;
--		aTotSpese:= aFondo.im_ammontare_fondo - aMandato.im_mandato;

		aDsAccert:= 'Annotazione d''Entrata su Partita di Giro per chiusura fondo economale: '||aFondo.esercizio||'-'||aFondo.cd_unita_organizzativa||' n.'||aFondo.cd_codice_fondo;

	end if;


	-- Crea una annotazione di giro tronca in parte entrate (Accertamento), per le spese non
   --  reintegrate
   aAccert:=null;
   aAccert.CD_CDS:=aCdCds;
   aAccert.ESERCIZIO:=aEs;
   aAccert.ESERCIZIO_ORIGINALE:=aEs;
   aAccert.CD_TIPO_DOCUMENTO_CONT:='ACR_PGIRO';
   aAccert.CD_UNITA_ORGANIZZATIVA:=aCdUo;
   aAccert.CD_CDS_ORIGINE:=aCdCds;
   aAccert.CD_UO_ORIGINE:=aCdUo;
   if(parametri_esercizio.fl_nuovo_pdg='N' ) then
   		aAccert.TI_APPARTENENZA:='D';
   else
   		aAccert.TI_APPARTENENZA:='C';
   end if;
   aAccert.TI_GESTIONE:='E';
   aAccert.CD_ELEMENTO_VOCE:= aAccertTronc.cd_elemento_voce;
   aAccert.CD_VOCE:= aAccertTronc.cd_voce;
   aAccert.DT_REGISTRAZIONE:= TRUNC(aDataRegistrazione);
   aAccert.DS_ACCERTAMENTO:= aDsAccert;
   aAccert.CD_TERZO:= aFondo.CD_TERZO;
   aAccert.IM_ACCERTAMENTO:=aTotSpese;
   aAccert.FL_PGIRO:='Y';
   aAccert.RIPORTATO:='N';
   aAccert.DACR:=aTSNow;
   aAccert.UTCR:=aUser;
   aAccert.DUVA:=aTSNow;
   aAccert.UTUV:=aUser;
   aAccert.PG_VER_REC:=1;
   aAccert.ESERCIZIO_COMPETENZA:= aFondo.ESERCIZIO;

	-- Crea l'accertamento scadenzario relativo all'accertamento creato in precedenza
   aAccertScad:=null;
   aAccertScad.CD_CDS:= aCdCds;
   aAccertScad.ESERCIZIO:= aEs;
   aAccertScad.DT_SCADENZA_EMISSIONE_FATTURA:=TRUNC(aDataRegistrazione);
   aAccertScad.DT_SCADENZA_INCASSO:=TRUNC(aDataRegistrazione);
   aAccertScad.DS_SCADENZA:= 'Annotazione d''Entrata su Partita di Giro creata in automatico';
   aAccertScad.IM_SCADENZA:=aAccert.IM_ACCERTAMENTO;
   aAccertScad.IM_ASSOCIATO_DOC_AMM:=0;
   aAccertScad.IM_ASSOCIATO_DOC_CONTABILE:=0;
   aAccertScad.DACR:=aTSNow;
   aAccertScad.UTCR:=aUser;
   aAccertScad.DUVA:=aTSNow;
   aAccertScad.UTUV:=aUser;
   aAccertScad.PG_VER_REC:=1;

   -- Crea l'obbligazione in pgiro tronca relativa all'accertamento precedentemente creato
   aObblig:=null;
--    aObblig.CD_CDS:=aCdCds;
--    aObblig.ESERCIZIO:=aEs;
--    aObblig.CD_TIPO_DOCUMENTO_CONT:='OBB_PGIRO';
--    aObblig.CD_UNITA_ORGANIZZATIVA:=aCdUo;
--    aObblig.CD_CDS_ORIGINE:=aCdCds;
--    aObblig.CD_UO_ORIGINE:=aCdUo;
--    aObblig.TI_APPARTENENZA:='D';
--    aObblig.TI_GESTIONE:='S';
--    aObblig.CD_ELEMENTO_VOCE:=aAccertTronc.cd_elemento_voce; -- !!! SBAGLIATO !!!
--    aObblig.DT_REGISTRAZIONE:=aDataRegistrazione;
--    aObblig.DS_OBBLIGAZIONE:='Annotazione di Spesa su Partita di Giro creata in automatico';
--    aObblig.CD_TERZO:= aFondo.CD_TERZO;
--    aObblig.IM_OBBLIGAZIONE:=0;
--    aObblig.IM_COSTI_ANTICIPATI:=0;
--    aObblig.ESERCIZIO_COMPETENZA:=aFondo.ESERCIZIO; --- CORRETTO ??? ----
--    aObblig.STATO_OBBLIGAZIONE:='D';    -- ??? CORRETTO ???
--    aObblig.FL_CALCOLO_AUTOMATICO:='N'; -- ??? CORRETTO ???
--    aObblig.FL_SPESE_COSTI_ALTRUI:='N'; -- ??? CORRETTO ???
--    aObblig.FL_PGIRO:='Y';			   -- ??? CORRETTO ???
--    aObblig.RIPORTATO:='N';			   -- ??? CORRETTO ???
--    aObblig.DACR:=aTSNow;
--    aObblig.UTCR:=aUser;
--    aObblig.DUVA:=aTSNow;
--    aObblig.UTUV:=aUser;
--    aObblig.PG_VER_REC:=1;

   -- Creo l'obbligazione_scadenzario
   aObbligScad:=null;
--    aObbligScad.CD_CDS:= aCdCds;
--    aObbligScad.ESERCIZIO:= aEs;
--    aObbligScad.DT_SCADENZA:=aDataRegistrazione;
--    aObbligScad.DS_SCADENZA:= 'Annotazione di Spesa su Partita di Giro creata in automatico';
--    aObbligScad.IM_SCADENZA:=0;
--    aObbligScad.IM_ASSOCIATO_DOC_AMM:=0;
--    aObbligScad.IM_ASSOCIATO_DOC_CONTABILE:=0;
--    aObbligScad.DACR:=aTSNow;
--    aObbligScad.UTCR:=aUser;
--    aObbligScad.DUVA:=aTSNow;
--    aObbligScad.UTUV:=aUser;
--    aObbligScad.PG_VER_REC:=1;

   CNRCTB040.CREAACCERTAMENTOPGIROTRONC (false, aAccert, aAccertScad, aObblig, aObbligScad, null);

 end;



 procedure creaPraticaApIncFondo(
  aEs number,
  aCdCds varchar2,
  aCdUO varchar2,
  aCdFondo varchar2,
  aCdTerzo varchar2,
  aDescPratica varchar2,
  aImFondo number,
  aOperazione varchar2,
  aUser varchar2
 ) is
  aFondo fondo_economale%rowtype;
  aAnag anagrafico%rowtype;
  aCdTerzoEconomo number(8);
  aCdEV varchar2(20);
  aEV elemento_voce%rowtype;
  aGen documento_generico%rowtype;
  aGenRiga documento_generico_riga%rowtype;
  aObb obbligazione%rowtype;
  aObbScad obbligazione_scadenzario%rowtype;
  aAcc accertamento%rowtype;
  aAccScad accertamento_scadenzario%rowtype;
  aMan mandato%rowtype;
  aManRiga mandato_riga%rowtype;
  aAzione varchar2(10);
  aDescFondo varchar2(1000);
  aManRighe CNRCTB038.righeMandatoList;
  aListGenRighe CNRCTB100.docGenRigaList;
  aTSNow date;
 begin
  aTSNow:=sysdate;
  if
   aEs is null or
   aCdCds is null or
   aCdUO is null or
   aOperazione is null or
   aImFondo is null or
   aUser is null
  then
   IBMERR001.RAISE_ERR_GENERICO('Parametri non completamente specificati');
  end if;

  if
   aImFondo <= 0
  then
   IBMERR001.RAISE_ERR_GENERICO('L''importo della pratica non può essere negativo o nullo');
  end if;

  -- Controllo se l'esercizio aEs = a quello della data di sistema
  if to_number(to_char(aTSNow,'YYYY')) != aEs then
   IBMERR001.RAISE_ERR_GENERICO('L''esercizio '||aEs||' è di anno diverso da quello della data odierna');
  end if;
  -- Check su esercizio
  if
   not CNRCTB008.ISESERCIZIOAPERTO(aEs, aCdCds)
  then
   IBMERR001.RAISE_ERR_GENERICO('L''esercizio '||aEs||' non è aperto per il CDS '||aCdCds);
  end if;

  if aOperazione = 'A' then
   if aCdTerzo is null or aDescPratica is null then
    IBMERR001.RAISE_ERR_GENERICO('Terzo non specificato per generazione pratica finanziaria di apertura fondo');
   end if;
   aAzione:='apertura';
  elsif aOperazione = 'I' then
   if aCdFondo is null then
    IBMERR001.RAISE_ERR_GENERICO('Codice fondo non specificato per generazione pratica finanziaria di incremento fondo');
   end if;
   aAzione:='incremento';
  else
   IBMERR001.RAISE_ERR_GENERICO('Azione non correttamente specificata: A->apertura I->Incremento');
  end if;

  if aOperazione = 'I' then
   aDescFondo:='Fondo es:'||aEs||' uo:'||aCdUO||' cds:'||aCdCds||' cod.:'||aCdFondo;
   begin
    select * into aFondo from fondo_economale where
          esercizio=aEs
  	  and cd_unita_organizzativa=aCdUO
 	  and cd_cds=aCdCds
 	  and cd_codice_fondo = aCdFondo
    for update nowait;
   exception when NO_DATA_FOUND then
    IBMERR001.RAISE_ERR_GENERICO('Fondo economale non trovato '||aDescFondo);
   end;
  else
   aDescFondo:=aDescPratica;
   aFondo.esercizio:=aEs;
   aFondo.cd_cds:=aCdCds;
   aFondo.cd_unita_organizzativa:=aCdUO;
   aFondo.cd_terzo:=aCdTerzo;
   CNRCTB080.GETMODPAGULTIME(aCdTerzo,aFondo.cd_modalita_pag,aFondo.pg_banca,CNRCTB080.TI_PAGAMENTO_BANCARIO);
  end if;

  aAnag:=CNRCTB080.GETANAG(aFondo.cd_terzo);

  aCdEv:=CNRCTB015.GETVAL01PERCHIAVE(aFondo.esercizio,ELEMENTO_VOCE_SPECIALE,VOCE_APERTURA_FONDO_ECO);
  begin
  	 select * into aEV from elemento_voce where
 	      esercizio = aFondo.esercizio
 	  and ti_appartenenza = CNRCTB001.APPARTENENZA_CDS
 	  and ti_gestione = CNRCTB001.GESTIONE_SPESE
 	  and cd_elemento_voce = aCdEV
 	  and fl_partita_giro='Y';
  exception when NO_DATA_FOUND then
   IBMERR001.RAISE_ERR_GENERICO('Conto su partita di giro per apertura fondo economale non trovato: '||aCdEV);
  end;
  aObb:=null;
  aObbScad:=null;
  aAcc:=null;
  aAccScad:=null;
  aObb.CD_CDS:=aFondo.cd_cds;
  aObb.ESERCIZIO:=aFondo.esercizio;
  aObb.ESERCIZIO_ORIGINALE:=aFondo.esercizio;
  aObb.CD_TIPO_DOCUMENTO_CONT:=CNRCTB018.TI_DOC_OBB_PGIRO;
  aObb.CD_UNITA_ORGANIZZATIVA:=aFondo.cd_unita_organizzativa;
  aObb.CD_CDS_ORIGINE:=aFondo.cd_cds;
  aObb.CD_UO_ORIGINE:=aFondo.cd_unita_organizzativa;
  aObb.TI_APPARTENENZA:=aEV.ti_appartenenza;
  aObb.TI_GESTIONE:=aEV.ti_gestione;
  aObb.CD_ELEMENTO_VOCE:=aEV.cd_elemento_voce;
  aObb.DT_REGISTRAZIONE:=TRUNC(trunc(aTSNow));
  aObb.DS_OBBLIGAZIONE:='Documento per '||aAzione||' fondo economale. '||aDescFondo;
  aObb.NOTE_OBBLIGAZIONE:='';
  aObb.CD_TERZO:=aFondo.cd_terzo;
  aObb.IM_OBBLIGAZIONE:=abs(aImFondo);
  aObb.stato_obbligazione:=CNRCTB035.STATO_DEFINITIVO;
  aObb.im_costi_anticipati:=0;
  aObb.fl_calcolo_automatico:='N';
  aObb.fl_spese_costi_altrui:='N';
  aObb.FL_PGIRO:='Y';
  aObb.RIPORTATO:='N';
  aObb.DACR:=aTSNow;
  aObb.UTCR:=aUser;
  aObb.DUVA:=aTSNow;
  aObb.UTUV:=aUser;
  aObb.PG_VER_REC:=1;
  aObb.ESERCIZIO_COMPETENZA:=aFondo.esercizio;
  CNRCTB030.CREAOBBLIGAZIONEPGIROTRONC(false,aObb,aObbScad,aAcc,aAccScad,trunc(aTSNow));
  -- Creo il documento generico di spesa su partita di giro per apertura fondo economale
  aGen:=null;
  aGenRiga:=null;
  aGen.CD_TIPO_DOCUMENTO_AMM:=CNRCTB100.TI_GEN_APERTURA_FONDO;
  aGen.CD_CDS:=aObb.cd_cds;
  aGen.CD_UNITA_ORGANIZZATIVA:=aObb.cd_unita_organizzativa;
  aGen.ESERCIZIO:=aObb.esercizio;
  aGen.CD_CDS_ORIGINE:=aObb.cd_cds;
  aGen.CD_UO_ORIGINE:=aObb.cd_unita_organizzativa;
  aGen.IM_TOTALE:=aObb.im_obbligazione;
  aGen.DATA_REGISTRAZIONE:=TRUNC(trunc(aTSNow));
  aGen.DT_DA_COMPETENZA_COGE:=trunc(aTSNow);
  aGen.DT_A_COMPETENZA_COGE:=trunc(aTSNow);
  aGen.DS_DOCUMENTO_GENERICO:='Generico per '||aAzione||' fondo economale. '||aDescFondo;
  aGen.TI_ISTITUZ_COMMERC:=CNRCTB100.TI_ISTITUZIONALE;
  aGen.STATO_COFI:=CNRCTB100.STATO_GEN_COFI_TOT_MR;
  aGen.STATO_COGE:=CNRCTB100.STATO_COEP_EXC;
  aGen.STATO_COAN:=CNRCTB100.STATO_COEP_EXC;
  aGen.CD_DIVISA:='EURO';
  aGen.CAMBIO:=1;
  aGen.DACR:=aTSNow;
  aGen.UTCR:=aUser;
  aGen.DUVA:=aTSNow;
  aGen.UTUV:=aUser;
  aGen.PG_VER_REC:=1;
  aGen.DT_SCADENZA:=null; -- TRUNC(aTSNow);
  aGen.STATO_PAGAMENTO_FONDO_ECO:=CNRCTB100.STATO_NO_PFONDOECO;
  aGen.TI_ASSOCIATO_MANREV:=CNRCTB100.TI_ASSOC_TOT_MAN_REV;
  aGenRiga.CD_CDS:=aGen.CD_CDS;
  aGenRiga.CD_UNITA_ORGANIZZATIVA:=aGen.CD_UNITA_ORGANIZZATIVA;
  aGenRiga.ESERCIZIO:=aGen.ESERCIZIO;
  aGenRiga.CD_TIPO_DOCUMENTO_AMM:=aGen.CD_TIPO_DOCUMENTO_AMM;
  aGenRiga.DS_RIGA:=aGen.DS_DOCUMENTO_GENERICO;
  aGenRiga.IM_RIGA_DIVISA:=aGen.IM_TOTALE;
  aGenRiga.IM_RIGA:=aGen.IM_TOTALE;
  aGenRiga.RAGIONE_SOCIALE:=aAnag.RAGIONE_SOCIALE;
  aGenRiga.NOME:=aAnag.NOME;
  aGenRiga.COGNOME:=aAnag.COGNOME;
  aGenRiga.CODICE_FISCALE:=aAnag.CODICE_FISCALE;
  aGenRiga.PARTITA_IVA:=aAnag.PARTITA_IVA;
  aGenRiga.DT_DA_COMPETENZA_COGE:=trunc(aTSNow);
  aGenRiga.DT_A_COMPETENZA_COGE:=trunc(aTSNow);
  aGenRiga.STATO_COFI:=aGen.STATO_COFI;
 --   aGenRiga.DT_CANCELLAZIONE:=;
 --   aGenRiga.CD_TERZO_CESSIONARIO:=;
 --   aGenRiga.CD_TERMINI_PAG:=;
 --   aGenRiga.CD_TERMINI_PAG_UO_CDS:=;
 --   aGenRiga.NOTE:=;
 --   aGen.ESERCIZIO_LETTERA:=;
 --   aGen.PG_LETTERA:=;
  aGenRiga.CD_TERZO:=aFondo.cd_terzo;
  aGenRiga.CD_MODALITA_PAG:=aFondo.cd_modalita_pag;
  aGenRiga.PG_BANCA:=aFondo.pg_banca;
  aGenRiga.CD_CDS_OBBLIGAZIONE:=aObb.CD_CDS;
  aGenRiga.ESERCIZIO_OBBLIGAZIONE:=aObb.ESERCIZIO;
  aGenRiga.ESERCIZIO_ORI_OBBLIGAZIONE:=aObb.ESERCIZIO_ORIGINALE;
  aGenRiga.PG_OBBLIGAZIONE:=aObb.PG_OBBLIGAZIONE;
  aGenRiga.PG_OBBLIGAZIONE_SCADENZARIO:=aObbScad.PG_OBBLIGAZIONE_SCADENZARIO;
  aGenRiga.DACR:=aGen.DACR;
  aGenRiga.UTCR:=aGen.UTCR;
  aGenRiga.UTUV:=aGen.UTUV;
  aGenRiga.DUVA:=aGen.DUVA;
  aGenRiga.PG_VER_REC:=aGen.PG_VER_REC;
  aGenRiga.TI_ASSOCIATO_MANREV:=aGen.TI_ASSOCIATO_MANREV;
  aListGenRighe(1):=aGenRiga;
  CNRCTB110.CREAGENERICO(aGen,aListGenRighe);
  -- Creazione del mandato
  aMan:=null;
  aManRiga:=null;
  aMan.CD_CDS:=aObb.cd_cds;
  aMan.ESERCIZIO:=aObb.esercizio;
  aMan.CD_UNITA_ORGANIZZATIVA:=aObb.cd_unita_organizzativa;
  aMan.CD_CDS_ORIGINE:=aObb.cd_cds;
  aMan.CD_UO_ORIGINE:=aObb.cd_unita_organizzativa;
  aMan.CD_TIPO_DOCUMENTO_CONT:=CNRCTB018.TI_DOC_MAN;
  aMan.TI_MANDATO:=CNRCTB038.TI_MAN_PAG;
  aMan.TI_COMPETENZA_RESIDUO:=CNRCTB038.TI_MAN_COMP;
  aMan.DS_MANDATO:='Mandato di '||aAzione||' fondo economale. '||aDescFondo;
  aMan.STATO:=CNRCTB038.STATO_AUT_EME;
  aMan.DT_EMISSIONE:=TRUNC(aTSNow);
 --   aMan.DT_TRASMISSIONE:=;
 --   aMan.DT_INCASSO:=;
 --   aMan.DT_ANNULLAMENTO:=;
  aMan.IM_MANDATO:=aObb.im_obbligazione;
  aMan.IM_RITENUTE:=0;
  aMan.IM_PAGATO:=0;
 -- Massimo Iaccarino Fine
  aMan.DACR:=aTSNow;
  aMan.UTCR:=aUser;
  aMan.DUVA:=aTSNow;
  aMan.UTUV:=aUser;
  aMan.PG_VER_REC:=1;
  aMan.STATO_TRASMISSIONE:=CNRCTB038.STATO_AUT_TRASCAS_NODIST;
  aManRiga.CD_CDS:=aMan.cd_cds;
  aManRiga.ESERCIZIO:=aMan.esercizio;
  aManRiga.ESERCIZIO_OBBLIGAZIONE:=aObb.esercizio;
  aManRiga.ESERCIZIO_ORI_OBBLIGAZIONE:=aObb.esercizio_originale;
  aManRiga.PG_OBBLIGAZIONE:=aObb.pg_obbligazione;
  aManRiga.PG_OBBLIGAZIONE_SCADENZARIO:=aObbScad.pg_obbligazione_scadenzario;
  aManRiga.CD_CDS_DOC_AMM:=aGen.cd_cds;
  aManRiga.CD_UO_DOC_AMM:=aGen.cd_unita_organizzativa;
  aManRiga.ESERCIZIO_DOC_AMM:=aGen.esercizio;
  aManRiga.CD_TIPO_DOCUMENTO_AMM:=aGen.cd_tipo_documento_amm;
  aManRiga.PG_DOC_AMM:=aGen.pg_documento_generico;
  aManRiga.DS_MANDATO_RIGA:=aMan.ds_mandato;
  aManRiga.STATO:=aMan.STATO;
  aManRiga.CD_TERZO:=aGenRiga.cd_terzo;
 --   aManRiga.CD_TERZO_UO:=0;
  aManRiga.PG_BANCA:=aGenRiga.PG_BANCA;
  aManRiga.CD_MODALITA_PAG:=aGenRiga.CD_MODALITA_PAG;
  aManRiga.IM_MANDATO_RIGA:=aMan.im_mandato;
  aManRiga.IM_RITENUTE_RIGA:=0;
  aManRiga.FL_PGIRO:='Y';
  aManRiga.UTCR:=aUser;
  aManRiga.DACR:=aTSNow;
  aManRiga.UTUV:=aUser;
  aManRiga.DUVA:=aTSNow;
  aManRiga.PG_VER_REC:=1;
  aManRighe(1):=aManRiga;
  -- Aggiornamento saldi scadenza obbligazione
  update obbligazione_scadenzario set
      im_associato_doc_amm = im_associato_doc_amm + aGen.im_totale,
      duva=aTSNow,
      utuv=aUser,
  	pg_ver_rec = pg_ver_rec+1
  where
          cd_cds = aObbScad.cd_cds
  	and esercizio = aObbScad.esercizio
  	and esercizio_originale = aObbScad.esercizio_originale
  	and pg_obbligazione= aObbScad.pg_obbligazione
  	and pg_obbligazione_scadenzario = aObbScad.pg_obbligazione_scadenzario;
  CNRCTB037.GENERADOCUMENTO(
    aMan,
    aManRighe);
 end;

 procedure creaPraticaAperturaFondo(
  aEs number,
  aCdCds varchar2,
  aCdUO varchar2,
  aCdTerzo varchar2,
  aDescPratica varchar2,
  aImFondo number,
  aUser varchar2
 ) is
 begin
  creaPraticaApIncFondo(
   aEs,
   aCdCds,
   aCdUO,
   null,
   aCdTerzo,
   aDescPratica,
   aImFondo,
   'A',
   aUser
  );
 end;

 procedure creaPraticaIntegrazioneFondo(
  aEs number,
  aCdCds varchar2,
  aCdUO varchar2,
  aCdFondo varchar2,
  aImFondo number,
  aUser varchar2
 ) is
 begin
  creaPraticaApIncFondo(
   aEs,
   aCdCds,
   aCdUO,
   aCdFondo,
   null,
   null,
   aImFondo,
   'I',
   aUser
  );
 end;

END;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy