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

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

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

  CREATE OR REPLACE PACKAGE BODY "CNRCTB030" is
 function getDescObbligazione(aObbScad obbligazione_scadenzario%rowtype) return varchar2 is
 begin
  return cnrutil.getLabelObbligazioneMin()||' n.'||aObbScad.pg_obbligazione||' cds:'||aObbSCad.cd_cds||' es:'||aObbScad.esercizio||' esOri:'||aObbScad.esercizio_originale;
 End;

 procedure adeguaObbSV(aObbScad obbligazione_scadenzario%rowtype,aNewImp number,aUser varchar2) is
  aTSNow date;
  aScadVoce obbligazione_scad_voce%rowtype;
  aObb obbligazione%rowtype;
 begin
  aTSNow:=sysdate;
  -- Verifico che la scadenza abbia SOLO un dettaglio scad voce
  begin
   select * into aScadVoce from obbligazione_scad_voce where
           cd_cds = aObbScad.cd_cds
       and esercizio = aObbScad.esercizio
       and esercizio_originale = aObbScad.esercizio_originale
       and pg_obbligazione = aObbScad.pg_obbligazione
       and pg_obbligazione_scadenzario = aObbScad.pg_obbligazione_scadenzario
   for update nowait;
  exception
   when TOO_MANY_ROWS  then
    IBMERR001.RAISE_ERR_GENERICO('L'''||getDescObbligazione(aObbScad)||' ha scadenze con più di un dettaglio analitico. Funzione non supportata');
   when NO_DATA_FOUND  then
    IBMERR001.RAISE_ERR_GENERICO('Nessuna scadenza analitica trovata per '||getDescObbligazione(aObbScad));
  end;
  -- estraggo la testata dell'obbligazione per aggiornare saldi
  aObb.cd_cds := aObbScad.cd_cds;
  aObb.esercizio := aObbScad.esercizio;
  aObb.esercizio_originale := aObbScad.esercizio_originale;
  aObb.pg_obbligazione := aObbScad.pg_obbligazione;
  CNRCTB035.LOCKDOC(aObb);
  -- L'aggiornamento viene eseguito all'interno della procedura VOCE_F_SALDI_CDR_LINEA M.S. 19/12/2005
  CNRCTB035.aggiornaSaldoDettScad(aObb,aScadVoce, aNewImp-aObbScad.im_scadenza,false,aUser,aTSNow);

  update obbligazione set
   im_obbligazione = im_obbligazione - aObbScad.im_scadenza + aNewImp,
   utuv=aUser,
   duva=aTSNow,
   pg_ver_rec=pg_ver_rec+1
  Where cd_cds = aObbScad.cd_cds
    and esercizio = aObbScad.esercizio
    and esercizio_originale = aObbScad.esercizio_originale
    and pg_obbligazione = aObbScad.pg_obbligazione;

  update obbligazione_scadenzario set
   im_scadenza = aNewImp,
   utuv=aUser,
   duva=aTSNow,
   pg_ver_rec=pg_ver_rec+1
  Where cd_cds = aObbScad.cd_cds
    and esercizio = aObbScad.esercizio
    and esercizio_originale = aObbScad.esercizio_originale
    and pg_obbligazione = aObbScad.pg_obbligazione
    and pg_obbligazione_scadenzario = aObbScad.pg_obbligazione_scadenzario;

  update obbligazione_scad_voce set
   im_voce = aNewImp,
   utuv=aUser,
   duva=aTSNow,
   pg_ver_rec=pg_ver_rec+1
  Where cd_cds = aObbScad.cd_cds
    and esercizio = aObbScad.esercizio
    and esercizio_originale = aObbScad.esercizio_originale
    and pg_obbligazione = aObbScad.pg_obbligazione
    and pg_obbligazione_scadenzario = aObbScad.pg_obbligazione_scadenzario;
 End;

 procedure adeguaObbScadSuccSV(aObbScad obbligazione_scadenzario%rowtype,aNextPgObbScad number,aNewImp number,aUser varchar2) is
  aNextScad obbligazione_scadenzario%rowtype;
  aTSNow date;
  aTotScadVoce number;
  aLastPg number;
 begin

  If aNewImp = aObbScad.im_scadenza Then --Scadenza con importo già uguale a quello richiesto
    return;
  end if;

  aTSNow:=sysdate;
  aTotScadVoce:=0;

  -- Leggo la scadenza su cui spostare le somme e se non esiste la creo
  begin
    select * into aNextScad from obbligazione_scadenzario where
           cd_cds = aObbScad.cd_cds
       and esercizio = aObbScad.esercizio
       and esercizio_originale = aObbScad.esercizio_originale
       and pg_obbligazione = aObbScad.pg_obbligazione
       and pg_obbligazione_scadenzario = aNextPgObbScad;
  exception
    when NO_DATA_FOUND then
      aNextScad.CD_CDS := aObbScad.CD_CDS;
      aNextScad.ESERCIZIO := aObbScad.ESERCIZIO;
      aNextScad.ESERCIZIO_ORIGINALE := aObbScad.ESERCIZIO_ORIGINALE;
      aNextScad.PG_OBBLIGAZIONE := aObbScad.PG_OBBLIGAZIONE;
      aNextScad.PG_OBBLIGAZIONE_SCADENZARIO := aNextPgObbScad;

      if aObbScad.DS_SCADENZA='gennaio' and aNextPgObbScad=2 Then
        aNextScad.DT_SCADENZA := to_date('25/02/'||aObbScad.esercizio, 'dd/mm/yyyy');
        aNextScad.DS_SCADENZA := 'febbraio';
      elsif aObbScad.DS_SCADENZA='febbraio' and aNextPgObbScad=3 Then
        aNextScad.DT_SCADENZA := to_date('25/03/'||aObbScad.esercizio, 'dd/mm/yyyy');
        aNextScad.DS_SCADENZA := 'marzo';
      elsif aObbScad.DS_SCADENZA='marzo' and aNextPgObbScad=4 Then
        aNextScad.DT_SCADENZA := to_date('25/04/'||aObbScad.esercizio, 'dd/mm/yyyy');
        aNextScad.DS_SCADENZA := 'aprile';
      elsif aObbScad.DS_SCADENZA='aprile' and aNextPgObbScad=5 Then
        aNextScad.DT_SCADENZA := to_date('25/05/'||aObbScad.esercizio, 'dd/mm/yyyy');
        aNextScad.DS_SCADENZA := 'maggio';
      elsif aObbScad.DS_SCADENZA='maggio' and aNextPgObbScad=6 Then
        aNextScad.DT_SCADENZA := to_date('25/06/'||aObbScad.esercizio, 'dd/mm/yyyy');
        aNextScad.DS_SCADENZA := 'giugno';
      elsif aObbScad.DS_SCADENZA='giugno' and aNextPgObbScad=7 Then
        aNextScad.DT_SCADENZA := to_date('25/07/'||aObbScad.esercizio, 'dd/mm/yyyy');
        aNextScad.DS_SCADENZA := 'luglio';
      elsif aObbScad.DS_SCADENZA='luglio' and aNextPgObbScad=8 Then
        aNextScad.DT_SCADENZA := to_date('25/08/'||aObbScad.esercizio, 'dd/mm/yyyy');
        aNextScad.DS_SCADENZA := 'agosto';
      elsif aObbScad.DS_SCADENZA='agosto' and aNextPgObbScad=9 Then
        aNextScad.DT_SCADENZA := to_date('25/09/'||aObbScad.esercizio, 'dd/mm/yyyy');
        aNextScad.DS_SCADENZA := 'settembre';
      elsif aObbScad.DS_SCADENZA='settembre' and aNextPgObbScad=10 Then
        aNextScad.DT_SCADENZA := to_date('25/10/'||aObbScad.esercizio, 'dd/mm/yyyy');
        aNextScad.DS_SCADENZA := 'ottobre';
      elsif aObbScad.DS_SCADENZA='ottobre' and aNextPgObbScad=11 Then
        aNextScad.DT_SCADENZA := to_date('25/11/'||aObbScad.esercizio, 'dd/mm/yyyy');
        aNextScad.DS_SCADENZA := 'novembre';
      elsif aObbScad.DS_SCADENZA='novembre' and aNextPgObbScad=12 Then
        aNextScad.DT_SCADENZA := to_date('15/12/'||aObbScad.esercizio, 'dd/mm/yyyy');
        aNextScad.DS_SCADENZA := 'tredicesima';
      elsif aObbScad.DS_SCADENZA='tredicesima' and aNextPgObbScad=13 Then
        aNextScad.DT_SCADENZA := to_date('25/12/'||aObbScad.esercizio, 'dd/mm/yyyy');
        aNextScad.DS_SCADENZA := 'dicembre';
      elsif aObbScad.DS_SCADENZA='dicembre' and aNextPgObbScad=14 Then
        aNextScad.DT_SCADENZA := to_date('31/12/'||aObbScad.esercizio, 'dd/mm/yyyy');
        aNextScad.DS_SCADENZA := 'residuo';
      elsif aNextPgObbScad=15 Then
        aNextScad.DT_SCADENZA := to_date('30/11/'||aObbScad.esercizio, 'dd/mm/yyyy');
        aNextScad.DS_SCADENZA := 'recupero addizionali reg/com';
      else
        aNextScad.DT_SCADENZA := aObbScad.DT_SCADENZA;
        aNextScad.DS_SCADENZA := aObbScad.DS_SCADENZA;
      end if;

      aNextScad.IM_SCADENZA := 0;
      aNextScad.IM_ASSOCIATO_DOC_AMM := 0;
      aNextScad.IM_ASSOCIATO_DOC_CONTABILE := 0;
      aNextScad.DACR := aTSNow;
      aNextScad.UTCR := aUser;
      aNextScad.DUVA := aTSNow;
      aNextScad.UTUV := aUser;
      aNextScad.PG_VER_REC := 0;

      cnrctb035.ins_OBBLIGAZIONE_SCADENZARIO(aNextScad);
  end;

  if aNextScad.im_scadenza - (aNewImp - aObbScad.im_scadenza) < 0 then
   IBMERR001.RAISE_ERR_GENERICO('La modifica di importo sulla scadenza:'||aObbScad.pg_obbligazione_scadenzario||' rende negativa o nulla la scadenza successiva per l'''||getDescObbligazione(aObbScad));
  end if;

  -- Aggiorno l'utente ultimo aggiornamento sul record principale
  update obbligazione set
   utuv=aUser,
   duva=aTSNow,
   pg_ver_rec=pg_ver_rec+1
  Where cd_cds = aObbScad.cd_cds
    and esercizio = aObbScad.esercizio
    and esercizio_originale = aObbScad.esercizio_originale
    and pg_obbligazione = aObbScad.pg_obbligazione;

  -- Aggiorno l'importo sulla scadenza di pagamento
  update obbligazione_scadenzario set
   im_scadenza = aNewImp,
   utuv=aUser,
   duva=aTSNow,
   pg_ver_rec=pg_ver_rec+1
  Where cd_cds = aObbScad.cd_cds
    and esercizio = aObbScad.esercizio
    and esercizio_originale = aObbScad.esercizio_originale
    and pg_obbligazione = aObbScad.pg_obbligazione
    and pg_obbligazione_scadenzario = aObbScad.pg_obbligazione_scadenzario;

  -- Scarico la diifferenza sulla scadenza successiva
  update obbligazione_scadenzario set
   im_scadenza = im_scadenza - (aNewImp - aObbScad.im_scadenza),
   utuv=aUser,
   duva=aTSNow,
   pg_ver_rec=pg_ver_rec+1
  Where cd_cds = aNextScad.cd_cds
    and esercizio = aNextScad.esercizio
    and esercizio_originale = aNextScad.esercizio_originale
    and pg_obbligazione = aNextScad.pg_obbligazione
    and pg_obbligazione_scadenzario = aNextScad.pg_obbligazione_scadenzario;

  --aggiorno i dettagli voce della scadenza di pagamento e scarico la differenza su quella della scadenza
  --successiva creandoli se non esistono
  Declare
    totScadVoceOld number := 0;
    totImportoSpostato number := 0;
  Begin
    for aObbScadVoce in (select * from obbligazione_scad_voce where
                         cd_cds = aObbScad.cd_cds
                         and esercizio = aObbScad.esercizio
                         and esercizio_originale = aObbScad.esercizio_originale
                         and pg_obbligazione = aObbScad.pg_obbligazione
                         and pg_obbligazione_scadenzario = aObbScad.pg_obbligazione_scadenzario) Loop
      Declare
        impDaSpostare number := 0;
      Begin
       if(aObbScad.im_scadenza!=0) then
        impDaSpostare := aObbScadVoce.IM_VOCE - Round(aObbScadVoce.IM_VOCE*aNewImp/aObbScad.im_scadenza,2);
       else
          IBMERR001.RAISE_ERR_GENERICO('Errore in fase di aggiornamento scadenza verificare obbligazione/scadenza: '||aObbScad.pg_obbligazione||'/'||aObbScad.pg_obbligazione_scadenzario||'.');
       end if;

        if impDaSpostare > 0 Then
          UPDATE obbligazione_scad_voce
          SET IM_VOCE = aObbScadVoce.IM_VOCE - impDaSpostare,
              DUVA = aTSNow,
              UTUV = aUser
          Where esercizio = aObbScad.esercizio
          and esercizio_originale = aObbScad.esercizio_originale
          and pg_obbligazione = aObbScad.pg_obbligazione
          and pg_obbligazione_scadenzario = aObbScad.pg_obbligazione_scadenzario
          and TI_APPARTENENZA = aObbScadVoce.TI_APPARTENENZA
          and TI_GESTIONE = aObbScadVoce.TI_GESTIONE
          and CD_VOCE = aObbScadVoce.CD_VOCE
          and CD_CENTRO_RESPONSABILITA = aObbScadVoce.CD_CENTRO_RESPONSABILITA
          and CD_LINEA_ATTIVITA = aObbScadVoce.CD_LINEA_ATTIVITA;

          totScadVoceOld := totScadVoceOld + (aObbScadVoce.IM_VOCE - impDaSpostare);

          --Cerco la stessa combinazione sulla scadenza successiva per aggiornarla.
          --Se non la trovo la creo
          Declare
            aNextScadVoce obbligazione_scad_voce%rowtype;
          Begin
            Update obbligazione_scad_voce
            set IM_VOCE = IM_VOCE + impDaSpostare
            where cd_cds = aNextScad.cd_cds
            and esercizio = aNextScad.esercizio
            and esercizio_originale = aNextScad.esercizio_originale
            and pg_obbligazione = aNextScad.pg_obbligazione
            and pg_obbligazione_scadenzario = aNextScad.pg_obbligazione_scadenzario
            and TI_APPARTENENZA = aObbScadVoce.TI_APPARTENENZA
            and TI_GESTIONE = aObbScadVoce.TI_GESTIONE
            and CD_VOCE = aObbScadVoce.CD_VOCE
            and CD_CENTRO_RESPONSABILITA = aObbScadVoce.CD_CENTRO_RESPONSABILITA
            and CD_LINEA_ATTIVITA = aObbScadVoce.CD_LINEA_ATTIVITA;

            If sql%rowcount=0 Then
              aNextScadVoce := null;
              aNextScadVoce.CD_CDS := aNextScad.CD_CDS;
              aNextScadVoce.ESERCIZIO := aNextScad.ESERCIZIO;
              aNextScadVoce.ESERCIZIO_ORIGINALE := aNextScad.ESERCIZIO_ORIGINALE;
              aNextScadVoce.PG_OBBLIGAZIONE := aNextScad.PG_OBBLIGAZIONE;
              aNextScadVoce.PG_OBBLIGAZIONE_SCADENZARIO := aNextScad.PG_OBBLIGAZIONE_SCADENZARIO;
              aNextScadVoce.TI_APPARTENENZA := aObbScadVoce.TI_APPARTENENZA;
              aNextScadVoce.TI_GESTIONE := aObbScadVoce.TI_GESTIONE;
              aNextScadVoce.CD_VOCE := aObbScadVoce.CD_VOCE;
              aNextScadVoce.CD_CENTRO_RESPONSABILITA := aObbScadVoce.CD_CENTRO_RESPONSABILITA;
              aNextScadVoce.CD_LINEA_ATTIVITA := aObbScadVoce.CD_LINEA_ATTIVITA;
              aNextScadVoce.IM_VOCE := impDaSpostare;
              aNextScadVoce.DACR := aTSNow;
              aNextScadVoce.UTCR := aUser;
              aNextScadVoce.DUVA := aTSNow;
              aNextScadVoce.UTUV := aUser;
              aNextScadVoce.PG_VER_REC := 0;

              cnrctb035.ins_OBBLIGAZIONE_SCAD_VOCE(aNextScadVoce);
            End if;

            totImportoSpostato := totImportoSpostato + impDaSpostare;
          End;
        End If;
      End;
    End Loop;

    --Riapro i cursori per spalmare la differenza riprendendola dalla scadenza successiva
    If totScadVoceOld != aNewImp Then
      Declare
        diffDaSpalmare number := aNewImp - totScadVoceOld;
      Begin
        for aObbScadVoce in (select * from obbligazione_scad_voce
                             where cd_cds = aObbScad.cd_cds
                             and esercizio = aObbScad.esercizio
                             and esercizio_originale = aObbScad.esercizio_originale
                             and pg_obbligazione = aObbScad.pg_obbligazione
                             and pg_obbligazione_scadenzario = aObbScad.pg_obbligazione_scadenzario) Loop
          Declare
            diffDett number := aObbScadVoce.im_voce + diffDaSpalmare;
          Begin
            If diffDett < 0 Then
              diffDett := -aObbScadVoce.im_voce;
            Else
              diffDett := diffDaSpalmare;
            End If;

            update obbligazione_scad_voce
            set im_voce = aObbScadVoce.im_voce + diffDett
            where cd_cds = aObbScadVoce.cd_cds
            and esercizio = aObbScadVoce.esercizio
            and esercizio_originale = aObbScadVoce.esercizio_originale
            and pg_obbligazione = aObbScadVoce.pg_obbligazione
            and pg_obbligazione_scadenzario = aObbScadVoce.pg_obbligazione_scadenzario
            and TI_APPARTENENZA = aObbScadVoce.TI_APPARTENENZA
            and TI_GESTIONE = aObbScadVoce.TI_GESTIONE
            and CD_VOCE = aObbScadVoce.CD_VOCE
            and CD_CENTRO_RESPONSABILITA = aObbScadVoce.CD_CENTRO_RESPONSABILITA
            and CD_LINEA_ATTIVITA = aObbScadVoce.CD_LINEA_ATTIVITA;

            update obbligazione_scad_voce
            set im_voce = im_voce - diffDett
            where cd_cds = aNextScad.cd_cds
            and esercizio = aNextScad.esercizio
            and esercizio_originale = aNextScad.esercizio_originale
            and pg_obbligazione = aNextScad.pg_obbligazione
            and pg_obbligazione_scadenzario = aNextScad.pg_obbligazione_scadenzario
            and TI_APPARTENENZA = aObbScadVoce.TI_APPARTENENZA
            and TI_GESTIONE = aObbScadVoce.TI_GESTIONE
            and CD_VOCE = aObbScadVoce.CD_VOCE
            and CD_CENTRO_RESPONSABILITA = aObbScadVoce.CD_CENTRO_RESPONSABILITA
            and CD_LINEA_ATTIVITA = aObbScadVoce.CD_LINEA_ATTIVITA;

            diffDaSpalmare := diffDaSpalmare - diffDett;
            If diffDaSpalmare = 0 Then
              exit;
            End If;
          End;
        End loop;

        If diffDaSpalmare!=0 Then
          IBMERR001.RAISE_ERR_GENERICO('Errore in fase di sdoppiamento scadenza '||getDescObbligazione(aObbScad)||'.');
        End If;
      End;
    End if;
  End;
 End;

 function getTotManRegolNoPgiro(aEsScrivania number,aCdCds varchar2) return number is
  tot_man_reg NUMBER:=0;
  uo_ente unita_organizzativa%rowtype;
  aCds unita_organizzativa%rowtype;
 begin
         tot_man_reg:=0;

		 -- Recupero la UO Ente
		 uo_ente := CNRCTB020.getuoente(aEsScrivania);

		 -- Recupera il rowtype di CDS
		 aCds := CNRCTB020.GETCDSVALIDO(aEsScrivania,aCdCds);

		 if aCdCds = uo_ente.CD_UNITA_PADRE then
		  return 0;
		 end if;

		 if aCds.cd_tipo_unita=CNRCTB020.TIPO_AREA then
		  -- Calcolo la somma dei mandati di regolarizzazione emessi per il Cds di scrivania di tipo area
		  -- quindi entrando sulla voce_f con cd_proprio_voce=cd_cds area
		  -- e cd_cds = a presidente dell'area
 		  select nvl(sum(im_mandato_riga),0) into tot_man_reg
		   from v_mandato_voce_f_cds
		   where
		         cd_cds_voce is not null
		   and 	 cd_proprio_voce = aCdCds
		   and	 esercizio	 = aEsScrivania
		   and 	 cd_cds		 = uo_ente.CD_UNITA_PADRE; -- Cds Ente
		 else
		  -- Calcolo la somma dei mandati di regolarizzazione emessi per il Cds di scrivania
		  -- non di tipo area: cd_cds della voce = cds di scrivania cd_cds della voce != cd_proprio della voce
		  select nvl(sum(im_mandato_riga),0) into tot_man_reg
		   from v_mandato_voce_f_cds
		   where cd_cds_voce = aCdCds
		   and   cd_proprio_voce = cd_cds_voce
		   and	 esercizio	 = aEsScrivania
		   and 	 cd_cds		 = uo_ente.CD_UNITA_PADRE; -- Cds Ente
		 end if;
		 return tot_man_reg;
 end;

/*
 function getSaldoManRevPgiroEsPrec(aEsScrivania number,aCdCds varchar2) return number is
  uo_ente unita_organizzativa%rowtype;
  aDeltaMRPgiroEsPrec NUMBER;
 begin
		 -- Recupero la UO Ente
		 uo_ente := CNRCTB020.getuoente(aEsScrivania);

		 if aCdCds = uo_ente.CD_UNITA_PADRE then
		  return 0;
		 end if;

         -- Estrazione mandati/reversali su partita di giro esercizio precedente (se esercizio corrente > esercizio partenza)
		 aDeltaMRPgiroEsPrec:=0;
         if aEsScrivania > CNRCTB008.ESERCIZIO_PARTENZA then
          select
           nvl(sum(decode(a.ti_gestione,CNRCTB001.GESTIONE_SPESE,1,-1)*a.IM_MANDATI_REVERSALI),0) into aDeltaMRPgiroEsPrec
          from voce_f_saldi_cmp a where
               a.esercizio<=aEsScrivania-1
           and a.cd_cds=aCdCds
           and a.ti_appartenenza = CNRCTB001.APPARTENENZA_CDS
           and a.ti_competenza_residuo = CNRCTB054.TI_COMPETENZA
           and exists (select 1 from elemento_voce where
                esercizio = a.esercizio
            and ti_appartenenza = a.ti_appartenenza
            and ti_gestione = a.ti_gestione
            and cd_elemento_voce = a.cd_voce
            and fl_partita_giro='Y'
           );
         end if;
		 return aDeltaMRPgiroEsPrec;
 end;
*/

/*
 function getMassaSpendibileResidui(
  aEs number,
  aEsScrivania number,
  aCdCds varchar2,
  aCdElementoVoce varchar2
 ) return number is
  aEV elemento_voce%rowtype;
  aRate number;
  aPRCCOP prc_copertura_obblig%rowtype;
  aControllo1  V_OBBLIG_CONTROLLO_RESIDUI%rowtype;
  aControllo2  V_OBBLIG_CONTROLLO_A2%rowtype;
  aControllo3  V_OBBLIG_CONTROLLO_A3%rowtype;
  aCDS unita_organizzativa%rowtype;
  aAppartenenza char(1);
 begin
  if aEs is null or aEsScrivania is null then
   IBMERR001.RAISE_ERR_GENERICO('Esercizio di competenza o di scrivania non specificato');
  end if;

  if aEs = aEsScrivania then
      declare
       tot_man_reg NUMBER:=0;
       aDeltaMRPgiroEsPrec NUMBER:=0;
	  begin
	     select * into aControllo1 from V_OBBLIG_CONTROLLO_RESIDUI where
	           esercizio = aEsScrivania
	       and cd_cds = aCdCds;
         tot_man_reg:=getTotManRegolNoPgiro(aEsScrivania,aCdCds);
         aDeltaMRPgiroEsPrec:=getSaldoManRevPgiroEsPrec(aEsScrivania,aCdCds);
	     return
		         aControllo1.IM_STANZIAMENTO_A1
			   + aControllo1.IM_VAR_PIU_A1
			   - aControllo1.IM_VAR_MENO_A1
			   + aControllo1.IM_RESIDUO
			   + aControllo1.IM_RES_VAR_PIU
			   - aControllo1.IM_RES_VAR_MENO
			   + aControllo1.IM_CASSA_INIZIALE
			   - tot_man_reg -- Detraggo l'importo relativo alla somma dei mandati di regolariz.
			   - aControllo1.IM_SALDO_MAN_REV
			   + aDeltaMRPgiroEsPrec;
	  end; -- Fine declare
  end if;

  if aEs = aEsScrivania + 1 then
   begin
     select * into aPRCCOP from prc_copertura_obblig where
	      esercizio = aEsScrivania
	  and cd_unita_organizzativa = aCdCds;
 	 aRate:=aPRCCOP.prc_copertura_obblig_2;
   exception when NO_DATA_FOUND then
	 aRate:=100;
   end;
   select * into aControllo2 from V_OBBLIG_CONTROLLO_A2 where
        esercizio = aEsScrivania
    and cd_cds = aCdCds;
    return (aControllo2.IM_STANZIAMENTO_A2 * aRate/100) - aControllo2.IM_SALDO_OBBLIG_A2;
  end if;

  if aEs = aEsScrivania + 2 then
   begin
     select * into aPRCCOP from prc_copertura_obblig where
	      esercizio = aEsScrivania
	  and cd_unita_organizzativa = aCdCds;
   	 aRate:=aPRCCOP.prc_copertura_obblig_3;
   exception when NO_DATA_FOUND then
	aRate:=100;
   end;
   select * into aControllo3 from V_OBBLIG_CONTROLLO_A3 where
        esercizio = aEsScrivania
    and cd_cds = aCdCds;
    return(aControllo3.IM_STANZIAMENTO_A3 * aRate/100) - aControllo3.IM_SALDO_OBBLIG_A3;
  end if;
  return 0;
 end;
*/

 function checkDisponibilitaCassa(
  esercizio number,
  cd_cds varchar2,
  esercizio_originale number,
  pg_obbligazione NUMBER
 ) return char is
 begin
  return 'Y';
 end;

 procedure creaImpegniCnr(aEs VARCHAR2, aCDR VARCHAR2, Utente VARCHAR2) is
  aUOENTE v_unita_organizzativa_valida%rowtype;
 begin

  select * into aUOENTE
  from v_unita_organizzativa_valida where
       esercizio=aEs
   and cd_tipo_unita = CNRCTB020.TIPO_ENTE
   and fl_uo_cds='Y';

  for aSaldo in (select a.*
                 from   VOCE_F_SALDI_CDR_LINEA A
                 Where  a.esercizio = aEs And
                        a.ti_appartenenza = CNRCTB001.APPARTENENZA_CNR And
                        a.esercizio = a.esercizio_res And
                                exists (select 1
                                        from    voce_f
                                        Where   esercizio = aEs  and
                                                ti_appartenenza = CNRCTB001.APPARTENENZA_CNR And
                                                ti_gestione = CNRCTB001.GESTIONE_SPESE  And
                                                cd_voce = a.cd_voce And
                                                cd_parte = CNRCTB001.PARTE1)) loop
   aggiornaImpegnoCapitolo(aSaldo, 0, Utente);
  end loop;
 end;

Procedure aggiornaImpegnoCapitolo(aSaldo voce_f_saldi_cdr_linea%rowtype, isPerVariazione Boolean, DELTA_VAR_RES NUMBER, utente VARCHAR2) is
  aObblig               obbligazione%rowtype;
  aObbligScad           obbligazione_scadenzario%rowtype;
  aObbligScadVoce       obbligazione_scad_voce%rowtype;
  aTSNow                date;
  aUOENTE               v_unita_organizzativa_valida%rowtype;
  aCDRENTE              v_cdr_valido%rowtype;
  aNumeratore           number;
  aNuovoImporto         number(15,2);
  aCodTerzoDivImpegni   number;
  aTerzoTemp            terzo%rowtype;
  aSaldoCdrLinea        voce_f_saldi_cdr_linea%Rowtype;
  TIPO_IMPEGNO          VARCHAR2(10);
  DES_TIPO_IMPEGNO      VARCHAR2(50);
  delta_saldo_cdr       NUMBER := 0;

  TIPO_IMPEGNO_RIB      VARCHAR2(10);
  aObbligRib            obbligazione%rowtype;
  aObbligScadRib        obbligazione_scadenzario%rowtype;
  aObbligScadVoceRib    obbligazione_scad_voce%rowtype;
  aNuovoImportoRib      number(15,2):=0;
  delta_saldo_cdrRib    NUMBER := 0;
  aSaldoCdrLineaRib     voce_f_saldi_cdr_linea%Rowtype;
Begin

aTSNow:=sysdate;

if isPerVariazione is null then
   IBMERR001.RAISE_ERR_GENERICO('Errore interno in aggiornamento impegno capitolo');
End if;

Begin

   /* 22.02.2006 stani:
   AGGIORNAMENTO DELL'IMPEGNO RESIDUO PER APPROVAZIONE VARIAZIONE AL BILANZIO DI SERVIZIO (RESIDUO)
   PER APPROVAZIONE DI VARIAZIONE ALLO STANZIAMENTO RESIDUO */

   -- Per identificare l'impegno del capitolo bisogna partire da scad voce che contiene il codice del capitolo
   -- in join con obbligazione che contiene il tipo di documento A SECONDA DELL'ANNO RESIDUO ('IMP')

If aSaldo.esercizio = aSaldo.esercizio_res Then
        TIPO_IMPEGNO := CNRCTB018.TI_DOC_IMP;
        DES_TIPO_IMPEGNO := 'Impegno';
Elsif aSaldo.esercizio > aSaldo.esercizio_res Then
        TIPO_IMPEGNO := CNRCTB018.TI_DOC_IMP_RES;
        DES_TIPO_IMPEGNO := 'Impegno Residuo';
End if;

-----------------------------------------------------------------------------------------------------------------------
------------------------------------ RECUPERO L'IMPEGNO DA DIMINUIRE/AUMENTARE... -------------------------------------
-----------------------------------------------------------------------------------------------------------------------

If Nvl(DELTA_VAR_RES, 0) >= 0 Then

-- SE DEVO AUMENTARE L'IMPEGNO PRENDO IL PIU' GRANDE DI QUELL'ESERCIZIO RESIDUO CON O SENZA DISPONIBILITA'

   select a.*
   into  aObbligScadVoce
   from  obbligazione_scad_voce a, obbligazione b
   Where a.CD_CDS    = CNRCTB020.GETCDCDSENTE (aSaldo.esercizio)
     And a.ESERCIZIO = aSaldo.esercizio
     and a.ESERCIZIO_ORIGINALE = aSaldo.esercizio_res
     and a.TI_APPARTENENZA = aSaldo.ti_appartenenza
     and a.TI_GESTIONE = aSaldo.ti_gestione
     and a.CD_VOCE     = aSaldo.cd_voce
     and b.CD_CDS      = a.cd_cds
     and b.ESERCIZIO   = a.esercizio
     and b.ESERCIZIO_ORIGINALE=a.esercizio_originale
     and b.PG_OBBLIGAZIONE = a.PG_OBBLIGAZIONE
     and b.CD_TIPO_DOCUMENTO_CONT = TIPO_IMPEGNO
     And b.stato_obbligazione != cnrctb035.stato_stornato
     And A.pg_obbligazione = (Select Max(a.pg_obbligazione)
                            from  obbligazione_scad_voce a, obbligazione b
                            Where a.CD_CDS    = CNRCTB020.GETCDCDSENTE (aSaldo.esercizio)
                              and a.ESERCIZIO = aSaldo.esercizio
                              and a.ESERCIZIO_ORIGINALE = aSaldo.esercizio_res
                              and a.TI_APPARTENENZA = aSaldo.ti_appartenenza
                              and a.TI_GESTIONE = aSaldo.ti_gestione
                              and a.CD_VOCE     = aSaldo.cd_voce
                              and b.CD_CDS      = a.cd_cds
                              and b.ESERCIZIO   = a.esercizio
                              and b.ESERCIZIO_ORIGINALE   = a.esercizio_originale
                              and b.PG_OBBLIGAZIONE = a.PG_OBBLIGAZIONE
                              and b.CD_TIPO_DOCUMENTO_CONT = TIPO_IMPEGNO)
   for update nowait;

Elsif Nvl(DELTA_VAR_RES, 0) < 0 Then

-- SE DEVO DIMINUIRE L'IMPEGNO PRENDO IL PIU' GRANDE DI QUELL'ESERCIZIO RESIDUO CHE ABBIA DISPONIBILITA'

   select a.*
   into  aObbligScadVoce
   from  obbligazione_scad_voce a, obbligazione b
   Where a.CD_CDS    = CNRCTB020.GETCDCDSENTE (aSaldo.esercizio)
     And a.ESERCIZIO = aSaldo.esercizio
     and a.ESERCIZIO_ORIGINALE = aSaldo.esercizio_res
     and a.TI_APPARTENENZA = aSaldo.ti_appartenenza
     and a.TI_GESTIONE = aSaldo.ti_gestione
     and a.CD_VOCE     = aSaldo.cd_voce
     and b.CD_CDS      = a.cd_cds
     and b.ESERCIZIO   = a.esercizio
     and b.ESERCIZIO_ORIGINALE=a.esercizio_originale
     and b.PG_OBBLIGAZIONE = a.PG_OBBLIGAZIONE
     and b.CD_TIPO_DOCUMENTO_CONT = TIPO_IMPEGNO
     And b.stato_obbligazione != cnrctb035.stato_stornato
     And A.pg_obbligazione = (Select Max(a.pg_obbligazione)
                            from  obbligazione_scad_voce a, obbligazione b, obbligazione_scadenzario OS
                            Where a.CD_CDS    = CNRCTB020.GETCDCDSENTE (aSaldo.esercizio)
                              and a.ESERCIZIO = aSaldo.esercizio
                              and a.ESERCIZIO_ORIGINALE = aSaldo.esercizio_res
                              and a.TI_APPARTENENZA = aSaldo.ti_appartenenza
                              and a.TI_GESTIONE = aSaldo.ti_gestione
                              and a.CD_VOCE     = aSaldo.cd_voce
                              and b.CD_CDS      = a.cd_cds
                              and b.ESERCIZIO   = a.esercizio
                              and b.ESERCIZIO_ORIGINALE   = a.esercizio_originale
                              and b.PG_OBBLIGAZIONE = a.PG_OBBLIGAZIONE
                              And A.CD_CDS                      = OS.cd_cds
                              And A.ESERCIZIO                   = OS.esercizio
                              And A.ESERCIZIO_ORIGINALE         = OS.esercizio_originale
                              And A.PG_OBBLIGAZIONE             = OS.pg_obbligazione
                              And A.PG_OBBLIGAZIONE_SCADENZARIO = OS.pg_obbligazione_scadenzario
                              And OS.IM_SCADENZA - OS.IM_ASSOCIATO_DOC_AMM >=  abs(Nvl(DELTA_VAR_RES,0))
                              and b.CD_TIPO_DOCUMENTO_CONT = TIPO_IMPEGNO)
   for update nowait;

End If;

Select * into aObbligScad
from   obbligazione_scadenzario
 Where CD_CDS                        = aObbligScadVoce.cd_cds
   And ESERCIZIO                     = aObbligScadVoce.esercizio
   And ESERCIZIO_ORIGINALE           = aObbligScadVoce.esercizio_originale
   And PG_OBBLIGAZIONE              = aObbligScadVoce.pg_obbligazione
   And PG_OBBLIGAZIONE_SCADENZARIO   = aObbligScadVoce.pg_obbligazione_scadenzario
 for update nowait;

Select * into aObblig
from obbligazione
 Where CD_CDS=aObbligScadVoce.cd_cds
   And ESERCIZIO=aObbligScadVoce.esercizio
   and ESERCIZIO_ORIGINALE = aObbligScadVoce.esercizio_originale
  and  PG_OBBLIGAZIONE=aObbligScadVoce.pg_obbligazione
 for update nowait;

-----------------------------------------------------------------------------------------------------------------------
----------------------------------------------- FINE RECUPERO IMPEGNO -------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------

-------------------------------------------------- lo trovo -----------------------------------------------------------

If isPerVariazione Then
    /* 11/02/2011 ROSPUC */
    -- Se riportato ma con disponibilita questa procedura viene richiamata per tutti gli esercizi

    if aObblig.riportato = 'Y'  then
        --- Inizio recupero impegno esercizio successivo
        -----------------------------------------------------------------------------------------------------------------------
        ------------------------------------ RECUPERO L'IMPEGNO DA DIMINUIRE/AUMENTARE... -------------------------------------
        -----------------------------------------------------------------------------------------------------------------------
             --DEVE ESSERE PER FORZA RESIDUO
             TIPO_IMPEGNO_RIB := CNRCTB018.TI_DOC_IMP_RES;
             Begin
             If Nvl(DELTA_VAR_RES, 0) >= 0 Then

          -- SE DEVO AUMENTARE L'IMPEGNO PRENDO IL PIU' GRANDE DI QUELL'ESERCIZIO RESIDUO CON O SENZA DISPONIBILITA'

                 select a.*
                 into  aObbligScadVoceRib
                 from  obbligazione_scad_voce a, obbligazione b
                 Where a.CD_CDS    = CNRCTB020.GETCDCDSENTE (aSaldo.esercizio)
                   And a.ESERCIZIO = aSaldo.esercizio+1
                   and a.ESERCIZIO_ORIGINALE = aSaldo.esercizio_res
                   and a.TI_APPARTENENZA = aSaldo.ti_appartenenza
                   and a.TI_GESTIONE = aSaldo.ti_gestione
                   and a.CD_VOCE     = aSaldo.cd_voce
                   and b.CD_CDS      = a.cd_cds
                   and b.ESERCIZIO   = a.esercizio
                   and b.ESERCIZIO_ORIGINALE=a.esercizio_originale
                   and b.PG_OBBLIGAZIONE = a.PG_OBBLIGAZIONE
                   and b.CD_TIPO_DOCUMENTO_CONT = TIPO_IMPEGNO_RIB
                   And b.stato_obbligazione != cnrctb035.stato_stornato
                   And A.pg_obbligazione = (Select Max(a.pg_obbligazione)
                                          from  obbligazione_scad_voce a, obbligazione b
                                          Where a.CD_CDS    = CNRCTB020.GETCDCDSENTE (aSaldo.esercizio)
                                            and a.ESERCIZIO = aSaldo.esercizio+1
                                            and a.ESERCIZIO_ORIGINALE = aSaldo.esercizio_res
                                            and a.TI_APPARTENENZA = aSaldo.ti_appartenenza
                                            and a.TI_GESTIONE = aSaldo.ti_gestione
                                            and a.CD_VOCE     = aSaldo.cd_voce
                                            and b.CD_CDS      = a.cd_cds
                                            and b.ESERCIZIO   = a.esercizio
                                            and b.ESERCIZIO_ORIGINALE   = a.esercizio_originale
                                            and b.PG_OBBLIGAZIONE = a.PG_OBBLIGAZIONE
                                            and b.CD_TIPO_DOCUMENTO_CONT = TIPO_IMPEGNO_RIB)
                 for update nowait;

           Elsif Nvl(DELTA_VAR_RES, 0) < 0 Then

          -- SE DEVO DIMINUIRE L'IMPEGNO PRENDO IL PIU' GRANDE DI QUELL'ESERCIZIO RESIDUO CHE ABBIA DISPONIBILITA'

             select a.*
             into  aObbligScadVoceRib
             from  obbligazione_scad_voce a, obbligazione b
             Where a.CD_CDS    = CNRCTB020.GETCDCDSENTE (aSaldo.esercizio)
               And a.ESERCIZIO = aSaldo.esercizio+1
               and a.ESERCIZIO_ORIGINALE = aSaldo.esercizio_res
               and a.TI_APPARTENENZA = aSaldo.ti_appartenenza
               and a.TI_GESTIONE = aSaldo.ti_gestione
               and a.CD_VOCE     = aSaldo.cd_voce
               and b.CD_CDS      = a.cd_cds
               and b.ESERCIZIO   = a.esercizio
               and b.ESERCIZIO_ORIGINALE=a.esercizio_originale
               and b.PG_OBBLIGAZIONE = a.PG_OBBLIGAZIONE
               and b.CD_TIPO_DOCUMENTO_CONT = TIPO_IMPEGNO_RIB
               And b.stato_obbligazione != cnrctb035.stato_stornato
               And A.pg_obbligazione = (Select Max(a.pg_obbligazione)
                                      from  obbligazione_scad_voce a, obbligazione b, obbligazione_scadenzario OS
                                      Where a.CD_CDS    = CNRCTB020.GETCDCDSENTE (aSaldo.esercizio)
                                        and a.ESERCIZIO = aSaldo.esercizio+1
                                        and a.ESERCIZIO_ORIGINALE = aSaldo.esercizio_res
                                        and a.TI_APPARTENENZA = aSaldo.ti_appartenenza
                                        and a.TI_GESTIONE = aSaldo.ti_gestione
                                        and a.CD_VOCE     = aSaldo.cd_voce
                                        and b.CD_CDS      = a.cd_cds
                                        and b.ESERCIZIO   = a.esercizio
                                        and b.ESERCIZIO_ORIGINALE   = a.esercizio_originale
                                        and b.PG_OBBLIGAZIONE = a.PG_OBBLIGAZIONE
                                        And A.CD_CDS                      = OS.cd_cds
                                        And A.ESERCIZIO                   = OS.esercizio
                                        And A.ESERCIZIO_ORIGINALE         = OS.esercizio_originale
                                        And A.PG_OBBLIGAZIONE             = OS.pg_obbligazione
                                        And A.PG_OBBLIGAZIONE_SCADENZARIO = OS.pg_obbligazione_scadenzario
                                        And OS.IM_SCADENZA - OS.IM_ASSOCIATO_DOC_AMM >= abs(Nvl(DELTA_VAR_RES,0))
                                        and b.CD_TIPO_DOCUMENTO_CONT = TIPO_IMPEGNO_RIB)
             for update nowait;

          End If;

          Select * into aObbligScadRib
          from   obbligazione_scadenzario
           Where CD_CDS                        = aObbligScadVoceRib.cd_cds
             And ESERCIZIO                     = aObbligScadVoceRib.esercizio
             And ESERCIZIO_ORIGINALE           = aObbligScadVoceRib.esercizio_originale
             And PG_OBBLIGAZIONE               = aObbligScadVoceRib.pg_obbligazione
             And PG_OBBLIGAZIONE_SCADENZARIO   = aObbligScadVoceRib.pg_obbligazione_scadenzario
           for update nowait;

          Select * into aObbligRib
          from obbligazione
           Where CD_CDS=aObbligScadVoceRib.cd_cds
             And ESERCIZIO=aObbligScadVoceRib.esercizio
             and ESERCIZIO_ORIGINALE = aObbligScadVoceRib.esercizio_originale
            and  PG_OBBLIGAZIONE=aObbligScadVoceRib.pg_obbligazione
           for update nowait;

          if aObbligScadRib.IM_SCADENZA - aObbligScadRib.IM_ASSOCIATO_DOC_AMM + DELTA_VAR_RES < 0 Then
            IBMERR001.RAISE_ERR_GENERICO('L''impegno n.'||aObbligRib.pg_obbligazione||' del '||aObbligRib.esercizio_originale||' relativo al capitolo '||aObbligScadVoceRib.cd_voce||' risulta riportato a nuovo esercizio e non è modificabile.');
          else
             aNuovoImportoRib := aObbligScadRib.IM_SCADENZA + DELTA_VAR_RES;
             delta_saldo_cdrRib := Nvl(DELTA_VAR_RES, 0);
          end if;
        exception when no_data_found then
          IBMERR001.RAISE_ERR_GENERICO('L''impegno relativo al capitolo '||aSaldo.cd_voce||' risulta riportato a nuovo esercizio e non è modificabile.');
        end;

    end if;

    -- Se la modifica è fatta per variazione, devo sanare necessariamente le differenze
    -- tra assestato e importo associato a doc. amm. dell'impegno

    If TIPO_IMPEGNO = CNRCTB018.TI_DOC_IMP Then  -- VARIAZIONE DI UN COMPETENZA
        If aObbligScad.IM_SCADENZA + DELTA_VAR_RES < aObbligScad.im_associato_doc_amm Then
         IBMERR001.RAISE_ERR_GENERICO('Il nuovo importo dell'''||DES_TIPO_IMPEGNO||' n. '||aObbligScad.pg_obbligazione||' del '||aObbligScad.esercizio_originale||
         ' sulla voce '||aSaldo.cd_voce||' risulterebbe inferiore a quanto già associato a documenti amministrativi (importo '||
         To_Char(aObbligScad.IM_SCADENZA)||', variazione '||DELTA_VAR_RES||', quota associata '||aObbligScad.im_associato_doc_amm||')');
        Else
         aNuovoImporto := aObbligScad.IM_SCADENZA + DELTA_VAR_RES;
         delta_saldo_cdr := Nvl(DELTA_VAR_RES, 0);
        End if;
    Elsif TIPO_IMPEGNO = CNRCTB018.TI_DOC_IMP_RES Then  -- VARIAZIONE DI UN RESIDUO

    -- VERIFICARE STANI DANIELA
        if aObbligScad.IM_SCADENZA - aObbligScad.IM_ASSOCIATO_DOC_AMM + DELTA_VAR_RES < 0 Then
         IBMERR001.RAISE_ERR_GENERICO('La scadenza dell''impegno residuo '||aObbligScad.pg_obbligazione||' del '||aObbligScad.esercizio_originale||
         ' sul capitolo '||aSaldo.cd_voce||' ('||To_Char(aObbligScad.IM_SCADENZA)||
         ') è già associata a documenti amministrativi per '||aObbligScad.im_associato_doc_amm||'. Non può essere inserita la variazione di '||DELTA_VAR_RES);
        else
         aNuovoImporto := aObbligScad.IM_SCADENZA + DELTA_VAR_RES;
         delta_saldo_cdr := Nvl(DELTA_VAR_RES, 0);
        end if;
    End If;

Else -- NON PER VARIAZIONE
     -- 24.01.2008 POTREBBE ANCHE ESSERE CHE LE CHIUSURE CONTINUE DEI PIANI DI GESTIONE INCREMENTANO LO STESSO IMPEGNO
     --            MA L'INCREMENTO NON E' CONSIDERATO PER VARIAZIONE

    -- L'importo dell'impegno non può essere inferiore al saldo dei documenti amministrativi

    if aSaldo.im_stanz_iniziale_a1 + aSaldo.VARIAZIONI_PIU - aSaldo.VARIAZIONI_MENO < aObbligScad.im_associato_doc_amm then
     aNuovoImporto := aObbligScad.im_associato_doc_amm;
/*
         IBMERR001.RAISE_ERR_GENERICO('Attenzione !! Lo stanziamento sulla voce '||aSaldo.cd_voce||' ('||
aSaldo.im_stanz_iniziale_a1||') risulterebbe inferiore a quanto già associato '||
'a documenti amministrativi ('||aObbligScad.im_associato_doc_amm||')');
*/
    else
     aNuovoImporto := aSaldo.im_stanz_iniziale_a1 + aSaldo.VARIAZIONI_PIU - aSaldo.VARIAZIONI_MENO;
     delta_saldo_cdr := Nvl(aSaldo.im_stanz_iniziale_a1, 0) + Nvl(aSaldo.VARIAZIONI_PIU, 0) - Nvl(aSaldo.VARIAZIONI_MENO, 0) - Nvl(aObbligScadVoce.im_voce, 0);
    end if;

End if;

---------------------------------- ASSEGNO IL NUOVO IMPORTO A TUTTE E TRE LE TABELLE ---------------------------------
------------------------------- A MENO CHE IL NUOVO VALORE NON SIA UGUALE AL VECCHIO ---------------------------------

   If aObblig.IM_OBBLIGAZIONE != aNuovoImporto And aNuovoImporto >= 0 Then
      Update obbligazione
      Set IM_OBBLIGAZIONE = aNuovoImporto,
   	  UTUV            = utente,
   	  DUVA            = Sysdate,
   	  PG_VER_REC      = PG_VER_REC+1
      Where CD_CDS          = aObbligScadVoce.cd_cds
       and  ESERCIZIO       = aObbligScadVoce.esercizio
       and  ESERCIZIO_ORIGINALE = aObbligScadVoce.esercizio_originale
       and  PG_OBBLIGAZIONE = aObbligScadVoce.pg_obbligazione;
   End If;

   If aObbligScad.IM_SCADENZA != aNuovoImporto And aNuovoImporto >= 0 Then
      Update obbligazione_scadenzario
      Set IM_SCADENZA     = aNuovoImporto,
    	  UTUV            = utente,
    	  DUVA            = Sysdate,
    	  PG_VER_REC      = PG_VER_REC+1
      Where CD_CDS                     = aObbligScadVoce.cd_cds
       and  ESERCIZIO                  = aObbligScadVoce.esercizio
       and  ESERCIZIO_ORIGINALE        = aObbligScadVoce.esercizio_originale
       and  PG_OBBLIGAZIONE            = aObbligScadVoce.pg_obbligazione
       And PG_OBBLIGAZIONE_SCADENZARIO = aObbligScadVoce.pg_obbligazione_scadenzario;
   End If;

   If aObbligScadVoce.IM_VOCE != aNuovoImporto And aNuovoImporto >= 0 Then
      Update obbligazione_scad_voce
      Set IM_VOCE    = aNuovoImporto,
    	  UTUV       = utente,
    	  DUVA       = Sysdate,
    	  PG_VER_REC = PG_VER_REC+1
       Where CD_CDS             = aObbligScadVoce.cd_cds
        and  ESERCIZIO          = aObbligScadVoce.esercizio
        and  ESERCIZIO_ORIGINALE = aObbligScadVoce.esercizio_originale
        and  PG_OBBLIGAZIONE    = aObbligScadVoce.pg_obbligazione
        and  PG_OBBLIGAZIONE_SCADENZARIO = aObbligScadVoce.pg_obbligazione_scadenzario
        and  TI_APPARTENENZA    = aObbligScadVoce.ti_appartenenza
        and  TI_GESTIONE        = aObbligScadVoce.ti_gestione;
   End If;

/*Rospuc */
if(aNuovoImportoRib !=0 ) then
 If aObbligRib.IM_OBBLIGAZIONE != aNuovoImportoRib And aNuovoImportoRib >= 0 Then
      Update obbligazione
      Set IM_OBBLIGAZIONE = aNuovoImportoRib,
   	  UTUV            = utente,
   	  DUVA            = Sysdate,
   	  PG_VER_REC      = PG_VER_REC+1
      Where CD_CDS          = aObbligScadVoceRib.cd_cds
       and  ESERCIZIO       = aObbligScadVoceRib.esercizio
       and  ESERCIZIO_ORIGINALE = aObbligScadVoceRib.esercizio_originale
       and  PG_OBBLIGAZIONE = aObbligScadVoceRib.pg_obbligazione;
   End If;

   If aObbligScadRib.IM_SCADENZA != aNuovoImportoRib And aNuovoImportoRib >= 0 Then
      Update obbligazione_scadenzario
      Set IM_SCADENZA     = aNuovoImportoRib,
    	  UTUV            = utente,
    	  DUVA            = Sysdate,
    	  PG_VER_REC      = PG_VER_REC+1
      Where CD_CDS                     = aObbligScadVoceRib.cd_cds
       and  ESERCIZIO                  = aObbligScadVoceRib.esercizio
       and  ESERCIZIO_ORIGINALE        = aObbligScadVoceRib.esercizio_originale
       and  PG_OBBLIGAZIONE            = aObbligScadVoceRib.pg_obbligazione
       And PG_OBBLIGAZIONE_SCADENZARIO = aObbligScadVoceRib.pg_obbligazione_scadenzario;
   End If;

   If aObbligScadVoceRib.IM_VOCE != aNuovoImportoRib And aNuovoImportoRib >= 0 Then
      Update obbligazione_scad_voce
      Set IM_VOCE    = aNuovoImportoRib,
    	  UTUV       = utente,
    	  DUVA       = Sysdate,
    	  PG_VER_REC = PG_VER_REC+1
       Where CD_CDS             = aObbligScadVoceRib.cd_cds
        and  ESERCIZIO          = aObbligScadVoceRib.esercizio
        and  ESERCIZIO_ORIGINALE = aObbligScadVoceRib.esercizio_originale
        and  PG_OBBLIGAZIONE    = aObbligScadVoceRib.pg_obbligazione
        and  PG_OBBLIGAZIONE_SCADENZARIO = aObbligScadVoceRib.pg_obbligazione_scadenzario
        and  TI_APPARTENENZA    = aObbligScadVoceRib.ti_appartenenza
        and  TI_GESTIONE        = aObbligScadVoceRib.ti_gestione;
   End If;
end if;

  -- Aggiorno VOCE_F_SALDI_CDR_LINEA M.S. 19/12/2005
  aSaldoCdrLinea.ESERCIZIO                := aObbligScadVoce.ESERCIZIO;
  aSaldoCdrLinea.ESERCIZIO_RES            := Nvl(aObblig.ESERCIZIO_ORIGINALE, aObblig.ESERCIZIO);
  aSaldoCdrLinea.CD_CENTRO_RESPONSABILITA := aObbligScadVoce.CD_CENTRO_RESPONSABILITA;
  aSaldoCdrLinea.CD_LINEA_ATTIVITA        := aObbligScadVoce.CD_LINEA_ATTIVITA;
  aSaldoCdrLinea.TI_APPARTENENZA          := aObbligScadVoce.TI_APPARTENENZA;
  aSaldoCdrLinea.TI_GESTIONE              := aObbligScadVoce.TI_GESTIONE;
  aSaldoCdrLinea.CD_VOCE                  := aObbligScadVoce.CD_VOCE;

   CNRCTB054.RESET_IMPORTI_SALDI (aSaldoCdrLinea);
if (aNuovoImportoRib!= 0) then

  aSaldoCdrLineaRib.ESERCIZIO                := aObbligScadVoceRib.ESERCIZIO;
  aSaldoCdrLineaRib.ESERCIZIO_RES            := Nvl(aObbligRib.ESERCIZIO_ORIGINALE, aObbligRib.ESERCIZIO);
  aSaldoCdrLineaRib.CD_CENTRO_RESPONSABILITA := aObbligScadVoceRib.CD_CENTRO_RESPONSABILITA;
  aSaldoCdrLineaRib.CD_LINEA_ATTIVITA        := aObbligScadVoceRib.CD_LINEA_ATTIVITA;
  aSaldoCdrLineaRib.TI_APPARTENENZA          := aObbligScadVoceRib.TI_APPARTENENZA;
  aSaldoCdrLineaRib.TI_GESTIONE              := aObbligScadVoceRib.TI_GESTIONE;
  aSaldoCdrLineaRib.CD_VOCE                  := aObbligScadVoceRib.CD_VOCE;
  CNRCTB054.RESET_IMPORTI_SALDI (aSaldoCdrLineaRib);
end if;


--  aSaldoCdrLinea.IM_OBBL_ACC_COMP := aNuovoImporto - aObbligScadVoce.IM_VOCE;
-- CREAZIONE IMPEGNO COMPETENZA, INUTILE TUTTI GLI IF.......(QUELLI CHE C'ERANO PRIMA)
-- ERRORE DA CORREGGERE, SE LA COMPETENZA GIA' C'E' DEVE ESSERE RICOPERTA.

  If isPerVariazione Then  -- VARIAZIONE
     If TIPO_IMPEGNO = CNRCTB018.TI_DOC_IMP_RES Then  -- VARIAZIONE DI UN RESIDUO
         If delta_saldo_cdr >= 0 Then  -- POSITIVA
             aSaldocdrlinea.VAR_PIU_OBBL_RES_PRO := delta_saldo_cdr;
         Elsif delta_saldo_cdr <= 0 Then  -- VARIAZIONE DI UN RESIDUO
             aSaldocdrlinea.VAR_MENO_OBBL_RES_PRO := Abs(delta_saldo_cdr);
         End If;
     Else -- VARIAZIONE DI UN COMPETENZA
         aSaldocdrlinea.IM_OBBL_ACC_COMP := delta_saldo_cdr;
     End If;
     -- variazione impegno ribaltato sempre residuo
     if (aNuovoImportoRib!=0) then
         aSaldocdrlineaRib.IM_OBBL_RES_PRO := delta_saldo_cdrRib;
     end if;
  Else -- NON VARIAZIONE MA CREAZIONE ...
       -- 24.01.2008 ... O INCREMENTO DI IMPEGNO GIA' ESISTENTE PER CHIUSURA NUOVI PDG DA PARTE DI ALTRI CDR
     If TIPO_IMPEGNO = CNRCTB018.TI_DOC_IMP_RES Then  -- CREAZIONE DI UN RESIDUO
         aSaldocdrlinea.IM_OBBL_RES_PRO := delta_saldo_cdr;
     Else -- COMPETENZA
         aSaldocdrlinea.IM_OBBL_ACC_COMP := delta_saldo_cdr;
     End If;
  End If;

  aSaldoCdrLinea.UTUV := utente;

  CNRCTB054.crea_aggiorna_saldi(aSaldoCdrLinea, '030.aggiornaImpegnoCapitolo', 'N');

  if (aNuovoImportoRib!=0) then
    aSaldoCdrLineaRib.UTUV := utente;
    CNRCTB054.crea_aggiorna_saldi(aSaldoCdrLineaRib, '030.aggiornaImpegnoCapitolo', 'N');
  end if;

  -- Se l'impegno non esiste e l'aggiornamento non è per variazione di bilancio, l'impegno viene creato
  -- Se l'aggiornamento è per variazione di bilancio l'impegno deve essere già presente (eventualmente con importo a 0) NON PIU' !!!!

  -- ATTENZIONE !!!! 16.05.2006
  -- DAL 2006 NON E' PIU' VERO CHE L'IMPEGNO CI DEVE ESSERE PER FORZA, ANCHE SE A ZERO.
  -- QUINDI, PER VARIAZIONE, SE NON C'E' OCCORRE CREARLO.

Exception
    When Too_Many_Rows Then
      IBMERR001.RAISE_ERR_GENERICO('Esiste più di un '||DES_TIPO_IMPEGNO||' del CDS '||CNRCTB020.GETCDCDSENTE(aSaldo.esercizio)||
' dell''esercizio '||aSaldo.esercizio||' (proveniente dal '||aSaldo.esercizio_res||') per la Voce '||aSaldo.cd_voce);
    When No_Data_Found then

 ---- SE NON TROVO L'IMPEGNO LO DEVO CREARE (A MENO CHE NON SIA PER VARIAZIONE NEL QUAL CASO DEVE ESISTERE PER FORZA)  ------
 ---- 16.05.2006 SE NON TROVO L'IMPEGNO LO DEVO CREARE ANCHE PER VARIAZIONE

    If isPerVariazione And Nvl(DELTA_VAR_RES, 0) < 0 Then
      If TIPO_IMPEGNO = CNRCTB018.TI_DOC_IMP THEN
       IBMERR001.RAISE_ERR_GENERICO(DES_TIPO_IMPEGNO||' del CDS '||CNRCTB020.GETCDCDSENTE(aSaldo.esercizio)||
', esercizio '||aSaldo.esercizio||' sulla Voce '||aSaldo.cd_voce||
' non trovato, con stato non valido oppure senza disponibilità sufficiente (importo variazione '||DELTA_VAR_RES||').');
      Elsif TIPO_IMPEGNO = CNRCTB018.TI_DOC_IMP_RES Then
       IBMERR001.RAISE_ERR_GENERICO(DES_TIPO_IMPEGNO||' del CDS '||CNRCTB020.GETCDCDSENTE(aSaldo.esercizio)||
', esercizio '||aSaldo.esercizio||' (proveniente dal '||aSaldo.esercizio_res||') sulla Voce '||aSaldo.cd_voce||
' non trovato, con stato non valido oppure senza disponibilità sufficiente (importo variazione '||DELTA_VAR_RES||').');
      End If;
    End if;

    select * into aUOENTE
    from v_unita_organizzativa_valida
    Where esercizio=aSaldo.esercizio
    and cd_unita_padre = CNRUTL001.GETCDSFROMCDR(aSaldo.cd_centro_responsabilita)
    and cd_tipo_unita = CNRCTB020.TIPO_ENTE
    and fl_uo_cds='Y';

    select *
    into aCDRENTE
    from v_cdr_valido
    Where esercizio=aSaldo.esercizio
      and cd_unita_organizzativa = aUOENTE.cd_unita_organizzativa;

   -- Estrae da voce_f la tipologia di intervento (per categoria 2) o la categoria (per categoria 1) sempre per parte 1
   -- NON PIU', CE L'HA SOPRA IL RECORD DEL SALDO

   aCodTerzoDivImpegni := CNRCTB015.GETIM01PERCHIAVE(CNRCTB016.TERZO_SPECIALE,CNRCTB016.CODICE_DIVERSI_IMPEGNI);

   if aCodTerzoDivImpegni is null then
    IBMERR001.RAISE_ERR_GENERICO('Codice terzo ''Diversi'' da utilizzare come entità anagrafica per l''impegno, non specificato in Configurazione CNR');
   end if;

   begin
    select * into aTerzoTemp from terzo
     where cd_terzo = aCodTerzoDivImpegni;
   exception when NO_DATA_FOUND then
    IBMERR001.RAISE_ERR_GENERICO('Codice terzo ''Diversi'' da utilizzare come entità anagrafica per l''impegno, non trovato nella tabella TERZO');
   end;

   aNumeratore:=CNRCTB018.getNextNumDocCont(TIPO_IMPEGNO, aSaldo.esercizio, CNRCTB020.GETCDCDSENTE (aSaldo.esercizio), aSaldo.utuv);
   aObblig.ESERCIZIO:=aSaldo.esercizio;
   aObblig.ESERCIZIO_ORIGINALE:=aSaldo.esercizio_res;
   aObblig.CD_CDS := CNRCTB020.GETCDCDSENTE (aSaldo.esercizio);
   aObblig.ESERCIZIO_ORIGINALE:=aSaldo.esercizio_res;
   aObblig.PG_OBBLIGAZIONE:=aNumeratore;
   aObblig.CD_TIPO_DOCUMENTO_CONT:=TIPO_IMPEGNO;
   aObblig.CD_UNITA_ORGANIZZATIVA:=aCDRENTE.cd_unita_organizzativa;
   aObblig.CD_CDS_ORIGINE := CNRCTB020.GETCDCDSENTE (aSaldo.esercizio);
   aObblig.CD_UO_ORIGINE:=aCDRENTE.cd_unita_organizzativa;
   aObblig.CD_TIPO_OBBLIGAZIONE:=NULL;
   aObblig.TI_APPARTENENZA:=aSaldo.ti_appartenenza;
   aObblig.TI_GESTIONE:=aSaldo.ti_gestione;
   aObblig.CD_ELEMENTO_VOCE:= aSaldo.CD_ELEMENTO_VOCE;
   aObblig.DT_REGISTRAZIONE := trunc(aSaldo.duva);

   If isPerVariazione Then
        aObblig.DS_OBBLIGAZIONE := 'Impegno relativo a capitolo '||aSaldo.cd_voce||' generato a seguito dell''approvazione di una variazione';
   Else
        aObblig.DS_OBBLIGAZIONE := 'Impegno relativo a capitolo '||aSaldo.cd_voce;
   End If;

   aObblig.NOTE_OBBLIGAZIONE:=NULL;
   aObblig.CD_TERZO:=aCodTerzoDivImpegni;

   If isPerVariazione Then
        aObblig.IM_OBBLIGAZIONE := Nvl(DELTA_VAR_RES, 0);
   Else
        aObblig.IM_OBBLIGAZIONE := aSaldo.im_stanz_iniziale_a1;
   End If;

   aObblig.IM_COSTI_ANTICIPATI:=0;
   aObblig.ESERCIZIO_COMPETENZA:=aSaldo.esercizio;
   aObblig.STATO_OBBLIGAZIONE:='D';
   aObblig.DT_CANCELLAZIONE:=NULL;
   aObblig.CD_RIFERIMENTO_CONTRATTO:=NULL;
   aObblig.DT_SCADENZA_CONTRATTO:=NULL;
   aObblig.FL_CALCOLO_AUTOMATICO:='Y';
   aObblig.CD_FONDO_RICERCA:=NULL;
   aObblig.FL_SPESE_COSTI_ALTRUI:='N';
   aObblig.FL_PGIRO:='N';
   aObblig.DACR:=aTSNow;
   aObblig.UTCR:=utente;
   aObblig.DUVA:=aTSNow;
   aObblig.UTUV:=utente;
   aObblig.RIPORTATO:='N';
   aObblig.PG_VER_REC:=1;

   aNuovoImporto := aSaldo.im_stanz_iniziale_a1;

   If aObblig.IM_OBBLIGAZIONE != 0 Then
      CNRCTB035.ins_OBBLIGAZIONE(aObblig);
   End If;

   aObbligScad.ESERCIZIO:=aSaldo.esercizio;
   aObbligScad.CD_CDS:= CNRCTB020.GETCDCDSENTE (aSaldo.esercizio);
   aObbligScad.ESERCIZIO_ORIGINALE:=aSaldo.esercizio_res;
   aObbligScad.PG_OBBLIGAZIONE:=aNumeratore;
   aObbligScad.PG_OBBLIGAZIONE_SCADENZARIO:=1;
   aObbligScad.DT_SCADENZA:=trunc(aSaldo.duva);

   If isPerVariazione Then
        aObbligScad.DS_SCADENZA := 'Impegno relativo a capitolo '||aSaldo.cd_voce||' generato a seguito dell''approvazione di una variazione.';
   Else
        aObbligScad.DS_SCADENZA := 'Impegno relativo a capitolo '||aSaldo.cd_voce;
   End If;

   aObbligScad.IM_SCADENZA:=aObblig.IM_OBBLIGAZIONE;
   aObbligScad.IM_ASSOCIATO_DOC_AMM:=0;
   aObbligScad.IM_ASSOCIATO_DOC_CONTABILE:=0;
   aObbligScad.DACR:=aTSNow;
   aObbligScad.UTCR:=utente;
   aObbligScad.DUVA:=aTSNow;
   aObbligScad.UTUV:=utente;
   aObbligScad.PG_VER_REC:=1;

   If aObbligScad.IM_SCADENZA != 0 Then
     CNRCTB035.ins_OBBLIGAZIONE_SCADENZARIO(aObbligScad);
   End If;

   aObbligScadVoce.ESERCIZIO:=aSaldo.esercizio;
   aObbligScadVoce.CD_CDS := CNRCTB020.GETCDCDSENTE (aSaldo.esercizio);
   aObbligScadVoce.ESERCIZIO_ORIGINALE:=aSaldo.esercizio_res;
   aObbligScadVoce.PG_OBBLIGAZIONE:=aNumeratore;
   aObbligScadVoce.PG_OBBLIGAZIONE_SCADENZARIO:=1;
   aObbligScadVoce.TI_APPARTENENZA:=aSaldo.ti_appartenenza;
   aObbligScadVoce.TI_GESTIONE:=aSaldo.ti_gestione;
   aObbligScadVoce.CD_VOCE:=aSaldo.cd_voce;
   aObbligScadVoce.CD_CENTRO_RESPONSABILITA:=aCDRENTE.cd_centro_responsabilita;
   aObbligScadVoce.CD_LINEA_ATTIVITA:=CNRCTB015.getVal02PerChiave(CNRCTB035.LA_SPECIALE,CNRCTB035.LA_SPESA_ENTE);
   aObbligScadVoce.IM_VOCE:=aObbligScad.IM_SCADENZA;
   aObbligScadVoce.CD_FONDO_RICERCA:=NULL;
   aObbligScadVoce.DACR:=aTSNow;
   aObbligScadVoce.UTCR:=utente;
   aObbligScadVoce.DUVA:=aTSNow;
   aObbligScadVoce.UTUV:=utente;
   aObbligScadVoce.PG_VER_REC:=1;

   If aObbligScadVoce.IM_VOCE != 0 Then
     CNRCTB035.ins_OBBLIGAZIONE_SCAD_VOCE(aObbligScadVoce);
   End If;

  -- Aggiorno VOCE_F_SALDI_CDR_LINEA M.S. 19/12/2005
  aSaldoCdrLinea.ESERCIZIO := aObbligScadVoce.ESERCIZIO;
  aSaldoCdrLinea.ESERCIZIO_RES := Nvl(aObblig.ESERCIZIO_ORIGINALE, aObblig.ESERCIZIO);
  aSaldoCdrLinea.CD_CENTRO_RESPONSABILITA := aObbligScadVoce.CD_CENTRO_RESPONSABILITA;
  aSaldoCdrLinea.CD_LINEA_ATTIVITA := aObbligScadVoce.CD_LINEA_ATTIVITA;
  aSaldoCdrLinea.TI_APPARTENENZA := aObbligScadVoce.TI_APPARTENENZA;
  aSaldoCdrLinea.TI_GESTIONE := aObbligScadVoce.TI_GESTIONE;
  aSaldoCdrLinea.CD_VOCE := aObbligScadVoce.CD_VOCE;

  CNRCTB054.RESET_IMPORTI_SALDI (aSaldoCdrLinea);

--  aSaldoCdrLinea.IM_OBBL_ACC_COMP := aNuovoImporto - aObbligScadVoce.IM_VOCE;
-- CREAZIONE IMPEGNO COMPETENZA, INUTILE TUTTI GLI IF.......(QUELLI CHE C'ERANO PRIMA)

  -- se e' competenza
  If aSaldoCdrLinea.ESERCIZIO = aSaldoCdrLinea.ESERCIZIO_RES Then
    -- o è variazione
    If isPerVariazione Then
       --aSaldocdrlinea.VARIAZIONI_PIU := aObbligScadVoce.IM_VOCE;
       aSaldocdrlinea.IM_OBBL_ACC_COMP := aObbligScadVoce.IM_VOCE;
    Else
    -- o impegno
       aSaldocdrlinea.IM_OBBL_ACC_COMP := aObbligScadVoce.IM_VOCE;
    End If;
  Elsif aSaldoCdrLinea.ESERCIZIO > aSaldoCdrLinea.ESERCIZIO_RES Then
  -- se e' residuo
    If isPerVariazione Then
    -- o è variazione
       aSaldocdrlinea.VAR_PIU_OBBL_RES_PRO := aObbligScadVoce.IM_VOCE;
    Else
    -- o è residuo
       aSaldocdrlinea.IM_OBBL_RES_PRO := aObbligScadVoce.IM_VOCE;
    End If;
  End If;


  aSaldoCdrLinea.UTUV := utente;

  CNRCTB054.crea_aggiorna_saldi(aSaldoCdrLinea, '030.aggiornaImpegnoCapitolo', 'N');


End;
--Fine  exception when no_data_found
if(aNuovoImportoRib!=0) then
  update voce_f_saldi_cmp
    Set   im_obblig_imp_acr = aNuovoImportoRib,
          utuv=aSaldo.utuv,
          duva=aSaldo.duva,
          pg_ver_rec=pg_ver_rec+1
    Where esercizio = aObbligRib.esercizio
   and cd_cds = aObbligRib.cd_cds
   and ti_appartenenza = aObbligRib.ti_appartenenza
   and ti_gestione = aObbligRib.ti_gestione
   and cd_voce = aObbligScadVoceRib.cd_voce
   and ti_competenza_residuo = Decode (TIPO_IMPEGNO_RIB, CNRCTB018.TI_DOC_IMP, CNRCTB054.TI_COMPETENZA, CNRCTB054.TI_RESIDUI);
end if;
  update voce_f_saldi_cmp
  Set   im_obblig_imp_acr = aNuovoImporto,
        utuv=aSaldo.utuv,
        duva=aSaldo.duva,
        pg_ver_rec=pg_ver_rec+1
  Where esercizio = aObblig.esercizio
   and cd_cds = aObblig.cd_cds
   and ti_appartenenza = aObblig.ti_appartenenza
   and ti_gestione = aObblig.ti_gestione
   and cd_voce = aObbligScadVoce.cd_voce
   and ti_competenza_residuo = Decode (TIPO_IMPEGNO, CNRCTB018.TI_DOC_IMP, CNRCTB054.TI_COMPETENZA, CNRCTB054.TI_RESIDUI);

 end;


Procedure aggiornaImpegnoCapitolo(aEs varchar2, aEs_Residuo NUMBER, aVoceF varchar2, isPerVariazione Boolean, DELTA_VAR_RES NUMBER, utente VARCHAR2) is
  aUOENTE v_unita_organizzativa_valida%rowtype;
  aSaldo voce_f_saldi_cDR_LINEA%rowtype;
Begin

  if isPerVariazione is null then
   IBMERR001.RAISE_ERR_GENERICO('Errore interno in aggiornamento impegno capitolo.');
  end if;

Dbms_Output.PUT_LINE ('dati input '||aEs||' '||aEs_Residuo||' '||aVoceF||' '||DELTA_VAR_RES) ;
  begin

Dbms_Output.PUT_LINE ('a');

   select * into aUOENTE
   from  v_unita_organizzativa_valida
   Where esercizio=aEs
     and cd_tipo_unita = CNRCTB020.TIPO_ENTE
     and fl_uo_cds='Y';

  -- VISTO CHE E' STATA USATA IMPROPRIAMENTE SIA LA P1 CHE LA P2 CERCO SOLO IL SALDO CON LA LINEA BUONA

  Select * into aSaldo
   From  VOCE_F_SALDI_CDR_LINEA
   Where esercizio = aEs
    And  ti_appartenenza = CNRCTB001.APPARTENENZA_CNR
    And  ESERCIZIO_RES = aEs_Residuo
    And  cd_Voce = aVoceF
    And CD_LINEA_ATTIVITA = CNRCTB015.getVal02PerChiave(0, 'LINEA_ATTIVITA_SPECIALE',  'LINEA_ATTIVITA_SPESA_ENTE')
    And  exists (select 1 from voce_f
                 Where  esercizio = aEs And
                        ti_appartenenza = CNRCTB001.APPARTENENZA_CNR And
                        ti_gestione = CNRCTB001.GESTIONE_SPESE  And
                        cd_voce = aVoceF And
                        cd_parte = CNRCTB001.PARTE1);

   aggiornaImpegnoCapitolo(aSaldo, isPerVariazione, DELTA_VAR_RES, utente);
Dbms_Output.PUT_LINE ('d');
  Exception
    When NO_DATA_FOUND then
        IBMERR001.RAISE_ERR_GENERICO('Non esiste alcun Impegno dell''Ente sull''esercizio '||aEs||', esercizio residuo '||aEs_Residuo||
', Voce '||aVoceF||' e GAE '||CNRCTB015.getVal02PerChiave(0, 'LINEA_ATTIVITA_SPECIALE',  'LINEA_ATTIVITA_SPESA_ENTE')||
' (non esistono i saldi per Voce/CdR/GAE)');
    When Too_Many_Rows then
        IBMERR001.RAISE_ERR_GENERICO('Esistono impegni dell''Ente su diversi GAE sull''esercizio '||aEs||', esercizio residuo '||aEs_Residuo||
', Voce '||aVoceF||'  e GAE '||CNRCTB015.getVal02PerChiave(0, 'LINEA_ATTIVITA_SPECIALE',  'LINEA_ATTIVITA_SPESA_ENTE')||
'(esistono più saldi per Voce/CdR/GAE)');
  End;
End;

 Procedure aggiornaImpegnoCapitolo(aSaldo voce_f_saldi_cdr_linea%Rowtype, DELTA_VAR_RES NUMBER, utente VARCHAR2) is
 begin
  aggiornaImpegnoCapitolo(aSaldo, False, DELTA_VAR_RES, utente);
 end;


 procedure aggiornaImpegnoCapitolo(aEs varchar2, aEs_residuo NUMBER, aVoceF VARCHAR2, DELTA_VAR_RES NUMBER, utente VARCHAR2) is
 begin
  aggiornaImpegnoCapitolo(aEs, aEs_residuo, aVoceF, False, DELTA_VAR_RES, utente);
 end;



 procedure aggiornaImpegnoCapitoloVar(aEs varchar2, aEs_Residuo NUMBER, aVoceF VARCHAR2, DELTA_VAR_RES NUMBER, utente VARCHAR2) is
 begin
  aggiornaImpegnoCapitolo(aEs, aEs_Residuo, aVoceF, True, DELTA_VAR_RES, utente);
 end;


-- Registrazione obbligazione su partita di giro

 procedure creaObbligazionePgiroInt(
  isControlloBloccante boolean,
  isTrunc boolean,
  aObb IN OUT obbligazione%rowtype,
  aObbScad IN OUT obbligazione_scadenzario%rowtype,
  aAcc OUT accertamento%rowtype,
  aAccScad OUT accertamento_scadenzario%rowtype,
  aDtScadenza date
 ) is
  aNumeratore number;
  aDettScadC obbligazione_scad_voce%rowtype;
  aDettScadCList CNRCTB035.scadVoceListS;
  aDettScadenza accertamento_scad_voce%rowtype;
  aDettScadenzaList CNRCTB035.scadVoceListE;
  aEV elemento_voce%rowtype;
  aEVContr elemento_voce%rowtype;
  aAssPGiro ass_partita_giro%rowtype;
  aCdCdr varchar2(30);
  aCdLa varchar2(10);
  aVoceF voce_f%rowtype;
  aVoceFContr voce_f%rowtype;
  aCdTerzoContropartita number(10);
  aCDS unita_organizzativa%rowtype;
  aCDSOrigine unita_organizzativa%rowtype;
  aAssDocPGiro ass_obb_acr_pgiro%rowtype;
  aTipoDocContr varchar2(10);
  aSaldoCdrLineaObb voce_f_saldi_cdr_linea%Rowtype;
  aSaldoCdrLineaAcc voce_f_saldi_cdr_linea%Rowtype;
  aGAE_dedicata_CDS  linea_attivita%Rowtype;
  parametriCnr parametri_cnr%Rowtype;
 Begin

-- N.B. SE SI TRATTA DI RIBALTAMENTO GLI ARRIVA LA TIPOLOGIA DELLA PGIRO RESIDUA GIA' CAMBIATA
Dbms_Output.put_line ('dentro creaObbligazionePgiroInt');

  if aObb.fl_pgiro is null or aObb.fl_pgiro <> 'Y' then
   IBMERR001.RAISE_ERR_GENERICO('Documento 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,
                                         CNRCTB018.TI_DOC_IMP, CNRCTB018.TI_DOC_IMP_RES) then
   IBMERR001.RAISE_ERR_GENERICO('Documento non compatibile (1)');
  end if;

  begin
   select * into aEV 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 partita di giro di spesa non trovata');
  end;
  aCDS := CNRCTB020.GETCDSVALIDO(aObb.esercizio, aObb.cd_cds);
  aCDSOrigine := CNRCTB020.GETCDSVALIDO(aObb.esercizio, aObb.cd_cds_origine);

  if (parametriCnr.fl_nuovo_pdg='N' ) then
	  begin
	   select * into aVoceF from voce_f where
	        esercizio = aEV.esercizio
		and ti_gestione = aEV.ti_gestione
		and ti_appartenenza = aEV.ti_appartenenza
		and cd_voce = aObb.cd_elemento_voce -- In spesa la partita di giro non è articolata
	    and fl_mastrino = 'Y';
	  exception when NO_DATA_FOUND then
	   IBMERR001.RAISE_ERR_GENERICO('Conto finanziario partita di giro di spesa non trovato');
	  end;

	  if aCDS.cd_tipo_unita = CNRCTB020.TIPO_ENTE and aEV.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 aEV.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;
  if aObb.esercizio != aObb.esercizio_competenza then
   IBMERR001.RAISE_ERR_GENERICO('1. Generazione automatica di '||cnrutil.getLabelObbligazioneMin()||' in esercizi futuri non supportata!');
  end if;

-- 17.10.2007 SF: NUMERA LE PARTITE DI GIRO SOLO SE NON SONO RESIDUE !!!!
  If aObb.cd_tipo_documento_cont != CNRCTB018.TI_DOC_OBB_PGIRO_RES or aObb.pg_obbligazione is null Then
    aNumeratore := CNRCTB018.getNextNumDocCont(aObb.cd_tipo_documento_cont, aObb.esercizio, aObb.cd_cds, aObb.utcr);
  Else
    aNumeratore := aObb.pg_obbligazione; -- rimane il vecchio numero
  End If;

  --Se l'esercizio originale non è valorizzato lo inizializzo con quello dell'esercizio
  If (aObb.esercizio_originale Is Null) Then
     aObb.esercizio_originale := aObb.esercizio;
  End If;

  aObb.PG_obbligazione := aNumeratore;

  aObb.dt_registrazione := trunc(aObb.dt_registrazione);
  aObb.duva:=aObb.dacr;
  aObb.utuv:=aObb.utcr;
  aObb.pg_ver_rec:=1;
  CNRCTB035.INS_OBBLIGAZIONE(aObb);

  aObbScad.cd_cds := aObb.cd_cds;
  aObbScad.esercizio := aObb.esercizio;
  aObbScad.esercizio_originale := aObb.esercizio_originale;
  aObbScad.pg_obbligazione:=aObb.pg_obbligazione;
  aObbScad.pg_obbligazione_scadenzario:=1;
  aObbScad.dt_scadenza := TRUNC(nvl(aDtScadenza,aObb.dt_registrazione));
  aObbScad.ds_scadenza := aObb.ds_obbligazione;
  aObbScad.im_scadenza := aObb.im_obbligazione;
  aObbScad.im_associato_doc_amm := 0;
  aObbScad.im_associato_doc_contabile := 0;
  aObbScad.dacr:=aObb.dacr;
  aObbScad.utcr:=aObb.utcr;
  aObbScad.duva:=aObb.dacr;
  aObbScad.utuv:=aObb.utcr;
  aObbScad.pg_ver_rec:=1;

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

  aDettScadC.cd_cds := aObb.cd_cds;
  aDettScadC.esercizio := aObb.esercizio;
  aDettScadC.esercizio_originale := aObb.esercizio_originale;
  aDettScadC.pg_obbligazione:=aObb.pg_obbligazione;
  aDettScadC.pg_obbligazione_scadenzario:=1;
  aDettScadC.ti_appartenenza := aEV.ti_appartenenza;
  aDettScadC.ti_gestione := aEV.ti_gestione;
  aDettScadC.cd_voce := aEV.cd_elemento_voce;
  aDettScadC.cd_centro_responsabilita := aCdCdr;
  aDettScadC.cd_linea_attivita := aCdLa;
  aDettScadC.im_voce := aObb.im_obbligazione;
  aDettScadC.cd_fondo_ricerca:=null;
  aDettScadC.dacr:=aObb.dacr;
  aDettScadC.utcr:=aObb.utcr;
  aDettScadC.duva:=aObb.dacr;
  aDettScadC.utuv:=aObb.utcr;
  aDettScadC.pg_ver_rec:=1;
  aDettScadCList(1):=aDettScadC;
  CNRCTB035.creaScadObbligazione(aObb,aObbScad,1,aDettScadCList,false);

-- 18.10.2007 S.F. QUA SI SDOPPIA LA GESTIONE:
--            SE LA PARTITA DI GIRO E' DA CREARE FA TUTTE QUESTE COSE CHE FACEVA PRIMA
--            ALTRIMENTI RECUPERA QUELLA DELL'ANNO PRIMA E "RIBALTA" QUELLA

--If aObb.cd_tipo_documento_cont != CNRCTB018.TI_DOC_OBB_PGIRO_RES Then

  -- gestione contropartita

  aCdTerzoContropartita := CNRCTB015.GETIM01PERCHIAVE(CNRCTB035.TERZO_SPECIALE,CNRCTB035.CODICE_DIVERSI_PGIRO);

  Begin
   Select *
   Into  aAssPgiro
   From  ass_partita_giro
   Where esercizio = aObb.esercizio And
         ti_appartenenza_clg = aObb.ti_appartenenza And
         ti_gestione_clg = aObb.ti_gestione And
         cd_voce_clg = aObb.cd_elemento_voce;
  Exception
     When NO_DATA_FOUND then
        IBMERR001.RAISE_ERR_GENERICO('Conto di partita di giro associato non trovato');
  End;

  Begin
   Select *
   Into   aEVContr
   From   elemento_voce
   Where  esercizio = aAssPgiro.esercizio And
          ti_gestione = aAssPgiro.ti_gestione And
          ti_appartenenza = aAssPgiro.ti_appartenenza And
          cd_elemento_voce = aAssPgiro.cd_voce And
          fl_partita_giro = 'Y';
  Exception
     When NO_DATA_FOUND then
        IBMERR001.RAISE_ERR_GENERICO('Voce del piano partita di giro di controparte spesa non trovato');
  End;
  if(parametriCnr.fl_nuovo_pdg ='N' ) then
  Begin
   Select *
   Into   aVoceFContr
   From   voce_f
   Where  esercizio = aEVContr.esercizio And
          ti_gestione = aEvContr.ti_gestione And
          ti_appartenenza = aEVContr.ti_appartenenza And
          cd_titolo_capitolo = aEVContr.cd_elemento_voce And
          fl_mastrino = 'Y' And
         -- Nel caso di pgiro su ente è necessaria l'UO per determinare il cap. entrata
         (aEVContr.ti_appartenenza=CNRCTB001.APPARTENENZA_CDS Or cd_unita_organizzativa = aObb.cd_unita_organizzativa);
  Exception
    When NO_DATA_FOUND Then
        IBMERR001.RAISE_ERR_GENERICO('Conto finanziario partita di giro di controparte spesa non trovato');
  End;
	end if;
  If aCDS.cd_tipo_unita = CNRCTB020.TIPO_ENTE then
     if aObb.cd_tipo_documento_cont is not null and aObb.cd_tipo_documento_cont in (CNRCTB018.TI_DOC_IMP_RES) then
        aTipoDocContr       := CNRCTB018.TI_DOC_ACC_RES;
     else
        aTipoDocContr       := CNRCTB018.TI_DOC_ACC;
     end if;
     aNumeratore         := CNRCTB018.getNextNumDocCont(aTipoDocContr, aObb.esercizio, aObb.cd_cds, aObb.utcr);
     aAcc.cd_cds_origine := aObb.cd_cds;
     aAcc.cd_uo_origine  := aObb.cd_unita_organizzativa;
  Else
     if aObb.esercizio_originale  is not null and aObb.esercizio != aObb.esercizio_originale then
       aTipoDocContr  := CNRCTB018.TI_DOC_ACC_PGIRO_RES;
       aNumeratore    := CNRCTB018.getNextNumDocCont(aTipoDocContr, aObb.esercizio_originale, aObb.cd_cds, aObb.utcr);
	   else
       aTipoDocContr  := CNRCTB018.TI_DOC_ACC_PGIRO;
       aNumeratore    := CNRCTB018.getNextNumDocCont(aTipoDocContr, aObb.esercizio, aObb.cd_cds, aObb.utcr);
	 	 end if;
     aAcc.cd_cds_origine := aObb.cd_cds_origine;
     aAcc.cd_uo_origine  := aObb.cd_uo_origine;
  End If;

Dbms_Output.put_line ('dentro creaObbligazionePgiroInt inizia acc');

  aAcc.cd_cds := aObb.cd_cds;
  aAcc.esercizio := aObb.esercizio;
  aAcc.esercizio_competenza := aObb.esercizio_competenza;
  aAcc.cd_tipo_documento_cont:=aTipoDocContr;
  aAcc.cd_unita_organizzativa := aObb.cd_unita_organizzativa;
  aAcc.esercizio_originale := aObb.esercizio_originale;

  aAcc.pg_accertamento := aNumeratore;

  aAcc.dt_registrazione := aObb.dt_registrazione;
  aAcc.ds_accertamento := aObb.ds_obbligazione;
  aAcc.note_accertamento := '';
  aAcc.cd_terzo := aCdTerzoContropartita;
  aAcc.ti_gestione:=aEVContr.ti_gestione;
  aAcc.ti_appartenenza:=aEVContr.ti_appartenenza;
  aAcc.cd_elemento_voce:=aEVContr.cd_elemento_voce;
  if(parametriCnr.fl_nuovo_pdg ='N' ) then
  	aAcc.CD_VOCE:=aVoceFContr.cd_voce;
 else
  	aAcc.CD_VOCE:=aEVContr.cd_elemento_voce;
 end if;

   /* 05.01.2006 stani */
  aAcc.esercizio_originale    := aObb.esercizio_originale;

  if isTrunc then
   aAcc.im_accertamento:=0;
   aAcc.dt_cancellazione:=trunc(aObb.dacr);
  else
   aAcc.im_accertamento:=aObb.im_obbligazione;
  end if;

  aAcc.fl_pgiro:='Y';
  aAcc.riportato:='N';
  aAcc.dacr:=aObb.dacr;
  aAcc.utcr:=aObb.utcr;
  aAcc.duva:=aObb.dacr;
  aAcc.utuv:=aObb.utcr;
  aAcc.pg_ver_rec:=1;

  Dbms_Output.put_line ('ins acc '||aAcc.cd_cds||' '||aAcc.esercizio||' '||aAcc.cd_tipo_documento_cont||' '||aAcc.esercizio_originale||' '||aAcc.pg_accertamento);
  CNRCTB035.INS_ACCERTAMENTO(aAcc);

  -- L'aggiornamento viene eseguito all'interno della procedura (creaScadAccertamento) VOCE_F_SALDI_CDR_LINEA M.S. 19/12/2005
  CNRCTB035.aggiornaSaldoDettScad(aAcc,aAcc.im_accertamento,false,aAcc.utcr,aAcc.dacr);

  aAccScad.cd_cds := aAcc.cd_cds;
  aAccScad.esercizio := aAcc.esercizio;
  aAccScad.dt_scadenza_emissione_fattura := aObbScad.dt_scadenza;
  aAccScad.dt_scadenza_incasso := aObbScad.dt_scadenza;
  aAccScad.ds_scadenza := aAcc.ds_accertamento;
  aAccScad.im_scadenza := aAcc.im_accertamento;
  aAccScad.im_associato_doc_amm := 0;
  aAccScad.im_associato_doc_contabile := 0;
  aAccScad.dacr:=aAcc.dacr;
  aAccScad.utcr:=aAcc.utcr;
  aAccScad.duva:=aAcc.dacr;
  aAccScad.utuv:=aAcc.utcr;
  aAccScad.pg_ver_rec:=1;

  If CNRCTB015.UtilizzaGAEdedicataPgiroCDS (aAcc.esercizio, aAcc.CD_CDS_ORIGINE, CNRCTB001.GESTIONE_ENTRATE) Then
    aGAE_dedicata_CDS := CNRCTB015.get_LINEA_PGIRO_cds(aAcc.esercizio, aAcc.CD_CDS_ORIGINE, CNRCTB001.GESTIONE_ENTRATE);
    aCdCdr := aGAE_dedicata_CDS.CD_CENTRO_RESPONSABILITA;
    aCdLa  := aGAE_dedicata_CDS.CD_LINEA_ATTIVITA;
  Else
    aCdCdr := CNRCTB015.GETVAL01PERCHIAVE(CNRCTB035.LA_SPECIALE,CNRCTB035.LA_ENTRATA_ENTE);
    aCdLa := CNRCTB015.GETVAL02PERCHIAVE(CNRCTB035.LA_SPECIALE,CNRCTB035.LA_ENTRATA_ENTE);
  End If;

  aDettScadenza.cd_cds := aAcc.cd_cds;
  aDettScadenza.esercizio := aAcc.esercizio;
  aDettScadenza.cd_centro_responsabilita := aCdCdr;
  aDettScadenza.cd_linea_attivita := aCdLa;
  aDettScadenza.im_voce := aAcc.im_accertamento;
  aDettScadenza.dacr:=aAcc.dacr;
  aDettScadenza.utcr:=aAcc.utcr;
  aDettScadenza.duva:=aAcc.dacr;
  aDettScadenza.utuv:=aAcc.utcr;
  aDettScadenza.pg_ver_rec:=1;
  aDettScadenzaList(1):=aDettScadenza;
  CNRCTB035.creaScadAccertamento(aAcc,aAccScad,1,aDettScadenzaList);

  aAssDocPGiro.cd_cds:=aAcc.cd_cds;
  aAssDocPGiro.esercizio:=aAcc.esercizio;
  aAssDocPGiro.esercizio_ori_accertamento:=aAcc.esercizio_originale;
  aAssDocPGiro.pg_accertamento:=aAcc.pg_accertamento;
  aAssDocPGiro.esercizio_ori_obbligazione:=aObb.esercizio_originale;
  aAssDocPGiro.pg_obbligazione:=aObb.pg_obbligazione;
  aAssDocPGiro.ti_origine:=CNRCTB001.GESTIONE_SPESE;
  aAssDocPGiro.dacr:=aAcc.dacr;
  aAssDocPGiro.utcr:=aAcc.utcr;
  aAssDocPGiro.duva:=aAcc.dacr;
  aAssDocPGiro.utuv:=aAcc.utcr;
  aAssDocPGiro.pg_ver_rec:=1;

Dbms_Output.put_line ('ins associazione pgiro');

  CNRCTB035.INS_ASS_OBB_ACR_PGIRO(aAssDocPGiro);

--Elsif aObb.cd_tipo_documento_cont = CNRCTB018.TI_DOC_OBB_PGIRO_RES Then
-- RIBALTAMENTO

--  Null;
--End If;

End;

 procedure creaObbligazionePgiro(
  isControlloBloccante boolean,
  aObb IN OUT obbligazione%rowtype,
  aObbScad IN OUT obbligazione_scadenzario%rowtype,
  aAcc OUT accertamento%rowtype,
  aAccScad OUT accertamento_scadenzario%rowtype,
  aDtScadenza date
 ) is
 begin
  creaObbligazionePgiroInt(
   isControlloBloccante,
   false,
   aObb,
   aObbScad,
   aAcc,
   aAccScad,
   aDtScadenza
  );
 end;

 procedure creaObbligazionePgiroTronc(
  isControlloBloccante boolean,
  aObb IN OUT obbligazione%rowtype,
  aObbScad IN OUT obbligazione_scadenzario%rowtype,
  aAcc OUT accertamento%rowtype,
  aAccScad OUT accertamento_scadenzario%rowtype,
  aDtScadenza date
 ) is
 begin
  creaObbligazionePgiroInt(
   isControlloBloccante,
   true,
   aObb,
   aObbScad,
   aAcc,
   aAccScad,
   aDtScadenza
  );
 end;

 procedure creaObbligazione(
  isControlloBloccante boolean,
  aObb IN OUT obbligazione%rowtype,
  aScadenza1 in out obbligazione_scadenzario%rowtype,
  aDettScadenza1 in out CNRCTB035.scadVoceListS
 ) is
  aFakeObbScad obbligazione_scadenzario%rowtype;
 begin
  creaObbligazione(
   isControlloBloccante,
   aObb,
   aScadenza1,
   aDettScadenza1,
   aFakeObbScad,
   CNRCTB035.LISTA_SCAD_VOCE_VUOTA_S,
   aFakeObbScad,
   CNRCTB035.LISTA_SCAD_VOCE_VUOTA_S,
   aFakeObbScad,
   CNRCTB035.LISTA_SCAD_VOCE_VUOTA_S,
   aFakeObbScad,
   CNRCTB035.LISTA_SCAD_VOCE_VUOTA_S,
   aFakeObbScad,
   CNRCTB035.LISTA_SCAD_VOCE_VUOTA_S,
   aFakeObbScad,
   CNRCTB035.LISTA_SCAD_VOCE_VUOTA_S,
   aFakeObbScad,
   CNRCTB035.LISTA_SCAD_VOCE_VUOTA_S,
   aFakeObbScad,
   CNRCTB035.LISTA_SCAD_VOCE_VUOTA_S,
   aFakeObbScad,
   CNRCTB035.LISTA_SCAD_VOCE_VUOTA_S
 );
 end;

 procedure creaObbligazione(
  isControlloBloccante boolean,
  aObb IN OUT obbligazione%rowtype,
  aScadenza1 in out obbligazione_scadenzario%rowtype,
  aDettScadenza1 in out CNRCTB035.scadVoceListS,
  aScadenza2 in out obbligazione_scadenzario%rowtype,
  aDettScadenza2 out CNRCTB035.scadVoceListS,
  aScadenza3 in out obbligazione_scadenzario%rowtype,
  aDettScadenza3 in out CNRCTB035.scadVoceListS,
  aScadenza4 in out obbligazione_scadenzario%rowtype,
  aDettScadenza4 in out CNRCTB035.scadVoceListS,
  aScadenza5 in out obbligazione_scadenzario%rowtype,
  aDettScadenza5 in out CNRCTB035.scadVoceListS,
  aScadenza6 in out obbligazione_scadenzario%rowtype,
  aDettScadenza6 in out CNRCTB035.scadVoceListS,
  aScadenza7 in out obbligazione_scadenzario%rowtype,
  aDettScadenza7 in out CNRCTB035.scadVoceListS,
  aScadenza8 in out obbligazione_scadenzario%rowtype,
  aDettScadenza8 in out CNRCTB035.scadVoceListS,
  aScadenza9 in out obbligazione_scadenzario%rowtype,
  aDettScadenza9 in out CNRCTB035.scadVoceListS,
  aScadenza10 in out obbligazione_scadenzario%rowtype,
  aDettScadenza10 in out CNRCTB035.scadVoceListS
 ) is
  aNumeratore number;
 begin
  if aObb.cd_tipo_documento_cont not in (CNRCTB018.TI_DOC_OBB) then
   IBMERR001.RAISE_ERR_GENERICO('Documento non compatibile (2)');
  end if;
  if not (aObb.fl_pgiro = 'N') then
   IBMERR001.RAISE_ERR_GENERICO('Documento non compatibile (3)');
  end if;
  if aObb.esercizio != aObb.esercizio_competenza then
   IBMERR001.RAISE_ERR_GENERICO('2. Generazione automatica di '||cnrutil.getLabelObbligazioneMin()||' in esercizi futuri non supportata');
  end if;

  --commentato poichè i controlli vengono rifatti in CNRCTB035.creaScadObbligazione
  /*
  if isControlloBloccante then
   if checkAssunzObblig(
             aObb.esercizio_competenza,
             aObb.esercizio,
             aObb.cd_cds,
             aObb.cd_unita_organizzativa,
             aObb.cd_elemento_voce,
             aObb.im_obbligazione)='N' then
     IBMERR001.RAISE_ERR_GENERICO('Controllo assunzione '||cnrutil.getLabelObbligazioniMin()||' non superato');
   end if;
  end if;
  */
  aNumeratore:=CNRCTB018.getNextNumDocCont(aObb.cd_tipo_documento_cont, aObb.esercizio, aObb.cd_cds, aObb.utcr);

  --Se l'esercizio originale non è valorizzato lo inizializzo con quello dell'esercizio
  If (aObb.esercizio_originale Is Null) Then
     aObb.ESERCIZIO_ORIGINALE:=aObb.esercizio;
  End If;

  aObb.PG_OBBLIGAZIONE:=aNumeratore;
  aObb.dt_registrazione:=trunc(aObb.dt_registrazione);
  aObb.duva:=aObb.dacr;
  aObb.utuv:=aObb.utcr;
  aObb.pg_ver_rec:=1;
  CNRCTB035.INS_OBBLIGAZIONE(aObb);
  CNRCTB035.creaScadObbligazione(aObb,aScadenza1,1,aDettScadenza1,isControlloBloccante);
  CNRCTB035.creaScadObbligazione(aObb,aScadenza2,2,aDettScadenza2,isControlloBloccante);
  CNRCTB035.creaScadObbligazione(aObb,aScadenza3,3,aDettScadenza3,isControlloBloccante);
  CNRCTB035.creaScadObbligazione(aObb,aScadenza4,4,aDettScadenza4,isControlloBloccante);
  CNRCTB035.creaScadObbligazione(aObb,aScadenza5,5,aDettScadenza5,isControlloBloccante);
  CNRCTB035.creaScadObbligazione(aObb,aScadenza6,6,aDettScadenza6,isControlloBloccante);
  CNRCTB035.creaScadObbligazione(aObb,aScadenza7,7,aDettScadenza7,isControlloBloccante);
  CNRCTB035.creaScadObbligazione(aObb,aScadenza8,8,aDettScadenza8,isControlloBloccante);
  CNRCTB035.creaScadObbligazione(aObb,aScadenza9,9,aDettScadenza9,isControlloBloccante);
  CNRCTB035.creaScadObbligazione(aObb,aScadenza10,10,aDettScadenza10,isControlloBloccante);
 end;

procedure creaObbligazioneResidua(
  isControlloBloccante boolean,
  aObb IN OUT obbligazione%rowtype,
  aScadenza In out obbligazione_scadenzario%rowtype,
  aDettScadenza In out CNRCTB035.scadVoceListS
 ) is
  aNumeratore number;
 begin
  if aObb.cd_tipo_documento_cont not in (CNRCTB018.TI_DOC_OBB_RES_IMPRO) then
   IBMERR001.RAISE_ERR_GENERICO('Documento non compatibile (2)');
  end if;
  if not (aObb.fl_pgiro = 'N') then
   IBMERR001.RAISE_ERR_GENERICO('Documento non compatibile (3)');
  end if;
  if aObb.esercizio != aObb.esercizio_competenza then
   IBMERR001.RAISE_ERR_GENERICO('3. Generazione automatica di '||cnrutil.getLabelObbligazioneMin()||' in esercizi futuri non supportata');
  end if;

  aNumeratore:=CNRCTB018.getNextNumDocCont(aObb.cd_tipo_documento_cont, aObb.esercizio, aObb.cd_cds, aObb.utcr);

  aObb.PG_OBBLIGAZIONE:=aNumeratore;
  aObb.dt_registrazione:=trunc(aObb.dt_registrazione);
  aObb.duva:=aObb.dacr;
  aObb.utuv:=aObb.utcr;
  aObb.pg_ver_rec:=1;
  CNRCTB035.INS_OBBLIGAZIONE(aObb);
  CNRCTB035.creaScadObbligazione(aObb,aScadenza,1,aDettScadenza,isControlloBloccante);
 End;

End;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy