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

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

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

  CREATE OR REPLACE PACKAGE BODY "CNRCTB046" is

  Function getElementoVoceNew (aEvOld elemento_voce%rowtype)
  Return elemento_voce%rowtype Is
    recElementoVoceNew elemento_voce%rowtype;
  Begin
    Begin
      Select elemento_voce.* into recElementoVoceNew
      From   ass_evold_evnew, elemento_voce
      Where  ass_evold_evnew.esercizio_old = aEvOld.ESERCIZIO
      And    ass_evold_evnew.ti_appartenenza_old = aEvOld.TI_APPARTENENZA
      And    ass_evold_evnew.ti_gestione_old = aEvOld.TI_GESTIONE
      And    ass_evold_evnew.cd_elemento_voce_old = aEvOld.CD_ELEMENTO_VOCE
      aND    ass_evold_evnew.esercizio_new = elemento_voce.ESERCIZIO
      And    ass_evold_evnew.ti_appartenenza_new = elemento_voce.TI_APPARTENENZA
      And    ass_evold_evnew.ti_gestione_new = elemento_voce.TI_GESTIONE
      And    ass_evold_evnew.cd_elemento_voce_new = elemento_voce.CD_ELEMENTO_VOCE;
    Exception
      When no_data_found Then
        null;
      When too_many_rows Then
        ibmerr001.RAISE_ERR_GENERICO('Esistono più voci associate alla voce '||aEvOld.CD_ELEMENTO_VOCE||', appartenenza '||aEvOld.TI_APPARTENENZA||', gestione '||aEvOld.TI_GESTIONE||', esercizio '||aEvOld.ESERCIZIO||' indicata sull''impegno. Impossibile individuare la voce su cui ribaltare.');
    End;
    return recElementoVoceNew;
  End;

  Function getElementoVoceNew (aObb obbligazione%rowtype)
  Return elemento_voce%rowtype Is
    recElementoVoceNew elemento_voce%rowtype;
  Begin
    Begin
      Select elemento_voce.* into recElementoVoceNew
      From   ass_evold_evnew, elemento_voce
      Where  ass_evold_evnew.esercizio_old = aObb.ESERCIZIO
      And    ass_evold_evnew.ti_appartenenza_old = aObb.TI_APPARTENENZA
      And    ass_evold_evnew.ti_gestione_old = aObb.TI_GESTIONE
      And    ass_evold_evnew.cd_elemento_voce_old = aObb.CD_ELEMENTO_VOCE
      aND    ass_evold_evnew.esercizio_new = elemento_voce.ESERCIZIO
      And    ass_evold_evnew.ti_appartenenza_new = elemento_voce.TI_APPARTENENZA
      And    ass_evold_evnew.ti_gestione_new = elemento_voce.TI_GESTIONE
      And    ass_evold_evnew.cd_elemento_voce_new = elemento_voce.CD_ELEMENTO_VOCE;
    Exception
      When no_data_found Then
        null;
      When too_many_rows Then
        ibmerr001.RAISE_ERR_GENERICO('Esistono più voci associate alla voce '||aObb.CD_ELEMENTO_VOCE||', appartenenza '||aObb.TI_APPARTENENZA||', gestione '||aObb.TI_GESTIONE||', esercizio '||aObb.ESERCIZIO||' indicata sull''impegno. Impossibile individuare la voce su cui ribaltare.');
    End;

    If recElementoVoceNew.esercizio is null Then
      If aObb.ESERCIZIO_EV_NEXT is not null and aObb.TI_APPARTENENZA_EV_NEXT is not null and
        aObb.TI_GESTIONE_EV_NEXT is not null and aObb.CD_ELEMENTO_VOCE_NEXT is not null Then
        Begin
          Select * into recElementoVoceNew
          From   elemento_voce
          Where  esercizio = aObb.ESERCIZIO_EV_NEXT
          And    ti_appartenenza = aObb.TI_APPARTENENZA_EV_NEXT
          And    ti_gestione = aObb.TI_GESTIONE_EV_NEXT
          And    cd_elemento_voce = aObb.CD_ELEMENTO_VOCE_NEXT;
        Exception
          When no_data_found Then
            ibmerr001.RAISE_ERR_GENERICO('Elemento voce '||aObb.CD_ELEMENTO_VOCE_NEXT||', appartenenza '||aObb.TI_APPARTENENZA_EV_NEXT||', gestione '||aObb.TI_GESTIONE_EV_NEXT||', esercizio '||aObb.ESERCIZIO_EV_NEXT||' indicato sull''impegno inesistente. Impossibile ribaltare.');
        End;
      Else
        Begin
          Select elemento_voce.* into recElementoVoceNew
          From   elemento_voce
          Where  elemento_voce.ESERCIZIO = aObb.ESERCIZIO + 1
          And    elemento_voce.TI_APPARTENENZA = aObb.TI_APPARTENENZA
          And    elemento_voce.TI_GESTIONE = aObb.TI_GESTIONE
          And    elemento_voce.CD_ELEMENTO_VOCE = aObb.CD_ELEMENTO_VOCE;
        Exception
          When no_data_found Then
            ibmerr001.RAISE_ERR_GENERICO('Elemento voce '||aObb.CD_ELEMENTO_VOCE||', appartenenza '||aObb.TI_APPARTENENZA||', gestione '||aObb.TI_GESTIONE||' non presente nell''esercizio '||to_char(aObb.ESERCIZIO+1)||'. Impossibile ribaltare.');
        End;
      End If;
    End If;
    return recElementoVoceNew;
  End;

  Function getElementoVoceNew (aAcc accertamento%rowtype)
  Return elemento_voce%rowtype Is
    recElementoVoceNew elemento_voce%rowtype;
  Begin
    Begin
      Select elemento_voce.* into recElementoVoceNew
      From   ass_evold_evnew, elemento_voce
      Where  ass_evold_evnew.esercizio_old = aAcc.ESERCIZIO
      And    ass_evold_evnew.ti_appartenenza_old = aAcc.TI_APPARTENENZA
      And    ass_evold_evnew.ti_gestione_old = aAcc.TI_GESTIONE
      And    ass_evold_evnew.cd_elemento_voce_old = aAcc.CD_ELEMENTO_VOCE
      And    ass_evold_evnew.esercizio_new = elemento_voce.ESERCIZIO
      And    ass_evold_evnew.ti_appartenenza_new = elemento_voce.TI_APPARTENENZA
      And    ass_evold_evnew.ti_gestione_new = elemento_voce.TI_GESTIONE
      And    ass_evold_evnew.cd_elemento_voce_new = elemento_voce.CD_ELEMENTO_VOCE;
    Exception
      When no_data_found Then
        null;
      When too_many_rows Then
        ibmerr001.RAISE_ERR_GENERICO('Esistono più voci associate alla voce '||aAcc.CD_ELEMENTO_VOCE||', appartenenza '||aAcc.TI_APPARTENENZA||', gestione '||aAcc.TI_GESTIONE||', esercizio '||aAcc.ESERCIZIO||' indicata sull''accertamento. Impossibile individuare la voce su cui ribaltare.');
    End;

    If recElementoVoceNew.esercizio is null Then
      If aAcc.ESERCIZIO_EV_NEXT is not null and aAcc.TI_APPARTENENZA_EV_NEXT is not null and
        aAcc.TI_GESTIONE_EV_NEXT is not null and aAcc.CD_ELEMENTO_VOCE_NEXT is not null Then
        Begin
          Select * into recElementoVoceNew
          From   elemento_voce
          Where  esercizio = aAcc.ESERCIZIO_EV_NEXT
          And    ti_appartenenza = aAcc.TI_APPARTENENZA_EV_NEXT
          And    ti_gestione = aAcc.TI_GESTIONE_EV_NEXT
          And    cd_elemento_voce = aAcc.CD_ELEMENTO_VOCE_NEXT;
        Exception
          When no_data_found Then
            ibmerr001.RAISE_ERR_GENERICO('Elemento voce '||aAcc.CD_ELEMENTO_VOCE_NEXT||', appartenenza '||aAcc.TI_APPARTENENZA_EV_NEXT||', gestione '||aAcc.TI_GESTIONE_EV_NEXT||', esercizio '||aAcc.ESERCIZIO_EV_NEXT||' indicato sull''accertamento inesistente. Impossibile ribaltare.');
        End;
      Else
        Begin
          Select elemento_voce.* into recElementoVoceNew
          From   elemento_voce
          Where  elemento_voce.ESERCIZIO = aAcc.ESERCIZIO + 1
          And    elemento_voce.TI_APPARTENENZA = aAcc.TI_APPARTENENZA
          And    elemento_voce.TI_GESTIONE = aAcc.TI_GESTIONE
          And    elemento_voce.CD_ELEMENTO_VOCE = aAcc.CD_ELEMENTO_VOCE;
        Exception
          When no_data_found Then
            ibmerr001.RAISE_ERR_GENERICO('Elemento voce '||aAcc.CD_ELEMENTO_VOCE||', appartenenza '||aAcc.TI_APPARTENENZA||', gestione '||aAcc.TI_GESTIONE||' non presente nell''esercizio '||to_char(aAcc.ESERCIZIO+1)||'. Impossibile ribaltare.');
        End;
      End If;
    End If;
    return recElementoVoceNew;
 End;

 Function GET_ESERCIZIO_ORIGINALE (aCds varchar2,
                                   aEs number,
                                   aEsOri number,
                                   aPg number,
                                   aTiGestione VARCHAR2) Return NUMBER Is
 tipo         obbligazione.CD_TIPO_DOCUMENTO_CONT%Type;
 anno_origine obbligazione.esercizio_originale%Type;

 Begin
  If aTiGestione = 'S' Then
    Select CD_TIPO_DOCUMENTO_CONT, esercizio_originale
    Into   tipo, anno_origine
    From   obbligazione
    Where  cd_cds = aCds And
           esercizio = aEs  And
           esercizio_originale = aEsOri  And
           pg_obbligazione = aPg;
    If tipo In (cnrctb018.TI_DOC_OBB, cnrctb018.TI_DOC_IMP, cnrctb018.TI_DOC_OBB_PGIRO) Then
      Return aEs;
    Elsif tipo In (cnrctb018.TI_DOC_OBB_RES_PRO, cnrctb018.TI_DOC_OBB_RES_IMPRO,
                   cnrctb018.TI_DOC_IMP_RES) Then
      Return anno_origine;
    End If;

  Elsif aTiGestione = 'E' Then

    Select CD_TIPO_DOCUMENTO_CONT, esercizio_originale
    Into   tipo, anno_origine
    From   accertamento
    Where  cd_cds = aCds And
           esercizio = aEs  And
           esercizio_originale = aEsOri  And
           pg_accertamento = aPg;
    If tipo In (cnrctb018.TI_DOC_ACC, cnrctb018.TI_DOC_ACC_PGIRO, cnrctb018.TI_DOC_ACC_SIST) Then
      Return aEs;
    Elsif tipo In (cnrctb018.TI_DOC_ACC_RES) Then
      Return anno_origine;
    End If;
  End If;
 End;

 procedure aggiornaConnPgiroCds(aAcc accertamento%rowtype,aAccNew accertamento%rowtype) is
 begin
-- IBMERR001.RAISE_ERR_GENERICO('metto '||aAcc.pg_accertamento||' su '||aAccNew.cd_cds||'/'||aAccNew.esercizio||'/'||aAccNew.pg_accertamento);
  Update accertamento
  Set    cd_cds_ori_riporto = aAcc.cd_cds,
         esercizio_ori_riporto = aAcc.esercizio,
         esercizio_ori_ori_riporto=aAcc.esercizio_originale,
         pg_accertamento_ori_riporto = aAcc.pg_accertamento,
         pg_ver_rec = pg_ver_rec + 1
  Where  cd_cds=aAccNew.cd_cds
     and esercizio=aAccNew.esercizio
     and esercizio_originale=aAccNew.esercizio_originale
     and pg_accertamento=aAccNew.pg_accertamento;

  update accertamento_scadenzario set
   pg_acc_scad_ori_riporto = 1,
   pg_ver_rec = pg_ver_rec + 1
  where cd_cds = aAccNew.cd_cds
    and esercizio = aAccNew.esercizio
    and esercizio_originale=aAccNew.esercizio_originale
    and pg_accertamento = aAccNew.pg_accertamento
    and pg_accertamento_scadenzario = 1;

  update accertamento set
   riportato = 'Y',
   pg_ver_rec=pg_ver_rec+1
  where
       cd_cds=aAcc.cd_cds
   and esercizio=aAcc.esercizio
   and esercizio_originale=aAcc.esercizio_originale
   and pg_accertamento=aAcc.pg_accertamento;
 end;

 procedure aggiornaConnPgiroCds(aObb obbligazione%rowtype,aObbNew obbligazione%rowtype) is
 begin

  update obbligazione set
   cd_cds_ori_riporto=aObb.cd_cds,
   esercizio_ori_riporto=aObb.esercizio,
   esercizio_ori_ori_riporto=aObb.esercizio_originale,
   pg_obbligazione_ori_riporto=aObb.pg_obbligazione,
   pg_ver_rec = pg_ver_rec + 1
  where
        cd_cds=aObbNew.cd_cds
    and esercizio=aObbNew.esercizio
    and esercizio_originale=aObbNew.esercizio_originale
    and pg_obbligazione=aObbNew.pg_obbligazione;

  update obbligazione_scadenzario set
   pg_obbl_scad_ori_riporto = 1,
   pg_ver_rec = pg_ver_rec +1
  where cd_cds = aObbNew.cd_cds
    and esercizio = aObbNew.esercizio
    And esercizio_originale=aObbNew.esercizio_originale
	and pg_obbligazione = aObbNew.pg_obbligazione
	and pg_obbligazione_scadenzario = 1;

  update obbligazione set
    riportato = 'Y',
    pg_ver_rec=pg_ver_rec+1
  where
        cd_cds=aObb.cd_cds
    and esercizio=aObb.esercizio
    and esercizio_originale=aObb.esercizio_originale
    and pg_obbligazione=aObb.pg_obbligazione;
 end;


 procedure ripPgiroCdsInt(
  aAcc IN OUT accertamento%rowtype,
  aAccNew IN OUT accertamento%rowtype,
  aElementoVoce elemento_voce%rowtype,
  aTSNow date,
  aUser varchar2
 ) is
  aObb obbligazione%rowtype;
  aObbScad obbligazione_scadenzario%rowtype;
  aObbScadVoce obbligazione_scad_voce%rowtype;
  aAccScad accertamento_scadenzario%rowtype;
  aAccScadVoce accertamento_scad_voce%rowtype;
  aObbNew obbligazione%rowtype;
  aObbScadNew obbligazione_scadenzario%rowtype;
  aAccScadNew accertamento_scadenzario%rowtype;
  aVoceF voce_f%rowtype;
  aImRiscontrato number;

 begin
  CNRCTB048.checkEsercizio(aAcc.esercizio, aAcc.cd_cds);
  CNRCTB035.getPgiroCds(aAcc,aAccScad,aAccScadVoce,aObb,aObbScad,aObbScadVoce);

  aAccNew       :=aAcc;
  aAccScadNew   :=aAccScad;

  aAccNew.esercizio     :=aAcc.esercizio + 1;
  aAccNew.esercizio_competenza := aAccNew.esercizio;
  aAccNew.dt_registrazione := to_date('0101'||aAccNew.esercizio,'DDMMYYYY');

  /* 05.01.2006 stani */
  aAccNew.esercizio_originale    := aAcc.esercizio_originale;
  aAccNew.CD_TIPO_DOCUMENTO_CONT := cnrctb018.TI_DOC_ACC_PGIRO_RES; -- part giro res

  if aElementoVoce.esercizio is not null then
  -- cambio imputazione finanziaria
	  begin
	  	select * into aVoceF
		from voce_f
		where esercizio 		 = aAcc.esercizio + 1
		  and ti_appartenenza 	 = aElementoVoce.ti_appartenenza
		  and ti_gestione	  	 = aElementoVoce.ti_gestione
		  and cd_titolo_capitolo = aElementoVoce.cd_elemento_voce;
	  exception when NO_DATA_FOUND then
			ibmerr001.RAISE_ERR_GENERICO('Capitolo finanziario non trovato in corrispondenza dell''elemento voce '||aElementoVoce.cd_elemento_voce||', appartenenza '||aElementoVoce.ti_appartenenza||'gestione '||aElementoVoce.ti_gestione||', esercizio '||aAcc.esercizio + 1||', impossibile ribaltare');
	  end;
	  aAccNew.TI_APPARTENENZA		  	  :=aElementoVoce.TI_APPARTENENZA;
	  aAccNew.TI_GESTIONE			  	  :=aElementoVoce.TI_GESTIONE;
	  aAccNew.CD_ELEMENTO_VOCE		  	  :=aElementoVoce.CD_ELEMENTO_VOCE;
	  aAccNew.CD_VOCE				  	  :=aVoceF.cd_voce;
  end if;
  aAccNew.dacr := aTSNow;
  aAccNew.utcr := aUser;
  aAccScadNew.esercizio:=aAccNew.esercizio;
  -- partita di giro tronca se tronca in origine o se contropartita riscontrata
  aImRiscontrato := getIm_riscontrato(aObb.esercizio,aObb.cd_cds,aObb.esercizio_originale,aObb.pg_obbligazione,aObb.ti_gestione);

  if (aObb.dt_cancellazione is null and aImRiscontrato = 0) then

   CNRCTB040.creaAccertamentoPgiro(false,aAccNew,aAccScadNew,aObbNew,aObbScadNew,CNRCTB048.GETDTSCADENZA(aAccNew.esercizio,aAccScad.dt_scadenza_incasso));

   if aObbScad.im_associato_doc_amm > 0 then
	 update obbligazione_scadenzario
	 set im_associato_doc_amm = aObbScad.im_associato_doc_amm,
	 	 pg_ver_rec = pg_ver_rec + 1
	 where cd_cds = aObbScadNew.cd_cds
	   and esercizio = aObbscadNew.esercizio
	   and esercizio_originale = aObbscadNew.esercizio_originale
	   and pg_obbligazione = aObbScadNew.pg_obbligazione
	   and pg_obbligazione_scadenzario = aObbScadNew.pg_obbligazione_scadenzario;
     CNRCTB048.aggiornaDocAmm(aObbScad,aObbScadNew,aUser,aTSNow);
   end if;

  else

   CNRCTB040.creaAccertamentoPgiroTronc(false,aAccNew,aAccScadNew,aObbNew,aObbScadNew,CNRCTB048.GETDTSCADENZA(aAccNew.esercizio,aAccScad.dt_scadenza_incasso));

  end if;

  aggiornaConnPgiroCds(aAcc,aAccNew);
  -- 15.05.2006 stani: anche le ribaltate tronche devono riportare nel documento a zero la chiave dell'originale
  aggiornaConnPgiroCds(aObb,aObbNew);

  if aImriscontrato = 0 then -- escludo pgiro normali ricreate tronche
  	 aggiornaConnPgiroCds(aObb,aObbNew);
  end if;

  if aAccScad.im_associato_doc_amm > 0 then
	update accertamento_scadenzario
	set im_associato_doc_amm = aAccScad.im_associato_doc_amm,
	    pg_ver_rec = pg_ver_rec + 1
	where cd_cds = aAccScadNew.cd_cds
	  and esercizio = aAccScadNew.esercizio
	  and esercizio_originale = aAccScadNew.esercizio_originale
	  and pg_accertamento = aAccScadNew.pg_accertamento
	  and pg_accertamento_scadenzario = aAccScadNew.pg_accertamento_scadenzario;
    CNRCTB048.aggiornaDocAmm(aAccScad,aAccScadNew,aUser,aTSNow);
  end if;
 end;

 procedure ripPgiroCdsInt(
  aObb IN OUT obbligazione%rowtype,
  aAccNew IN OUT accertamento%rowtype,
  aElementoVoce elemento_voce%rowtype,
  aTSNow date,
  aUser varchar2
 ) is
  aObbScad obbligazione_scadenzario%rowtype;
  aObbScadVoce obbligazione_scad_voce%rowtype;
  aAcc accertamento%rowtype;
  aAccScad accertamento_scadenzario%rowtype;
  aAccScadVoce accertamento_scad_voce%rowtype;
  aObbNew obbligazione%rowtype;
  aObbScadNew obbligazione_scadenzario%rowtype;
  aAccScadNew accertamento_scadenzario%rowtype;
  aVoceF voce_f%rowtype;
 begin
  CNRCTB048.checkEsercizio(aObb.esercizio,aObb.cd_cds);
  CNRCTB035.getPgiroCds(aObb,aObbScad,aObbScadVoce,aAcc,aAccScad,aAccScadVoce);
  aAccNew:=aAcc;
  aAccScadNew:=aAccScad;
  aAccNew.esercizio:=aAcc.esercizio+1;
  aAccNew.esercizio_competenza := aAccNew.esercizio;
  aAccNew.dt_registrazione := to_date('0101'||aAccNew.esercizio,'DDMMYYYY');

  /* 05.01.2006 stani */
  aAccNew.esercizio_originale    := aAcc.esercizio_originale;
  aAccNew.CD_TIPO_DOCUMENTO_CONT := cnrctb018.TI_DOC_ACC_PGIRO_RES; -- part giro res

  if aElementoVoce.esercizio is not null then
  -- cambio imputazione finanziaria
	  begin
	  	select * into aVoceF
		from voce_f
		where esercizio 		 = aAcc.esercizio + 1
		  and ti_appartenenza 	 = aElementoVoce.ti_appartenenza
		  and ti_gestione	  	 = aElementoVoce.ti_gestione
		  and cd_titolo_capitolo = aElementoVoce.cd_elemento_voce;
	  exception when NO_DATA_FOUND then
			ibmerr001.RAISE_ERR_GENERICO('Capitolo finanziario non trovato in corrispondenza dell''elemento voce '||aElementoVoce.cd_elemento_voce||', appartenenza '||aElementoVoce.ti_appartenenza||'gestione '||aElementoVoce.ti_gestione||', esercizio '||aAcc.esercizio + 1||', impossibile ribaltare');
	  end;
	  aAccNew.TI_APPARTENENZA		  	  :=aElementoVoce.TI_APPARTENENZA;
	  aAccNew.TI_GESTIONE			  	  :=aElementoVoce.TI_GESTIONE;
	  aAccNew.CD_ELEMENTO_VOCE		  	  :=aElementoVoce.CD_ELEMENTO_VOCE;
	  aAccNew.CD_VOCE				  	  :=aVoceF.cd_voce;
  end if;
  aAccNew.dacr := aTSNow;
  aAccNew.utcr := aUser;
  aAccScadNew.esercizio:=aAccNew.esercizio;

-- IBMERR001.RAISE_ERR_GENERICO('stani ribaltamento 2');

  CNRCTB040.creaAccertamentoPgiroTronc(false,aAccNew,aAccScadNew,aObbNew,aObbScadNew,CNRCTB048.GETDTSCADENZA(aAccNew.esercizio,aAccScad.dt_scadenza_incasso));

  aggiornaConnPgiroCds(aAcc,aAccNew);
  -- 15.05.2006 stani: anche le ribaltate tronche devono riportare nel documento a zero la chiave dell'originale
  aggiornaConnPgiroCds(aObb,aObbNew);

--   if aObbScad.im_associato_doc_amm > 0 then
--     CNRCTB048.aggiornaDocAmm(aObbScad,aObbScadNew,aUser,aTSNow);
--   end if;
  if aAccScad.im_associato_doc_amm > 0 then
--	aAccScadNew.im_associato_doc_amm := aAccScad.im_associato_doc_amm;
	update accertamento_scadenzario
	set im_associato_doc_amm = aAccScad.im_associato_doc_amm,
	    pg_ver_rec = pg_ver_rec + 1
	where cd_cds = aAccScadNew.cd_cds
	  and esercizio = aAccScadNew.esercizio
	  and esercizio_originale = aAccScadNew.esercizio_originale
	  and pg_accertamento = aAccScadNew.pg_accertamento
	  and pg_accertamento_scadenzario = aAccScadNew.pg_accertamento_scadenzario;
    CNRCTB048.aggiornaDocAmm(aAccScad,aAccScadNew,aUser,aTSNow);
  end if;
 end;

Procedure ripPgiroCdsEntrambe(
  aObb            obbligazione%Rowtype,
  aObbScad        obbligazione_scadenzario%Rowtype,
  aObbScadVoce    obbligazione_scad_voce%Rowtype,
  aAcc            accertamento%Rowtype,
  aAccScad        accertamento_scadenzario%Rowtype,
  aAccScadVoce    accertamento_scad_voce%Rowtype,
  aElementoVoceE  elemento_voce%Rowtype,
  aElementoVoceS  elemento_voce%Rowtype,
  aTi_Origine     CHAR,
  aTSNow          DATE,
  aUser           VARCHAR2,
  aObbNew         Out obbligazione%Rowtype,
  aAccNew         Out accertamento%Rowtype) Is

aDettScadCObb        obbligazione_scad_voce%rowtype;
aDettScadCObbList    CNRCTB035.scadVoceListS;

--aObbNew              obbligazione%Rowtype;
--aAccNew              accertamento%Rowtype;

aObbScadNew          obbligazione_scadenzario%rowtype;
aAccScadNew          accertamento_scadenzario%rowtype;

aDettScadCAcc        accertamento_scad_voce%rowtype;
aDettScadCAccList    CNRCTB035.scadVoceListE;

aImRiscontratoEnt    NUMBER;
aImRiscontratoSpe    NUMBER;

aGAE_dedicata_CDS_E  linea_attivita%Rowtype;
aCdCdrE              VARCHAR2(30);
aCdLaE               VARCHAR2(10);

aGAE_dedicata_CDS_S  linea_attivita%Rowtype;
aCdCdrS              VARCHAR2(30);
aCdLaS               VARCHAR2(10);

aEVSPE               elemento_voce%Rowtype;
aVoceFSPE            voce_f%Rowtype;

aEVENT               elemento_voce%Rowtype;
aVoceFENT            voce_f%Rowtype;

aCDS                 unita_organizzativa%Rowtype;
aCDSOrigine          unita_organizzativa%Rowtype;

aAssDocPGiro         ass_obb_acr_pgiro%Rowtype;
evNewS               elemento_voce%rowtype;
evNewE               elemento_voce%rowtype;
recParametriCNR      PARAMETRI_CNR%Rowtype;
Begin
recParametriCNR := CNRUTL001.getRecParametriCnr(aObb.esercizio+1);
--------------------------------------------------------------------------------------------------------------
---------------------------------------     CONTROLLI  PRELIMINARI       -------------------------------------
--------------------------------------------------------------------------------------------------------------

-- PER LA SPESA

CNRCTB048.checkEsercizio(aObb.esercizio, aObb.cd_cds);

If aObb.fl_pgiro is null or aObb.fl_pgiro <> 'Y' then
   IBMERR001.RAISE_ERR_GENERICO('Impegno non su partita di giro.');
End if;

If aObb.cd_tipo_documento_cont Is Null Or
                aObb.cd_tipo_documento_cont Not In (CNRCTB018.TI_DOC_OBB_PGIRO, CNRCTB018.TI_DOC_OBB_PGIRO_RES) Then
   IBMERR001.RAISE_ERR_GENERICO('Non si tratta di un ribaltamento di Impegno per partita di giro.');
End if;

Begin
   Select * into aEVSpe
   From   elemento_voce
   Where  esercizio = aObb.esercizio And
          ti_gestione = aObb.ti_gestione And
          ti_appartenenza = aObb.ti_appartenenza And
          cd_elemento_voce = aObb.cd_elemento_voce And
          fl_partita_giro = 'Y';
Exception
  When NO_DATA_FOUND Then
        IBMERR001.RAISE_ERR_GENERICO('Voce del piano '||aObb.cd_elemento_voce||' non trovata o non di tipo "partita di giro".');
End;

If recParametriCNR.fl_nuovo_pdg='N' Then
  Begin
     Select * into aVoceFSPE
     From   voce_f
     Where  esercizio = aEVSpe.esercizio And
            ti_gestione = aEVSpe.ti_gestione And
            ti_appartenenza = aEVSpe.ti_appartenenza And
            cd_voce = aObb.cd_elemento_voce And
            fl_mastrino = 'Y';
  Exception
    When NO_DATA_FOUND Then
          IBMERR001.RAISE_ERR_GENERICO('Conto finanziario '||aObb.cd_elemento_voce||' non trovato.');
  End;

  -- verifico congruenza tra ti_appartenenza e tipo CDS

  aCDS := CNRCTB020.GETCDSVALIDO(aObb.esercizio, aObb.cd_cds);
  aCDSOrigine := CNRCTB020.GETCDSVALIDO(aObb.esercizio, aObb.cd_cds_origine);

  If aCDS.cd_tipo_unita = CNRCTB020.TIPO_ENTE and aEVSpe.ti_appartenenza = CNRCTB001.APPARTENENZA_CDS then
     IBMERR001.RAISE_ERR_GENERICO('La voce del piano specificata non è una voce del piano dell''ENTE.');
  End if;

  If aCDS.cd_tipo_unita <> CNRCTB020.TIPO_ENTE and aEVSpe.ti_appartenenza = CNRCTB001.APPARTENENZA_CNR then
     IBMERR001.RAISE_ERR_GENERICO('La voce del piano specificata non è una voce del piano di CDS.');
  End if;
End If;

-- 22.12.2008 eliminato controllo per anomalia su ribaltamenti

--If aObb.esercizio < aObb.esercizio_competenza then
--   IBMERR001.RAISE_ERR_GENERICO('4. Generazione automatica di '||cnrutil.getLabelObbligazioneMin()||' in esercizi futuri non supportata !');
--End if;


-- PER L'ENTRATA

CNRCTB048.checkEsercizio(aAcc.esercizio, aAcc.cd_cds);

If aAcc.fl_pgiro is null Or aAcc.fl_pgiro <> 'Y' Then
   IBMERR001.RAISE_ERR_GENERICO('Accertamento non su partita di giro.');
End If;

If aAcc.cd_tipo_documento_cont is null Or
           aAcc.cd_tipo_documento_cont Not In (CNRCTB018.TI_DOC_ACC_PGIRO, CNRCTB018.TI_DOC_ACC_PGIRO_RES) Then
        IBMERR001.RAISE_ERR_GENERICO ('Non si tratta di un ribaltamento di Accertamento per partita di giro.');
End If;

Begin
   Select * into aEVENT
   From   elemento_voce
   Where  esercizio = aAcc.esercizio And
          ti_gestione = aAcc.ti_gestione And
          ti_appartenenza = aAcc.ti_appartenenza And
          cd_elemento_voce = aAcc.cd_elemento_voce And
          fl_partita_giro = 'Y';
Exception
  When NO_DATA_FOUND Then
        IBMERR001.RAISE_ERR_GENERICO('Voce del piano '||aAcc.cd_elemento_voce||' non trovata o non di tipo "partita di giro".');
End;

If recParametriCNR.fl_nuovo_pdg='N' Then
  Begin
    Select * into aVoceFENT
    From   voce_f
    Where  esercizio = aEVEnt.esercizio And
           ti_gestione = aEVEnt.ti_gestione And
           ti_appartenenza = aEVEnt.ti_appartenenza And
           cd_voce = aAcc.cd_voce And
           fl_mastrino = 'Y';
  Exception
    When NO_DATA_FOUND Then
        IBMERR001.RAISE_ERR_GENERICO('Conto finanziario '||aAcc.cd_elemento_voce||' non trovato.');
  End;

  aCDS        := CNRCTB020.GETCDSVALIDO(aAcc.esercizio, aAcc.cd_cds);
  aCDSOrigine := CNRCTB020.GETCDSVALIDO(aAcc.esercizio, aAcc.cd_cds_origine);

  If aCDS.cd_tipo_unita = CNRCTB020.TIPO_ENTE and aEVEnt.ti_appartenenza = CNRCTB001.APPARTENENZA_CDS then
    IBMERR001.RAISE_ERR_GENERICO('La voce del piano specificata non è una voce del piano dell''ENTE.');
  End If;

  If aCDS.cd_tipo_unita <> CNRCTB020.TIPO_ENTE and aEVEnt.ti_appartenenza = CNRCTB001.APPARTENENZA_CNR then
    IBMERR001.RAISE_ERR_GENERICO('La voce del piano specificata non è una voce del piano di CDS.');
  End If;
End If;

-- 22.12.2008 eliminato controllo per anomalia su ribaltamento

--If aAcc.esercizio != aAcc.esercizio_competenza Then
--   IBMERR001.RAISE_ERR_GENERICO('Generazione automatica di accertamento in esercizi futuri non supportata !');
--End if;

---------------------------- FINE CONTROLLI, INIZIO RIBALTAMENTO VERO E PROPRIO -------------------------------

-- Recupero il riscontrato dell'obbligazione per vedere se deve essere tronca oppure no
  aImRiscontratoSpe := getIm_riscontrato (aObb.esercizio, aObb.cd_cds, aObb.esercizio_originale, aObb.pg_obbligazione,
                                          aObb.ti_gestione);

-- Ribaltamento dell'OBBLIGAZIONE in nuovo esercizio

  aObbNew     := aObb;

  aObbNew.esercizio              := aObb.esercizio+1;
  aObbNew.esercizio_originale    := aObb.esercizio_originale;
  aObbNew.esercizio_competenza   := aObbNew.esercizio;
  aObbNew.dt_registrazione       := to_date('0101'||aObbNew.esercizio,'DDMMYYYY');
  aObbNew.CD_TIPO_DOCUMENTO_CONT := cnrctb018.TI_DOC_OBB_PGIRO_RES; -- part giro res

  -- se è riscontrato o se era già tronca (cancellata) allora --> PARTITA DI GIRO TRONCA
  If aObb.dt_cancellazione is Not null Or aImRiscontratoSpe != 0 Or
      /* new ! */ CNRCTB048.getImNonPagatoRiscosso(aObb.cd_cds, aObb.esercizio, aObb.esercizio_originale, aObb.pg_obbligazione, aObb.ti_gestione) = 0 Then
    aObbNew.im_obbligazione  := 0;
    aObbNew.dt_cancellazione := to_date('0101'||aObbNew.esercizio, 'DDMMYYYY');
    aObbNew.stato_obbligazione := 'S';
  Else
    aObbNew.im_obbligazione := CNRCTB048.getImNonPagatoRiscosso(aObb.cd_cds, aObb.esercizio, aObb.esercizio_originale, aObb.pg_obbligazione, aObb.ti_gestione);
  End If;

  -- SE E' STATA PASSATA LA VOCE DI SPESA LA METTO: cambio imputazione finanziaria
  --                                               (SENZA CONTROLLARE CHE SIA DI P DI GIRO ??? MAH !)

  if aElementoVoceS.esercizio is not null then
     aObbNew.TI_APPARTENENZA	:= aElementoVoceS.TI_APPARTENENZA;
     aObbNew.TI_GESTIONE	:= aElementoVoceS.TI_GESTIONE;
     aObbNew.CD_ELEMENTO_VOCE	:= aElementoVoceS.CD_ELEMENTO_VOCE;
  Else
     evNewS := getElementoVoceNew(aObb);
     aObbNew.TI_APPARTENENZA  := evNewS.TI_APPARTENENZA;
     aObbNew.TI_GESTIONE  := evNewS.TI_GESTIONE;
     aObbNew.CD_ELEMENTO_VOCE := evNewS.CD_ELEMENTO_VOCE;
  end if;

  aObbNew.dacr            := aTSNow;
  aObbNew.utcr            := aUser;
  aObbNew.duva            := aTSNow;
  aObbNew.utuv            := aUser;
  aObbNew.pg_ver_rec      := CNRCTB048.getPgVerRec(aObbNew);

-- 22.01.2008
  aObbNew.cd_cds_ori_riporto          := aObb.cd_cds;
  aObbNew.esercizio_ori_riporto       := aObb.esercizio;
  aObbNew.esercizio_ori_ori_riporto   := aObb.esercizio_originale;
  aObbNew.pg_obbligazione_ori_riporto := aObb.pg_obbligazione;

  CNRCTB035.INS_OBBLIGAZIONE(aObbNew);

  aObbScadNew             := aObbScad;   -- TRAVASO LA SCADENZA

  aObbScadNew.esercizio                   := aObbNew.esercizio;
  aObbScadNew.cd_cds                      := aObbNew.cd_cds;
  aObbScadNew.esercizio                   := aObbNew.esercizio;
  aObbScadNew.esercizio_originale         := aObbNew.esercizio_originale;
  aObbScadNew.pg_obbligazione             := aObbNew.pg_obbligazione;
  aObbScadNew.pg_obbligazione_scadenzario := 1;
  aObbScadNew.dt_scadenza                 := TRUNC(nvl(CNRCTB048.GETDTSCADENZA(aObbNew.esercizio, aObbScad.dt_scadenza), aObb.dt_registrazione));
  aObbScadNew.ds_scadenza                 := aObbNew.ds_obbligazione;

  -- come per le obbligazioni
  aObbScadNew.im_scadenza                 := aObbScad.im_scadenza - aObbScad.im_associato_doc_contabile;
  aObbScadNew.im_associato_doc_amm        := aObbScad.im_associato_doc_amm - aObbScad.im_associato_doc_contabile;
  aObbScadNew.im_associato_doc_contabile  := 0;

  aObbScadNew.dacr                        := aObbNew.dacr;
  aObbScadNew.utcr                        := aObbNew.utcr;
  aObbScadNew.duva                        := aObbNew.duva;
  aObbScadNew.utuv                        := aObbNew.utuv;
  aObbScadNew.pg_ver_rec                  := CNRCTB048.getPgVerRec(aObbNew);

  aObbScadNew.pg_obbl_scad_ori_riporto    := 1;

  If CNRCTB015.UtilizzaGAEdedicataPgiroCDS (aObb.esercizio, aObb.CD_CDS_ORIGINE, CNRCTB001.GESTIONE_SPESE) Then
    aGAE_dedicata_CDS_S := CNRCTB015.get_LINEA_PGIRO_cds(aObb.esercizio, aObb.CD_CDS_ORIGINE, CNRCTB001.GESTIONE_SPESE);
    aCdCdrS := aGAE_dedicata_CDS_S.CD_CENTRO_RESPONSABILITA;
    aCdLaS  := aGAE_dedicata_CDS_S.CD_LINEA_ATTIVITA;
  Else
    aCdCdrS := CNRCTB015.GETVAL01PERCHIAVE(CNRCTB035.LA_SPECIALE,CNRCTB035.LA_SPESA_ENTE);
    aCdLaS := CNRCTB015.GETVAL02PERCHIAVE(CNRCTB035.LA_SPECIALE,CNRCTB035.LA_SPESA_ENTE);
  End If;

  aDettScadCObb.cd_cds                      := aObbNew.cd_cds;
  aDettScadCObb.esercizio                   := aObbNew.esercizio;
  aDettScadCObb.esercizio_originale         := aObbNew.esercizio_originale;
  aDettScadCObb.pg_obbligazione             := aObbNew.pg_obbligazione;
  aDettScadCObb.pg_obbligazione_scadenzario := 1;
  aDettScadCObb.ti_appartenenza             := aObbNew.ti_appartenenza;
  aDettScadCObb.ti_gestione                 := aObbNew.ti_gestione;
  aDettScadCObb.cd_voce                     := aObbNew.cd_elemento_voce;
  aDettScadCObb.cd_centro_responsabilita    := aCdCdrS;
  aDettScadCObb.cd_linea_attivita           := aCdLaS;
  aDettScadCObb.im_voce                     := aObbNew.im_obbligazione;
  aDettScadCObb.cd_fondo_ricerca            := null;
  aDettScadCObb.dacr                        := aObbNew.dacr;
  aDettScadCObb.utcr                        := aObbNew.utcr;
  aDettScadCObb.duva                        := aObbNew.duva;
  aDettScadCObb.utuv                        := aObbNew.utuv;
  aDettScadCObb.pg_ver_rec                  := CNRCTB048.getPgVerRec(aObbNew);

  aDettScadCObbList(1)                      := aDettScadCObb;

Dbms_Output.PUT_LINE ('CREA SCADENZA OBB '||aDettScadCObb.cd_cds||' '||aDettScadCObb.esercizio||' '||aDettScadCObb.esercizio_originale||' '||
aDettScadCObb.pg_obbligazione||' '||aDettScadCObb.pg_obbligazione_scadenzario);

  CNRCTB035.creaScadObbligazione(aObbNew, aObbScadNew, 1, aDettScadCObbList, false);

------------------------------------ RIBALTAMENTO DELL'ACCERTAMENTO --------------------------------

  -- recupero il riscontrato dell'accertamento collegato per vedere se deve essere tronca oppure no
  aImRiscontratoEnt := getIm_riscontrato (aAcc.esercizio, aAcc.cd_cds, aAcc.esercizio_originale, aAcc.pg_accertamento,
                                          aAcc.ti_gestione);

Dbms_Output.put_line ('riscontrato entrata '||aImRiscontratoEnt||' e data cancellazione '||To_Char(aAcc.dt_cancellazione));

  -- travaso prima il record
  aAccNew     := aAcc;

  -- e poi faccio le modifiche ai singoli campi

  aAccNew.esercizio              := aAcc.esercizio+1;
  aAccNew.esercizio_originale    := aAcc.esercizio_originale;
  aAccNew.dt_registrazione       := to_date('0101'||aAccNew.esercizio,'DDMMYYYY');
  aAccNew.CD_TIPO_DOCUMENTO_CONT := cnrctb018.TI_DOC_ACC_PGIRO_RES; -- part giro res

  -- se è riscontrato o se era già tronca (cancellata) allora --> PARTITA DI GIRO TRONCA
  If aAcc.dt_cancellazione is Not null Or aImRiscontratoEnt != 0 Or
      /* new ! */ CNRCTB048.getImNonPagatoRiscosso(aAcc.cd_cds, aAcc.esercizio, aAcc.esercizio_originale, aAcc.pg_accertamento, aAcc.ti_gestione) = 0 Then
    aAccNew.im_accertamento := 0;
    aAccNew.dt_cancellazione := to_date('0101'||aAccNew.esercizio,'DDMMYYYY');
  Else
    aAccNew.im_accertamento := CNRCTB048.getImNonPagatoRiscosso(aAcc.cd_cds, aAcc.esercizio, aAcc.esercizio_originale, aAcc.pg_accertamento, aAcc.ti_gestione);
  End If;

  If aElementoVoceE.esercizio is not null then
  -- cambio imputazione finanziaria
    aAccNew.TI_APPARTENENZA	:= aElementoVoceE.TI_APPARTENENZA;
    aAccNew.TI_GESTIONE	:= aElementoVoceE.TI_GESTIONE;
    aAccNew.CD_ELEMENTO_VOCE	:= aElementoVoceE.CD_ELEMENTO_VOCE;
  Else
    evNewE := getElementoVoceNew(aAcc);
    aAccNew.TI_APPARTENENZA  := evNewE.TI_APPARTENENZA;
    aAccNew.TI_GESTIONE  := evNewE.TI_GESTIONE;
    aAccNew.CD_ELEMENTO_VOCE := evNewE.CD_ELEMENTO_VOCE;
  End If;

  If recParametriCNR.fl_nuovo_pdg='Y' Then
    aAccNew.CD_VOCE := aAccNew.CD_ELEMENTO_VOCE;
  End if;

-- 22.01.2008
  aAccNew.cd_cds_ori_riporto          := aAcc.cd_cds;
  aAccNew.esercizio_ori_riporto       := aAcc.esercizio;
  aAccNew.esercizio_ori_ori_riporto   := aAcc.esercizio_originale;
  aAccNew.pg_accertamento_ori_riporto := aAcc.pg_accertamento;

  aAccNew.dacr            := aTSNow;
  aAccNew.utcr            := aUser;
  aAccNew.duva            := aTSNow;   --aAcc.dacr;
  aAccNew.utuv            := aUser;    --aAcc.utcr;
  aAccNew.pg_ver_rec      := CNRCTB048.getPgVerRec(aAccNew);

  dbms_output.put_line('Pippo '||aAccNew.ESERCIZIO||'/'||aAccNew.TI_APPARTENENZA||'/'||aAccNew.TI_GESTIONE||'/'||aAccNew.cd_elemento_voce);
  CNRCTB035.INS_ACCERTAMENTO(aAccNew);
dbms_output.put_line('POSTPippo ');
  aAccScadNew := aAccScad;   -- tutto il record

  aAccScadNew.esercizio                     := aAccNew.esercizio;
  aAccScadNew.cd_cds                        := aAccNew.cd_cds;
  aAccScadNew.esercizio                     := aAccNew.esercizio;
  aAccScadNew.esercizio_originale           := aAccNew.esercizio_originale;
  aAccScadNew.pg_accertamento               := aAccNew.pg_accertamento;
  aAccScadNew.pg_accertamento_scadenzario   := 1;
  aAccScadNew.dt_scadenza_emissione_fattura := Trunc(nvl(CNRCTB048.GETDTSCADENZA(aAccNew.esercizio, aAccScadNew.dt_scadenza_emissione_fattura), aAcc.dt_registrazione));
  aAccScadNew.dt_scadenza_incasso           := Trunc(nvl(CNRCTB048.GETDTSCADENZA(aAccNew.esercizio, aAccScadNew.dt_scadenza_incasso), aAcc.dt_registrazione));
  aAccScadNew.ds_scadenza                   := aAccNew.ds_accertamento;

  -- come per gli accertamenti normali
  aAccScadNew.im_scadenza                   := aAccScad.im_scadenza - aAccScad.im_associato_doc_contabile;
  aAccScadNew.im_associato_doc_amm          := aAccScad.im_associato_doc_amm - aAccScad.im_associato_doc_contabile;

  aAccScadNew.im_associato_doc_contabile    := 0;
  aAccScadNew.dacr                          := aAccNew.dacr;
  aAccScadNew.utcr                          := aAccNew.utcr;
  aAccScadNew.duva                          := aAccNew.duva;
  aAccScadNew.utuv                          := aAccNew.utuv;
  aAccScadNew.pg_ver_rec                    := CNRCTB048.getPgVerRec(aAccNew);

-- 22.01.2008
  aAccScadNew.pg_acc_scad_ori_riporto := 1;

  CNRCTB035.aggiornaSaldoDettScad(aAccNew,aAccNew.im_accertamento,false,aAccNew.utcr,aAccNew.dacr);

  If CNRCTB015.UtilizzaGAEdedicataPgiroCDS (aAccNew.esercizio, aAccNew.CD_CDS_ORIGINE, CNRCTB001.GESTIONE_ENTRATE) Then
    aGAE_dedicata_CDS_E := CNRCTB015.get_LINEA_PGIRO_cds(aAccNew.esercizio, aAccNew.CD_CDS_ORIGINE, CNRCTB001.GESTIONE_ENTRATE);
    aCdCdrE := aGAE_dedicata_CDS_E.CD_CENTRO_RESPONSABILITA;
    aCdLaE  := aGAE_dedicata_CDS_E.CD_LINEA_ATTIVITA;
  Else
    aCdCdrE :=CNRCTB015.GETVAL01PERCHIAVE(CNRCTB035.LA_SPECIALE,CNRCTB035.LA_ENTRATA_ENTE);
    aCdLaE  :=CNRCTB015.GETVAL02PERCHIAVE(CNRCTB035.LA_SPECIALE,CNRCTB035.LA_ENTRATA_ENTE);
  End If;

  aDettScadCAcc.cd_cds                      := aAccNew.cd_cds;
  aDettScadCAcc.esercizio                   := aAccNew.esercizio;
  aDettScadCAcc.esercizio_originale         := aAccNew.esercizio_originale;
  aDettScadCAcc.pg_accertamento             := aAccNew.pg_accertamento;
  aDettScadCAcc.pg_accertamento_scadenzario := 1;
  aDettScadCAcc.cd_centro_responsabilita    := aCdCdrE;
  aDettScadCAcc.cd_linea_attivita           := aCdLaE;
  aDettScadCAcc.im_voce                     := aAccNew.im_accertamento; -- se tronca e' automatico a zero
  aDettScadCAcc.dacr                        := aAccNew.dacr;
  aDettScadCAcc.utcr                        := aAccNew.utcr;
  aDettScadCAcc.duva                        := aAccNew.duva;
  aDettScadCAcc.utuv                        := aAccNew.utuv;
  aDettScadCAcc.pg_ver_rec                  := CNRCTB048.getPgVerRec(aAccNew);

  aDettScadCAccList(1)                      := aDettScadCAcc;
  -- L'aggiornamento viene eseguito all'interno della procedura VOCE_F_SALDI_CDR_LINEA M.S. 19/12/2005
  CNRCTB035.creaScadAccertamento(aAccNew, aAccScadNew, 1, aDettScadCAccList);

----------------------- FINE RIBALTAMENTO DELL'ACCERTAMENTO, RIBALTO LE ASSOCIAZIONI -------------------------

  aAssDocPGiro.cd_cds                     := aAccNew.cd_cds;
  aAssDocPGiro.esercizio                  := aAccNew.esercizio;
  aAssDocPGiro.esercizio_ori_accertamento := aAccNew.esercizio_originale;
  aAssDocPGiro.pg_accertamento            := aAccNew.pg_accertamento;
  aAssDocPGiro.esercizio_ori_obbligazione := aObbNew.esercizio_originale;
  aAssDocPGiro.pg_obbligazione            := aObbNew.pg_obbligazione;
  aAssDocPGiro.ti_origine                 := aTi_Origine;
  aAssDocPGiro.dacr                       := aAccNew.dacr;
  aAssDocPGiro.utcr                       := aAccNew.utcr;
  aAssDocPGiro.duva                       := aAccNEw.duva;
  aAssDocPGiro.utuv                       := aAccNew.utuv;
  aAssDocPGiro.pg_ver_rec                 := 1;

  CNRCTB035.INS_ASS_OBB_ACR_PGIRO(aAssDocPGiro);

-- 15.05.2006 stani: anche le ribaltate tronche devono riportare nel documento a zero la chiave dell'originale
-- 22.01.2008 NON CON LE PROCEDURE TRADIZIONALI ALTRIMENTI POPOLA GLI STORICI

--aggiornaConnPgiroCds(aObb, aObbNew);
--aggiornaConnPgiroCds(aAcc, aAccNew);

  Update obbligazione
  Set    riportato = 'Y',
         pg_ver_rec=pg_ver_rec + 1
  Where  cd_cds              = aObb.cd_cds And
         esercizio           = aObb.esercizio And
         esercizio_originale = aObb.esercizio_originale And
         pg_obbligazione     = aObb.pg_obbligazione;

  Update accertamento
  Set    riportato = 'Y',
         pg_ver_rec          = pg_ver_rec + 1
  Where  cd_cds              = aAcc.cd_cds And
         esercizio           = aAcc.esercizio And
         esercizio_originale = aAcc.esercizio_originale And
         pg_accertamento     = aAcc.pg_accertamento;

-- FINE MODIFICHE 22.01.2008


-- se la partita di giro di entrata che si ribalta si porta dietro documenti amministrativi
-- allora sposto sul documento amministrativo la nuova chiave dell'accertamento

If aAccScadNew.im_associato_doc_amm > 0 then
    CNRCTB048.aggiornaDocAmm(aAccScad, aAccScadNew, aUser, aTSNow);
End If;

-- se la partita di giro di spesa che si ribalta si porta dietro documenti amministrativi
-- allora sposto sul documento amministrativo la nuova chiave dell'obbligazione

If aObbScadNew.im_associato_doc_amm > 0 then
    CNRCTB048.aggiornaDocAmm(aObbScad, aObbScadNew, aUser, aTSNow);
End if;

End;

 procedure ripPgiroCdsInt(
  aObb IN OUT obbligazione%rowtype,
  aObbNew IN OUT obbligazione%rowtype,
  aElementoVoce elemento_voce%rowtype,
  aTSNow date,
  aUser varchar2
 ) is
  aObbScad obbligazione_scadenzario%rowtype;
  aObbScadVoce obbligazione_scad_voce%rowtype;
  aAcc accertamento%rowtype;
  aAccScad accertamento_scadenzario%rowtype;
  aAccScadVoce accertamento_scad_voce%rowtype;
  aObbScadNew obbligazione_scadenzario%rowtype;
  aAccNew accertamento%rowtype;
  aAccScadNew accertamento_scadenzario%rowtype;
  aImRiscontrato number;

 Begin

 Dbms_Output.put_line ('ripPgiroCdsInt 1');

  CNRCTB048.checkEsercizio(aObb.esercizio, aObb.cd_cds);

  CNRCTB035.getPgiroCds(aObb,aObbScad,aObbScadVoce, aAcc,aAccScad,aAccScadVoce);

  -- Crea (ribalta) obbligazione in nuovo esercizio

  aObbNew:=aObb;
  aObbScadNew:=aObbScad;
  aObbNew.esercizio:=aObb.esercizio+1;
  aObbNew.esercizio_competenza := aObbNew.esercizio;
  aObbNew.dt_registrazione := to_date('0101'||aObbNew.esercizio,'DDMMYYYY');
  /* 05.01.2006 stani */
  aObbNew.esercizio_originale    := aObb.esercizio_originale;
  aObbNew.CD_TIPO_DOCUMENTO_CONT := cnrctb018.TI_DOC_OBB_PGIRO_RES; -- part giro res

  if aElementoVoce.esercizio is not null then
  -- cambio imputazione finanziaria
     aObbNew.TI_APPARTENENZA	:= aElementoVoce.TI_APPARTENENZA;
     aObbNew.TI_GESTIONE	:= aElementoVoce.TI_GESTIONE;
     aObbNew.CD_ELEMENTO_VOCE	:= aElementoVoce.CD_ELEMENTO_VOCE;
  end if;

  aObbNew.dacr := aTSNow;
  aObbNew.utcr := aUser;
  aObbScadNew.esercizio := aObbNew.esercizio;

  -- partita di giro tronca se tronca in origine, oppure controparte riscontrata
  aImRiscontrato := getIm_riscontrato(aAcc.esercizio,aAcc.cd_cds,aAcc.esercizio_originale,aAcc.pg_accertamento,aAcc.ti_gestione);


if (aAcc.dt_cancellazione is null and aImRiscontrato = 0) then

 Dbms_Output.put_line ('ripPgiroCdsInt 2 chiamata CNRCTB030.creaObbligazionePgiro');

   CNRCTB030.creaObbligazionePgiro(false,aObbNew,aObbScadNew,aAccNew,aAccScadNew,CNRCTB048.GETDTSCADENZA(aObbNew.esercizio,aObbScad.dt_scadenza));

-- quando gli ritorna l'accertamento valorizza l'importo associato a documenti amministrativi
   if aAccScad.im_associato_doc_amm > 0 then
	  update accertamento_scadenzario
	  set    im_associato_doc_amm = aAccScad.im_associato_doc_amm,
		 pg_ver_rec = pg_ver_rec + 1
	  where  cd_cds = aAccScadNew.cd_cds And
	         esercizio = aAccScadNew.esercizio And
	         esercizio_originale = aAccScadNew.esercizio_originale And
	         pg_accertamento = aAccScadNew.pg_accertamento And
	         pg_accertamento_scadenzario = aAccScadNew.pg_accertamento_scadenzario;
      CNRCTB048.aggiornaDocAmm(aAccScad,aAccScadNew,aUser,aTSNow);
   end if;

else

Dbms_Output.put_line ('ripPgiroCdsInt 3 chiamata CNRCTB030.creaObbligazionePgiroTronc');

  CNRCTB030.creaObbligazionePgiroTronc(false,aObbNew,aObbScadNew,aAccNew,aAccScadNew,CNRCTB048.GETDTSCADENZA(aObbNew.esercizio,aObbScad.dt_scadenza));

end if;

  aggiornaConnPgiroCds(aObb,aObbNew);
  -- 15.05.2006 stani: anche le ribaltate tronche devono riportare nel documento a zero la chiave dell'originale

  aggiornaConnPgiroCds(aAcc,aAccNew);

  if aImRiscontrato = 0 then -- escludo pgiro ricreate tronche
     aggiornaConnPgiroCds(aAcc,aAccNew);
  end if;

  if aObbScad.im_associato_doc_amm > 0 then
	update obbligazione_scadenzario
	set im_associato_doc_amm = aObbScad.im_associato_doc_amm,
	    pg_ver_rec = pg_ver_rec + 1
	where cd_cds = aObbScadNew.cd_cds
	  and esercizio = aObbScadNew.esercizio
	  and esercizio_originale = aObbScadNew.esercizio_originale
	  and pg_obbligazione = aObbScadNew.pg_obbligazione
	  and pg_obbligazione_scadenzario = aObbScadNew.pg_obbligazione_scadenzario;
    CNRCTB048.aggiornaDocAmm(aObbScad,aObbScadNew,aUser,aTSNow);
  end if;
End;

Procedure ripPgiroCdsInt(
  aAcc IN OUT accertamento%rowtype,
  aObbNew IN OUT obbligazione%rowtype,
  aElementoVoce elemento_voce%rowtype,
  aTSNow date,
  aUser varchar2
 ) is
  aObb          obbligazione%rowtype;
  aObbScad      obbligazione_scadenzario%rowtype;
  aObbScadVoce  obbligazione_scad_voce%rowtype;
  aAccScad      accertamento_scadenzario%rowtype;
  aAccScadVoce  accertamento_scad_voce%rowtype;
  aObbScadNew   obbligazione_scadenzario%rowtype;
  aAccNew       accertamento%rowtype;
  aAccScadNew   accertamento_scadenzario%rowtype;

 begin
  CNRCTB048.checkEsercizio(aAcc.esercizio,aAcc.cd_cds);
  CNRCTB035.getPgiroCds(aAcc, aAccScad, aAccScadVoce, aObb, aObbScad, aObbScadVoce);

  aObbNew                       := aObb;
  aObbScadNew                   := aObbScad;

  aObbNew.esercizio             := aObb.esercizio+1;
  aObbNew.esercizio_competenza  := aObbNew.esercizio;

  aObbNew.dt_registrazione := to_date('0101'||aObbNew.esercizio,'DDMMYYYY');

  /* 05.01.2006 stani */
  aObbNew.esercizio_originale    := aObb.esercizio_originale;
  aObbNew.CD_TIPO_DOCUMENTO_CONT := cnrctb018.TI_DOC_OBB_PGIRO_RES; -- part giro res

  if aElementoVoce.esercizio is not null then
  -- cambio imputazione finanziaria
	  aObbNew.TI_APPARTENENZA		  	  :=aElementoVoce.TI_APPARTENENZA;
	  aObbNew.TI_GESTIONE			  	  :=aElementoVoce.TI_GESTIONE;
	  aObbNew.CD_ELEMENTO_VOCE		  	  :=aElementoVoce.CD_ELEMENTO_VOCE;
  end if;

  aObbNew.dacr := aTSNow;
  aObbNew.utcr := aUser;
  aObbScadNew.esercizio:=aObbNew.esercizio;

  CNRCTB030.creaObbligazionePgiroTronc(false,aObbNew,aObbScadNew,aAccNew,aAccScadNew,CNRCTB048.GETDTSCADENZA(aObbNew.esercizio,aObbScad.dt_scadenza));

  aggiornaConnPgiroCds(aObb,aObbNew);
  -- 15.05.2006 stani: anche le ribaltate tronche devono riportare nel documento a zero la chiave dell'originale
  aggiornaConnPgiroCds(aAcc,aAccNew);

  if aObbScad.im_associato_doc_amm > 0 then
--    aObbScadNew.im_associato_doc_amm := aObbScad.im_associato_doc_amm;
	update obbligazione_scadenzario
	set im_associato_doc_amm = aObbScad.im_associato_doc_amm,
	    pg_ver_rec = pg_ver_rec + 1
	where cd_cds = aObbScadNew.cd_cds
	  and esercizio = aObbScadNew.esercizio
	  and esercizio_originale = aObbScadNew.esercizio_originale
	  and pg_obbligazione = aObbScadNew.pg_obbligazione
	  and pg_obbligazione_scadenzario = aObbScadNew.pg_obbligazione_scadenzario;
    CNRCTB048.aggiornaDocAmm(aObbScad,aObbScadNew,aUser,aTSNow);
  end if;
--   if aAccScad.im_associato_doc_amm > 0 then
--     CNRCTB048.aggiornaDocAmm(aAccScad,aAccScadNew,aUser,aTSNow);
--   end if;
 end;

 procedure deriportoEsNextDocAmm(aEsScrivania number, aTiDoc varchar2, aCdCdsDoc varchar2, aEsDoc number, aCdUoDoc varchar2, aPgDoc number, aUser varchar2) is
  aObb obbligazione%rowtype;
  aAcc accertamento%rowtype;
  aTSNow date;
  isFoundSpesa boolean;
  aObbPrev obbligazione%rowtype;
  aAccPrev accertamento%rowtype;
  contatore number := 0;
 begin
  aTSNow:=sysdate;
  isFoundSpesa:=false;
  for aDoc in (select distinct cd_cds_obbligazione, esercizio_obbligazione, esercizio_ori_obbligazione, pg_obbligazione from V_DOC_AMM_OBB d
				    where
					      cd_tipo_documento_amm = aTiDoc
					  and cd_cds	= aCdCdsDoc
					  and esercizio	= aEsDoc
					  and cd_unita_organizzativa = aCdUoDoc
					  and pg_documento_amm = aPgDoc
					  and esercizio_obbligazione > aEsDoc
  ) loop
   contatore := contatore + 1;
   isFoundSpesa:=true;
   if aDoc.esercizio_obbligazione = aEsScrivania then
    IBMERR001.RAISE_ERR_GENERICO('Esercizio di scrivania non valido per questa operazione');
   end if;
   if aDoc.esercizio_obbligazione - 1 <> aEsScrivania then
    IBMERR001.RAISE_ERR_GENERICO('Esercizio di effettuazione operazione e quello del documento contabile non sono compatibili');
   end if;

   aObb:=null;
   aObb.cd_cds:=aDoc.cd_cds_obbligazione;
   aObb.esercizio:=aDoc.esercizio_obbligazione;
   aObb.esercizio_originale:=aDoc.esercizio_ori_obbligazione;
   aObb.pg_obbligazione:=aDoc.pg_obbligazione;
   cnrctb035.LOCKDOCFULL(aObb);
   aObbPrev := CNRCTB048.GETDOCORIGINE(aObb);

   deriportoEsNextObb(aObbPrev, aUser, aTSNow);

  end loop;
  if not isFoundSpesa then
   for aDoc in (select distinct cd_cds_accertamento, esercizio_accertamento, esercizio_ori_accertamento, pg_accertamento from V_DOC_AMM_ACC d
				    where
					      cd_tipo_documento_amm = aTiDoc
					  and cd_cds	= aCdCdsDoc
					  and esercizio	= aEsDoc
					  and cd_unita_organizzativa = aCdUoDoc
					  and pg_documento_amm = aPgDoc
					  and esercizio_accertamento > aEsDoc
   ) loop
    contatore := contatore + 1;
    if aDoc.esercizio_accertamento = aEsScrivania then
     IBMERR001.RAISE_ERR_GENERICO('Esercizio di scrivania non valido per questa operazione');
    end if;
    if aDoc.esercizio_accertamento - 1 <> aEsScrivania then
     IBMERR001.RAISE_ERR_GENERICO('Esercizio di effettuazione operazione e quello del documento contabile non sono compatibili');
    end if;
    isFoundSpesa:=true;
    aAcc:=null;
    aAcc.cd_cds:=aDoc.cd_cds_accertamento;
    aAcc.esercizio:=aDoc.esercizio_accertamento;
    aAcc.esercizio_originale:=aDoc.esercizio_ori_accertamento;
    aAcc.pg_accertamento:=aDoc.pg_accertamento;
	cnrctb035.LOCKDOCFULL(aAcc);
	aAccPrev := CNRCTB048.GETDOCORIGINE(aAcc);
    deriportoEsNextAcc(aAccPrev, aUser, aTSNow);
   end loop;
  end if;
  if contatore = 0 then
  	 ibmerr001.RAISE_ERR_GENERICO('Documenti contabili non riportabili all''esercizio precedente');
  end if;
 end;


 procedure riportoEsNextDocAmm(aEsScrivania number, aTiDoc varchar2, aCdCdsDoc varchar2,
                               aEsDoc number, aCdUoDoc varchar2, aPgDoc number, aUser varchar2) is
  aObb obbligazione%rowtype;
  aAcc accertamento%rowtype;
  aTSNow date;
  isFoundSpesa boolean;
  contatore number := 0;
 begin
  aTSNow:=sysdate;

-- Rospuc 09/03/2017 sospesa contabilizzazione


--   Se il documento viene riportato nel suo esercizio di competenza (esDoc = esScriv) allora
--   deve essere processato in economica (il client si preoccupa di mettere lo stato da riprocessare)
--   Se invece il riporto avviene in esercizi successivi a quello di origine del documento,
--   allora l'economica è già chiusa quindi il documento non può essere riprocessato e deve essere riportato
--   il suo stato a "contabilizzato"
  if (aEsScrivania = aEsDoc) then
	  -- contabilizzazione in economica del doc amm
	  CNRCTB205.regDocAmmCOGE(aEsDoc, aCdCdsDoc, aCdUoDoc, aTiDoc, aPgDoc, aUser, aTSNow);

	  -- contabilizzazione in analitica del doc amm
	  CNRCTB210.regDocAmmCoan(aEsDoc, aCdCdsDoc, aCdUoDoc, aTiDoc, aPgDoc, aUser, aTSNow);
  else
    CNRCTB100.UPDATEDOCAMM_NODUVAUTUV(
				    aTiDoc,
				    aCdCdsDoc,
				    aEsDoc,
				    aCdUoDoc,
				    aPgDoc,
				    'stato_coge='''||CNRCTB100.STATO_COEP_CON||'''',
				    null);
	CNRCTB100.UPDATEDOCAMM_NODUVAUTUV(
				    aTiDoc,
				    aCdCdsDoc,
				    aEsDoc,
				    aCdUoDoc,
				    aPgDoc,
				    'stato_coan='''||CNRCTB100.STATO_COEP_CON||'''',
				    null);
  end if;
 -- fine Rospuc 09/03/2017

   isFoundSpesa:=false;
  for aDoc in (select distinct cd_cds_obbligazione, esercizio_obbligazione, esercizio_ori_obbligazione, pg_obbligazione from V_DOC_AMM_OBB d
				    where
					      cd_tipo_documento_amm = aTiDoc
					  and cd_cds	= aCdCdsDoc
					  and esercizio	= aEsDoc
					  and cd_unita_organizzativa = aCdUoDoc
					  and pg_documento_amm = aPgDoc
					  and isEligibileRibalt( CNRCTB001.GESTIONE_SPESE,
						   					 cd_cds_obbligazione,
											 esercizio_obbligazione,
											 esercizio_ori_obbligazione,
											 pg_obbligazione) = 'Y'
  ) loop
   contatore := contatore + 1;
   isFoundSpesa:=true;

   if aDoc.esercizio_obbligazione + 1 = aEsScrivania then
    IBMERR001.RAISE_ERR_GENERICO('Esercizio di scrivania non valido per questa operazione');
   end if;
   if aDoc.esercizio_obbligazione <> aEsScrivania then
    IBMERR001.RAISE_ERR_GENERICO('Esercizio di effettuazione operazione e quello del documento contabile non sono compatibili');
   end if;

   aObb:=null;
   aObb.cd_cds:=aDoc.cd_cds_obbligazione;
   aObb.esercizio:=aDoc.esercizio_obbligazione;
   aObb.esercizio_originale:=aDoc.esercizio_ori_obbligazione;
   aObb.pg_obbligazione:=aDoc.pg_obbligazione;

   -- controllo lo stato dell'esercizio: per ribaltare doc amm, l'esercizio corrente ed il successivo devono essere aperti
   -- 1. verifico es corrente aperto e es successivo esistente (cond suff per riporto doc cont)
   CNRCTB048.CHECKESERCIZIO(aObb.esercizio,aObb.cd_cds);
   -- 2. verifico es successivo aperto (cond necessaria per riporto doc amm)
   if not CNRCTB008.ISESERCIZIOAPERTO(aObb.esercizio + 1, aObb.cd_cds) then
   	  ibmerr001.RAISE_ERR_GENERICO('L''esercizio '||(aObb.esercizio + 1)||' non è aperto per il cds:'||aObb.cd_cds);
   end if;
   riportoEsNextObb(aObb, null, null,aUser, aTSNow);

  end loop;
  if not isFoundSpesa then
   for aDoc in (select distinct cd_cds_accertamento, esercizio_accertamento, esercizio_ori_accertamento, pg_accertamento from V_DOC_AMM_ACC d
				    where
					      cd_tipo_documento_amm = aTiDoc
					  and cd_cds	= aCdCdsDoc
					  and esercizio	= aEsDoc
					  and cd_unita_organizzativa = aCdUoDoc
					  and pg_documento_amm = aPgDoc
					  and isEligibileRibalt (CNRCTB001.GESTIONE_ENTRATE,
						   					 cd_cds_accertamento,
											 esercizio_accertamento,
											 esercizio_ori_accertamento,
											 pg_accertamento) = 'Y'
   ) loop
    contatore := contatore + 1;
    if aDoc.esercizio_accertamento + 1 = aEsScrivania then
     IBMERR001.RAISE_ERR_GENERICO('Esercizio di scrivania non valido per questa operazione');
    end if;
    if aDoc.esercizio_accertamento <> aEsScrivania then
     IBMERR001.RAISE_ERR_GENERICO('Esercizio di effettuazione operazione e quello del documento contabile non sono compatibili');
    end if;

    isFoundSpesa:=true;
    aAcc:=null;
    aAcc.cd_cds:=aDoc.cd_cds_accertamento;
    aAcc.esercizio:=aDoc.esercizio_accertamento;
    aAcc.esercizio_originale:=aDoc.esercizio_ori_accertamento;
    aAcc.pg_accertamento:=aDoc.pg_accertamento;

	-- controllo lo stato dell'esercizio: per ribaltare doc amm, l'esercizio corrente ed il successivo devono essere aperti
   	-- 1. verifico es corrente aperto e es successivo esistente (cond suff per riporto doc cont)
    CNRCTB048.CHECKESERCIZIO(aAcc.esercizio,aAcc.cd_cds);
    -- 2. verifico es successivo aperto (cond necessaria per riporto doc amm)
    if not CNRCTB008.ISESERCIZIOAPERTO(aAcc.esercizio + 1, aAcc.cd_cds) then
   	  ibmerr001.RAISE_ERR_GENERICO('L''esercizio '||(aAcc.esercizio + 1)||' non è aperto per il cds:'||aAcc.cd_cds);
    end if;

    riportoEsNextAcc(aAcc, null,aUser, aTSNow);

   end loop;
  end if;
  if contatore = 0 then
  	 ibmerr001.RAISE_ERR_GENERICO('Documenti contabili non riportabili all''esercizio successivo');
  end if;
 end;


procedure riportoEsNextObbPGiro(aObb in out obbligazione%rowtype, aElementoVoce elemento_voce%rowtype,
                                aUser varchar2, aTSNow date) is
aObbNew obbligazione%rowtype;
aObbScad obbligazione_scadenzario%rowtype;
aObbScadVoce obbligazione_scad_voce%rowtype;
aAcc accertamento%rowtype;
aAccScad accertamento_scadenzario%rowtype;
aAccScadVoce accertamento_scad_voce%rowtype;
aprePGiro boolean;

begin
	-- verifico se l'elemento voce, se specificato, è su pgiro
	if aElementoVoce.esercizio is not null and aElementoVoce.fl_partita_giro = 'N' then
	   ibmerr001.RAISE_ERR_GENERICO('L''elemento voce specificato non è su partita di giro, impossibile ribaltare');
	end if;

	-- verifico se l'obbligazione ha aperto la partita di giro
	aprePGiro := CNRCTB035.ISAPREPGIRO(aObb);

	if aprePGiro then
Dbms_Output.put_line ('riportoEsNextObbPGiro 1');
	   CNRCTB035.getPgiroCds(aObb,aObbScad,aObbScadVoce,aAcc,aAccScad,aAccScadVoce);
	else
Dbms_Output.put_line ('riportoEsNextObbPGiro 2');
	   CNRCTB035.getPgiroCdsInv(aObb,aObbScad,aObbScadVoce,aAcc,aAccScad,aAccScadVoce);
	end if;

	-- lock della controparte
	cnrctb035.LOCKDOCFULL(aAcc);

	-- verifico se la controparte è ribaltabile
	CNRCTB048.checkRiportaEsNext(aAcc,false, true);

	if aElementoVoce.esercizio is null then
	-- non cambia imputazione finanziaria
		if aprePgiro then
Dbms_Output.put_line ('riportoEsNextObbPGiro 3');
		   ripPgiroCds(aObb,aObbNew,aTSNow,aUser);
		else
Dbms_Output.put_line ('riportoEsNextObbPGiro 4');
		   ripPgiroCds(aAcc,aObbNew,aTSNow,aUser);
		end if;
	else
		if aprePgiro then
Dbms_Output.put_line ('riportoEsNextObbPGiro 5');
		   ripPgiroCdsInt(aObb,aObbNew,aElementoVoce,aTSNow,aUser);
		else
Dbms_Output.put_line ('riportoEsNextObbPGiro 6');
		   ripPgiroCdsInt(aAcc,aObbNew,aElementoVoce,aTSNow,aUser);
		end if;
	end if;
end;

Procedure riportoEsNextObbAccPGiro(aObbIn         obbligazione%Rowtype,
                                   aAccIn         accertamento%Rowtype,
                                   aElementoVoceS elemento_voce%Rowtype,
                                   aElementoVoceE elemento_voce%Rowtype,
                                   aUser          VARCHAR2,
                                   aTSNow         DATE) Is

aObb            obbligazione%Rowtype;
aObbScad        obbligazione_scadenzario%Rowtype;
aObbScadVoce    obbligazione_scad_voce%Rowtype;

aAcc            accertamento%Rowtype;
aAccScad        accertamento_scadenzario%Rowtype;
aAccScadVoce    accertamento_scad_voce%Rowtype;

aprePGiro       Boolean;
aTi_Origine     CHAR;

aObbNew         obbligazione%Rowtype;
aAccNew         accertamento%Rowtype;

Begin

-- verifico se l'elemento voce di spesa, se specificato, è su pgiro
If aElementoVoceS.esercizio is not null and aElementoVoceS.fl_partita_giro = 'N' then
   ibmerr001.RAISE_ERR_GENERICO('L''elemento voce di spesa specificato ('||aElementoVoceS.cd_elemento_voce||') non è su partita di giro, impossibile ribaltare.');
End If;

-- verifico se l'elemento voce di entrata, se specificato, è su pgiro
If aElementoVoceE.esercizio is not null and aElementoVoceE.fl_partita_giro = 'N' then
   ibmerr001.RAISE_ERR_GENERICO('L''elemento voce di entrata specificato ('||aElementoVoceE.cd_elemento_voce||') non è su partita di giro, impossibile ribaltare.');
End If;

-- recupero i documenti contabili da ribaltare

Dbms_Output.put_line ('riportoEsNextObbAccPGiro 1');

-- se l'impegno è valorizzato recupera l'accertamento

If aObbIn.esercizio Is Not Null Then

Dbms_Output.put_line ('riportoEsNextObbAccPGiro 2');

  aObb := aObbIn;

  -- verifico se l'obbligazione ha aperto la partita di giro
  aprePGiro := CNRCTB035.ISAPREPGIRO(aObb);

  -- recupera comunque sempre l'obbligazione e l'accertamento
  If aprePGiro then
     CNRCTB035.getPgiroCds(aObb, aObbScad, aObbScadVoce, aAcc, aAccScad, aAccScadVoce);
     aTi_Origine := CNRCTB001.GESTIONE_SPESE;
  Else
     CNRCTB035.getPgiroCdsInv(aObb, aObbScad, aObbScadVoce, aAcc, aAccScad, aAccScadVoce);
     aTi_Origine := CNRCTB001.GESTIONE_ENTRATE;
  End If;

  -- lock della controparte (accertamento)
  cnrctb035.LOCKDOCFULL(aAcc);

  -- verifico se la controparte è ribaltabile
  Dbms_Output.put_line ('CNRCTB048.checkRiportaEsNext');
  CNRCTB048.checkRiportaEsNext(aAcc, false, true);

Elsif aAccIn.esercizio Is Not Null Then

Dbms_Output.put_line ('riportoEsNextObbAccPGiro 3');

-- se l'accertamento è valorizzato recupera l'impegno

  aAcc := aAccIn;

  -- verifico se l'accertamento ha aperto la partita di giro
  aprePGiro := CNRCTB035.ISAPREPGIRO(aAcc);

  -- recupera comunque sempre l'obbligazione e l'accertamento
  If aprePGiro then
Dbms_Output.put_line ('riportoEsNextObbAccPGiro 4');
     CNRCTB035.getPgiroCds(aAcc, aAccScad, aAccScadVoce, aObb, aObbScad, aObbScadVoce);
     aTi_Origine := CNRCTB001.GESTIONE_ENTRATE;
  Else
Dbms_Output.put_line ('riportoEsNextObbAccPGiro 5');
     CNRCTB035.getPgiroCdsInv(aAcc, aAccScad, aAccScadVoce, aObb, aObbScad, aObbScadVoce);
     aTi_Origine := CNRCTB001.GESTIONE_SPESE;
  End If;

  -- lock della controparte (obbligazione)
  cnrctb035.LOCKDOCFULL(aObb);

  -- verifico se la controparte è ribaltabile
Dbms_Output.put_line ('riportoEsNextObbAccPGiro 6');
  CNRCTB048.checkRiportaEsNext(aObb, False);

End If;

--------------------------- Ribalto SEMPRE entrambe le partite di giro !!!! ----------------------------

Dbms_Output.put_line ('riportoEsNextObbAccPGiro 7 chiamata a ripPgiroCdsEntrambe');
ripPgiroCdsEntrambe(aObb, aObbScad, aObbScadVoce, aAcc, aAccScad, aAccScadVoce, aElementoVoceE, aElementoVoceS,
                    aTI_ORIGINE, aTSNow, aUser, aObbNew, aAccNew);

End;

procedure riportoEsNextAccPGiro(aAcc in out accertamento%rowtype, aElementoVoce elemento_voce%rowtype, aUser varchar2, aTSNow date) is
aAccNew accertamento%rowtype;
aAccScad accertamento_scadenzario%rowtype;
aAccScadVoce accertamento_scad_voce%rowtype;
aObb obbligazione%rowtype;
aObbScad obbligazione_scadenzario%rowtype;
aObbScadVoce obbligazione_scad_voce%rowtype;
aprePgiro boolean;
begin
	-- verifico se l'elemento voce, se specificato, è su pgiro
	if aElementoVoce.esercizio is not null and aElementoVoce.fl_partita_giro = 'N' then
	   ibmerr001.RAISE_ERR_GENERICO('L''elemento voce specificato non è su partita di giro, impossibile ribaltare');
	end if;

	-- verifico se l'accertamento ha aperto la partita di giro
	aprePGiro := CNRCTB035.ISAPREPGIRO(aAcc);

	if aprePGiro then
	   CNRCTB035.getPgiroCds(aAcc,aAccScad,aAccScadVoce,aObb,aObbScad,aObbScadVoce);
	else
	   CNRCTB035.getPgiroCdsInv(aAcc,aAccScad,aAccScadVoce,aObb,aObbScad,aObbScadVoce);
	end if;

	-- lock della controparte
	cnrctb035.LOCKDOCFULL(aObb);

	-- verifico se la controparte è ribaltabile
	CNRCTB048.checkRiportaEsNext(aObb,false);

	if aElementoVoce.esercizio is null then
	-- non cambia imputazione finanziaria
		if aprePgiro then
		   ripPgiroCds(aAcc,aAccNew,aTSNow,aUser);
		else
		   ripPgiroCds(aObb,aAccNew,aTSNow,aUser);
		end if;
	else
		if aprePgiro then
		   ripPgiroCdsInt(aAcc,aAccNew,aElementoVoce,aTSNow,aUser);
		else
		   ripPgiroCdsInt(aObb,aAccNew,aElementoVoce,aTSNow,aUser);
		end if;
	end if;
end;

procedure riportoObb(aObb in out obbligazione%rowtype, aElementoVoce elemento_voce%rowtype, aVoceF voce_f%rowtype,aUser varchar2, aTSNow date) is
aCdTipoDoc varchar2(10);
aObbNext obbligazione%rowtype;
aObbScadNext obbligazione_scadenzario%rowtype;
aObbScadDettNext obbligazione_scad_voce%rowtype;
ListaObbScadVoceNext CNRCTB035.scadVoceListS;
aIm number;
isScadRibaltabile char(1);
posizione number:=0;
i number;
aLdA v_linea_attivita_valida%rowtype;
aVoce voce_f%rowtype;
isControlloBloccante boolean := false;
aEs number;
aErrMsn varchar2(4000);
aSaldo voce_f_saldi_cmp%rowtype;
aSaldocdrlinea voce_f_saldi_cdr_linea%rowtype;
aEV elemento_voce%rowtype;
cambiaImputFinImp boolean;
cambiaImputFinObb boolean;
esisteImpGiaRiportato boolean := false;
recParametriCNR PARAMETRI_CNR%Rowtype;
recParametriCDS PARAMETRI_CDS%Rowtype;
begin
	aEs := aObb.esercizio + 1;

  recParametriCNR := CNRUTL001.getRecParametriCnr(aEs);
  recParametriCDS := CNRUTL001.getRecParametriCds(aEs, aObb.cd_cds);

	-- verifico lo stato dell'esercizio

	cnrctb048.CHECKESERCIZIO(aObb.esercizio,aObb.cd_cds);

	-- se cambia imputazione finanziaria:
	-- per impegni, impegni residui no pgiro ===> voce_f
	-- 	   		===> cambiaImputFinImp = true, cambiaImputFinObb = false
	-- impegni, impegni residui pgiro, obbligazioni ===> elemento_voce
	-- 			===> cambiaImputFinImp = false, cambiaImputFinObb = true

	if aElementoVoce.esercizio is Null And aVoceF.esercizio is Null then
		cambiaImputFinImp := false;
		cambiaImputFinObb := false;
	elsif aElementoVoce.esercizio is Null And aVoceF.esercizio is not Null Then
		cambiaImputFinImp := true;
		cambiaImputFinObb := false;
	elsif aElementoVoce.esercizio is not Null And aVoceF.esercizio is Null Then
		cambiaImputFinImp := false;
		cambiaImputFinObb := true;
	else
		aErrMsn := 'Errore nella chiamata di CNRCTB046.riportoObb(): deve essere valorizzato elemento_voce o voce_f';
		ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
	end if;


	if aObb.cd_tipo_documento_cont in (CNRCTB018.TI_DOC_IMP, CNRCTB018.TI_DOC_IMP_RES) then

	   -- impegni, competenza e residui bilancio ente, sia pgiro che no pgiro
	   aCdTipoDoc := CNRCTB018.TI_DOC_IMP_RES;
	   if cambiaImputFinObb and aObb.fl_pgiro = 'N' then
	   	  aErrMsn := 'Errore nella chiamata di CNRCTB046.riportoObb(): per riportare impegni non su partita di giro valorizzare voce_f';
		  ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
	   end if;

	   if cambiaImputFinImp and aObb.fl_pgiro = 'Y' then
	   	  aErrMsn := 'Errore nella chiamata di CNRCTB046.riportoObb(): per riportare impegni su partita di giro valorizzare elemento_voce';
		  ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
	   end if;

	elsif aObb.cd_tipo_documento_cont = CNRCTB018.TI_DOC_OBB then

	   -- obbligazioni no pgiro (DIVENTANO OBB_RES_PRO)
	   aCdTipoDoc := CNRCTB018.TI_DOC_OBB_RES_PRO;
	   if cambiaImputFinImp then
	   	  aErrMsn := 'Errore nella chiamata di CNRCTB046.riportoObb(): per riportare '||cnrutil.getLabelObbligazioniMin()||' valorizzare elemento_voce';
		  ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
	   end if;

	elsif aObb.cd_tipo_documento_cont In (CNRCTB018.TI_DOC_OBB_RES_PRO, CNRCTB018.TI_DOC_OBB_RES_IMPRO) Then

	   -- obbligazioni RESIDUE PROPRIE no pgiro (RESTANO OBB_RES)
	   aCdTipoDoc := CNRCTB018.TI_DOC_OBB_RES_PRO;
	   if cambiaImputFinImp then
	   	  aErrMsn := 'Errore nella chiamata di CNRCTB046.riportoObb(): per riportare '||cnrutil.getLabelObbligazioniMin()||' valorizzare elemento_voce';
		  ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
	   end if;

	elsif aObb.cd_tipo_documento_cont In (CNRCTB018.TI_DOC_OBB_PGIRO, CNRCTB018.TI_DOC_OBB_PGIRO_RES) Then

	   -- obbligazioni PARTITE DI GIRO COMPETENZA/RESIDUE SI RIBALTANO NELL'ALTRO RAMO
   	  aErrMsn := 'Errore nella chiamata di CNRCTB046.riportoObb(): il documento è una partita di giro.';
	  ibmerr001.RAISE_ERR_GENERICO(aErrMsn);

	else
	   aErrMsn := 'Errore nella chiamata di CNRCTB046.riportoObb(): documento non gestito ('||aObb.cd_tipo_documento_cont||')';
	   ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
	end if;


        aObbNext.CD_TIPO_DOCUMENTO_CONT := aCdTipoDoc;

	begin
		if cambiaImputFinImp then
	   	   select * into aEV
		   from elemento_voce
		   where esercizio 	  	  = aEs
		     and ti_appartenenza  = aVoceF.ti_appartenenza
			 and ti_gestione	  = aVoceF.ti_gestione
			 and cd_elemento_voce = aVoceF.cd_titolo_capitolo;
		elsif cambiaImputFinObb then
		   aEV := aElementoVoce;
		else  -- non cambia imputazione finanziaria
       select * into aEV
       from elemento_voce
       where esercizio        = aEs
       and ti_appartenenza  = aObb.TI_APPARTENENZA
       and ti_gestione    = aObb.TI_GESTIONE
       and cd_elemento_voce = aObb.CD_ELEMENTO_VOCE;
		end if;
    exception when NO_DATA_FOUND then
   		aErrMsn := 'Elemento voce '||nvl(aVoceF.cd_titolo_capitolo,aObb.CD_ELEMENTO_VOCE)||', appartenenza '||nvl(aVoceF.ti_appartenenza,aObb.TI_APPARTENENZA)||', gestione '||nvl(aVoceF.ti_gestione,aObb.TI_GESTIONE)||', esercizio '||aEs||' non trovato';
		ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
    end;
	-- verifico se l'elemento voce è su pgiro
	if aEV.fl_partita_giro = 'Y' and aObb.fl_pgiro = 'N' then
	   ibmerr001.RAISE_ERR_GENERICO('L''elemento voce specificato è su partita di giro, impossibile ribaltare');
	end if;

	if aEV.fl_partita_giro = 'N' and aObb.fl_pgiro = 'Y' then
	   ibmerr001.RAISE_ERR_GENERICO('L''elemento voce specificato non è su partita di giro, impossibile ribaltare');
	end if;

	aObbNext.TI_APPARTENENZA  :=aEV.TI_APPARTENENZA;
	aObbNext.TI_GESTIONE	  :=aEV.TI_GESTIONE;
	aObbNext.CD_ELEMENTO_VOCE :=aEV.CD_ELEMENTO_VOCE;

	CNRCTB048.creaTestataObb(aObb,aObbNext,aEs, aUser, aTSNow);

	-- se si tratta di obbligazione pluriennale nell'esercizio di partenza,
	-- controllo il limite di assunzione obbligazioni

/* 17/06/2009 eliminato perchè non serve più (eliminazione SALDI_CMP)

	if aObb.esercizio <> aObb.esercizio_competenza And CNRCTB030.CHECKASSUNZOBBLIG(aObbNext.esercizio_competenza,
	   							   aObbNext.esercizio,
								   aObbNext.cd_cds,
								   aObbNext.cd_unita_organizzativa,
								   aObbNext.cd_elemento_voce,
								   aObbNext.im_obbligazione) = 'N' then

		aErrmsn := 'L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' non ha superato il controllo assunzione obbligazioni nel nuovo esercizio';
		ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
	end if;
*/

	for aScad in (select * from obbligazione_scadenzario
			  	  where cd_cds 			= aObb.cd_cds
				    and esercizio 		= aObb.esercizio
				    and esercizio_originale	= aObb.esercizio_originale
				    and pg_obbligazione = aObb.pg_obbligazione) loop
		if CNRCTB048.getStatoRibaltabileScad(aEs,aScad) = 'Y' then
		-- escludo le scadenze non ribaltabili, per controlli precedenti
		-- dovrebbe esserci almeno una scadenza ribaltabile

		   CNRCTB048.creaScadObb(aObbNext,aScad,aObbScadNext,aEs,aUser,aTSNow);

		   posizione := posizione + 1;
		   i:= 0; -- progressivo dettaglio scadenza
		   for aDettScad in (select * from obbligazione_scad_voce
				     where cd_cds = aScad.cd_cds
				     and esercizio = aScad.esercizio
				     and esercizio_originale = aScad.esercizio_originale
				     and pg_obbligazione = aScad.pg_obbligazione
				     and pg_obbligazione_scadenzario = aScad.pg_obbligazione_scadenzario) loop
			   i := i+1;
			   -- verifico la mappatura per LdA
			   aLdA := cnrctb048.getLdA(aDettScad, aObb, aEs);
			   -- verifico la validità della LdA sul nuovo esercizio
         if aLdA.esercizio_inizio is null Then
            aErrmsn := 'L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' ha scadenze sulla linea di attivita'' '||aDettScad.cd_linea_attivita||' non associata a progetto o non valida nell''esercizio '||aEs||'.';
            ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
         elsif aLdA.esercizio_fine < aObbNext.ESERCIZIO_ORIGINALE then  -- non è valida
				    aErrmsn := 'L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' ha scadenze sulla linea di attivita'' '||aDettScad.cd_linea_attivita||' non valida nell''esercizio '||aObbNext.ESERCIZIO_ORIGINALE;
				    ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
			   end if;

			   aObbScadDettNext.CD_CENTRO_RESPONSABILITA := aLdA.CD_CENTRO_RESPONSABILITA;
			   aObbScadDettNext.CD_LINEA_ATTIVITA		 := aLdA.CD_LINEA_ATTIVITA;

         --Se attiva la nuova gestione pdgp verifico che sulla linea attività sia stato inserito il progetto nell'anno di
         --ribaltamento
         If recParametriCDS.fl_commessa_obbligatoria='Y' and aLdA.pg_progetto is null Then
            aErrmsn := 'L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' ha scadenza su gae '||aLdA.cd_centro_responsabilita||'/'||aLdA.cd_linea_attivita||' per cui non è stato indicato il progetto nell''anno contabile '||aEs||'.';
            ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
         End If;

				 --  controllo indicazione Cofog prima di procedere al ribaltamento
				 -- Non faccio il controllo per le Obbligazioni su partita di Giro e sugli Impegni ente
				 if aObb.cd_tipo_documento_cont not in (CNRCTB018.TI_DOC_IMP, CNRCTB018.TI_DOC_IMP_RES,CNRCTB018.TI_DOC_OBB_PGIRO, CNRCTB018.TI_DOC_OBB_PGIRO_RES) then
					 if recParametriCNR.LIVELLO_PDG_COFOG!=0 and aLdA.cd_cofog is null then
			         aErrmsn := 'L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' ha scadenza su gae '||aLdA.cd_centro_responsabilita||'/'||aLdA.cd_linea_attivita||' per cui non è stato indicato il cofog.';
			  			 ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
					 end if;
				 end if;
				 -- fine  06/11/2013 Rospuc
			   -- se non cambia imputazione finanziaria
			   if recParametriCNR.fl_nuovo_pdg='Y' Then
            aObbScadDettNext.CD_VOCE := aObbNext.CD_ELEMENTO_VOCE;
         Else
            If not cambiaImputFinImp and not cambiaImputFinObb then
  				   -- determino se capitolo voce_f è valido sul nuovo esercizio
	 			      begin
				   	    aVoce := CNRCTB048.getVoceF(aObb, aLdA, aDettscad, aEs);
				      exception when NO_DATA_FOUND then
				   	     aErrMsn := 'L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' ha scadenze il cui capitolo non è valido sul nuovo esercizio';
					      ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
				      end;
			     Elsif cambiaImputfinImp and aObb.fl_pgiro = 'N' and aObbNext.cd_tipo_documento_cont = CNRCTB018.TI_DOC_IMP_RES then
			   	   aVoce := aVoceF;
			     Elsif cambiaImputFinObb and aObb.fl_pgiro = 'Y' and aObbNext.cd_tipo_documento_cont = CNRCTB018.TI_DOC_IMP_RES then
				      begin
				   	    aVoce := CNRCTB048.getVoceF(aObb, aLdA, aEV, aDettScad, aEs);
				      exception when NO_DATA_FOUND then
				   	    aErrMsn := 'L''impegno '||CNRCTB035.GETDESC(aObb)||' ha scadenze il cui capitolo non è valido sul nuovo esercizio';
					      ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
				      end;
			      Else -- cambiaImputfinObb and cd_tipo_documento_cont = OBB_PGIRO
			   	    begin
				   	    aVoce := CNRCTB048.getVoceF(aObb, aLdA, aEV, aDettScad, aEs);
				      exception when NO_DATA_FOUND then
				   	    aErrMsn := 'L'''||cnrutil.getLabelObbligazioneMin()||' '||CNRCTB035.GETDESC(aObb)||' ha scadenze il cui capitolo finanziario non è valido sul nuovo esercizio';
					      ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
				      end;
			      End if;
			      aObbScadDettNext.CD_VOCE := aVoce.CD_VOCE;
         End If;

			   CNRCTB048.creaScadDettObb(aObbScadNext, aDettScad, aObbScadDettNext, aUser, aTSNow);

         if recParametriCNR.fl_nuovo_pdg='Y' Then
            aObbScadDettNext.TI_APPARTENENZA := 'D';
         end if;

			   -- per impegni, impegni residui (impegnoni - generano imp_res nell'esercizio successivo)
			   -- sovrascrivo l'im_voce con l'importo della scadenza
			   if aObbNext.CD_TIPO_DOCUMENTO_CONT = CNRCTB018.TI_DOC_IMP_RES then
			   	  aObbScadDettNext.IM_VOCE := aObbScadNext.IM_SCADENZA;
			   end if;

                        ListaObbScadVoceNext(i) := aObbScadDettNext;

			   -- se si genera un residuo nel nuovo esercizio, devo incrementare
			   -- l'importo stanziamento iniziale anno 1 per il capitolo finanziario
			   if recParametriCNR.fl_nuovo_pdg='N' and aObbNext.CD_TIPO_DOCUMENTO_CONT = CNRCTB018.TI_DOC_IMP_RES then
 				    begin
  				   	  select * into aSaldo
  					    from voce_f_saldi_cmp
      					where cd_cds 		 	    = aObbScadDettNext.cd_cds
      					  and esercizio 		    = aObbScadDettNext.esercizio
      					  and ti_appartenenza 	    = aObbScadDettNext.ti_appartenenza
      					  and ti_gestione	  	    = aObbScadDettNext.ti_gestione
      					  and cd_voce				= aObbScadDettNext.cd_voce
      					  and ti_competenza_residuo = CNRCTB054.TI_RESIDUI
      					for update nowait;
  				  exception when NO_DATA_FOUND then
  				   	  aErrMsn := 'Saldo residuo non trovato per voce finanziaria '||aObbScadDettNext.cd_voce||', gestione '||aObbScadDettNext.ti_gestione||', esercizio '||aObbScadDettNext.esercizio;
  					    ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
  				  end;
				    CNRCTB054.AGGIORNASTANZIAMENTORESIDUI(aSaldo,aObbScadDettNext.im_voce,aUser,aTSNow);
			   end if;
		   end loop; -- dettagli scadenze

		   if posizione = 1 then
		   	  -- inserisco 1! volta la testata
			  declare
			       isStornato number;
		   	  begin
Dbms_Output.put_line ('ins_obb '||aObbNext.cd_cds||' '||aObbNext.esercizio||' '||aObbNext.pg_obbligazione);
		   	  	   CNRCTB035.ins_OBBLIGAZIONE(aObbNext);
Dbms_Output.put_line ('dopo ins_obb');
			  exception when DUP_VAL_ON_INDEX then
			  -- documento ente già riportato e deriportato, ma non cancellato fisicamente
			  -- si effettua un aggiornamento dell'esistente, e non un inserimento

			  -- verifico che il documento residuo sia stornato (previsto al deriporto
			  -- nel caso di mancata cancellazione fisica)
			  	 select decode(stato_obbligazione,'S',1,0) into isStornato
				 from obbligazione
				 where cd_cds = aObbNext.cd_cds
				   and esercizio = aObbNext.esercizio
				   and esercizio_originale = aObbNext.esercizio_originale
				   and pg_obbligazione = aObbNext.pg_obbligazione;

			  	 if aObbNext.cd_tipo_documento_cont = CNRCTB018.TI_DOC_IMP_RES
				 	and isStornato = 1
				 then
				 	CNRCTB048.aggiornaImpNext(aObbNext);
					esisteImpGiaRiportato := true;
				 else -- non dovrebbe mai succedere
				   	  aErrMsn := 'Documento '||CNRCTB035.GETDESC(aObbNext)||' già esistente e attivo';
					  ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
				 end if;

			  end;
		   end if;

		   if esisteImpGiaRiportato then
		   	   CNRCTB048.aggiornaScadImpNext(aObbNext,aObbScadNext,posizione,ListaObbScadVoceNext,isControlloBloccante);
		   else -- non esiste imp res già riportato
		   	   CNRCTB035.CREASCADOBBLIGAZIONE(aObbNext,aObbScadNext,posizione,ListaObbScadVoceNext,isControlloBloccante);
		   end if;


		   -- aggiornamento dei documenti amministrativi collegati
		   if aObbScadNext.im_associato_doc_amm > 0 then
				CNRCTB048.aggiornaDocAmm(aScad, aObbScadNext,aUser, aTSNow);
		   end if;
Dbms_Output.put_line (' a 6');
		end if;
Dbms_Output.put_line (' a 6.5');
	end loop; -- scadenze
Dbms_Output.put_line (' a 7');
	-- Aggiorno la testata del documento come riportato
	update obbligazione
	set riportato = 'Y',
		duva = aTSNow,
		utuv = aUser,
		pg_ver_rec = pg_ver_rec + 1
	where cd_cds   	 	  = aObb.cd_cds
	  and esercizio 	  = aObb.esercizio
	  and esercizio_originale = aObb.esercizio_originale
	  and pg_obbligazione = aObb.pg_obbligazione;
Dbms_Output.put_line ('fine');
end;

procedure riportoAcc(aAcc in out accertamento%rowtype,aElementoVoce elemento_voce%rowtype,aUser varchar2,aTSNow date) is
aCdTipoDoc varchar2(10);
aAccNext accertamento%rowtype;
aAccScadNext accertamento_scadenzario%rowtype;
aAccDettScadNext accertamento_scad_voce%rowtype;
ListaAccScadVoceNext CNRCTB035.scadVoceListE;
posizione number:=0;
i number;
aLdA v_linea_attivita_valida%rowtype;
aEs number;
aErrMsn varchar2(4000);
aVoceF voce_f%rowtype;
aSaldo voce_f_saldi_cmp%rowtype;
aSaldocdrlinea voce_f_saldi_cdr_linea%rowtype;
recParametriCNR PARAMETRI_CNR%Rowtype;
begin
  aEs := aAcc.esercizio + 1;

  recParametriCNR := CNRUTL001.getRecParametriCnr(aEs);

	-- verifico lo stato dell'esercizio
	cnrctb048.CHECKESERCIZIO(aAcc.esercizio,aAcc.cd_cds);

	-- verifico se l'elemento voce, se specificato, è su pgiro
	if aElementoVoce.esercizio is not Null And
	   aElementoVoce.fl_partita_giro = 'Y' And
	   aAcc.fl_pgiro = 'N' Then
	   ibmerr001.RAISE_ERR_GENERICO('L''elemento voce specificato è su partita di giro, impossibile ribaltare');
	end if;

	if aElementoVoce.esercizio is not Null and aElementoVoce.fl_partita_giro = 'N' And aAcc.fl_pgiro = 'Y' Then
	   ibmerr001.RAISE_ERR_GENERICO('L''elemento voce specificato non è su partita di giro, impossibile ribaltare');
	end if;

	if aAcc.cd_tipo_documento_cont in (CNRCTB018.TI_DOC_ACC, CNRCTB018.TI_DOC_ACC_RES) then
	     -- accertamento, accertamento residuo (bilancio ente)
 	     aCdTipoDoc := CNRCTB018.TI_DOC_ACC_RES;
	elsif (aAcc.cd_tipo_documento_cont = CNRCTB018.TI_DOC_ACC_PLUR And aAcc.esercizio_competenza = aEs) then
	     -- accertamento pluriennale a competenza nel nuovo esercizio
	     aCdTipoDoc := CNRCTB018.TI_DOC_ACC;
	elsif (aAcc.cd_tipo_documento_cont = CNRCTB018.TI_DOC_ACC_PLUR And aAcc.esercizio_competenza > aEs) then
	     -- accertamento pluriennale a competenza nel nuovo esercizio
	     aCdTipoDoc := CNRCTB018.TI_DOC_ACC_PLUR;
	elsif aAcc.cd_tipo_documento_cont = CNRCTB018.TI_DOC_ACC_PGIRO_RES Then
	     aCdTipoDoc := CNRCTB018.TI_DOC_ACC_PGIRO_RES;
	else
 	     aErrMsn := 'Errore nella chiamata di CNRCTB046.riportoAcc(): documento non gestito ('||aAcc.cd_tipo_documento_cont||')';
	     ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
	end if;

	aAccNext.CD_TIPO_DOCUMENTO_CONT := aCdTipoDoc;

	if aElementoVoce.esercizio is null then
	  -- non c'è cambio di imputazione finanziaria
	  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.esercizio_originale := aAcc.esercizio;
	else
    aAccNext.TI_APPARTENENZA     :=aElementoVoce.TI_APPARTENENZA;
    aAccNext.TI_GESTIONE         :=aElementoVoce.TI_GESTIONE;
    aAccNext.CD_ELEMENTO_VOCE    :=aElementoVoce.CD_ELEMENTO_VOCE;
    aAccNext.esercizio_originale :=aAcc.esercizio;

    if recParametriCNR.fl_nuovo_pdg='Y' Then
      aAccNext.CD_VOCE := aElementoVoce.CD_ELEMENTO_VOCE;
    else
  	  begin
	     	select * into aVoceF
		    from voce_f
  		  where esercizio              = aEs
  		  and ti_appartenenza        = aElementoVoce.ti_appartenenza
  		  and ti_gestione            = aElementoVoce.ti_gestione
  		  and cd_titolo_capitolo     = aElementoVoce.cd_elemento_voce
  		  and cd_unita_organizzativa = aAcc.cd_uo_origine;

        aAccNext.CD_VOCE           :=aVoceF.cd_voce;
	    exception
        when NO_DATA_FOUND then
  	   	  aErrMsn := 'Capitolo finanziario non trovato in corrispondenza dell''elemento voce'||aElementoVoce.cd_elemento_voce||', appartenenza '||aElementoVoce.ti_appartenenza||', gestione '||aElementoVoce.ti_gestione||', esercizio'||aEs||', impossibile ribaltare';
    		  ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
	    end;
    end if;
	end if;

	CNRCTB048.creaTestataAcc(aAcc,aAccNext,aEs,aUser,aTSNow);

	-- se si genera un residuo nel nuovo esercizio, devo incrementare
	-- l'importo stanziamento iniziale anno 1 per il capitolo finanziario
	if recParametriCNR.fl_nuovo_pdg='N' and aAccNext.CD_TIPO_DOCUMENTO_CONT = CNRCTB018.TI_DOC_ACC_RES then
Dbms_Output.put_line ('7');
	   begin
	   		select * into aSaldo
			from voce_f_saldi_cmp
			where cd_cds 		 	    = aAccNext.cd_cds
			  and esercizio 		    = aAccNext.esercizio
			  and ti_appartenenza 	    = aAccNext.ti_appartenenza
			  and ti_gestione	  	    = aAccNext.ti_gestione
			  and cd_voce				= aAccNext.cd_voce
			  and ti_competenza_residuo = CNRCTB054.TI_RESIDUI
			for update nowait;
	   exception when NO_DATA_FOUND then
	   	    aErrMsn := 'Saldo residuo non trovato per voce finanziaria'||aAccNext.cd_voce||', gestione '||aAccNext.ti_gestione||' esercizio '||aAccNext.esercizio;
			ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
	   end;
Dbms_Output.put_line ('8');
	   CNRCTB054.AGGIORNASTANZIAMENTORESIDUI(aSaldo,aAccNext.im_accertamento,aUser,aTSNow);
Dbms_Output.put_line ('9');
	end if;

Dbms_Output.put_line ('10 '||aAcc.cd_cds||'/'||aAcc.esercizio||'/'||aAcc.pg_accertamento);
	for aScad in (select * from accertamento_scadenzario
			  	  where cd_cds 			= aAcc.cd_cds
				    and esercizio 		= aAcc.esercizio
				    and esercizio_originale	= aAcc.esercizio_originale
					and pg_accertamento = aAcc.pg_accertamento) loop
Dbms_Output.put_line ('11');
		if CNRCTB048.getStatoRibaltabileScad(aEs,aScad) = 'Y' then
Dbms_Output.put_line ('12');
		-- escludo le scadenze non ribaltabili, per controlli precedenti
		-- dovrebbe esserci almeno una scadenza ribaltabile
		   CNRCTB048.creaScadAcc(aAccNext,aScad,aAccScadNext,aEs,aUser,aTSNow);

		   posizione := posizione + 1;
		   i := 0; -- progressivo dettaglio scadenza
		   for aDettScad in (select * from accertamento_scad_voce
		   	   			 	 where cd_cds = aScad.cd_cds
							   and esercizio = aScad.esercizio
							   and esercizio_originale = aScad.esercizio_originale
							   and pg_accertamento = aScad.pg_accertamento
							   and pg_accertamento_scadenzario = aScad.pg_accertamento_scadenzario) loop
			   i := i+1;
			   -- verifico la mappatura per LdA
         aLdA := cnrctb048.getLdA(aDettScad, aAcc, aEs);
			   -- verifico la validità della LdA sul nuovo esercizio
         if aLdA.esercizio_inizio is null Then
            aErrmsn := 'L''accertamento '||CNRCTB035.GETDESC(aAcc)||' ha scadenze sulla linea di attivita'' '||aDettScad.cd_linea_attivita||' non associata a progetto o non valida nell''esercizio '||aEs||'.';
            ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
         elsif aLdA.esercizio_fine < aAccNext.esercizio_originale then  -- non è valida
  				  aErrmsn := 'L''accertamento '||CNRCTB035.GETDESC(aAcc)||' ha scadenze sulla linea di attivita'' '||aDettScad.cd_linea_attivita||' non valida nell''esercizio '||aAccNext.esercizio_originale;
				    ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
			   end if;
Dbms_Output.put_line ('13');
			   aAccDettScadNext.CD_CENTRO_RESPONSABILITA := aLdA.CD_CENTRO_RESPONSABILITA;
			   aAccDettScadNext.CD_LINEA_ATTIVITA		 := aLdA.CD_LINEA_ATTIVITA;
Dbms_Output.put_line ('13.a '||aAcc.cd_tipo_documento_cont||'/'||aDettScad.CD_CENTRO_RESPONSABILITA||
'/'||aDettScad.CD_LINEA_ATTIVITA);
			   -- verifico la validità della LdA per l'elemento voce
			   -- esclusi accertamenti residui 2003, con linea attività di sistema

-- ELIMINATO QUESTO FILTRO !!!! 23.01.2006

--If not (aAcc.cd_tipo_documento_cont = CNRCTB018.TI_DOC_ACC_RES and
--	aDettScad.CD_CENTRO_RESPONSABILITA = CNRCTB015.GETVAL01PERCHIAVE(CNRCTB035.LA_SPECIALE,CNRCTB035.LA_ENTRATA_ENTE) and
--        aDettScad.CD_LINEA_ATTIVITA = CNRCTB015.GETVAL02PERCHIAVE(CNRCTB035.LA_SPECIALE,CNRCTB035.LA_ENTRATA_ENTE)
--       ) Then

 If aAccNext.cd_tipo_documento_cont in (CNRCTB018.TI_DOC_ACC, CNRCTB018.TI_DOC_ACC_RES, CNRCTB018.TI_DOC_ACC_PLUR)
                and aAccNext.fl_pgiro = 'N' Then
					  declare
					  	  lCdNat char(1);
					  begin

					  	  select cd_natura into lCdNat
		  				  from ass_ev_ev
						  where esercizio 		 = aAccNext.esercizio
						    and ti_appartenenza  = aAccNext.ti_appartenenza
						    and ti_gestione	     = aAccNext.ti_gestione
						    and cd_elemento_voce = aAccNext.cd_elemento_voce
							and cd_natura		 = aLda.cd_natura;
					  exception when NO_DATA_FOUND then
				   	      aErrMsn := 'L''accertamento '||CNRCTB035.GETDESC(aAcc)||' ha dettagli di scadenze la cui linea di attività nel nuovo esercizio non ha natura compatibile con l''elemento voce';
					      ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
					  end;
				   end if;

--			   end if;


			   CNRCTB048.creaScadDettAcc(aAccScadNext,
			                             aDettScad,
			                             aAccDettScadNext,
			                             aUser,
			                             aTSNow);
			   ListaAccScadVoceNext(i) := aAccDettScadNext;

		   end loop; -- dettagli scadenza

		   if posizione = 1 then
		   	  -- inserisco 1! la testata e aggiorno i saldi
			  declare
			  	   isAnnullato number;
			  Begin
		   	  	   CNRCTB035.INS_ACCERTAMENTO(aAccNext);
			  exception when DUP_VAL_ON_INDEX then
			  -- documento ente già riportato e deriportato, ma non cancellato fisicamente
			  -- si effettua un aggiornamento dell'esistente, e non un inserimento

				   -- verifico se il residuo è annullato (previsto nel caso in cui
				   -- il deriporto non abbia effettuato la cancellazione fisica)
				   select decode(dt_cancellazione,null,0,1) into isAnnullato
				   from accertamento
				   where cd_cds 	     = aAccNext.cd_cds
				     and esercizio 		 = aAccNext.esercizio
				     and esercizio_originale	 = aAccNext.esercizio_originale
					 and pg_accertamento = aAccNext.pg_accertamento;

			  	   if aAccNext.cd_tipo_documento_cont = CNRCTB018.TI_DOC_ACC_RES
				      and isAnnullato = 1
				   then

					  -- aggiorno doc esistente
					  CNRCTB048.aggiornaAccNext(aAccNext);

					  -- resetto la posizione (ovvero numero della scadenza) al numero
					  -- massimo + 1 del pg_accertamento_scadenzario già esistente
					  select nvl((max(pg_accertamento_scadenzario) + 1),1) into posizione
					  from accertamento_scadenzario
					  where cd_cds 			= aAccNext.cd_cds
					    and esercizio 		= aAccNext.esercizio
				            and esercizio_originale	= aAccNext.esercizio_originale
						and pg_accertamento = aAccNext.pg_accertamento;
				   else -- non dovrebbe mai succedere
				   	  aErrMsn := 'Documento '||CNRCTB035.GETDESC(aAccNext)||' già esistente e attivo';
					  ibmerr001.RAISE_ERR_GENERICO(aErrMsn);
				   end if;
			  end;
        CNRCTB035.AGGIORNASALDODETTSCAD(aAccNext,aAccNext.im_accertamento,false, aUser,aTSNow);
		   end if;
                   -- L'aggiornamento viene eseguito all'interno della procedura VOCE_F_SALDI_CDR_LINEA M.S. 19/12/2005
		   CNRCTB035.CREASCADACCERTAMENTO(aAccNext,aAccScadNext,posizione,ListaAccScadVoceNext);

		   -- aggiornamento dei documenti amministrativi collegati alla scadenza
		   if aAccScadNext.im_associato_doc_amm > 0 then
		   	  CNRCTB048.aggiornaDocAmm(aScad,aAccScadNext,aUser,aTSNow);
		   end if;

		end if;
	end loop; -- scadenze

	-- aggiorno la testata del documento come riportato
	update accertamento
	set riportato  = 'Y',
		utuv	   = aUser,
		duva	   = aTSNow,
		pg_ver_rec = pg_ver_rec + 1
	where cd_cds   	      = aAcc.cd_cds
	  and esercizio	 	  = aAcc.esercizio
	  and esercizio_originale = aAcc.esercizio_originale
	  and pg_accertamento = aAcc.pg_accertamento;

end;

procedure riportoEsNextObb(aObb          in out obbligazione%rowtype,
                           aElementoVoce elemento_voce%rowtype,
                           aVoceF        voce_F%rowtype,
                           aUser         varchar2,
                           aTSNow        date) is
  evNew elemento_voce%rowtype;
begin
	-- lock del documento
	cnrctb035.LOCKDOCFULL(aObb);

  evNew := aElementoVoce;

  If evNew.esercizio is null then
     evNew := getElementoVoceNew(aObb);
  End If;

	-- verifico se il documento è ribaltabile
	CNRCTB048.checkRiportaEsNext(aObb, true);

	if aObb.cd_tipo_documento_cont In (CNRCTB018.TI_DOC_OBB_PGIRO, CNRCTB018.TI_DOC_OBB_PGIRO_RES) Then
    -- obbligazioni partite di giro bilancio cds
    riportoEsNextObbAccPGiro(aObb, Null, evNew, Null, aUser, aTSNow);
	else
  	-- impegni (pgiro e no pgiro) bilancio ente
	  riportoObb(aObb, evNew, aVoceF, aUser, aTSNow);
	end if;
End;

/* stani 02.01.2006 chiamata da job */

procedure riportoEsNextAcc(aAcc          in out accertamento%rowtype,
                           aElementoVoce elemento_voce%rowtype,
                           aUser         varchar2,
                           aTSNow        date) is
  evNew elemento_voce%rowtype;
begin
	-- lock del documento
	cnrctb035.LOCKDOCFULL(aAcc);

  evNew := aElementoVoce;

  If evNew.esercizio is null then
     evNew := getElementoVoceNew(aAcc);
  End If;

	-- verifico se il documento è ribaltabile
  CNRCTB048.checkRiportaEsNext(aAcc,true,true); -- controlla la validità della voce_f

	if aAcc.cd_tipo_documento_cont In (CNRCTB018.TI_DOC_ACC_PGIRO, CNRCTB018.TI_DOC_ACC_PGIRO_RES) then
  	-- accertamenti partite di giro bilancio cds
    riportoEsNextObbAccPGiro(Null, aAcc, Null, evNew, aUser, aTSNow);
  Else
	  -- accertamenti (pgiro e no pgiro) bilancio ente
  	riportoAcc(aAcc, evNew, aUser, aTSNow);
	end if;
End;

/* stani 02.01.2006 chiamata da job */

procedure riportoEsNextDocCont(aCds varchar2,aEs number, aEsOri number, aPg number, aTiGestione varchar2, aUser varchar2) is
aObb obbligazione%rowtype;
aAcc accertamento%rowtype;
evNew elemento_voce%rowtype;
aTSNow date;

begin
 aTSNow := sysdate;
 if aTiGestione = CNRCTB001.GESTIONE_ENTRATE then  -- accertamento
	aAcc.cd_cds := aCds;
	aAcc.esercizio := aEs;
	aAcc.esercizio_originale := aEsOri;
	aAcc.pg_accertamento := aPg;
	-- lock della risorsa
	CNRCTB035.LOCKDOCFULL(aAcc);
  evNew := getElementoVoceNew(aAcc);
  if evNew.ti_appartenenza=aAcc.ti_appartenenza and evNew.ti_gestione=aAcc.ti_gestione and
     evNew.cd_elemento_voce=aAcc.cd_elemento_voce Then
  	riportoEsNextAcc(aAcc, null, aUser, aTSNow);
  else
    riportoEsNextAcc(aAcc, evNew, aUser, aTSNow);
  end if;
 else -- obbligazione
	aObb.cd_cds := aCds;
	aObb.esercizio := aEs;
	aObb.esercizio_originale := aEsOri;
	aObb.pg_obbligazione := aPg;
	-- lock della risorsa
	CNRCTB035.LOCKDOCFULL(aObb);
  evNew := getElementoVoceNew(aObb);
  if evNew.ti_appartenenza=aObb.ti_appartenenza and evNew.ti_gestione=aObb.ti_gestione and
     evNew.cd_elemento_voce=aObb.cd_elemento_voce Then
	  riportoEsNextObb(aObb, null, null, aUser, aTSNow);
  else
    riportoEsNextObb(aObb, evNew, null, aUser, aTSNow);
  end if;
 end if;
end;

procedure deriportoEsNextDocCont(aCds varchar2,aEs number, aEsOri number, aPg number, aTiGestione varchar2, aUser varchar2) is
aObb obbligazione%rowtype;
aAcc accertamento%rowtype;
aTSNow date;
begin
	aTSNow := sysdate;
	if aTiGestione = CNRCTB001.GESTIONE_ENTRATE then  -- accertamento
		aAcc.cd_cds := aCds;
		aAcc.esercizio := aEs;
		aAcc.esercizio_originale := aEsOri;
		aAcc.pg_accertamento := aPg;

		-- lock della risorsa
		CNRCTB035.LOCKDOCFULL(aAcc);

		deriportoEsNextAcc(aAcc, aUser, aTSNow);

	else -- obbligazione
		aObb.cd_cds := aCds;
		aObb.esercizio := aEs;
		aObb.esercizio_originale := aEsOri;
		aObb.pg_obbligazione := aPg;

		-- lock della risorsa
		CNRCTB035.LOCKDOCFULL(aObb);

		deriportoEsNextObb(aObb, aUser, aTSNow);
	end if;
end;

 procedure ripPgiroCds(
  aObb IN OUT obbligazione%rowtype,
  aObbNew IN OUT obbligazione%rowtype,
  aTSNow date,
  aUser varchar2
 ) is
 begin
   ripPgiroCdsInt(aObb,aObbNew,null,aTSNow,aUser);
 end;


 procedure ripPgiroCds(
  aObb IN OUT obbligazione%rowtype,
  aAccNew IN OUT accertamento%rowtype,
  aTSNow date,
  aUser varchar2
 ) is
 begin
 ripPgiroCdsInt(aObb,aAccNew,null,aTSNow,aUser);
 end;

 procedure ripPgiroCds(
  aAcc IN OUT accertamento%rowtype,
  aAccNew IN OUT accertamento%rowtype,
  aTSNow date,
  aUser varchar2
 ) is
 begin
 ripPgiroCdsInt(aAcc, aAccNew, null, aTSNow, aUser);
 end;


 procedure ripPgiroCds(
  aAcc IN OUT accertamento%rowtype,
  aObbNew IN OUT obbligazione%rowtype,
  aTSNow date,
  aUser varchar2
 ) is
 begin
   ripPgiroCdsInt(aAcc,aObbNew,null,aTSNow,aUser);
 end;

 procedure annullaRipPgiroCds(
  aObbNew IN OUT obbligazione%rowtype,
  aTSNow date,
  aUser varchar2
 ) is
  aObb obbligazione%rowtype;
  aObbScad obbligazione_scadenzario%rowtype;
  aObbScadVoce obbligazione_scad_voce%rowtype;
  aAcc accertamento%rowtype;
  aAccScad accertamento_scadenzario%rowtype;
  aAccScadVoce accertamento_scad_voce%rowtype;
  aObbScadNew obbligazione_scadenzario%rowtype;
  aObbScadVoceNew obbligazione_scad_voce%rowtype;
  aAccNew accertamento%rowtype;
  aAccScadNew accertamento_scadenzario%rowtype;
  aAccScadVoceNew accertamento_scad_voce%rowtype;
  aAssPgiro ass_obb_acr_pgiro%rowtype;
 begin
  CNRCTB048.checkEsercizio(aObbNew.esercizio-1,aObbNew.cd_cds);
  CNRCTB035.getPgiroCds(aObbNew,aObbScadNew,aObbScadVoceNew,aAccNew,aAccScadNew,aAccScadVoceNew);
  begin
   -- Cerco la partita di giro in esercizio origine
   aObb.cd_cds:=aObbNew.cd_cds_ori_riporto;
   aObb.esercizio:=aObbNew.esercizio_ori_riporto;
   aObb.esercizio_originale:=aObbNew.esercizio_ori_ori_riporto;
   aObb.pg_obbligazione:=aObbNew.pg_obbligazione_ori_riporto;
   select * into aAssPgiro from ass_obb_acr_pgiro where
         cd_cds = aObbNew.cd_cds_ori_riporto
		  and esercizio = aObbNew.esercizio_ori_riporto
		  and esercizio_ori_obbligazione = aObbNew.esercizio_ori_ori_riporto
		  and pg_obbligazione = aObbNew.pg_obbligazione_ori_riporto
		  and ti_origine = CNRCTB001.GESTIONE_SPESE;
   -- E' partita di giro riportata completamente
   CNRCTB035.getPgiroCds(aObb,aObbScad,aObbScadVoce,aAcc,aAccScad,aAccScadVoce);
   update accertamento set
    riportato = 'N',
    pg_ver_rec=pg_ver_rec+1
   where
        cd_cds=aAcc.cd_cds
    and esercizio=aAcc.esercizio
    and esercizio_originale=aAcc.esercizio_originale
    and pg_accertamento=aAcc.pg_accertamento;
  exception when NO_DATA_FOUND then
   -- E' partita di giro riportata per parte
   CNRCTB035.getPgiroCdsInv(aObb,aObbScad,aObbScadVoce,aAcc,aAccScad,aAccScadVoce);
  end;
  update obbligazione set
   riportato = 'N',
   pg_ver_rec=pg_ver_rec+1
  where
       cd_cds=aObb.cd_cds
   and esercizio=aObb.esercizio
   and esercizio_originale=aObb.esercizio_originale
   and pg_obbligazione=aObb.pg_obbligazione;
  CNRCTB035.annullaObbligazione(aObbNew.cd_cds,aObbNew.esercizio,aObbNew.esercizio_originale,aObbNew.pg_obbligazione,aUser);
 end;

 procedure annullaRipPgiroCds(
  aAccNew IN OUT accertamento%rowtype,
  aTSNow date,
  aUser varchar2
 ) is
  aObb obbligazione%rowtype;
  aObbScad obbligazione_scadenzario%rowtype;
  aObbScadVoce obbligazione_scad_voce%rowtype;
  aAcc accertamento%rowtype;
  aAccScad accertamento_scadenzario%rowtype;
  aAccScadVoce accertamento_scad_voce%rowtype;
  aObbNew obbligazione%rowtype;
  aObbScadNew obbligazione_scadenzario%rowtype;
  aObbScadVoceNew obbligazione_scad_voce%rowtype;
  aAccScadNew accertamento_scadenzario%rowtype;
  aAccScadVoceNew accertamento_scad_voce%rowtype;
  aAssPgiro ass_obb_acr_pgiro%rowtype;
 begin
  CNRCTB048.checkEsercizio(aAccNew.esercizio-1,aAccNew.cd_cds);
  CNRCTB035.getPgiroCds(aAccNew,aAccScadNew,aAccScadVoceNew,aObbNew,aObbScadNew,aObbScadVoceNew);
  begin
   -- Cerco la partita di giro in esercizio origine
   aAcc.cd_cds:=aAccNew.cd_cds_ori_riporto;
   aAcc.esercizio:=aAccNew.esercizio_ori_riporto;
   aAcc.esercizio_originale:=aAccNew.esercizio_ori_ori_riporto;
   aAcc.pg_accertamento:=aAccNew.pg_accertamento_ori_riporto;
   select * into aAssPgiro from ass_obb_acr_pgiro where
          cd_cds = aAccNew.cd_cds_ori_riporto
		  and esercizio = aAccNew.esercizio_ori_riporto
		  and esercizio_ori_obbligazione = aAccNew.esercizio_ori_ori_riporto
		  and pg_obbligazione = aAccNew.pg_accertamento_ori_riporto
		  and ti_origine = CNRCTB001.GESTIONE_ENTRATE;
   -- E' partita di giro riportata completamente
   CNRCTB035.getPgiroCds(aAcc,aAccScad,aAccScadVoce,aObb,aObbScad,aObbScadVoce);
   update obbligazione set
    riportato = 'N',
    pg_ver_rec=pg_ver_rec+1
   where
        cd_cds=aObb.cd_cds
    and esercizio=aObb.esercizio
    and esercizio_originale=aObb.esercizio_originale
    and pg_obbligazione=aObb.pg_obbligazione;
  exception when NO_DATA_FOUND then
   -- E' partita di giro riportata per parte
   CNRCTB035.getPgiroCdsInv(aAcc,aAccScad,aAccScadVoce,aObb,aObbScad,aObbScadVoce);
  end;
  update accertamento set
   riportato = 'N',
   pg_ver_rec=pg_ver_rec+1
  where
       cd_cds=aAcc.cd_cds
   and esercizio=aAcc.esercizio
   and esercizio_originale=aAcc.esercizio_originale
   and pg_accertamento=aAcc.pg_accertamento;
  CNRCTB035.annullaAccertamento(aAccNew.cd_cds,aAccNew.esercizio,aAccNew.esercizio_originale,aAccNew.pg_accertamento,aUser);
 end;

  procedure cancellaFisicamente(aObbNew IN OUT obbligazione%rowtype,aUser varchar2, aTSNow date) is
  aAccNew accertamento%rowtype;
  aAccScadNew accertamento_scadenzario%rowtype;
  aAccSCadVoceNew accertamento_scad_voce%rowtype;
  aObbScadNew obbligazione_scadenzario%rowtype;
  aObbScadVoceNew obbligazione_scad_voce%rowtype;
 begin
  savepoint ELIMINADOCOBB;
  begin
   CNRCTB035.lockDoc(aObbNew);
   if aObbNew.fl_pgiro = 'Y' then
    if CNRCTB035.isAprePgiro(aObbNew) and not (aObbNew.cd_tipo_documento_cont = CNRCTB018.TI_DOC_IMP_RES) then
	 CNRCTB035.GETPGIROCDS(aObbNew,aObbScadNew,aObbScadVoceNew,aAccNew,aAccScadNew,aAccSCadVoceNew);
	 delete from ass_obb_acr_pgiro where
               cd_cds = aObbNew.cd_cds
 		   and esercizio = aObbNew.esercizio
 		   and esercizio_ori_obbligazione = aObbNew.esercizio_originale
 		   and pg_obbligazione = aObbNew.pg_obbligazione
	       and ti_origine = CNRCTB001.GESTIONE_SPESE;
     cancellaFisicamente(aAccNew,aUser,aTSNow);
    end if;
   end if;

   delete from obbligazione where
               cd_cds = aObbNew.cd_cds
		   and esercizio = aObbNew.esercizio
		   and esercizio_originale = aObbNew.esercizio_originale
		   and pg_obbligazione = aObbNew.pg_obbligazione;
   -- il trigger BD_OBBLIGAZIONE cancella in cascata i livelli inferiori
  exception

   when CNRCTB048.ERR_FK_VIOLATED then
    rollback to savepoint ELIMINADOCOBB;
	-- nel caso di impegni residui non basta che l'importo sia stato
	-- portato a zero, è necessario stornare il documento
	if aObbNew.cd_tipo_documento_cont = CNRCTB018.TI_DOC_IMP_RES then
		update obbligazione
		set stato_obbligazione = 'S',
			dt_cancellazione = trunc(aTSNow),
			utuv = aUser,
			duva = aTSNow,
			pg_ver_rec = pg_ver_rec + 1
		where cd_cds = aObbNew.cd_cds
		  and esercizio = aObbNew.esercizio
		  and esercizio_originale = aObbNew.esercizio_originale
		  and pg_obbligazione = aObbNew.pg_obbligazione;
	end if;

   when others then
    IBMERR001.RAISE_ERR_GENERICO('Errore in eliminazione fisica dell'' '||cnrutil.getLabelObbligazioneMin()||': '||CNRCTB035.getDesc(aObbNew));
  end;
 end;

 procedure cancellaFisicamente(aAccNew IN OUT accertamento%rowtype,aUser varchar2, aTSNow date) is
  aAccScadNew accertamento_scadenzario%rowtype;
  aAccSCadVoceNew accertamento_scad_voce%rowtype;
  aObbNew obbligazione%rowtype;
  aObbScadNew obbligazione_scadenzario%rowtype;
  aObbScadVoceNew obbligazione_scad_voce%rowtype;
 begin
  savepoint ELIMINADOCACC;
  begin
   CNRCTB035.lockDoc(aAccNew);
   if aAccNew.fl_pgiro = 'Y' then
    if CNRCTB035.isAprePgiro(aAccNew) and not (aAccNew.cd_tipo_documento_cont = CNRCTB018.TI_DOC_ACC_RES) then
	 CNRCTB035.GETPGIROCDS(aAccNew,aAccScadNew,aAccSCadVoceNew,aObbNew,aObbScadNew,aObbScadVoceNew);
	 delete from ass_obb_acr_pgiro where
               cd_cds = aAccNew.cd_cds
 		   and esercizio = aAccNew.esercizio
 		   and esercizio_ori_accertamento = aAccNew.esercizio_originale
 		   and pg_accertamento = aAccNew.pg_accertamento
	       and ti_origine = CNRCTB001.GESTIONE_ENTRATE;
     cancellaFisicamente(aObbNew,aUser,aTSNow);
    end if;
   end if;

   delete from accertamento where
              cd_cds = aAccNew.cd_cds
		   and esercizio = aAccNew.esercizio
		   and esercizio_originale = aAccNew.esercizio_originale
		   and pg_accertamento = aAccNew.pg_accertamento;
   -- il trigger BD_ACCERTAMENTO cancella in cascaca i livelli inferiori
  exception
   when CNRCTB048.ERR_FK_VIOLATED then
    rollback to savepoint ELIMINADOCACC;
	-- nel caso di accertamento residui non basta portare a zero
	-- l'importo, è necessario impostare la data di cancellazione
	if aAccNew.cd_tipo_documento_cont = CNRCTB018.TI_DOC_ACC_RES then
	   update accertamento
	   set dt_cancellazione = trunc(aTSNow),
	   	   utuv = aUser,
		   duva = aTSNow,
		   pg_ver_rec = pg_ver_rec + 1
	   where cd_cds = aAccNew.cd_cds
	     and esercizio = aAccNew.esercizio
	     and esercizio_originale = aAccNew.esercizio_originale
		 and pg_accertamento = aAccNew.pg_accertamento;
	end if;
   when others then
    IBMERR001.RAISE_ERR_GENERICO('Errore in eliminazione fisica dell'' accertamento: '||CNRCTB035.getDesc(aAccNew));
  end;
 end;

-- deriportoPGiroCds
--
-- Riporto dall'esercizio successivo di annotazioni su partita di giro tipo Entrata/Spesa
--
-- pre-post-name: documento contabile su partita di giro non valido
-- pre: il documento non è su partita di giro oppure non è valido, (v. CNRCTB035.GETPGIROCDS/CNRCTB035.getPgiroCdsInv)
-- post: viene sollevata un'eccezione
--
-- pre-post-name: documento riportato in nuovo esercizio non valido
-- pre: il documento collegato nel nuovo esercizio non esiste o esiste più di un documento nel nuovo esercizio
--	corrispondente al documento dato, (v. CNRCTB048.GETDOCRIPORTATO)
-- post: viene sollevata un'eccezione
--
-- pre-post-name: documento contabile collegato non valido
-- pre: il documento collegato nel nuovo esercizio non è su partita di giro oppure non è valido, (v. CNRCTB035.GETPGIROCDS)
-- post: viene sollevata un'eccezione
--
-- pre-post-name: annotazione su partita di giro non riportata o variata nell'esercizio successivo
-- pre: l'annotazione su partita di giro non risulta riportata o ha subito delle modifiche/variazioni
--	nell'esercizio successivo, (v. checkDeRiportaEsNext)
-- post: viene sollevata un'eccezione
--
-- pre-post-name: documento contabile associato a documento ammin. o parzialmente pagata
-- pre: il documento contabile dell'esercizio successivo, risulta essere associato a documento amministrativo
--	oppure è stato parzialmente pagato, (v. checkDeRiportaScadEsNext)
-- post: viene sollevata un'eccezione
--
-- pre-post-name: il documento contabile apre una partita di giro con controparte non riscontrata
-- pre: l'annotazione su partita di giro non risulta riportata o ha subito delle modifiche/variazioni
--	nell'esercizio successivo, (v. checkDeRiportaEsNext)
-- post: viene sollevata un'eccezione
--
-- pre: il documento contabile dell'esercizio successivo, risulta essere associato a documento amministrativo
--	oppure è stato parzialmente pagato, (v. checkDeRiportaScadEsNext)
-- post: viene sollevata un'eccezione
--
-- pre-post-name: cancellazione fisica del documento contabile
-- pre: la cancellazione fisica del documento contabile genera un errore, (v. cancellaFisicamente)
-- post: viene sollevata un'eccezione
--
-- pre-post-name: Riporto dall'esercizio successivo di annotazioni su partita di giro tipo Entrata/Spesa
-- pre: Nessun'altra precondizione verificata
-- post: aggiorna le annotazioni in parte entrate/spese annullando il riporto sull'esercizio successivo.
--	Vengono aggiornati i documenti amministrativi collegati (v. CNRCTB048.aggiornaDocAmm)
--
-- Parametri:
-- aAcc (aObb) -> il documento da riportare
-- aUser -> utente che effettua la modifica
-- aTSNow -> la data di sistema

Procedure deriportoPGiroCds(aObb in out obbligazione%rowtype, aUser varchar2, aTSNow date) is

 aObbScad obbligazione_scadenzario%rowtype;
 aObbScadVoce obbligazione_scad_voce%rowtype;
 aAcc accertamento%rowtype;
 aAccScad accertamento_scadenzario%rowtype;
 aAccScadVoce accertamento_scad_voce%rowtype;
 aObbNext obbligazione%rowtype;
 aObbScadNext obbligazione_scadenzario%rowtype;
 aObbScadVoceNext obbligazione_scad_voce%rowtype;
 aAccNext accertamento%rowtype;
 aAccScadNext accertamento_scadenzario%rowtype;
 aAccScadVoceNext accertamento_scad_voce%rowtype;
 aImriscontratoAcc number;
 aprePgiro boolean;
 begin

	aprePgiro := CNRCTB035.isAprePgiro(aObb);
	if aprePgiro then
	   CNRCTB035.GETPGIROCDS(aObb,aObbScad,aObbScadVoce,aAcc,aAccScad,aAccScadVoce);
	else
	   CNRCTB035.getPgiroCdsInv(aObb,aObbScad,aObbScadVoce,aAcc,aAccScad,aAccScadVoce);
	end if;

	-- possibili casi:
	-- 1. obb apre pgiro 2003 con acr non riscontrato => obb apre pgiro 2004
	-- 2. obb apre pgiro tronca 2003 => obb apre pgiro tronca 2004
	-- 3. obb apre pgiro 2003 con acr riscontrato => obb apre pgiro tronca 2004
	-- 4. obb chiude pgiro 2003 con acr riscontrato => obb apre pgiro tronca 2004

	aObbNext := CNRCTB048.GETDOCRIPORTATO(aObb);
	CNRCTB035.GETPGIROCDS(aObbNext,aObbScadNext,aObbScadVoceNext,aAccNext,aAccScadNext,aAccScadVoceNext);

	aImriscontratoAcc := getIm_riscontrato(aAcc.esercizio,aAcc.cd_cds,aAcc.esercizio_originale,aAcc.pg_accertamento,aAcc.ti_gestione);

	-- verifiche per il riporta indietro
	CNRCTB048.checkDeRiportaEsNext(aObb,aObbNext);
	CNRCTB048.checkDeRiportaScadEsNext(aObb,aObbScad,aObbNext,aObbScadNext);

	if aprePgiro And aAcc.dt_cancellazione is Null And aImriscontratoAcc = 0 Then
	-- caso 1.
	   CNRCTB048.checkDeRiportaEsNext(aAcc,aAccNext);
	   CNRCTB048.checkDeRiportaScadEsNext(aAcc,aAccScad,aAccNext,aAccScadNext);
	end if;

	-- aggiornamento dei documenti amministrativi collegati
	if aObbScadNext.im_associato_doc_amm > 0 then
	   CNRCTB048.aggiornaDocAmm(aObbScadNext, aObbScad, aUser, aTSNow);
	end if;

	if aprePgiro
	   and aAcc.dt_cancellazione is null
	   and aImriscontratoAcc = 0
	   and aAccScadNext.im_associato_doc_amm > 0
	then
  	   CNRCTB048.aggiornaDocAmm(aAccScadNext,aAccScad,aUser,aTSNow);
	end if;

	update obbligazione_scadenzario
	set    im_associato_doc_amm = 0,
	       pg_ver_rec = pg_ver_rec +1
	where  cd_cds = aObbScadNext.cd_cds And
	       esercizio = aObbScadNext.esercizio And
	       esercizio_originale = aObbScadNext.esercizio_originale And
	       pg_obbligazione = aObbscadNext.pg_obbligazione And
	       pg_obbligazione_scadenzario = aObbScadNext.pg_obbligazione_scadenzario;

	update accertamento_scadenzario
	set    im_associato_doc_amm = 0,
	       pg_ver_rec = pg_ver_rec +1
	where  cd_cds = aAccScadNext.cd_cds And
	       esercizio = aAccScadNext.esercizio And
	       esercizio_originale = aAccScadNext.esercizio_originale And
	       pg_accertamento = aAccScadNext.pg_accertamento And
	       pg_accertamento_scadenzario = aAccScadNext.pg_accertamento_scadenzario;

	cnrctb035.ANNULLAOBBLIGAZIONE(aObbNext.cd_cds, aObbNext.esercizio,aObbNext.esercizio_originale,aObbNext.pg_obbligazione,aUser);

	cancellaFisicamente(aObbNext,aUser,aTSNOw);

	update obbligazione
	set    riportato = 'N',
	       duva = aTSNow,
	       utuv = aUser,
	       pg_ver_rec = pg_ver_rec + 1
	where  cd_cds   	   = aObb.cd_cds And
	       esercizio 	   = aObb.esercizio And
	       esercizio_originale = aObb.esercizio_originale And
	       pg_obbligazione     = aObb.pg_obbligazione;

	update accertamento
	set    riportato = 'N',
	       duva = aTSNow,
	       utuv = aUser,
	       pg_ver_rec = pg_ver_rec + 1
	where  cd_cds              = aAcc.cd_cds And
	       esercizio           = aAcc.esercizio And
	       esercizio_originale = aAcc.esercizio_originale And
	       pg_accertamento     = aAcc.pg_accertamento;
 End;

 procedure deriportoPGiroCds(aAcc in out accertamento%rowtype, aUser varchar2, aTSNow date) is
 aObb obbligazione%rowtype;
 aObbScad obbligazione_scadenzario%rowtype;
 aObbScadVoce obbligazione_scad_voce%rowtype;
 aAccScad accertamento_scadenzario%rowtype;
 aAccScadVoce accertamento_scad_voce%rowtype;
 aObbNext obbligazione%rowtype;
 aObbScadNext obbligazione_scadenzario%rowtype;
 aObbScadVoceNext obbligazione_scad_voce%rowtype;
 aAccNext accertamento%rowtype;
 aAccScadNext accertamento_scadenzario%rowtype;
 aAccScadVoceNext accertamento_scad_voce%rowtype;
 aImRiscontratoObb number;
 aprePgiro boolean;
 begin

	aprePgiro := CNRCTB035.isAprePgiro(aAcc);
	if aprePgiro then
	   CNRCTB035.GETPGIROCDS(aAcc,aAccScad,aAccScadVoce,aObb,aObbScad,aObbScadVoce);
	else
	   CNRCTB035.getPgiroCdsInv(aAcc,aAccScad,aAccScadVoce,aObb,aObbScad,aObbScadVoce);
	end if;

	-- possibili casi:
	-- 1. acr apre pgiro 2003 con obb non riscontrato => acr apre pgiro 2004
	-- 2. acr apre pgiro tronca 2003 => acr apre pgiro tronca 2004
	-- 3. acr apre pgiro 2003 con obb riscontrata => acr apre pgiro tronca 2004
	-- 4. acr chiude pgiro 2003 con obb riscontrato => acr apre pgiro tronca 2004
	aAccNext := CNRCTB048.GETDOCRIPORTATO(aAcc);
	CNRCTB035.GETPGIROCDS(aAccNext,aAccScadNext,aAccScadVoceNext,aObbNext,aObbScadNext,aObbScadVoceNext);

	aImRiscontratoObb := getIm_riscontrato(aObb.esercizio,aObb.cd_cds,aObb.esercizio_originale,aObb.pg_obbligazione,aObb.ti_gestione);

	-- verifiche per il riporta indietro
	CNRCTB048.checkDeRiportaEsNext(aAcc,aAccNext);
	CNRCTB048.checkDeRiportaScadEsNext(aAcc,aAccScad,aAccNext,aAccScadNext);
	if aprePgiro
	   and aObb.dt_cancellazione is null
	   and aImRiscontratoObb = 0
	then
	-- caso 1.
	   CNRCTB048.checkDeRiportaEsNext(aObb,aObbNext);
	   CNRCTB048.checkDeRiportaScadEsNext(aObb,aObbScad,aObbNext,aObbScadNext);
	end if;

	-- aggiornamento dei documenti amministrativi collegati
	if aAccScadNext.im_associato_doc_amm > 0 then
	   CNRCTB048.aggiornaDocAmm(aAccScadNext, aAccScad, aUser, aTSNow);
	end if;
	if aprePgiro
	   and aObb.dt_cancellazione is null
	   and aImRiscontratoObb = 0
	   and aObbScadNext.im_associato_doc_amm > 0
	then
		CNRCTB048.aggiornaDocAmm(aObbScadNext,aObbScad,aUser,aTSNow);
	end if;

	update accertamento_scadenzario
	set im_associato_doc_amm = 0,
		pg_ver_rec = pg_ver_rec +1
	where cd_cds = aAccScadNext.cd_cds
	  and esercizio = aAccScadNext.esercizio
	  and esercizio_originale = aAccScadNext.esercizio_originale
	  and pg_accertamento = aAccScadNext.pg_accertamento
	  and pg_accertamento_scadenzario = aAccScadNext.pg_accertamento_scadenzario;

	update obbligazione_scadenzario
	set im_associato_doc_amm = 0,
		pg_ver_rec = pg_ver_rec +1
	where cd_cds = aObbScadNext.cd_cds
	  and esercizio = aObbScadNext.esercizio
	  and esercizio_originale = aObbScadNext.esercizio_originale
	  and pg_obbligazione = aObbscadNext.pg_obbligazione
	  and pg_obbligazione_scadenzario = aObbScadNext.pg_obbligazione_scadenzario;

	cnrctb035.ANNULLAACCERTAMENTO(aAccNext.cd_cds, aAccNext.esercizio,aAccNext.esercizio_originale,aAccNext.pg_accertamento,aUser);

	cancellaFisicamente(aAccNext,aUser,aTSNow);

	update accertamento
	set riportato = 'N',
		duva = aTSNow,
		utuv = aUser,
		pg_ver_rec = pg_ver_rec + 1
	where cd_cds   	 	  = aAcc.cd_cds
	  and esercizio 	  = aAcc.esercizio
	  and esercizio_originale = aAcc.esercizio_originale
	  and pg_accertamento = aAcc.pg_accertamento;

	update obbligazione
	set riportato = 'N',
		duva = aTSNow,
		utuv = aUser,
		pg_ver_rec = pg_ver_rec + 1
	where cd_cds   	 	  = aObb.cd_cds
	  and esercizio 	  = aObb.esercizio
	  and esercizio_originale = aObb.esercizio_originale
	  and pg_obbligazione = aObb.pg_obbligazione;

 end;

 procedure deriportoEsNextObb(aObb in out obbligazione%rowtype, aUser varchar2, aTSNow date) is
  aObbNext obbligazione%rowtype;
  aObbScad obbligazione_scadenzario%rowtype;
  recParametriCNR PARAMETRI_CNR%Rowtype;
 begin
  CNRCTB035.lockDoc(aObb);

	-- verifico lo stato dell'esercizio
	cnrctb048.CHECKESERCIZIO(aObb.esercizio,aObb.cd_cds);

	if aObb.fl_pgiro = 'Y'  and not (aObb.cd_tipo_documento_cont in (CNRCTB018.TI_DOC_IMP_RES, CNRCTB018.TI_DOC_IMP)) then
	    deriportoPGiroCds(aObb,aUser,aTSNow);
	else
		aObbNext := CNRCTB048.getDocRiportato(aObb);

    recParametriCNR := CNRUTL001.getRecParametriCnr(aObbNext.esercizio);

		CNRCTB035.lockDocFull(aObbNext);
		-- controlli per il deriporto
		CNRCTB048.checkDeRiportaEsNext(aObb,aObbNext);

		for aScadNext in (select * from obbligazione_scadenzario
		                  Where cd_cds 	= aObbNext.cd_cds   And
		                        esercizio = aObbNext.esercizio And
		                        esercizio_originale = aObbNext.esercizio_originale And
					pg_obbligazione = aObbNext.pg_obbligazione
					for update nowait) loop
		       aObbScad:=CNRCTB048.getOldScad(aObbNext,aScadNext);

		       -- Controlli per il deriporto
	           CNRCTB048.checkDeRiportaScadEsNext(aObb,aObbScad,aObbNext,aScadNext);

			   -- aggiornamento dei documenti amministrativi collegati
			   if aScadNext.im_associato_doc_amm > 0 then
		 		CNRCTB048.aggiornaDocAmm(aScadNext, aObbScad, aUser, aTSNow);
			   end if;
	           update obbligazione_scadenzario set
	                     im_associato_doc_amm = 0,
						 pg_ver_rec=pg_ver_rec+1
	           where
			             cd_cds = aScadNext.cd_cds
					 and esercizio = aScadNext.esercizio
					 and esercizio_originale = aScadNext.esercizio_originale
					 and pg_obbligazione = aScadNext.pg_obbligazione
					 and pg_obbligazione_scadenzario = aScadNext.pg_obbligazione_scadenzario;
			   -- ciclo sui dettagli per decrementare l'importo stanziamento iniziale nei saldi
			   if recParametriCNR.fl_nuovo_pdg='N' and aObbNext.CD_TIPO_DOCUMENTO_CONT = CNRCTB018.TI_DOC_IMP_RES then
			     for aDettScadNext in (select * from obbligazione_scad_voce
			   	   				     where cd_cds = aScadNext.cd_cds
									   and esercizio = aScadNext.esercizio
									   and esercizio_originale = aScadNext.esercizio_originale
									   and pg_obbligazione = aScadNext.pg_obbligazione
									   and pg_obbligazione_scadenzario = aScadNext.pg_obbligazione_scadenzario) loop
				   declare
				      aLSaldo voce_f_saldi_cmp%rowtype;
				   begin
				   		select * into aLSaldo
						from voce_f_saldi_cmp
						where cd_cds 		 	    = aDettScadNext.cd_cds
						  and esercizio 		    = aDettScadNext.esercizio
						  and ti_appartenenza 	    = aDettScadNext.ti_appartenenza
						  and ti_gestione	  	    = aDettScadNext.ti_gestione
						  and cd_voce				= aDettScadNext.cd_voce
						  and ti_competenza_residuo = CNRCTB054.TI_RESIDUI
						for update nowait;
						CNRCTB054.AGGIORNASTANZIAMENTORESIDUI(aLSaldo,0-aDettScadNext.im_voce,aUser,aTSNow);
				   exception when NO_DATA_FOUND then
						ibmerr001.RAISE_ERR_GENERICO('Saldo residuo non trovato per voce finanziaria'||aDettScadNext.cd_voce||', gestione '||aDettScadNext.ti_gestione||', esercizio'||aDettScadNext.esercizio);
				   end;
			     end loop; -- dettagli scadenze
			   end if;
		end loop; -- scadenze
	    CNRCTB035.ANNULLAOBBLIGAZIONE(aObbNext.cd_cds,aObbNext.esercizio,aObbNext.esercizio_originale,aObbNext.pg_obbligazione,aUser);

		-- Aggiorno la testata del documento come non riportato
		update obbligazione
		set riportato = 'N',
			duva = aTSNow,
			utuv = aUser,
			pg_ver_rec = pg_ver_rec + 1
		where cd_cds   	 	  = aObb.cd_cds
		  and esercizio 	  = aObb.esercizio
		  and esercizio_originale = aObb.esercizio_originale
		  and pg_obbligazione = aObb.pg_obbligazione;

	    -- Cerca di eliminare fisicamente il documento
		-- Se non riesce comunque il documento è stato cancellato logicamente
	    cancellaFisicamente(aObbNext,aUser,aTSNow);
	end if;
 end;


 procedure deriportoEsNextAcc(aAcc in out accertamento%rowtype, aUser varchar2, aTSNow date) is
  aAccNext accertamento%rowtype;
  aAccScad accertamento_scadenzario%rowtype;
  recParametriCNR PARAMETRI_CNR%Rowtype;
 begin
    CNRCTB035.lockDoc(aAcc);

	-- verifico lo stato dell'esercizio
	cnrctb048.CHECKESERCIZIO(aAcc.esercizio,aAcc.cd_cds);

	if aAcc.fl_pgiro = 'Y'  and not (aAcc.cd_tipo_documento_cont in (CNRCTB018.TI_DOC_ACC_RES, CNRCTB018.TI_DOC_ACC)) then
	   deriportoPGiroCds(aAcc,aUser,aTSNow);
	else
		aAccNext:=CNRCTB048.getDocRiportato(aAcc);

    recParametriCNR := CNRUTL001.getRecParametriCnr(aAccNext.esercizio);

		CNRCTB035.lockDocFull(aAccNext);
		-- Controlli per il deriporto
	    CNRCTB048.checkDeRiportaEsNext(aAcc,aAccNext);

		for aScadNext in (select * from accertamento_scadenzario where
		                    cd_cds 			= aAccNext.cd_cds
					    and esercizio 		= aAccNext.esercizio
					    and esercizio_originale = aAccNext.esercizio_originale
						and pg_accertamento = aAccNext.pg_accertamento
					    for update nowait
					 ) loop
	           aAccScad:=CNRCTB048.getOldScad(aAccNext,aScadNext);

		       -- Controlli per il deriporto
	           CNRCTB048.checkDeRiportaScadEsNext(aAcc,aAccScad,aAccNext,aScadNext);

			   -- aggiornamento dei documenti amministrativi collegati
			   if aScadNext.im_associato_doc_amm > 0 then
		 		CNRCTB048.aggiornaDocAmm(aScadNext, aAccScad, aUser, aTSNow);
			   end if;

	           update accertamento_scadenzario set
	                     im_associato_doc_amm = 0,
						 pg_ver_rec=pg_ver_rec+1
	           where
			             cd_cds = aScadNext.cd_cds
					 and esercizio = aScadNext.esercizio
					 and esercizio_originale = aScadNext.esercizio_originale
					 and pg_accertamento = aScadNext.pg_accertamento
					 and pg_accertamento_scadenzario = aScadNext.pg_accertamento_scadenzario;
		end loop; -- scadenze
	    CNRCTB035.ANNULLAaccertamento(aAccNext.cd_cds,aAccNext.esercizio,aAccNext.esercizio_originale,aAccNext.pg_accertamento,aUser);

		-- Se è un accertamento residuo, decremento lo stanziamento iniziale
		-- del saldo
		if recParametriCNR.fl_nuovo_pdg='N' and aAccNext.CD_TIPO_DOCUMENTO_CONT = CNRCTB018.TI_DOC_ACC_RES then
		   declare
		   	  lSaldo voce_f_saldi_cmp%rowtype;
		   begin
		   		select * into lSaldo
				from voce_f_saldi_cmp
				where cd_cds 		 	    = aAccNext.cd_cds
				  and esercizio 		    = aAccNext.esercizio
				  and ti_appartenenza 	    = aAccNext.ti_appartenenza
				  and ti_gestione	  	    = aAccNext.ti_gestione
				  and cd_voce				= aAccNext.cd_voce
				  and ti_competenza_residuo = CNRCTB054.TI_RESIDUI;
				CNRCTB054.AGGIORNASTANZIAMENTORESIDUI(lSaldo,0-aAccNext.im_accertamento,aUser,aTSNow);
		   exception when NO_DATA_FOUND then
				ibmerr001.RAISE_ERR_GENERICO('Saldo non trovato per voce finanziaria'||aAccNext.cd_voce||', gestione '||aAccNext.ti_gestione||', esercizio'||aAccNext.esercizio);
		   end;
		end if;

		-- Aggiorno la testata del documento come riportato
		update accertamento
		set riportato = 'N',
			duva = aTSNow,
			utuv = aUser,
			pg_ver_rec = pg_ver_rec + 1
		where cd_cds   	 	  = aAcc.cd_cds
		  and esercizio 	  = aAcc.esercizio
		  and esercizio_originale = aAcc.esercizio_originale
		  and pg_accertamento = aAcc.pg_accertamento;

	    -- Cerca di eliminare fisicamente il documento
		-- Se non riesce comunque il documento è stato cancellato logicamente
	    cancellaFisicamente(aAccNext,aUser,aTSNow);
	end if;

 end;

end;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy